未经本人同意 请务转载 David QQ:435398366
QCC300X 的PIO[0]和PIO[1]为UART的RX和TX,PIO[8]和PIO[9]为UART的RTS和CTS
注意 QCC300X 的IO电压是1.8V的,最好不要直接接到3.3V 或 5V ,测试UART的时候用3.3V的MCU 通讯没有问题,量产的时候最好不要这样接
PStool -> UART configuration when under VM control -> 08a0
PStool -> UART baud rate in bits per second -> 38400
xIDE -> project -> properties -> transport -> raw
注意检查一下配置 PIO[0] 和 PIO[1] 是否被其他功能占用(这里浪费了几天时间,程序运行就报错,导致串口功能几天没处理好,DEBUG 调试发现是在电池温度检测函数报错,默认PIO 0 用作电池温度检测,如果电池没有温度传感器可以将温控功能禁用)
测试代码
#include "sink_debug.h" #include <print.h> #include <stream.h> #include <sink.h> #include <source.h> #include <string.h> #include <panic.h> #include <message.h> #include <app/uart/uart_if.h> #include <uart.h> #ifdef DEBUG_UART #define UART_DEBUG(x) DEBUG(x) #define UART_DUMP(buf,cnt) do{uint32 idx=0;for(idx=0;idx<cnt;idx++){DEBUG(("%02X",buf[idx]));}DEBUG((" "));}while(0) #else #define UART_DEBUG(x) #define UART_DUMP(buf,cnt) #endif typedef struct{ TaskData task; Sink uart_sink; Source uart_source; } UARTStreamTaskData; UARTStreamTaskData theUARTStreamTask; static void UARTStreamMessageHandler (Task pTask, MessageId pId, Message pMessage); static void uart_data_stream_rx_data(Source src); static void uart_data_stream_tx_data(const uint8 *data, uint16 length); void uart_data_stream_init(void){ /* Assign task message handler */ theUARTStreamTask.task.handler = UARTStreamMessageHandler; /* Configure uart settings */ StreamUartConfigure(VM_UART_RATE_115K2, VM_UART_STOP_ONE, VM_UART_PARITY_NONE); /* Get the sink for the uart */ theUARTStreamTask.uart_sink = StreamUartSink(); PanicNull(theUARTStreamTask.uart_sink); /* Get the source for the uart */ theUARTStreamTask.uart_source = StreamUartSource(); PanicNull(theUARTStreamTask.uart_source); /* Register uart source with task */ MessageSinkTask(StreamSinkFromSource(theUARTStreamTask.uart_source),&theUARTStreamTask.task); /*(void)VmalMessageSinkTask(StreamSinkFromSource(theUARTStreamTask.uart_source),&theUARTStreamTask.task); */ UART_DEBUG(("uart_data_stream_init")); } void UARTStreamMessageHandler (Task pTask, MessageId pId, Message pMessage){ UART_DEBUG(("UARTStreamMessageHandler ")); switch (pId){ case MESSAGE_MORE_DATA: uart_data_stream_rx_data(((MessageMoreData *)pMessage)->source); break; default: break; } } void uart_data_stream_rx_data(Source src){ uint16 length = 0; const uint8 *data = NULL; /* Get the number of bytes in the specified source before the next packet boundary */ if(!(length = SourceBoundary(src))) return; /* Maps the specified source into the address map */ data = SourceMap(src); PanicNull((void*)data); UART_DUMP(data,length); /* Transmit the received data */ uart_data_stream_tx_data(data, length); /* Discards the specified amount of bytes from the front of the specified source */ SourceDrop(src, length); } void uart_data_stream_tx_data(const uint8 *data, uint16 length) { uint16 offset = 0; uint8 *dest = NULL; /* Claim space in the sink, getting the offset to it */ offset = SinkClaim(theUARTStreamTask.uart_sink, length); if(offset == 0xFFFF) Panic(); /* Map the sink into memory space */ dest = SinkMap(theUARTStreamTask.uart_sink); PanicNull(dest); /* Copy data into the claimed space */ memcpy(dest+offset, data, length); /*printf("%c", (*(dest+offset)));*/ /* Flush the data out to the uart */ PanicZero(SinkFlush(theUARTStreamTask.uart_sink, length)); }