CC2540的SimpleBLEPeripheral例程使用UART0,端口重映射在P1口

因为使用公司的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

还有更深入的使用,应该在我日后的工作里会用到

http://blog.chinaunix.net/uid-29106641-id-4191591.html

转载于:https://www.cnblogs.com/danchaofan/p/4240006.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值