久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2788|回復: 2
打印 上一主題 下一主題
收起左側

STM32 FLASH 模擬EEPROM程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:389674 發表于 2020-2-21 09:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  1. #include "stmflash.h"
  2. #include "delay.h"




  3. //讀取指定地址的半字(16位數據)
  4. //faddr:讀地址(此地址必須為2的倍數!!)
  5. //返回值:對應數據.
  6. u16 STMFLASH_ReadHalfWord(u32 faddr)
  7. {
  8.         return *(vu16*)faddr;
  9. }
  10. #if STM32_FLASH_WREN        //如果使能了寫   
  11. //不檢查的寫入
  12. //WriteAddr:起始地址
  13. //pBuffer:數據指針
  14. //NumToWrite:半字(16位)數   
  15. void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)   
  16. {                                           
  17.         u16 i;
  18.         for(i=0;i<NumToWrite;i++)
  19.         {
  20.                 FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
  21.             WriteAddr+=2;//地址增加2.
  22.         }  
  23. }
  24. //從指定地址開始寫入指定長度的數據
  25. //WriteAddr:起始地址(此地址必須為2的倍數!!)
  26. //pBuffer:數據指針
  27. //NumToWrite:半字(16位)數(就是要寫入的16位數據的個數.)
  28. #if STM32_FLASH_SIZE<256
  29. #define STM_SECTOR_SIZE 1024 //字節
  30. #else
  31. #define STM_SECTOR_SIZE        2048
  32. #endif                 
  33. u16 STMFLASH_BUF[STM_SECTOR_SIZE/2];//最多是2K字節
  34. void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)       
  35. {
  36.         u32 secpos;           //扇區地址
  37.         u16 secoff;           //扇區內偏移地址(16位字計算)
  38.         u16 secremain; //扇區內剩余地址(16位字計算)          
  39.         u16 i;   
  40.         u32 offaddr;   //去掉0X08000000后的地址
  41.         if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址
  42.         FLASH_Unlock();                                                //解鎖
  43.         offaddr=WriteAddr-STM32_FLASH_BASE;                //實際偏移地址.
  44.         secpos=offaddr/STM_SECTOR_SIZE;                        //扇區地址  0~127 for STM32F103RBT6
  45.         secoff=(offaddr%STM_SECTOR_SIZE)/2;                //在扇區內的偏移(2個字節為基本單位.)
  46.         secremain=STM_SECTOR_SIZE/2-secoff;                //扇區剩余空間大小   
  47.         if(NumToWrite<=secremain)secremain=NumToWrite;//不大于該扇區范圍
  48.         while(1)
  49.         {       
  50.                 STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//讀出整個扇區的內容
  51.                 for(i=0;i<secremain;i++)//校驗數據
  52.                 {
  53.                         if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除            
  54.                 }
  55.                 if(i<secremain)//需要擦除
  56.                 {
  57.                         FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除這個扇區
  58.                         for(i=0;i<secremain;i++)//復制
  59.                         {
  60.                                 STMFLASH_BUF[i+secoff]=pBuffer[i];          
  61.                         }
  62.                         STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//寫入整個扇區  
  63.                 }else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//寫已經擦除了的,直接寫入扇區剩余區間.                                   
  64.                 if(NumToWrite==secremain)break;//寫入結束了
  65.                 else//寫入未結束
  66.                 {
  67.                         secpos++;                                //扇區地址增1
  68.                         secoff=0;                                //偏移位置為0          
  69.                            pBuffer+=secremain;          //指針偏移
  70.                         WriteAddr+=secremain;        //寫地址偏移          
  71.                            NumToWrite-=secremain;        //字節(16位)數遞減
  72.                         if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一個扇區還是寫不完
  73.                         else secremain=NumToWrite;//下一個扇區可以寫完了
  74.                 }         
  75.         };       
  76.         FLASH_Lock();//上鎖
  77. }
  78. #endif

  79. //從指定地址開始讀出指定長度的數據
  80. //ReadAddr:起始地址
  81. //pBuffer:數據指針
  82. //NumToWrite:半字(16位)數
  83. void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)          
  84. {
  85.         u16 i;
  86.         for(i=0;i<NumToRead;i++)
  87.         {
  88.                 pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//讀取2個字節.
  89.                 ReadAddr+=2;//偏移2個字節.       
  90.         }
  91. }

  92. //////////////////////////////////////////////////////////////////////////////////////////////////////
  93. //WriteAddr:起始地址
  94. //WriteData:要寫入的數據
  95. void Test_Write(u32 WriteAddr,u16 WriteData)          
  96. {
  97.         STMFLASH_Write(WriteAddr,&WriteData,1);//寫入一個字
  98. }
復制代碼

全部資料51hei下載地址:
FLASH模擬EEPROM實驗.7z (180.62 KB, 下載次數: 61)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:108573 發表于 2020-2-22 09:43 | 只看該作者
原理是先讀出來flash中的數據,然后再擦除flash,然后再更改要寫入的數據,最后再寫入
回復

使用道具 舉報

板凳
ID:670155 發表于 2021-1-5 16:50 | 只看該作者
這是正點原子的例程吧
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品自拍视频 | 日本电影一区二区 | 亚洲欧美一区二区三区国产精品 | av在线免费网 | 亚洲免费一区二区 | 在线观看国产www | 天天综合国产 | 久久久tv| 三级高清 | 亚洲一区二区三区在线视频 | 中文字幕 在线观看 | 久久精品国产亚洲一区二区 | 美女久久视频 | 日韩一二区| 欧美国产精品一区二区三区 | 欧美一级黄色免费看 | 电影91久久久 | 黄色一级大片在线观看 | 精品日韩一区二区 | 国产成人精品免高潮在线观看 | 日本成人中文字幕 | 亚洲伊人a| 国产激情在线播放 | 国产成人综合久久 | 日韩精品| 国产视频三级 | 国产真实乱对白精彩久久小说 | 人人人人干 | 亚洲精品91| 九九九精品视频 | 日韩精品一区二区三区中文字幕 | 国产激情在线播放 | 亚洲男女视频在线观看 | 日韩欧美一级片 | 亚洲午夜三级 | 国产精品一区二区不卡 | 国产小视频在线看 | 中文字幕一区二区三区不卡 | 韩国毛片视频 | 在线播放精品视频 | 久久精品国产一区二区三区不卡 |