你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G431RBT6之Timer

[复制链接]
STMCU小助手 发布时间:2023-3-3 14:00
67686d0bb75a447bb00e445ecb8e8fbe.png

前面在讲LED模块的时候可以用HAL_DLAY()这个函数实现,但是当时间控制得多了,用这个函数就不方便了,因此我们用定时器来实现计时的功能

一、定时器原理
1.定时器资源有许多,但是常用的就有几个

c69a617131504c33b80daf12e93d36f8.png

2.定时器只有内部计时功能,没有输出功能,因此不用配置GPIO引脚

3.Timer原理

94013c8a198940ec97a91cc702f2cf3f.png

7bf14f2ea69842e8b25859d444b25f29.png

4.CubeMX配置

94c3f2e8755d4ec59a126c5713ae29a2.png

Prescaler:预分频;相当于第一次分频,降到80*10^3
Counter Period:计数周期;相当于第二次分频,讲到1000
通过这两次分频,就实现了最终的分频效果,每1毫秒中断一次频率就降下来了。这样0.1s就要中断100次,5s就中断5000次。
5.定时器的本质就是中断,因此要配置中断的优先级内容:

a3cc1d401d1a4744afc375875ed74682.png

二、打开工程,添加必要代码
1.tim.c就是配置完CubeMX之后自动生成的文件

8ccd172def3c4575bd1d6b96baea18d3.png

2.添加必要的代码

167071c20bec46da92c5c2c673701b20.png

此函数定义的位置:

eba2e27012ad405eb29c579ee71f9e4e.png

发生定时器中断之后就会跳到回调函数,实际上该函数便是发生时钟中断后处理的函数(中断处理子程序):

27c56a6f6c5e41a99bea95488c3516f2.png


3.子函数
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3.   if(htim->Instance==TIM2)//是timer2,且过了1ms
  4.   {
  5.     if(led1_flag==1)//led1要用定时器了
  6.     {
  7.       led1_count++;
  8.     }
  9.     if(led2_flag==1)//led2要用定时器了
  10.     {
  11.       led2_count++;
  12.     }
  13.   }
  14. }
  15. void led_proc(void)//led1的控制函数
  16. {
  17.   if(led1_flag==1)
  18.   {
  19.     Control_LED(LED1,ON);
  20.     if(led1_count>=5000)//计数5000,即亮了5s
  21.     {
  22.       led1_flag = 0;
  23.       led1_count = 0;
  24.       Control_LED(LED1,OFF);
  25.     }
  26.   }

  27. }
  28. void bulingbuling(void)//led2的闪烁函数
  29. {
  30.   if(led2_flag==1)
  31.   {
  32.     if(led2_count>=100)//0.1s
  33.     {
  34.       led2_count = 0;
  35.       HAL_GPIO_TogglePin(GPIOC,LED2);//翻转
  36.       HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
  37.                         HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
  38.     }
  39.   }
  40.   else
  41.   {
  42.     Control_LED(LED2,OFF);
  43.   }
  44. }
  45. void key_proc(void)
  46. {
  47.   char value = Key_Scan();
  48.   switch(value)
  49.   {
  50.     case 3:
  51.       led1_flag = (led1_flag+1)%2;
  52.       break;
  53.     case 4:
  54.       led2_flag = (led2_flag+1)%2;
  55.       break;
  56.   }
  57. }
复制代码

4.主函数

cca7fb2268a04c419e595d5dfc396b06.png


变量声明:

10b289372ccb4564b4db5424fe8785ad.png

警告:一开始led1_count函数类型是char类型的,在后面计数判断的时候出现了警告。并且LED1灯不能通过按键控制亮灭。

三、实现功能

1.png

————————————————
版权声明:想要优秀点儿


收藏 评论0 发布时间:2023-3-3 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版