原创 STM32在线烧录程序的开发

2011-1-8 22:54 7374 9 14 分类: MCU/ 嵌入式

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的复位和进入引导模式,将更加方便.本人利用上面非常简单的命令,开发了一个上位机程序,在生产过程中带来了极大的便利.



 <梅川酷子原创>


 

文章评论5条评论)

登录后参与讨论

用户377235 2016-5-10 02:59

能把上位机程序发给我吗,QQ:2054425528 好人一生平安

用户377235 2015-2-5 16:20

能把上位机程序发给我吗

用户377235 2015-2-4 18:11

测试下

用户377235 2015-2-4 18:10

看看软件

用户577945 2012-11-11 10:11

能提供工具下载吗?
相关推荐阅读
用户1694343 2012-01-05 14:03
单色LCD点阵字模提取工具
单色LCD点阵字模提取工具...
用户1694343 2011-06-05 08:42
点阵汉字库生成器
  本程序是本人第一个用Microsoft C#开的第一个软件。希望能为做嵌入式的朋友带来方便。 支持以下点阵:  12点阵  16点阵支持以下取模式方式:  逐行扫描  行列扫描  逐列扫描  列行...
用户1694343 2011-03-16 21:58
图形点阵提取工具
...
用户1694343 2011-01-10 08:31
用DeflateStream和GZipStream压缩数据
System.IO.Compression 命名空间提供两个类:DeflateStream和GZipStream,这两个类都可以实现数据压缩.这两个类采用都采用Deflate算法来进行无损数据压缩,下...
用户1694343 2011-01-08 22:58
获取文件关联的图标
System.Drawing.Icon名字空间提供了一个非常简单的办法获取与文件相关联的图标,调用ExtractAssociatedIcon方法,指定文件路径就能得到一个ICON对象.此方法返回指定文...
用户1694343 2011-01-08 22:58
Outline示例代码
1.三级树Outline1->Lines->Add("Root"); for(int i=0;i<5;i++) {  int m;   m=Outline1->AddChild...
我要评论
5
9
关闭 站长推荐上一条 /2 下一条