最近在搞调试器,折腾了好多天,终于理解了mdk、下载算法、调试器、mcu之间的关系。
简单来说就是,调试器作为usb转swd协议的转换工具,mdk通过usb驱动这个工具,下载算法包含了一些mcu内部flash擦除、编程代码。与普通代码不同的是,该代码可以下载在任意位置运行。如果需要校验,还会加入crc校验代码,扇区检测代码。
mdk首先通过调试器将算法写入内部ram,然后把需要写入的固件程序写入ram,再由mdk控制(通过调试器)mcu执行相应代码(擦除或写入扇区),通过mcu的寄存器和设定软件断点得到执行结果,如此来回搬运,就可完成固件下载。
说起来简单,做起来很麻烦(调试器工具功能简单,只做协议转换,如何控制通过mdk),这里点到为止,有时间会好好整理分享一下。
之后准备usb相关的工作,发现总是没有满意的usb core库,官方的库感觉还不错,可惜被封装了,看不到源码,放弃。
之前鱼鹰分享过虚拟串口的代码,于是下载下来使用,发现竟然在gd32中用不了,当初明明st测试没问题的。
还以为是gd芯片问题,然后使用之前的usb双缓冲读卡器代码,发现没有问题。
只能在线调试比较差异,借助逻辑分析仪,总算解决了这两个bug,顺利自发自收。
bug 1
枚举失败。
通过逻辑分析仪发现,电脑发送控制帧给usb设备,竟然没有任何回应,即没有nak,也米有stall,更不用说ack了。
▲正常回应
▲无回应
通过调试发现,该端点接收状态为0,禁用状态,再参考可用代码,发现在复位之后,应该设置为接收有效才对。因此修改如下:
void usbd_reset (void){ ……………… …… …… epxreg(0) = ep_control | ep_rx_valid; // 除了设定端点类型外,还要使能接收 daddr = daddr_ef | 0; /* enable usb default address */}
很奇怪的是,st我以前测试是没问题的,可能也是两者之间的差异吧。
bug 2
枚举成功后,又出现另外一个问题,就是串口只能发送第一帧数据,第二次卡死……
经过逻辑分析仪发现,发送的数据会被nak。后来才发现下面的语句不满足,直接没有读usb数据包,从而没有恢复接收有效状态,导致串口助手卡死。 这段官方代码也确实比较迷,没有最大利用缓存空间(最少需要满一包的空间,但实际可能不满一包),不过按下不表。 那就是第一次收到的数据未读呗,在main()函数里面发现根本没进来,发现竟然一直在usb中断执行……
void main() { while(1) { …… if (usb_rx_ch == -1) usb_rx_ch = usbd_cdc_acm_getchar(); …… } }然后看到这个标志一直在,未清除导致。
但很奇怪的事,该代码在st里面跑的挺好的。不管它,加上处理:
void usb_lp_can1_rx0_irqhandler(void) { …… if (istr & istr_esof) { if (usbd_p_error_event) { usbd_p_error_event(3); } istr = ~istr_esof; } …… }
这下串口助手一下子丝滑了,舒服!
Porsche Design二合一笔电,基于ARM的Windows 10笔记本
单级反激PFC变压器的计算方法
定时决定一切:如何使用部分PLL创建调制波形
4GDTU应用场合和4GDTU联网特点
解析虚拟示波器的组成部分及优势方面
关于GD32虚拟串口的两个BUG
LED透明显示屏的优点的以及它的应用场景
如何实现PLC之间无线通讯
哪些行业能引领工业4.0或推动工业互联网的突破发展
常见问题解答:Xilinx采用首个ASIC级UltraScale可编程架构
人工智能在电子商务中的应用有哪些
高速码垛机器人海绵吸盘式抓手的应用
意大利政府计划到2030年光伏装机规模达到50GW
怎样制备碳量子点_碳量子点的制备
Littelfuse宣布其瞬态抑制二极管阵列系列将ESD保护与共模EMI滤波相结合
华为包耳式的头戴产品线将会于2020年推出
喜讯 | 瑞迅科技入选西安市工业互联网产业生态供给资源池企业名单
解决低照度下摄像机成像效果的两种技术介绍
沃尔沃已达吉利对其推进IPO标准 估值300亿元
乐天移动和NEC公司正在开始生产5G网络无线设备