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. Linux Programming之MySQL

    实验环境:Ubuntu13.04 在此之前有过一段使用MySQL数据库的经历,在Windows平台下使用GUI(当时是使用HeidiSQL和Workbench来管理数据库),并且有过使用Python中 ...

  2. JSON树节点的增删查改

    最近了解到使用json字符串存到数据库的一种存储方式,取出来的json字符串可以进行相应的节点操作 故借此机会练习下递归,完成对json节点操作对应的工具类. 介绍一下我使用的依赖 复制代码 < ...

  3. VCO的配置方法

    弄了个VCO的环境. 感觉有点儿麻烦,配乱七八糟的服务,弄完了SE也不试试,白弄了.最近又有人说这东西要试试. 我先简单记录下吧: 1. 在vCenter Server 下开启SSO,设置密码. 2. ...

  4. docker (centOS 7) 使用笔记1

    1. docker配置 初次在安装完docker后,初始化配置 copy默认的docker.service后,重启服务,会在/etc/systemd/system/multi-user.target. ...

  5. QTREE系列题目总结

    $QTREE$ 就是一套树上数据结构练习题. 这套题貌似来源于 $SPOJ$,我是在 $luogu$ 看到的. $QTREE1$ 题意 一棵 $n$ 个点的带边权树,要求支持 单边改权值 和 询问路径 ...

  6. 转 手把手教你最简单的开源项目托管GitHub入门教程

    传送门 自从google code关闭了下载服务了之后,GitHub作为了目前最好用的免费开源项目托管站点,众多开源项目都托管在github,其中不乏著名的播放器MPC-HC. 不习惯于英文的朋友,难 ...

  7. PHP读取APK的包信息,包括包名,应用名,权限,LOGO等

    [转]PHP读取APK的包信息,包括包名,应用名,权限,LOGO等 声明本文转自: 原文链接:https://www.jb51.net/article/53780.htm: 感谢分享! <?ph ...

  8. C#知识点总结:Monitor和Lock以及区别

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  9. js -“=”“==”和“===”的区别

    这个问题再面试中经常被问到,说实话我都是懵的,一个“=”和两个“==”等的区别我还是知道的,就是三个“===”我完全是不知道的,因为我基本上都没有遇到过且用到过,所以再这个问题上我是没分的,人家考官就 ...

  10. 【APIO2015】Palembang Bridges

    题目描述 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 $A$ 和区域 $B$. 每一块区域沿着河岸都建了恰好 $1000000001$ 栋的建筑,每条岸边的建筑都从 $0$ 编号到 $100 ...