搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

发表于 2016-6-29 12:09:08 | 显示全部楼层 |阅读模式
前言:
很多时候我们都是通过串口来打印调试信息,特别是调试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);//使能中断
最后,你就可以使用自定义的串口中断接收函数处理接收到的串口数据了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2017-1-1 23:10:25 | 显示全部楼层
谢谢楼主分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 00:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表