OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2970|回复: 5

利用定时器实现1us延时为什么不对

[复制链接]

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2018-11-15
在线时间
49 小时
发表于 2019-11-5 21:33:54 | 显示全部楼层 |阅读模式
1金钱
/**
  利用基本定时器5实现延时函数  实现1us延时
  */
void tim5_init(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   // NVIC_InitTypeDef NVIC_InitStructure;
    /*AHB = 96MHz,RCC_CFGR的PPRE1 = 4,所以APB1 = 24MHz,TIM2CLK = APB1*2 = 48MHz */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);/*使能定时器时钟*/
    /* Time base configuration */         
    TIM_TimeBaseStructure.TIM_Period = 48;                          //自动重装载值
    TIM_TimeBaseStructure.TIM_Prescaler =0;                          //定时器分频
    TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;       //向上计数模式
    TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
    TIM_ITConfig(TIM5,TIM_IT_Update,DISABLE);       //禁止定时器5更新中断

//    /*这里没有必要使能重装载寄存器*/
//  TIM_ARRPreloadConfig(TIM5, ENABLE); //自动重装载寄存器使能
//    NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn; //定时器5中断
//    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
//    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
//    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//    NVIC_Init(&NVIC_InitStructure);
//   
//    /* 设置更新请求源只在计数器上溢或下溢时产生中断 */
//    TIM_UpdateRequestConfig(TIM5,TIM_UpdateSource_Global);
//    TIM_ClearFlag(TIM5, TIM_FLAG_Update);
}
void delay_n_us(u16 i)
{
        TIM5->ARR = 48*i-1;
        TIM5->CR1 |=0x01;      //使能计数器
        while(TIM5->CNT)
        {}
        TIM5->CR1 = ~(1<<0);   //计数器失能
}
上面是我的代码,这样延时为什么不准啊,

最佳答案

查看完整内容[请看2#楼]

因为MCU执行你的函数估计都不止1us了,所以,延时1us不能用这种方式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-11-5 21:33:55 | 显示全部楼层
因为MCU执行你的函数估计都不止1us了,所以,延时1us不能用这种方式
回复

使用道具 举报

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1074
金钱
1074
注册时间
2012-1-10
在线时间
238 小时
发表于 2019-11-6 13:44:24 | 显示全部楼层
TIM_TimeBaseStructure.TIM_Prescaler =0;                          //定时器分频
此处有误
回复

使用道具 举报

6

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2018-4-4
在线时间
40 小时
发表于 2019-11-6 17:00:33 | 显示全部楼层
预分频跟自动重装置是自动加1的,假如说预分频为3;写成TIM_TimeBaseStructure.TIM_Prescaler =3-1;重装载值也是同样道理,你试一下
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2018-11-15
在线时间
49 小时
 楼主| 发表于 2019-11-7 09:10:02 | 显示全部楼层
楼下是老王 发表于 2019-11-6 17:00
预分频跟自动重装置是自动加1的,假如说预分频为3;写成TIM_TimeBaseStructure.TIM_Prescaler =3-1;重装载 ...

改了之后还是不行。
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2018-11-15
在线时间
49 小时
 楼主| 发表于 2019-11-8 09:20:04 | 显示全部楼层
正点原子 发表于 2019-11-5 21:33
因为MCU执行你的函数估计都不止1us了,所以,延时1us不能用这种方式

原子,那systick延时1us不就是这么延时的吗? 有什么区别吗? 谢谢啦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 04:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表