STM32在芯片生产过程中内嵌了一段引导程序,其作用就是通过串口将程序下载到Flash中,为以后的软件更新提供了极大的便利,用户不需要利用仿真口进行下载程序,从而极大的提高了工作效率。
STM32复位之后,如果检测到Boot1引脚为低电平,boot0引脚为高电平,芯片就执行内部固话的ISP引导程序,接收来自上位机的命令和数据。整个烧录过程如下图所示:
ISP的过程:
1.芯片复位
在给STM32复位之前,首先要确定BOOT0,BOOT1引脚的状态.通过各种方式,先让BOOT0处于高电平状态,BOOT1处于低电平状态,然后在RST脚上产生一个负脉冲,STM32就能进入ISP状态.注意,复位之后,一定要延时一定的时间,让ISP程序稳定,才能发送指令和数据.
2.芯片连接
复位后,ISP程序已经处于接受连接的状态,电脑软件串口设置成1200~115200波特率,偶校验,8位数据位,1位停止位,然后发送一个0x7f,等待STM32回复。STM32的ISP程序利用这个0x7f来测试波特率,如果收到了0X79,表示连接成功了,可以进入下一步操作;否则,必须检测BOOT0,BOOT1引脚,并重新复位STM32.
dbyte(0) = &H7F
Call SendBinData(dbyte, 1, 1) '等待接收79
Lab.Caption = "连接芯片成功........" + vbCrLf
ReDim dbyte(1)
dbyte(0) = &H0
dbyte(1) = &HFF
Call SendBinData(dbyte, 2, 15) '等待接收79
For i = 0 To 14
str = str & Right("00" & Hex(Recvbuff(i)), 2) & " "
Next
Textmsg1.Text = str
Lab.Caption = Lab.Caption + "读取芯片版本成功........" + vbCrLf + "当前版本号为:" + Mid(str, 7, 2) + vbCrLf
3.读取ID版本号
发送0x020xFD.命令发送之后,需要等待STM32 ISP程序回复,如果接收到0x79,读取成功。
dbyte(0) = &H2
dbyte(1) = &HFD
Call SendBinData(dbyte, 2, 5) '等待接收79
For i = 0 To 4
str = str & Right("00" & Hex(Recvbuff(i)), 2) & " "
Next
Textmsg2.Text = str
Lab.Caption = Lab.Caption + "读取寄存器成功........" + vbCrLf + "当前寄存器版本号为:" + Mid(str, 7, 5) + vbCrLf
4.擦除芯片
发送一个双字节命令0x44+0xBB,让芯片执行擦除动作,等待回复0x79,然后再发送0xFFFF+0x00命令,让芯片招待全片擦除.如果接收到0x79,表明全片擦成功了!
5.烧录程序
全片擦除之后,就可以开始烧录程序了.首先发送双字节指令0x31+0xCE回复0x79,则继续用多字节命令(5个字节)发送一个32位的地址,此地址就是等待写入数据的地址,注意4个字节对齐.收到回复0x79之后,就可以发送N个字节数据了(注意N最大为256).重复以下过程,直到把所有代码发送出去
6.读锁定
烧录完毕之后,为了防止程序被读出,可以设置读保护.发送双字节命令0x82,~0x82,先行回复0x79,再等待一次0x79,回复成功之后,表明芯片已经被读保护了.
上一篇:51单片机复位电路详解
下一篇:STM32 内核复位 与 系统复位 区别及程序实现
推荐阅读最新更新时间:2024-03-16 16:11