SWIM接口及STM8烧录过程
1. 硬件连接
SWIM接口只需要一根传输线,即可完成双向的传输。传输过程,都是由主控制端(host)发起,设备端然后做出反应。host端需要在一个总线上实现读和写,那就是说必须要同时接一个输出IO和一个输入IO(也可以用同一个,开漏的情况下,IO可以同时读写),且输出IO必须设计成开漏,总线上挂接上拉电阻,以便随时交出控制权。硬件连接如下:
上图SWIM_IN为输入IO,SWIM为输出IO。
2. 编码格式
SWIM协议使用归零码,且支持两种速率。
高速模式
低速模式
这两种模式都是使用8M的clock同步(上图中的箭头)。高速模式下,2个低电平加8个高电平表示1;8个低电平加2个高电平表示0。低速模式下,2个低电平加20个高电平表示1;20个低电平加2个高电平表示0。
程序的第一步就是要实现这两种速率的编码输出。通常情况下,使用IO口加延时即可达到目的。只不过,延时时间需要使用示波器观测,然后多次调节才能比较准。另外,在翻转IO的过程中,注意要关掉所有中断,避免被打断。
3. 通讯协议
上图为host到设备端的通讯过程,主要由命令和数据组成。命令占6个bit,数据占11个bit。
- Command。黑体部分为Command,由5个bit组成。第一个bit固定为0,称之为header,b0~b2为预定义的命令。pb为b0~b2异或之后的值,ack为设备返回的电平。下图为预定义的三种命令:
- Data。Data也是由固定的0的header,加上8个bit的数据,加上数据异或校验,然后设备返回的ack组成。下图是实际通讯过程的截图:
从设备到host的通讯格式也是如此,但header就由0变为1。然后ack由host发送。
程序的第二步,就需要实现这个通讯协议。即实现预定义的三种命令的函数,以及发送1个字节数据的函数。
4. 写操作
有了上述的函数,就可以实现一个写的操作。一个完整的写操作由一下步骤组成:
- WOTF,写命令,即010。
- N,需要发送的数据长度,以字节为单位。
- 三个字节表示的地址。
- N个字节的数据。
下图为一个实际的写操作过程:
程序的第三步就是需要实现这一个功能。
5. 读操作
这是一个可选功能,如果不需要验证的话,可以不实现。实现过程和写操作是一样的。
- ROTF,读命令,即001
- N,要读的数据长度,单位为字节
- 三个字节表示地址
- 设备返回的N个字节的数据。
需要注意的是,收到数据后,程序需要尽快校验数据正确与否,并返回ACK(逻辑1)或者NACK(逻辑0)。下图为实际的读操作过程:
6. 复位操作
复位操作有两种,第一种为发送复位命令,即发送SRST。第二种为拉低 总线16us以上。
下图为发送SRST
下图为拉低总线
这两种复位操作有细微的区别。详细请参考手册《UM4070》
7. 输入激活序列
在上电之后,SWIM总线是没有被激活的,需要输入特定的序列才能激活。序列如下:
详细的描述请参考手册。这里一个函数就实现了,挺简单。
8. 配置寄存器,激活SWIM功能
激活之后,还不能对所有的寄存器进行读写,必须配置SWIM_CSR寄存器
实现上面8步之后,整个SWIM接口及其通讯就都打通了,程序中应该实现了以下函数:
1. Write()。这个函数实现SWIM写命令和写单个字节的功能。
2. SWIM_Write。这个函数实现了SWIM往某个寄存器写若干数据的功能。
3. SWIM_Read。前期可以不实现该功能。
4. SWIM_Active()。这个函数实现了激活序列。
5. SWIM_RST(),SWIM_H_RST()。这两个函数实现两种复位功能。
9. STM8 Flash烧录预备知识
官方手册上,提供了三种flash操作的方式。
- 字节编程
- 字编程
- 块编程
并提供了两种使用SWIM烧录的方法:
第一种方法,在某些型号的MCU上,只能支持字节操作。第二种方法,所有型号都支持,但需要先下载一个ICP驱动到RAM中。这两种方法,官方都没有提供详细的文档描述。因此,只能先使用逻辑分析仪分析STLink工具的下载过程,然后仿照其方法进行操作。
10. 逻辑分析仪分析
一般的逻辑分析仪都没有SWIM协议,因此买的时候注意要买开放接口的逻辑分析仪,然后自己编写。编写的时候没必要考虑异常情况,尽量简单抓出所有下载过程即可。一般半天即可搞定。
我这里抓取了其数据之后,分析部分过程如下:
STLink下载是使用官方描述的第二种方法,即先下载一个驱动到RAM中,然后不停的将整块数据送到RAM中的某特定地址,然后等待驱动将firmware数据写入到flash中。简单描述一下过程如下:
- 激活SWIM
- 配置若干寄存器
- 使能flash读写
- 下载驱动到RAM中
- 按照协议下载firmware数据到特定地址
- 等待驱动将数据写入flash
- 继续下一步写入
11. 写代码
有了上述的实现,以及资料。基本就可以完成整个的程序设计。整个程序需要实现的功能如下,名字即功能。最后的接口为Download()。
12. 参考资料
《UM0470》,介绍SWIM接口
《PM0051》,介绍STM8 flash编程相关步骤
《RM0061》,接收STM8 flash寄存器相关