STM32内部自带不同大小的Flash,其主要功能是保存已经编译完成的代码。在实际的产品中为了节约成本如果有需要存储少量的数据会选择存放在内部Flash中。
注:STM32对于Flash 大小的描述 单位都是字节(Byte)而非位(bit)。
不同类型的STM32芯片拥有的FLASH大小也不一样,具体的数值可以参考数据手册或者从Keil中获得。
注:从Keil中可以发现它是起始地址(Start)和长度(Size),长度是用16进制表示 0x100000转化为10进制 1048576B=1024KB=1MB。
通过上述即可知道不同芯片的Flash和SRAM大小,一般来说存储都会分区或者分页。STM32内部的Flash也不例外,在不同芯片的参考手册中会讲解其分区的方式。图一是STM32F407ZGT6的Flash分区方式,图二是STM32F103C8T6的分区方式。
具体的驱动有很多厂家已经帮我们做了底层驱动(正点原子、野火等),只需要拿来使用即可。但是需要注意驱动要与芯片的型号对应,及F4系列和F1系列的驱动是有区别的不可混用(从分区中就可以看出区别)。
STM32的内部Flash是用来存编译完成的二进制的,那如何防止我们写入过程中修改或者误操作已经烧录的程序区。
1)首先我们需要计算出每次编译的程序大小,在Keil中编译完成后会有一串数据(如下所示),这串数据有何作用。
Program Size: Code=25042 RO-data=6598 RW-data=56 ZI-data=5944
编译后占用Flash的大小为:Code+RO-data 25042+6598=31,640 Byte = 31KB
编译后占用SRAM的大小为:RW-data+ZI-data 56+5944=6000 Byte = 6KB
2)如图所示在这一栏中就是代码烧写所使用的Flash大小,前面的0x8000000是开始地址,后面的0x100000是大小。我们可以换算一下把0x100000换算成10进制就是1048576 Byte也就是1MB。刚好就是手册中Flash的大小,所以只需要修改这个数据为0x7FFF(32KB)即可。
3)在修改Flash的代码空间时,需要注意就是要按照扇区进行修改。例:在注意事项一中计算出来的代码大小是31KB 换算为16进制也就是0x7C00,那么为什么填入的长度确实0x7FFF,参考F4系列的分区图可知,0x7C00是在扇区1中,并且扇区1还没有用完还剩下1KB的空间。我们读写Flash的过程中,读写的起始地址如果是0x80007C01。那么在操作过程中可能会出现误操作,因为数据擦除是按照扇区擦除的,这就会直接导致崩溃。
正点原子《STM32F4开发指南-库函数版本_V1.2》
ST《STM32F4xx中文参考手册》
ST《STM32中文参考手册_V10》
stm32后生成编译文件大小探索