STM32
登录
直播中
听我讲
9年用户
710经验值
擅长:电源/新能源 MEMS/传感技术
私信
关注
[问答]
如何使用cubeMX设置定时器?
开启该帖子的消息推送
stm32cubemx
如何使用cubeMX设置定时器?
回帖
(1)
潘斯凯
2021-11-24 11:32:53
概述
STM32的常见的定时器资源: 系统嘀嗒定时器SysTick、看门狗定时器WatchDog、实时时钟RTC、基本定时器、通用定时器、高级定时器。
系统嘀嗒定时器SysTick :这是一个集成在Cortex M3内核当中的定时器,它并不属于芯片厂商的外设,也就是说使用ARM内核的不同厂商,都拥有基本结构相同的系统定时器。主要目的是给RTOS提供时钟节拍做时间基准。
基本定时器:TIM6、TIM7。
通用定时器:TIM2、TIM3、TIM4、TIM5。在基本定时器的基础上,实现输出比较、输入捕获、PWM生成、单脉冲模式输出等功能。这类定时器最具代表性,使用也最广泛。
高级定时器:TIM1、TIM8。
STM32通用定时器的基本组成:
STM32的通用定时器,是一个通过可编程预分频器(Prescaler)驱动的16位自动重装主计数器(Counter Period)构成。可以对内部时钟或触发源以及外部时钟或触发源进行计数。
首先,定时器时钟信号送入16位可编程预分配器(Prescaler),该预分配器系数为0~65535之间的任意数值。预分配器溢出后,会向16位的主计数器(Counter Period)发出一个脉冲信号。
预分频器,本质上是一个加法计数器,预分频系数实际上就是加计数的溢出值。
定时器发生中断时间的计算方法:
定时时间 = (可编程预分频器+1 ) X (主计数器+1) X 1/ 定时器时钟频率
例:假设时钟信号为1KHz,可编程预分频器系数为9,主计数器系数为9。此时定时器为0.1秒
使用cubeMX设置定时器
时钟树种系统时钟是72MHz
别忘了在NVIC Settings中允许定时器中断
这两部分别是配置分频系数和定时器周期的
由上面的时钟数可以看到我们配置的时钟频率是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)
生成代码,编写代码
在main函数中启动定时器
HAL_TIM_Base_Start_IT(&htim2); //启动定时器2 编写 TIM2 更新中断服务程序
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim->Instance == TIM2){ HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); }} 编译下载到芯片测试查看结果
概述
STM32的常见的定时器资源: 系统嘀嗒定时器SysTick、看门狗定时器WatchDog、实时时钟RTC、基本定时器、通用定时器、高级定时器。
系统嘀嗒定时器SysTick :这是一个集成在Cortex M3内核当中的定时器,它并不属于芯片厂商的外设,也就是说使用ARM内核的不同厂商,都拥有基本结构相同的系统定时器。主要目的是给RTOS提供时钟节拍做时间基准。
基本定时器:TIM6、TIM7。
通用定时器:TIM2、TIM3、TIM4、TIM5。在基本定时器的基础上,实现输出比较、输入捕获、PWM生成、单脉冲模式输出等功能。这类定时器最具代表性,使用也最广泛。
高级定时器:TIM1、TIM8。
STM32通用定时器的基本组成:
STM32的通用定时器,是一个通过可编程预分频器(Prescaler)驱动的16位自动重装主计数器(Counter Period)构成。可以对内部时钟或触发源以及外部时钟或触发源进行计数。
首先,定时器时钟信号送入16位可编程预分配器(Prescaler),该预分配器系数为0~65535之间的任意数值。预分配器溢出后,会向16位的主计数器(Counter Period)发出一个脉冲信号。
预分频器,本质上是一个加法计数器,预分频系数实际上就是加计数的溢出值。
定时器发生中断时间的计算方法:
定时时间 = (可编程预分频器+1 ) X (主计数器+1) X 1/ 定时器时钟频率
例:假设时钟信号为1KHz,可编程预分频器系数为9,主计数器系数为9。此时定时器为0.1秒
使用cubeMX设置定时器
时钟树种系统时钟是72MHz
别忘了在NVIC Settings中允许定时器中断
这两部分别是配置分频系数和定时器周期的
由上面的时钟数可以看到我们配置的时钟频率是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)
生成代码,编写代码
在main函数中启动定时器
HAL_TIM_Base_Start_IT(&htim2); //启动定时器2 编写 TIM2 更新中断服务程序
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim->Instance == TIM2){ HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); }} 编译下载到芯片测试查看结果
举报
更多回帖
rotate(-90deg);
回复
相关问答
stm32cubemx
STM32
Cubemx
定时器
怎么使用?
2021-11-24
1574
小编科普STM32
CubeMx
是如何配置
定时器
的
2021-08-18
1983
如何利用
CubeMx
生成的工程去检测STM32
定时器
设置
的超时呢
2021-12-09
858
STM32
CubeMX
基本
定时器
接口怎么使用?
2021-11-24
490
怎样使用Stm32
CubeMx
基本
定时器
去驱动一个流水灯
定时
亮灭呢
2021-11-23
1298
STM32
CubeMX
FreeRTOS的软件
定时器
如何实验
2021-10-13
890
如何在
CubeMX
中
设置
带
定时器
的DFSDM?
2023-01-05
352
STM32
CubeMX
基础
定时器
TIM6有何功能呢
2021-11-24
889
怎样使用STM32
cubemx
去配置通用
定时器
呢
2021-10-22
1454
怎样去创建并使用SMT32
定时器
中断的
2021-10-21
1231
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分