<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > STM32 IAP功能實(shí)現學(xué)習筆記

STM32 IAP功能實(shí)現學(xué)習筆記

作者: 時(shí)間:2016-09-27 來(lái)源:網(wǎng)絡(luò ) 收藏

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

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

  直奔主題把,最初我做了一個(gè)小實(shí)驗,具體內容是:

  1.寫(xiě)兩個(gè)小程序,編譯完畢生成兩個(gè)bin文件

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

  3.通過(guò)某種觸發(fā)方式,讓單片機在兩個(gè)程序之間來(lái)回切換

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

  一、跳轉代碼的實(shí)現

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

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

  {

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

  Jump_To_Application = (pFunction)JumpAddress;

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

  Jump_To_Application();

  }

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

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

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

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

  |

  | 程序1

  |

  |

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

  |

  |

  | 程序2

  |

  |

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

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

 

  將里面原來(lái)的數據0x8000000改為0x8008000,不一定非要是這個(gè),我只是害怕小了重疊,官網(wǎng)給的是 0x8004000,

  同時(shí)在你的代碼里加上中斷偏移設置為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文件的生成

  

 

  填入的內容和你工程路徑有關(guān)系,我的是:

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

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

 

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

  

 

  三、bin文件的下載過(guò)程

  

 

  點(diǎn)擊下一步 next,直到出現下面界面

  

 

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

  

 

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

  

 

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

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

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



關(guān)鍵詞: STM32 IAP

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>