欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

關(guān)于STM32的flash讀寫(xiě)數(shù)據(jù)和HardFault_Handler的問(wèn)題

作者:huqin   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月16日   【字體:

 

今天調(diào)試程序的時(shí)候需要把掉電前的數(shù)據(jù)存儲(chǔ)到flash中之后等待下次初始化的時(shí)候把數(shù)據(jù)讀進(jìn)來(lái)。

剛剛開(kāi)始的時(shí)候去找了一些stm32的flash的操作,真的是廢話(huà)連篇的真正能用到的沒(méi)幾句話(huà),這里我把自己調(diào)試好的flash讀寫(xiě)數(shù)據(jù)的子函數(shù)跟大家分享一下。

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);//擦除整頁(yè)
 FLASHstatus=FLASH_ProgramHalfWord(addr, flashdata1);//寫(xiě)入數(shù)據(jù)
 FLASH_Lock();//鎖定
}

這個(gè)子函數(shù)就是將數(shù)據(jù)flashdata1寫(xiě)到地址addr中去。數(shù)據(jù)的長(zhǎng)度是可變的。

當(dāng)需要讀入數(shù)據(jù)的時(shí)候可以直接訪問(wèn)地址,如:rdata=*(u16 *)0x08014000;   //讀flash中默認(rèn)數(shù)據(jù)

0x08014000是存儲(chǔ)的地址。

這樣大家應(yīng)該很清楚了吧。flash讀寫(xiě)數(shù)據(jù)還是比較簡(jiǎn)單的,這里希望能幫到大家。

但是在寫(xiě)入數(shù)據(jù)的時(shí)候,又遇到了另一個(gè)問(wèn)題,就是程序運(yùn)行的時(shí)候進(jìn)入到這個(gè)HardFault_Handler函數(shù)中死循環(huán)了,不知道大家有沒(méi)有遇到過(guò)這個(gè)問(wèn)題,后來(lái)我查了一些資料,發(fā)現(xiàn)可能是存儲(chǔ)器的分配有問(wèn)題。然后把地址改到更大的地方,又試了試,發(fā)現(xiàn)已經(jīng)可以了。建議大家這樣試一試。

下面是我找的關(guān)于

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

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

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

方法三:在程序中定義一個(gè)const 類(lèi)型的常量數(shù)組,無(wú)需指定其存儲(chǔ)位置。只要定義一個(gè)32位的變量存儲(chǔ)這個(gè)數(shù)組的FLASH區(qū)地址就行。

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

方法四:利用寫(xiě)保護(hù)的方式(沒(méi)研究明白)
 

關(guān)閉窗口

相關(guān)文章