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

【经验分享】STM32时间延时的代码优化和讨论

[复制链接]
caizhiwei 发布时间:2015-1-21 10:28
本帖最后由 caizhiwei 于 2015-1-21 10:34 编辑
! C- B2 Y1 y1 f! G" p# T' F# `9 h! k/ p  n5 U  |- D: X& B& ~
原帖在【经验分享】STM32中实用的精确延时方法https://www.stmcu.org.cn/module/foru ... 8792&fromuid=1821766 u# x" u3 D0 ^5 q/ n
(出处: 意法半导体STM32/STM8技术社区)
/ `6 W, |+ ~- H' W 在此表示感谢!7 \3 r. w' `: `! Q6 T9 v9 ]

' N5 b" P  U. j3 a5 p1.把寄存器操作改为位与,位或操作,更规范;
. b9 i, I# K0 ]+ \& z" E2.把毫秒延时改为直接延时,而不是用for循环,更精准。* ]8 U" J; g: J' a6 Q1 c6 u; G$ ~
3.增加初始化函数,修改时钟系数更方便;% X, _. @  R# l# Z2 `/ G3 S

$ ^4 e5 M+ Q0 c; H, [+ g楼主使用的是clk,我使用的是8分屏,其实效果都是一样的哦~~' W" C  e% g3 p0 }- E( F: h+ v

$ l1 D6 H% q" j  E) |& ~
  1. #include "delay.h"
    9 X! n' C, |* B9 G# x9 x  v7 _
  2. 4 s3 V  d; s3 \* n! T
  3. static u8 fac_us;//us延时倍乘数
      c& |7 E4 i9 F+ S5 A' H
  4. static u32 fac_ms;//ms延时倍乘数
    / D# i  v2 n* K* {/ S2 a
  5. 9 e" s6 f4 E  [/ Q# M9 ~! N  J7 a
  6. /*******************************************************************************4 }% N/ V* U/ Y! A
  7. * Function Name  :Delay_Init
    . Q$ `5 N6 m# p; x' P* E# V
  8. * Description    : SYSTICK的时钟固定为HCLK时钟的1/8- S7 m  G5 k8 x1 p1 c
  9. * Input          : SYSCLK:系统主频时钟(SYSCLK Mhz)
      l% \4 K* C! ~2 M1 D4 y
  10. * Return         : None
    % k* B6 C( O8 q9 o, h" D
  11. *******************************************************************************/: M' |: k; y0 j) w: F
  12. void Delay_Init(u8 SYSCLK)
    $ T0 t  G) s$ K8 g! }0 Q
  13. {
    ! I: w' A) _5 }7 ~2 K( R
  14.     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);// select HCLK/8 as systick clock source.
    . |1 k3 {- U2 D$ K: Y" X7 I4 G+ V
  15.     fac_us=SYSCLK/8;         //9            ( u# z" |7 O# z, Z% v9 w. B' W
  16.     fac_ms=(u32)fac_us*1000;. ^4 K7 P( O' P, r" F% ]$ ], a
  17. }
    & U8 R1 W, f; a) e9 ~1 B
  18. 1 A3 Z7 F' S0 l, \  `1 v5 u3 H3 J
  19. /*******************************************************************************
    ) ^8 ]% e9 c$ K5 [
  20. * Function Name  :delay_ms
    ) C9 ~; ^! l% K
  21. * Description    : SysTick计数值最大为24位,最大值为16777215,如果fac_us=9000,5 x# k0 b3 h- ^$ U
  22. 那么nms的最大值为1864(1864ms)
    . i: Z9 }3 ]2 E/ b) o
  23. * Input          : nus,注意nms的范围 nms<=1864 # `& x* P) x* k- n4 W% y
  24. *******************************************************************************/
    , w; c( p, P1 U# K6 J
  25. void delay_ms(u16 nms)5 c! p% |5 I( W9 [4 t4 c
  26. {                                                
    * V1 X7 {7 R, U9 m# E, L" D6 ]
  27.     SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)        4 a$ ?; c! k9 i3 D9 ~0 \
  28.     SysTick->VAL   = 0;
    + M# f- G6 n, c  g
  29.     SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;   //Enable Systick Function and start counting           & B- ^* @+ R1 z
  30.     while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));   //等待计数到0
    " s+ j, t$ z- J- B3 u- n4 r1 [
  31.     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;              //关闭计数器                 0 f) ?" ?: u  G# _
  32. } $ t0 x  r5 S8 I. a  M, R  @' I
  33. 5 {0 f: B  `; U9 X7 h" P' [
  34. & ~+ Y# \1 ^" e  m( a
  35. /*******************************************************************************( E2 r. r+ q% A8 k  Q% e7 P
  36. * Function Name  :delay_us
    ' w9 i; d+ P# q# [- k
  37. * Description    : SysTick计数值最大为24位,最大值为16777215,如果fac_us=72那么nus1 u% ?6 i2 C5 |# p5 F& K% }
  38. 的最大值为233016,如果fac_us=9那么nus的最大值为1864128(1864ms)5 `( N' a+ j8 e. E/ Z
  39. * Input          : nus
    $ m9 [  A5 E. J9 B5 d
  40. * Return         : None
    ! q8 T' y! ?) s
  41. *******************************************************************************/
    % ]- s6 L/ y2 t. E2 n- [" I8 p) F; _, }
  42. void delay_us(u32 nus)
    1 P( U; ?3 e" y1 v1 r' L0 o  {
  43. {                          
    3 D; s% J3 K1 F# a" f( B4 B7 U
  44.     SysTick->LOAD=nus*fac_us;     //时间加载        
    3 q% ]: D+ \" C
  45.     SysTick->VAL   = 0; ; H3 D+ x' ~4 N: N) Q
  46.     SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;   //Enable Systick Function and start counting           
    4 Q( t) J* Z# M- v7 l
  47.     while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));   //等待计数到0
    & b3 Q* Y* v; F# _& ?$ ]0 \" a
  48.     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;              //关闭计数器   
    4 C$ Y1 q  \+ ^8 a3 m3 ^
  49. }
    ! j/ d! e. _7 r
复制代码

7 M/ |8 k% J/ [
* W; d; e: `0 x" R5 ~# T, U, N% l
% A' B) @4 n/ `; {# }/ R
8 I0 {6 R6 o# L1 L
收藏 1 评论6 发布时间:2015-1-21 10:28

举报

6个回答
沐紫 回答时间:2015-1-21 10:33:16
支持,一起讨论一起进步
caizhiwei 回答时间:2015-1-21 10:35:04
呵呵,有些东西看似简单,这是折腾一下,搞个明白才行
caizhiwei 回答时间:2015-1-21 10:37:00
本帖最后由 caizhiwei 于 2015-1-21 10:38 编辑 ! G, a( w0 N  l) I: b) `/ ]

8 [# x! y7 ?* m* O, M( f72M分频验证OK
; x0 C6 [$ a* e5 L+ M% J1 M0 i IMG_20150120_145806.jpg # A' B: G2 {; F
hanmcustm 回答时间:2015-1-21 10:47:52
楼主可以整理出txt文件附在上面直接下载,
anobodykey 回答时间:2015-1-21 11:16:52
学习一哈
feel-376797 回答时间:2015-2-23 09:55:27
谢谢分享

所属标签

相似分享

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