STM32 FreeRTOS - UART 延迟中断问题



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

我的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*)"Imurn",sizeof("Imurn"),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 Acquiredrn",sizeof("Semaphore 
           Acquiredrn"),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();
}
  1. 使用 HAL 是解决麻烦的最佳方式。它使用依赖于 sysstick 的HAL_Delay,您应该重写此函数以读取 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 处理超时的方式。

最新更新