因为使用公司的CC2540模块学习,而模块只引出了P10~P15,所以学习时只能使用在P1口的重映射的UART0,下面只是简单记录如何在官方例程上将UART0重映射端口。
//下面是MyUart.c的代码
#include "MyUart.h" //串口初始化,放在SimpleBLEPeripheral_Init函数里即可 void MyUartInit(uint8 taskID) { MyUartPortInit(); } //串口回调函数 void SbpMyUartCallback(uint8 port, uint8 event) { uint8 myUartBuffer[SBP_UART_RX_BUF_SIZE],dataLen; (void)event; if((dataLen = Hal_UART_RxBufLen(port)) > 0) //把接收到的数据原样发回 { (void)HalUARTRead(port, myUartBuffer, dataLen); HalUARTWrite(port, myUartBuffer, dataLen); } } //端口初始化 void MyUartPortInit(void) { halUARTCfg_t uartConfig; uartConfig.configured = TRUE; // 配置与否 uartConfig.baudRate = SBP_UART_BR; // 波特率 uartConfig.flowControl = SBP_UART_FC; //流控制 uartConfig.flowControlThreshold = SBP_UART_FC_THRESHOLD; uartConfig.rx.maxBufSize = SBP_UART_RX_BUF_SIZE; //接收缓存 uartConfig.tx.maxBufSize = SBP_UART_TX_BUF_SIZE; //发送缓存 uartConfig.idleTimeout = SBP_UART_IDLE_TIMEOUT; //空闲时间 uartConfig.intEnable = SBP_UART_INF_ENABLE; //中断使能 uartConfig.callBackFunc = SbpMyUartCallback; //回调函数 (void)HalUARTOpen(SBP_UART_PORT, &uartConfig); return; }
#ifndef __MYUART_H__ #define __MYUART_H__ //MyUart.h头文件 #include "hal_uart.h" #define SBP_UART_PORT HAL_UART_PORT_0 #define SBP_UART_FC FALSE #define SBP_UART_FC_THRESHOLD 48 #define SBP_UART_RX_BUF_SIZE 128 #define SBP_UART_TX_BUF_SIZE 128 #define SBP_UART_INF_ENABLE TRUE #define SBP_UART_IDLE_TIMEOUT 6 #define SBP_UART_BR HAL_UART_BR_57600 void MyUartInit(uint8); void MyUartPortInit(void); #endif
在simpleBLEPeripheral.c文件里的函数SimpleBLEPeripheral_Init调用MyUartInit函数即可,当然要在simpleBLEPeripheral.c的开头处把MyUart.h包含进去。
接下来要修改_hal_uart_dma.c文件,
把第126~130行改为:
#define HAL_UART_PERCFG_BIT 0x01 // USART0 on P1, Alt-2. #define HAL_UART_PRIPO 0x00 // USART0 priority over UART1. #define HAL_UART_Px_CTS 0x04 // Peripheral I/O Select for CTS flow control. #define HAL_UART_Px_RTS 0x08 // Peripheral I/O Select for RTS must be manual. #define HAL_UART_Px_SEL 0x30 // Peripheral I/O Select for Rx/Tx.
然后把164~175行改为:
#define PxDIR P1DIR #define PxIEN P1IEN #define PxIFG P1IFG #define PxIF P1IF #define DMA_RDYIn P1_2 #define DMA_RDYOut P1_3 #define DMA_RDYIn_BIT BV(2) // Same as the I/O Select for CTS flow control. #define DMA_RDYOut_BIT BV(3) // Same as the I/O Select for manual RTS flow ctrl. // Falling edge ISR on P1 pins. #define PICTL_BIT (3<<1)//BV(0) #define IENx IEN2 #define IEN_BIT BV(4)
其实这里应该可以不改,因为用不到中断,因为这里的设置是在POWER_SAVING定义了时才用到,即功耗管理,因为我只用TX和RX脚不再用额外的引脚产生中断唤醒,所以POWER_SAVING不能使用。
把374行改为:
PERCFG |= HAL_UART_PERCFG_BIT;
如果有使用到POWER_SAVING,应该还要把1005行改为
HAL_ISR_FUNCTION(port1Isr, P1INT_VECTOR)
最后进行工程设置
加入HAL_UART=TRUE和HAL_UART_USB,去掉POWER_SAVING(因为我这里没有使用额外的引脚进行外部中断唤醒,要去掉这个UART才能正常使用)
经上述设置就可以在例程中使用UART了,搞这个搞了我半天时间,虽然对我的工作没有什么用,但重在能完全靠自己解决问题,对刚出来工作的我还是有用的。
网上还搜到额外的学习材料,如把串口输出函数封装得更方便,如下:
http://bbs.21ic.com/forum.php?mod=viewthread&tid=774176&page=2#pid4557086
还有更深入的使用,应该在我日后的工作里会用到