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

【经验分享】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:597 h9 {) _$ t) `$ o) N* u# a
貌似72MHz时1us的计数值是9.
: J3 |1 {8 t5 b9 p  N//(nus*HCLK/8)&0x00FFFFFF; & L: W+ ~8 b* \" Q
SysTick->LOAD = ((nus*HCLK)&0x07FFFFF8)>>3;

# A2 S  P: d) O0 K0 N0 U3 Esystick时钟默认1/8分频了
JackieLaura 回答时间:2015-7-22 15:30:06
ataudio 发表于 2015-3-9 20:295 S1 _7 L% A% M* l8 w+ Z
我在F407上使用此函数延时,函数设置为:' U: V: e" v. L6 }9 n  X) f% _6 z
void Delay_us(__IO uint32_t nTime)
6 t7 f6 E% v' c& P{
6 e  e. A$ O5 v0 o+ T
load值从0开始计数,给load赋值需要减一。。
道胜天下 回答时间:2016-11-26 13:33:15

4 K$ l9 q( N+ \; }. T  while (1)* K  ?- n& K' U0 }( |9 r9 h6 T$ e
  {- x$ Z  ]4 Y* `$ I
                GPIO_SetBits(GPIOC, GPIO_Pin_15);( l; E- s4 T- V; E( I0 s- x; \
                Delay_us(200);8 Z3 c4 g0 i/ Y# U9 g* W: R7 ~
                GPIO_ResetBits(GPIOC, GPIO_Pin_15);% X3 i: P1 A8 Y9 M( F2 @3 F
                Delay_us(400);  Q: y6 B' T3 O+ ^) ]
  }0 u, m1 g2 {- }# V; B. T
楼主我问一下这个用示波器看的时候高低电平是1:2的关系吗?
道胜天下 回答时间:2016-11-26 14:02:42
楼主你在us延时里第一行加上SysTick->VAL = 0x00;看看这下高低电平比是不是1:2啦。
" F9 V" _' z" w% R6 X# l1 _2 q7 u# S! jvoid Delay_us(uint32_t nTime)8 J& e& U3 r1 H6 }" M& N
{
4 z$ i1 P7 R+ w, F# P        SysTick->VAL = 0x00;: @6 a  l" v4 q5 S
        SysTick->LOAD = 72*nTime;) I- r+ v5 o9 `% Z
        SysTick->CTRL = 0x00000005;6 W- r* Z0 F! n( M7 P5 E; e( n( Y" R
        while(!(SysTick->CTRL&0x00010000));5 d) e2 M7 H  `; B, t3 D
        SysTick->CTRL = 0x00000004;
, s; a! m. r! {; B* M# e& L! J}/ r. Q% Y# N) t3 u; z: m
zbber 回答时间:2016-11-26 16:07:54
谢谢分享,谢谢分享 赞一个
5 d1 m0 d9 P/ l$ e9 T" g8 ^$ V' |
在路上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
此延时函数应该用宏替换来写,已获得更准确延时。4 |9 z! I3 n! R& `7 {
以us延时为例,函数调用比宏替换会多出0.25us左右。
' l# `* c% x8 N! P, E7 m4 O
. E  Y3 c8 D6 K& D/ f' d2 a4 z以下是代码:& i% q9 T" [. }
/* DELAY如果用函数来写,因为函数调用会有额外的花销,以1us延时测试,测得会多出0.25us左右,故采用宏替换已获得更准的延时 */# k( u# H0 T4 j" O) L) [8 H/ j! T
#define DELAY_US(nTime)  {SysTick->LOAD = 72    * nTime; SysTick->CTRL = 0x00000005; while(!(SysTick->CTRL & 0x00010000)); SysTick->CTRL = 0x00000004;}* R) ]+ y/ N4 `% @1 L+ ^7 S* @% O
#define DELAY_MS(nTime)  {SysTick->LOAD = 72000 * nTime; SysTick->CTRL = 0x00000005; while(!(SysTick->CTRL & 0x00010000)); SysTick->CTRL = 0x00000004;}0 Q0 I0 M' \) u# e9 v, ]
longrenwenzi 回答时间:2018-2-23 10:43:36
seven2016 回答时间:2018-2-23 19:11:21
不错,顶一下

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版