历史上的今天
今天是:2025年04月16日(星期三)
2021年04月16日 | 基于STM32单片机,FLASh先擦后写的函数分析案例
2021-04-16 来源:eefocus
FLASh 必须是先擦后写
下面的函数是分析案例

void FLASH_WriteByte(u32 addr ,u16 flashdata1)
{
FLASH_Status FLASHstatus = FLASH_COMPLETE;
FLASH_Unlock();//解锁FLASH编程擦除控制器
// FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);//清除标志位
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
/
FLASHstatus=FLASH_ErasePage(addr);//擦除指定地址页
FLASHstatus=FLASH_ProgramHalfWord(addr, flashdata1);//从指定页的addr地址开始写
//FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
FLASH_Lock();//锁定FLASH编程擦除控制
}
基本顺序:解锁-》清除标志位(可以不要)-》擦除-》写半字-》清楚标志位(也可以不要)-》上锁。
如果 FLASH_START_ADDR是宏定义的0x8000000+2048*255
1. 0x8000000是Flash的起始地址
2. 2048是因为我用的是大容量芯片,根据上一笔记Flash地址可以看出芯片每页容量2K,即2048字节,
3. 255表示芯片的最后一页,这个根据不同芯片而定。之所以从后面页写起可以防止储存数据破坏用户程序。
4. addr*2是因为每个数据占用2字节(半字),虽然写入的是1字节数据,但是编程是2字节为单位,
也就是说一个字节的数据也会占用两个字节地址。
这个子函数就是将数据flashdata1写到地址addr中去。数据的长度是可变的。
当需要读入数据的时候可以直接访问地址,
如:rdata=*(u16 *)0x08014000; //读flash中默认数据
0x08014000是存储的地址。
上一篇:STM32流水灯实验编程
下一篇:基于颜色识别的智能小车集群控制
史海拾趣
|
让我们逐条分析评价Linux和WinCE/Windows的优缺点。 1.支持多种硬件平台由于嵌入式设备硬件平台的多样性,CPU芯片的快速更新,嵌入式操作系统要求支持常用的嵌入式CPU,如X86, ARM, MIPS, POWERPC等,并具有良好的可移植性。另外还需要支持种类繁 ...… 查看全部问答> |
|
C64X DSP EDMA小结 (1)EDMA概要 ①EDMA数据传输有两种发起方式: CPU发起的EMDA数据传输(非同步方式):需要传输时,CPU设置ESR寄存器的相应位为1 ...… 查看全部问答> |
|
FPGA:Field Programmable Gate Array(现场可编程门阵列) CPLD:Complex programmable logic devices(复杂可编程逻辑器件) 这两者之间的主要区别是什么?对于高速的电路系统,选择哪一个比较好? 笼统的说,两者的区别在于资源的规模和芯片 ...… 查看全部问答> |
|
#include #define uchar unsigned char #define uint unsigned int unsigned char a ,flag,i; void init() { TMOD=0X20; TH1=0XFD; ...… 查看全部问答> |
|
关于SLE4442读写问题: 我用初始密码0XFF 0XFF 0XFF,效验成功, 读加密存储器器数据为7000FFFF , 修改密码,0XF1 0XF1 0XF1,效验失败, 读加密存储器器数据为 ...… 查看全部问答> |
|
在EVC中把程序编译好了,下到板子上的WINCE系统中运行;主机上的程序在wince的模拟器中运行。当把服务器端程序运行在主机模拟器上,把客户端程序运行在板子上,相互是可以通信的。但把两者运行的地方交换,就不能通信了,为什么??根据服务器的地 ...… 查看全部问答> |




