STM32在线烧录程序的开发
STM32在线烧录程序的开发
2013年03月10日 17:07:38 vishtvro 阅读数 2515
STM32在线烧录程序的开发<梅川酷子原创>
STM32在芯片生产的阶段固化了一段引导程序,其作用是通过USART1接口下载程序FLASH中.这给生产带来了极大的便利,用户不需要通过JTAG/SWD接口就能轻松下载程序,提高了生产效率.
STM32复位之后的4个时钟周期内,如果检测到BOO1引脚为低电平,BOOT0脚为高电平的话,芯片就会执行内部固化的ISP引导程序,接受来自USART的命令和数据.
下面简单介绍一下几种命令,有了这几种命令,就可以通过上位机在线烧录STM32芯片了.命令代码是VB.NET语言写的.
1.单字节命令
单字节命令只需一个字节,如连接命令0x7f.
Private Sub SendBytes(ByVal byt As Byte)
Dim Buffer(2) As Byte
Buffer(0) = byt
Serial.Write(Buffer, 0, 1)
End Sub
2.双字节命令
双字节命令由两个字节组成,第一个字节是命令,第二个字节是它的反码.如解除读保护命令是:0x92,~0x92(~表示反码).
Private Sub SendByteWithChecksum(ByVal byt As COMMAND_BYTE)
Dim XOR_Byte(2) As Byte
XOR_Byte(0) = byt
XOR_Byte(1) = Not byt
Serial.Write(XOR_Byte, 0, 2)
End Sub
3.多字节命令
多字节命令用来发送数据.STM32最多能接受一次256字节的数据,但由于一个8位变量最大值是255,故命令的第一个字节是实际发送数据长度N减一.接下来是N个字节的数据,最后是一个异或校验值,此值是包括长度字节在内,不包括校验值本身的异或值.
Private Sub SendDataWithChecksum(ByVal Buffer() As Byte, ByVal Count As UInt16)
Dim Temp(2) As Byte
Dim XorByte As Byte
Dim i As Integer
XorByte = 0
XorByte = XorByte Xor CByte(Count - 1)
For i = 0 To Count - 1
XorByte = XorByte Xor Buffer(i)
Next
Temp(0) = CByte(Count - 1)
Temp(1) = XorByte
Serial.Write(Temp, 0, 1)
Serial.Write(Buffer, 0, Count)
Serial.Write(Temp, 1, 1)
End Sub
发送一个地址的函数
Private Sub SendLongWithChecksum(ByVal Dat As UInt32)
Dim Buffer(5) As Byte
Dim XorByte As Byte
Dim i As Integer
Buffer(0) = CByte((Dat >> 24) And 255)
Buffer(1) = CByte((Dat >> 16) And 255)
Buffer(2) = CByte((Dat >> 8) And 255)
Buffer(3) = CByte((Dat) And 255)
XorByte = 0
For i = 0 To 3
XorByte = XorByte Xor Buffer(i)
Next
Buffer(4) = XorByte
Serial.Write(Buffer, 0, 5)
End Sub
下面简单介绍一下ISP的过程.
1.芯片复位
在给STM32复位之前,首先要确定BOOT0,BOOT1引脚的状态.通过各种方式,先让BOOT0处于高电平状态,BOOT1处于低电平状态,然后在RST脚上产生一个负脉冲,STM32就能进入ISP状态.注意,复位之后,一定要延时一定的时间,让ISP程序稳定,才能发送指令和数据.
2.连接芯片
复位并延时一定时间(100ms就够了)后,ISP程序已经处于接受连接的状态,电脑软件串口设置成1200~115200波特率,EVEN校验,8位数据位,1位停止位,然后发送一个0x7f,等待STM32回复.STM32的ISP程序利用这个0x7f来测试波特率,如果收到了0X79,表示连接成功了,可以进入下一步操作;否则,必须检测BOOT0,BOOT1引脚,并重新复位STM32.
3.解除读保护(如果有需要的话)
如果芯片已经设置过读保护功能,则必须解除读保护,才能写新的程序进去.发送0x92,~0x92.命令发送之后,需要等待STM32 ISP程序回复,如果接收到0x79,表明已经成功解除读保护.在烧录程序之前,必须重新发送0x7f命令进行重新连接,操作方法看"2.连接芯片".
4.全片擦除
发送一个双字节命令0x43,~0x43,让芯片执行擦除动作,等待回复0x79,然后再发送0xff,~0xff双字节命令,让芯片招待全片擦除.如果接收到0x79,表明全片擦成功了!
5.烧录程序
全片擦除之后,就可以开始烧录程序了.首先发送双字节指令0x31,~0x31,如果回复0x79,则继续用多字节命令(5个字节)发送一个32位的地址,此地址就是等待写入数据的地址,注意4个字节对齐.收到回复0x79之后,就可以发送N个字节数据了(注意N最大为256).重复以下过程,直到把所有代码发送出去
for(...)
{
发送:0x31,~0x31
发送:WW ,XX ,YY ,ZZ ,异或值(注意,32位地址必须先发送最高字节)
发送:(n-1),d0,d1,...,d(n-1),异或值
}
6.读锁定
烧录完毕之后,为了防止程序被读出,可以设置读保护.发送双字节命令0x82,~0x82,先行回复0x79,再等待一次0x79,回复成功之后,表明芯片已经被读保护了.
常用的命令就些,还有其它一些命令,可以参考STM32官方的应用笔记.另外,可以通过电脑的DTR和RTS脚来控制STM32的复位和进入引导模式,将更加方便.本人利用上面非常简单的命令,开发了一个上位机程序,在生产过程中带来了极大的便利.
STM32在线烧录程序的开发相关推荐
- 对Keil在线烧录程序弹出“The firmware of the connected J-Link[SN:xxxxxxxx] does not support......的问题解决
问题:最近下载并使用Keil_v5.29,在线烧录程序时出现"The firmware of the connected J-Link[SN:xxxxxxxx] does not suppo ...
- FlyMcu给STM32一键烧录程序
在此之前你需要有一个RS串口转接电路,其中DTR和RTS是必须的,目的为了实现一键下载准备,做为BOOT0电平置高电平,才能将STM芯片引导到串口烧录程序,推荐一个典型的串口一键下载电路,大家可自行优 ...
- 小程序云开发用买云服务器吗,小程序云开发要买服务器吗
小程序云开发要买服务器吗 内容精选 换一换 简要介绍BreakDancer是一个C++软件包,可提供下一代配对末端测序读取的全基因组结构变异检测.它包括两个补充程序,BreakDancerMax预测五 ...
- STM32休眠后不能烧录程序
STM32 原因:程序逻辑有误导致休眠后不能唤醒,不能烧录程序. 解决: 通常的解决办法是:一般的开发板或单片机最小系统都会有复位键,按住复位键,点下载,然后松开复位键即可. 1.可以将单片机的NRS ...
- 嵌入式IAP开发笔记之一:面向STM32的BootLoader程序
对于很多人来说,BootLoader并不是一个陌生的词,甚至会经常用到它.因为在很多情况下我们都需要BootLoader程序,比如我们需要对系统在线升级时就需要它,还有当我们需要在外部存储器中运行程序 ...
- 学习笔记 02:关于在某宝上面购买的stm32f103c8t6最小系统开发板如何使用USBtoTTL模块烧录程序的记录
前言 最近在学习用stm32制作,于是乎在某宝上面买了一个最小系统.我身边因为没有STLink.JLink等烧录器.无法烧录,痛苦面具的我差点就要去买一个烧录器,好在突然想起我之前搞蓝牙调试的时候有一 ...
- STM32 如何通过 USB 烧录程序
搭载STM32F103C8 核心的 STM32 开发板由于其 ARM Cortex M3 架构而越来越受欢迎,它具有较高的运行速度和更多的外设选项.此外,由于该板可以使用 Arduino IDE 轻松 ...
- stm32烧录软件_stm32怎么烧录程序
STM32烧录程序目前笔者知道的有三种:JLink ,Ulink和串口烧录,使用工具分别为:JLink,ULink以及USB转TTL线. ULink 烧录程序 在安装MDK过程中,会有提示是否安装驱动 ...
- 程序员开发了自己的产品怎样推广?说一说我的免费在线客服系统推广经验
就像没有一个画匠不想办一场属于自己的画展,没有一个歌者不想写一首自己的歌. 也许只有为数不多的听众,但是当他怀疑自己时,还是会有忠实的听众支持他继续走下去. 我在业余时间开发维护了一款在线客服系统,一 ...
最新文章
- FPGA逻辑设计回顾(9)DDR的前世今生以及演变过程中的技术差异
- HCNA多区域OSPF配置
- 【Flutter】StatefulWidget 组件 ( Image 组件 | TextField 组件 )
- Unity C# Sting.Format的学习
- 如何debug 右键菜单执行逻辑 - Test BSP Application page implementation
- IOS15打包静态库
- 在Matlab命令窗口中执行,交互式命令操作就是在MATLAB命令行窗口中输入命令并执行。...
- C# WPF文本框TextEdit不以科学计数法显示
- uva 10594(最小费用最大流)
- bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘(BFS)
- 云栖科技评论世界杯特刊:俄罗斯世界杯,新技术再一次升级内容产业
- 和opengl的关系_从零开始的图形学学习(零):一切的开始 —— 自建OpenGL开发框架...
- 【干货分享】如何使用英文字体做出高逼格的杂志封面
- 分享]基于Web开发资料专集
- 移动200/300M网速只有最高5M/s(3G太快了),提高网速的办法和具体处理方式
- 大佬用python写了个豆瓣短评爬虫,有你喜欢的电视试试吗
- Java代码实现非对称加密RSA算法示例
- 通过jstack分析cpu问题
- 用计算机弹有点甜乐谱,《汪苏泷 - 有点甜,钢琴谱》汪苏泷(五线谱 钢琴曲 指法)-弹吧|蛐蛐钢琴网...
- 微信公众平台企业号验证接口、回调 PHP版