你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F7 内部flash操作启动

[复制链接]
STMCU小助手 发布时间:2021-12-11 12:00
总体来说与STM32F4操作是一样的,就是扇区大小变化了,测试过程中发现当PG=1之后立即写入数据到flash会造成编程顺序错误,通过增加一个nop的延时即可解决此问题,还可以通过将多个数据连续烧写的方式避免此问题,就是当PG=1之后,把所有数据都烧写完成后再将PG=0,不要频繁的开关。

  1. /*************************************************************************************************************
  2. * 文件名:                        stm32f7_flash.c
  3. * 功能:                        STM32F7 内部FLASH编程驱动函数
  4. * 作者:                        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  5. * 创建时间:                2013-10-20
  6. * 最后修改时间:        2020-02-07
  7. * 详细:                        用于STM32F7内部flash读写驱动
  8.                                         默认为3.3V供电,并且宽度为32bit;
  9.                                         扇区擦除最长时间:32KB扇区500ms;128KB扇区1.1秒;256KB扇区:2秒
  10.                                         修复STM32F7开始写入数据时,PG=1后没有延时导致异常,增加批量写入多个字的数据函数STM32FLASH_WriteMultipledWord()支持。
  11. *************************************************************************************************************/
  12. #include "stm32f7_flash.h"
  13. #include "system.h"
  14. #if(SYS_WDG_EN_) //使能了看门狗
  15. #include "wdg.h"
  16. #endif //SYS_WDG_EN_




  17. /*************************************************************************************************************************
  18. * 函数                        :        void STM32FLASH_Unlock(void)
  19. * 功能                        :        解锁STM32的FLASH
  20. * 参数                        :        无
  21. * 返回                        :        无
  22. * 依赖                        :        底层
  23. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  24. * 时间                        :        2013-10-20
  25. * 最后修改时间         :         2013-10-20
  26. * 说明                        :         
  27. *************************************************************************************************************************/
  28. void STM32FLASH_Unlock(void)
  29. {
  30.         FLASH->KEYR=FLASH_KEY1;        //写入解锁序列.
  31.         FLASH->KEYR=FLASH_KEY2;
  32. }



  33. /*************************************************************************************************************************
  34. * 函数                        :        void STM32FLASH_Lock(void)
  35. * 功能                        :        上锁STM32的FLASH
  36. * 参数                        :        无
  37. * 返回                        :        无
  38. * 依赖                        :        底层
  39. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  40. * 时间                        :        2013-10-20
  41. * 最后修改时间         :         2018-01-13
  42. * 说明                        :         
  43. *************************************************************************************************************************/
  44. void STM32FLASH_Lock(void)
  45. {
  46.         FLASH->CR|=(u32)1<<31;                        //上锁
  47. }




  48. /*************************************************************************************************************************
  49. * 函数                        :        STM32FLASH_STATUS STM32FLASH_GetStatus(void)
  50. * 功能                        :        得到FLASH状态
  51. * 参数                        :        无
  52. * 返回                        :        STM32FLASH_STATUS
  53. * 依赖                        :        底层
  54. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  55. * 时间                        :        2013-10-20
  56. * 最后修改时间         :         2018-01-03
  57. * 说明                        :         
  58. *************************************************************************************************************************/
  59. STM32FLASH_STATUS STM32FLASH_GetStatus(void)
  60. {        
  61.         u32 temp=FLASH->SR;
  62.         
  63.         if(temp&(1<<16))return STM32FLASH_BUSY;                        //忙
  64.         else if(temp&(1<<4))return STM32FLASH_WPRERR;        //写保护错误
  65.         else if(temp&(1<<5))return STM32FLASH_PGAERR;        //编程对齐错误
  66.         else if(temp&(1<<6))return STM32FLASH_PGPERR;        //并行位数错误
  67.         else if(temp&(1<<7))return STM32FLASH_PGSERR;        //擦除顺序错误
  68.         else if(temp&(1<<1))return STM32FLASH_OPERR;        //操作错误
  69.         return STM32FLASH_OK;                                                        //操作完成
  70. }



  71. /*************************************************************************************************************************
  72. * 函数                        :        STM32FLASH_STATUS STM32FLASH_WaitDone(u32 time)
  73. * 功能                        :        等待操作完成
  74. * 参数                        :        time:要延时的长短,单位us
  75. * 返回                        :        STM32FLASH_STATUS
  76. * 依赖                        :        底层
  77. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  78. * 时间                        :        2013-10-20
  79. * 最后修改时间         :         2018-01-03
  80. * 说明                        :         2018-03-24:增加清除看门狗功能
  81. *************************************************************************************************************************/
  82. STM32FLASH_STATUS STM32FLASH_WaitDone(u32 time)
  83. {
  84.         STM32FLASH_STATUS status;
  85.         
  86.         if(time < 1) time = 1;
  87.         do
  88.         {
  89.                 status=STM32FLASH_GetStatus();                        //获取状态
  90.                 if(status!=STM32FLASH_BUSY)break;                //非忙,无需等待了,直接退出.
  91.                 Delay_US(1);
  92.                 time--;
  93.                
  94. #if(SYS_WDG_EN_) //使能了看门狗
  95.                 IWDG_Feed();
  96. #endif //SYS_WDG_EN_        
  97.                
  98.          }while(time);

  99.          return status;
  100. }



  101. /*************************************************************************************************************************
  102. * 函数                        :        STM32FLASH_STATUS STM32FLASH_EraseSector(u8 sectoraddr)
  103. * 功能                        :        扇区擦除
  104. * 参数                        :        sectoraddr:扇区地址,0-11
  105. * 返回                        :        STM32FLASH_STATUS
  106. * 依赖                        :        底层
  107. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  108. * 时间                        :        2018-01-03
  109. * 最后修改时间         :         2018-01-03
  110. * 说明                        :         扇区大小:0~3:16KB扇区;4:64KB扇区;5~11:128KB扇区
  111.                                         128KB扇区擦除足最大2秒
  112.                                         2018-01-16:修复扇区擦除时没有解锁问题
  113. *************************************************************************************************************************/
  114. STM32FLASH_STATUS STM32FLASH_EraseSector(u8 sectoraddr)
  115. {
  116.         STM32FLASH_STATUS status;
  117.         
  118.         if(FLASH->SR)                                                                //有错误,需要清除,测试过程中,发现偶尔启动后会有错误出现
  119.         {
  120.                 DEBUG("需要清除flash错误标记,FLASH_SR=0x%X  FLASH_CR=0x%X\r\n",FLASH->SR, FLASH->CR);
  121.                 FLASH->SR |= FLASH->SR;
  122.                 DEBUG("FLASH_SR=0x%X  FLASH_CR=0x%X\r\n",FLASH->SR, FLASH->CR);
  123.         }
  124.         
  125.         status=STM32FLASH_WaitDone(2100000);        //等待上次操作完成,最大时间2秒,如果已经操作完成了会直接跳过
  126.         
  127.         STM32FLASH_Unlock();                                        //解锁
  128.         if(status==STM32FLASH_OK)                                //没有错误
  129.         {
  130.                 FLASH->CR&=~(3<<8);                                        //清除PSIZE原来的设置
  131.                 FLASH->CR|=2<<8;                                        //设置为32bit宽,确保VCC=2.7~3.6V之间!!
  132.                 FLASH->CR&=~(0XF<<3);                                //清除原来的设置
  133.                 FLASH->CR|=(sectoraddr&0x7)<<3;                //设置要擦除的扇区
  134.                 FLASH->CR|=1<<1;                                        //扇区擦除
  135.                 FLASH->CR|=1<<16;                                        //开始擦除
  136.                 status=STM32FLASH_WaitDone(2300000);//等待操作结束,最大2s  
  137.                 if(status!=STM32FLASH_BUSY)                        //非忙
  138.                 {
  139.                         FLASH->CR&=~(1<<1);                                //清除扇区擦除标志.
  140.                 }
  141.         }
  142.         //DEBUG("扇区擦除状态:%d\r\n", status);
  143.         //DEBUG("FLASH_SR=0x%X  FLASH_CR=0x%X\r\n", FLASH->SR, FLASH->CR);
  144.         
  145.         STM32FLASH_Lock();                                                //上锁
  146.         if(status != STM32FLASH_OK)
  147.         {
  148.                 DEBUG("擦除扇区%d失败(错误:%d) FLASH_SR=0x%X  FLASH_CR=0x%X\r\n",sectoraddr, status, FLASH->SR, FLASH->CR);
  149.         }

  150.         return status;                                                        //返回状态
  151. }




  152. /*************************************************************************************************************************
  153. * 函数                        :        STM32FLASH_STATUS STM32FLASH_WritedWord(u32 faddr, u32 data)
  154. * 功能                        :        在FLASH指定地址写入一个字的数据(32bit写入)
  155. * 参数                        :        faddr:指定地址(此地址必须为4的倍数!!);data:要写入的数据
  156. * 返回                        :        STM32FLASH_STATUS
  157. * 依赖                        :        底层
  158. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  159. * 时间                        :        2018-01-03
  160. * 最后修改时间         :         2018-01-03
  161. * 说明                        :         警告,地址必须为4的倍数
  162.                                         2020-02-08执行PG=1须增加延时,否则可能出现顺序错误,不会执行flash解锁
  163.                                         不会判断是否能写入
  164. *************************************************************************************************************************/
  165. STM32FLASH_STATUS STM32FLASH_WritedWord(u32 faddr, u32 data)
  166. {
  167.         STM32FLASH_STATUS status;
  168.         
  169.         status=STM32FLASH_WaitDone(200);                 //判断状态
  170.         if(status==STM32FLASH_OK)                                //没有错误
  171.         {
  172.                 FLASH->CR&=~(3<<8);                                        //清除PSIZE原来的设置
  173.                 FLASH->CR|=2<<8;                                        //设置为32bit宽,确保VCC=2.7~3.6V之间!!
  174.                  FLASH->CR|=1<<0;                                        //编程使能,测试发现使能编程后不延时会出现编程顺序错误
  175.                 nop;nop;nop;nop;                                        //2020-02-08 此处必须增加延时,否则可能出现顺序错误        
  176.                 *(vu32*)faddr=data;                                        //写入数据
  177.                 status=STM32FLASH_WaitDone(200);        //等待操作完成,一个字编程,最多100us.
  178.                 if(status!=STM32FLASH_BUSY)                        //非忙
  179.                 {        
  180.                         FLASH->CR&=~(1<<0);                                //清除PG位
  181.                 }
  182.         }

  183.         if(status != STM32FLASH_OK)
  184.         {
  185.                 DEBUG("FLASH写入错误(%d)FLASH_SR=0x%X  FLASH_CR=0x%X\r\n",status, FLASH->SR, FLASH->CR);
  186.         }
  187.         
  188.         return status;
  189. }


  190. /*************************************************************************************************************************
  191. * 函数                        :        STM32FLASH_STATUS STM32FLASH_WriteMultipledWord(u32 faddr, u32 data[], u32 dWordCount)
  192. * 功能                        :        在FLASH指定地址写入多个字的数据(32bit连续写入,提高效率)
  193. * 参数                        :        faddr:指定地址(此地址必须为4的倍数);data:要写入的数据
  194. * 返回                        :        STM32FLASH_STATUS
  195. * 依赖                        :        底层
  196. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  197. * 时间                        :        2020-02-08
  198. * 最后修改时间         :         2020-02-08
  199. * 说明                        :         警告,地址必须为4的倍数
  200.                                         2020-02-08执行PG=1须增加延时,否则可能出现顺序错误,不会执行flash解锁
  201.                                         不会判断是否能写入
  202. *************************************************************************************************************************/
  203. STM32FLASH_STATUS STM32FLASH_WriteMultipledWord(u32 faddr, u32 data[], u32 dWordCount)
  204. {
  205.         STM32FLASH_STATUS status;

  206.         status=STM32FLASH_WaitDone(200);                 //判断状态
  207.         if(status==STM32FLASH_OK)                                //没有错误
  208.         {
  209.                 FLASH->CR&=~(3<<8);                                        //清除PSIZE原来的设置
  210.                 FLASH->CR|=2<<8;                                        //设置为32bit宽,确保VCC=2.7~3.6V之间!!
  211.                  FLASH->CR|=1<<0;                                        //编程使能,测试发现使能编程后不延时会出现编程顺序错误
  212.                 nop;nop;nop;nop;                                        //2020-02-08 此处必须增加延时,否则可能出现顺序错误        
  213.                 while(dWordCount --)
  214.                 {
  215.                         *(vu32*)faddr=*data++;                                //写入数据
  216.                         faddr +=4;                                                        //地址自增+4
  217.                         status=STM32FLASH_WaitDone(200);        //等待操作完成,一个字编程,最多100us.
  218.                         if(status!=STM32FLASH_OK)                        //有错误
  219.                         {
  220.                                 break;
  221.                         }
  222.                 }

  223.                 if(status!=STM32FLASH_BUSY)                        //非忙
  224.                 {        
  225.                         FLASH->CR&=~(1<<0);                                //清除PG位
  226.                 }
  227.         }

  228.         if(status != STM32FLASH_OK)
  229.         {
  230.                 DEBUG("FLASH写入错误(%d)FLASH_SR=0x%X  FLASH_CR=0x%X\r\n",status, FLASH->SR, FLASH->CR);
  231.         }
  232.         
  233.         return status;
  234. }


  235. /*************************************************************************************************************************
  236. * 函数                        :        u32 STM32FLASH_ReadWord(u32 faddr)
  237. * 功能                        :        读取指定地址的一个字(32位数据)
  238. * 参数                        :        faddr:指定地址(此地址必须为4的倍数!!);
  239. * 返回                        :        数据
  240. * 依赖                        :        底层
  241. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  242. * 时间                        :        2018-01-03
  243. * 最后修改时间         :         2018-01-03
  244. * 说明                        :         警告:地址必须是4的整数倍
  245. *************************************************************************************************************************/
  246. __inline u32 STM32FLASH_ReadWord(u32 faddr)
  247. {
  248.         return *(vu32*)faddr;
  249. }


  250. /*************************************************************************************************************************
  251. * 函数                        :        u8 STM32FLASH_GetFlashSector(u32 faddr)
  252. * 功能                        :        获取某个地址所在的扇区
  253. * 参数                        :        faddr:指定地址
  254. * 返回                        :        删除编号,0-6,如果超出了也会限制到6
  255. * 依赖                        :        底层
  256. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  257. * 时间                        :        2018-01-03
  258. * 最后修改时间         :         2018-01-03
  259. * 说明                        :         地址请不要超出范围
  260. *************************************************************************************************************************/
  261. u8 STM32FLASH_GetFlashSector(u32 faddr)
  262. {
  263.         if(faddr<ADDR_FLASH_SECTOR_1)                return 0;
  264.         else if(faddr<ADDR_FLASH_SECTOR_2)        return 1;
  265.         else if(faddr<ADDR_FLASH_SECTOR_3)        return 2;
  266.         else if(faddr<ADDR_FLASH_SECTOR_4)        return 3;
  267.         else if(faddr<ADDR_FLASH_SECTOR_5)        return 4;
  268.         else if(faddr<ADDR_FLASH_SECTOR_6)        return 5;
  269.         else if(faddr<ADDR_FLASH_SECTOR_7)        return 6;
  270.         else return 7;        
  271. }


  272. /*************************************************************************************************************************
  273. * 函数                        :        STM32FLASH_STATUS STM32FLASH_Write_NoCheck(u32 WriteAddr,u32 *pBuffer,u16 NumToWrite)  
  274. * 功能                        :        不检查的写入
  275. * 参数                        :        WriteAddr:起始地址(必须是4个整数倍);pBuffer:数据指针;NumToWrite:半(32位)数
  276. * 返回                        :        状态
  277. * 依赖                        :        底层
  278. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  279. * 时间                        :        2013-10-20
  280. * 最后修改时间         :         2018-01-03
  281. * 说明                        :         地址必须为4对齐,如果出现了非FF写入程序会报错并返回(由于STM32硬件会对写入区域进行检查,非FF区域不允许写入)
  282. *************************************************************************************************************************/
  283. STM32FLASH_STATUS STM32FLASH_Write_NoCheck(u32 WriteAddr,u32 *pBuffer,u16 NumToWrite)   
  284. {                                          
  285.         STM32FLASH_STATUS status;
  286.         
  287.         if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return STM32FLASH_PGPERR ;        //非法地址,如果不是4的倍数,返回并行错误
  288.         STM32FLASH_Unlock();                                                //解锁
  289.         if(FLASH->SR)                                                                //有错误,需要清除,测试过程中,发现偶尔启动后会有错误出现
  290.         {
  291.                 DEBUG("需要清除flash错误标记,FLASH_SR=0x%X  FLASH_CR=0x%X\r\n",FLASH->SR, FLASH->CR);
  292.                 FLASH->SR |= FLASH->SR;
  293.                 DEBUG("FLASH_SR=0x%X  FLASH_CR=0x%X\r\n",FLASH->SR, FLASH->CR);
  294.         }
  295.         status = STM32FLASH_WriteMultipledWord(WriteAddr, pBuffer, NumToWrite);        //写入多个字的数据
  296.         STM32FLASH_Lock();                                                        //上锁
  297.         return status;
  298. }


  299. /*************************************************************************************************************************
  300. * 函数                        :        STM32FLASH_STATUS STM32FLASH_WritedWord_NoCheck(u32 WriteAddr,u32 data)   
  301. * 功能                        :        不检查的写入一个字
  302. * 参数                        :        WriteAddr:起始地址(必须是4个整数倍);data:要写入的数据值
  303. * 返回                        :        状态
  304. * 依赖                        :        底层
  305. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  306. * 时间                        :        2020-02-08
  307. * 最后修改时间         :         2020-02-08
  308. * 说明                        :         地址必须为4对齐,如果出现了非FF写入程序会报错并返回(由于STM32硬件会对写入区域进行检查,非FF区域不允许写入)
  309. *************************************************************************************************************************/
  310. STM32FLASH_STATUS STM32FLASH_WritedWord_NoCheck(u32 WriteAddr,u32 data)   
  311. {                                          
  312.         STM32FLASH_STATUS status;
  313.         
  314.         if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return STM32FLASH_PGPERR ;        //非法地址,如果不是4的倍数,返回并行错误
  315.         STM32FLASH_Unlock();                                                                                                        //解锁
  316.         if(FLASH->SR)                                                                //有错误,需要清除,测试过程中,发现偶尔启动后会有错误出现
  317.         {
  318.                 DEBUG("需要清除flash错误标记,FLASH_SR=0x%X  FLASH_CR=0x%X\r\n",FLASH->SR, FLASH->CR);
  319.                 FLASH->SR |= FLASH->SR;
  320.                 DEBUG("FLASH_SR=0x%X  FLASH_CR=0x%X\r\n",FLASH->SR, FLASH->CR);
  321.         }
  322.         status = STM32FLASH_WritedWord(WriteAddr, data);                                                //写入1个字的数据
  323.         STM32FLASH_Lock();                                                                                                                //上锁
  324.         return status;
  325. }


  326. /*************************************************************************************************************************
  327. * 函数                        :        STM32FLASH_STATUS STM32FLASH_Write(u32 WriteAddr,u32 *pBuffer,u16 NumToWrite)        
  328. * 功能                        :        从指定地址开始写入指定长度的数据(数据长度字为单位)
  329. * 参数                        :        WriteAddr:起始地址(此地址必须为4的倍数!!);pBuffer:数据指针;NumToWrite:字(32位)数(就是要写入的32位数据的个数.)
  330. * 返回                        :        0:完成;1:忙;2:错误;3:写保护
  331. * 依赖                        :        底层
  332. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  333. * 时间                        :        2013-10-20
  334. * 最后修改时间         :         2016-01-07
  335. * 说明                        :         警告:由于STM32F4的扇区太大,无法使用内存进行缓存,如果要写入的位置有非FF,会直接将整个扇区进行擦除,并丢失其它的数据
  336.                                         如果需要保存其他的数据,请在应用层进行实现(比如:先读取扇区,修改扇区,擦除扇区,写入扇区,需要大内存支持)
  337. *************************************************************************************************************************/
  338. STM32FLASH_STATUS STM32FLASH_Write(u32 WriteAddr,u32 *pBuffer,u16 NumToWrite)        
  339. {
  340.         STM32FLASH_STATUS status;
  341.         u32 addrx=0;
  342.         u32 endaddr=0;        
  343.          
  344.         if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return STM32FLASH_PGPERR;        //非法地址
  345.         
  346.          FLASH->ACR&=~(1<<10);                                                                //FLASH擦除期间,必须禁止数据缓存!!!搞了我两晚上才发现这个问题!
  347.         addrx=WriteAddr;                                                                        //写入的起始地址
  348.         endaddr=WriteAddr+NumToWrite*4;                                                //写入的结束地址
  349.         
  350.         if(addrx<0X1FFF0000)                                                                //只有主存储区,才需要执行擦除操作!!
  351.         {
  352.                 while(addrx<endaddr)                                                        //扫清一切障碍.(对非FFFFFFFF的地方,先擦除)
  353.                 {
  354.                         if(STM32FLASH_ReadWord(addrx)!=0XFFFFFFFF)        //有非0XFFFFFFFF的地方,要擦除这个扇区
  355.                         {   
  356.                                 status=STM32FLASH_EraseSector(STM32FLASH_GetFlashSector(addrx));
  357.                                 if(status != STM32FLASH_OK)break;                //发生错误了
  358.                         }else addrx+=4;
  359.                 }
  360.         }
  361.         if(status==STM32FLASH_OK)
  362.         {
  363.                 STM32FLASH_Unlock();                                                        //解锁
  364.                 if(FLASH->SR)                                                                //有错误,需要清除,测试过程中,发现偶尔启动后会有错误出现
  365.                 {
  366.                         DEBUG("需要清除flash错误标记,FLASH_SR=0x%X  FLASH_CR=0x%X\r\n",FLASH->SR, FLASH->CR);
  367.                         FLASH->SR |= FLASH->SR;
  368.                         DEBUG("FLASH_SR=0x%X  FLASH_CR=0x%X\r\n",FLASH->SR, FLASH->CR);
  369.                 }
  370.                 status = STM32FLASH_WriteMultipledWord(WriteAddr, pBuffer, NumToWrite);        //写入多个字的数据
  371.                 STM32FLASH_Lock();                                                                //上锁
  372.         }
  373.         FLASH->ACR|=1<<10;                                                                        //FLASH擦除结束,开启数据fetch
  374.         
  375.         
  376.         return status;
  377. }





  378. /*************************************************************************************************************************
  379. * 函数                        :        u16 STM32FLASH_Read(u32 ReadAddr,u32 *pBuffer,u16 NumToRead)
  380. * 功能                        :        从指定地址开始读出指定长度的数据
  381. * 参数                        :        ReadAddr:起始地址;pBuffer:数据指针;NumToWrite:字(32位)数
  382. * 返回                        :        读取的数据长度(字为单位)
  383. * 依赖                        :        底层
  384. * 作者                        :        <a href="mailto:cp1300@139.com">cp1300@139.com</a>
  385. * 时间                        :        2013-10-20
  386. * 最后修改时间         :         2016-01-07
  387. * 说明                        :         地址必须为4对齐
  388. *************************************************************************************************************************/
  389. u16 STM32FLASH_Read(u32 ReadAddr,u32 *pBuffer,u16 NumToRead)           
  390. {
  391.         u16 i;
  392.         u16 cnt = 0;
  393.         
  394.         if(ReadAddr<STM32_FLASH_BASE||ReadAddr%4)return 0;        //非法地址
  395.         
  396.         for(i=0;i<NumToRead;i++)
  397.         {
  398.                 pBuffer=STM32FLASH_ReadWord(ReadAddr);                //读取4个字节.
  399.                 cnt++;
  400.                 ReadAddr+=4;                                                                        //偏移4个字节.        
  401.         }
  402.         return cnt;
  403. }


  404. /*************************************************************************************************************
  405. * 文件名:                        stm32f7_flash.H
  406. * 功能:                        STM32F7 内部FLASH编程驱动函数
  407. * 作者:                        <a href="mailto:cp1300@139.com" style="">cp1300@139.com</a>
  408. * 创建时间:                2013-10-20
  409. * 最后修改时间:        2020-02-07
  410. * 详细:                        用于STM32F7内部flash读写驱动
  411. *************************************************************************************************************/
  412. #ifndef __STM32F7_FLASH_H__
  413. #define __STM32F7_FLASH_H__
  414. #include "system.h"  

  415. //FLASH起始地址
  416. #define STM32_FLASH_BASE                 0x08000000                         //STM32 FLASH的起始地址

  417. //FLASH 扇区的起始地址
  418. #define ADDR_FLASH_SECTOR_0     ((u32)0x08000000)         //扇区0起始地址, 32 Kbytes  
  419. #define ADDR_FLASH_SECTOR_1     ((u32)0x08008000)         //扇区1起始地址, 32 Kbytes  
  420. #define ADDR_FLASH_SECTOR_2     ((u32)0x08010000)         //扇区2起始地址, 32 Kbytes  
  421. #define ADDR_FLASH_SECTOR_3     ((u32)0x08018000)         //扇区3起始地址, 32 Kbytes  
  422. #define ADDR_FLASH_SECTOR_4     ((u32)0x08020000)         //扇区4起始地址, 128 Kbytes  
  423. #define ADDR_FLASH_SECTOR_5     ((u32)0x08040000)         //扇区5起始地址, 256 Kbytes  
  424. #define ADDR_FLASH_SECTOR_6     ((u32)0x08080000)         //扇区6起始地址, 256 Kbytes  
  425. #define ADDR_FLASH_SECTOR_7     ((u32)0x080C0000)         //扇区7起始地址, 256 Kbytes  


  426. //FLASH解锁键值
  427. #define RDP_KEY                  0x00A5
  428. #define FLASH_KEY1               0X45670123
  429. #define FLASH_KEY2               0XCDEF89AB
  430. #define FLASH_OPT_KEY1           0x08192A3B
  431. #define FLASH_OPT_KEY2                         0x4C5D6E7F

  432. //STM32F7 Flash操作状态
  433. typedef enum
  434. {
  435.         STM32FLASH_OK                        =        0,        //操作完成
  436.         STM32FLASH_BUSY                        =        1,        //忙
  437.         STM32FLASH_WPRERR                =        2,        //写保护错误
  438.         STM32FLASH_PGAERR                =        3,        //编程对齐错误,必须128位对齐
  439.         STM32FLASH_PGPERR                =        4,        //并行位数错误
  440.         STM32FLASH_PGSERR                =        5,        //擦除顺序错误
  441.         STM32FLASH_OPERR                 =        6,        //操作错误
  442. }STM32FLASH_STATUS;

  443. //常用接口
  444. STM32FLASH_STATUS STM32FLASH_EraseSector(u8 sectoraddr);                                                                  //擦除扇区
  445. STM32FLASH_STATUS STM32FLASH_Write_NoCheck(u32 WriteAddr,u32 *pBuffer,u16 NumToWrite) ; //不检查的写入多个字的数据
  446. STM32FLASH_STATUS STM32FLASH_WritedWord_NoCheck(u32 WriteAddr,u32 data) ;                                //不检查的写入一个字的数据
  447. STM32FLASH_STATUS STM32FLASH_Write(u32 WriteAddr,u32 *pBuffer,u16 NumToWrite);                        //从指定地址开始写入指定长度的数据(数据长度字为单位)
  448. u16 STM32FLASH_Read(u32 ReadAddr,u32 *pBuffer,u16 NumToRead);                                                        //从指定地址开始读出指定长度的数据

  449. //不常用接口
  450. void STM32FLASH_Unlock(void);                                                                                                                        //FLASH解锁
  451. void STM32FLASH_Lock(void);                                                                                                                                  //FLASH上锁
  452. STM32FLASH_STATUS STM32FLASH_GetStatus(void);                                                                                          //获得状态


  453. #endif        //__STM32F7_FLASH_H__

复制代码

收藏 评论0 发布时间:2021-12-11 12:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版