STM32的预分频和自动重装载的定时器延时设置

根据STM32的定时器时钟的频率,比如时钟的频率是72MHZ,可以理解为一秒钟STM32会自己数72M次,
预分频系数就是将频率分割,比如分频系数是72,则该时钟的频率会变成72MHZ/72=1MHZ,
但是在设置的时候要注意,数值应该是72-1。
假定分频系数是72-1,那么频率变成1MHZ,也就意味着STM32在一秒钟会数1M次,即1us数一次。1/1000 000 =0.000 001s = 1us

设定 预分频 7200 -1

频率为 10 000   

1/10 000 = 0.0001 s =  100us 

【自动重装载 10000 - 1

100us * 10000 = 1000ms = 1s(应该不能定时这么长时间,所以不采用)】

设定 自动重装载1000 -1

定时1ms,由于1ms=1us*1000,那么装载值就是1000-1;


如此类推,在预分频系数确定的情况下,定时的时长就由预装载值确定了。
至于要把值减一的原因,是听说是bug无法解决。

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在使用STM32定时器进行延时的时候,可以使用定时器的计数功能来实现延时。具体步骤如下: 1. 配置定时器的时钟源和分频系数,选择合适的定时器和通道。 2. 初始化定时器,并设置计数器的自动装载。 3. 启动定时器计数。 4. 在延时函数中,使用循环判断定时器的计数是否达到设的延时时间。 5. 当计数达到设的延时时间后,停止定时器计数。 以下是一个示例代码,演示了使用TIM2定时器和通道1进行延时的方法: ```c #include "stm32f4xx.h" void delay_ms(uint32_t ms) { // 配置定时器2的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 设置定时器2的分频系数为84,即84MHz的系统时钟 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Prescaler = 83; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 999; // 计数器装载设置为999则延时1ms TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 启动定时器2 TIM_Cmd(TIM2, ENABLE); // 延时 uint32_t i; for (i = 0; i < ms; i++) { // 等待计数器计满 while (TIM_GetCounter(TIM2) < 999); // 清零计数器 TIM_SetCounter(TIM2, 0); } // 停止定时器2 TIM_Cmd(TIM2, DISABLE); } int main(void) { // 初始化系统时钟等 // ... // 延时1秒 delay_ms(1000); while (1) { // 循环执行其他任务 // ... } } ``` 上述代码中的delay_ms()函数实现了延时功能,参数ms为要延时的时间(单位:毫秒)。该函数使用循环判断定时器2的计数是否达到999(即1ms),然后清零计数器,直到延时时间达到指定。 需要注意的是,以上示例代码仅适用于STM32F4系列的MCU,对于其他系列的MCU,具体的寄存器和时钟配置可能会有所不同,请根据实际情况进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值