本帖最后由 power568 于 2017-6-5 16:43 编辑
- d9 f* r: D: m3 P
! J9 o* ~) q. h% D' e6 B 今天使用STM32CubeMx软甲生产基于NUCLEO-053R8、IAR760开发板的循环延时点亮LED工程。按理说这是个简单的试验,但是还硬是折腾了我半天,程序如下: - /* USER CODE BEGIN 0 */; _1 b' n+ b! i8 S2 b( I7 J
- //// uint32_t testDly=0;
' G; z$ u- l. p: x) ]
9 R; j' I4 v! u' J- /* USER CODE END 0 *// l/ ^! c/ H( f' i
t. p% P8 [- ]8 E: y" p- int main(void)+ C) z8 D2 U0 m' b% _! a
- {
3 E# t2 K S2 `1 ^: ^) [4 } - / J4 x* K' g. c- {6 \! |
- /* USER CODE BEGIN 1 */- L, j* i# y" L" q" S
- uint32_t testDly=0;
; `5 f) W) Q# I' l% x: R
9 ^" F2 Q+ E/ r0 D/ t- /* USER CODE END 1 */
, W6 h6 l( q4 V) N0 N+ g1 i
7 r/ a7 X* T! E% M3 v- /* MCU Configuration----------------------------------------------------------*/, C7 B% N5 V0 Y5 u$ E
- 6 p# U0 W7 c4 q- D3 H
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
0 l _1 V# _4 K! l2 x; ^; k8 W - HAL_Init();& y( i9 c$ i4 f& A$ _. I' o- T
- ; D3 y' c3 H6 ^) x6 G3 B* P
- /* Configure the system clock */8 B8 a( A ]) D" X5 p
- SystemClock_Config();
- |% u& y/ ^1 O* c! ~! x - $ Z$ e7 o2 n% w: M+ ?, S) h
- /* Initialize all configured peripherals */
- Y* m9 ?4 r( V- `2 \. M* Z - MX_GPIO_Init();$ s2 l9 Z: e1 [5 g2 _
- MX_SPI1_Init();' B1 w2 G/ ?; }8 E6 E* m3 z0 D# @
- MX_USART1_UART_Init();5 Q' p6 Z4 R; Y) I# E' h/ i1 ~, u
- MX_USART2_UART_Init();
" g: {2 A! G c. S& X) ~6 [# K
: C1 ?4 b. M' ~6 a' \, y5 t z% `- /* USER CODE BEGIN 2 */
3 b7 M9 Q# o. z$ M8 v - " L; i$ G1 Y' q
- /* USER CODE END 2 */# k% l/ {+ ]0 n" I; e1 J" s A
6 v& P' T: i- x, V- /* Infinite loop */) u$ C, u# J) y( Y E+ P
- /* USER CODE BEGIN WHILE */- T5 C1 Q. }$ d0 {8 c$ p
- while (1)% D8 k6 l( \3 }. j9 G
- {6 k. i3 Q4 z2 u4 r) W
- HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);1 @4 _+ u: w$ M; D
- for (testDly=0; testDly<300000; testDly++);
7 _! h" v u9 n/ P -
( o7 ^3 F+ [0 M- I8 b. ^ - /* USER CODE END WHILE */6 \3 b( k5 [$ M1 {3 C
& Y7 k# ~* Q/ i% I8 i0 i- /* USER CODE BEGIN 3 */
% J3 r& G, A0 O* }5 W - % W. h. r3 z F: t" ^+ q
- }
; f0 I: K: k" U; p, v' J - /* USER CODE END 3 */0 @, H9 k2 t! X8 P4 b; I
- # _9 ~# w; R$ K" [3 w& E
- }
复制代码 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
6 t" t# D9 ?0 W5 F) o& L: d
全局变量汇编程序:
% [3 h7 X7 j# G2 U
* 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
|