CC2541之串口调试PM2.5传感器

1. CC2541通过串口和PM25设备PMS7003通信,串口9600波特率,手机APP显示数据一直是128,先检查蓝牙数据通路问题,数据通路没问题

2. 看下串口是否OK,串口也不通,看到宏定义ZAPP_P2,不清楚是什么用途,本次使用P0_4,P0_5,串口UART1的ALT1。使用宏定义ZAPP_P2和uart_alt1,去掉宏定义CC2540_MINIDK,增加HAL_UART=TRUE,关闭流控#define NPI_UART_FC        FALSE,关闭功耗控制xPOWER_SAVING

3. 修改串口波特率9600。

1 #define NPI_UART_BR                    HAL_UART_BR_9600

4. 修改串口的引脚

1 #define PxSEL                      P0SEL        //串口配置到P0口
2 #define HAL_UART_PERCFG_BIT        0x00         // USART1 on P0, Alt-1; so clear this bit,使用ALT1,所以清零
3 #define HAL_UART_PRIPO             0x40         // USART0 priority over UART1.串口优先级
4 #define HAL_UART_Px_CTS            0x04         // Peripheral I/O Select for CTS flow control. 串口流控引脚
5 #define HAL_UART_Px_RTS            0x08        // Peripheral I/O Select for RTS must be manual. 串口流控引脚
6 #define HAL_UART_Px_SEL            0x30         // Peripheral I/O Select for Rx/Tx. 串口的RXD和TXD引脚,P0_4和P0_5

5. 修改串口的中断配置,疑问是为啥是用P0中断,而不是UART1的RXD中断?

 1 #define PxDIR                      P0DIR     //串口在P0
 2 #define PxIEN                      P0IEN     //P0中断使能
 3 #define PxIFG                      P0IFG     //P0中断使能
 4 #define PxIF                       P0IF
 5 #define DMA_RDYIn                  P0_2      //CTS流控引脚
 6 #define DMA_RDYOut                 P0_3      //RTS流控引脚
 7 #define DMA_RDYIn_BIT              BV(2)     // Same as the I/O Select for CTS flow control.//CTS流控引脚
 8 #define DMA_RDYOut_BIT             BV(3)     // Same as the I/O Select for manual RTS flow ctrl.//RTS流控引脚
 9 // Falling edge ISR on P1.4-7 pins.
10 #define PICTL_BIT                  BV(0)     // 中断边沿检测
11 #define IENx                       IEN1      //中断使能寄存器,这里的疑问就是为啥使能的是P0的中断,不是UART1的RXD中断
12 #define IEN_BIT                    BV(5)     //中断使能寄存器第5位P0IE

6. 修改中断函数halUart0TxIsr

 1 HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR )
 2 {
 3   HAL_ENTER_ISR();
 4 
 5   if (dmaCfg.txHead == dmaCfg.txTail)
 6   {
 7     IEN2 &= ~UTXxIE;
 8     dmaCfg.txMT = 1;
 9   }
10   else
11   {
12     UTXxIF = 0;
13     UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++];
14 
15     if ((HAL_UART_DMA_TX_MAX != 256) && (dmaCfg.txHead >= HAL_UART_DMA_TX_MAX))
16     {
17       dmaCfg.txHead = 0;
18     }
19   }
20 
21   HAL_EXIT_ISR();
22 }

7. 看下IEN1的寄存器

1 SFRBIT( IEN1    ,  0xB8, _IEN17, _IEN16, P0IE, T4IE, T3IE, T2IE, T1IE, DMAIE )

8. 串口初始化函数和发送

1   NPI_InitTransport(NpiSerialCallback);
2   uart1Send("1h1h0",5);

9. 串口接收回调函数

 1 uint8 buffer[32] = {0};
 2 static void NpiSerialCallback(uint8 port, uint8 events)
 3 {
 4   (void) port;
 5   if(events & (HAL_UART_RX_TIMEOUT | HAL_UART_RX_FULL)) //
 6   {
 7     uint8 num_bytes = 0;
 8     num_bytes = NPI_RxBufLen(); //读取串口缓冲区有多少个字节
 9     NPI_ReadTransport(buffer, num_bytes);
10   }

10. 完成,可以正常的收发数据。

原文地址:https://www.cnblogs.com/429512065qhq/p/8284394.html