未经本人同意 请务转载 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));
}






