久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2496|回復: 1
打印 上一主題 下一主題
收起左側

使用STM32F103單片機片內FLASH虛擬U盤,用于存儲文件IAP升級

[復制鏈接]
跳轉到指定樓層
樓主
   最近做一個傳感器的項目,要求在傳感器里存儲校正參數,主機連接不同的傳感器時都能準確采值。于是想到用片內FLASH程序存儲空間劃一部分出來,虛擬成一個U盤存儲校正參數,可以節省一片EEROM芯片。網上找了很久,不是不能用,就是要收費,這里發出來方便有需要的人。虛擬U盤部分已經測試通過,后面IAP部分因為用不到,沒有測試。

利用片內FLASH虛擬U盤,使用文件復制方式實現IAP
USART IAP功能想必大家都很熟悉了,我們通過USART  IAP,可以很方便的實現程序升級。
但是在實際工作中,遇到一些特殊情況時,USART  IAP功能卻不像我們應用中那么方便,甚至
成了一大制約因素:
1.板子交給遠方的用戶,用戶手頭沒有帶串口的電腦。
2.用戶找到帶串口的電腦,卻仍然沒有合適的串口連接線。
3.終于找到了合適的串口連接線,仍沒有IAP軟件。
4.IAP軟件連同HEX文件一同發給用戶,用戶卻不會操作。在我們手頭很簡單的操作,到用戶手
里,卻總也搞不定(即便是簡單的超級終端,想要遠程教會用戶,也是很考驗功力的)。
5.不是所有的板子都設計有串口,沒有串口的板子,呵呵…… 幸好STM還給我們提供了DFU升級方式,基本可以解決以上多數問題,只需要留出USB接口就行。
但是DFU方式,仍然對用戶的要求很高,需要用戶熟悉軟件的操作過程和流程(見制約因素4)。
只有找到一種更簡單的方式,只要簡單的復制、粘貼操作,就可以實現程序更新,才能最大限度解決以上問題。
現在我們通過虛擬U盤IAP程序,將程序存儲的FLASH空間虛擬為U盤,只要將程序文件復制到這個U盤,就完成了程序更新,消除了用戶升級操作的學習過程。

0x8000000
0x8003000
0x8008000
無IAP程序  一般IAP程序  U盤IAP程序
文件系統
IAP程序  IAP程序
用戶程序  用戶程序  用戶程序 程序實現過程:
1.IAP程序
IAP程序仍然占用0x8000000~0x8003000的FLASH空間,IAP的作用,是在滿足IAP控制要求的情況下啟動IAP功能,否則,直接跳轉并執行用戶程序。啟動IAP功能,可以使用3個方式:
1.1.當用戶程序為空時,自動啟動IAP功能,做寫程序準備。
1.2.當用戶程序正常,但啟動時按下了特定的IAP按鍵時,啟動IAP功能。
1.3.用戶程序運行中,在某個特殊位置做了IAP升級標志,判讀標志后,啟動IAP功能。
現在的IAP程序,僅僅實現簡單的將內部FLASH虛擬為U盤功能即可。參見《5分鐘用STM32的內置Flash做一個超小U盤》。當然,這個小U盤缺少了文件系統,需要重新格式化才行。 格式化后,我們的超小U盤OK了,接下來就該進行下一步了,用戶程序。
2.用戶程序
2.1.配置
常規的用戶程序,對于我們的STM32F103C8系列,有64KFLASH,因此可供IAP程序使用的為0x8003000~0x800FFFF的FLASH空間。但我們這次的用戶程序,必須要保留下文件系統,因此修改為僅使用0x8008000~0x800FFFF。這其中的0X8003000~0X8008000空間,就是格式化時保存的文件系統。

為何修改為0x8008000而不是其它位置?因為系統告訴我們了,U盤容量=32K,因此反推:
(0x800ffff+1)-32K=0x8008000(STM32F103C8系列)。  

2.2.編譯用戶程序

主程序中不要忘記偏移。編譯完,趕緊試試吧。可是,我們該將哪個文件存入U盤啊?

這樣就會編譯結束后自動生成對應的***.BIN文件,這個BIN文件,就是我們需要的升級文件。 2.3.復制文件,升級了。復制文件后復位,用戶程序自動運行了。

這時,我們可以再次回到U盤狀態,刪除文件,甚至是格式化這個U盤,只要沒有新的文件進行覆蓋,我們的程序會始終正常運行的。這是FAT表文件系統的缺陷造成的,也是數據恢復的理論基礎。

STM32單片機源程序如下:
  1. #include "stm32f10x.h"
  2. #include "stdio.h"
  3. #include "hw_config.h"
  4. #include "usb_lib.h"
  5. #include "usb_pwr.h"

  6. extern uint16_t MAL_Init (uint8_t lun);


  7. typedef  void (*pFunction)(void);
  8. #define ApplicationAddress 0x0800A800  //計算跳轉地址512K-470K = 42K 即0xA800  ApplicationAddress = 0x8000000+0xA800 = 0x0800A800
  9. uint32_t JumpAddress;
  10. pFunction Jump_To_Application;

  11. int main(void)
  12. {
  13.         GPIO_InitTypeDef GPIO_InitStructure;        
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  18.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  19.         GPIO_ResetBits(GPIOB, GPIO_Pin_9);
  20.         
  21.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  23.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  24.         
  25.         
  26. //        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==0)
  27. //        {
  28.                 Set_System();
  29.                 Set_USBClock();
  30.                 USB_Interrupts_Config();
  31.                 USB_Init();
  32.                 while (bDeviceState != CONFIGURED);
  33.                         while(1)
  34.         {
  35.                
  36.         }

  37. //        }

  38.                 __set_PRIMASK(1);
  39.                 if(((*(__IO uint32_t *) ApplicationAddress) & 0x2FFE0000) == 0x20000000)
  40.                                 {
  41.                                         JumpAddress = *(__IO uint32_t *) (ApplicationAddress + 4);
  42.                                         Jump_To_Application = (pFunction) JumpAddress;
  43.                                        
  44.                                         __set_MSP(*(__IO uint32_t *) ApplicationAddress);
  45.                                         Jump_To_Application();
  46.                                 }
  47.         while(1)
  48.         {
  49.                
  50.         }

  51. }        

復制代碼

Keil代碼下載: STM32F103RET6.7z (373.32 KB, 下載次數: 38)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:766804 發表于 2023-12-19 11:00 | 只看該作者
512K-470K = 42K這個470K怎么來的?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 搞av.com| 欧美一区二区三区在线观看 | 欧美综合国产精品久久丁香 | 欧美一级高清片 | 四虎网站在线观看 | 久久人人爽人人爽 | 成人免费在线视频 | 国产精品视频一区二区三区不卡 | 日日骚网 | 久久国产欧美日韩精品 | 天天操操操操操 | 国产aaaaav久久久一区二区 | 亚洲精品在线观看视频 | 黄色av网站在线免费观看 | 午夜免费视频观看 | 九九福利 | 羞羞视频网站免费观看 | www.99精品 | 精品国产99 | 97成人免费 | 亚洲欧美一区二区三区国产精品 | 激情影院久久 | 亚洲综合色丁香婷婷六月图片 | 久久久www成人免费无遮挡大片 | 色婷婷综合久久久中文字幕 | 综合色导航 | 国产成人精品一区二区三区四区 | 伊人性伊人情综合网 | 国产伊人精品 | 日韩黄色av | 精品一区二区三区在线观看 | 日韩午夜精品 | 精品乱子伦一区二区三区 | av网址在线播放 | 黄色大片视频 | 国产福利视频 | 国产一区二区 | 欧美888| 日韩免费视频 | 国产一区二区三区四区五区加勒比 | 成人 在线|