CC2640R2F开发之:UART串口收发&TI-RTOS任务创建(二)

开发一款蓝牙应用,其实不仅仅是蓝牙,其他的程序也是如此,串口在整个项目中都会占据重要的地位,串口能完成人与芯片的交互。所以在开发项目中首先完成串口部分就显得很重要(当然如果只是开发一个流水灯那大可不必)。
CC2640R2F的串口使用还是很方便的,这得益于TI 的生态做的好,TI 将串口、ADC、SPI、I2C等底层硬件驱动做成库,直接供用户使用,减少了很多的繁琐的事,但是CC2640R2F的串口有一个明显的缺点就是不支持串口DMA,着对于高波特率有需求的项目可能会产生较大影响。
在硬件上来说CC2640R2F的引脚是可以任意映射的,你可以根据需要将它们映射到对应的位置。在软件上来说串口的操作都是基于一个handle句柄值来进行读、写、控制等操作的。
串口使用流程大致包扩这几个过程:1、初始化硬件;2、设置参数;3、获得串口handle;4、基于handle进行读、写、控制等操作。如果想要提升串口的性能,那么还需要使用队列或者RingBuf机制,本文基于TI-RTOS系统和RingBuf来演示。
先上图:
串口处理
说明:
1、初始化硬件:CC2640R2F的串口已经在SDK配置好了,如果不更改引脚映射建议保持默认。
2、设置参数:根据自己的需要设置波特率、数据位、停止位、校验位。本文是基于回调的方式处理串口数据,回调函数接收串口数据的好处是可以与TI-RTOS任务系统配合,更好的处理数据流。
3、在设置好参数之后,调用open函数获取一个串口handle,后续的串口操作就是基于这个handle进行。
4、读写操作,这是核心,尤其是当对数据的速率以及连续性有要求的时候,运用RingBuf机制和任务事件来处理就要稳定很多。(PS:尤其是当数据量过大、速率过快的时候,可能会导致协议栈处理不过来而丢包或者死机。原因:协议栈的缓存有一定的大小,当串口过来的数据量过打速率过快时协议栈缓存很快就满了,这个缓存大小大概就是:最大连接数 x (MAX_PDU_SIZE - 4),也就是4 x 251)。
代码部分:
1)、配置串口,主要就是两个回调函数的设置,CC2640R2F的串口有一个很好的功能叫部分返回,它会自动的判断超时,并读取串口数据。
定义串口参数,为什么把 UART_MAX_READ_SIZE 定义为251个字节呢?


#define UART_MAX_READ_SIZE       251

typedef struct
{
    size_t       size;
    uint8_t      buf[UART_MAX_READ_SIZE];
}recv_T;
/*uart */
static   UART_Handle uartHandle = NULL;
recv_T   uartRead;
bool     wtEnable;
/*ringbuff*/
static uint8_t RingBufferData[2000];
RingBuf_Object RinfBuferObj;
uint8_t writebuf[UART_MAX_READ_SIZE];
配置串口
/*init uart*/
static void ecoInitUart(void)
{
    // Initialize UART
    UART_Params uartParams;
    UART_init();

    // Open UART in callback mode for both read and write
    UART_Params_init(&uartParams);
    uartParams.writeDataMode  = UART_DATA_BINARY;
    uartParams.readDataMode   = UART_DATA_BINARY;
    uartParams.readReturnMode = UART_RETURN_FULL;
    uartParams.readMode       = UART_MODE_CALLBACK;
    uartParams.writeMode      = UART_MODE_CALLBACK;
    uartParams.readCallback   = uartReadCallback;
    uartParams.writeCallback  = uartWriteCallback;
    uartParams.readEcho       = UART_ECHO_OFF;
    uartParams.baudRate       = 115200;
    uartParams.stopBits       = UART_STOP_ONE;
    uartParams.parityType     = UART_PAR_NONE;
    uartParams.dataLength     = UART_LEN_8;
    //open Board_UART0 ,get handle
    uartHandle = UART_open(Board_UART0, &uartParams);

    if (uartHandle == NULL)
    {
      // UART_open() failed
      while (1);
    }

    // Enable partial return
    UART_control(uartHandle, UARTCC26XX_CMD_RETURN_PARTIAL_ENABLE, NULL);
    //start receive data from RX
    UART_read(uartHandle, uartRead.buf, sizeof(uartRead.buf));
}
/*set uart receive callback*/
static void uartReadCallback(UART_Handle handle, void *rxBuf, size_t size)
{
    uartRead.size = size;
    Event_post(ecoEventHd,ECO_UART_RECV_EVT);
}
/*set uart write callback*/
static void uartWriteCallback(UART_Handle handle, void *writeBuf, size_t size)
{
    if(wtEnable)
    {
        size_t size = RingBuf_getCount(&RinfBuferObj);
        if(size > 0)
        {
            Event_post(ecoEventHd,ECO_MOVE_DATA_EVT);
        }
        else
        {
            wtEnable = false;
        }
    }
}
/**/
void ecoWriteData(unsigned char *buf,unsigned short size)
{
    UART_write(uartHandle,buf,size);
}

2)、TI-RTOS任务创建。TI-RTOS任务的核心是事件,通过pend、wait、post就能处理一个任务中的不同事件。
首先创建任务参数:

    /*event cfg*/
#define ECO_UART_RECV_EVT        Event_Id_29
#define ECO_UART_WRITE_EVT       Event_Id_28
#define ECO_MOVE_DATA_EVT        Event_Id_27

#define ET_ALL_EVENTS            (ECO_UART_RECV_EVT    |\
                                  ECO_UART_WRITE_EVT   |\
                                  ECO_MOVE_DATA_EVT)

/*task cfg*/
#ifndef ET_TASK_STACK_SIZE
#define ET_TASK_STACK_SIZE       1024    //根据自己的需要更改任务堆栈大小
#endif
#ifndef ET_TASK_PRIORITY
#define ET_TASK_PRIORITY         2      //设置任务等级的时候需要注意不要和别的任务重复
#endif
/*event variables*/
Event_Struct ecoEvent;
static Event_Handle ecoEventHd;

/*task variables*/
uint8_t ecoTaskStack[ET_TASK_STACK_SIZE];
Task_Struct ecoTask;

初始化任务:

static void ecoTaskInit(void)
{
    /*event init*/
    Event_Params ecoEvtParam;
    Event_Params_init(&ecoEvtParam);
    Event_construct(&ecoEvent,&ecoEvtParam);
    ecoEventHd = Event_handle(&ecoEvent);

    ecoInitUart();

    RingBuf_construct(&RinfBuferObj,&RingBufferData[0],sizeof(RingBufferData));

}

创建任务函数:

static void ecoTaskFunc(UArg arg0, UArg arg1)
{
    ecoTaskInit();
    // Application main loop
    for(;;)
    {
        uint32_t events;
        events = Event_pend(ecoEventHd, Event_Id_NONE, ET_ALL_EVENTS,
                            ICALL_TIMEOUT_FOREVER);
        if(events & ECO_UART_RECV_EVT)
        {
            handleRecvEvt();
        }
        if(events & ECO_MOVE_DATA_EVT)
        {
            handleMoveEvt();
        }
    }
}

创建任务:

void ecoTaskCreat(void)
{
    Task_Params taskParams;
    // Configure task
    Task_Params_init(&taskParams);
    taskParams.stack = ecoTaskStack;
    taskParams.stackSize = ET_TASK_STACK_SIZE;
    taskParams.priority = ET_TASK_PRIORITY;

    Task_construct(&ecoTask, ecoTaskFunc, &taskParams, NULL);
}

处理事件:

static void handleRecvEvt(void)
{
    size_t i;
    for( i=0;i<uartRead.size;i++)
    {
        if(RingBuf_put(&RinfBuferObj,uartRead.buf[i]) < 0)
        {
            break;
        }
    }
    if(wtEnable == false)
    {
        wtEnable = true;
        Event_post(ecoEventHd,ECO_MOVE_DATA_EVT);
    }
    UART_read(uartHandle, uartRead.buf, sizeof(uartRead.buf));
}

static void handleMoveEvt(void)
{
    size_t size = RingBuf_getCount(&RinfBuferObj);
    size_t i;
    if(size > 0)
    {
        for(i=0;i<sizeof(writebuf);i++)
        {
            if(RingBuf_get(&RinfBuferObj,writebuf+i) < 0)
            {
                break;
            }
        }
        ecoWriteData(writebuf,i);
    }
}

由于本文并没有涉及到数据流向BLE的部分,所以就仅仅将串口RX接收到的数据通过串口TX再打印出来。
实测40K数据连传效果:
CC2640R2F串口RX接收40K数据并通过TX打印出来

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: CC2640R2F是一款广受欢迎的低功耗无线芯片,具有强大的性能和灵活的应用能力。下面是关于CC2640R2F的入门介绍。 CC2640R2F是德州仪器公司(Texas Instruments)推出的一款专为低功耗无线通信设计的芯片。它采用了ARM Cortex-M3内核,运行频率高达48MHz,内部集成了256KB的闪存和8KB的SRAM,功能强大。 CC2640R2F支持多种无线通信标准,包括蓝牙低功耗(Bluetooth Low Energy,BLE)和蓝牙5.2。它具有优异的射频性能和低功耗特性,可以实现长达几年的电池寿命。此外,CC2640R2F还具有良好的抗干扰能力和可信任的安全性能,可以满足不同应用场景的需求。 对于初学者来说,了解CC2640R2F的入门方法可以从以下几个方面入手: 1. 学习基础知识:首先,了解CC2640R2F的硬件结构和功能特性。可以查阅相关的技术手册和参考资料,深入了解芯片的主要组成部分和功能模块。 2. 硬件开发环境:为了开始使用CC2640R2F,需要准备相应的硬件开发环境。可以购买开发板或者评估板,或者自行设计底板并搭建相应的开发环境。 3. 软件开发环境:CC2640R2F的软件开发可以使用德州仪器公司提供的开发工具,如Code Composer Studio(CCS)或IAR嵌入式工具链。熟悉使用这些开发工具,可以编写并调试CC2640R2F的应用程序。 4. 学习编程:CC2640R2F的编程可以使用C语言或者基于C语言的工具。学习编程语言的基础知识,并深入了解CC2640R2F的编程接口和开发流程,可以帮助快速入门。 5. 示例和实践:德州仪器公司提供了丰富的示例代码和应用案例,可以帮助初学者更好地理解和应用CC2640R2F。通过参考这些示例,可以逐步掌握CC2640R2F的使用方法和开发技巧。 总之,CC2640R2F是一款功能强大的低功耗无线芯片,适用于各种物联网和物联网应用。初学者可以通过学习基础知识、准备开发环境、学习编程和实践等途径,快速入门并使用CC2640R2F进行开发。 ### 回答2: CC2640R2F是一款蓝牙低能耗无线芯片,具备较高的性能和低功耗的特点,适用于物联网和其他无线通信应用领域。以下是CC2640R2F的入门指南。 首先,要开始使用CC2640R2F芯片,您需要准备以下工具和材料:一个CC2640R2F开发板,JTAG调试器,用于编程的软件(如Code Composer Studio)和USB数据线。 第步,将CC2640R2F开发板通过USB数据线连接到电脑上,并打开Code Composer Studio软件。在软件中,您可以选择使用现有的示例代码来帮助您进行快速原型开发,或者根据自己的需求进行定制开发。 第三步,使用JTAG调试器将CC2640R2F芯片与计算机连接。通过调试器,您可以在开发板上进行固件的编程和调试。在Code Composer Studio中,您可以选择下载、调试和单步执行程序。 第四步,开始开发您的应用程序。CC2640R2F支持多种通信协议,如蓝牙低能耗、Zigbee和Thread。您可以选择相应的协议,并利用CC2640R2F的特性进行开发。为了更好地了解CC2640R2F的使用和开发,可以参考官方提供的技术文档和开发板用户手册。 第五步,测试和调试您的应用程序。一旦开发完成,您可以将程序下载到CC2640R2F芯片上,并在开发板上进行测试和调试。可以利用开发板上的各种接口和传感器来验证您的应用程序的功能和性能。 最后,当您满意自己的应用程序并通过测试后,您可以考虑将CC2640R2F芯片集成到您的最终产品中。在进行产品化开发时,您需要考虑一些额外的因素,如电源管理、射频设计、外围电路设计等。 综上所述,CC2640R2F是一款功能强大且易于使用的蓝牙低能耗无线芯片,入门操作包括准备工具和材料、连接和配置开发板、开始开发应用程序、测试和调试,最终将芯片集成到您的产品中。通过深入学习和实践,您将能够灵活利用CC2640R2F芯片开发出适用于物联网和其他无线通信应用的创新解决方案。 ### 回答3: CC2640R2F是德州仪器(TI)公司推出的一款低功耗蓝牙(Bluetooth)无线通信芯片,它适用于物联网、智能家居、健康监测和可穿戴设备等领域。对于初学者来说,要入门CC2640R2F,首先需要了解它的主要特点和基本用法。 CC2640R2F采用了TI的BLE-Stack协议栈,支持标准的蓝牙5.2版本,并具有双模功能,即支持BLE和蓝牙经典模式。这意味着它不仅可以与其他BLE设备进行通信,还可以与传统的蓝牙设备兼容。此外,它具有很低的功耗和较长的电池寿命,非常适合低功耗需求的应用。 要入门CC2640R2F,可以首先了解其硬件和开发工具。CC2640R2F芯片提供了丰富的外设接口包括GPIO、SPI、UART和I2C等,可以与其他外部设备进行通信。TI也提供了相关的开发板和开发工具链,如CC2640R2-LAUNCHXL开发板和Code Composer Studio软件,供开发者进行软硬件开发和调试。 接下来,可以学习CC2640R2F的软件编程。TI提供了BLE-Stack软件包,其中包含一些示例代码和应用程序,帮助初学者快速上手。开发者可以使用C编程语言,基于BLE-Stack进行开发,实现蓝牙通信、数据传输和设备控制等功能。 另外,可以学习CC2640R2F的相关文档和参考资料,包括官方文档、用户指南和应用笔记等。通过阅读这些材料,可以更深入地了解CC2640R2F的功能和用法,并掌握开发和调试技巧。 总之,要入门CC2640R2F,需要了解其硬件特性和开发工具,学习软件编程和相关文档。随着不断的学习和实践,可以逐渐掌握CC2640R2F开发和应用,从而在物联网和蓝牙通信领域取得更好的成果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值