我一直在使用HAL_Delay()函数。当我调用这个函数HAL_Delay()时,控制卡在无限循环中。
http://www.openstm32.org/forumthread2145#threadId2146
在这个特别的评论中,我引用了“链接器文件有问题,请使用附件中的一个。您需要分别映射两个内存库,首先是SRAM1 96K,然后是SRAM2 32K。我认为这应该在CubeMX中报告为错误,因为它生成了错误的链接器文件。”还有两个扩展名为.ld的文件。
我正在寻找的是如何在我的项目中使用这个文件,或者其他更好的方法来处理这个问题。
另外,我使用的是stm32l476探索板、Cube Mx 5.0.0和Attolic True Studio。
我的项目是有一个RS485通信,我从那里获取数据,我有两个任务处理该数据,在MAX7219显示器上显示,并使用sim800 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分钟后卡住。它不受特定功能的约束。功能可能不同。i、 有时它可能会被函数名卡住
getIMEI()
或者某个时候它可能会伤害我
get service provider