这几天做东西用到了stm32f103的内置flash模拟eeprom,其中有个32位的数据需要存储,但是正点原子的例程并没有给出直接存取32位数据的函数,于是乎自己写了个。
首先复习概念,在stm32f103中:
8比特(bit)=1字节(Byte)
4字节(Byte)=1字(Word)
存入32位数据**(错误示范)**
void STMFLASH_WriteOneWord(u32 WriteAddr,u32 DataToWrite)
{
u16 temp16[2];
temp16[0]=(u16)(DataToWrite>>16);
temp16[1]=(u16)DataToWrite;
STMFLASH_Write(WriteAddr,temp16,2);
}
原理很简单就是把传入的32位数直接拆成高16位和低16位再由正点的函数存进去。官方给的函数FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);
实际也是把32位的数存了两次16位。
接下来就是读取了,那么问题来了,正点原子给了读半字的程序:
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
return *(vu16*)faddr;
}
那我们读一字(1 Word = 4 Byte = 32 bit)的时候能不能直接读呢,或者像存的时候那样分开读再拼起来?
为了测试,先向地址addr=0x800F000+42中存入0xaa,再向地址<