[STM32L0] 基于NUCLEO-053R8的延时现象

[复制链接]
896|1
 楼主| Larm1 发表于 2017-6-5 16:44 | 显示全部楼层 |阅读模式
今天使用STM32CubeMx软甲生产基于NUCLEO-053R8、IAR760开发板的循环延时点亮LED工程。按理说这是个简单的试验,但是还硬是折腾了我半天,程序如下:   
  1. /* USER CODE BEGIN 0 */
  2. ////        uint32_t                testDly=0;

  3. /* USER CODE END 0 */

  4. int main(void)
  5. {

  6.   /* USER CODE BEGIN 1 */
  7.         uint32_t                testDly=0;

  8.   /* USER CODE END 1 */

  9.   /* MCU Configuration----------------------------------------------------------*/

  10.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  11.   HAL_Init();

  12.   /* Configure the system clock */
  13.   SystemClock_Config();

  14.   /* Initialize all configured peripherals */
  15.   MX_GPIO_Init();
  16.   MX_SPI1_Init();
  17.   MX_USART1_UART_Init();
  18.   MX_USART2_UART_Init();

  19.   /* USER CODE BEGIN 2 */

  20.   /* USER CODE END 2 */

  21.   /* Infinite loop */
  22.   /* USER CODE BEGIN WHILE */
  23.   while (1)
  24.   {
  25.                 HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
  26.                 for (testDly=0; testDly<300000; testDly++);
  27.                
  28.   /* USER CODE END WHILE */

  29.   /* USER CODE BEGIN 3 */

  30.   }
  31.   /* USER CODE END 3 */

  32. }


     现象1:
     程序仿真单步调试时,LD2可以翻转,但是一旦全速运行,看不见翻转的现象,示波器测试后发现控制波形周期为ns级别,感觉不可能啊,这个for循环的延时应该是ms。
    开始以为是CubeMx软件配置GPIO上拉以及SPI或USART配置的影响,可以去掉以后,仍让不行,此时已经开始怀疑人生了...
    单步调试发现,for循环的变量值根本不变,将循环变量切换到全局变量后效果一样。突然想到可能是IAR配置优先等级过高的问题,打开看看,果然配置到了High,更改到Low之后,终于可以看见灯闪烁了,该死的优先级优化被默认配置为High了,犯了个低级错误,欲哭无泪...
     现象2:
    后来把延时循环变量改变为局部变量,发现闪烁的频率变高了,周期比全局变量是的要长,对比了一下汇编程序,果然不一样:
    局部变量汇编程序:
    局部变量.png
    全局变量汇编程序:
    全局变量.png
总结:
    1. 要时刻小心谨慎,避免细节引起的**烦;
    2. 使用for循环延时时,同样的程序下,局部变量和全局变量延时时间是不一样的。

yklstudent 发表于 2017-6-5 17:22 | 显示全部楼层
用定时器做延时啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:大爱无疆

53

主题

389

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部