记录GD32F350中USART的一个水坑
LogicKids的原型设计中,使用到了串口蓝牙来进行客户端和单板的数据交互
特别是在线仿真的功能,更是需要蓝牙来进行通信
在使用USART桥接蓝牙进行快速的数据交互时
经过连续一段时间的快速通信
F350会出现没有触发情况下,反复进入串口中断的情况
导致主程序无法正常工作
这个情况下,继续发送串口数据,F350还是可以响应串口的接收中断
串口配置代码
- //USART1 init for debug
- /* enable COM GPIO clock */
- rcu_periph_clock_enable(RCU_GPIOA);
- /* enable USART clock */
- rcu_periph_clock_enable(RCU_USART1);
- /* connect port to USARTx_Tx */
- gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2);
- /* connect port to USARTx_Rx */
- gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3);
- /* configure USART Tx as alternate function push-pull */
- gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
- gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
- /* configure USART Rx as alternate function push-pull */
- gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
- gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
- /* USART configure */
- usart_deinit(USART1);
- usart_baudrate_set(USART1, 115200U);
- usart_receive_config(USART1, USART_RECEIVE_ENABLE);
- usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
- usart_enable(USART1);
- //USART1 NVIC
- /* USART interrupt configuration */
- nvic_irq_enable(USART1_IRQn, 0, 1);
- /* enable USART TBE interrupt */
- usart_interrupt_enable(USART1, USART_INT_RBNE);
这里仅开启了USART1的接收中断
中断处理:
- void USART1_IRQHandler(void)
- {
- if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE))
- {
- /* receive data */
- serial_check(usart_data_receive(USART1));
- usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE);
- }
- else{}
- }
中断服务函数中判断中断类型
如果是RBNE中断,就执行serial_check接收数据并保存处理
故障复现时,代码一直串口1的中断服务函数中
如果此时向USART1发送数据,依然可以执行serial_check
和STM32的ORE八哥非常类似
先看看手册对过载错误的描述
手册还是很给力
指出F350的USART过载错误有两种产生可能
一是在接收过程中产生overrun error
另一种是开启MDA后的溢出错误
标志位也分开描述了
USART_INT_FLAG_RBNE_ORERR
USART_INT_FLAG_ERR_ORERR
果断在接收中断中撸上一段
- if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE_ORERR))
- {
- /* receive data */
- usart_data_receive(USART1);
- usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE_ORERR);
- }
- else{}
手起刀落
世界清静了
到此,脚本数据的在线仿真也妥妥滴了
上个gif,lowbee的界面,将就一下
到这里,整个LogicKids项目的预想框架就基本完成了
但是还不是一个真正完整无缺的作品,要做的工作还有很多
明天正好一个月
整吧整吧先提交一版作业吧
以上