本帖最后由 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工程。按理说这是个简单的试验,但是还硬是折腾了我半天,程序如下: - /* USER CODE BEGIN 0 */
+ R c; R8 @) y- g+ ~: Z - //// uint32_t testDly=0;
1 P) k; f2 X8 V
( R7 h9 R) L$ [' A# Q) r; L9 c- /* USER CODE END 0 */
* U4 {9 D) h* F( o- E
- M$ H& c. ^3 e# S7 S$ W- int main(void)' V+ ~& t: W4 c! k) y
- {) X1 R+ }; i0 i7 V
R7 S1 z$ _; U- /* USER CODE BEGIN 1 */
* ?" l& }2 b- E - uint32_t testDly=0; v4 {' M; u, |) W" i$ D
, ]# r" Q; B7 Z) c/ `- /* USER CODE END 1 */
% S- T7 _2 c/ a) r. d9 a& g& y9 f
' Q* n. A$ ~& S+ S% Y0 m- /* MCU Configuration----------------------------------------------------------*/
% `, Q$ a/ r$ _. W
, b# @8 V$ w7 o- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
& f+ o7 O6 c3 G) n - HAL_Init();
9 @( j; I$ F5 Z# P8 L
7 _+ {; U2 M+ f T- /* Configure the system clock */ w& D1 ~( s. B! N& Z( \
- SystemClock_Config();: [( o6 ?2 R+ K& ?/ R
0 O3 x7 b( {7 [- /* Initialize all configured peripherals */
# K! M: b) p- F0 a- r6 w, t - MX_GPIO_Init();
n4 R! n; @1 D/ z( A - MX_SPI1_Init();' o0 I8 R- \- H' }% P
- MX_USART1_UART_Init();; h7 t+ c6 q: l
- MX_USART2_UART_Init();
; g6 j2 q# X3 L, g; N$ p - # M, D$ V: J3 J% D
- /* USER CODE BEGIN 2 */) \7 {2 q2 M8 T. z9 l4 {3 s
% m8 c/ T* A+ l, x; _- /* USER CODE END 2 */ g/ r q% {8 m \
, w6 T( o' C9 ]; ?6 o- /* Infinite loop */4 h3 W4 T+ f7 k! s7 a) q
- /* USER CODE BEGIN WHILE */
& q5 [, A+ C% o9 ~! L - while (1)
) S4 O3 Z/ ]' f5 P - {) X' g$ d+ i9 U3 W! L
- HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);- h' g# y2 f% Q4 H! P1 J, B1 l( E
- for (testDly=0; testDly<300000; testDly++);! N# W% h1 K/ F6 @( l# k
-
# t3 ~" Z1 G( k - /* USER CODE END WHILE */: O5 q( F( Q& R/ Y' t+ i
0 b2 z" }# y7 @3 L1 D6 c. I- /* USER CODE BEGIN 3 */
) L+ F e6 P& e. G- e
1 Y$ m$ p1 r$ E( ]; v6 @. y4 x- }
9 F9 N( J" H4 S8 S0 t5 Z - /* USER CODE END 3 */
: e: @. q" m) u3 v1 v/ ^5 Y
; O& t& m& H \- }
复制代码
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
: m1 k& q% h$ s/ P* q
全局变量汇编程序:
$ ]3 C7 \9 w; p' s$ T8 P% B6 G5 p8 P
$ 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 |