序言

  • 基础工程准备
    • 修改进入U盘的条件
    • 添加IAP跳转代码
    • 准备一个生成bin文件的例程
    • 将bin文件放入指定位置运行
    • 工程连接

经过将stm32的内部flash做成U盘以后,我一直在思考可不可以使我的程序脱离下载器下载呢?也就是说在我没带下载器,也没有带340串口的时候,我写了个程序想立刻玩一玩看看效果。现在用的芯片是103的c8t6,反正,最小的操作空间是1k,也就是一个扇区。我知道这个FAT32文件系统也是从最开始的最开始的指定控件去存放的,那么我只要把程序的开始运行地址给跳转到FAT32文件系统开始操作的地址即可。

基础工程准备

首先准备一个flashU盘的工程,可以直接下载我的链接工程
当然,我也出了制作教程,看我写的文章即可

修改进入U盘的条件

首先要确定的一个条件就是,当芯片启动时需要满足何种条件接入电脑的usb芯片会虚拟出U盘,或者说直接运行bin文件。
这时候我想到了一个最简单方法就是通过添加一个引脚的输入,使得在芯片启动后直接读取引脚的高低电平,如果为高就进入U盘模式,如果为低就跳转运行bin文件即可。
进入cubemx随便添加一个PB13作为这个功能的引脚,重新生成代码后展开。

添加IAP跳转代码

这里的跳转地址有必要说明一下,(字有点丑请勿介意)芯片内部的flash区域被分成了四个区域,像我们平时用的顶多就是一个芯片厂商提供的bootloader以及用户写程序的部分,但是我想要一个跳转的效果的话就得分区域,其中文件系统部分是由电脑进行初始化的。

接下来将跳转部分的代码添加一下;其中跳转地址有必要说明一下,U盘通过电脑格式化以后显示我的U盘的可用空间为25K,而我这块芯片型号stm32f103c8t6的总内存大小为64k;又因为第1k的地址为0x08000000, 所以计算出第前面39k中第39k的地址为0x08009800,所以后面25k的起始地址为0x08009C00;

typedef  void (*pFunction)(void);
#define ApplicationAddress 0x08009C00  //跳转地址
uint32_t JumpAddress;
pFunction Jump_To_Application;void ProgramIapJump()
{__ASM("CPSID  I");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();//}
}

相应的在main函数中做一些条件判断。

/*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();
//  MX_USB_DEVICE_Init();/* USER CODE BEGIN 2 */if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13))//如果是高就进入U盘{MX_USB_DEVICE_Init();}else{ProgramIapJump();//程序跳转}/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);//HAL_Delay(200);}/* USER CODE END 3 */
}

至此,一个能判断是否跳转运行bin文件的U盘程序就制作完成。

准备一个生成bin文件的例程

接下来就准备写一个bin文件,运行一下看看效果,跑个led试试水(点灯大法)。
同样的用cubemx随便生成一个led的工程后,在main函数中添加闪烁代码;

  /* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);HAL_Delay(200);}/* USER CODE END 3 */

然后在main函数的开头需要将中断向量进行偏移操作,然后再把中断打开;

  /* USER CODE BEGIN 1 */SCB->VTOR=FLASH_BASE|0x9C00;//__ASM("CPSIE  I");//汇编,开启中断/* USER CODE END 1 */

然后再将target中ROM1的地址重置一下

接下来也是最重要的就是让它生成bin文件;生成bin文件主要是通过MDK中的fromelf.exe这个程序来完成的,这个MDK的编译有点类似与Linux里面的makefile,在我们写好程序进行编译的时候就会生成一堆的(.o文件),然后这些文件再链接起来形成hex或者bin文件。
具体操作,在User选项下添加如下代码,并勾选Run #1
其中D:\MDK529是我的MDK安装的地址,下面这段代码的基本意思就是,调用我的MDK自带的fromelf.exe文件,通过依赖./led目录下的led.axf文件生成一个名叫led.bin的文件,并将其放到./led目录下。

D:\MDK529\ARM\ARMCC\bin\fromelf.exe --bin -o ./led/led.bin ./led/led.axf

将bin文件放入指定位置运行

通过简单的复制粘贴,或者直接将bin文件拖动到U盘里面即可;

最后将PB13引脚置为低电平,复位芯片即可看到led闪起来了。

工程连接

最后附上工程的链接,主要是两个程序,一个U盘跳转的,另外一个则是led应用。

stm32将flash虚拟成U盘来下载程序相关推荐

  1. 使用cubemx建立一个内部flash虚拟一个U盘的工程

    序言 使用软件版本 建立一个基础工程 添加flash操作代码 工程链接 可以注意到的是,大部分的stm32芯片是支持usb从机的,当然这类的标准库例程也有,比如野火的例程就有,只要将例程稍做修改就可以 ...

  2. 使用USB转TTL串口板和ST-LINK调试下载器给STM32单片机下载程序

    使用USB转TTL串口板和ST-LINK调试下载器给STM32单片机下载程序 简介 STM32的启动模式 JTAG和SWD接口引脚对比 驱动安装 使用官方STM32 ST-LINK Utility软件 ...

  3. STM32F103VET6利用片内FLASH虚拟U盘,使用文件复制方式实现IAP

    在原子论坛偶尔搜到一篇 利用STM32片内FLASH虚拟U盘,使用文件复制方式实现IAP的帖子http://www.openedv.com/forum.php?mod=viewthread&t ...

  4. STM32外挂FLASH模拟U盘(基于HAL库)

    STM32外挂FLASH模拟U盘(基于HAL库) 1.背景 1.1这篇文章能给你带来什么 1.2根据你要解决的问题,精确快速跳转到相应位置 1.3我在做完这个后还有不明白的地方,希望能有大触解答困惑 ...

  5. STM32 内部Flash读写 程序源码 [已验证]

    目录 STM32 内部Flash带缓存读写 程序源码 0 Macro 1.Flash_Erase 2. Flash_Read_Byte 3.Flash_Write_NoBuffer 4.Flash_W ...

  6. esxi显卡给2个虚拟机_使用虚拟机ESXI,显卡直通VM,使一台实体机虚拟成HTPC、WEB服务器、NAS服务器等经验 - 小众知识...

    什么是ESXI?其实是VMWARE的企业版,ESXI自己就是一套操作系统,不用装WINDOW,也不用装LINUX,效率能达到实体机的95%以上.可以把一台虚拟成几台PC,各自发挥自己的用途. 利用ES ...

  7. 【RT-Thread】 TinyUSB挂载成U盘和文件系统,基于STM32F405RG

    1.硬件型号\软件版本 MCU:STM32F405RGT6 RT-Thread:v4.1.0 2.CUBEMX配置SPI 既然要将我们的板子挂载成U盘,那么我们的板子必然要有一个片外内存,我的硬件板卡 ...

  8. ultraISO虚拟光驱修改盘符

    ultraISO修改虚拟光驱盘符方法 方法1 方法2 方法3 方法1 进入ultraISO软件修改: 当场可以生效.如果不生效,请看方法2. 方法2 打开cmd,进入ultraISO安装目录下的dri ...

  9. 桌面缓存服务器,primocache 把内存虚拟成硬盘缓存的硬盘优化软件

    primocache 是一款专业的硬盘优化软件,它的原理是把内存虚拟成硬盘缓存来实现硬盘优化,本次小编发布的是primocache,中包含两个版本分别是PrimoCache普通版和PrimoCache ...

最新文章

  1. 从Nature 封面文章“天机”芯片看脑科学与AI的融合
  2. 分布式 WebSocket 集群解决方案
  3. 推荐系统笔记(模型融合)
  4. matlab基于ssd的角点匹配_基于关键点的目标检测
  5. SOA (面向服务的架构)
  6. redux 源码详解
  7. 基于顺序存储结构的图书信息表的创建和输出(C++)
  8. rust和gta5哪个吃配置_晨报:Steam周销量榜 曝次世代GTA5用大镖客2引擎
  9. 使用字符串修改彩票程序
  10. 编写一个简单加密程序!!!
  11. 摄像头 - 双摄像头工作原理详解:RBG +RGB, RGB + Mono
  12. Chrome浏览器另存为时浏览器假死问题
  13. Re5:读论文 TWAG: A Topic-guided Wikipedia Abstract Generator
  14. QT属性绑定binging
  15. 2018HYNU新生第一次选拔
  16. Say hello to x86_64 Assembly [part 2]
  17. zlog库的交叉编译
  18. 给小学生上计算机课,【学生简笔画】小学生上电脑课精选日记
  19. 清华计算机系最低分,清华大学分数线 清华大学各省录取最低分是多少
  20. 学术成果的认定范围及计算标准

热门文章

  1. 查询python答案的app_2020知到APP大数据分析的python基础最新免费答案查询
  2. python列表两两相减_python对向量构成的多维数组中的两个元素进行两两相减
  3. 前端自适应图片留白解决
  4. photoshop使用技巧_如何使用Photoshop创建逼真的漫画
  5. 用宝塔面板网站php变成静态,宝塔面板可以建立静态网站吗?如何部署一个静态页面?...
  6. java argument type mismatch_解决mybatisplus插入报错argument type mismatch的问题
  7. 请你讲讲分布式系统中的限流器一般如何实现?
  8. Virtualbox虚拟机安装win10系统卡顿
  9. 视频号如何打造爆款内容,封面、选题、文案三大维度丨国仁网络
  10. MAC install MySQL and DBeaver