STM32在線燒錄程序的開發

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的復位和進入引導模式,將更加方便.本人利用上面非常簡單的命令,開發了一個上位機程序,在生產過程中帶來了極大的便利.



 <梅川酷子原創>

轉自:http://bbs.ednchina.com/BLOG_ARTICLE_1969759.HTM
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章