目录
一、定时器原理
二、打开工程,添加必要代码
三、实现功能
13届省赛
前面在讲LED模块的时候可以用HAL_DLAY()这个函数实现,但是当时间控制得多了,用这个函数就不方便了,因此我们用定时器来实现计时的功能
一、定时器原理
1.定时器资源有许多,但是常用的就有几个
2.定时器只有内部计时功能,没有输出功能,因此不用配置GPIO引脚
3.Timer原理
4.CubeMX配置
Prescaler:预分频;相当于第一次分频,降到80*10^3Counter Period:计数周期;相当于第二次分频,讲到1000通过这两次分频,就实现了最终的分频效果,每1毫秒中断一次频率就降下来了。这样0.1s就要中断100次,5s就中断5000次。
5.定时器的本质就是中断,因此要配置中断的优先级内容:
二、打开工程,添加必要代码
1.tim.c就是配置完CubeMX之后自动生成的文件
2.添加必要的代码
此函数定义的位置:
发生定时器中断之后就会跳到回调函数,实际上该函数便是发生时钟中断后处理的函数(中断处理子程序):
3.子函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if(htim->Instance==TIM2)//是timer2,且过了1ms{if(led1_flag==1)//led1要用定时器了{led1_count++;}if(led2_flag==1)//led2要用定时器了{led2_count++;}}}void led_proc(void)//led1的控制函数{if(led1_flag==1){Control_LED(LED1,ON);if(led1_count>=5000)//计数5000,即亮了5s{led1_flag = 0;led1_count = 0;Control_LED(LED1,OFF);}}}void bulingbuling(void)//led2的闪烁函数{if(led2_flag==1){if(led2_count>=100)//0.1s{led2_count = 0;HAL_GPIO_TogglePin(GPIOC,LED2);//翻转HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);}}else{Control_LED(LED2,OFF);}}void key_proc(void){char value = Key_Scan();switch(value){case 3:led1_flag = (led1_flag+1)%2;break;case 4:led2_flag = (led2_flag+1)%2;break;}}
4.主函数
变量声明:
警告:一开始led1_count函数类型是char类型的,在后面计数判断的时候出现了警告。并且LED1灯不能通过按键控制亮灭。