5146|3

3414

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

【GD32F350 LogicKids】USART出坑和脚本仿真 [复制链接]

记录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八哥非常类似
先看看手册对过载错误的描述



手册还是很给力
指出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的界面,将就一下

到这里,整个LogicKids项目的预想框架就基本完成了
但是还不是一个真正完整无缺的作品,要做的工作还有很多
明天正好一个月
整吧整吧先提交一版作业吧
以上
此帖出自GD32 MCU论坛

最新回复

示波器稳了  详情 回复 发表于 2018-9-29 19:25
点赞 关注(1)
个人签名

So TM what......?

 

回复
举报

5220

帖子

239

TA的资源

管理员

沙发
 
等大终结帖
此帖出自GD32 MCU论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

935

帖子

1

TA的资源

禁止发言

板凳
 
此帖出自GD32 MCU论坛
 
个人签名存储芯片/MCU/SRAM/PSRAM/DDR/FLASH/MRAM。web.www.sramsun.com  QQ3161422826 TEL:13751192923
 
 

回复

7452

帖子

2

TA的资源

五彩晶圆(高级)

4
 
示波器稳了
此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表