找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1627|回复: 1
收起左侧

使用STM32F103单片机片内FLASH虚拟U盘,用于存储文件IAP升级

[复制链接]
ID:219315 发表于 2023-6-11 09:52 | 显示全部楼层 |阅读模式
   最近做一个传感器的项目,要求在传感器里存储校正参数,主机连接不同的传感器时都能准确采值。于是想到用片内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盘,就完成了程序更新,消除了用户升级操作的学习过程。
51hei.jpg
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空间,就是格式化时保存的文件系统。
51hei.png
为何修改为0x8008000而不是其它位置?因为系统告诉我们了,U盘容量=32K,因此反推:
(0x800ffff+1)-32K=0x8008000(STM32F103C8系列)。  
51hei.png
2.2.编译用户程序
51hei.png
主程序中不要忘记偏移。编译完,赶紧试试吧。可是,我们该将哪个文件存入U盘啊?
51hei.png
这样就会编译结束后自动生成对应的***.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, 下载次数: 35)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:766804 发表于 2023-12-19 11:00 | 显示全部楼层
512K-470K = 42K这个470K怎么来的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表