zoukankan      html  css  js  c++  java
  • 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寄存器相关

  • 相关阅读:
    成功交付离岸项目
    利用CSP探测网站登陆状态
    Web NFC API
    HTML/W3C-WHATWG-Differences
    MIT教授将网页开发整合为完整独立的程式语言Ur/Web
    移动端前端开发调试
    从0到100——知乎架构变迁史
    C++之再续前缘(一)——C++基础(与C语言的差异)(上)
    又爱又恨系列之枚举enum
    数据结构之队列(三)——循环队列
  • 原文地址:https://www.cnblogs.com/WeyneChen/p/9329407.html
Copyright © 2011-2022 走看看