STM32F103 flash地址与数据存入时高低位的关系

这几天做东西用到了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,再向地址addr=0x800F000+44中存入0x55,模拟了用上面的方法在addr=0x800F000+42处存入数据0x00aa0055。
首先是直接读,程序如下简单粗暴:

u32 STMFLASH_ReadWord(u32 faddr)
{
	return *(vu32*)faddr;
}

这个方法得到的值是‭5570730‬,也就是‭0x005500AA‬,由此可知这种方法并不可行,顺便得出了结论:stm32f103是低位优先的硬件。(相关文章链接
在这种条件下,有两种方法解决这个问题让:
1.反着存 2.反着读。我选择1。
所以改动存的函数为:

void STMFLASH_WriteOneWord(u32 WriteAddr,u32 DataToWrite)
{
	u16 temp16[2];

	temp16[1]=(u16)(DataToWrite>>16);
	temp16[0]=(u16)DataToWrite;
	
	STMFLASH_Write(WriteAddr,temp16,2);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章