• CYPRESS BLE 分享
  • CYPRESS BLE学习心得(二):如何在 PSoc BLE 实现 UART 的接收中断

前言

很多时候我们都是通过串口来打印调试信息,特别是调试BLE时,因为如果在调试BLE设断点,设了断点之后,此时BLE就无法实时握手,就会断开连接;因此,用串口打印调试信息还是相当方便的。同时,当以后在使用透传时也是需要串口来与Psoc BLE通讯的,这里就以实现Psoc BLE的UART接收中断为例;

  1. 配置PSOC Creator的UART组件:选择这个UART组件
    • 配置UART的基本信息
    • 配置UART更高级的功能,我选用的是RX FIFO not empty中断源,内部中断

至此,UART组件已经配置完成了,编译下工程,接下来就要开始组织代码编写了。

  1. 使能UART和使能UART中断
  2. 处理接收到的串口数据
    CY_ISR(UART_SCB_IRQ_Interrupt)
    {
        #ifdef UART_SCB_IRQ_INTERRUPT_INTERRUPT_CALLBACK
            UART_SCB_IRQ_Interrupt_InterruptCallback();
        #endif /* UART_SCB_IRQ_INTERRUPT_INTERRUPT_CALLBACK */
        /*  Place your Interrupt code here. */
        /* `#START UART_SCB_IRQ_Interrupt` */
        if(UART_GetRxInterruptSourceMasked()&UART_INTR_RX_NOT_EMPTY)//判断接收中断的类型
        {
            uint32 ReceviceData=0;
            ReceviceData=UART_SpiUartReadRxData();//读取串口接收缓冲区的数据
    //         printf("%c",(uint8_t)ReceviceData);
            UART_UartPutChar((uint8_t)ReceviceData);//输出接收到的串口数据
        }
        UART_SpiUartClearRxBuffer();//清除串口接收缓冲区
       UART_ClearRxInterruptSource(UART_INTR_RX_NOT_EMPTY);//清除串口接收中断标志位,这个很重要如果没有清除的话会无限进入串口接收中断函数即UART_SCB_IRQ_Interrupt函数
        /* `#END` */
    }  
    其中,UART_SCB_IRQ_Interrupt这个是默认的串口接收中断处理函数;
    关键代码
    1、主函数
    int main()
    {
        /* Place your initialization/startup code here (e.g. MyInst_Start()) */
        CyGlobalIntEnable; /* Enable global interrupts. */
        UART_Start();//使能串口
        UART_SCB_IRQ_Start();//使能中断
        printf("UART Demo!\r\n");
    //    UART_SpiUartPutArray("Helon Test\r\n",sizeof("Helon Test\r\n"));
        for(;;)
        {
             
            /* Place your application code here. */
        }
    } 
    2、串口接收中断处理函数
    CY_ISR(UART_SCB_IRQ_Interrupt)
    {
        #ifdef UART_SCB_IRQ_INTERRUPT_INTERRUPT_CALLBACK
            UART_SCB_IRQ_Interrupt_InterruptCallback();
        #endif /* UART_SCB_IRQ_INTERRUPT_INTERRUPT_CALLBACK */
        /*  Place your Interrupt code here. */
        /* `#START UART_SCB_IRQ_Interrupt` */
        if(UART_GetRxInterruptSourceMasked()&UART_INTR_RX_NOT_EMPTY)//判断接收中断的类型
        {
            uint32 ReceviceData=0;
            ReceviceData=UART_SpiUartReadRxData();//读取串口接收缓冲区的数据
    //         printf("%c",(uint8_t)ReceviceData);
            UART_UartPutChar((uint8_t)ReceviceData);//输出接收到的串口数据
        }
       UART_SpiUartClearRxBuffer();//清除串口接收缓冲区
       UART_ClearRxInterruptSource(UART_INTR_RX_NOT_EMPTY);//清除串口接收中断标志位,这个很重要如果没有清除的话会无限进入串口接收中断函数即UART_SCB_IRQ_Interrupt函数
        /* `#END` */
    }  
    总结:
    UART_Start()函数一定要放在UART_SCB_IRQ_Start()函数之前,也就是说要先使能串口了才使能串口中断,否则串口中断使能无效,从而无法进入串口中断接收函数。
    延伸:
    如果不想使用默认的串口接收中断函数UART_SCB_IRQ_Interrupt,想要使用自定义的串口接收函数,比如:MY_UART_SCB_IRQ_Interrupt,此时你把你想要把串口接收函数放在的地方那里增加即可,例如:
    CY_ISR(MY_UART_SCB_IRQ_Interrupt)
    {
        //这里增加对接收到的串口数据进行处理的代码
    }  
    同时,还要在你想要把串口接收函数放在的地方对你自定义的串口中断接收函数进行声明,如下所示:
    CY_ISR_PROTO(MY_UART_SCB_IRQ_Interrupt);
    其次,在使能串口中断函数那里填上你自定义的串口中断接收函数即可,比如: UART_SCB_IRQ_StartEx(MY_UART_SCB_IRQ_Interrupt);//使能中断
    最后,你就可以使用自定义的串口中断接收函数处理接收到的串口数据了。
    psoc-bleuart.pdf
    219kB
    撰写回复...