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