我被 HAL_Delay() 函数困住了。当我调用此函数 HAL_Delay() 时,控制陷入无限循环。
在寻找问题的过程中,我发现了这个
http://www.openstm32.org/forumthread2145#threadId2146 http://www.openstm32.org/forumthread2145#threadId2146
在这个特定的评论中,我引用了“链接器文件有问题,请使用附加的文件。您需要分别映射两个内存组,因此首先是 SRAM1 96K,然后是 32K 的 SRAM2。我认为这应该报告为错误CubeMX,因为它生成错误的链接器文件。”并且有两个扩展名为 .ld 的文件。
我正在寻找的是如何在我的项目中使用这些文件或处理此问题的任何其他更好的选择。
附言。我正在使用 stm32l476 discovery board、Cubemx 5.0.0 和 Atollic True Studio。
EDIT
我的项目有一个 RS485 通信,我从那里获取数据,我有两个任务处理该数据,将其显示在 MAX7219 显示屏上,并使用 sim800 gsm 模块将其发送到互联网。
控件卡住的代码。请注意,此函数仅在执行 GSM 任务时调用。
void vMyDelay(uint16_t ms)
{
HAL_UART_Transmit(&huart2, (uint8_t*)"\r\n", strlen("\r\n"), 1000);
HAL_UART_Transmit(&huart2, (uint8_t*)"In Delay", strlen("In Delay"), 1000);
HAL_UART_Transmit(&huart2, (uint8_t*)"\r\n", strlen("\r\n"), 1000);
for (int i = 0; i < ms; i++ ) HAL_Delay(1);
HAL_UART_Transmit(&huart2, (uint8_t*)"\r\n", strlen("\r\n"), 1000);
HAL_UART_Transmit(&huart2, (uint8_t*)"Out Delay", strlen("Out Delay"), 1000);
HAL_UART_Transmit(&huart2, (uint8_t*)"\r\n", strlen("\r\n"), 1000);
}
这个函数写的是In Delay
在终端上但是Out Delay
不显示。但我还有一个计时器,每 2 秒调用一次以显示 MAX72219 上的数据。
下面的代码是
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_UART_Transmit(&huart2, (uint8_t*)"\r\n", strlen("\r\n"), 1000);
HAL_UART_Transmit(&huart2, (uint8_t*)"HAL_TIM_PeriodElapsedCallback()", strlen("vRS485_CollectInverterData()"), 1000);
HAL_UART_Transmit(&huart2, (uint8_t*)"\r\n", strlen("\r\n"), 1000);
if (htim->Instance == htim3.Instance)
{
vMax7219_ClearDisplay();
switch (uiMax7219Index)
{
case 0: vMax7219_SendNumberToString(ucFreq7219,1); break;
case 1: vMax7219_SendNumberToString(ucInVolt7219,1); break;
case 2: vMax7219_SendNumberToString(ucOutVolt7219,1); break;
case 3: vMax7219_SendNumberToString(ucOutCurr7219,1); break;
case 4: vMax7219_SendNumberToString(ucLoadSpd7219,1); break;
case 5: vMax7219_SendNumberToString(ucOutPwr7219,1); break;
}
uiMax7219Index++;
if (uiMax7219Index > 5) uiMax7219Index = 0;
}
}
控件卡住后,此功能始终会在 2 秒后触发。因此得出的结论是,不知何故,控制被困在了HAL_Delay()
.
小鬼东西
这个问题每次都会发生,但没有特定的时间,即控制可能会在 5 分钟、10 分钟或 15 分钟后卡住。它不会卡在特定的功能上。功能可能会有所不同。即有时它可能会因函数名称而卡住getIMEI()
或者有时它可能是我get service provider