【问题标题】:How to used delays when using debugger with STM32?在STM32上使用调试器时如何使用延迟?
【发布时间】:2019-07-23 13:50:09
【问题描述】:

我在 STM32F407 MCU 上使用 ST Link 调试器。我遇到了与数据未在不同的循环缓冲区之间以正确方式加载有关的问题,用于从 USART 中提取字节。我想看看从serial [4000] 数组中提取帧的线程在增加延迟的情况下表现如何。

下面的代码在调试器中运行良好,我可以进入每一行,检查变量的值。

//This callback is automatically called by the HAL when the DMA transfer is completed
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {           

    // read 50 bytes of raw data to the raw_serial buffer   
    HAL_UART_Receive_DMA (huart, raw_serial, 50);

    //osDelay(10);
    //HAL_Delay(10);

    // add raw_serial to the serial[4000]
    AppendSerial(raw_serial,size);  
}

使用这些延迟中的任何一个:

  • osDelay(10);
  • HAL_Delay(10);

导致程序执行陷入倒计时循环之一,并阻止我到达位于等待语句之后的断点。

阅读此post 在我看来,osDelay 在使用 FreeRTOS 时更合适。

我能想到的唯一原因是 ST Link 缺乏兼容性或驱动程序,或者无法在中断触发的回调函数中包含延迟。

感谢您的帮助。

【问题讨论】:

    标签: c debugging delay stm32 freertos


    【解决方案1】:

    与ST-Link无关。

    默认情况下,延迟函数通过监视在定时器中断中递增的变量来工作。如果该定时器中断被阻止,则变量不会增加,并且延迟函数将永远不会完成。有几种方法可以解决这个问题。

    让定时器中断抢占串行中断处理程序

    确保定时器中断的优先级高于串行中断。默认情况下,HAL 在stm32f4xx_hal_conf.h中将定时器中断设置为最低优先级(IMO 相当愚蠢的想法)

    #define  TICK_INT_PRIORITY            0x0FU /*!< tick interrupt priority */
    

    将其更改为较低的值(较高的优先级),并将 UART 中断的优先级设置为较高的值(较低的优先级)。现在,HAL_Delay() 甚至可以在 UART 中断处理程序中工作。

    HAL_Delay() 无中断地工作

    HAL_Delay() 通过重复调用HAL_GetTick() 来工作,直到延迟时间过去。 HAL_GetTick() 应该以 32 位无符号值的形式返回自启动以来经过的时间(以毫秒为单位)。您可以提供自己的 HAL_GetTick() 实现,该实现使用 32 位硬件定时器来确定当前时间。

    有两个 32 位定时器,TIM2TIM5,选择其中一个。将重载值设置为 APB1 时钟频率除以 1000 减 1(默认时钟设置为 83999),开始向上计数。现在HAL_GetTick() 可以简单地返回定时器计数器寄存器。

    uint32_t HAL_GetTick(void) {
        return TIM2->CNT; // or TIM5->CNT
    }
    

    编写自己的延迟函数

    例如,您可以使用 cycle counter 进行短延迟,或使用空的 for 循环来进行大致延迟,启动一次性计时器并等待完成等。

    【讨论】:

      【解决方案2】:

      您不能从中断处理程序中调用延迟函数。请记住,中断处理程序的目的是尽可能快地执行,以便程序可以恢复正常执行,延迟与该概念不兼容。

      【讨论】:

        猜你喜欢
        • 2014-03-16
        • 2019-05-24
        • 2023-03-26
        • 2018-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多