STM32的定时器 TIM_ARRPreloadConfig开与不开到底有什么影响

TIM_ARRPreloadConfig(TIM3,ENABLE);预加载使能

TIM_ARRPreloadConfig函数是修改CR1->APRE位,

APRE=0是修改预加载寄存器(ARR)后立即送给影子寄存器;

APRE=1是修改预加载寄存器(ARR)会在更新事件发生后送给影子寄存器;

也就是说APRE=0时修改ARR值会在当前周期就变了,而APRE=1时修改ARR值会在下一周期生效;

再看官方手册给的图:

图49是修改了ARR值=0x36后当前周期计时到36就跳到0了,图50是修改ARR=0X36后计数值还是计到0xf5;

再实际验证一下:

使用定时器3产生pwm,修改周期值,同时让PA9引脚翻转,用来标记修改时间

总结:

APRE=0时修改ARR值(周期值)会在当前周期就变了,

APRE=1时修改ARR值(周期值)会在下一周期生效;

 

  • 22
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这段代码是用来初始化STM32单片机中的TIM2定时器的。具体注释如下: ```c void Drv_TIM2_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //声明一个包含TIM2定时器初始化参数的结构体变量 /* TIM2 Clock Enable */ RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM2, ENABLE); //TIM2定时器的时钟 /* Configure TIM2 */ TIM_TimeBaseStructure.TIM_Period = 0x000FFFFF; //设置计数器自动重装载值,即计数器计数到这个值后会自动清零 TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置预分频系数,这里设为0表示不预分频 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割系数,这里设为TIM_CKD_DIV1表示不分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数器的工作模式,这里设为向上计数 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据上述参数初始化TIM2定时器 TIM_ARRPreloadConfig(TIM2, DISABLE); //禁止TIM2定时器自动重载值的缓存 TIM_UpdateDisableConfig(TIM2, DISABLE); //使TIM2定时器下一个更新事件的产生不会禁止计数器的计数 TIM_UpdateRequestConfig(TIM2, TIM_UpdateSource_Regular); //设置TIM2定时器下一个更新事件的产生来源为计数器向上计数到自动重装载值 /* Clear Update flag */ TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除TIM2定时器的更新标志位 /* Reset cnt */ TIM_SetCounter(TIM2, 0); //将TIM2定时器的计数器清零 /* Enable TIM2 */ TIM_Cmd(TIM2, ENABLE); //使能TIM2定时器 } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值