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

基于NUCLEO-053R8的延时现象

[复制链接]
power568 发布时间:2017-6-5 16:40
本帖最后由 power568 于 2017-6-5 16:43 编辑   x5 ]5 ^2 q1 @
! N$ f3 @7 X$ S
     今天使用STM32CubeMx软甲生产基于NUCLEO-053R8、IAR760开发板的循环延时点亮LED工程。按理说这是个简单的试验,但是还硬是折腾了我半天,程序如下:   
  1. /* USER CODE BEGIN 0 */
    3 c9 C8 s2 [1 ]( p( B/ }. e
  2. ////        uint32_t                testDly=0;/ l8 D# {: `# d: w* L3 q
  3. ' D/ D& ?% y" P; v0 t9 B7 e
  4. /* USER CODE END 0 */  |% r/ |- ^) M" M* \& s

  5. % }3 {8 J; r2 q0 E4 u, \3 k; I+ u
  6. int main(void)6 Q* Y6 f! D) e- L, @- U3 D
  7. {
    $ \9 W  x  y) k7 R- u) y2 Z
  8. , E+ q7 ]9 C: [
  9.   /* USER CODE BEGIN 1 */8 U8 U  e7 a' z( {" Y/ c( I& S6 B
  10.         uint32_t                testDly=0;
    ! e9 @9 I4 l1 ?0 x
  11. + h0 ?" d# B- ^' Y1 M
  12.   /* USER CODE END 1 */2 ~- M; k3 {  r' x, r

  13.   I0 s5 r' L* K* T3 d6 i  ~
  14.   /* MCU Configuration----------------------------------------------------------*/! w* k6 D: |9 Y% W5 }, n

  15. ! `+ e+ T  O+ i2 e2 W- {; r/ l# {
  16.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    2 H  e; _  D, ?) Z1 I
  17.   HAL_Init();; l, W$ h' L: W3 h/ }9 l1 t% _

  18. . H! Y$ K: Q. q
  19.   /* Configure the system clock */4 m  u, H8 K0 v' G3 t
  20.   SystemClock_Config();
    9 l$ [! ~6 n. b' e/ A' e, z! \4 |- }
  21. & j0 F1 ~  t9 O
  22.   /* Initialize all configured peripherals */. z0 J5 j6 N. p+ m# a
  23.   MX_GPIO_Init();
    - R/ E+ k7 \) b5 [0 ?, p9 x5 x1 G; ~' @
  24.   MX_SPI1_Init();
    8 H( t% a. ~$ o' |" `' p
  25.   MX_USART1_UART_Init();
    ! Q- C/ o% F  O% w
  26.   MX_USART2_UART_Init();, x% @2 `2 q% l' R5 h8 E

  27. 0 S) v9 y$ n* }* E+ d: s6 D
  28.   /* USER CODE BEGIN 2 */1 s# s1 l8 s5 x  t

  29. ( ~0 E% E! c4 U3 B# V, M" f8 Z
  30.   /* USER CODE END 2 */3 C/ d: N# i1 _3 Z- e2 T
  31. ( z6 F. N' i$ D8 t, g8 g; {/ c
  32.   /* Infinite loop */
    # T6 O4 f/ v0 Y
  33.   /* USER CODE BEGIN WHILE */' l: Q( B; \1 X" T2 B3 F. G
  34.   while (1)
    : @* E0 a' y9 X4 Q* `$ Q, Q
  35.   {; m8 R  s2 h' ?6 \+ g) E( P9 R
  36.                 HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);) s/ K' S' g# Z& n$ {; T
  37.                 for (testDly=0; testDly<300000; testDly++);
    # r* o1 o5 V0 ^% l1 l! J5 Q, s
  38.                 " N( |& E7 u' @6 L. w
  39.   /* USER CODE END WHILE */
    3 ~0 Z* E9 J4 J/ X
  40. " A% i% G7 _/ Q& ]4 U( M# i
  41.   /* USER CODE BEGIN 3 */# q9 n6 J. f! j/ R
  42. ; T+ ?* k" T  ~; e5 D4 z
  43.   }3 |! F9 w) a7 o0 P/ x
  44.   /* USER CODE END 3 */& a# k! u2 n# u* s

  45. ( a; H4 y% I) Q1 Q& I
  46. }
复制代码

1 U) ^. H7 r. e9 S, K
, b) }) L( q, `6 m8 [. i2 Q, ^     现象1:
4 ^' s1 c+ c! m7 {$ l6 [     程序仿真单步调试时,LD2可以翻转,但是一旦全速运行,看不见翻转的现象,示波器测试后发现控制波形周期为ns级别,感觉不可能啊,这个for循环的延时应该是ms。+ n/ Y7 g$ }( s7 a. J0 ?7 _9 n
    开始以为是CubeMx软件配置GPIO上拉以及SPI或USART配置的影响,可以去掉以后,仍让不行,此时已经开始怀疑人生了...
% L, Q7 z+ ]5 K! i    单步调试发现,for循环的变量值根本不变,将循环变量切换到全局变量后效果一样。突然想到可能是IAR配置优先等级过高的问题,打开看看,果然配置到了High,更改到Low之后,终于可以看见灯闪烁了,该死的优先级优化被默认配置为High了,犯了个低级错误,欲哭无泪...6 R8 h, @4 n2 d- ?+ ^4 y8 W
     现象2:8 |6 n2 |3 d  T! v" A; o1 x1 v
    后来把延时循环变量改变为局部变量,发现闪烁的频率变高了,周期比全局变量是的要长,对比了一下汇编程序,果然不一样:
/ @( ^& p3 b& p6 Y0 y# n% \    局部变量汇编程序:
4 S+ ]. G9 G# q7 i9 y( W4 y    局部变量.png
: X/ }+ F) d$ k% c; k7 V  P    全局变量汇编程序:7 j: @2 {1 B3 L4 z- Q
    全局变量.png
* h( O- h0 m7 d$ T* D5 U- H4 o  J( F$ p  F$ f' ]
    总结:
. s7 U' S* I8 ^8 B& u  v    1. 要时刻小心谨慎,避免细节引起的大麻烦;
# u6 m9 `. r& e: o, {% k    2. 使用for循环延时时,同样的程序下,局部变量和全局变量延时时间是不一样的。
: l) c5 n! [: R1 i! A- O, ~
' q# I4 V6 p! m
) Z( o  e7 E0 P0 C9 y
收藏 评论2 发布时间:2017-6-5 16:40

举报

2个回答
左岸右岸 回答时间:2017-6-5 17:09:11
为什么要用for循环做延时?
power568 回答时间:2017-6-6 09:31:22
只是做个简单的测试,然后顺带发现的问题...

所属标签

相似分享

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