STM32定时器的One Pulse Mode,OPM应用

OPM

T IMx_CR1的OPM位 位 3 OPM:单脉冲模式 (One-pulse mode)
0:计数器在发生更新事件时不会停止计数
1:计数器在发生下一更新事件时停止计数(将 CEN 位清零)

在这里插入图片描述

应用1-精准延时

OPM置位后当CEN置1启动CNT计数达到ARP的值后触发更新事件会自动讲CEN位清零,利用这个特性可以实现很准确的延时函数,其中TIM2/TIM5是32位的寄存器,TIM的时钟是240MHZ,可以设置预分频为24-1,这样一个CNT计数就是0.1微秒,如此32位CNT就能实现429秒的长时间精准延时了,非常好用

//采用TIM5 One-Pulse模式的准确延时函数,总延时的时间为Delay01uS/10微秒,最长429秒
void Delay01uS(uint32_t Delay01uS) {
        TIM5->ARR = Delay01uS-1;        //设置要延时的时间Delay01uS*0.1uS
        TIM5->CR1 |= TIM_CR1_CEN; //启动TIM6计数,计数更新事件后CNT自动清零
        while( TIM5->CR1 & TIM_CR1_CEN); // ARP更新事件后CEN位自动清零
}
函数的使用
  while (1)
  {
                //HAL_Delay(1000);
                Delay01uS(5000000*10); //延时5秒               
                printf("HelloWrold!\n");
                Delay01uS(2000000*10); //延时2秒               
                printf("HelloWrold!\n");
  }

应用2-精准定时

 void TIM4_IRQHandler(void)
{ 
  TIM_SelectOnePulseMode(TIM4,TIM_OPMode_Single);//OPM模式
  if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) 
  {
    TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    switch( time4_phaseflag ) {
     case FLAG_IDLING:
       ADIS_LED_STEST1_State( 1 );//  ADIS_LED_STEST1_State( 0 );//这是用示波器测试定时时间是否准确
      TIM4_Pri->ARR = 250; 
      TIM4->CR1 |= TIM_CR1_CEN;//启动TIM计数,计数更新事件后CNT自动清零, ARP更新事件后CEN位自动清零
      break;
     case FLAG_D2_CONVERTING:
  ADIS_LED_STEST1_State( 1 );

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不熬夜,早点睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值