<object id="k0taz"><form id="k0taz"></form></object>
<pre id="k0taz"></pre>
      1. <table id="k0taz"></table>
        <bdo id="k0taz"><center id="k0taz"></center></bdo>
        <table id="k0taz"><option id="k0taz"></option></table><track id="k0taz"><ruby id="k0taz"></ruby></track>
        專注電子技術學習與研究
        當前位置:單片機教程網 >> STM32 >> 瀏覽文章

        關于STM32的flash讀寫數據和HardFault_Handler的問題

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年04月16日   【字體:

         

        今天調試程序的時候需要把掉電前的數據存儲到flash中之后等待下次初始化的時候把數據讀進來。

        剛剛開始的時候去找了一些stm32的flash的操作,真的是廢話連篇的真正能用到的沒幾句話,這里我把自己調試好的flash讀寫數據的子函數跟大家分享一下。

        void FLASH_WriteByte(u32 addr ,u16 flashdata1)
        {
         FLASH_Status FLASHstatus = FLASH_COMPLETE;
         FLASH_Unlock();//解鎖
         FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
         FLASHstatus=FLASH_ErasePage(addr);//擦除整頁
         FLASHstatus=FLASH_ProgramHalfWord(addr, flashdata1);//寫入數據
         FLASH_Lock();//鎖定
        }

        這個子函數就是將數據flashdata1寫到地址addr中去。數據的長度是可變的。

        當需要讀入數據的時候可以直接訪問地址,如:rdata=*(u16 *)0x08014000;   //讀flash中默認數據

        0x08014000是存儲的地址。

        這樣大家應該很清楚了吧。flash讀寫數據還是比較簡單的,這里希望能幫到大家。

        但是在寫入數據的時候,又遇到了另一個問題,就是程序運行的時候進入到這個HardFault_Handler函數中死循環了,不知道大家有沒有遇到過這個問題,后來我查了一些資料,發現可能是存儲器的分配有問題。然后把地址改到更大的地方,又試了試,發現已經可以了。建議大家這樣試一試。

        下面是我找的關于

        防止誤擦除有用程序代碼的方法
        方法一:首先要計算程序代碼有多少,把FLASH存取地址設置在程序代碼以外的地方,這樣就不會破壞用戶程序。原則上從0x0800 0000 + 0x1000 以后的FLASH空間都可以作為存儲使用。如果代碼量占了 0x3000, 那么存儲在 0x0800 0000+ 0x4000 以后的空間就不會破壞程序了。

        方法二:先在程序中定義一個const 類型的常量數組,并指定其存儲位置(方便找到寫入、讀取位置),這樣編譯器就會分配你指定的空間將常量數組存入FLASH中。當你做擦除。讀寫操作時,只要在這個常量數組所在的地址范圍就好。

          const uint8_t table[10] __at(0x08010000) = {0x55} ;
          MDK3.03A開始就支持關鍵字 __at() 。
          需要加#include

        方法三:在程序中定義一個const 類型的常量數組,無需指定其存儲位置。只要定義一個32位的變量存儲這個數組的FLASH區地址就行。

          uint32_t address;//STM32的地址是32位的
          const uint8_t imageBuffer[1024] = {0,1,2,3,4,5,6,7};
          address = (uint32_t) imageBuffer;

        方法四:利用寫保護的方式(沒研究明白)
         

        關閉窗口

        相關文章

        欧美国产伦久久久久_亚洲爽爽一区二区三区_一色屋精品视频在线观看免费_久久伊人成色777综合网
        <object id="k0taz"><form id="k0taz"></form></object>
        <pre id="k0taz"></pre>
          1. <table id="k0taz"></table>
            <bdo id="k0taz"><center id="k0taz"></center></bdo>
            <table id="k0taz"><option id="k0taz"></option></table><track id="k0taz"><ruby id="k0taz"></ruby></track>