STM32在芯片生產(chǎn)過程中內(nèi)嵌了一段引導程序,其作用就是通過串口將程序下載到Flash中,為以后的軟件更新提供了極大的便利,用戶不需要利用仿真口進行下載程序,從而極大的提高了工作效率。
STM32復位之后,如果檢測到Boot1引腳為低電平,boot0引腳為高電平,芯片就執(zhí)行內(nèi)部固話的ISP引導程序,接收來自上位機的命令和數(shù)據(jù)。整個燒錄過程如下圖所示:
?
ISP的過程:
1.芯片復位
在給STM32復位之前,首先要確定BOOT0,BOOT1引腳的狀態(tài).通過各種方式,先讓BOOT0處于高電平狀態(tài),BOOT1處于低電平狀態(tài),然后在RST腳上產(chǎn)生一個負脈沖,STM32就能進入ISP狀態(tài).注意,復位之后,一定要延時一定的時間,讓ISP程序穩(wěn)定,才能發(fā)送指令和數(shù)據(jù).
2.芯片連接
?復位后,ISP程序已經(jīng)處于接受連接的狀態(tài),電腦軟件串口設置成1200~115200波特率,偶校驗,8位數(shù)據(jù)位,1位停止位,然后發(fā)送一個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版本號
發(fā)送0x020xFD.命令發(fā)送之后,需要等待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.擦除芯片
?發(fā)送一個雙字節(jié)命令0x44+0xBB,讓芯片執(zhí)行擦除動作,等待回復0x79,然后再發(fā)送0xFFFF+0x00命令,讓芯片招待全片擦除.如果接收到0x79,表明全片擦成功了!
?5.燒錄程序
?全片擦除之后,就可以開始燒錄程序了.首先發(fā)送雙字節(jié)指令0x31+0xCE回復0x79,則繼續(xù)用多字節(jié)命令(5個字節(jié))發(fā)送一個32位的地址,此地址就是等待寫入數(shù)據(jù)的地址,注意4個字節(jié)對齊.收到回復0x79之后,就可以發(fā)送N個字節(jié)數(shù)據(jù)了(注意N最大為256).重復以下過程,直到把所有代碼發(fā)送出去
?6.讀鎖定
?燒錄完畢之后,為了防止程序被讀出,可以設置讀保護.發(fā)送雙字節(jié)命令0x82,~0x82,先行回復0x79,再等待一次0x79,回復成功之后,表明芯片已經(jīng)被讀保護了.