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

【经验分享】STM32中实用的精确延时方法  

[复制链接]
天天晓宇 发布时间:2015-1-7 10:11
阅读主题, 点击返回1楼
赞 收藏 18 评论109 发布时间:2015-1-7 10:11
109个回答
easd 回答时间:2015-5-1 15:11:40
谢谢分享
JackieLaura 回答时间:2015-7-22 15:27:18
Dylan疾风闪电 发表于 2015-1-19 12:59
/ h6 ^4 w* `5 ]/ a1 x; \貌似72MHz时1us的计数值是9.
  P: Y+ n4 b/ S8 E& d//(nus*HCLK/8)&0x00FFFFFF; 1 ~+ |) C8 Q/ o) Z- O
SysTick->LOAD = ((nus*HCLK)&0x07FFFFF8)>>3;
9 L; B! i$ {; H" M
systick时钟默认1/8分频了
JackieLaura 回答时间:2015-7-22 15:30:06
ataudio 发表于 2015-3-9 20:29
. C+ o8 c2 M$ {, z8 _  r. o我在F407上使用此函数延时,函数设置为:
6 r7 K2 f- E$ {" I6 Zvoid Delay_us(__IO uint32_t nTime)
2 V/ M4 J1 R7 W; H  P* e$ a% q+ G{

# Z# t3 g) J' H: U# S9 Zload值从0开始计数,给load赋值需要减一。。
道胜天下 回答时间:2016-11-26 13:33:15
( ~3 I9 [# |, e2 z% \! @# x
  while (1)" s( C0 X- V) `8 {
  {6 |$ X4 n; U. \1 v& |! O7 v4 f
                GPIO_SetBits(GPIOC, GPIO_Pin_15);
: w! [. R. j* }                Delay_us(200);
& t3 h4 h, h. V8 R; H9 t& u                GPIO_ResetBits(GPIOC, GPIO_Pin_15);) m/ o( M7 v) S' @6 e
                Delay_us(400);
( G6 W, l# Z" s7 j& q) g9 R  }& z5 a8 G! N6 t" k% [' x, N
楼主我问一下这个用示波器看的时候高低电平是1:2的关系吗?
道胜天下 回答时间:2016-11-26 14:02:42
楼主你在us延时里第一行加上SysTick->VAL = 0x00;看看这下高低电平比是不是1:2啦。
7 i9 u) b$ Q( {8 @void Delay_us(uint32_t nTime)
) e9 M- K, H' \5 f- L1 p{
+ b. ^+ F9 v5 S$ p! E4 Q        SysTick->VAL = 0x00;1 I9 R7 H) E) q  I
        SysTick->LOAD = 72*nTime;
1 q6 k. {8 R. L+ S2 i        SysTick->CTRL = 0x00000005;4 E# [: f4 G; M
        while(!(SysTick->CTRL&0x00010000));
  F- N3 O5 c/ Y  |( H        SysTick->CTRL = 0x00000004;# ?6 B3 }2 Q7 m& f0 W9 i
}3 z2 K* s6 ?# a6 ~; X
zbber 回答时间:2016-11-26 16:07:54
谢谢分享,谢谢分享 赞一个
* h, d4 f5 m" E; s
在路上11111111 回答时间:2016-11-26 16:08:55
楼主弱弱的问一下,为什么是while(SysTick->CTRL&0x00010000));呢
watershade 回答时间:2016-11-26 21:49:28
收藏之,回头测试一下
冬天下雪 回答时间:2017-8-14 15:33:46
楼主你好,辛苦了,有个外行的问题请教一下昂,Delay_us()中我知道是很准确的,但是在Delay_ms()中,这里是个for循环,这不还是递减吗,这样准确吗
林光光 回答时间:2017-8-14 15:55:22
其实吧,使用了操作系统,SYSTICK就被RTOS使用了,在其他的功能实现中又要用到延迟,这怎么解决呢
good 回答时间:2017-8-20 07:13:33
试过了,很好用,多谢分享!
epochal 回答时间:2017-8-20 07:56:12
不错,谢谢分享!
凡夫俗仔 回答时间:2017-9-21 09:26:18
此延时函数应该用宏替换来写,已获得更准确延时。% ]& F0 s+ H' e4 B. }+ ^" X
以us延时为例,函数调用比宏替换会多出0.25us左右。$ B5 C: U* X* y0 T
5 ?5 \2 B. k! [" ^" I
以下是代码:
$ t; X6 W) G8 c7 \/* DELAY如果用函数来写,因为函数调用会有额外的花销,以1us延时测试,测得会多出0.25us左右,故采用宏替换已获得更准的延时 */# d) G, f! v, S# N3 z8 B7 K. F& _* ~  s
#define DELAY_US(nTime)  {SysTick->LOAD = 72    * nTime; SysTick->CTRL = 0x00000005; while(!(SysTick->CTRL & 0x00010000)); SysTick->CTRL = 0x00000004;}
: g- x! l" u$ s1 ]#define DELAY_MS(nTime)  {SysTick->LOAD = 72000 * nTime; SysTick->CTRL = 0x00000005; while(!(SysTick->CTRL & 0x00010000)); SysTick->CTRL = 0x00000004;}: d  G6 y# h( q5 x( K4 ~. ^) b
longrenwenzi 回答时间:2018-2-23 10:43:36
seven2016 回答时间:2018-2-23 19:11:21
不错,顶一下

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版