[经验分享] 【GD32F350 LogicKids】USART出坑和脚本仿真

ljj3166   2018-9-28 22:38 楼主
记录GD32F350中USART的一个水坑
LogicKids的原型设计中,使用到了串口蓝牙来进行客户端和单板的数据交互
特别是在线仿真的功能,更是需要蓝牙来进行通信
在使用USART桥接蓝牙进行快速的数据交互时
经过连续一段时间的快速通信
F350会出现没有触发情况下,反复进入串口中断的情况
导致主程序无法正常工作
这个情况下,继续发送串口数据,F350还是可以响应串口的接收中断
串口配置代码

  1. //USART1 init for debug

  2.         /* enable COM GPIO clock */
  3.          rcu_periph_clock_enable(RCU_GPIOA);

  4.          /* enable USART clock */
  5.          rcu_periph_clock_enable(RCU_USART1);

  6.          /* connect port to USARTx_Tx */

  7.          gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2);

  8.          /* connect port to USARTx_Rx */

  9.          gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3);

  10.          /* configure USART Tx as alternate function push-pull */

  11.          gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);

  12.          gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);

  13.          /* configure USART Rx as alternate function push-pull */

  14.          gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);

  15.          gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);

  16.          /* USART configure */
  17.          usart_deinit(USART1);

  18.          usart_baudrate_set(USART1, 115200U);

  19.          usart_receive_config(USART1, USART_RECEIVE_ENABLE);

  20.          usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
  21.          usart_enable(USART1);
  22. //USART1 NVIC
  23. /* USART interrupt configuration */

  24.   nvic_irq_enable(USART1_IRQn, 0, 1);
  25. /* enable USART TBE interrupt */

  26.          usart_interrupt_enable(USART1, USART_INT_RBNE);


这里仅开启了USART1的接收中断
中断处理:

  1. void USART1_IRQHandler(void)
  2. {

  3.          if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE))
  4.                    {

  5.                                      /* receive data */
  6.                             serial_check(usart_data_receive(USART1));

  7.                             usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE);
  8.                    }
  9.                    else{}
  10. }


中断服务函数中判断中断类型
如果是RBNE中断,就执行serial_check接收数据并保存处理
故障复现时,代码一直串口1的中断服务函数中
如果此时向USART1发送数据,依然可以执行serial_check
和STM32的ORE八哥非常类似
先看看手册对过载错误的描述
1.jpg
2.jpg
3.jpg
手册还是很给力
指出F350的USART过载错误有两种产生可能
一是在接收过程中产生overrun error
另一种是开启MDA后的溢出错误
标志位也分开描述了
USART_INT_FLAG_RBNE_ORERR
USART_INT_FLAG_ERR_ORERR
果断在接收中断中撸上一段

  1. if(RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE_ORERR))
  2.                    {

  3.                                      /* receive data */
  4.                             usart_data_receive(USART1);

  5.                             usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE_ORERR);
  6.                    }
  7.                    else{}


手起刀落
世界清静了
到此,脚本数据的在线仿真也妥妥滴了
上个gif,lowbee的界面,将就一下
未命名项目.gif
到这里,整个LogicKids项目的预想框架就基本完成了
但是还不是一个真正完整无缺的作品,要做的工作还有很多
明天正好一个月
整吧整吧先提交一版作业吧
以上
So TM what......?

回复评论 (3)

等大终结帖
点赞  2018-9-29 10:20
存储芯片/MCU/SRAM/PSRAM/DDR/FLASH/MRAM。web.www.sramsun.com  QQ3161422826 TEL:13751192923
点赞  2018-9-29 10:39
示波器稳了
点赞  2018-9-29 19:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复