STM32
直播中

李红

7年用户 1265经验值
私信 关注
[问答]

怎样使用Stm32CubeMx基本定时器去驱动一个流水灯定时亮灭呢

什么是STM32CubeMx基本定时器?
怎样使用Stm32CubeMx基本定时器去驱动一个流水灯定时亮灭呢?

回帖(1)

李兆存

2021-11-23 10:16:13
  Stm32CubeMx基本定时器
  基本定时器概念
  在stm32f103中,共有八个定时器:TIM1~TIM8。其中TIM6和TIM7是基本定时器
  基本定时器相较于其他定时器只有基本的定时功能和驱动数模转换器(Digital to Analog Converter, DAC)的功能,不具备外部通道
  简单来说,就是实现一些简单的定时任务的时候使用基本定时器
  Stm32CubeMx 配置
  我们这里使用定时器驱动一个流水灯定时亮灭。
  和上一章类似,我的开发板PE6连接着LED2,这里就配置LED2闪烁。不同的是我们不用HAL_Delay()函数,而是使用定时器来使LED灯闪烁
  基本配置
  配置LED灯
  
  配置晶振时钟
  
  配置串口
  
  时钟数配置
  
  TIM6定时器配置
  设置TIM6定时器
  
  这里重点说一下第4和第5步
  这两部分别是配置分频系数和定时器周期的
  由上面的时钟数可以看到我们配置的时钟频率是72Mhz,也就是72000000hz。
  这个时候我们的分频系数配置为7199(其实就是7200,至于为什么一会我会讲到),也就相当于告诉CPU:将原来7200个频率脉冲看成一个频率脉冲。这样的话,分频后定时器 6 的时钟频率为 72000000/7200=10000hz,也就是它每1/10000秒会来一个脉冲。
  然后我们将定时器周期设置为9999(其实就是10000,至于为什么一会我会讲到),这样的话,定时器6就会检测到每过10000个脉冲的话就会触发定时器中断。结合上面定时器每1/10000秒会来一个脉冲就可以得到:每过10000*(1/10000)=1s就会触发一次定时器中断
  至于为什么要将分频系数和定时器周期设置为7199和9999而不是7200和10000呢,原因是Stm32的寄存器是从0开始计数的,即0~7199正好是7200个。定时器周期同理
  如果觉得上面的解释太枯燥的话,可以记忆下面这个公式:
  (分频系数/时钟频率)*定时器周期 = 需要的时间
  以1s为例:1s = (7199+1)/72000000*(9999+1)
  以0.5s为例:0.5s = (7199+1)/72000000*(4999+1)
  当然,分频系数、时钟频率、定时器周期 可以根据实际情况设置,不一定仅局限于某个数,比如0.5s也可以这么计算:0.5s = (3599+1)/72000000*(9999+1)
  时钟频率是我们在时钟数里面设置的,就是这货~
  
  设置TIM6定时器中断
  
  将抢占优先级设置为2,响应优先级设置为0
  在Stm32中,优先级号越小,优先级越高。当抢占优先级相同时,判断响应优先级
  编写代码
  
  编写 TIM6 更新中断服务程序
  
  大功告成
  但是如果在某一些不能查阅资料的情况下(比如考试)怎么快速找到这一些函数呢?
  这里我提供一个方法,如果不想背下来的话,可以参考下图
  
  
  
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分