STM32:程序下载系列概览
1 下载协议
JTAG全称 joint test action group,边界扫描系统协议;是调试芯片的通用标准协议;
SWD全称 serial wire debug,串行调试协议;也是调试芯片的通用标准协议;
在cortex内核中,SWD和JTAG可以通过内部的DP模块直接访问总线进行读写,不需要bootloader;
2 SWJ-DP
SWJ-DP全称 serial wire/JTAG - debug port,串行和边界扫描系统调试端口;为stm32系列的程序下载端口;
SWJ-DP可复用成JTAG调试接口、SW调试接口,分时复用JTAG协议、SWD协议进行下载;
2.1 stm32f1系列引脚分配

2.2 SWJ-DP功能框图
SW和JTAG协议都不需要通过bootloader;通过AHB/APB访问cm3的总线矩阵,直接访问读取cm3核心外的flash地址;
SWJ-DP有自己的内部总线,它的时钟不来自AHB/APB,而是来自sw和jtag的外部时钟线;

所以如果sw和jtag无法下载,和mcu的时钟配置、硬件晶振,程序跑飞 都没关系;
所以sw和jtag无法下载大概率是因为芯片电压不稳定,引脚静电打坏了;至于软件原因则下:
引脚在代码中被复用为gpio关闭了下载功能;
代码进入低功耗模式 (STOP/STANDBY/SLEEPDEEP),关闭了 Debug;
代码跑飞、堆栈损坏进入 HardFault/BusFault 后挂死;然后hardFault后反复复位开始闭环;
看门狗疯狂重启(几毫秒内复位),调试器来不及附着;
3 下载器
SWJ-DP需要使用下载器下载:通过约定好的引脚端口、使用约定好的通讯方式、把代码写入芯片内部的特定位置;
STM32可以使用ULINK2下载器、JLINK下载器、STLINK下载器,以及各种抄板前三种下载器;
ULINK2下载器 >> JTAG协议,SWD协议
STLINK下载器 >> STM8使用SWIM协议,STM32使用JTAG协议、SWD协议
JLINK下载器 >> JTAG协议,SWD协议,SPI协议
3.2.1 最近遇到一个问题,一个14年初的jlink下载器,电脑安装了18年版本的V634 jlink驱动;jlink驱动不会兼容旧的jlink下载器;
所以每次下载都会弹窗报错如下,我应该去下个旧的14年的jlink驱动就可以解决这个问题,先放着;
“the connected J-LINK is defective.proper operation cannot be guaranteed.”
https://www.segger.com/downloads/jlink
4 不使用下载器下载
不使用下载器下载的话,则需要借助bootloader来将代码接收到特定的地址,然后再软件触发系统复位来运行程序;
IAP >> IAP全称 in-applicatin programing,在线应用编程下载;
ISP >>ISP全称 in-system programming,在线系统编程下载;
4.1 ISP下载
ISP下载时,不能直接通过MDK下载,需要借助flash_loader.exe / fly_mcu.exe下载;
ISP下载时,下载软件通常通过usart1外设,与出厂bootloader程序直接通讯,bootloader将收到的代码搬运到flash内部的启动位置;
下载软件不仅可以通过usart1下载,部分系列芯片还可以使用spi、can、iic等外设;其他外设估计大概率遇不到;
bootloader程序怎么将代码搬运到flash内部并没有告诉我们,我也懒得找为什么了;
4.2 如何触发软件复位
NVIC_SystemReset() >> 主流、标准、可靠
配置芯片专用复位寄存器 >> ble芯片用 的
看门狗超时复位 >>( backup 方案)
4.3 ISP一键下载电路
ch340电平转换芯片作用是直接将USB差分电平信号转换为TTL信号传递给单片机;
大约是ch340厂家将RTS、DTR引脚控制封装进flymcu.exe并提供了电路接法;
flymcu.exe软件关于RTS、DTR的配置选择为:"DTR的低电平复位,RTS高电平进bootloader",离谱妈妈快来开门;
以下倒推一下那俩三极管的作用,为了方便推导,pnp三极管在此简写为n型管、npn三极管在此简写为p型管;
手上只有正点的板子所以用他的电路图,电路boot[1:0]是通过跳线帽手动修改的,本节前提手动配置了[boot1]=0b;

4.3.1 ISP下载
(1) [x:boot0]= x1b,reset先拉低再拉高;此时单片机根据boot[1:0]=x1b 从地址0x1FFF F000启动,ISP下载;
(2) [x:boot0]= x0b,reset先拉低后拉高,此时单片机根据boot[1:0]=x0b 从地址0x0800 0000启动,执行程序;
注意,如果[boot0]=0b,意味着RTS通过R48拉到了vcc,那么p型管始终截止,还怎么控制reset值呢?保留疑问继续;
4.3.2 ISP一键下载
(1) RTS=1,DTR=1
n型管截止断路boot0接地,boot0=0;p型管截止断路reset接vcc,reset=1;
ch340上电初始化值;此时n型管不控制boot0状态,p型管不控制reset值;
(2) RTS=0,DTR \
n型管导通10k和1k电阻串联后分压,boot0=1;p型管导通reset接RTS,reset=0;
ISP地址启动;此时reset低电平有效,芯片复位;当前状态假设持续10ms,F1系列reset复位信号持续典型值为2.5ms;
(3) RTS \ ,DTR=1
n型管状态不变,boot0=1;p型管截止断路reset接vcc,reset=1;
ISP地址启动;此时reset释放,执行程序;芯片读取boot[1:0]=01b,启动ISP下载,直到flymcu.exe下载完成;
(4) RTS=1,DTR \
此时n型管截止断路boot0接地,boot0=0;p型管截止断路reset接vcc,reset=1;
此时n型管不控制boot0状态,p型管不控制reset值;
(5) isp下载完成后,从flash地址重新启动的reset信号不是ch340控制的
可能是由于勾选了flymcu.exe的“编程后执行”提供的,可能是由内核电源模块提供的;
4.3.3 ISP一键下载bug
当usb转串口接电脑之后,再给单片机上电的瞬间DTR和RTS的电平变化导致竞争冒险,使得单片机可能反复重复复位;
以上是野火说的,可以解释以下bug;
当使用STLINK下载同时,同时使用ch340的usb转串口,直接拔掉电脑端stlink_usb,usb转串口会一直重复发送信息;
usb转串口会一直重复发送信息,说明此时芯片在反复重启,反复复位;
可能是因为stlink拔掉的时候reset信号出现了毛刺,可能通过电路板走线影响上了ch340的复位;
然后导致ch340的DTR和RTS的竞争冒险所以单片机一直在复位;
STM32 SWD下载口无法下载的原因和解决办法 - 创世界 - 博客园 (cnblogs.com)
5 小结
感觉自己棒棒哒;

浙公网安备 33010602011771号