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寄存器相关

SWIM接口及STM8烧录过程的更多相关文章

  1. 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程

    一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ...

  2. Hi3559板载u-boot、kernel及rootfs烧录过程及心得

    这一篇随笔讲叙述下基于Hi3559AV100的BOXER-8410AI板载u-boot.kernel及rootfs烧录具体过程及遇到问题的解决方法与心得. 1.前期板载启动测试和烧录手段 1.1.烧写 ...

  3. 关于一个每天请求50W次接口的设计实现过程

    从大学开始关注博客园,到工作之后注册了博客园账号,直至今日终于能够静下心来将自己个人的所学,所得,所悟能够分享出来与大家分享,好开心~ 言归正传,需求背景是博主所在的公司为一个在线OTA公司,客户端上 ...

  4. [原创]Nexus5 源码下载、编译、真机烧录过程记录

    asop使用清华镜像源https://mirror.tuna.tsinghua.edu.cn/help/AOSP/ 一开始使用每月初始化包的方式因为无法搞定版本的问题,没能通过编译,无奈,老老实实一点 ...

  5. WebService—CXF整合Spring实现接口发布和调用过程

    一.CXF整合Spring实现接口发布 发布过程如下: 1.引入jar包(基于maven管理) <!-- cxf --> <dependency> <groupId> ...

  6. Urule开源版系列4——Core包核心接口之规则解析过程

    Urule运行规则文件,是如何进行的,通过一个请求doTest来探一下 com.bstek.urule.console.servlet.respackage.PackageServletHandler ...

  7. 一个版本烧录过程中记录:fdisk、mkfs.ext4、make_ext4fs、img2simg、simg2img

    关键词:dd.fdisk.mkfs.ext4.make_ext4fs.img2simg.simg2img等等. 一个典型的嵌入式系统是由uboot+kernel+rootfs组成的,其中uboot和k ...

  8. 【Mybatis】Mapper接口的参数处理过程

    下面是一个简单的Mapper接口调用,首先同个session的getMapper方法获取Mapper的代理对象,然后通过代理对象去调用Mapper接口的方法 EmployeeMapper mapper ...

  9. [原创]Nexus5 内核编译烧录过程记录

    参考Android系统源代码情况分析第二章进行实践,为了提高效率,也为了增加实践机会,使用Nexus5进行内核编译.需要说明的是,Android源代码工程默认是不包含它所使用的Linux内核源码,如果 ...

随机推荐

  1. PHP的发展史,功能与特点

    web1.0时代:所有的代码都是在浏览器端执行的静态脚本,用户请求的也都是服务器上事先已经存在的静态网页,用户和服务器之间不能进行任何的交互!(不需要数据库的支持) web2.0时代:用户和服务器之间 ...

  2. Java众神之路(1)-语言介绍

    Java语言介绍 1.Java的历史 我个人认为,学习一种技术,不止要关注技术本身,也应该去了解一下它的发展史,这一方面是对技术本身的尊重,另一方面也是希望能够通过该技术的发展历史推测出其未来可能的发 ...

  3. springboot+Jib+Maven+Idea+Docker 实践

    Jib - Containerize your Maven project 2. Jib+Maven+Springboot 实践代码例子 2.1在maven项目中的pom.xml文件中配置Jib插件 ...

  4. bzoj 1137 [POI2009]Wsp 岛屿

    题目大意 Byteotia岛屿是一个凸多边形.城市全都在海岸上.按顺时针编号1到n.任意两个城市之间都有一条笔直的道路相连.道路相交处可以自由穿行.有一些道路被游击队控制了,不能走,但是可以经过这条道 ...

  5. 标准C程序设计七---76

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  6. 50深入理解C指针之---指针与别名

    一.size_t:用于安全表示长度,所有平台和系统都会解析成自己对应的长度 1.定义:size_t类型表示C中任何对象所能表示的最大长度,是个无符号整数:常常定义在stdio.h或stdlib.h中 ...

  7. hdu 1254(搜索题)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  8. HTML-loading动画1

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. python 当pip不能用的时候可以去找python安装包

    初学python,一直pip安装各种包,突然间有一天pip莫名其妙不能用了,除了pip help全部都是没反应 百度好像没人出现过pip挂掉的情况 花了一小时修复pip,卸载啊,路径啊,全部无效 百度 ...

  10. 洛谷—— P1342 请柬

    https://www.luogu.org/problemnew/show/1342 题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤 ...