|
最近做一個傳感器的項目,要求在傳感器里存儲校正參數(shù),主機(jī)連接不同的傳感器時都能準(zhǔn)確采值。于是想到用片內(nèi)FLASH程序存儲空間劃一部分出來,虛擬成一個U盤存儲校正參數(shù),可以節(jié)省一片EEROM芯片。網(wǎng)上找了很久,不是不能用,就是要收費(fèi),這里發(fā)出來方便有需要的人。虛擬U盤部分已經(jīng)測試通過,后面IAP部分因為用不到,沒有測試。
利用片內(nèi)FLASH虛擬U盤,使用文件復(fù)制方式實現(xiàn)IAP
USART IAP功能想必大家都很熟悉了,我們通過USART IAP,可以很方便的實現(xiàn)程序升級。
但是在實際工作中,遇到一些特殊情況時,USART IAP功能卻不像我們應(yīng)用中那么方便,甚至
成了一大制約因素:
1.板子交給遠(yuǎn)方的用戶,用戶手頭沒有帶串口的電腦。
2.用戶找到帶串口的電腦,卻仍然沒有合適的串口連接線。
3.終于找到了合適的串口連接線,仍沒有IAP軟件。
4.IAP軟件連同HEX文件一同發(fā)給用戶,用戶卻不會操作。在我們手頭很簡單的操作,到用戶手
里,卻總也搞不定(即便是簡單的超級終端,想要遠(yuǎn)程教會用戶,也是很考驗功力的)。
5.不是所有的板子都設(shè)計有串口,沒有串口的板子,呵呵…… 幸好STM還給我們提供了DFU升級方式,基本可以解決以上多數(shù)問題,只需要留出USB接口就行。
但是DFU方式,仍然對用戶的要求很高,需要用戶熟悉軟件的操作過程和流程(見制約因素4)。
只有找到一種更簡單的方式,只要簡單的復(fù)制、粘貼操作,就可以實現(xiàn)程序更新,才能最大限度解決以上問題。
現(xiàn)在我們通過虛擬U盤IAP程序,將程序存儲的FLASH空間虛擬為U盤,只要將程序文件復(fù)制到這個U盤,就完成了程序更新,消除了用戶升級操作的學(xué)習(xí)過程。
51hei.jpg (142.08 KB, 下載次數(shù): 34)
下載附件
2023-6-11 14:31 上傳
0x8000000
0x8003000
0x8008000
無IAP程序 一般IAP程序 U盤IAP程序
文件系統(tǒng)
IAP程序 IAP程序
用戶程序 用戶程序 用戶程序 程序?qū)崿F(xiàn)過程:
1.IAP程序
IAP程序仍然占用0x8000000~0x8003000的FLASH空間,IAP的作用,是在滿足IAP控制要求的情況下啟動IAP功能,否則,直接跳轉(zhuǎn)并執(zhí)行用戶程序。啟動IAP功能,可以使用3個方式:
1.1.當(dāng)用戶程序為空時,自動啟動IAP功能,做寫程序準(zhǔn)備。
1.2.當(dāng)用戶程序正常,但啟動時按下了特定的IAP按鍵時,啟動IAP功能。
1.3.用戶程序運(yùn)行中,在某個特殊位置做了IAP升級標(biāo)志,判讀標(biāo)志后,啟動IAP功能。
現(xiàn)在的IAP程序,僅僅實現(xiàn)簡單的將內(nèi)部FLASH虛擬為U盤功能即可。參見《5分鐘用STM32的內(nèi)置Flash做一個超小U盤》。當(dāng)然,這個小U盤缺少了文件系統(tǒng),需要重新格式化才行。 格式化后,我們的超小U盤OK了,接下來就該進(jìn)行下一步了,用戶程序。
2.用戶程序
2.1.配置
常規(guī)的用戶程序,對于我們的STM32F103C8系列,有64KFLASH,因此可供IAP程序使用的為0x8003000~0x800FFFF的FLASH空間。但我們這次的用戶程序,必須要保留下文件系統(tǒng),因此修改為僅使用0x8008000~0x800FFFF。這其中的0X8003000~0X8008000空間,就是格式化時保存的文件系統(tǒng)。
51hei.png (42.99 KB, 下載次數(shù): 40)
下載附件
2023-6-11 14:31 上傳
為何修改為0x8008000而不是其它位置?因為系統(tǒng)告訴我們了,U盤容量=32K,因此反推:
(0x800ffff+1)-32K=0x8008000(STM32F103C8系列)。
51hei.png (21.12 KB, 下載次數(shù): 41)
下載附件
2023-6-11 14:32 上傳
2.2.編譯用戶程序
51hei.png (7.82 KB, 下載次數(shù): 36)
下載附件
2023-6-11 14:32 上傳
主程序中不要忘記偏移。編譯完,趕緊試試吧。可是,我們該將哪個文件存入U盤啊?
51hei.png (22.78 KB, 下載次數(shù): 39)
下載附件
2023-6-11 14:32 上傳
這樣就會編譯結(jié)束后自動生成對應(yīng)的***.BIN文件,這個BIN文件,就是我們需要的升級文件。 2.3.復(fù)制文件,升級了。復(fù)制文件后復(fù)位,用戶程序自動運(yùn)行了。
這時,我們可以再次回到U盤狀態(tài),刪除文件,甚至是格式化這個U盤,只要沒有新的文件進(jìn)行覆蓋,我們的程序會始終正常運(yùn)行的。這是FAT表文件系統(tǒng)的缺陷造成的,也是數(shù)據(jù)恢復(fù)的理論基礎(chǔ)。
STM32單片機(jī)源程序如下:
- #include "stm32f10x.h"
- #include "stdio.h"
- #include "hw_config.h"
- #include "usb_lib.h"
- #include "usb_pwr.h"
- extern uint16_t MAL_Init (uint8_t lun);
- typedef void (*pFunction)(void);
- #define ApplicationAddress 0x0800A800 //計算跳轉(zhuǎn)地址512K-470K = 42K 即0xA800 ApplicationAddress = 0x8000000+0xA800 = 0x0800A800
- uint32_t JumpAddress;
- pFunction Jump_To_Application;
- int main(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_ResetBits(GPIOB, GPIO_Pin_9);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-
- // if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0)
- // {
- Set_System();
- Set_USBClock();
- USB_Interrupts_Config();
- USB_Init();
- while (bDeviceState != CONFIGURED);
- while(1)
- {
-
- }
- // }
- __set_PRIMASK(1);
- if(((*(__IO uint32_t *) ApplicationAddress) & 0x2FFE0000) == 0x20000000)
- {
- JumpAddress = *(__IO uint32_t *) (ApplicationAddress + 4);
- Jump_To_Application = (pFunction) JumpAddress;
-
- __set_MSP(*(__IO uint32_t *) ApplicationAddress);
- Jump_To_Application();
- }
- while(1)
- {
-
- }
- }
復(fù)制代碼
Keil代碼下載:
STM32F103RET6.7z
(373.32 KB, 下載次數(shù): 38)
2023-6-11 14:35 上傳
點擊文件名下載附件
STM32虛擬U盤 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|