簡介:因?yàn)橐脙?nèi)部FLASH代替外部EEPROM,把參數(shù)放在STM32的0x08000000+320K處,其中20K是bootloader,300K是應(yīng)用程序。
原理:先要把整頁FLASH的內(nèi)容搬到RAM中,然后在RAM中改動,然后擦除整頁FLASH,再把改動后的內(nèi)容寫入原Flash頁。下面程序調(diào)試通過。
/*******************************************************************************
* Function Name : I2C_EE_BufferRead
* Description : Reads a block of data from the EEPROM.
* Input :
* -RomAddr
* -NumByteToRead
* -pRomData
* Output : None
* Return : None
*******************************************************************************/
void I2C_EE_BufferRead(u16 RomAddr,u16 NumByteToRead,u8 *pRomData)
{
u32 param_flashbase;
u8* ptr;
param_flashbase = 0x8000000+(300+20)*1024;
ptr = (u8*)(param_flashbase + RomAddr);
while( NumByteToRead-- >0)
{
*pRomData = *ptr; //直接賦值即可
printf("0x%x ",*pRomData);
pRomData++;
ptr++;
}
return;
}
/*******************************************************************************
* Function Name : I2C_EE_BufferWrite
* Description : Write a block of data to the EEPROM.
* Input :
* -RomAddr
* -NumByteToRead
* -pRomData
* Output : None
* Return : None
*******************************************************************************/
void I2C_EE_BufferWrite(u8 DeviceType,u8 SlaveAddr,u16 RomAddr,u16 NumByteToWrite,u8 *pRomData)
{
uint32_t param_flashbase;
uint32_t tempaddress;
uint32_t startaddress;
uint32_t FlashAddress;
uint32_t datasource;
u8 buf1[PAGE_SIZE];
u8 buf2[PAGE_SIZE];
u32 pagenumber = 0x0;
u32 EraseCounter = 0x0;
u32 i = 0;
FLASH_Status FLASHStatus = FLASH_COMPLETE;
param_flashbase = 0x8000000+(300+20)*1024;
startaddress=tempaddress = param_flashbase+RomAddr;
/*********************起始指針不在Flash頁的開始端*********************/
if( (tempaddress%PAGE_SIZE) != 0)
{ printf("startptr not in Page head rn");
if( ((startaddress%PAGE_SIZE)+NumByteToWrite) > PAGE_SIZE ) /*超出一頁范圍
{
I2C_EE_BufferRead(0,0,(tempaddress-(tempaddress % PAGE_SIZE)),PAGE_SIZE,buf1); /*把起始地址所在頁的內(nèi)容讀到內(nèi)存buf1中
memcpy(buf1+(tempaddress % PAGE_SIZE),pRomData,PAGE_SIZE-(tempaddress % PAGE_SIZE)); /*把需要寫入的數(shù)據(jù)覆蓋到buf1中
while( FLASHStatus == FLASH_ErasePage(tempaddress) ) /*buf1寫入到Flash
{
i=PAGE_SIZE/4;
datasource = (uint32_t)buf1;
FlashAddress = tempaddress-(tempaddress % PAGE_SIZE);
while(i-- >0)
{
FLASH_ProgramWord(FlashAddress,*(uint32_t*)datasource);
if (*(uint32_t*)FlashAddress != *(uint32_t*)datasource)
{
printf("I2C_EE_BufferWrite error!rn");
return ;
}
datasource += 4;
FlashAddress += 4;
}
break;
}
NumByteToWrite -= PAGE_SIZE-(startaddress % PAGE_SIZE); 需要寫入字節(jié)數(shù)減去,上面覆蓋上去的數(shù)據(jù)的字節(jié)數(shù)
tempaddress += PAGE_SIZE-(tempaddress % PAGE_SIZE); /*把ptr指針指向下一個(gè)頁起始位置
if((NumByteToWrite % PAGE_SIZE) != 0) /*末指針不在Flash頁的開始端
{
//讀取1 PAGE 數(shù)據(jù)到內(nèi)存,修改,然后寫進(jìn)去
I2C_EE_BufferRead(0,0,tempaddress,PAGE_SIZE,buf2);
memcpy(buf2,pRomData+PAGE_SIZE-startaddress%PAGE_SIZE+NumByteToWrite-NumByteToWrite%PAGE_SIZE,(NumByteToWrite%PAGE_SIZE));
while( FLASHStatus == FLASH_ErasePage( tempaddress+NumByteToWrite) ) /*把buf2寫入到Flash中*
{
i=PAGE_SIZE/4;
datasource = (uint32_t)buf2;
FlashAddress = (tempaddress+NumByteToWrite-(NumByteToWrite % PAGE_SIZE)); /*末地址指針的頁首
while(i-- >0)
{
FLASH_ProgramWord(FlashAddress,*(uint32_t*)datasource);
if (*(uint32_t*)FlashAddress != *(uint32_t*)datasource)
{
printf("I2C_EE_BufferWrite error!rn");
return ;
}
datasource += 4;
FlashAddress += 4;
}
break;
}
}
NumByteToWrite -= NumByteToWrite % PAGE_SIZE;
//擦除Flash
pagenumber = NumByteToWrite/PAGE_SIZE;
for (EraseCounter = 0; (EraseCounter < pagenumber) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
{
FLASHStatus = FLASH_ErasePage( tempaddress + PAGE_SIZE*EraseCounter );
}
//寫Flash
datasource = *(uint32_t *)(pRomData+ PAGE_SIZE-(startaddress % PAGE_SIZE) );
FlashAddress = tempaddress;
while( pagenumber-- > 0 )
{
i=PAGE_SIZE/4;
while(i -- >0)
{
FLASH_ProgramWord(FlashAddress,*(uint32_t*)datasource);
if (*(uint32_t*)FlashAddress != *(uint32_t*)datasource)
{
printf("I2C_EE_BufferWrite error!rn");
return ;
}
datasource += 4;
FlashAddress += 4;
}
}
}
else /*寫的內(nèi)容沒有超出一頁范圍
{
printf("FlashWrire --in one page rn");
I2C_EE_BufferRead(0,0,(startaddress-(startaddress % PAGE_SIZE)),PAGE_SIZE,buf1); /*把起始地址所在頁的內(nèi)容讀到內(nèi)存buf1中
memcpy( (buf1+(tempaddress % PAGE_SIZE)),pRomData, NumByteToWrite ); /*把需要寫入的數(shù)據(jù)覆蓋到buf1中
while( FLASHStatus == FLASH_ErasePage(tempaddress) )
{
i=PAGE_SIZE/4;
datasource = (uint32_t)buf1;
FlashAddress = tempaddress-(tempaddress % PAGE_SIZE);
while(i-- >0)
{
FLASH_ProgramWord(FlashAddress,*(uint32_t*)datasource);
if (*(uint32_t *)FlashAddress != *(uint32_t *)datasource) /*讀取Flash中的數(shù)據(jù),看是否寫入正確
{
printf("I2C_EE_BufferWrite error!rn");
return ;
}
datasource += 4;
FlashAddress += 4;
}
break;
}
}
}
/*******************起始指針在Flash頁的開始端****************************/
else
{ printf("startptr in Page head rn");
if((NumByteToWrite % PAGE_SIZE) != 0)
{
//讀取1 PAGE 數(shù)據(jù)到內(nèi)存,修改,然后寫進(jìn)去
I2C_EE_BufferRead(0,0,(u16)(tempaddress+NumByteToWrite-(NumByteToWrite % PAGE_SIZE)),PAGE_SIZE,buf1);
printf("already copy to bug1 rn");
memcpy(buf1,pRomData+NumByteToWrite-(NumByteToWrite % PAGE_SIZE),(NumByteToWrite % PAGE_SIZE));
//end of debug
}
//擦除Flash
if( (NumByteToWrite%PAGE_SIZE) == 0 )
{
pagenumber = NumByteToWrite/PAGE_SIZE;
}
else
{
pagenumber = NumByteToWrite/PAGE_SIZE + 1;
}
for (EraseCounter = 0; (EraseCounter < pagenumber) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
{
FLASHStatus = FLASH_ErasePage(startaddress + (PAGE_SIZE * EraseCounter));
}
//寫Flash
if( pagenumber == 1) /*只有一頁
{
i=PAGE_SIZE/4;
datasource = (uint32_t)buf1;
FlashAddress = startaddress;
while(i-- >0)
{
FLASH_ProgramWord(FlashAddress,*(uint32_t *)datasource);
if (*(uint32_t *)FlashAddress != *(uint32_t *)datasource)
{
printf("I2C_EE_BufferWrite error!rn");
上一篇:關(guān)于STM32初學(xué)者必知
下一篇:STM32筆記(五)RTC的初始化
推薦閱讀
史海拾趣
Bipolarics Inc成立之初,專注于研發(fā)新型雙極性晶體管技術(shù)。在經(jīng)歷了數(shù)年的實(shí)驗(yàn)室研究后,公司成功開發(fā)出一種性能卓越、功耗更低的新型晶體管。這一技術(shù)突破使得Bipolarics Inc的產(chǎn)品在市場上迅速獲得了認(rèn)可,公司開始擴(kuò)大生產(chǎn)規(guī)模,滿足不斷增長的市場需求。隨著市場份額的逐漸擴(kuò)大,Bipolarics Inc逐漸成為了雙極性晶體管領(lǐng)域的領(lǐng)軍企業(yè)。
Bipolarics Inc成立之初,專注于研發(fā)新型雙極性晶體管技術(shù)。在經(jīng)歷了數(shù)年的實(shí)驗(yàn)室研究后,公司成功開發(fā)出一種性能卓越、功耗更低的新型晶體管。這一技術(shù)突破使得Bipolarics Inc的產(chǎn)品在市場上迅速獲得了認(rèn)可,公司開始擴(kuò)大生產(chǎn)規(guī)模,滿足不斷增長的市場需求。隨著市場份額的逐漸擴(kuò)大,Bipolarics Inc逐漸成為了雙極性晶體管領(lǐng)域的領(lǐng)軍企業(yè)。
Cambridge Electronic Industries Ltd(簡稱CEI)的創(chuàng)立,標(biāo)志著劍橋地區(qū)電子工業(yè)的一次重要飛躍。在20世紀(jì)中期,隨著電子技術(shù)的快速發(fā)展,CEI的創(chuàng)始人看到了其中的商機(jī),并決定成立一家專注于電子設(shè)備和系統(tǒng)研發(fā)制造的公司。起初,CEI主要面向當(dāng)?shù)氐男⌒推髽I(yè)和研究機(jī)構(gòu),提供定制化的電子解決方案。憑借創(chuàng)始人的技術(shù)背景和團(tuán)隊(duì)的辛勤努力,CEI逐漸在劍橋地區(qū)的電子市場中建立了良好的聲譽(yù)。
隨著產(chǎn)品線的不斷完善,AITSEMI公司開始積極尋求市場機(jī)會,并逐步在全球范圍內(nèi)建立銷售網(wǎng)絡(luò)。通過與各大消費(fèi)電子品牌的緊密合作,AITSEMI的芯片產(chǎn)品成功應(yīng)用于音頻功放和電源管理等領(lǐng)域,為全球消費(fèi)者提供了更優(yōu)質(zhì)的產(chǎn)品體驗(yàn)。同時(shí),公司還積極拓展醫(yī)療、工業(yè)控制、照明等新興市場,為公司的持續(xù)增長提供了強(qiáng)大的動力。
為了進(jìn)一步提升競爭力,AITSEMI公司積極尋求與產(chǎn)業(yè)鏈上下游企業(yè)的戰(zhàn)略合作。通過與晶圓制造、封裝測試等環(huán)節(jié)的領(lǐng)軍企業(yè)建立緊密的合作關(guān)系,AITSEMI不僅確保了穩(wěn)定的供應(yīng)鏈和優(yōu)質(zhì)的產(chǎn)品質(zhì)量,還成功實(shí)現(xiàn)了產(chǎn)業(yè)鏈的垂直整合,為公司的長遠(yuǎn)發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
作為一家有社會責(zé)任感的企業(yè),德崧電子始終關(guān)注環(huán)保和可持續(xù)發(fā)展。公司在生產(chǎn)過程中積極采用環(huán)保材料和工藝,減少對環(huán)境的影響。同時(shí),公司還積極參與公益事業(yè),為社會做出貢獻(xiàn)。例如,在疫情期間,德崧電子捐贈了一批醫(yī)療設(shè)備和物資給當(dāng)?shù)氐尼t(yī)療機(jī)構(gòu),為抗擊疫情做出了積極貢獻(xiàn)。這種勇于擔(dān)當(dāng)社會責(zé)任的精神不僅贏得了社會的贊譽(yù),也為公司樹立了良好的企業(yè)形象。
KEIL UV3 綠色精簡版 軟件名稱:KEIL UV3 更新日期:2008/6/6 大小:4.97MB 說明:KEIL UV3為51單片機(jī)最好的IDE(編程環(huán)境),內(nèi)核采用UV3 V3.31,內(nèi)置C51匯編編譯器和C編譯器,支持RTOS仿真 rip: 修正亂碼,難看的\"礦\"字不在出現(xiàn)在標(biāo)題欄 完全自動安 ...… 查看全部問答∨ |
|
一體化攝像機(jī)的關(guān)鍵技術(shù)是鏡頭、CCD和DSP處理模塊。鏡頭主要被日本廠商所掌握,如Canon、Camputar、Avenir等,在一體機(jī)領(lǐng)域提供OEM最多的是Canon鏡頭。從CCD(為攝像機(jī)優(yōu)劣的關(guān)鍵元素)看,供應(yīng)商以Sony為主,Sony產(chǎn)CCD又以民用為主流,SonyCCD分為Su ...… 查看全部問答∨ |
|
可視對講行業(yè)發(fā)展現(xiàn)狀 中國內(nèi)地可視對講系統(tǒng)的發(fā)展歷史已有近十年的時(shí)間,最早幾年發(fā)展比較慢,主要原因是市場需求沒有起來。最近五年左右的時(shí)間內(nèi),隨著中國內(nèi)地經(jīng)濟(jì)的穩(wěn)步發(fā)展,人民生活水平有了很大程度的提高,大量商品房推向市 ...… 查看全部問答∨ |
|
在IAR工作面上調(diào)式程序,在下載程序的時(shí)候總是下載不了,出現(xiàn)錯(cuò)誤提示,出現(xiàn)error,但是程序是正確的,但是程序安裝了幾次都不行,是Windows7系統(tǒng)不支持,還是其他原因????急用,謝謝各位哥哥姐姐了啊… 查看全部問答∨ |
僅僅是觸摸2419背面,就會造成復(fù)位,這是為什么? 現(xiàn)象是: (我的板子的顯示是STN的液晶) 液晶上會產(chǎn)生一些隨機(jī)的顯示,而且滾動顯示停止(滾動顯示的時(shí)間控制是用32768晶振產(chǎn)生的定時(shí))。一旦手拿開之后,所有的顯示都能正?;謴?fù) ...… 查看全部問答∨ |
大家好! 我是第一次接觸msp430系列單片機(jī),老師剛給了我一個(gè)項(xiàng)目,我想用這款單片機(jī)來實(shí)現(xiàn),它需要實(shí)現(xiàn)的功能有:1,驅(qū)動激光器電路;2,驅(qū)動一個(gè)小功率的電機(jī);3,對溫度進(jìn)行反饋控制;4,連接lcd。想請大家?guī)蛶臀?,我選那個(gè)型號的能實(shí)現(xiàn)上面的 ...… 查看全部問答∨ |
CC2530用smartRF7驅(qū)動輸出4.5dBm,CC2530通過陶瓷天線輸出,在頻譜分析儀端用棒狀天線接收。兩天線接觸測試,得輸出功率測試只有-3dBm左右,很奇怪?陶瓷天線是3dBi,棒狀天線應(yīng)該也有3dBi。并且天線與CC2530之間已經(jīng)做阻抗匹配?!? 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫的一些基本介紹
- 英飛凌發(fā)布“在中國、為中國”本土化戰(zhàn)略 三十而勵啟新篇
- 智慧農(nóng)業(yè):英特爾處理器驅(qū)動更加可持續(xù)、高效的農(nóng)業(yè)發(fā)展
- 英偉達(dá)正在用“物理AI”,徹底顛覆自動駕駛、工業(yè)、機(jī)器人和智慧城市
- 臺積電-東京大學(xué)實(shí)驗(yàn)室啟用,雙方聯(lián)手推動半導(dǎo)體研究和教育
- ?意法半導(dǎo)體大巴窯工廠落地創(chuàng)新冷卻系統(tǒng),提升可持續(xù)發(fā)展能力
- Nordic Semiconductor聯(lián)同Omnispace和Gatehouse Satcom完成5G NB-IoT衛(wèi)星演示
- 英偉達(dá)開啟“攻城略地”模式,擬在歐洲建設(shè)20座AI工廠
- 臺積電:日本JASM第二晶圓廠預(yù)計(jì)今年下半年動工
- 工信部:支持車企“60天賬期”承諾,促進(jìn)產(chǎn)業(yè)健康發(fā)展
- 全球十大芯片代工廠最新排名!中芯國際沖擊世界第二
- 是時(shí)候充充電啦!村田寵粉月重磅開啟!
- 『ADI實(shí)驗(yàn)室電路DIY大賽』正式啟動!
- 泰克 MSO6B 探索營:設(shè)計(jì)資源集錦
- EEWorld邀你來拆解(第10期)——玩具總動員
- 尋寶大冒險(xiǎn),搜索有好禮!
- 直播已結(jié)束【Molex 新能源汽車低壓連接器解決方案】
- 直播已結(jié)束【用于光伏逆變器/儲能系統(tǒng)的歐姆龍繼電器 /開關(guān)/連接器解決方案】
- 下載有禮|是德科技:測試設(shè)備如何影響產(chǎn)品質(zhì)量調(diào)研報(bào)告
- TI單芯片毫米波傳感器產(chǎn)品組合新品發(fā)布會,誠邀參與,預(yù)注冊贏好禮
- 格力終于對數(shù)控機(jī)床下手了!合作楚天華興只是第一步
- 工業(yè)機(jī)器人如何實(shí)現(xiàn)國產(chǎn)崛起?標(biāo)準(zhǔn)先行是關(guān)鍵
- RIGOL懸賞800萬廣邀天下奇才獻(xiàn)計(jì)獻(xiàn)策
- 5nm麒麟處理器要來勒
- vivo首批適配Android 11預(yù)覽版機(jī)型 即日可升級
- 英特爾人工智能——專為實(shí)際應(yīng)用打造的工具
- MPS可擴(kuò)展模塊一讓大電流設(shè)計(jì)更加簡潔
- 超值特性引領(lǐng)Cortex?-M23內(nèi)核全面普及,兆易創(chuàng)新GD32E230
- Zigbee技術(shù)的實(shí)際應(yīng)用分析
- 技術(shù)干貨:新能源汽車CAN總線與功率分析同步測試解決方案
- 軟件測試經(jīng)典資料大推薦(十七)---軟件測試方法和技術(shù)
- 兩片計(jì)數(shù)器連接,進(jìn)行擴(kuò)展,消除毛刺的問題,求助?。?/span>
- 基于FPGA的高速高質(zhì)量圖像旋轉(zhuǎn).pdf
- 30歲面霸IT男30次面試失敗經(jīng)歷
- MSP430F5438A單片機(jī)基于SPI的FatFs移植
- 全國各地連續(xù)高溫,你,還好嗎?
- 有誰知道傳感器芯片型號?
- TI C54xx DSP 十天速成講義 <一>
- 家用電器如果電壓太高很容易燒毀,做個(gè)保護(hù)器應(yīng)該怎么做?
- 求高手幫解個(gè)題,占空比問題!