日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机串口IAP原理

發(fā)布時(shí)間:2023/12/31 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机串口IAP原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(guān)注+星標(biāo)公眾號(hào),不錯(cuò)過精彩內(nèi)容

作者 |?正念

微信公眾號(hào) |?嵌入式大雜燴

什么是IAP?

IAP是In Application Programming的首字母縮寫,IAP是用戶自己的程序在運(yùn)行過程中對(duì)User Flash的部分區(qū)域進(jìn)行燒寫,目的是為了在產(chǎn)品發(fā)布后可以方便地通過預(yù)留的通信口對(duì)產(chǎn)品中的固件程序進(jìn)行更新升級(jí)。

在重新編程過程中可以使用任意類型的通信協(xié)議,如UART、I2S、SPI等。這篇筆記分享的是使用UART方式IAP。

串口IAP實(shí)驗(yàn)

先理一理流程(本實(shí)驗(yàn)是以STM32F103ZET6為例):

1、實(shí)驗(yàn)說明

做這個(gè)實(shí)驗(yàn)需要準(zhǔn)備兩個(gè)keil工程,一個(gè)工程用于編寫IAP程序,另一個(gè)工程用于編寫我們的應(yīng)用程序(要實(shí)現(xiàn)某些功能的程序),這里我們以一個(gè)點(diǎn)燈程序?yàn)槔W罱K,兩份工程編譯出來的可執(zhí)行文件都需要燒寫到芯片的FLASH中。只不過需要燒寫到不同的地址,簡單的示意圖如下:

這里,使用的STM32的型號(hào)為STM32F103ZET6,其FLASH大小是512KB,0x08000000為其FLASH被映射的地址,程序被燒寫到的就是這個(gè)地址。此處,我們的IAP程序燒寫到這個(gè)地址,根據(jù)IAP程序的大小,我們?cè)趉eil里可以設(shè)置合適的IAP結(jié)束地址。

注意:在沒有IAP程序的情況下,0x08000000這個(gè)地址就是應(yīng)用程序燒寫的地址。

2、工程說明

本實(shí)驗(yàn)用到的兩個(gè)工程可按照文末的方式獲取,其中IAP工程移植至ST官方例程。下面對(duì)兩個(gè)工程進(jìn)行簡單的說明

IAP工程:

(1)需要在target選項(xiàng)卡里設(shè)置我們IAP程序的起始地址與大小,如:

這里我們的IAP程序起始地址設(shè)為0x08000000,大小設(shè)為0x3000,即IAP所能用的FLASH空間為12KB。其中IAP所能占的占空間的大小可根據(jù)IAP的實(shí)際大小進(jìn)行修改。

(2)需要修改程序中我們需要跳轉(zhuǎn)到的應(yīng)用程序的地址(即IAP程序的結(jié)束地址):

LED工程:

(1)需要在target選項(xiàng)卡里設(shè)置我們LED程序的起始地址與大小,如:

這里我們的LED程序起地址設(shè)為0x08003000,大小設(shè)為0x10000,即LED所能用的FLASH空間為64KB。其中結(jié)束地址可根據(jù)LED應(yīng)用程序的實(shí)際大小進(jìn)行修改。

(2)生成對(duì)應(yīng)的.bin文件。這需要在User選項(xiàng)卡里添加如下命令(即編譯后執(zhí)行的命令):

其中,fromelf.exe是我們keil安裝目錄下的一個(gè)可執(zhí)行程序,可以把.axf文件轉(zhuǎn)換成.bin文件。要在keil中直接調(diào)用fromelf命令,必須要把fromelf.exe所在目錄添加到環(huán)境變量中。添加環(huán)境變量的方法如下(該方法來自于《【野火】零死角玩轉(zhuǎn)STM32—F429挑戰(zhàn)者V2.pdf》):

本文以 Win7 系統(tǒng)為例添加工具鏈的路徑到 PATH 環(huán)境變量,其它系統(tǒng)是類似的。

(1) 右鍵電腦系統(tǒng)的計(jì)算機(jī)圖標(biāo),在彈出的菜單中選擇屬性 ,如圖:

(2) 在彈出的屬性頁面依次點(diǎn)擊高級(jí)系統(tǒng)設(shè)置 ->環(huán)境變量,在用戶變量一欄中找到名為PATH的變量,若沒有該變量,則新建一個(gè)。編輯PATH變量,在它的變量值中輸入工具鏈的路徑,如本機(jī)的是;D:\work\keil5\ARM\ARMCC\bin,注意要使用分號(hào);讓它與其它路徑分隔開,輸入完畢后依次點(diǎn)確定,如圖:

(3) 打開 Windows 的命令行,點(diǎn)擊系統(tǒng)的開始菜單,在搜索框輸入cmd,在搜索結(jié)果中點(diǎn)擊cmd.exe即可打開命令行, 如圖:

(4) 在彈出的命令行窗口中輸入fromelf回車,若窗口打印出 formelf 的幫助說明,那么路徑正常,就可以開始后面的工作了;若提示不是內(nèi)部名外部命令,也不是可運(yùn)行的程序…信息,說明路徑不對(duì),請(qǐng)重新配置環(huán)境變量,并確認(rèn)該工作目錄下有編譯工具鏈。

這個(gè)過程本質(zhì)就是讓命令行通過“PATH”路徑找到fromelf.exe程序運(yùn)行 。

學(xué)會(huì)配置fromelf.exe,也就學(xué)會(huì)配置了MinGW。MinGW是一個(gè)工具集,包含編譯C與C++的gcc、g++,使用它就可以在Windows命令行下編譯C程序。相關(guān)筆記:使用Notepad++來開發(fā)C程序

3、IAP源碼說明

(1)主函數(shù)

int main(void) {FLASH_Unlock(); /* FLASH解鎖 */KEY_Init(); /* 按鍵初始化 */IAP_Init(); /* IAP初始化 *//* 按鍵按下則進(jìn)入主菜單開始更新程序(注意:需要按下復(fù)位鍵的同時(shí)按下該按鍵觸發(fā)程序更新) */if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0x00){SerialPutString("\r\n======================================================================");SerialPutString("\r\n= (C) COPYRIGHT 2010 STMicroelectronics =");SerialPutString("\r\n= =");SerialPutString("\r\n= In-Application Programming Application (Version 3.3.0) =");SerialPutString("\r\n= =");SerialPutString("\r\n= By MCD Application Team =");SerialPutString("\r\n======================================================================");SerialPutString("\r\n\r\n");Main_Menu ();}/* 保持運(yùn)行用戶應(yīng)用程序 */else{/* Test if user code is programmed starting from address "ApplicationAddress" */if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000){/* Jump to user application */JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);Jump_To_Application = (pFunction) JumpAddress;/* Initialize user application's Stack Pointer */__set_MSP(*(__IO uint32_t*) ApplicationAddress);Jump_To_Application();}}while (1){}return 0; }

可見,我們按下復(fù)位的同時(shí)按下PE2對(duì)應(yīng)的按鍵即可觸發(fā)應(yīng)用程序更新操作,否則跳轉(zhuǎn)到應(yīng)用程序的起始地址執(zhí)行應(yīng)用程序(斷點(diǎn)重啟也是默認(rèn)執(zhí)行應(yīng)用程序),這里的ApplicationAddress就是我們上面設(shè)置的0x08003000。

(2)主菜單函數(shù)Main_Menu

這個(gè)函數(shù)里就是該IAP程序的功能,根據(jù)其中的打印信息:

可以知道,該IAP有三個(gè)功能(分別輸入鍵盤上的數(shù)字1、2、3進(jìn)行選擇):一是下載程序(電腦->STM32);二是上傳程序(STM32->電腦);三是執(zhí)行新程序(即剛下載完成的程序)。

(3)下載程序功能函數(shù)SerialDownload

首先,上位機(jī)使用Ymodem協(xié)議進(jìn)行數(shù)據(jù)下發(fā),STM32根據(jù)協(xié)議解析數(shù)據(jù),拿到有用的數(shù)據(jù),并把這些數(shù)據(jù)寫入FLASH對(duì)應(yīng)的地址中,即ApplicationAddress。關(guān)于Ymodem協(xié)議及SerialDownload函數(shù)這里不展開討論。

4、下載驗(yàn)證

(1)下載IAP程序

可以使用J-link等調(diào)試器進(jìn)行下載,也可用串口ISP進(jìn)行下載,我們選用的是串口ISP進(jìn)行下載,借用的工具是FlyMcu:

這里下載的是.hex文件,如果下載.bin文件,則會(huì)提示如下錯(cuò)誤:

程序文件不是0x8000000和0x20000000區(qū)域的

使用ISP方式下載需要進(jìn)行的硬件操作是:BOOT0引腳拉高,BOOT1引腳接地。即系統(tǒng)存儲(chǔ)器被選為啟動(dòng)區(qū)域:

在點(diǎn)擊開始編程按鈕后,需要按下板子上的復(fù)位鍵,即可下載程序。

(2)通過IAP程序引導(dǎo)下載LED程序

上面提到下載程序使用的是Ymodem協(xié)議,所以得選用帶有Ymodem協(xié)議傳輸方式的上位機(jī)軟件來把應(yīng)用程序下載到板子里。可以選用SecureCRT,也可以選用超級(jí)終端。這里選用的是超級(jí)終端:

首先按下數(shù)字鍵1觸發(fā)下載程序操作,此時(shí)會(huì)不斷打印CCCCC...。然后點(diǎn)傳送->發(fā)送文件,選擇要下載的.bin文件及Ymodem協(xié)議。下載完成后按下數(shù)字3即可執(zhí)行新下載得應(yīng)用程序:

終于,LED閃爍起來了,點(diǎn)燈項(xiàng)目成功。斷電重啟之后默認(rèn)執(zhí)行的是這個(gè)點(diǎn)燈程序,要想下載新的程序,按下復(fù)位的同時(shí)按下PE2所對(duì)應(yīng)的按鍵(需要一定的手速)即可觸發(fā)更新程序操作。

------------?END?------------


●專欄《嵌入式工具

●專欄《嵌入式開發(fā)》

●專欄《Keil教程》

●嵌入式專欄精選教程

關(guān)注公眾號(hào)回復(fù)“加群”按規(guī)則加入技術(shù)交流群,回復(fù)“1024”查看更多內(nèi)容。


點(diǎn)擊“閱讀原文”查看更多分享。

總結(jié)

以上是生活随笔為你收集整理的单片机串口IAP原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。