SWIM接口及STM8烧录过程

发布者:创意火舞最新更新时间:2020-03-16 来源: eefocus关键字: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寄存器相关

关键字:SWIM接口  STM8  烧录过程 引用地址:SWIM接口及STM8烧录过程

上一篇:ST-LINK/V2 + STM8 + STVP 下载程序+Error on Option Bytes
下一篇:IAR的STlink下载出现 SWIM error [30006]:解决办法

推荐阅读最新更新时间:2024-11-13 22:08

Linux下搭建STM8开发环境
使用SDCC+STM8Flash+STLink搭建Linux开发STM8开发环境,对应的MCS51,LPC之类的也可以使用SDCC 1、安装SDCC $ sudo apt-get install sdcc 2、安装stm8flash git clone https://github.com/vdudouyt/stm8flash.git cd stm8flash make sudo make install 3、安装STlink驱动 安装之前的需要安装的环境 1.libusb-1.0 1.1:sudo apt-get install libusb-dev 1.2:sudo apt-get install libusb-1
[单片机]
同一个STM8工程换目录位置后生成的HEX校验和不一致的问题
在使用IAR FOR STM8做003开发的时候,发现同一个工程,相同的文件,在拷贝到其他目录后,重新编译生成的HEX和原来的不一致,这是因为HEX文件尾部有目录的信息,所以换目录校验和会变,但功能没变,解决方法就是在stm8s_conf.h中注释掉 断言#define USE_FULL_ASSERT (1) ;改之前先去掉文件的只读属性,改完再加上只读,比较发现关掉能省出二百多字节
[单片机]
同一个<font color='red'>STM8</font>工程换目录位置后生成的HEX校验和不一致的问题
IAR for STM8问题1
IAR for STM8弹窗:Fatal error while generating source browse infomation.See the Source Browse Log window for more infomation 这种情况是因为.c或者.h文件的包含路径中有中文,将中文改成英文之后重新设置路径,会如下正常运行。 正常运行如下:
[单片机]
IAR for <font color='red'>STM8</font>问题1
STM8学习笔记---定时器 TIM4功能实现
STM8单片机的TIM4和TIM6是8位基本定时器。 定时器功能如下: 基本定时器的功能比较简单,一般只用来实现定时功能。 基本定时器的寄存器也比较少。此处用定时器4测试,TIM4初始化代码如下: void Timer4_Init( void ) { TIM4_PSCR = 0x07; //2^7=128 分频 16M/128=125K TIM4_SR = ( ~0x01 ); //清除更新中断标志 TIM4_ARR = 125; //1ms TIM4_CNTR = 0; TIM4_CR1 |= 0x01;
[单片机]
<font color='red'>STM8</font>学习笔记---定时器 TIM4功能实现
解决STM8类型单片机空间太小,使用不了printf串口打印问题
概述: 在使用STM8L101F3这款单片机时,由于它只有8K的flash,空间非常小,只要调用C库函数printf编译后整个文件很大,直接程序溢出。这也就意味着我们实现printf串口打印调试就没办法进行。既然使用不了库函数,那么我们就可以自己动手封装类似printf的函数,这样我们就可以实现数据串口打印啦。这里就直接放上我的STM8L101F3的部分源码了,希望可以给你一些参考。 源码: #include stdarg.h #include stm8l10x.h void USART_Config(void) { /*Set the USART RX and USART TX at high level*
[单片机]
解决<font color='red'>STM8</font>类型单片机空间太小,使用不了printf串口打印问题
stm8 占空比测电机速度以及显示在1602液晶显示屏上历程调试
/******************************************************************* 实验名称及内容:速度显示液晶屏 配套书籍:《深入浅出STM8单片机入门、进阶与应用实例》 实验平台及编程人员:骨灰级菜鸟 / #include iostm8s208mb.h //主控芯片的头文件 /端口/引脚定义/ #define LCDRS_SET PF_ODR|=0x01 //置位PF0 #define LCDRS_CLR PF_ODR&=0xFE //清0PF0 #define LCDRW_SET PF_ODR|=0x08 //置位PF3 #define LCDRW_CLR PF_O
[单片机]
<font color='red'>stm8</font> 占空比测电机速度以及显示在1602液晶显示屏上历程调试
STM8 测量脉宽——红外例程
实例说明: 1、本实例是利用STM8 单片机 定时器TIM1的PWM输入捕获模式测量红外遥控码。 2、红外遥控码格式为NEC红外编码。 3、红外接收信号输入接PC1(TIM1输入通道1)。 4、采用外部晶振16M。 5、采用IAR FOR STM8开发环境。 6、程序代码如下: //-------------------------------------------------------------------- #i nclude iostm8s105s4.h #define uchar unsigned char #define uint unsigned int uchar IrRecStep
[单片机]
基于IDA7.2的STM8处理器插件编写
一、创建代码工程 创建一个生成动态库的空工程。 工程属性配置 1、配置体调试信息 将D:Program FilesIDA 7.2ida64.exe添加到配置属性命令(注*此处配置是为了调试方便) 2、添加SDK路径 将IDASDK 的include、module的路径添加到配置属性C/C++常规附加包含目录 $(ProjectDir)idasdk72include $(ProjectDir)idasdk72module 3、配置预处理器定义 将__NT__、_DEBUG、_CONSOLE加到配置属性C/C++预处理器预处理器定义 4、配置输出路径和依赖库路径 4.1将D:Program FilesIDA 7.2
[单片机]
基于IDA7.2的<font color='red'>STM8</font>处理器插件编写
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved