MSP-EXP432E401Y Development kit 开发板FreeRTO环境下串口回调模式下UART_Callback如何使用
时间: 2024-03-01 11:53:40 浏览: 25
MSP-EXP432E401Y Development kit 是德州仪器(TI)推出的一款基于 ARM Cortex-M4F 内核的微控制器开发板,而 FreeRTOS 是一款流行的嵌入式系统实时操作系统(RTOS)。
在 FreeRTOS 环境下,串口回调模式下使用 UART_Callback 需要先进行以下几个步骤:
1. 在 FreeRTOS 中创建一个任务(Task),该任务将被用来接收串口数据并进行处理。
2. 在任务中调用 UART_Callback 函数,该函数将会在串口接收到数据时被调用。
3. 在 UART_Callback 函数中进行数据处理,并将处理结果返回给主程序。
下面是一个示例代码:
```c
#include "FreeRTOS.h"
#include "task.h"
#include "driverlib.h"
#define UART_BUFFER_SIZE 256
TaskHandle_t xSerialTaskHandle = NULL;
uint8_t ucSerialBuffer[UART_BUFFER_SIZE];
uint32_t ulSerialIndex = 0;
void vSerialTask(void *pvParameters)
{
while (1)
{
// 等待串口数据
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
// 处理串口数据
if (ulSerialIndex > 0)
{
// ...
}
// 清空缓存
ulSerialIndex = 0;
memset(ucSerialBuffer, 0, UART_BUFFER_SIZE);
}
}
void UART_Callback(uint32_t ulStatus)
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
// 读取数据
while (UARTCharsAvail(EUSCI_A0_BASE))
{
ucSerialBuffer[ulSerialIndex++] = UARTCharGetNonBlocking(EUSCI_A0_BASE);
// 数据已满,通知任务处理
if (ulSerialIndex >= UART_BUFFER_SIZE)
{
xTaskNotifyFromISR(xSerialTaskHandle, 0, eNoAction, &xHigherPriorityTaskWoken);
break;
}
}
// 通知任务处理
if (ulStatus & EUSCI_A_UART_OE_INTERRUPT_FLAG)
{
xTaskNotifyFromISR(xSerialTaskHandle, 0, eNoAction, &xHigherPriorityTaskWoken);
}
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
void main(void)
{
// 初始化串口
MAP_UART_initModule(EUSCI_A0_BASE, &(const eUSCI_UART_Config) {
.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK,
.clockPrescalar = 6,
.firstModReg = 0,
.secondModReg = 0x20,
.parity = EUSCI_A_UART_NO_PARITY,
.msborLsbFirst = EUSCI_A_UART_LSB_FIRST,
.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT,
.uartMode = EUSCI_A_UART_MODE,
.overSampling = EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION
});
// 开启串口中断
MAP_UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT | EUSCI_A_UART_OE_INTERRUPT);
MAP_UART_enableModule(EUSCI_A0_BASE);
// 创建任务
xTaskCreate(vSerialTask, "SerialTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, &xSerialTaskHandle);
// 启动调度器
vTaskStartScheduler();
}
```
在上面的示例中,vSerialTask 函数是任务处理函数,UART_Callback 函数是串口回调函数。当串口接收到数据时,UART_Callback 函数会被调用,将接收到的数据存储到缓存中,并通过 xTaskNotifyFromISR 函数通知任务处理函数处理数据。任务处理函数会在接收到通知时,从缓存中读取数据并进行处理。
需要注意的是,在使用 FreeRTOS 时需要注意任务优先级的设置,以确保任务能够按照预期的方式运行。