文章目录
- OPM
 - 应用1-精准延时
 - 应用2-精准定时
 
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 );
 




















