STM32 Flash具体说明不在这里累赘,想知道的自己百度吧,我拿stm32f103c8t6来举例吧,stm32f103c8t6是中等容量的芯片,flash大小为64K,每页大小为1K,通常我们代码不是很大的话可以直接将我们要保存的东西放到后面几K就可以,MDK软件编译完成是可以看到程序所占内存的。当然这里需要选择全编译。
例如:Program Size: Code=10332 RO-data=336 RW-data=152 ZI-data=3248
上面的大小则可以计算出flash的大小。flash=10332/1024+336/1024=10.4K左右。
地址擦除为一页的,一般定义整个页的地址,stm32 flash起始地址为0x08000000
#define Page60_addr (0x08000000+60*1024)
#define Page62_addr (0x08000000+62*1024)
#ifndef __DATAFLASH_H
#define __DATAFLASH_H
#include "stm32f10x.h"
#include "stm32f10x_flash.h"
void FLASH_WriteByte(uint32_t addr , uint8_t *p , uint16_t Byte_Num);
void FLASH_ReadByte(uint32_t addr , uint8_t *p , uint16_t Byte_Num) ;
#endif
#include "dataflash.h"
/*
功能:向指定地址写入数据
参数说明:addr 写入的FLASH页的首地址
p 被写入变量的地址(数组中的必须是uint8_t类型,元素个数必须是偶数)
Byte_Num 被写入变量的字节数(必须是偶数)
*/
void FLASH_WriteByte(uint32_t addr , uint8_t *p , uint16_t Byte_Num)
{
uint32_t HalfWord;
Byte_Num = Byte_Num/2;
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
FLASH_ErasePage(addr);
while(Byte_Num --)
{
HalfWord=*(p++);
HalfWord|=*(p++)<<8;
FLASH_ProgramHalfWord(addr, HalfWord);
addr += 2;
}
FLASH_Lock();
}
/*
功能:从指定地址读取数据
参数说明:addr 从FLASH中读取的地址
p 读取后要存入变量的地址(数组中的必须是uint8_t类型)
Byte_Num 要读出的字节数
*/
void FLASH_ReadByte(uint32_t addr , uint8_t *p , uint16_t Byte_Num)
{
while(Byte_Num--)
{
*(p++)=*((uint8_t*)addr++);
}
}