日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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); }

總結

以上是生活随笔為你收集整理的STM32F103 flash地址与数据存入时高低位的关系的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。