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

【经验分享】stm32 滴答时钟实现较准时延时功能

[复制链接]
STMCU小助手 发布时间:2022-2-3 18:00
前记:
  以前自己在编写延时函数的时候,经常是for()结构或者while()结构以及do while{}结构。但这3种方法是非常的粗糙,在我现在的工作中是不能满足其精度的。由于stm32中有个滴答时钟,于是以后stm32相关的延时程序,打算拿它作挡箭牌了。
  首先是,stm32 的数据手册上并没有滴答时钟的东西,只说了其会产生中断,具体如何,没说。谷歌了几遍,又查询了些许资料,发现来源于<<xxx权威指南>>和<<xxx技术手册>>。
  然后在网上发现使用其作为延迟功能有两个方法,一个是使用中断方式,一个是使用查询方式<非中断>。由于尚未学习stm32中断配置方法,于是先使用正点原子的 查询方式。在这里感谢正点原子的分享!下附具体代码和调用例程代码。
+ }* t9 m' p1 X7 c5 e7 {
延时程序的头文件Delay.h
  1. #ifndef _DELAY_H_: e! Y8 ?2 Y- H
  2. #define _DELAY_H_
    , f5 W1 m3 O% A

  3. % K3 ]4 U& S: v* |
  4. void delay_init(u8 SYSCLK);$ d4 |0 F! I" p* c7 C, e" j
  5. void delay_ms(u16 nms);+ Z$ q8 r. o& a
  6. void delay_us(u32 Nus);4 S! V% f; Y9 H
  7. 3 y9 _# a3 \- b: S: W

  8. " F! K) N& e5 n, B7 a8 i- c& C! L: E
  9. #endif
复制代码
+ s* E# C' \& C
延时程序实现文件Delay.c
  1. /**********************************************************
    # o5 N  ^* m+ Y6 C. F5 J6 H" l
  2. 文件:Delay.c
    9 Z) F, h9 |$ b( Z$ x
  3. 函数:void delay_init(u8 SYSCLK);
    - {7 l0 q9 {9 L) Y
  4.       void delay_ms(u16 nms);1 D2 E  U# d! ]
  5.       void delay_us(u32 Nus);
    3 Z# N5 P9 e1 M6 U
  6. 说明:三个函数实现的功能是不采用中断方式,并且用stm32系统滴答时钟来实现延时功能。% F4 N1 J9 p+ K4 R6 W. H' v$ w( V
  7.      出自 正点原子<<stm32不完全手册>> -- 该程序设计的理念在该书中已经讲解。      
    , j. @$ f' n" n
  8. ***********************************************************/
    ! g2 q: ?5 {# U) w1 V
  9. ; c0 @; n& X5 e5 j/ n, w

  10. 7 I: g& F! o3 F2 L, n
  11. #include <stm32f10x.h>
    # Q0 B. ~2 x% b' |4 s, ]
  12. #include "Delay.h"
    & c, R) ]2 ~' m. Y: H

  13. ) x9 D  ?8 M5 w' o  O0 l! [

  14. , d+ D9 i1 V3 E$ L) F/ _* |0 `$ d( y
  15. static u8  fac_us=0;//us延时倍乘数, r% }  o- I/ `: V. ~6 G2 A
  16. static u16 fac_ms=0;//ms
    5 T0 J+ G9 ?% P9 E" u
  17.   C; l2 K7 [( g
  18. /**************************************************0 S9 w/ {& r+ k# {! A- ^
  19. Name: delay_init; Y+ X7 g6 g3 C- h. Z2 C
  20. 功能:应用程序延时函数初始化,包括为滴答时钟准备相关数值
    1 g) x$ S) o7 w. b$ `' `
  21. 参数:u8 SYSCLK& V% H3 ^& o* O5 u  T7 o! |
  22. 返回:None: g' w! [5 ]( n% i8 p
  23. ***************************************************/
    * J, i- O6 |$ U) B/ u) z( i
  24. void delay_init(u8 SYSCLK)4 E6 J& Y' A; h7 H# H1 H0 \: c0 b4 ~
  25. {0 C% F' ~% H+ x( p: W6 Y5 y: K
  26.     SysTick->CTRL&=0xfffffffb;//设置滴答时钟的时钟源:bit 2清空,选择外部时钟HCLK/8
    * {6 o- f6 U# }2 K  J* }0 N% G
  27.     fac_us = SYSCLK / 8;  R4 r$ C- J7 k2 j
  28.     fac_ms = (u16)fac_us*1000;    2 q) S" J7 |9 P4 \6 B0 }
  29. }7 J+ r6 R) e7 b4 N1 u
  30. /**************************************************$ c. G7 X! r: y* G$ S
  31. 名字:delay_ms
    ) F& F; f! o) T) E
  32. 共能:应用程序ms级别的延时实现
    ; w- u* \; b) N% n# v3 Q( r7 Z' }
  33. 参数:u16 nms
    4 \' a$ |. I$ Y: L1 f
  34. 返回:None
    ; v( ?5 l4 o/ e3 e+ a
  35. ***************************************************/! X- I! h- T5 O8 h
  36. void delay_ms(u16 nms)
    / p  _3 U$ {; [1 |
  37. {        
    * y; z/ `/ {& j6 I7 Y, K! j
  38. u32 temp;   
    % A8 J# t% n5 |8 e3 y% e5 v3 `
  39. SysTick->LOAD=(u32)nms*fac_ms;//时间加载
    & S2 B; R! [' D7 O5 ]. i
  40. SysTick->VAL =0x00;           //清空计数器& ^2 h) p) y5 |  R- w9 z& R0 q+ C
  41. SysTick->CTRL=0x01 ;          //开始倒数 % {( i" z7 n& W8 U& R' ]: j, r" H
  42. do8 M8 W% T8 K! p
  43. {2 e; E8 v0 S- o3 n4 p
  44.   temp=SysTick->CTRL;
    : @0 |2 e2 K% S
  45. }: a3 o. `) ^- g% ?1 c2 Z5 k
  46. while(temp&0x01&&!(temp&(1<<16)));//等待时间到达  & w" X% \/ u) S9 H* K5 a- o* S' \% B/ G$ u
  47. SysTick->CTRL=0x00;       //关闭计数器
    " K! ~1 P$ o$ y( y
  48. SysTick->VAL =0X00;       //清空计数器       3 E- h/ c/ X) y! |) N' L
  49. }  
    ( [8 S+ f# p6 c! T9 N) o
  50. 8 v/ h( d3 v7 \
  51. /***********************************************************
    3 n) t( X4 Z6 [5 O/ @
  52. 名字:delay_us& @! f) d5 a: K* z
  53. 功能:应用程序us级别的延时实现
    6 ~5 N0 f9 h) W8 L1 j. l& D
  54. 参数:u32 Nus  ^4 L; _. M. m% c
  55. 返回:None
    5 U, x1 D0 R4 [9 {- A# T6 h
  56. ************************************************************/         2 y. Y. h0 @7 K+ U% R. W
  57. void delay_us(u32 Nus)! C$ w% G. @% ?" C- m
  58. {  
    + _  l# W" f6 ~: A2 Y
  59. u32 temp;      
    ) k; r) o9 J1 z6 F
  60. SysTick->LOAD=Nus*fac_us; //时间加载     
    3 N1 W3 c! [2 y, L! Z! t( T
  61. SysTick->VAL=0x00;        //清空计数器
    ! z. Q0 d' Y  u" C
  62. SysTick->CTRL=0x01 ;      //开始倒数  " a" ?0 b# Z+ Y
  63. do
    ) V7 l# R. }. W9 `) M( {
  64. {
    . O  q; ?8 u7 T0 c4 |( x1 m  y; N
  65.   temp=SysTick->CTRL;
    : R7 ]( M) [# y9 h9 ?6 S
  66. }& `- ]1 h  x4 {3 \: u
  67. while(temp&0x01&&!(temp&(1<<16)));//等待时间到达  2 u8 e1 w) u1 A) N6 c, m$ _. b
  68. SysTick->CTRL=0x00;       //关闭计数器
    8 g& G7 A; d; x0 Z6 L: D
  69. SysTick->VAL =0X00;       //清空计数器    " g3 [, b1 L( R9 P
  70. }
复制代码

* @! b! E) \( v# Y  d8 a% t
调用该延时函数的例程 test.c
  1. #include <stm32f10x.h>% A' r) g# \, X* K
  2. #include "Hardware/led.h"3 X: J5 J& j6 |0 X$ }5 q% F
  3. #include "Delay.h"
    : b: V, W! H7 l) ^, p! u6 n+ v

  4. % Q  R+ I4 r, a9 k+ ~
  5. /*LED 灯闪灭函数*/' K, W; Q" r2 }6 o# E
  6. void loop(void)
    / \' B' K  d( i# a: r
  7. {  T, m" u- W# I8 O
  8.     while(1){   
    & B8 J' n. I  v
  9.         GPIO_ResetBits(GPIOD, GPIO_Pin_2);
    1 w6 ~4 I. w! S
  10.         delay_ms(1000); //ms级别延时函数的调用/ ~- m8 n/ c) }5 Q8 ]
  11.         GPIO_SetBits(GPIOD, GPIO_Pin_2);
    1 i3 K# U$ _# t# @, f2 Z
  12.         delay_ms(1000);2 f' _$ a  k% s: C' A# K8 I
  13.         }! p) r: Q- u/ J# y
  14. }
    . t6 y, H2 ^0 a/ `  }; t

  15. , Z% @! ?, V, B- `6 u% Q- I1 W
  16. int main()- j3 c5 c0 j3 B; g" @
  17. {
    % e# n8 W. R0 E
  18.     SystemInit();$ e% L9 y8 X8 Q. F
  19.     delay_init(72);//延时函数初始化,并传参数' F7 t" }" I, g8 h8 |+ _" r( K
  20.     led_init();//led初始化4 w' U$ F' L% [' H6 K4 ~% v; ^
  21.     loop();//调用led闪灭函数) }: X, f( f1 V: l6 w: n
  22. }
复制代码
5 [# I+ C, n/ P' ?' F% a( J, d- w

2 l( g/ ~3 K* v/ Y
* l. x: D1 f1 B
收藏 评论0 发布时间:2022-2-3 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版