• 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. 完成,可以正常的收发数据。

  • 相关阅读:
    MySQL高性能优化规范建议,速度收藏
    基于 debian 操作系统的 docker 镜像,安装 vim
    Vue 开发经验总结
    DNS 负载均衡
    图解:从单个服务器扩展到百万用户的系统
    defer、return、返回值,这三者的执行逻辑
    goroutine 知识点
    一条SQL语句在MySQL中如何执行的
    架构设计的常用方法
    vue中直接修改props中的值并未给出警告,为啥?
  • 原文地址:https://www.cnblogs.com/429512065qhq/p/8284394.html
Copyright © 2020-2023  润新知