打印

实现PSoc BLE的UART接收中断(分享)

[复制链接]
2818|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xiaolong_ba 于 2015-12-14 21:53 编辑

前言:    很多时候我们都是通过串口来打印调试信息,特别是调试BLE时,因为如果在调试BLE设断点,设了断点之后,此时BLE就无法实时握手,就会断开连接;因此,用串口打印调试信息还是相当方便的。同时,当以后在使用透传时也是需要串口来与Psoc BLE通讯的,在论坛里好像有一些网友求助该方法的例程,但给的答案都不太让人满意,这里就以实现Psoc BLE的UART接收中断为例;



步骤一、配置PSOC Creator的UART组件:
选择这个UART组件


file:///C:/Users/Helon/Documents/My%20Knowledge/temp/7c30a348-bf1e-4548-a6f2-1df8c23a9410_128_files/7d09eaf9-b96e-4d0b-a0ab-f04c295da352.png
配置UART的基本信息


file:///C:/Users/Helon/Documents/My%20Knowledge/temp/7c30a348-bf1e-4548-a6f2-1df8c23a9410_128_files/f20878c4-ad65-4557-982d-77d9709291b2.png

配置UART更高级的功能,我选用的是RX FIFO not empty中断源,内部中断


file:///C:/Users/Helon/Documents/My%20Knowledge/temp/7c30a348-bf1e-4548-a6f2-1df8c23a9410_128_files/362a9121-d797-41fa-ab39-3abe760be206.png

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

步骤二、使能UART和使能UART中断


file:///C:/Users/Helon/Documents/My%20Knowledge/temp/7c30a348-bf1e-4548-a6f2-1df8c23a9410_128_files/1c9805c9-dd20-483a-b851-87b807d0f34e.png

步骤三、处理接收到的串口数据

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` */
    UART_ClearRxInterruptSource(UART_INTR_RX_NOT_EMPTY);//清除串口接收中断标志位,这个很重要如果没有清除的话会无限进入串口接收中断函数即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();//清除串口接收缓冲区
    /* `#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` */
    UART_ClearRxInterruptSource(UART_INTR_RX_NOT_EMPTY);//清除串口接收中断标志位,这个很重要如果没有清除的话会无限进入串口接收中断函数即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();//清除串口接收缓冲区
    /* `#END` */
}  

总结
    UART_Start()函数一定要放在UART_SCB_IRQ_Start()函数之前,也就是说要先使能串口了才使能串口中断,否则串口中断使能无效,从而无法进入串口中断接收函数。





沙发
wangyufeng2500| | 2015-12-15 08:23 | 只看该作者
:handshake

使用特权

评论回复
板凳
boy1990| | 2015-12-15 15:34 | 只看该作者
UART_Start()函数一定要放在UART_SCB_IRQ_Start()函数之前??为什么啊?不是很清楚。。。

使用特权

评论回复
地板
xiaolong_ba|  楼主 | 2015-12-15 19:44 | 只看该作者
boy1990 发表于 2015-12-15 15:34
UART_Start()函数一定要放在UART_SCB_IRQ_Start()函数之前??为什么啊?不是很清楚。。。 ...

上面不是说了为什么要这样做吗?不这样的话,有串口数据过来时,PSOC BLE是无法进入接收中断函数的。

使用特权

评论回复
5
gll123| | 2015-12-22 17:33 | 只看该作者
这个总结的太好了~

使用特权

评论回复
6
boy1990| | 2015-12-27 19:18 | 只看该作者
xiaolong_ba 发表于 2015-12-15 19:44
上面不是说了为什么要这样做吗?不这样的话,有串口数据过来时,PSOC BLE是无法进入接收中断函数的。 ...

不这样的话,有串口数据过来时,PSOC BLE是无法进入接收中断函数的!!!好吧,多谢了

使用特权

评论回复
7
ioocuo| | 2015-12-28 15:23 | 只看该作者
多谢楼主分享!

使用特权

评论回复
8
黑白蘑菇球| | 2016-4-27 12:08 | 只看该作者
这个程序是  在串口助手上发送数据   之后再在助手上显示出来吗

使用特权

评论回复
9
xiaolong_ba|  楼主 | 2016-4-27 15:19 | 只看该作者
黑白蘑菇球 发表于 2016-4-27 12:08
这个程序是  在串口助手上发送数据   之后再在助手上显示出来吗

对的,这个只是演示,正规的做法不要这样做

使用特权

评论回复
10
cortex-yuan| | 2016-6-3 15:50 | 只看该作者
但是我还是接收不到数据

使用特权

评论回复
11
dongdong0071| | 2016-6-17 15:15 | 只看该作者
很好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

88

帖子

8

粉丝