AIR001是合宙套皮普冉公司PY32F002A的一款低成本MCU,配置如下:ARM M0+ 32位核心、48MHz主频、4K SRAM、32K FLASH、3通道DMA、9个定时器、1个12位ADC、1.7V到5.5V宽压供电、-40到+85℃工作温度。涨价前平均下来一片不到1元,简直是电子DIY神器。
本着物尽其用的原则,我在自己的DIY项目中使用了这款MCU,用于电压采集,风扇调速,温度监控,屏幕驱动等功能:
然而在对MCU进行调试编程时,遇到一个奇怪的问题:在编写好UART驱动代码后,串口无法正常手法收发数据。发送任意字符串,UART只返回0x1f数据:
使用JLINK进行在线调试,UART反而可以正常收发数据:
经过排查后,发现由于串口ISP电路异常导致MCU并未正确执行FLASH中的程序,造成故障,下面记录排查过程:
首先板子上电后,插入JLINK调试器,启动J-LINK Commander程序。
- 输入connect命令,设备选择Cortex-M0+
- 接口选择SWD,其他参数默认
连接完成后,输入h(halt)指令,中断CPU执行指令:
再输入g(go)指令,使CPU恢复运行。重复几次,观察PC寄存器,SP(R13)寄存器,LR(R14)寄存器数值变化。
调试发现PC程序计数器的数据一直指向0x1FFF08BE这个地址。熟悉STM32开发的都知道FLASH中的用户程序保存在0x08000000~0x08008000这个地址内,查找数据手册发现:
MCU一直在执行Bootloader代码,这也解释了为什么通过SWD调试时程序能够正常执行:使用SWD调试和正常上电执行代码不同,CPU会被强制跳转到0x08000000地址执行用户代码(准确来说是跳转到main()函数)。之所以上电后一直收到0x1F,是因为MCU处于ISP模式,将串口的数据识别为了指令而返回的状态码。因此故障点就在ISP复位下载电路异常,导致MCU一直处于ISP模式,将ISP升级电路的开关管取下后,重新上电,MCU便能够正常工作了。
Comments | 2 条评论
博主 Chise Hachiroku
别的不说,这个包装真™逆天。
博主 星空物语
@Chise Hachiroku 🤣🤣🤣鬼才美工