我被HAL_Delay()函数卡住了。当我调用这个函数HAL_Delay()时,控制卡在无限循环中。在寻找问题的时候,我发现了这个
http://www.openstm32.org/forumthread2145#threadId2146
在这个特别的评论中,我引用“链接器文件有问题,请使用附件中的一个。您需要分别映射两个内存库,首先是SRAM1 96K,然后是32K的SRAM2。我认为这应该被报告为CubeMX中的错误,因为它会生成坏的链接文件。”还有两个具有.ld扩展名的文件。
我想要的是如何在我的项目中使用这个文件,或者任何其他更好的方法来处理这个问题。
PS。我使用的是stm32l476发现板、CubeMx5.0.0和Attolic。
编辑
我的项目是有一个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事物
问题每次都会发生,但没有具体的时间,即控制可能停留在5分钟和10分钟或15分钟后。它不会停留在特定的功能上。功能可能不一样。例如,有时它可能会被函数名getIMEI()
卡住,有时它可能会使我get service provider
发布于 2018-12-23 12:57:45
所有延迟和超时HAL函数都依赖于SysTick
处理程序中递增的计数器。如果在另一个中断中使用这些函数,则必须确保SysTick
中断比该中断具有更高的优先级。否则,永远不会调用SysTick
处理程序,您将以无限循环结束,因为计数器永远不会增加。
https://stackoverflow.com/questions/53899882
复制相似问题