代码拉取完成,页面将自动刷新
同步操作将从 thtfcccj/Flash 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
/***************************************************************************
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);
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。