打印

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

[复制链接]
1713|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言:
很多时候我们都是通过串口来打印调试信息,特别是调试BLE时,因为如果在调试BLE设断点,设了断点之后,此时BLE就无法实时握手,就会断开连接;因此,用串口打印调试信息还是相当方便的。同时,当以后在使用透传时也是需要串口来与Psoc BLE通讯的,这里就以实现Psoc BLE的UART接收中断为例;

步骤一、配置PSOC Creator的UART组件:选择这个UART组件
  
配置UART的基本信息
  
配置UART更高级的功能,我选用的是RX FIFO not empty中断源,内部中断
  
至此,UART组件已经配置完成了,编译下工程,接下来就要开始组织代码编写了。

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

步骤三、处理接收到的串口数据
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 BLE实现UART的接收口断.pdf

218.69 KB, 阅读权限: 20

沙发
qwert1213131| | 2016-6-29 15:07 | 只看该作者
楼主更新很快

使用特权

评论回复
板凳
xiaolong_ba|  楼主 | 2016-6-29 16:03 | 只看该作者

回复的也很快

使用特权

评论回复
地板
liangwode| | 2016-6-30 16:33 | 只看该作者
学习啦

使用特权

评论回复
5
xiaolong_ba|  楼主 | 2016-6-30 21:05 | 只看该作者

多多指教

使用特权

评论回复
6
jxthk| | 2016-7-1 09:04 | 只看该作者
学习下

使用特权

评论回复
7
xiaolong_ba|  楼主 | 2016-7-1 09:57 | 只看该作者

多多交流

使用特权

评论回复
8
niou_YF| | 2016-7-11 21:12 | 只看该作者
学习了

使用特权

评论回复
9
liweixiaowei| | 2017-1-11 14:16 | 只看该作者
谢谢,拿来学习。

使用特权

评论回复
10
zhaoruzhe| | 2017-1-11 17:52 | 只看该作者
赞!!!!

使用特权

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

本版积分规则

个人签名:CY BLE教程地址:http://bbs.wireless-tech.cn/

15

主题

88

帖子

8

粉丝