一種stm32單片機(jī)iap串口程序燒錄的改進(jìn)方法
【專利摘要】本發(fā)明公開了一種STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,包括以下步驟:單片機(jī)上電后,初始化單片機(jī)的DMA控制器、串口資源;當(dāng)接收到用戶的應(yīng)用程序升級請求后,程序執(zhí)行以下步驟,否則轉(zhuǎn)跳到最后步驟;打開DMA控制器開關(guān),每當(dāng)串口有數(shù)據(jù)來,DMA傳輸數(shù)據(jù)到內(nèi)存里;當(dāng)DMA傳輸完數(shù)據(jù)時,產(chǎn)生傳輸完成中斷,通知CPU,CPU把內(nèi)存里的數(shù)據(jù)寫入到Flash中,接著CPU使能DMA繼續(xù)傳輸數(shù)據(jù),如此循環(huán);當(dāng)串口傳輸完數(shù)據(jù)后,串口產(chǎn)生一個空閑中斷通知CPU,在中斷函數(shù)中CPU把最后接收到的數(shù)據(jù)寫入到flash內(nèi)存中,并關(guān)閉DMA中斷控制器;程序跳到應(yīng)用程序函數(shù)入口,開始執(zhí)行應(yīng)用程序,采用本發(fā)明可克服更新程序應(yīng)用程序大小的限制,省卻了更新時的CPU使用資源,提高了焼寫速度。
【專利說明】
一種STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法
技術(shù)領(lǐng)域
[0001 ]本發(fā)明涉及單片機(jī)控制技術(shù)領(lǐng)域,尤其涉及的是一種STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法。
【背景技術(shù)】
[0002]IAP(In Applicat1n Programming)即在線應(yīng)用編程,IAP是用戶客戶端的程序在運(yùn)行過程中對User Flash的部分區(qū)域進(jìn)行燒寫,目的是為了在產(chǎn)品發(fā)布后可以方便地通過預(yù)留的通信口對產(chǎn)品中的固件程序進(jìn)行更新升級。通常實(shí)現(xiàn)在線應(yīng)用編程功能時,需要在設(shè)計固件程序時編寫兩個項目代碼,第一個項目程序可以稱為Bootloader,它不執(zhí)行正常的功能操作,而只是通過某種通信方式(如USB、USART)接收程序或數(shù)據(jù),執(zhí)行對第二部分代碼的更新;第二個項目代碼才是真正的功能代碼。這樣處理后,當(dāng)芯片上電后,首先是Bootloader開始運(yùn)行,它運(yùn)行時先檢查是否需要對應(yīng)用程序進(jìn)行更新,如果不需要更新則跳轉(zhuǎn)到應(yīng)用程序的入口點(diǎn),如需要更新則進(jìn)行更新,然后再轉(zhuǎn)跳到應(yīng)用程序的入口。
[0003]這種技術(shù)通常應(yīng)用在嵌入式領(lǐng)域里,對應(yīng)用程序進(jìn)行升級維護(hù)。目前許多嵌入式產(chǎn)品對應(yīng)用程序進(jìn)行更新升級都需要先將要更新的代碼通過串口或者USB等接口一次性加載到內(nèi)存里,然后通過擦除、重寫Flash對應(yīng)用程序進(jìn)行更新。使用這種方法進(jìn)行應(yīng)用程序更新的前提是內(nèi)存的容量一定要大于要加載的應(yīng)用程序。由于單片機(jī)是單線程執(zhí)行的,在串口接收數(shù)據(jù)的過程中CPU所有時間都在忙碌著把串口的數(shù)據(jù)運(yùn)送到內(nèi)存里,CPU騰不出時間來把內(nèi)存的數(shù)據(jù)寫入到flash里,只能是暫時先把接收到的數(shù)據(jù)堆積到內(nèi)存里,等串口接收完成后CPU慢慢的把這些數(shù)據(jù)寫入到flash里。而STM32單片機(jī)的RAM—般只有4K到64K的大小,意味著其內(nèi)存最多只能堆積4K到64K的數(shù)據(jù),這樣限制了在線更新的應(yīng)用程序的大小。
[0004]因此,現(xiàn)有技術(shù)還有待于改進(jìn)和發(fā)展。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的在于提供一種STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,以解決現(xiàn)有技術(shù)如下技術(shù)問題:
[0006](I)單片機(jī)程序在線燒錄時所更新的應(yīng)用程序不能大于內(nèi)存容量,否則無法燒錄;
[0007](2)單片機(jī)CPU大量時間都花費(fèi)在讀取串口的數(shù)據(jù),浪費(fèi)CPU資源,運(yùn)行效率較為低下。
[0008]本發(fā)明的技術(shù)方案如下:
[0009]一種STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其中,包括以下步驟:
[0010]步驟a:單片機(jī)上電后,初始化單片機(jī)的DMA控制器、串口資源;
[0011]步驟b:當(dāng)接收到用戶的應(yīng)用程序升級請求后,程序執(zhí)行步驟C-步驟f,否則轉(zhuǎn)跳到步驟f;
[0012]步驟c:單片機(jī)打開DMA控制器開關(guān),準(zhǔn)備傳輸串口數(shù)據(jù)到內(nèi)存,此時每當(dāng)串口有數(shù)據(jù)到來,DMA自動傳輸數(shù)據(jù)到指定的內(nèi)存里;
[0013]步驟d:當(dāng)DMA傳輸完設(shè)定大小的數(shù)據(jù)時,產(chǎn)生傳輸完成中斷,通知CPU,CPU把傳輸?shù)絻?nèi)存里的數(shù)據(jù)寫入到Flash中,然后使能DMA繼續(xù)搬運(yùn)數(shù)據(jù)到指定內(nèi)存區(qū)域,如此循環(huán);
[0014]步驟e:當(dāng)串口傳輸完數(shù)據(jù)后,串口產(chǎn)生一個空閑中斷通知CPU,在串口中斷函數(shù)中(PU把最后接收到的數(shù)據(jù)寫入到Flash內(nèi)存中,并關(guān)閉DMA中斷控制器;
[0015]步驟f:程序跳到APP函數(shù)入口,開始執(zhí)行應(yīng)用程序。
[0016]所述的STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其中,在步驟d中,所述DMA—次傳輸完2K數(shù)據(jù)時,產(chǎn)生傳輸完成中斷,通知CPU把內(nèi)存里的數(shù)據(jù)寫入到Flash中。
[0017]所述的STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其中,在步驟d中,所述DMA—次傳輸完IK的數(shù)據(jù)時,產(chǎn)生傳輸完成中斷,通知CPU把內(nèi)存里的數(shù)據(jù)寫入到Flash中。
[0018]所述的STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其中,在步驟d中,CPU把DMA傳輸?shù)絻?nèi)存里的數(shù)據(jù)以塊為單位一次性寫入到Flash中。
[0019]所述的STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其中,在步驟d中,CPU把內(nèi)存里的數(shù)據(jù)寫入到Flash后,重新開啟DMA并清空緩沖數(shù)據(jù)。
[0020]所述的STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其中,在步驟a中,所述串口的波特率設(shè)置為9600Bd。
[0021]本發(fā)明的有益效果:本發(fā)明通過供一種STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,利用單片機(jī)內(nèi)的DMA(Direct Memory Access直接儲存器訪問)把串口的數(shù)據(jù)搬運(yùn)到內(nèi)存,節(jié)省了CPU的資源,而CPU利用節(jié)省下的CPU資源把內(nèi)存的數(shù)據(jù)寫入Flash中,使IAP串口在線程序燒寫克服了更新應(yīng)用程序大小的限制,同時提高了焼寫速度。
【附圖說明】
[0022]圖1是Bootloader程序運(yùn)行流程圖。
[0023]圖2是本發(fā)明程序流程圖。
【具體實(shí)施方式】
[0024]為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚、明確,以下參照附圖并舉實(shí)施例對本發(fā)明進(jìn)一步詳細(xì)說明。
[0025]參閱圖1,現(xiàn)有技術(shù)實(shí)現(xiàn)在線應(yīng)用編程功能時,需要在設(shè)計固件程序時編寫兩個項目代碼,第一個項目程序,稱為Bootloader,它不執(zhí)行正常的功能操作,而只是通過某種通信方式(如USB、USART)接收程序或數(shù)據(jù),執(zhí)行對第二部分代碼的更新;第二個項目代碼為應(yīng)用程序才是真正的功能代碼。芯片上電后,Bootloader開始運(yùn)行,運(yùn)行時先檢查是否需要對應(yīng)用程序進(jìn)行更新,如果不需要更新則跳轉(zhuǎn)到應(yīng)用程序程序的入口,如需要更新則進(jìn)行更新后再轉(zhuǎn)跳到應(yīng)用程序程序的入口。
[0026]參閱圖2,本發(fā)明提供一種STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其中,包括以下步驟:
[0027]步驟a:單片機(jī)上電后,初始化單片機(jī)的DMA控制器、串口資源。
[0028]步驟b:當(dāng)接收到用戶的應(yīng)用程序升級請求后,程序執(zhí)行步驟C-步驟f,否則轉(zhuǎn)跳到步驟f;
[0029]步驟c:單片機(jī)打開DMA控制器開關(guān),準(zhǔn)備傳輸串口數(shù)據(jù)到內(nèi)存,此時每當(dāng)串口有數(shù)據(jù)到來,DMA自動傳輸數(shù)據(jù)到指定的內(nèi)存里;
[0030]步驟d:當(dāng)DMA傳輸完設(shè)定大小的數(shù)據(jù)時,產(chǎn)生傳輸完成中斷,通知CPU,CPU把內(nèi)存里的數(shù)據(jù)寫入到Flash后,重新開啟DMA并清空緩沖數(shù)據(jù),接著DMA繼續(xù)傳輸數(shù)據(jù),當(dāng)傳輸完設(shè)定大小的數(shù)據(jù)時,產(chǎn)生傳輸完成中斷,如此循環(huán);
[0031]步驟e:當(dāng)串口傳輸完數(shù)據(jù)后,串口產(chǎn)生一個空閑中斷通知CPU,在串口中斷函數(shù)中(PU把最后接收到的數(shù)據(jù)寫入到flash內(nèi)存中,并關(guān)閉DMA中斷控制器;
[0032]步驟f:程序跳到APP函數(shù)入口,開始執(zhí)行應(yīng)用程序。
[0033]在步驟a中,所述DMA是直接儲存器訪問(Direct Memory Access),傳輸將數(shù)據(jù)從一個地址空間復(fù)制到另外一個地址空間,傳輸動作本身是由DMA控制器來實(shí)行和完成,它無需CPU直接控制傳輸,也沒有中斷處理方式那樣保留現(xiàn)場和恢復(fù)現(xiàn)場的過程,通過硬件為單片機(jī)RAM與I/O設(shè)備開辟一條直接傳送數(shù)據(jù)的通路,能使CPU的效率大為提高。
[0034]優(yōu)選地,在步驟d中,所述DMA—次性傳輸完2K的數(shù)據(jù)后,產(chǎn)生傳輸完成中斷,通知CPU把內(nèi)存里的數(shù)據(jù)寫入到Flash中。由于大容量Flash內(nèi)存一頁大小為2K,若CPU—次向Flash中寫入2K的數(shù)據(jù),剛好寫滿一頁,減少了對Flash的擦除次數(shù),節(jié)省了時間。但如果一次寫入2頁或者更多頁的數(shù)據(jù)時,會占用太多CPU的時間,導(dǎo)致串口接收端的數(shù)據(jù)丟失。因此,對于大容量的Flash來說,DMA—次傳輸?shù)臄?shù)據(jù)設(shè)置為2K為一種優(yōu)選的實(shí)施方式。
[0035]作為本發(fā)明的另一實(shí)施方式,所述DMA也可傳輸完IK的數(shù)據(jù)后,產(chǎn)生傳輸完成中斷,通知CPU把內(nèi)存里的數(shù)據(jù)寫入到Flash中。由于中小容量Flash內(nèi)存一頁大小為1K,CPU每次以IK每塊為單位一次性將數(shù)據(jù)寫入到Flash內(nèi)存中,剛好寫滿一頁Flash內(nèi)存。
[0036]進(jìn)一步地,在步驟a中,所述串口的波特率設(shè)置為9600Bd,串口的波特率設(shè)置為較低速率,可以避免在CPU寫入Flash的過程中DMA處于中斷狀態(tài)而導(dǎo)致串口的數(shù)據(jù)丟失,若串口設(shè)置一個較大的波特率,例如波特率115200,串口的數(shù)據(jù)會有丟失。因此,串口的波特率設(shè)置為9600Bd為一種優(yōu)選的實(shí)施方式。
[0037]本發(fā)明通過供一種STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,利用單片機(jī)內(nèi)的DMA(Direct Memory Access直接儲存器訪問)把串口的數(shù)據(jù)搬運(yùn)到內(nèi)存,而CPU利用節(jié)省下來的資源把內(nèi)存的數(shù)據(jù)寫入Flash中,使IAP串口在線程序燒寫克服了應(yīng)用程序大小的限制,提尚了焼與速度。
[0038]應(yīng)當(dāng)理解的是,本發(fā)明的應(yīng)用不限于上述的舉例,對本領(lǐng)域普通技術(shù)人員來說,可以根據(jù)上述說明加以改進(jìn)或變換,所有這些改進(jìn)和變換都應(yīng)屬于本發(fā)明所附權(quán)利要求的保護(hù)范圍。
【主權(quán)項】
1.一種STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其特征在于,包括以下步驟: 步驟a:單片機(jī)上電后,初始化單片機(jī)的DMA控制器、串口資源; 步驟b:當(dāng)接收到用戶的應(yīng)用程序升級請求后,程序執(zhí)行步驟C-步驟f,否則轉(zhuǎn)跳到步驟f; 步驟c:單片機(jī)打開DMA控制器開關(guān),準(zhǔn)備傳輸串口數(shù)據(jù)到內(nèi)存,此時每當(dāng)串口有數(shù)據(jù)到來,DMA自動傳輸數(shù)據(jù)到指定的內(nèi)存里; 步驟d:當(dāng)DMA傳輸完設(shè)定大小的數(shù)據(jù)時,產(chǎn)生傳輸完成中斷,通知CPU,CPU把傳輸?shù)絻?nèi)存里的數(shù)據(jù)寫入到Flash中,然后使能DMA繼續(xù)搬運(yùn)數(shù)據(jù)到指定內(nèi)存區(qū)域,如此循環(huán); 步驟e:當(dāng)串口傳輸完數(shù)據(jù)后,串口產(chǎn)生一個空閑中斷通知CPU,在串口中斷函數(shù)中CPU把最后接收到的數(shù)據(jù)寫入到flash內(nèi)存中,并關(guān)閉DMA中斷控制器; 步驟f:程序跳到APP函數(shù)入口,開始執(zhí)行應(yīng)用程序。2.根據(jù)權(quán)利要求1所述的STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其特征在于,在步驟d中,所述DMA—次傳輸完2K的數(shù)據(jù)時,產(chǎn)生傳輸完成中斷,通知CPU把內(nèi)存里的數(shù)據(jù)寫入至IjFlash中 ο3.根據(jù)權(quán)利要求1所述的STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其特征在于,在步驟d中,所述DMA—次傳輸完IK的數(shù)據(jù)時,產(chǎn)生傳輸完成中斷,通知CPU把內(nèi)存里的數(shù)據(jù)寫入至IjFlash中 ο4.根據(jù)權(quán)利要求1所述的STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其特征在于,在步驟d中,CPU把DMA傳輸?shù)絻?nèi)存里的數(shù)據(jù)以塊為單位一次性寫入到Flash中。5.根據(jù)權(quán)利要求4所述的STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其特征在于,在步驟d中,CPU把內(nèi)存里的數(shù)據(jù)寫入到Flash后,重新開啟DMA并清空緩沖數(shù)據(jù)。6.根據(jù)權(quán)利要求1所述的STM32單片機(jī)IAP串口程序燒錄的改進(jìn)方法,其特征在于,在步驟a中,所述串口的波特率設(shè)置為9600Bd。
【文檔編號】G06F9/445GK105955764SQ201610256075
【公開日】2016年9月21日
【申請日】2016年4月22日
【發(fā)明人】韓防, 吳春波, 張浠, 安昕
【申請人】佛山市南海區(qū)歐譜曼迪科技有限責(zé)任公司