本帖最后由 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()函数之前,也就是说要先使能串口了才使能串口中断,否则串口中断使能无效,从而无法进入串口中断接收函数。
|