经过将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(</