1. 《STM32 中文参考手册》,需要查看芯片数据手册,代码起始地址一般都是0x8000 0000,这是存放整个项目代码的起始地址

2. 编译信息查看代码大小,修改代码后第一次编译后会有这个提示信息
2.1 修改代码后编译,会有提示信息 KEIL,计算出来代码总共 61076 Byte

2.2 如果什么都没有改,直接编译是没有这个提示信息的

3. 定义Flash 保存数据的起始地址
0x08000000 是存放代码的起始地址,我们保存的数据要和代码分开,放在代码区域后面,所以后面加了个80000, 比keil 编译里面算出来的和要大将近2 万个字节,预留量很大,后期增加代码也基本不会覆盖到这里来
#define PAGE_ADDR (0x08000000 + 80000)
4. Flash 读接口, 从地址 PAGE_ADDR 处读取num 个16位的数据,保存到数组data 里面
u8 MemReadByte(u16 *data, u16 num)
{
u16 *temp_addr = (u16*)(PAGE_ADDR);
while(num--)
{
*data++= *temp_addr++;
}
return 1;
}
5. Flash 写接口,将16 位的数组 写入到Flash里面, 从地址PAGE_ADDR 开始写,写num 个数字
u8 MemWriteByte(u16 *data, u16 num)
{
FLASH_Status temp_stat;
u32 temp_addr = PAGE_ADDR;
FLASH_Unlock();
temp_stat = FLASH_ErasePage(PAGE_ADDR);
if(temp_stat != FLASH_COMPLETE)
{
FLASH_Lock();
return 0;
}
while(num--)
{
temp_stat = FLASH_ProgramHalfWord(temp_addr, *data);
if(temp_stat != FLASH_COMPLETE)
{
FLASH_Lock();
return 0;
}
temp_addr += 2;
data++;
}
FLASH_Lock();
return 1;
}
6. keil 选择芯片型号

7. 在keil 里面查看对应芯片的Flash 大小
