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