【发布时间】:2019-05-22 19:36:46
【问题描述】:
我被 HAL_Delay() 函数困住了。当我调用这个函数 HAL_Delay() 时,控制卡在无限循环中。 在搜索问题时,我发现了这个
http://www.openstm32.org/forumthread2145#threadId2146
在这个特别的评论中,我引用了“链接器文件有问题,请使用附加的那个。您需要分别映射两个内存组,因此首先是 SRAM1 96K,然后是 SRAM2 的 32K。我认为应该报告这作为 CubeMX 中的错误,因为它会生成错误的链接器文件。”并且有两个扩展名为 .ld 的文件。
我正在寻找的是如何在我的项目中使用这些文件或任何其他更好的选择来处理这个问题。
PS。我正在使用 stm32l476 发现板、Cube Mx 5.0.0 和 Attolic True Studio。
编辑
我的项目有一个 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() 中。
IMP THING
问题每次都会发生,但没有特定时间,即控件可能会在 5 分钟和 10 分钟或 15 分钟后卡住。它不会从特定功能中卡住。功能可能不同。即有时它可能会从函数名getIMEI() 卡住,或者有时它可能会卡在我get service provider
【问题讨论】:
-
什么不定式循环?是硬故障还是只是在等待计数器。精确
-
你是从中断处理程序中调用 HAL_Delay 吗?
-
我们如何调试这个问题?没有代码可以显示您实际编写的内容。请发minimal reproducible example,以便我们帮助您调试问题
-
确保systick的优先级高于你使用的定时器中断。
-
@P__J__ 我使用了
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);和HAL_NVIC_SetPriority(TIM3_IRQn, 1, 1);作为计时器,它似乎可以工作。但我们现在不要下结论。让我检查一个小时。我会让你知道结果
标签: c linker infinite-loop stm32 hal