文章路标👉
文章解决问题
1️⃣
在stm32工程使用过程中,因为不小心,将System Core中的SYS,Debug配置遗漏,在烧录代码后,SWD配置所使用的PA13、PA14引脚重定义,导致后续无法使用SWD配置进行程序下载/Debug。本文主要讲述如何通过另一种烧录方式进行SWD配置重定义,以恢复SWD下载接口,本文将此过程记录,以供有需要的读者参考。
储备知识
2️⃣
STM32的启动模式
在ST官方的参考手册中,可以找到如下图表6所示的启动模式表:
该表所表达的意思如说明中描述一致。在使用SWD下载模式中,pcb的常用设置为BOOT0接地,因此单片机上电后首先进入主闪存存储器中进行程序运行,也就是常说的Main flash memory。
那系统复位后,是何时刻后选择memory呢?答案是 SYSCLK的第4个上升沿,在这之后,BOOT引脚的值会被锁存。这个过程是极快的,因此用户需要提前设置好BOOT1和BOOT0引脚的状态,以便芯片自动选择预期的复位后的启动模式及状态。
SWJ调试端口
再来了解SWD的下载机制,如图是ST官方手册中提供的SWJ调试端口架构原理图:
可以看到在STM32中(笔者这里是STM32F10xxx)内核集成了串行调试接口(SW-DP)/JTAG调试接口(JTAG-DP),SWD也就是这里的串行调试接口。它为AHP-AP模块提供2针(时钟SWCLK+数据(SWDIO))接口。(另外,从该图中也可以看出,TRACESWO,和TDO是复用关系,也就是说异步跟踪功能只能在SW-DP调试接口上实现,当然这个是题外话,与本章内容无关。)
也即是说,其实SWD属于STM32的外设功能,外设功能在系统运行过程中持续有效。如果该外设未启用,则该芯后续暂时失去了SWD的能力,无法再主程序运行过程中重新调用该功能。
ISP下载原理
再来了解一下CH340x一键程序下载(ISP)的原理,其核心是使得 STM32进入系统存储器启动模式(BOOT0 = 1; BOOT1 = 0),回想一下SWD是在程序运行过程中任意时刻可调用的外设功能(BOOT0 = 0; BOOT1 = x)。
进入这个System memory的好处是什么呢?如果芯片从系统存储器启动,这种启动模式的程序功能是由厂家预留设置的。即是说,系统存储器是芯片内部的一块特殊的定制的区域,ST厂商在该区域写预置了一段BootLoader,也就是常说的ISP程序,不可改写,也就是说系统存储区的属性是ROM,出厂后用户无法改写。
主题内容
3️⃣
通过上述内容的学习,可知,不论什么原因,当SWD外设无法正常工作时,还可以通过另一种途径(ISP)的方式使用STM32内部ROM预置的一段固定BootLoader进行程序烧录。
前置工具准备
🔧硬件工具:
🔨可控制BOOT引脚的硬件配置(读者可以自行定制一款救芯专用底座或者借用一个能硬件调节BOOT配置的板子即可,亦可以飞线)(BOOT1 = 0,BOOT0引出)、
🔨CH340x救芯模块,至少需要将DTR#、RTS#引脚引出
🔧软件工具:
📘STM32CubeMX,用于生成启动SWD外设的工程
📘flyMCU或mcuISP,用于加载ISP进程
CH340x的ISP下载步骤
步骤序号 | BOOT1 | BOOT0 | 说明 |
---|---|---|---|
STEP1 | 0 | 0 | 系统正常上电,SYSCLK的第4个上升沿,进入Main flash memory执行上次内部烧录HEX文件 |
STEP2 | 0 | 1 | 使用ISP烧录原理,复位系统并使得在SYSCLK的第4个上升沿,进入System memory,通过预置的BootLoader,引导烧录新HEX文件到flash中 |
STEP3 | 0 | 0 | 新的HEX具备调用SWD外设的能力,即使在Main flash memory中也可以正常使用,故不再需要复位和锁存BOOT引脚 |
笔者使用了自制的救芯模块,原理图设计参考了正点原子与安富莱电子的相关设计,以下为具体原理图:
即通过使用RTS#和DTR#引脚,来控制BOOT0,来改变系统在SYSCLK的第4个上升沿后所选择的启动程序执行区间,通过配合flyMCU工具,可以通过MODEM联络输出信号控制这两个引脚,参考WCH(南京沁恒)官方手册。
从原理图中,实际上就是通过控制这两个引脚的高低电平进而自动控制单片机复位和BOOT0引脚的性质。
根据上述的原理,重新整理CH340x相关引脚并回顾过程
步骤序号 | BOOT1 | BOOT0 | DTR# | RTS# | 说明 |
---|---|---|---|---|---|
STEP1 | 0 | 0 | 1 | 1 | 首次上电(Q2导通,Q1截止) |
STEP2 | 0 | 1 | 1 | 0 | 通过flyMCU控制复位,并使BOOT0为高电平,在SYSCLK第4个上升沿后进入ISP模式(Q2导通,Q1导通) |
STEP3 | 0 | 0 | 1 | 1 | 新的HEX烧录完成后,flyMCU会自动从0x800 0000开始运行,即进入Main flash memory |
所以理论上,打开flyMCU或者mcuISP软件后,需要将软件设置为“DTR的高电平复位,RTS低电平进BootLoader”,但是,软件配置和IC操作是相反的,实际的引脚操作会变为DTR# = 0,RTS# = 1,所以需要将软件设置为 “DTR的低电平复位,RTS高电平进BootLoader”。
硬件连接配置
CH340x模块 | stm32引脚 |
---|---|
TX | RX(PA10) |
RX | TX(PA9) |
RESET | NRST |
BOOT0 | BOOT0 |
GND | BOOT1 |
5V | 5V |
GND | GND |
flyMCU工具配置
工具官网:http://www.mcuisp.com
直接下载:Free STM32 ISP
✒️先用MDK-KEIL软件查看SWD状态:可以看到目前是无法启用SWD调试功能的;
✒️使用ISP工具进行救芯.HEX(该hex由STM32CubeMX配置好SW-debug后直接生成)烧录;
✒️重新使用MDK-KEIL软件查看SWD状态:可以看到目前已经可以启用SWD调试功能。
关于STM32F405RG救芯注意事项
4️⃣
使用章节前述功能,即应用ISP程序引导方式进行hex文件烧录,可以达成救芯(重新启用芯片的SWD外设)。方法在STM32F103RCxx上面是好用的,但笔者在进行STM32F405RGxx相同行为时,死活连接不上:
原因是笔者使用的最小系统板子是基于STM32F103RC设计的;而STM32F405RGxx部分引脚并不兼容该载板!!:
📌VSS引脚是参考地性质,应共享到GND网络;而VCAP是用于保证内部主调压器的电压稳定,需要外接一个电容到地。选择不当可能会引起程序无法下载或者运行不稳定的情况,所以,若F405RGxx芯片直接焊接到F103RCxx的载板中,将会导致VCAP引脚直接接地,也就是0 F,这将直接导致无法进行ISP引导。
📌所以在进行ISP引导hex的时候,一直卡在连接界面:
📌既然弄清楚知道问题,就好解决了——笔者直接将这两个引脚翘起(从图中可以明显看到吧应该…):
📌再进行ISP引导hex,可以看到顺利进行ISP引导。如果擦写烧录提示失败,可以适当降低波特率,另外全片擦写F4系列芯片所用时间较多,需要耐心等待进度条跑完!:
📌最后在MDK-KEIL中调用debug工具,可以顺利查看到SWD功能正常被调用,救芯成功。