前面在讲LED模块的时候可以用HAL_DLAY()这个函数实现,但是当时间控制得多了,用这个函数就不方便了,因此我们用定时器来实现计时的功能
一、定时器原理
1.定时器资源有许多,但是常用的就有几个
2.定时器只有内部计时功能,没有输出功能,因此不用配置GPIO引脚
3.Timer原理
4.CubeMX配置
Prescaler:预分频;相当于第一次分频,降到80*10^3
Counter 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灯不能通过按键控制亮灭。
三、实现功能
————————————————
版权声明:想要优秀点儿
|