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

基于NUCLEO-053R8的延时现象

[复制链接]
power568 发布时间:2017-6-5 16:40
本帖最后由 power568 于 2017-6-5 16:43 编辑
- d9 f* r: D: m3 P
! J9 o* ~) q. h% D' e6 B     今天使用STM32CubeMx软甲生产基于NUCLEO-053R8、IAR760开发板的循环延时点亮LED工程。按理说这是个简单的试验,但是还硬是折腾了我半天,程序如下:   
  1. /* USER CODE BEGIN 0 */; _1 b' n+ b! i8 S2 b( I7 J
  2. ////        uint32_t                testDly=0;
    ' G; z$ u- l. p: x) ]

  3. 9 R; j' I4 v! u' J
  4. /* USER CODE END 0 *// l/ ^! c/ H( f' i

  5.   t. p% P8 [- ]8 E: y" p
  6. int main(void)+ C) z8 D2 U0 m' b% _! a
  7. {
    3 E# t2 K  S2 `1 ^: ^) [4 }
  8. / J4 x* K' g. c- {6 \! |
  9.   /* USER CODE BEGIN 1 */- L, j* i# y" L" q" S
  10.         uint32_t                testDly=0;
    ; `5 f) W) Q# I' l% x: R

  11. 9 ^" F2 Q+ E/ r0 D/ t
  12.   /* USER CODE END 1 */
    , W6 h6 l( q4 V) N0 N+ g1 i

  13. 7 r/ a7 X* T! E% M3 v
  14.   /* MCU Configuration----------------------------------------------------------*/, C7 B% N5 V0 Y5 u$ E
  15. 6 p# U0 W7 c4 q- D3 H
  16.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    0 l  _1 V# _4 K! l2 x; ^; k8 W
  17.   HAL_Init();& y( i9 c$ i4 f& A$ _. I' o- T
  18. ; D3 y' c3 H6 ^) x6 G3 B* P
  19.   /* Configure the system clock */8 B8 a( A  ]) D" X5 p
  20.   SystemClock_Config();
    - |% u& y/ ^1 O* c! ~! x
  21. $ Z$ e7 o2 n% w: M+ ?, S) h
  22.   /* Initialize all configured peripherals */
    - Y* m9 ?4 r( V- `2 \. M* Z
  23.   MX_GPIO_Init();$ s2 l9 Z: e1 [5 g2 _
  24.   MX_SPI1_Init();' B1 w2 G/ ?; }8 E6 E* m3 z0 D# @
  25.   MX_USART1_UART_Init();5 Q' p6 Z4 R; Y) I# E' h/ i1 ~, u
  26.   MX_USART2_UART_Init();
    " g: {2 A! G  c. S& X) ~6 [# K

  27. : C1 ?4 b. M' ~6 a' \, y5 t  z% `
  28.   /* USER CODE BEGIN 2 */
    3 b7 M9 Q# o. z$ M8 v
  29. " L; i$ G1 Y' q
  30.   /* USER CODE END 2 */# k% l/ {+ ]0 n" I; e1 J" s  A

  31. 6 v& P' T: i- x, V
  32.   /* Infinite loop */) u$ C, u# J) y( Y  E+ P
  33.   /* USER CODE BEGIN WHILE */- T5 C1 Q. }$ d0 {8 c$ p
  34.   while (1)% D8 k6 l( \3 }. j9 G
  35.   {6 k. i3 Q4 z2 u4 r) W
  36.                 HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);1 @4 _+ u: w$ M; D
  37.                 for (testDly=0; testDly<300000; testDly++);
    7 _! h" v  u9 n/ P
  38.                
    ( o7 ^3 F+ [0 M- I8 b. ^
  39.   /* USER CODE END WHILE */6 \3 b( k5 [$ M1 {3 C

  40. & Y7 k# ~* Q/ i% I8 i0 i
  41.   /* USER CODE BEGIN 3 */
    % J3 r& G, A0 O* }5 W
  42. % W. h. r3 z  F: t" ^+ q
  43.   }
    ; f0 I: K: k" U; p, v' J
  44.   /* USER CODE END 3 */0 @, H9 k2 t! X8 P4 b; I
  45. # _9 ~# w; R$ K" [3 w& E
  46. }
复制代码
1 \- m6 i% K( B5 s- w: N
+ j- i' t+ J6 G( ], ~) j1 o' m
     现象1:
! G* L: G  \4 |+ k     程序仿真单步调试时,LD2可以翻转,但是一旦全速运行,看不见翻转的现象,示波器测试后发现控制波形周期为ns级别,感觉不可能啊,这个for循环的延时应该是ms。
0 W+ X3 p3 ^% _0 [) G    开始以为是CubeMx软件配置GPIO上拉以及SPI或USART配置的影响,可以去掉以后,仍让不行,此时已经开始怀疑人生了...
% V5 _/ _. u/ ]    单步调试发现,for循环的变量值根本不变,将循环变量切换到全局变量后效果一样。突然想到可能是IAR配置优先等级过高的问题,打开看看,果然配置到了High,更改到Low之后,终于可以看见灯闪烁了,该死的优先级优化被默认配置为High了,犯了个低级错误,欲哭无泪...
) P4 S" k) ]4 a8 s" L0 |2 @( K     现象2:
+ N1 t; r- X& d" R    后来把延时循环变量改变为局部变量,发现闪烁的频率变高了,周期比全局变量是的要长,对比了一下汇编程序,果然不一样:
' r* J& e: S6 J! h0 S0 e$ v    局部变量汇编程序:
8 E' f7 Z; ?- w    局部变量.png 6 t" t# D9 ?0 W5 F) o& L: d
    全局变量汇编程序:
% [3 h7 X7 j# G2 U    全局变量.png * S0 V8 c4 R) x+ J
2 |5 n# _' o3 T1 ]
    总结:# d0 ?+ l# W" i2 i  b" b6 z
    1. 要时刻小心谨慎,避免细节引起的大麻烦;9 Q  H8 Q8 ]$ P  }$ B$ p0 @
    2. 使用for循环延时时,同样的程序下,局部变量和全局变量延时时间是不一样的。
7 P* \& N" ~" u) }) b5 }. b! q. x7 w4 r  ~+ a: P* v
8 W2 r, _/ N2 M( t
赞 收藏 评论2 发布时间:2017-6-5 16:40

举报

2个回答
左岸右岸 回答时间:2017-6-5 17:09:11
为什么要用for循环做延时?
power568 回答时间:2017-6-6 09:31:22
只是做个简单的测试,然后顺带发现的问题...
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版