STM32 FreeRTOS-UART延迟中断问题

问题描述 投票:0回答:1

我正在尝试使用UART接收中断读取大小未知的数据。在回叫功能中,我启用了Rx中断以便读取字符,直到获得\ n为止。如果得到\ n,则唤醒被延迟中断处理程序的更高优先级的任务。问题是我试图通过回调函数一一读取字节,并试图将每个字符放入缓冲区,但是不幸的是缓冲区无法获得任何字符。此外,无法唤醒延迟的中断处理程序。

我的STM32板是STM32F767ZI,我的IDE是KEIL。

共享代码之前的一些重要说明:1. rxIndex和gpsBuffer声明为全局。2.定期功能可以正常工作。

这是我的代码:

  1. 周期性函数,优先级= 1
void vPeriodicTask(void *pvParameters)
{
    const TickType_t xDelay500ms = pdMS_TO_TICKS(500UL);

    while (1) {
        vTaskDelay(xDelay500ms);

        HAL_UART_Transmit(&huart3,(uint8_t*)"Imu\r\n",sizeof("Imu\r\n"),1000);
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_7);

    }
}
  1. 延迟中断,优先级= 3
void vHandlerTask(void *pvParameters)
{
    const TickType_t xMaxExpectedBlockTime = pdMS_TO_TICKS(1000); 

    while(1) {
        if (xSemaphoreTake(xBinarySemaphore,xMaxExpectedBlockTime) == pdPASS) {
            HAL_UART_Transmit(&huart3,(uint8_t*)"Semaphore Acquired\r\n",sizeof("Semaphore 
                                                                                 Acquired\r\n"),1000);
            // Some important processes will be added here
            rxIndex = 0;
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_14);
        }
    }
}
  1. 回叫功能:
void HAL_UART_RxCptlCallBack(UART_HandleTypeDef *huart)
{
        gpsBuffer[rxIndex++] = rData;
        if (rData == 0x0A) {
            BaseType_t xHigherPriorityTaskWoken;

            xSemaphoreGiveFromISR(xBinarySemaphore,&xHigherPriorityTaskWoken);
            portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
        }
        HAL_UART_Receive_IT(huart,(uint8_t*)&rData,1);
}
  1. 主要功能
    HAL_UART_Receive_IT(&huart3,&rData,1);
    xBinarySemaphore = xSemaphoreCreateBinary();
    if (xBinarySemaphore != NULL) {
        //success
        xTaskCreate(vHandlerTask,"Handler",128,NULL,1,&vHandlerTaskHandler);

        xTaskCreate(vPeriodicTask,"Periodic",128,NULL,3,&vPeriodicTaskHandler);

        vTaskStartScheduler();
    }
stm32 semaphore uart freertos
1个回答
0
投票
  1. 使用HAL是解决麻烦的最佳方法。它使用的HAL_Delay是依赖于systick的,您应该重写此函数以读取RTOS tick。

  2. 我使用队列来传递数据(对数据的引用),但是它应该可以工作。使用HAL函数时,总是会有一个很大的问号。

void HAL_UART_RxCptlCallBack(UART_HandleTypeDef *huart)
{
     BaseType_t xHigherPriorityTaskWoken = pdFALSE;
        gpsBuffer[rxIndex++] = rData;
        if (rData == 0x0A) {

            if(xSemaphoreGiveFromISR(xBinarySemaphore,&xHigherPriorityTaskWoken) == pdFALSE)
            {
                /* some error handling */
            }
        }
     HAL_UART_Receive_IT(huart,(uint8_t*)&rData,1);
     portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}

总结,如果我使用HAL和RTOS,我总是会修改HAL处理超时的方式。

© www.soinside.com 2019 - 2024. All rights reserved.