这货大概花了2周多的时间来完成,从开始研究手册到最终能用。
本作的功能是:实现了兼容官方上位机的能对stm8单片机进行调试、下载的设备研究一个兼容stlink的编程器,主要是因为原装的stlink的固件只能在stm32f103c8上使用,换到stm32f103rc或者gd32上面都是不能正常工作的。这可是有些蛋疼。
如果说10多元就能在淘宝上买一个stlink的话,另外一个主要动机是想练练手了,本次折腾学到了好多关于stm32的定时器的高级用法,也对usb模块更熟练了。
还有就是,要感谢坛友
@jcdzxh 的大力帮助,给提供了很多的知识
成果展示如图硬件部分,
设备管理器查看设备被成功枚举为stlink
使用st官方的flash编程器STVD工具对目标板进行flash读、flash写、数据eeprom读、数据eeprom写、选项字节读、选项字节写、芯片上锁解锁 都是没有问题的
使用iar进行在线仿真调试
没有问题
逐行执行
逻辑分析仪抓取的一段读flash操作发生的波形
0通道为swim
1通道为rst
4.5通道为usb的d+和d-
硬件接线示意图
调试的时候,用了这些
由stm32核心板(板子上焊接的是gd32)作为调试器主机,stm8核心板是目标板。
jlink是用于给stm32调试器编程,逻辑分析仪负载分析swim接口波形和usb数据
----------------------------------分割线----------------------------------
本次主要参考的手册是st官方提供的um0470手册
STM8-SWIM通信协议和调试模块
STM8 的调试系统接口允许一个调试或编程工具,通过一根基于开漏接口的单总线双向(bidirectional)通信线连接到 MCU。
SWIM 是一个基于异步(asynchronous),强灌电流(high sink)(8mA),开漏,双向通信(bidirectional communication)的单总线接口。
当 CPU 正在运行,出于调试目的,SWIM 允许非抢占式(non-intrusive)读写访问,去执行 on-the-flay 到 RAM 和外设寄存器。
此外,当 CPU 停止(stalled),SWIM 允许读写访问,去执行 MCU 存储空间的其它部分(数据 EEPROM 和程序存储器)。
CPU 寄存器(A,X,Y,CC,SP)也可以被访问。这些寄存器被映射在存储器中,而且可以以相同的方式去访问
对于芯片编程,首先要对目标芯片写进入入口时序,用于激活目标芯片的swim调试模块
POR(上电复位)后,SWIM 一直处于 OFF 模式,SWIM 引脚采样用于检测入口序列。要实现这一机制,内部低速 RC 时钟在 POR 后自动运行,并且在 SWIM 处于 OFF 模式下一直保持。
SWIM 激活时序图如所示,图中每一段的描述如下。
1. 为了激活 SWIM,SWIM 引脚必须强制拉低 16μs(在 HSI 下最少 64 个脉冲)。
2. 第一个脉冲后(总线当前为 0),在 SWIM 的 ACTIVE 状态入口处,SWIM 检测一个特殊序列以保证鲁棒性(guarantee robustness).SWIM 入口序列式:4 个 1KHz 的脉冲,紧接着 4 个 2KHz 的脉冲。序列的频率很容易被内部 RC 检测到。入口序列如所示。注意序列以 SWIM 引脚拉高作为开始和结束标志。
3. 入口序列后,SWIM 进入 ACTIVE 状态,HSI 振荡器(oscillator)自动开启。
4. 延时过后,SWIM 发出一个同步帧给主机。
同步帧描述:MCU 的 SWIM 总线输出低电平,维持 128 个 SWIM 时钟脉冲表示发出一个同步帧,用于调试主机对RC时钟频率的测量。一个高级调试主机可以重新校准(re-calibrate)它的时钟,来适应(adapt)MCU 内部 RC 的频率。
5. 开始 SWIM 通信之前,SWIM 线必须释放为高电平,以保证 SWIM 准备好通信(至少维持 300ns)。
6. 写 0A0H 到 SWIM_CSR 寄存器:
Bit5 置一,允许访问整个存储器和 SRST 命令
Bit7 置一,掩盖内部复位源
7. 释放加载配置字节的序列的复位。等待 1ms 以保持稳定。
其中
HSI = 16MHz SWIM 时钟为 HSI/2 = 8MHz
用逻辑分析仪抓取入口时序以后的效果如图
图上可见强制拉低 至少16μs(这里远多于16us)
4 个 1KHz 的脉冲,紧接着 4 个 2KHz 的脉冲
从机发送的同步帧给主机
如果rc时钟足够精确的话,这里应该是16us,显然手上的这片stm的时钟频率有些误差
紧接着的同步帧以后,是一个软件复位指令
写 0A0H 到 SWIM_CSR 寄存器
[ 此帖被2545889167在2017-09-15 00:45重新编辑 ]