gpt4 book ai didi

c - 在 STM32 上使用调试器时如何使用延迟?

转载 作者:太空宇宙 更新时间:2023-11-04 01:17:18 25 4
gpt4 key购买 nike

我在 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 缺乏兼容性或驱动程序,或者无法在中断触发的回调函数中包含延迟。

感谢您的帮助。

最佳答案

与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 循环有一个近似的延迟,启动一个单次定时器并等待直到完成,等等。

关于c - 在 STM32 上使用调试器时如何使用延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54946157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com