总体来说与STM32F4操作是一样的,就是扇区大小变化了,测试过程中发现当PG=1之后立即写入数据到flash会造成编程顺序错误,通过增加一个nop的延时即可解决此问题,还可以通过将多个数据连续烧写的方式避免此问题,就是当PG=1之后,把所有数据都烧写完成后再将PG=0,不要频繁的开关。
/*************************************************************************************************************
* 文件名: stm32f7_flash.c
* 功能: STM32F7 内部FLASH编程驱动函数
* 作者: cp1300@139.com
* 创建时间: 2013-10-20
* 最后修改时间: 2020-02-07
* 详细: 用于STM32F7内部flash读写驱动
默认为3.3V供电,并且宽度为32bit;
扇区擦除最长时间:32KB扇区500ms;128KB扇区1.1秒;256KB扇区:2秒
修复STM32F7开始写入数据时,PG=1后没有延时导致异常,增加批量写入多个字的数据函数STM32FLASH_WriteMultipledWord()支持。
*************************************************************************************************************/
#include "stm32f7_flash.h"
#include "system.h"
#if(SYS_WDG_EN_) //使能了看门狗
#include "wdg.h"
#endif //SYS_WDG_EN_
/*************************************************************************************************************************
* 函数 : void STM32FLASH_Unlock(void)
* 功能 : 解锁STM32的FLASH
* 参数 : 无
* 返回 : 无
* 依赖 : 底层
* 作者 : cp1300@139.com
* 时间 : 2013-10-20
* 最后修改时间 : 2013-10-20
* 说明 :
*************************************************************************************************************************/
void STM32FLASH_Unlock(void)
{
FLASH->KEYR=FLASH_KEY1; //写入解锁序列.
FLASH->KEYR=FLASH_KEY2;
}
/*************************************************************************************************************************
* 函数 : void STM32FLASH_Lock(void)
* 功能 : 上锁STM32的FLASH
* 参数 : 无
* 返回 : 无
* 依赖 : 底层
* 作者 : cp1300@139.com
* 时间 : 2013-10-20
* 最后修改时间 : 2018-01-13
* 说明 :
*************************************************************************************************************************/
void STM32FLASH_Lock(void)
{
FLASH->CR|=(u32)1<<31; //上锁
}
/*************************************************************************************************************************
* 函数 : STM32FLASH_STATUS STM32FLASH_GetStatus(void)
* 功能 : 得到FLASH状态
* 参数 : 无
* 返回 : STM32FLASH_STATUS
* 依赖 : 底层
* 作者 : cp1300@139.com
* 时间 : 2013-10-20
* 最后修改时间 : 2018-01-03
* 说明 :
*************************************************************************************************************************/
STM32FLASH_STATUS STM32FLASH_GetStatus(void)
{
u32 temp=FLASH->SR;
if(temp&(1<<16))return STM32FLASH_BUSY; //忙
else if(temp&(1<<4))return STM32FLASH_WPRERR; //写保护错误
else if(temp&(1<<5))return STM32FLASH_PGAERR; //编程对齐错误
else if(temp&(1<<6))return STM32FLASH_PGPERR; //并行位数错误
else if(temp&(1<<7))return STM32FLASH_PGSERR; //擦除顺序错误
else if(temp&(1<<1))return STM32FLASH_OPERR; //操作错误
return STM32FLASH_OK; //操作完成
}
/*************************************************************************************************************************
* 函数 : STM32FLASH_STATUS STM32FLASH_WaitDone(u32 time)
* 功能 : 等待操作完成
* 参数 : time:要延时的长短,单位us
* 返回 : STM32FLASH_STATUS
* 依赖 : 底层
* 作者 : cp1300@139.com
* 时间 : 2013-10-20
* 最后修改时间 : 2018-01-03
* 说明 : 2018-03-24:增加清除看门狗功能
*************************************************************************************************************************/
STM32FLASH_STATUS STM32FLASH_WaitDone(u32 time)
{
STM32FLASH_STATUS status;
if(time < 1) time = 1;
do
{
status=STM32FLASH_GetStatus(); //获取状态
if(status!=STM32FLASH_BUSY)break; //非忙,无需等待了,直接退出.
Delay_US(1);
time--;
#if(SYS_WDG_EN_) //使能了看门狗
IWDG_Feed();
#endif //SYS_WDG_EN_
}while(time);
return status;
}
|