[活动专区]

【AT-START-F407测评】用定时器Timer3作微秒延时

[复制链接]
476|1
手机看帖
扫描二维码
随时随地手机跟帖
ZRJ8951|  楼主 | 2021-2-20 13:30 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include "at32f4xx.h"
#include "at32_board.h"
void Delay_Timer3_Init(void);
void Delay_TMR3_us(uint32_t us_cnt);

int main(void)
{
  AT32_Board_Init();
        Delay_Timer3_Init();

  for(;;)
  {
    AT32_LEDn_Toggle(LED2);//OK
//   Delay_ms(100);
                Delay_TMR3_us(100);
//  AT32_LEDn_Toggle(LED3);
  //  Delay_ms(200);
//   AT32_LEDn_Toggle(LED4);
  //  Delay_ms(200);
  }
}
void Delay_Timer3_Init(void)
{
    TMR_TimerBaseInitType  TMR_TimerBaseInitStructure = {0};

    /* TMR3 clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_TMR3, ENABLE);
       
                TMR_TimeBaseStructInit(&TMR_TimerBaseInitStructure);
    TMR_TimerBaseInitStructure.TMR_ClockDivision = TMR_CKD_DIV1;
    TMR_TimerBaseInitStructure.TMR_CounterMode = TMR_CounterDIR_Down;
                 TMR_TimerBaseInitStructure.TMR_Period = 100;
    TMR_TimerBaseInitStructure.TMR_DIV = 238;
  //  TMR_TimerBaseInitStructure.TMR_Period = 100-1;
//   TMR_TimerBaseInitStructure.TMR_DIV = (84-1);
                TMR_TimerBaseInitStructure.TMR_RepetitionCounter = 0x0000;
       
          TMR_TimeBaseInit(TMR3, &TMR_TimerBaseInitStructure);
/*               
          while(TMR_GetFlagStatus(TMR3,TMR_FLAG_Update)==RESET);
    TMR_ClearFlag(TMR3,TMR_FLAG_Update);
    //STS & TMR_FLAG               
*/
               
               
    while((TMR3->STS & TMR_FLAG_Update)!=SET);
    TMR3->STS = (uint16_t)~TMR_FLAG_Update;
               
}


//延时函数如下,对CNT寄存器赋延时值,然后通过判断Update标志位进行阻塞延时。
void Delay_TMR3_us(uint32_t us_cnt)
{
   TMR3->CNT = us_cnt-1;
/* Enable the TMR Counter */
   TMR3->CTRL1 |= TMR_CTRL1_CNTEN;       
   while((TMR3->STS & TMR_FLAG_Update)!=SET);
   TMR3->STS = (uint16_t)~TMR_FLAG_Update;
       
/* Disable the TMR Counter */
   TMR3->CTRL1 &= (uint16_t)(~((uint16_t)TMR_CTRL1_CNTEN));
}




通电测试

通电测试

使用特权

评论回复
muyichuan2012| | 2021-2-20 14:18 | 显示全部楼层
您好,void Delay_TMR3_us(uint32_t us_cnt) 函数中使用OPM模式比单纯操作 TMR3->CTRL1 &= (uint16_t)(~((uint16_t)TMR_CTRL1_CNTEN));更为有效。因为OPM单脉冲模式可以准确在一个周期自动关闭,而直接使用CEN关闭可能会存在CNT多跑几个的情况,毕竟执行代码时,定时器一直都在跑。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

97

主题

201

帖子

1

粉丝