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

【经验分享】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
# K8 l! s1 [0 o3 u6 W5 ~$ |6 R貌似72MHz时1us的计数值是9.
/ L% m: S+ X" R' M9 Y2 _//(nus*HCLK/8)&0x00FFFFFF; . |/ g' A6 K8 D  N
SysTick->LOAD = ((nus*HCLK)&0x07FFFFF8)>>3;

5 d8 s" Q1 ?3 b& p# `systick时钟默认1/8分频了
JackieLaura 回答时间:2015-7-22 15:30:06
ataudio 发表于 2015-3-9 20:29# d, f$ q! M2 w9 w
我在F407上使用此函数延时,函数设置为:
5 v8 _' R0 V; c5 M- b/ J" gvoid Delay_us(__IO uint32_t nTime)
, Z+ n1 v0 n0 I{

% W7 e3 p) g0 k9 N' b5 v! u2 x6 Aload值从0开始计数,给load赋值需要减一。。
道胜天下 回答时间:2016-11-26 13:33:15

( B$ L* W7 M1 h! m  while (1)
1 y8 a3 Q0 e, v, c; S  {
+ Q4 f  u0 A8 |9 w$ y2 S                GPIO_SetBits(GPIOC, GPIO_Pin_15);* `6 p1 @& b- @1 E' m9 i5 G5 V1 p
                Delay_us(200);
% }5 g. U3 t- k& X& K; h                GPIO_ResetBits(GPIOC, GPIO_Pin_15);- G# e: ^) }: n2 K8 ]: a: G
                Delay_us(400);2 c7 V8 L% z6 a- ~: }
  }
/ ^; L0 n8 C1 x6 D* ~/ S5 J: x楼主我问一下这个用示波器看的时候高低电平是1:2的关系吗?
道胜天下 回答时间:2016-11-26 14:02:42
楼主你在us延时里第一行加上SysTick->VAL = 0x00;看看这下高低电平比是不是1:2啦。
5 j' m; R$ s9 F( g6 O4 L. ?: Y. ~void Delay_us(uint32_t nTime)
" a' z% c- G0 q6 Q! v$ b* ~6 W( l{
  H7 S. t7 M" ]7 b! t7 \        SysTick->VAL = 0x00;. A. o$ a0 @# \/ U
        SysTick->LOAD = 72*nTime;
; A4 ~' B1 B" k5 f2 S$ R8 D) T        SysTick->CTRL = 0x00000005;, D, f) {/ U7 ^* I7 \/ |+ }
        while(!(SysTick->CTRL&0x00010000));1 ^, @+ }, v! R, P  [3 Q+ r& L/ v& U
        SysTick->CTRL = 0x00000004;  S: `6 f1 u8 Y# J5 N
}2 F$ X3 p, R$ ]) u2 v  G+ P6 X% b
zbber 回答时间:2016-11-26 16:07:54
谢谢分享,谢谢分享 赞一个
$ V8 w0 x! {  I
在路上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
此延时函数应该用宏替换来写,已获得更准确延时。
+ _, e: {0 m9 y7 |以us延时为例,函数调用比宏替换会多出0.25us左右。' Y4 [1 v* Z1 B! y

, Q' u9 ~/ p* h以下是代码:% ^! q- @3 Y" R; L. t; e! J
/* DELAY如果用函数来写,因为函数调用会有额外的花销,以1us延时测试,测得会多出0.25us左右,故采用宏替换已获得更准的延时 */
  u. p$ e  o0 ?& B# @#define DELAY_US(nTime)  {SysTick->LOAD = 72    * nTime; SysTick->CTRL = 0x00000005; while(!(SysTick->CTRL & 0x00010000)); SysTick->CTRL = 0x00000004;}
3 F9 f! ?& _, S7 Q2 v, t( E* h- }3 a#define DELAY_MS(nTime)  {SysTick->LOAD = 72000 * nTime; SysTick->CTRL = 0x00000005; while(!(SysTick->CTRL & 0x00010000)); SysTick->CTRL = 0x00000004;}  _# ^- J- u% x1 o
longrenwenzi 回答时间:2018-2-23 10:43:36
seven2016 回答时间:2018-2-23 19:11:21
不错,顶一下

所属标签

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