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. R语言处理1975-2011年的人口信息

    1975-2011年的数据中. 1)分别统计每年人口最多的国家是哪个?有多少 2)统计出各个国家的1975-2011年的平均人口增长率 3)统计每年人口最多的十个国家 4)统计出每年人口最少的十个国家 ...

  2. 【Luogu】P2602数字计数(数位DP)

    题目链接 数位DP好喵啊.自己yy两个小时的dfs:题解40行代码=10WA:10A. md而且还不是完全理解题解是什么意思. 所以放题解链接. #include<cstdio> #inc ...

  3. 【Luogu】P3159交换棋子(超出我能力范围的费用流)

    题目链接 明显超出我能力范围. 只放题解. 再放代码. #include<cstring> #include<algorithm> #include<cstdio> ...

  4. 【SCOI2003】【BZOJ1092】蜘蛛难题

    有一堆管道,还有一个蜘蛛Willy,如下图所示.所有管道的是上端开口,下端封底,直径都是1cm,连接两个管道的连接容量无限,但体积可以忽略不计. 在第一个管道上方有一个水源,从中有水不断往下流,速度为 ...

  5. jenkins+maven+testng参数化执行测试用例

    碰到一个场景是,在做自动化中,一个系统往往需要兼容很多浏览器,如何在一个工程中,通过参数化去启动不同的浏览器,而无需改动配置文件呢? 我解决的思路是: 1.通过jenkins的参数传递给maven 2 ...

  6. SharePoint中使用Global.asax

    Global.asax是ASP.Net应用程序的一个文件,用来处理Application级别的事情.可以添加自定义代码到这个文件,详细使用方式见 http://msdn.microsoft.com/e ...

  7. es6总结(七)--数据结构-Set & Map

  8. JQuery 入门学习附常用UI模块

    一.简介 jQuery 库可以通过一行简单的标记被添加到网页中 jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML 元素选取 HTML 元素操作 CSS 操 ...

  9. 使用C语言和i2c-dev驱动

    原文地址:blog.csdn.NET/wyt2013/article/details/20740659 感谢作者分享. 在本博客的<使用Beaglebone Black的I2C(一)>中, ...

  10. Linux 之 Vim常用命令

    Vim常用命令 参考教程:[千峰教育] 终端编辑命令工具: vi/vim.emacs等. vim简介: vim是vi的扩展,被誉为终端编辑之神. vim安装: yum install -y vim 工 ...