STM32G431RBT6-----Timer

目录

一、定时器原理

二、打开工程,添加必要代码

三、实现功能


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灯不能通过按键控制亮灭。

三、实现功能

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值