工具/软件:TI-RTOS
大家好、
我一直在尝试使用 TI-RTOS 驱动程序在 CC2650上使用 UART。 我从"uartecho_CC2650_LAUNCHXL_TI"示例开始。 这个寄存器使用阻塞式写入和读取操作。
因此、我尝试添加到"简单外设示例"中、因为我想在那里使用它。 之后、我将尝试编辑 uartecho 示例、看看它是否与其他内容相关。
我需要具有非阻塞式读操作、以便能够足够快地捕捉到 ISR 中。
为此、我将读取和写入模式更改为回调并注册回调。 还打开了"UARTCC26XX_RETURE_PARTI_ENABLE"。
为了管理所有内容、在搜索一个位后、我添加了信标。
问题是、在执行单个 UART_Read 后、UART_WRITE 从未工作过、只需成功调用 UART_Read 即可测试、 甚至使用信标来确保写入发生在读取结束后(请注意、根据我的理解、这不是必需的)。
在另一个测试中、我删除了读取部分、我只是尝试连续发送数据。 已尝试使用字符串"hi\r\n"。 回调会解锁主任务的信号量、该主任务将再次执行 UART_WRITE。 这种情况在6千左右的成功之后出现了冻结。 已尝试添加"Task_sleep (1000)"、这可能是由于"发送速度太快"。 同样的问题、但这次只能发送大约400次-更改 Task_sleep 上的值使它看起来像是一个定时事件、UART_WRITE 在第一次调用后中断 x 秒。 甚至在回调中添加了错误检查、也看不到任何东西。
因此、我有2个问题。 当使用 UART_READ 时、UART_WRITE 不起作用。 UART_WRITE 会在一段时间后中断。
我正在使用:
- 适用于 CC13xx 和 CC26xx 2.21.1.08的 TI-RTOS
- BLE_SDK_2_02_02_25
- 编译器 TI v18.1.0.LTS -尝试安装 v16.9.4.LTS、但它出错、CCS 找不到解决方法。
- CCS 版本:8.1.0.00011
/* XDCtools 头文件*/ #include #include /* BIOS 头文件*/ #include #include #include //#include #include #include //#include #include #include "iCall.h" #define TASKSTACKSIZE 2048 任务结构任务0Struct; 特性任务0Stack[TASKSTACKSIZE]; Semaphore_StructSemStruct; Semaphore_Handle readSem; Semaphore_StructSem; semaphore_StructWrite; Semaphore_handle writeSem; UART_Handle UART; #define UART_buffer_size 128 uint8_t UART_buffer[UART_buffer_size]; #define UART_circe_buffer_size 256 uint8_t UART_receivarBuffer[UART_rend_size]; uint32_t UART_head = 0;uint8_t uint0_t uint0_t Utend = uint8;uint32_t uint0_t uinteuint0_unt uintt_ void UART_readCB (UART_Handle _handle、void *buf、size_t count) { //(((UARTCC26XX_Handle) handle -> object)-> status //if (((UARTCC26XX_handle) handle -> object)-> status uint32_t size =((UARTCC26XX_handle)_handle->object)->ReadCount; uint32_t 可用= 0; //if (UART_HEAD >= UART_TAIL) 可用= UART_圆形 缓冲区大小- 1 - UART_HEAD + UART_TAIL; //else //可用= uart_circed_buffer_size - uart_head + uart_tail; int i = 0; 对于(i = 0;i < size && i < available;i++){ UART_循环 缓冲器[UART_HEAD]= UART_buffer[i]; UART_HEAD++; if (uart_head >= uart_circed_buffer_size) UART_HEAD = 0; } Semaphore_post (readSem); 接收计数器++; /*我知道这是不建议的。 我看到它是在 SDI 中完成的、没有使用 SDI、因为它在某个地方冻结了缓冲器、我不需要任何复杂的东西* UART_READ (UART、&UART_buffer[0]、UART_buffer_size); } uint32_t sentCounter = 0; void UART_writeCB (UART_Handle _handle、void * buf、size_t count) { ICall_CSState 密钥; 键= iCall_enterCriticalSection(); uint8_t errStatus = 0; if (errStatus =((UARTCC26XX_Handle)_handle -> object)-> status) {//UART_RXERROR_溢出 while (1); } Semaphore_post (writeSem); sentCounter++; iCall_leaveCriticalSection (key); } //* ===== 回声 Fxn ===== *此函数的任务是静态创建的。 请参阅工程的.cfg 文件。 */ void echoFxn (UArg0、UArgarg1) { 字符输入; UART_Params uartParams; const char echoPrompt[]="回显字符:\r\n"; Semaphore_Params semParams; /*构造要用作资源锁定的信标对象,初始计数1 */ Semaphore_Params_init (semParams); semParams.instance->name ="读取信标"; Semaphore_construction (&semStruct, 0, semParams); /*获取实例句柄*/ readSem = semaphore_handle (&semStructt); Semaphore_Params_init (semParams); semParams.instance->name ="写入信标"; Semaphore_construct(&semStructWrite, 0,&semParams); /*获取实例句柄*/ writeSem = semaphore_handle (&semStructWrite); /*创建一个数据处理关闭的 UART。 * UART_PARAMS_INIT (uartParams); uartParams.writeDataMode = UART_DATA_BINARY; uartParams.readDataMode = UART_DATA_BINARY; uartParams.readReturnMode = UART_return_full; uartParams.readEcho = UART_ECHO_OFF; uartParams.baudrate = 921600; uartParams.readMode = UART_MODE_CALLACK; uartParams.writeMode = UART_MODE_CALLBACK; uartParams.readCallback = UART_readCB; uartParams.writeCallback = UART_writeCB; UART = UART_OPEN (Board_UART0、uartParams); if (UART == NULL){ System_abort ("打开 UART 时出错"); } UART_CONTROL (UART、UARTCC26XX_RETURE_PARTIAL_ENABLE、空); UART_WRITE (UART、echoPrompt、sizeof (echoPrompt)); Semaphore_pend (writeSem、BIOS_wait_forever); //读取注释后仅发送测试的代码*/ //UART 读取(UART、&UART_buffer[0]、UART_buffer_size); while (1){ //读取注释后仅发送测试的代码*/ //semaphore_pend (readSem、BIOS_wait_forever); //uint32_t tail = UART_tail; //uint32_t head = UART_HEAD; //uint32_t toSend = 0; //if (头部>=尾部) // toSend =头-尾; //else // toSend = head + UART_Circular 缓冲区大小- tail; char test[]="hi\r\n"; volatile int error = UART_WRITE (UART、test、sizeof (test))); if (error ==UART_ERROR){ volatile int32_t temp = 0; temp =((UARTCC26XX_handle) UART->object)->status; while (1); } Semaphore_pend (writeSem、BIOS_wait_forever); Task_sleep (1000); //读取注释后仅发送测试的代码*/ //tail += toSend; //_UART_tail = tail -(tail / UART_circed_buffer_size)* UART_circed_buffer_size; } } void UART_CreateTask(){ //Board_initGeneral();这是 main 已经调用的 PIN_Init Board_initUART(); Task_Params taskParams; /*构造 BIOS 对象*/ Task_Params_init (&taskParams); taskParams.STACKSIZE = TASKSTACKSIZE; taskParams.priority = 2; taskParams.stack =_task0Stack; Task_construct(&task0Struct,(Task_Functr) echoFxn、&taskParams、NULL); }