你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于SysTick 1us延时的实验

[复制链接]
xyc2690 提问时间:2015-1-15 22:46 /
本帖最后由 xyc2690 于 2015-1-24 20:21 编辑

常常在论坛看到有关SysTick 不能实现1us延时的问题,晚上决定亲手用示波器测一下。
首先,我的板子是NucleoSTM32F072 ,没有外接晶振,设置使用内部晶振48M(HSI48)。

时钟频率:1/48M=0.0208333us
没有使用STM32的固件库,1us延时比较短,


  1. while (1)
  2.   {
  3.                 GPIOA->ODR ^=  GPIO_PIN_5;
  4.                 Delay_us(1);
  5.   }
复制代码
每1us   GPIO状态翻转。
  1. void Delay_us(uint32_t nTime)
  2. {
  3.     SysTick->VAL=0X00;                              //  初值
  4.     SysTick->LOAD=48*nTime;                   //  重装值;48个时钟周期=1us
  5.     SysTick->CTRL=0x00000005;               //  第0位:使能时钟   第3位:使用内部时钟
  6.     while(!(SysTick->CTRL&0x00010000));  //计时
  7.     SysTick->CTRL|=0x00000004;             // 第1位:产生异常请求
  8. }
复制代码


1.jpg

不能实现1us延时。

******************************************************************
我尝试将
SysTick->VAL=0X00;   注释掉
  1. void Delay_us(uint32_t nTime)
  2. {
  3. //SysTick->VAL=0X00;              //  初值
  4.   SysTick->LOAD=48*nTime;    //  重装值;48个时钟周期=1us
  5.   SysTick->CTRL=0x00000005;//  第0位:使能时钟   第3位:使用内部时钟
  6.   while(!(SysTick->CTRL&0x00010000));//计时
  7.   SysTick->CTRL|=0x00000004;// 第1位:产生异常请求
  8. }
复制代码
2.jpg
除了第一次之后的Delay_us(1)有改观,

进一步,如果将

SysTick->LOAD=48*nTime; // 重装值;48个时钟周期=1us
SysTick->CTRL=0x00000005;// 第0位:使能时钟 第3位:使用内部时钟
这两句在前面初始化,而不放进延时:



3.jpg

延时就比较精确了。


我的问题就是“SysTick->VAL=0X00; ” 为什么会有1us?

收藏 1 评论24 发布时间:2015-1-15 22:46

举报

24个回答
天天晓宇 回答时间:2015-1-16 08:31:15
这个没什么意义
xyc2690 回答时间:2015-1-16 08:32:27
holts1 发表于 2015-1-16 08:18
本身中断切换要时间的,这个1U就是修正值

中断响应考虑进去了,没有1us这么长的,当然这里延时1us gpio翻转一次,示波器显示的是1个周期其实是延时2us了。我的疑问是清空SysTick->VAL  相对与其他寄存器操作很费时间。。。
xyc2690 回答时间:2015-1-18 18:29:41
如果每次都执行“VAL清0” 大约需要1.8us,

重装值可以在之前初始化,不必放进delay函数中。如果不执行”VAL清0“这条 就是1us,这样做的话所以只有第一次执行1us是未知、不精确的,因为VAL初值不知道,之后的1us延时都可以实现。
wyxy163@126.com 回答时间:2015-1-16 07:55:00
提示: 作者被禁止或删除 内容自动屏蔽
holts1 回答时间:2015-1-16 08:18:35
本身中断切换要时间的,这个1U就是修正值
我是酱油哥 回答时间:2015-1-16 08:33:57
不错    好东西  
holts1 回答时间:2015-1-16 12:01:11
xyc2690 发表于 2015-1-16 08:32
中断响应考虑进去了,没有1us这么长的,当然这里延时1us gpio翻转一次,示波器显示的是1个周期其实是延时 ...

即然费时间,哪它有没有预加载的机制?
大秦正声 回答时间:2015-1-16 14:26:51
学习,内部晶振有误差的
xyc2690 回答时间:2015-1-16 14:39:29
holts1 发表于 2015-1-16 12:01
即然费时间,哪它有没有预加载的机制?

就是不清楚为什么费时间呀~
hanmcustm 回答时间:2015-1-16 15:04:48
楼主用外部时钟试一下
holts1 回答时间:2015-1-16 15:59:44
xyc2690 发表于 2015-1-16 14:39
就是不清楚为什么费时间呀~

清除它需要多少时间 ,  需要1u 的时间吗 ?  
holts1 回答时间:2015-1-16 16:00:56
holts1 发表于 2015-1-16 15:59
清除它需要多少时间 ,  需要1u 的时间吗 ?

你现在设的值是 0, 但用外部示波器看到的是 2u,   是否说明清除它需要1u 的时间 ?
AndyYau-268557 回答时间:2015-1-17 19:41:51
这个没有研究过,觉得应该是晶振和GPIO口的速度造成的延误。另外定义1us意义不是很大吧
党国特派员 回答时间:2015-1-17 20:39:53
333.png
拼命三郎 回答时间:2015-1-17 20:48:16
支持一下
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版