加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Flash_HC32M4.c 3.66 KB
一键复制 编辑 原始数据 按行查看 历史
leekuip 提交于 2021-04-28 10:25 . ● 增加HC32M4支持
/***************************************************************************
Flash标准接口-在Hc32(M4P)中的实现
对 FLASH进行页擦除的代码所在地址必须小于 32768
****************************************************************************/
#include "Flash.h"
#include "Delay.h"
#include "HC32.h"
#include "string.h" //memcpy
unsigned long Flash_ErrCount = 0; //失败计数器
/***************************************************************************
配置说明
不可在此修改以免影响一致性!
****************************************************************************/
#ifndef FLASH
#define FLASH M4_EFM //别名
#endif
/***************************************************************************
内部函数实现
****************************************************************************/
//-----------------------------Flash写操作完成等待函数--------------------------
//返回值同Flash_ErasePage()
static void _WaitDone(unsigned short Time)//IAR环境定义
{
for(; Time > 0; Time--){
if(FLASH->FSR_f.RDY) return; //非忙时写完了
DelayUs(1);
}
Flash_ErrCount++; //写错误计数
}
/***************************************************************************
标准接口函数实现
****************************************************************************/
//------------------------------初始化函数------------------------------------
void Flash_Init(void)
{
//这里实现为空
}
//---------------------------Flash解锁实现---------------------------------
void Flash_Unlock(void)
{
//这里实现为空
}
//---------------------------Flash加锁实现---------------------------------
void Flash_Lock(void)
{
//这里实现为空
}
//---------------------------------Flash页擦除函数实现-----------------------
//此函数仅负责页擦除,不负责加解锁等
void Flash_ErasePage(unsigned long Adr)
{
__disable_irq();
FLASH->FAPRT = 0x0123; //解除 FLASH寄存器保护
FLASH->FAPRT = 0x3210;
FLASH->FWMC_f.PEMODE = 1;// 设定编程、擦写模式许可
FLASH->FWMC_f.PEMOD = 4;//设定擦除模式为扇区擦除
*(volatile unsigned long*)(Adr & 0xfffffffc) = 0xff; //写入任意数据启动
_WaitDone(21000); //等待操作结束,>20ms为经验值
FLASH->FSR_f.OPTEND = 1;//清除擦除结束标志位
FLASH->FWMC_f.PEMOD = 0;//设定擦除模式为只读模式
__enable_irq();
}
//-------------------------写数据到Flash中实现----------------------------
//此函数仅负责向Flash写数据,不负责加解锁及擦除
void Flash_Write(unsigned long Adr, //Flash地址
const void *pVoid, //要写入的数据
unsigned long Len) //IAR环境定义
{
//写前准备:
if(Len < 4) return;
__disable_irq();
FLASH->FAPRT = 0x0123; //解除 FLASH寄存器保护
FLASH->FAPRT = 0x3210;
FLASH->FWMC_f.PEMODE = 1;//设定编程、擦写模式许可
FLASH->FWMC_f.PEMOD = 1;//设定编程模式为单次编程模式
const unsigned char *pData = (const unsigned char *)pVoid;
//写入地址没4字对齐时部分,实现为丢弃
unsigned char PreLen = Len & 0x03;
if(PreLen){
pData += PreLen;
Len -= PreLen;
}
//中间4字节对齐写入
for( ; Len > 3; Len -= 4, Adr += 4, pData+= 4){
*(volatile unsigned long*)Adr = *(const unsigned long*)pData; //写入数据
_WaitDone(10000); //等待操作完成,10ms为经验值
}
//最后未4字节未对齐部分,实现为丢弃
FLASH->FSR_f.OPTEND = 1;//清除擦除结束标志位
FLASH->FWMC_f.PEMOD = 0;//设定擦除模式为只读模式
__enable_irq();
}
//----------------------------从Flash中读取数据实现----------------------
//此函数为可选功能,可不实现
void Flash_Read(unsigned long Adr, //Flash地址
void *pVoid, //要读出的数据
unsigned long Len) //读数据长度
{
memcpy(pVoid, (unsigned char*)Adr, Len);
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化