這幾天做東西用到了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);
}