STM32F103ZET6 ILI9341 做一个圆形(钟表)时钟显示(精英开发板V2)

 摘要:本文深入探究了利用 STM32 微控制器驱动 ILI9341 显示屏绘制时钟的技术方案。

在硬件连接方面,采用 FSMC(灵活静态存储控制器)接口,通过合理配置引脚,实现 STM32 与 ILI9341 的高速稳定通信,确保数据能够快速准确地传输至显示屏。

时间获取借助延时函数,通过精确设定延时参数,实现对秒、分、时等时间单位的计数,为时钟绘制提供准确的时间基准。

时钟显示的流畅性则依赖于 STM32 芯片的高速处理能力,其能够快速完成时间数据的运算与图形绘制指令的生成。同时,优化 ILI9341 的屏幕刷新速度,通过调整显示缓存及刷新频率,减少画面卡顿现象。

源代码如下:

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "math.h"

int main(void)
{
    uint8_t x = 0;
    uint8_t lcd_id[12];
	uint16_t xx = 0;
	uint16_t y = 0;
	uint8_t time_minutes = 30;
	uint8_t time_hour = 5;
    HAL_Init();                                         
    sys_stm32_clock_init(RCC_PLL_MUL9);                 
    delay_init(72);                                     
    usart_init(115200);                                 
    led_init();                                         
    lcd_init();                                         
    g_point_color = RED;
    sprintf((char *)lcd_id, "LCD ID:%04X", lcddev.id);  

    while (1)
    {
        switch (0)
        {
        case 0:
            lcd_clear(WHITE);
            break;

        case 1:
            lcd_clear(BLACK);
            break;

        case 2:
            lcd_clear(BLUE);
            break;

        case 3:
            lcd_clear(RED);
            break;

        case 4:
            lcd_clear(MAGENTA);
            break;

        case 5:
            lcd_clear(GREEN);
            break;

        case 6:
            lcd_clear(CYAN);
            break;

        case 7:
            lcd_clear(YELLOW);
            break;

        case 8:
            lcd_clear(BRRED);
            break;

        case 9:
            lcd_clear(GRAY);
            break;

        case 10:
            lcd_clear(LGRAY);
            break;

        case 11:
            lcd_clear(BROWN);
            break;
        }

        lcd_show_string(10, 40, 240, 32, 32, "STM32", RED);
        lcd_show_string(10, 80, 240, 24, 24, "TFTLCD TIME CLOCK TEST", RED);
        x++;

        if (x == 12)
            x = 0;

				

			for(int time_t1 = 0;time_t1<=60;time_t1++){
				
				xx = (int)(72*sin(((float)time_t1*6.0)/360.0*3.14*2));
				y = (int)(72*cos(((float)time_t1*6.0)/360.0*3.14*2));
				lcd_draw_point(xx+100, y+200, 0x1234);
				if(time_t1%5==0)
				lcd_show_num(xx+100-10, y+200-5, (time_t1/5), 2, 16, RED);
			}
			for(int time_t1 = 0;time_t1<=60;time_t1++){
				HAL_Delay(1000);
				
				if(time_t1>=60)
				time_minutes++;
				
				if(time_minutes>=60){
					time_hour++;
					
					if(time_hour>=60){
							time_hour = 0;
						}
					time_minutes = 0;
					
				}
	
				for(int ii = 0;ii<51;ii++){
					xx = -(int)(ii*sin(((float)(time_hour-1)*6.0)/360.0*3.14*2));
					y = (int)(ii*cos(((float)(time_hour-1)*6.0)/360.0*3.14*2));	
					lcd_draw_point(xx+100, y+200, 0xffff);					
				}	
				
				for(int ii = 0;ii<51;ii++){
					xx = -(int)(ii*sin(((float)time_hour*6.0)/360.0*3.14*2));
					y = (int)(ii*cos(((float)time_hour*6.0)/360.0*3.14*2));	
					lcd_draw_point(xx+100, y+200, 0x1234);					
				}	
					
				for(int ii = 0;ii<72;ii++){
					xx = -(int)(ii*sin(((float)(time_t1-1)*6.0)/360.0*3.14*2));
				  y = (int)(ii*cos(((float)(time_t1-1)*6.0)/360.0*3.14*2));	
					lcd_draw_point(xx+100, y+200, 0xffff);					
				}	
				
				for(int ii = 0;ii<72;ii++){
					xx = -(int)(ii*sin(((float)time_t1*6.0)/360.0*3.14*2));
				  y = (int)(ii*cos(((float)time_t1*6.0)/360.0*3.14*2));	
					lcd_draw_point(xx+100, y+200, 0x1234);					
				}
				
				for(int ii = 0;ii<56;ii++){
					xx = -(int)(ii*sin(((float)(time_minutes-1)*6.0)/360.0*3.14*2));
				  y = (int)(ii*cos(((float)(time_minutes-1)*6.0)/360.0*3.14*2));	
					lcd_draw_point(xx+100, y+200, 0xffff);					
				}	
				
				for(int ii = 0;ii<56;ii++){
					xx = -(int)(ii*sin(((float)time_minutes*6.0)/360.0*3.14*2));
				  y = (int)(ii*cos(((float)time_minutes*6.0)/360.0*3.14*2));	
					lcd_draw_point(xx+100, y+200, 0x1234);					
				}				

			}
        LED0_TOGGLE(); 
        delay_ms(1000);
    }
}

效果如下,觉得时钟样式不够好,可以自己慢慢调整:

### STM32F103ZET6 时钟配置使用 STM32CubeMX 教程 #### 配置环境准备 为了确保STM32F103ZET6时钟能够被正确设置,在启动项目之前,需确认已安装最新版本的STM32CubeMX工具。该软件提供了图形化界面来简化微控制器外设初始化过程。 #### 创建新项目并选择目标芯片 打开STM32CubeMX应用程序后,点击新建工程按钮,随后在弹出的选择窗口中输入项目名称,并挑选对应的MCU型号——即本案例中的`STM32F103ZET6`[^1]。 #### 设置系统核心频率和其他参数 进入主界面后,通过左侧栏目的“Pinout & Configuration”,可以找到System Core下的RCC (Reset and Clock Control)模块。这里允许调整PLL(Phase-Locked Loop),HSE(High Speed External oscillator), LSI(Low-Speed Internal RC Oscillator)等重要组件的工作状态以及输出频率。对于大多数应用而言,默认提供的8MHz外部高速晶振配合内部PLL倍频至72MHz是一个常见且稳定的选择。 #### 自定义高级特性 除了基本设定之外,还可以进一步探索更多细节选项,比如启用低功耗模式下自动切换到LSI作为RTC实时时钟源;或是当HSI可用时将其强制用于调试会话期间等等。这些功能有助于优化特定应用场景下的性能表现或能耗水平。 #### 生成初始化代码 完成上述所有配置项之后,转到菜单栏上的“Project”-> “Generate Code”。此时STM32CubeMX将会依据所选平台自动生成必要的头文件(.h)和源码实现(.c),其中包括了针对选定时钟方案的具体实施方法。注意保存好生成的结果以便后续编译链接操作。 ```cpp // 示例:部分由STM32CubeMX生成的时钟配置函数调用 HAL_RCC_OscConfig(&Rcc_OscInitStruct); HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

potato_potato_123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值