首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HAL_Delay()被困在无限循环中

HAL_Delay()被困在无限循环中
EN

Stack Overflow用户
提问于 2018-12-22 22:51:51
回答 1查看 22.2K关注 0票数 9

我被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任务时才调用此函数。

代码语言:javascript
运行
复制
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上显示数据。

下面的代码是

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-23 12:57:45

所有延迟和超时HAL函数都依赖于SysTick处理程序中递增的计数器。如果在另一个中断中使用这些函数,则必须确保SysTick中断比该中断具有更高的优先级。否则,永远不会调用SysTick处理程序,您将以无限循环结束,因为计数器永远不会增加。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53899882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档