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

【经验分享】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
; ?( y! {* A0 S/ k6 e: M5 e貌似72MHz时1us的计数值是9.' v: f" E! z* Q% K0 t9 I! U
//(nus*HCLK/8)&0x00FFFFFF; 5 l! l' \; G& n2 z
SysTick->LOAD = ((nus*HCLK)&0x07FFFFF8)>>3;

4 k$ v) n6 v3 Z& j( C6 {3 Tsystick时钟默认1/8分频了
JackieLaura 回答时间:2015-7-22 15:30:06
ataudio 发表于 2015-3-9 20:29
* ]5 J  u- J; p我在F407上使用此函数延时,函数设置为:
+ I, X2 D8 Y2 Tvoid Delay_us(__IO uint32_t nTime)
' n4 [0 Y. M+ b9 L# M$ K( C# t{

. |, D. }+ |& z; Wload值从0开始计数,给load赋值需要减一。。
道胜天下 回答时间:2016-11-26 13:33:15
# Z3 v/ J/ i8 H( G: j
  while (1)9 W5 \/ `  P8 U- S$ T7 K! c
  {
( Y  t% T7 I+ n' [' k                GPIO_SetBits(GPIOC, GPIO_Pin_15);
4 g2 I  N# x$ |$ M0 f3 N! A" p                Delay_us(200);2 i; A1 o- @  C8 h  U
                GPIO_ResetBits(GPIOC, GPIO_Pin_15);
* q2 |; r6 @+ T  \3 E2 O                Delay_us(400);+ r' C6 C1 k$ M& f
  }
6 m# w8 Z) m( c0 H楼主我问一下这个用示波器看的时候高低电平是1:2的关系吗?
道胜天下 回答时间:2016-11-26 14:02:42
楼主你在us延时里第一行加上SysTick->VAL = 0x00;看看这下高低电平比是不是1:2啦。
. p3 x/ e2 V+ R. N% Dvoid Delay_us(uint32_t nTime)1 t; i4 {3 W" g
{
$ j+ m! |; f1 z& L( N' l  N9 N        SysTick->VAL = 0x00;
! w* Z" G" Q" ]  t1 X8 H) e/ |8 j        SysTick->LOAD = 72*nTime;
0 X; e, m: m5 b- q; u/ b        SysTick->CTRL = 0x00000005;+ }' G9 Y0 o  R7 ]; V. r
        while(!(SysTick->CTRL&0x00010000));
$ k1 s2 a- y. |) m! L* k0 W" }/ D        SysTick->CTRL = 0x00000004;
. M5 w/ n9 i/ |4 k8 w, h! C2 b  g}
3 D! D7 Y* M' K& c: A( }8 h+ q
zbber 回答时间:2016-11-26 16:07:54
谢谢分享,谢谢分享 赞一个
3 X, E- q, K* k' ?1 l+ T' y: R
在路上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
此延时函数应该用宏替换来写,已获得更准确延时。
; z( ]) K; Y5 Z/ `# J% P以us延时为例,函数调用比宏替换会多出0.25us左右。
$ |; F/ H' f! {0 g& O' G0 i( \: B( j: I
以下是代码:' b0 j  a- K0 h' z2 W7 t
/* DELAY如果用函数来写,因为函数调用会有额外的花销,以1us延时测试,测得会多出0.25us左右,故采用宏替换已获得更准的延时 */
$ D6 m' M4 v: m  s6 D9 S* f#define DELAY_US(nTime)  {SysTick->LOAD = 72    * nTime; SysTick->CTRL = 0x00000005; while(!(SysTick->CTRL & 0x00010000)); SysTick->CTRL = 0x00000004;}
/ n  q/ G1 g2 Z% F- a  ?* v#define DELAY_MS(nTime)  {SysTick->LOAD = 72000 * nTime; SysTick->CTRL = 0x00000005; while(!(SysTick->CTRL & 0x00010000)); SysTick->CTRL = 0x00000004;}, F8 v# a% t( K9 M' K
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 手机版