娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月11日(星期三)

2021年06月11日 | STM32 對內(nèi)部FLASH讀寫接口函數(shù)

發(fā)布者:自由漫步 來源: eefocus關(guān)鍵字:STM32  內(nèi)部FLASH  讀寫接口函數(shù) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

簡介:因?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");

[1] [2]
關(guān)鍵字:STM32  內(nèi)部FLASH  讀寫接口函數(shù) 引用地址:STM32 對內(nèi)部FLASH讀寫接口函數(shù)

上一篇:關(guān)于STM32初學(xué)者必知
下一篇:STM32筆記(五)RTC的初始化

推薦閱讀

還記得上世紀(jì)“超人”的扮演者克里斯托弗·里夫嗎?銀幕里,這位身高1米94、身材魁梧的“超人”有著健康的體魄,樂于助人的精神,總是披荊斬棘,救人于生死之間。然而在現(xiàn)實(shí)中,超人的扮演者里夫卻因騎馬時(shí)意外摔斷頸椎,導(dǎo)致脊髓嚴(yán)重受損,余生都將與輪椅度過。但“超人”永遠(yuǎn)擁有著鋼鐵般的意志,即使面臨如此巨變,里夫也不曾放棄希望,他始終樂觀地認(rèn)...
中國發(fā)放5G商用牌照,5G建設(shè)進(jìn)一步升溫。記者日前采訪獲悉,深圳5G網(wǎng)絡(luò)規(guī)模躋身全球城市前列,年內(nèi)將建成5G基站約8500個(gè),政務(wù)辦公、交通樞紐、教育、醫(yī)療健康、文化活動、核心商圈、高新技術(shù)產(chǎn)業(yè)聚集區(qū)等經(jīng)濟(jì)民生場景均有覆蓋?! ≈袊娦旁谏钲诓捎萌珖鴦?chuàng)新的混合組網(wǎng)模式,年內(nèi)重點(diǎn)覆蓋中心城區(qū)、黨政軍機(jī)關(guān)、大灣區(qū)科技創(chuàng)新走廊、各大口岸...
5G手機(jī)在今年看來真的要普及了。據(jù)信通院數(shù)據(jù),2020年5月,國內(nèi)手機(jī)市場總體出貨量3375.9萬部,同比降11.8%;1-5月,國內(nèi)手機(jī)市場總體出貨量累計(jì)1.24億部,同比降18.0%。2020年5月,國內(nèi)市場5G手機(jī)出貨量1564.3萬部,占同期手機(jī)出貨量的46.3%。預(yù)計(jì)下半年80%的都是5G手機(jī),希望5G套餐也能變得親民起來,那樣5G手機(jī)搭配5G套餐才合理。如今,二維碼已經(jīng)在移...
2021年6月11日,蘇黎世/深圳 瑞蘇盈科(Enclustra)仙女座 Andromeda? XZU90-17EG/19EG: 提供高達(dá)686個(gè)用戶IO的高端核心板Xilinx? Zynq? UltraScale+? MPSoC 核心板 瑞蘇盈科(Enclustra)的仙女座XZU90是仙女座(Andromeda)系列的第一款核心板,針對高端應(yīng)用進(jìn)行了模塊化和優(yōu)化設(shè)計(jì),支持高達(dá)6個(gè)Samtec ADM6-60高速連接器,提供高達(dá)686個(gè)用...

史海拾趣

問答坊 | AI 解惑

keil UV3 C51綠色精簡版更新了,僅有4M大小

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ī)

一體化攝像機(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è)細(xì)分產(chǎn)品市場分析

可視對講行業(yè)發(fā)展現(xiàn)狀     中國內(nèi)地可視對講系統(tǒng)的發(fā)展歷史已有近十年的時(shí)間,最早幾年發(fā)展比較慢,主要原因是市場需求沒有起來。最近五年左右的時(shí)間內(nèi),隨著中國內(nèi)地經(jīng)濟(jì)的穩(wěn)步發(fā)展,人民生活水平有了很大程度的提高,大量商品房推向市 ...…

查看全部問答∨

ARM的問題

請問高手ARM的AMBA總線上的橋路什么作用啊…

查看全部問答∨

急求。。。。謝謝各位大哥大姐

在IAR工作面上調(diào)式程序,在下載程序的時(shí)候總是下載不了,出現(xiàn)錯(cuò)誤提示,出現(xiàn)error,但是程序是正確的,但是程序安裝了幾次都不行,是Windows7系統(tǒng)不支持,還是其他原因????急用,謝謝各位哥哥姐姐了啊…

查看全部問答∨

新問題,為什么觸摸2419會造成芯片復(fù)位?

僅僅是觸摸2419背面,就會造成復(fù)位,這是為什么? 現(xiàn)象是: (我的板子的顯示是STN的液晶) 液晶上會產(chǎn)生一些隨機(jī)的顯示,而且滾動顯示停止(滾動顯示的時(shí)間控制是用32768晶振產(chǎn)生的定時(shí))。一旦手拿開之后,所有的顯示都能正?;謴?fù) ...…

查看全部問答∨

請教一個(gè)msp430選型的問題

大家好! 我是第一次接觸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的輸出功率測試只有-3dBm左右?

CC2530用smartRF7驅(qū)動輸出4.5dBm,CC2530通過陶瓷天線輸出,在頻譜分析儀端用棒狀天線接收。兩天線接觸測試,得輸出功率測試只有-3dBm左右,很奇怪?陶瓷天線是3dBi,棒狀天線應(yīng)該也有3dBi。并且天線與CC2530之間已經(jīng)做阻抗匹配?!?

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 措美县| 马鞍山市| 吴江市| 广德县| 丰顺县| 十堰市| 海晏县| 建德市| 长春市| 紫金县| 莫力| 武山县| 张家川| 嘉荫县| 石景山区| 岳普湖县| 伽师县| 大英县| 仙桃市| 霍山县| 灯塔市| 崇信县| 靖西县| 铜鼓县| 额尔古纳市| 冀州市| 雷山县| 会同县| 东台市| 达日县| 惠东县| 晋州市| 定安县| 巍山| 炉霍县| 万载县| 丹凤县| 漳浦县| 隆德县| 肇东市| 石嘴山市|