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

基于NUCLEO-053R8的延时现象

[复制链接]
power568 发布时间:2017-6-5 16:40
本帖最后由 power568 于 2017-6-5 16:43 编辑 6 ?8 J+ l1 Z& z- s7 G/ k, s# b) Q! u) L2 l' ^
# f% d0 E6 V0 v( |: c
     今天使用STM32CubeMx软甲生产基于NUCLEO-053R8、IAR760开发板的循环延时点亮LED工程。按理说这是个简单的试验,但是还硬是折腾了我半天,程序如下:   
  1. /* USER CODE BEGIN 0 */
    + R  c; R8 @) y- g+ ~: Z
  2. ////        uint32_t                testDly=0;
    1 P) k; f2 X8 V

  3. ( R7 h9 R) L$ [' A# Q) r; L9 c
  4. /* USER CODE END 0 */
    * U4 {9 D) h* F( o- E

  5. - M$ H& c. ^3 e# S7 S$ W
  6. int main(void)' V+ ~& t: W4 c! k) y
  7. {) X1 R+ }; i0 i7 V

  8.   R7 S1 z$ _; U
  9.   /* USER CODE BEGIN 1 */
    * ?" l& }2 b- E
  10.         uint32_t                testDly=0;  v4 {' M; u, |) W" i$ D

  11. , ]# r" Q; B7 Z) c/ `
  12.   /* USER CODE END 1 */
    % S- T7 _2 c/ a) r. d9 a& g& y9 f

  13. ' Q* n. A$ ~& S+ S% Y0 m
  14.   /* MCU Configuration----------------------------------------------------------*/
    % `, Q$ a/ r$ _. W

  15. , b# @8 V$ w7 o
  16.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    & f+ o7 O6 c3 G) n
  17.   HAL_Init();
    9 @( j; I$ F5 Z# P8 L

  18. 7 _+ {; U2 M+ f  T
  19.   /* Configure the system clock */  w& D1 ~( s. B! N& Z( \
  20.   SystemClock_Config();: [( o6 ?2 R+ K& ?/ R

  21. 0 O3 x7 b( {7 [
  22.   /* Initialize all configured peripherals */
    # K! M: b) p- F0 a- r6 w, t
  23.   MX_GPIO_Init();
      n4 R! n; @1 D/ z( A
  24.   MX_SPI1_Init();' o0 I8 R- \- H' }% P
  25.   MX_USART1_UART_Init();; h7 t+ c6 q: l
  26.   MX_USART2_UART_Init();
    ; g6 j2 q# X3 L, g; N$ p
  27. # M, D$ V: J3 J% D
  28.   /* USER CODE BEGIN 2 */) \7 {2 q2 M8 T. z9 l4 {3 s

  29. % m8 c/ T* A+ l, x; _
  30.   /* USER CODE END 2 */  g/ r  q% {8 m  \

  31. , w6 T( o' C9 ]; ?6 o
  32.   /* Infinite loop */4 h3 W4 T+ f7 k! s7 a) q
  33.   /* USER CODE BEGIN WHILE */
    & q5 [, A+ C% o9 ~! L
  34.   while (1)
    ) S4 O3 Z/ ]' f5 P
  35.   {) X' g$ d+ i9 U3 W! L
  36.                 HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);- h' g# y2 f% Q4 H! P1 J, B1 l( E
  37.                 for (testDly=0; testDly<300000; testDly++);! N# W% h1 K/ F6 @( l# k
  38.                
    # t3 ~" Z1 G( k
  39.   /* USER CODE END WHILE */: O5 q( F( Q& R/ Y' t+ i

  40. 0 b2 z" }# y7 @3 L1 D6 c. I
  41.   /* USER CODE BEGIN 3 */
    ) L+ F  e6 P& e. G- e

  42. 1 Y$ m$ p1 r$ E( ]; v6 @. y4 x
  43.   }
    9 F9 N( J" H4 S8 S0 t5 Z
  44.   /* USER CODE END 3 */
    : e: @. q" m) u3 v1 v/ ^5 Y

  45. ; O& t& m& H  \
  46. }
复制代码

7 H# L( f" G. ?9 I' r7 V
6 I9 _' v( v- I     现象1:
3 T3 q2 ~( j. V" h* V& U# ^     程序仿真单步调试时,LD2可以翻转,但是一旦全速运行,看不见翻转的现象,示波器测试后发现控制波形周期为ns级别,感觉不可能啊,这个for循环的延时应该是ms。( h; H6 D/ o8 `0 R- k1 ^. R; M
    开始以为是CubeMx软件配置GPIO上拉以及SPI或USART配置的影响,可以去掉以后,仍让不行,此时已经开始怀疑人生了...
1 X2 u. k# O* y    单步调试发现,for循环的变量值根本不变,将循环变量切换到全局变量后效果一样。突然想到可能是IAR配置优先等级过高的问题,打开看看,果然配置到了High,更改到Low之后,终于可以看见灯闪烁了,该死的优先级优化被默认配置为High了,犯了个低级错误,欲哭无泪...( N- l0 D( m" S9 L
     现象2:* X8 {' }) F/ K1 }2 ]
    后来把延时循环变量改变为局部变量,发现闪烁的频率变高了,周期比全局变量是的要长,对比了一下汇编程序,果然不一样:
+ s) z! Z0 g; M" ~    局部变量汇编程序:
; r4 N: W: O; h2 m# e# S    局部变量.png : m1 k& q% h$ s/ P* q
    全局变量汇编程序:
$ ]3 C7 \9 w; p' s$ T8 P% B6 G5 p8 P    全局变量.png
$ Z2 i* R* Y$ \, Z( v# z1 v9 b* l% o" Y5 M% v
    总结:
  F. |+ e0 m# I8 t& K7 [    1. 要时刻小心谨慎,避免细节引起的大麻烦;  Z4 U8 L3 ~2 ]+ l) `
    2. 使用for循环延时时,同样的程序下,局部变量和全局变量延时时间是不一样的。1 N9 J/ c1 ^9 A3 V- O2 A
5 N0 I$ l& n- L( F! S) @

6 [. B8 E4 ]5 m; H
收藏 评论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 手机版