久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5112|回復: 0
收起左側

Boot Loader應用說明—HelloM3應用筆記

[復制鏈接]
ID:337674 發表于 2018-8-31 23:23 | 顯示全部樓層 |閱讀模式
目錄 1

1、如何使用內部的Boot Loader。 2
2、通過USB DFU 方式下載程序 4
3、以串口方式升級程序 7
4、通過以太網接口升級程序 8
5、I2C 和SSI 方式下載程序 9
6、從應用程序進入Boot Loader 11
結語 13
附錄A  14

  Boot Loader 是在用戶應用程序開始運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備和軟件環境,從而將系統的軟硬件環境帶到一個合適的工作狀態,以便執行某些特定的功能。一般來說就是用來升級程序,引導程序或操作系統等。
    LM3S 系列的芯片有些具有固化在內部ROM 的Boot Loader,有些則沒有。根據芯片相應的數據手冊可以很容易的確定這個問題。通過固化在ROM 中的Boot Loader,可以通過串口(UART0)、SSI(SSI0)、I2C(I2C0)、以太網將程序下載FLASH 中,而不需要使用JTAG 調試引腳。下面我們分類討論關于Boot Loader 的幾個問題。

1、如何使用內部的Boot Loader。

  對于有內部Boot Loader 的芯片來說,可能會遇到如下的問題:
  1、使用內部的Boot Loader 有幾種接口可供升級。
  2、如何使用內部的Boot loader。
    先回答第一個問題,關于這個問題前面提到了一句,內部Boot Loader 支持串口(UART0)、SSI(SSI0)、I2C(I2C0)、以太網下載程序,但是并不支持USB DFU 和CAN 方式。
    再回答第二個問題。
    要想弄清楚如何使用內部Boot Loader,我覺的有必要先說說內部Boot Loader 是如何工作的。
  我們知道,在MCU 復位后讀取0x0000 0000 地址處的數據設置堆棧,在讀取0x0000 0004 地址的數據設置PC 值,然后用戶程序開始執行了。但是,其實在上電后任何復位內核的復位操作中,MCU內部還悄悄的執行了一些其他的操作。具體來說就是:
  1、先判斷ROM 控制寄存器(RMCTL)的BA 位(初始狀態為1)的值。如果為1,則將0x0100 0000( 內部ROM 的地址)映射到0x0000 0000 地址,如果位0 則將Flash 映射到0x0000 0000 地址。
  2、因為復位后RMCTL 的BA 位為1,所以此時是將ROM 空間映射到0 地址,執行ROM 啟動序列。 而ROM 啟動序列的第一步是將BA 位清零,將ROM 映射到0x0000 0000 地址處,將Flash 映射到0 地址出。
  3、設置好ROM 和Flash 的映射關系后就開始讀取啟動配置寄存器(BOOTCFG)的內容,如果EN 位被置位,那么就判斷指定管腳的狀態與指定極性相比較。
  4、如果指定的管腳與指定的極性相匹配則執行ROM 中的Boot Loader。
  5、如果管腳的狀態與極性不匹配,則檢查0x0000 0004 地址的內容來判斷Flash 是否已經被編程,如果該地址的數據是0xFFFF FFFF,則表明Flash 沒有被編程過,那么執行ROM 中的Boot Loader。
  6、如果0x0000 0004 地址的數據是有效的,則表明Flash 已經被編程了,那么就從0x0000 0000 處讀取堆棧指針,從0x0000 0004 處讀取PC 值,開始執行用戶程序。
    看了上述啟動序列以后我們明白了如下幾個問題:
  1、當給MCU 上電以后總是要執行ROM 中的啟動序列的。
  2、ROM 的啟動序列可以引導ROM 中的Boot Loader 的。
  3、執行內部Boot Loader 是有兩個條件的,一個是檢測到了指定引腳上的指定電平狀態,另一個是內部Flash 沒有被編過程。
  4、如果沒有設定BOOTCFG 寄存器來檢測指定引腳的電平,而Flash 已經被編程了則內部ROM 的Boot Loader 是不會再執行了,除非用JTAG 等調試接口將芯片“解鎖”。
    根據以上,我們要想讓內部ROM 里的Boot Loader 總是執行。那么最好的,可能也是唯一的方法就是給BOOTCFG 寄存器寫入特定的內容來檢測某個引腳的電平極性。通過這個引腳的電平極性匹配關系來決定是否用內部ROM 中的Boot Loader 來升級程序還是引導用戶程序。
    好了,大政方針已經確定,下面就是該討論如何付諸實施了。
   
       稍微認真看一下芯片的數據手冊,就可以得出如下的方法來給BOOTCFG 編程。以LM3S9B96 芯片為例,第一步是將BOOTCFG 的地址寫入到FMA 寄存器,然后將對ROM 內的Boot Loader 的配置 也就是要寫入BOOTCFG 的值寫入FMD 寄存器,最后給FMC 寄存器寫入相應的密鑰(LM3S9B96 的密 鑰為0xA442)和確認位。相應的例程可能會是這個樣子的:

//write the BOOTCFG flash register to enable PA1 low to enable the ROM boot loader at power on

unsigned long regVal;

regVal = HWREG(0x400FE000 + 0x1D0); //BOOTCFG

if (regVal & 0x80000000)   //committed yet?

{

    HWREG(0x400FD000 + 0x000) = 0x75100000; //FMA=BOOTCFG "address"

    HWREG(0x400FD000 + 0x004) = FLASH_BOOTCFG_PORT_A | FLASH_BOOTCFG_PIN_1 | FLASH_BOOTCFG_DBG1; //FMD=BOOTCFG

    value (PB5 low/DBG enabled)

    HWREG(0x400FD000 + 0x008) = 0xA4420008; //FMC=key+commit

     SysCtlDelay(100 * SysCtlClockGet() / (3 * 1000));

}

   在第一次給芯片寫程序的時候將這段代碼加到程序的開始部分,當程序運行的時候會首先開啟內部的Boot Loader,這樣以后下載程序的時候就可以不需要調試接口來下載程序了,當然相關的頭文件還是要包含進來的。
   下面對程序做一下簡要的說明:
   首先定義一個unsigned long 型的變量,然后讀取當前BOOTCFG 寄存器的值,并判讀它的最高為是否為1,如果為1 則表明BOOTCFG 沒有被提交過,也就是說還沒有設定好每次都從內部ROM 中的Boot Loader 啟動,那么就要對BOOTCFG 配置,否則就是已經配置好了BOOTCFG,則不需要重新配置了。
   對BOOTCFG 寄存器內容提交的過程是這樣的,首先要將FMA 寄存器的值放入提交BOOTCFG 寄存器的地址,即0x7510 0000,有人可能會對0x7510 0000 這個地址有疑惑,為什么不是0x400FE1D0這個地址呢,根據數據手冊中內部存儲器那一章的非易失性存儲器的編程那一句里所講,里面列出了一個表格,指出如果要提交BOOTCFG 寄存器,那么FMA 寄存器里的值應該是0x7510 0000,而他的數據源則是FMD,也就是說把要寫入BOOTCFG 寄存器的值放到FMD 寄存器中。
   If 語句的第二句就是配置FMD 的值的,采用了很直觀的方式配置,最后已經就是寫入對BOOTCFG編程的密鑰和確認信息了。
   至此,對內部Boot Loader 的配置已經完成了,應用的時候,首先給指定的管腳加上指定的電平極性,然后啟動就會進入Boot Loader,此時通過前面說過的串口連接電腦就可以用LM FlashProgrammer 來對MCU 進行下載程序了。至于下載程序的方法和后面的要將的類似,如果不太明白的話可以參考后面的內容。
   有個問題需要單獨說明一下:當使用ROM 中的Boot Loader 時,系統時鐘使用的是內部的振蕩器,它的頻率是16MHz(±1%)。之所以要提這個問題,是因為以串行方式燒寫程序的時候(包括UART,I2C,SSI)。它們通信都是要一定的速率的,如果超過了可能沒有辦法正確執行。
   使用UART 接口的時候,系統時鐘不能低于UART 速率的32 倍,換句話說也就是UART 的速率不能超過500K(16M / 32)。使用SSI 接口的時候系統時鐘不能低于SSI 的12 倍,也就是SSI 的速率不能超過1.3M(16M / 12)。I2C 稍微有點特殊,根據數據手冊上說,它可以運行在100K 和400K  的速 率模式下,因此,它的最高速率是400K 。順便提一句,使用串行方式的時候一般都有類似主從的概念,Boot Loader 通常都運行在從機模式下,I2C 在從機模式下使用的默認地址是0x42。

2、通過USB DFU 方式下載程序

    對于沒有內部Boot Loader 的芯片來說,那么你用起來相對來說就不需要考慮那么多了,安安心心的把Boot Loader 下載到Flash 里運行吧。
    要說明的是內部的Boot LoadeR 不支持USB DFU。要想使用USB DFU 的方式來升級程序不管內部ROM 中有沒有Boot Loader 都得把他下載到Flash 中。
    使用USB DFU 下載程序的方式如下:
    首先打開boot_usb  目錄下面的工程文件。打開bl_config.h 這個文件,看清楚里面的配置,這里面的配置起著至關重要的決定。它的每一行都有很長的英文解釋。要做的就是記住APP_START_ADDRESS 定義的值,它關系到將來應用程序的下載地址的修改。然后把ENABLE_UPDATE_CHECK 的這個定義給使能,接著使能FORCED_UPDATE_PERIPH、 FORCED_UPDATE_PORT、FORCED_UPDATE_PIN、FORCED_UPDATE_POLARITY、FORCED_UPDATE_WPU這幾個的定義。這幾個定義分別定義了要檢查是否升級的引腳的端口模塊、端口、引腳序號、匹配電平類型和上下拉電阻。完成之后就可以編譯并下載程序到MCU 了。
    完成以上步驟之后,用一根USB 線將開發板和電腦的USB 線相連,將bl_config.h 中設定的引腳給定升級所需要的電平,重啟開發板。如果之前沒有安裝過USB DUF 的驅動那么需要先安裝USB DFU的驅動,該驅動所在位置為“光盤目錄/tools/windows_drivers ”。安裝好驅動之后在設備管理器中應該能發現如圖1 所示的設備:
0.png
                        圖1  安裝好USB DFU 驅動后出現的設備
    當發現該項不正常的是需要重新安裝驅動確保驅動正確安裝。安裝好驅動之后打開LM Flash Programmer 軟件(這個軟件的安裝包在“關盤目錄/tools/LMFlashProgrammer”下面,也可以在TI或流明官網去下載),會在configuration 選項卡里的Interface 一欄的下拉菜單中找到USB DFU 這一項,選擇該項之后Select Device 里面會出現一個設備,如圖2 所示:
0.jpg
                             圖2  LM Flash 中的USB DFU
    如果后面沒有出現設備,可以重啟開發板并點Refresh 這個按鈕試試。如果能正確的走到這一步, 說明可以通過USB DFU 方式下載程序了。下載的方法是點LM 的第二個選項卡Program,在Select .binfile  中通過Browse 尋找要燒寫的.bin 文件。特別要注意的是Program Address Offset 后面的值,該值代表的是燒寫的程序的起始地址。前面我們已經說過,還記得bl_config.h 中的APP_START_ADDRESS
  
  這個定義嗎,它就是定義的用戶程序的起始地址,因此,此處一定要填寫bl_config.h 定義的這個值。 上面兩個是校驗和編程完畢后重啟MCU,隨你怎么選擇,我是都選上了。相關圖片如圖3 所示:
0.jpg
                          圖3   USB DFU 燒寫程序的設置
   設置完畢之后點擊Program 就開始對MCU 編程了。一般來說編程和校驗是不會有問題的。最多的問題還是出在應用程序中。在應用程序中要修改它的起始地址,具體來說就是將連接問的首地址改為bl_config.h 中定義的地址,此處為0x1800。修改的方法如下:
1、KEIL RMDK 環境中
   修改的方法是在需要修改的工程的Options 的Linker 選項卡中,去掉Use Memmory Layout…前面的復選框中的勾,然后點擊Scatter File 后面的Edit 來編輯該工程的分散加載文件。如圖4 所示:
0.jpg
                              圖4   修改分散加載文件
   點擊Edit 之后在彈出的分散加載文件,一般是下面的樣子的,如圖5 所示:
    0.jpg
      將其中用紅色方框標出來的兩個值都改為0x0000 1800,然后重新編譯即可生成USB DFU 下載或用其他(非內部ROM 中的)Boot Loader 下載程序所需的bin 文件。
2、在IAR 環境中
   IAR 的分散加載文件是以.icf 為后綴的文本文件,這個文件存放的位置一般在工程的根目錄下面,如果沒有的話,可以在工程上右擊選擇Options,然后再點擊Linker,就會出現icf 文件所在的地址了。如圖6 所示:
0.png
                            圖6   IAR 分散加載文件的地址
   因為IAR 只能用外部的記事本或其他的文本編輯器打開,所以這里點擊Edit 是沒有用的( 目前我的版本是這樣的),用記事本或其他文本編輯器打開這個文件之后修改Flash 定義的那條語句,如下圖所示:
0.jpg
                               圖7  IAR 要修改的地方
   將紅色方框中的值修改為bl_config.h 中定義的值,比方說0x0000 1800。然后重新編譯即可下載到單片機了。
   如果沒有使用內部ROM 中的Boot Loader 則它在MCU 復位的時候首先執行,判斷定義的管腳是 否符合相應的電平,來確定是否需要給程序升級。如果是的話就會初始化USB 等外設,然后等待電 腦往Flash 里下載程序,否則的話就直接引導應用程序運行。
3、以串口方式升級程序

    無論是放在ROM 中還是Flash 的Boot Loader 都支持以串口的方式下載程序。在第一節里已經明確的講了內部ROM 中的Boot Loader 是如何運行的。無論是執行內部ROM 中的Boot Loader 還是執行Flash 中的Boot Loader 用串口來升級程序。它們執行的原理都是差不多的,都是先檢查預先定義好的管腳電平(ROM 中的Boot Loader 也可能是檢查空片),然后確定是否需要升級應用程序。當檢測到了升級的條件就會設置串口及其他的外設,然后等待電腦的串口發送命令或數據。
    無論你的電腦上用的是自帶的串口還是用USB 轉的串口,只要有就可以用LM Flash Programmer下載應用程序。首先打開LM Flash Programmer,在configuration 選項卡里的Interface 一欄里選擇Serial(UART),點擊后面的Device Manager 按鈕,在彈出的設備管理器里查看要使用的串口是哪一個,比方說我用的是USB 轉的串口。如下圖所示:
0.png
                                 圖8  我電腦上的串口
    所以在端口配置的時候COM Port:應該選擇COM1,波特率應該選擇你芯片上實際配置串口的波特率,如果是Boot Loader 里面配置了自動適應波特率的話,則Disable Auto Band Support 前面的復選框應該去掉。如果波特率是定死的話則應該勾選該項,然后再Band Rate:一項里選擇相應的波特率。順便提一句,如果芯片是空片,而且BOOTCFG 寄存器沒有被修改過,此時的執行內部BootLoader 的時候波特率是自動適應的。至于最后一個Transfer Size 采用默認的即可。例如我的串口配置情況是這樣的:
0.jpg
                                圖9  我的串口配置情況
    配置好串口之后,就可以在Program 選項卡里選擇要下載的程序和要下載程序的地址了。如下圖所示:
0.jpg
                                 圖10   下載程序界面
                                 
                                 
    這個界面和之前的USB DFU 方式下載程序差不多,和后面要講的下載方式也類似。就不做過多介紹了,但是有一點要著重說明一下。那就是下載地址的問題。
   通過ROM 或Flash 中下載程序的時候,這個下載地址是不一樣的。在ROM 中運行Boot Loader的時候可以視為Flash 是空的,下載地址應該是0x0(要是這個地址上你放了別的東西如boot_usb,此時就另當別論了),如果用的是Flash 里的Boot Loader,因為你的Boot Loader 已經在0x0 這個地址上了,如果你不想把這個Boot Loader 覆蓋掉的話(更新Boot Loader 除外)那么你就應該把這個地址設定為bl_config.h 中APP_START_ADDRESS 設定的程序起始地址:比如說0x1800。這個要根據實際情況靈活運用,一般來說如果用ROM 中的Boot Loader 則該地址為0,如果是Flash里的Boot Loader則該地址為bl_config.h  中設定的值。

4、通過以太網接口升級程序

    ROM 中的Boot Loader 也支持以太網接口的方式升級程序,當然Flash 中的也支持。下面就來說一說如何通過網口來升級程序。
    通過網口升級程序有兩個問題要說明一下:
    1、地址問題:通過網口下載程序,應用程序的地址根據是ROM 的中的Boot Loader 還是Flash中的Boot Loader 會有所區別。如果是ROM 中的Boot Loader,下載到Flash 的地址必須是從0 開始的,這個不能改變。因此編譯應用程序的時候,SCT 或ICR 中的地址要設置為0。如果是用的Flash中的Boot Loader 則下載地址位bl_config.h 中APP_START_ADDRESS 定義的地址,一般是0x1800。
    2、也是地址問題,不過和第一個的地址不是同一類型的地址,這個地址問題指的是芯片的MAC地址。我們知道,以太網通信有兩個重要的地址IP 地址和MAC 地址。MAC 地址指的就是網卡的物理地址。如果使用內部ROM 中的Boot Loader 的話,這個MAC 地址是放在USER0/USER1 中的,它們的格式是U0B0-U0B1-U0B2-U1B0-U1B1-U1B2,這里的U0B0 指的是USER0 的7:0 位,也可以說是Byte 0,U0B1 指的是USER0 的15:8 位,也可以說是Byte 1,其他的依此類推。但是有一個重要的問題,就是如果沒有設置USER0/USER1 的時候,MAC 地址的默認值為00-1a-b6-00-64-00,這個一定要記住。也就是說使用ROM 中的Boot Loader 下載程序的時候是不能把芯片MAC 地址設為 FF-FF-FF-FF-FF-FF 的。而如果使用的是Flash 中的Boot Loader 的話,則芯片的MAC 地址可以是全F, 也可以是bl_config.h 中指定的地址。
    下面就來看看如何使用LM Flash Programmer 通過網口來下載程序:
    首先,將電腦和開發板的網口連接,然后打開開發板電源。
    接著打開LM Flash Programmer,在第一個選項卡configuration 里的Interface 里面選擇Ethernet,在下面的Ethernet Adapter 里面選擇和開發板相連的網口,然后在Client IP Address 里面填寫和該網卡的IP 地址在同一個網段內的其他IP 地址,在Client MAC Address 里面填寫相應的MAC 地址:如果用的是ROM 中的Boot Loader而且之前沒有對USER0/USER1修改過的話此處填寫芯片默認的MAC地址00-1a-b6-00-64-00,否則填寫修改過的MAC 地址。如果用的是Flash 里的Boot Loader 而且在bl_config.h 中沒有設置MAC 地址,此處可填寫全F,格式同前面的格式。相關圖片請參考圖11.1和圖11.2。
0.jpg
    在第二個選項卡Program 里選擇要下載的BIN 文件,我們注意到,這里的Options 是灰色的,下載程序的地址是無法修改的。在寫應用程序的時候注意連接地址下載就沒有問題。當使用以太網接口下載或升級程序的時候,LM Flash 會用到BOOTP 和TFTP 協議,它們和正常的以太網環境共存不會造成任何問題(當然會占用一點點的帶寬),它們使用的都是標準的協議。BOOTP協議用來確定服務器端和客戶端的IP 地址,以及固件的映像名稱,它使用UDP/IP 數據包在服務器和客戶端通信。TFTP 也使用UDP/IP 數據包在服務器和客戶端通信,它將固件的映像傳遞給客戶端。這里的客戶端指的就是Boot Loader。
5、I2C 和SSI 方式下載程序

   前面介紹了幾種通過LM Flash Programmer 下載程序的方法,這一節將要介紹的是通過I2C 和SPI接口來下載程序的方法。之所以要把他們列在一起來說是因為它們有這么幾個共同點:
   1、都是串行方式發生和接收數據
   2、使用相同的串行協議(事實上,UART 使用的也是這樣的協議)
   3、它們在電腦上沒有相應的接口,不能用LM Flash 來下載。只能通過一個芯片給另一個升級。
   基于以上幾種原因,我把這兩個綜合起來將,只是大概講講它們通信的過程。通信就包括發送和接收數據包。
   發送數據包的過程:
   1、先發送要發送的包的大小,它的值時整個數據數據部分的長度+2 個字節。
   2、發送數據部分的校驗和。
   3、發送數據部分。
   4、等待一個應答信號,確認對方是否正確接收到了數據。
   接收數據包的過程:
   1、等待接收一個非零的數據。這非常重要,因為設備(從機)會在發送和接收一個數據之間發送一個零字節。第一個接收到的字節表示將要接收的數據包的大小。
   2、接收第二個字節,該字節代表的是將要接收到的數據的校驗和。
   3、接收剩余的數據,長度為包的大小(即接收到的第一個字節) – 2 個字節。比方說第一個字節接收到的是3,那么實際上接收到的數據部分長度為3-2=1。
    4、計算接收到的數據部分的校驗和,和接收到的校驗(也就是第二個字節)和是否相吻合,
    5、如果校驗和正確的話則返回(ACK)信號,否則返回(NAK)信號。告訴主機是否正確的接收到了數據。
   以上兩個過程大致描述了主機和從機是如何通信的,但是這個只是實際的數據包的通信過程, 事實上主機在給從機發送數據包之前都會先發送一個命令字節。命令字節及其代表的含義如下:

    COMMAND_PING           該命令長度是一個字節,用來從Boot Loader 接收一個字節,表明它
    =0x20                  們成功建立了通信。它的格式是這樣的:
                           unsigned char ucCommand[1];
                           ucCommand[0] = COMMAND_PING;
    COMMAND_DOWNLOAD       該命令的長度為9 個字節,用來告訴Boot Loader要把數據放到哪里,
    =0x21                  共有多少數據。該命令共包含了兩個32 位的值,都是先發送MSB。
                           該命令同時還會擦除一段Flash 空間,因此會導致發送ACK/NAK  的
                           時間會延長,所以它的后面要跟一個COMMAND_GET_STATUS 命令,
                           確保命令成功執行。
                           該命令的格式是這樣的:
                           unsigned char ucCommand[9];
                           ucCommand[0] = COMMAND_DOWNLOAD;
                           ucCommand[1] = Program Address [31 : 24];
                           ucCommand[2] = Program Address [23 : 16];
                           ucCommand[3] = Program Address [15 : 8];
                           ucCommand[4] = Program Address [7 : 0];
                           ucCommand[5] = Program Size [31 : 24];
                           ucCommand[6] = Program Size [23 : 16];
                           ucCommand[7] = Program Size [15 : 8];
                           ucCommand[8] = Program Size [7 : 0];
    COMMAND_RUN            該命令告訴Boot Loader 轉到某一個地址開始執行。該命令包含一個
    =0x22                  32 位的值,表示要轉到的地址,先發送MSB。
                           該命令的格式是這樣的:
                           unsigned char ucCommand[5];
                           ucCommand[0] = COMMAND_RUN;
                           ucCommand[1] = Run Address[31 : 24];
                           ucCommand[2] = Run Address[23 : 16];
                           ucCommand[3] = Run Address[15: 8];
                           ucCommand[4] = Run Address[7 : 0];
    COMMAND_GET_STATUS     該命令返回最后一個命令執行的狀態,一般來說每發送一個命令都
    =0x23                  要跟隨這么一個命令確定上一個命令是否被正確執行等。Boot
                           Loader 發送的相應包含當前狀態的一個字節的數據包。
                           它的格式是這樣的:
                           unsigned char ucCommand[1];
                           ucCommand[0] = COMMAND_GET_STATUS;
                           返回的狀態包括如下幾種:
                           COMMAND_RET_SUCCESS
                           COMMAND_RET_UNKNOWN_CMD
                           COMMAND_RET_INVALID_CMD
                           COMMAND_RET_INVALID_ADD
                           COMMAND_RET_FLASH_FALL
     COMMAND_SEND_DATA     該命令跟隨在COMMAND_DOWNLOAD,如果數據很多也可以跟隨
     =0x24                 在另一個COMMAND_SEND_DATA 命令之后,如果連續發送數據則
                           數據的地址會遞增,并且續傳之前編程的位置。它每次最多傳輸252
                           個字。調用該命令之前應該先調用COMMAND_GET_STATUS 命令,
                           以確保數據成功編入Flash 中。如果Boot Loader 返回了一個NAK 信
                           號,則它不會增加當前的地址,允許之前的數據重新發送。
                           他的格式大概是這樣的:
                           unsigned char ucCommand[9];
                           ucCommand[0] = COMMAND_SEND_DATA;
                           ucCommand[1] = Data[0];
                           ucCommand[2] = Data[1];
                           ucCommand[3] = Data[2];
                           ucCommand[4] = Data[3];
                           ucCommand[5] = Data[4];
                           ucCommand[6] = Data[5];
                           ucCommand[7] = Data[6];
                           ucCommand[8] = Data[7];
     COMMAND_RESET         該命令告訴Boot Loader 復位。當下載成功后需要重啟以執行新的程
     =0x25                 序的時候發送該命令。當然如果下載不成功想要重啟也是可以的。
                           總之,Boot Loader 接收到該命令后就會啟動一個正常的啟動序列。
                           從機在啟動復位序列之前會向主機返回一個ACK 信號。表明命令正
                           確接收,將要進入復位序列。
                           他的格式大概是這個樣子的:
                           unsigned char ucCommand[1];
                           ucCommand = COMMAND_RESET;
     雖然我建議你沒事不要亂改上面定義的命令,但是如果你知道你想干什么的話,想要修改增加或刪除命令的話,它們在boot_loader/bl_command.h 中,它們是Stellaris Peripheral Driver Library  的 一部分。

6、從應用程序進入Boot Loader

    在應用程序中你可以隨時調用一個函數進入到Boot Loader,想想這個有多么誘人吧。你放說你的產品外面只有一個串口接出來,其他的都封裝起來了,但是你還想日后可能會給你的產品升級。 這個時候你可以通過給串口發送一個特定的命令使內部的Boot Loader 通過這個串口來給你的產品升級程序。
    要想使應用程序能夠跳到Boot Loader 中執行升級程序,它必須具備一個Boot Loader,無論是ROM 中固化的還是Flash 中的。最常見的就是通過USB、以太網和串口來升級程序,但是也可以通過I2C 和SSI 來升級程序。和前面講的一樣,ROM 中的Boot Loader 不支持USB 的方式。
    先說說如何使應用程序進入Flash 中的Boot Loader 執行程序。首先要將Boot Loader 燒如0 開始的Flash 空間,然后把應用程序燒如到Boot Loader 的bl_config.h 中APP_START_ADDRESS 所定義的地址。這樣可以由Boot Loader 引導應用程序。應用程序中包含有跳轉到Boot Loader 的代碼,通過外部給它的特殊命令、屏幕操作、按鍵,,,隨你怎么操作,只要你能執行到這個跳轉函數它就會跳到Boot Loader 中運行。一個示例性的代碼可能會是這個樣子的:
  1.      //*****************************************************************************
  2.      //
  3.      // Passes control to the bootloader and initiates a remote software update.
  4.      //
  5.      // This function passes control to the bootloader and initiates an update of
  6.      // the main application firmware image via UART0, Ethernet or USB depending
  7.      // upon the specific boot loader binary in use.
  8.      //
  9.      // \return Never returns.
  10.      //
  11.      //*****************************************************************************
  12.      void
  13.      JumpToBootLoader(void)
  14.      {
  15.           //
  16.           // We must make sure we turn off SysTick and its interrupt before entering
  17.           // the boot loader!
  18.           //
  19.            SysTickIntDisable();
  20.            SysTickDisable();
  21.           //
  22.           // Disable all processor interrupts.   Instead of disabling them
  23.           // one at a time, a direct write to NVIC is done to disable all
  24.           // peripheral interrupts.
  25.           //
  26.            HWREG(NVIC_DIS0) = 0xffffffff;
  27.            HWREG(NVIC_DIS1) = 0xffffffff;
  28.           //
  29.           // Return control to the boot loader.    This is a call to the SVC
  30.           // handler in the boot loader.
  31.           //
  32.            (*((void (*)(void))(*(unsigned long *)0x2c)))();
  33.      }
復制代碼



     這段代碼是直接從TI 提供的例程里摘出來的。太多詳細代碼的分析不屬于本文的內容,有興趣的可以自己去研究一下。根據其注釋可以很清楚的知道,進入該函數后首先關閉systick 及其中斷, 然后關閉所有的中斷,最后跳到了Boot Loader 的SVC  中斷處理函數(注意,不是應用程序的SVC  中 斷)中執行了。再看看Boot Loader 的SVCall  中斷處理函數做了寫什么呢,在源代碼中分析,我們發 現是它引導了Boot Loader 的運行,首先把Boot Loader 復制到SRAM  中,然后跳到SRAM  中初始化 bl_config.h 中所配置的硬件信息,然后就是等著LM Flash Programmer 來升級程序了。
      如果芯片有內置的Boot Loader 的話,應用程序也可以執行ROM 中的Boot Loader 來升級應用程序。但是內部ROM 中的Boot Loader 不支持USB。
      和執行Flash 中的Boot Loader 有所不同,具體來說表現在以下兩個方面:
      1、鏈接時的起始地址不同。我們知道,Flash 中的Boot Loader 要占用一定的Flash 空間,所以應用程序鏈接的起始地址是定義在bl_config.h 中的APP_START_ADDRESS 這個地址。而ROM 中的Boot Loader 不占用Flash 空間,這時候應用程序是從0 地址開始的。
      2、如何執行Boot Loader 的問題。如果Boot Loader 在Flash 中,0x2C 代表的是Boot Loader 的中斷向量。如果Boot Loader 在ROM 中則0x2C 代表的是應用程序的中斷向量。
     應用程序執行ROM 中的Boot Loader,上述函數中最后一句是不對的,應該修改為ROM 中執行Boot Loader 的入口,也就是調用ROM_UpdateEthernet、ROM_UpdateI2C、ROM_UpdateSSI、ROM_UpdateUART 這幾個函數,它們的定義在Rom.h  中。
      有關應用程序調用Boot Loader 有幾個問題,現在總結一下應用程序調用Boot loader,包括前面可能講過的,也有沒講過的。
      1、調用Flash 中的Boot Loader 注意修改程序的開始地址為Boot Loader bl_config.h 中的地址。
      2、調用ROM 中的Boot Loader 注意修改程序的開始地址為0。
      3、調用ROM_UpdateI2C、ROM_UpdateSSI、ROM_UpdateUART 和ROM_UpdateEthernet 不同。前三個函數沒有參數,而以太網的應該寫作ROM_UpdateEthernet(ROM_SysCtlClockGet());
     4、應用程序通過以太網升級的時候,必須在應用程序里配置好網口,并且MAC 地址已經被編程而且正在使用。(注:此時的MAC 地址可以全是F,只要IP 地址在同一網段內即可)。

結語

     好了,關于Boot Loader 的問題就介紹這么多了。不同的項目中可能用法也會有所不同,剛開始可能大家都是先看懂TI  的例程,然后慢慢修改,摸索出適合自己項目的Boot Loader,最后慢慢融會貫通,使用起來就能隨心所欲了。這個不是一篇文章看了就能全懂的。
        

BootLoader應用說明.pdf

577.56 KB, 下載次數: 9, 下載積分: 黑幣 -5

Bootloader應用說明

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级大片| 高清成人av | 久久久精品国产 | 夜夜爽99久久国产综合精品女不卡 | 在线日韩| 久久精品视频在线播放 | 欧美free性| 一级片在线观看 | 高清免费在线 | 欧美成人精品一区二区男人看 | 欧美www在线 | 亚洲美女一区 | 久久爱综合 | 亚洲精品日韩视频 | 色.com| 国产7777| 久久人爽 | 欧美日韩国产高清 | 天天看天天摸天天操 | 日韩成人在线网站 | 日韩欧美成人精品 | 91伊人| 亚洲欧美日韩电影 | 欧美黄色一区 | 精品久久久久久亚洲精品 | 欧美精品一区久久 | 欧美在线一区二区视频 | 91视频进入 | 黑人精品欧美一区二区蜜桃 | 国产精品久久久久久久久久软件 | 国产毛片久久久 | 免费观看一区二区三区毛片 | 精品久久久久久久久久久久久久 | 国产一区不卡 | 69av在线视频| 欧美精品一区二区三区在线播放 | www.嫩草 | 成人在线免费观看 | 欧美中文字幕一区二区 | 懂色tv| 国产日韩精品在线 |