本帖最后由 jinglixixi 于 2023-10-13 19:56 编辑
本以为M0+这样的内核,应该内置一个RTC以解决电子时钟这样的问题,在无果的情况下只好借助计时器来解决这个问题。 好在其内核是有SYSTICK计时器的,为此可通过相应的设置来获得0.5秒的延时信号。 图1 SYSTICK设置
随后,与串行数码管的显示功能相配合就可实现电子时钟的功能。 关于串行数码管模块的使用可参见: https://bbs.21ic.com/icview-3332062-1-1.html 实现电子时钟功能的主程序为: - int main(void)
- {
- SYSCFG_DL_init();
- DL_SYSCTL_enableSleepOnExit();
- Init_MAX7219();
- Write_Max7219(1,s%10);
- Write_Max7219(2,s/10);
- Write_Max7219(3,0xa);
- Write_Max7219(4,m%10);
- Write_Max7219(5,m/10);
- Write_Max7219(6,0xa);
- Write_Max7219(7,h%10);
- Write_Max7219(8,h/10);
- while (1) {
- __WFI();
- }
- }
由于SYSTICK计时器的周期值只有0.5秒,故需要利用它的中断处理来获得1计时及电子时钟的显示功能,其具体内容如下: - void SysTick_Handler(void)
- {
- DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN );
- u=u+1;
- if(u==2)
- {
- u=0;
- s=s+1;
- }
- if(s==60)
- {
- s=0;
- m=m+1;
- }
- Write_Max7219(2,s/10);
- Write_Max7219(1,s%10);
- if(m==60)
- {
- m=0;
- h=(h+1)%24;
- }
- Write_Max7219(4,m%10);
- Write_Max7219(5,(m%100)/10);
- Write_Max7219(7,h%10);
- Write_Max7219(8,(h%100)/10);
- }
经程序的编译与下载,其实现的计时效果如图2所示。 图2 计时效果
演示视频:
|