目录
13届省赛
前面在讲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灯不能通过按键控制亮灭。