本帖最后由 power568 于 2017-6-5 16:43 编辑 x5 ]5 ^2 q1 @
! N$ f3 @7 X$ S
今天使用STM32CubeMx软甲生产基于NUCLEO-053R8、IAR760开发板的循环延时点亮LED工程。按理说这是个简单的试验,但是还硬是折腾了我半天,程序如下: - /* USER CODE BEGIN 0 */
3 c9 C8 s2 [1 ]( p( B/ }. e - //// uint32_t testDly=0;/ l8 D# {: `# d: w* L3 q
- ' D/ D& ?% y" P; v0 t9 B7 e
- /* USER CODE END 0 */ |% r/ |- ^) M" M* \& s
% }3 {8 J; r2 q0 E4 u, \3 k; I+ u- int main(void)6 Q* Y6 f! D) e- L, @- U3 D
- {
$ \9 W x y) k7 R- u) y2 Z - , E+ q7 ]9 C: [
- /* USER CODE BEGIN 1 */8 U8 U e7 a' z( {" Y/ c( I& S6 B
- uint32_t testDly=0;
! e9 @9 I4 l1 ?0 x - + h0 ?" d# B- ^' Y1 M
- /* USER CODE END 1 */2 ~- M; k3 { r' x, r
I0 s5 r' L* K* T3 d6 i ~- /* MCU Configuration----------------------------------------------------------*/! w* k6 D: |9 Y% W5 }, n
! `+ e+ T O+ i2 e2 W- {; r/ l# {- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
2 H e; _ D, ?) Z1 I - HAL_Init();; l, W$ h' L: W3 h/ }9 l1 t% _
. H! Y$ K: Q. q- /* Configure the system clock */4 m u, H8 K0 v' G3 t
- SystemClock_Config();
9 l$ [! ~6 n. b' e/ A' e, z! \4 |- } - & j0 F1 ~ t9 O
- /* Initialize all configured peripherals */. z0 J5 j6 N. p+ m# a
- MX_GPIO_Init();
- R/ E+ k7 \) b5 [0 ?, p9 x5 x1 G; ~' @ - MX_SPI1_Init();
8 H( t% a. ~$ o' |" `' p - MX_USART1_UART_Init();
! Q- C/ o% F O% w - MX_USART2_UART_Init();, x% @2 `2 q% l' R5 h8 E
0 S) v9 y$ n* }* E+ d: s6 D- /* USER CODE BEGIN 2 */1 s# s1 l8 s5 x t
( ~0 E% E! c4 U3 B# V, M" f8 Z- /* USER CODE END 2 */3 C/ d: N# i1 _3 Z- e2 T
- ( z6 F. N' i$ D8 t, g8 g; {/ c
- /* Infinite loop */
# T6 O4 f/ v0 Y - /* USER CODE BEGIN WHILE */' l: Q( B; \1 X" T2 B3 F. G
- while (1)
: @* E0 a' y9 X4 Q* `$ Q, Q - {; m8 R s2 h' ?6 \+ g) E( P9 R
- HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);) s/ K' S' g# Z& n$ {; T
- for (testDly=0; testDly<300000; testDly++);
# r* o1 o5 V0 ^% l1 l! J5 Q, s - " N( |& E7 u' @6 L. w
- /* USER CODE END WHILE */
3 ~0 Z* E9 J4 J/ X - " A% i% G7 _/ Q& ]4 U( M# i
- /* USER CODE BEGIN 3 */# q9 n6 J. f! j/ R
- ; T+ ?* k" T ~; e5 D4 z
- }3 |! F9 w) a7 o0 P/ x
- /* USER CODE END 3 */& a# k! u2 n# u* s
( a; H4 y% I) Q1 Q& I- }
复制代码
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
: X/ }+ F) d$ k% c; k7 V P 全局变量汇编程序:7 j: @2 {1 B3 L4 z- Q
* 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 |