• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 牛人業話 > STM32 IAP功能實現學習筆記

    STM32 IAP功能實現學習筆記

    作者: 時間:2016-09-27 來源:網絡 收藏

      最早接觸的時候就了解到,stm32有功能,但是一直沒有用到,最近公司項目中用到了,我才詳細的學習了這個功能,學完之后感覺這個功能很好用,也很實用,特此寫下來,做個筆記,同時也希望能幫助到所有的熱愛單片機的人。

    本文引用地址:http://www.czjhyjcfj.com/article/201609/310407.htm

      直奔主題把,最初我做了一個小實驗,具體內容是:

      1.寫兩個小程序,編譯完畢生成兩個bin文件

      2.用stm官方提供的flashloader 下載到單片機內,不過這里需要注意的是第二個bin文件的下載地址需要更改,具體怎么改后面介紹

      3.通過某種觸發方式,讓單片機在兩個程序之間來回切換

      上面是我實驗的內容,在做這個小實驗的前提是你必須知道怎么在兩個程序之間跳轉,其次你也必須知道bin文件的生成,以及生成之前工程選項的設置,最后肯定是怎么下載到單片機內。

      一、跳轉代碼的實現

      從官方網站上下載了例子,從中摘取了一下代碼用在項目中,其他的沒有用,只需核心部分。

      if (((*(volatile uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)

      {

      JumpAddress = *(volatile uint32_t*)(ApplicationAddress + 4);

      Jump_To_Application = (pFunction)JumpAddress;

      __set_MSP(*(volatile uint32_t*)ApplicationAddress); //初始化用戶程序的堆棧指針

      Jump_To_Application();

      }

      ApplicationAddress 是你要跳轉的那個代碼存放的首地址,我代碼里是

      #define ApplicationAddress1 0x08008000 //應用程序起始地址

      JumpAddress = *(volatile uint32_t*)(ApplicationAddress + 4); 這句話的意思執行的結果是,打開bin文件偏移四個字節后的一個uint32數據,具體是為什么取這個數,對bin文件感興趣的朋友可以自己研究一下。如果你這段代碼實在不理解,不過沒關系,你只需要添加進去就行了,呵呵

      0x08000000 -----------------------------------------

      |

      | 程序1

      |

      |

      0x08008000 -----------------------------------------

      |

      |

      | 程序2

      |

      |

      -----------------------------------------

      程序1和我們普通的代碼一樣不需要設置中斷偏移量,工程選項也不需要設置,程序2需要設置,設置流程如下:

     

      將里面原來的數據0x8000000改為0x8008000,不一定非要是這個,我只是害怕小了重疊,官網給的是 0x8004000,

      同時在你的代碼里加上中斷偏移設置為0x8000

      #ifdef VECT_TAB_RAM

      // Set the Vector Table base location at 0x20000000

      NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

      #else /* VECT_TAB_FLASH */

      // Set the Vector Table base location at 0x08000000

      //NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);

      #endif

      二、bin文件的生成

      

     

      填入的內容和你工程路徑有關系,我的是:

      fromelf --bin --output E:_2ProjectoutputProj1.bin E:_IAP2ProjectoutputProj1.axf

      當然了,兩個代碼,肯定路徑也是不一樣,調試的時候發現 這個axf文件名和bin文件名必須和下面圖片中的名字一直,否則生成bin文件錯誤

     

      如果編譯完畢顯示如下信息,說明你的bin文件生成正確了,

      

     

      三、bin文件的下載過程

      

     

      點擊下一步 next,直到出現下面界面

      

     

      先擦出一下整個芯片,然后載入代碼1對應的bin文件,

      

     

      注意看地址,第一個代碼設置的為 8000000,第二個為你代碼中的地址,我的為8008000,第二個代碼下載截圖如下,

      

     

      代碼可以到我csdn帳號中下載,免費的,連接為http://download.csdn.net/detail/likang123321/5318910

      通過上面的介紹,相信離遠程更新已經不遠了,大家根據具體情況可以具體應用,

      當你下載連個代碼到單片機內后,上電運行的是第一個,此時你發送0xaa到串口,代碼會跳轉到代碼2,繼續發送0xaa單片機會回到代碼1執行,我感覺很有趣,希望本文能夠讓更多i的電子愛好者了解IAP,謝謝閱讀,有什么不足之處,請廣大大神提出寶貴的意見,共同學習中……



    關鍵詞: STM32 IAP

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 马公市| 清水河县| 钟祥市| 钦州市| 浪卡子县| 丰顺县| 南召县| 高淳县| 张家口市| 石林| 乳源| 巴塘县| 泰安市| 土默特左旗| 拜泉县| 万盛区| 嘉义市| 山丹县| 苗栗市| 司法| 理塘县| 盐源县| 伊金霍洛旗| 泸溪县| 上高县| 嘉荫县| 汽车| 龙川县| 密云县| 宜良县| 江西省| 平谷区| 新巴尔虎左旗| 怀集县| 城市| 米易县| 玉溪市| 分宜县| 百色市| 福海县| 兴义市|