基于CC2640的UART串口回调(Callback)模式

软件开发平台:IAR

硬件开发平台:CC2640 board

操作系统:TI-RTOS SYS/BIOS

工程基础:SimpleBLEPeripheral

 目的:实现CC2640 UART口在Callback模式下的接收和发送功能

步骤如下:

1. 可新建立一个.c文件,例如:UARTCallback.c,在其中添加如下代码:

char tRxBuf[100]; //接收数据数组,根据实际情况更改大小
char tTxBuf[100]; //发送数据数组,根据实际情况更改大小

static bool uartInitFlag = FALSE;

void Uart_Init(npiCB_t npiCBack) //用于注册初始化回调函数(在后面)
{
    if(!uartInitFlag)
    {
        NPITLUART_initializeTransport(tRxBuf, tTxBuf, npiCBack); //如果想修改UART口配置,进入这个函数内部修改即可
        uartInitFlag = TRUE;
    }
}
void UART_WriteTransport (uint8 *str, uint8 len) //发送数据的函数,此函数会把str地址处数据复制到tTxBuf后发送出去
{
    if(uartInitFlag)
    {
        memcpy(tTxBuf, str, len);
        NPITLUART_writeTransport(len);
    }
}

2. 在UARTCallback.h中声明:

extern void Uart_Init(npiCB_t npiCBack);
extern void UART_WriteTransport (uint8 *str, uint8 len);

3. 在simpleBLEPeripheral中添加回调函数如下代码:

void  UartCallBack(uint16_t rxLen, uint16_t txLen)
{
if(rxLen > 0 )//串口接收到数据了
    {
//在这里编写接收到数据后你要处理的程序代码
    }
}

4. 在static void SimpleBLEPeripheral_init(void)中调用注册初始化函数:

Uart_Init(UartCallBack);// 收到串口数据时将执行 UartCallBack 函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 时需要注意任务优先级的设置,以确保任务能够按照预期的方式运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值