历史上的今天
今天是:2024年09月10日(星期二)
2018年09月10日 | STM32--读写内部Flash
2018-09-10 来源:eefocus
Flash模块组织
存储器被组织为程序存储器模块,数据EEPROM模块和信息块。
程序存储器块分为4 KB的扇区,每个扇区都是进一步分成16页,每页256字节。
程序存储器页面擦除
该操作用于擦除程序存储器中的页面(64个字)。要做到这一点:
●解锁FLASH_PECR寄存器
1.将PEKEY1 = 0x89ABCDEF写入编程/擦除密钥寄存器(FLASH_PEKEYR)
2.将PEKEY2 = 0x02030405写入编程/擦除密钥寄存器(FLASH_PEKEYR)
●解锁程序存储器
●解锁FLASH_PECR寄存器
1. 将PRGKEY1 = 0x8C9DAEBF写入程序存储器密钥寄存器
(FLASH_PRGKEYR)
2.将PRGKEY2 = 0x13141516写入程序存储器密钥寄存器
(FLASH_PRGKEYR)
●将FLASH_PECR寄存器中的ERASE位置1
●设置FLASH_PECR寄存器中的PROG位选择程序页面
●等待BSY位清零
●将0x0000 0000写入程序页的第一个字以擦除
注意:该功能可以从两个存储体,RAM或外部存储器执行。
程序存储器快速字写入
这个操作用来写一个字到程序存储器,假设它是
先前被删除。要做到这一点:
●解锁FLASH_PECR寄存器
●解锁程序存储器
●将一个字写入程序存储器中的有效地址。
代码:(注释删了,上传后全是乱码
,实测可行)
flash.c:
#include "flash.h"
#include "main.h"
#define u32 uint32_t
#define u16 uint16_t
#define u8 uint8_t
#define PEKEY1 0x89ABCDEF
#define PEKEY2 0x02030405
#define PRGKEY1 0x8C9DAEBF
#define PRGKEY2 0x13141516
extern char teemp[];
void writeFlashTest(u32 dataxaddr,u8 write_data[],u32 size)
{
u32 i;
u32 temp;
u16 t=0;
u32 fwaddr=dataxaddr;
u8 *dfu=write_data;
HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef f;
f.TypeErase = FLASH_TYPEERASE_PAGES;
f.PageAddress = dataxaddr;
f.NbPages = 1;
uint32_t PageError = 0;
HAL_FLASHEx_Erase(&f, &PageError);
HAL_FLASH_Lock();
HAL_FLASH_Unlock();
for(t=0;t { temp=(u16)dfu[3]<<24; temp+=(u16)dfu[2]<<16; temp+=(u16)dfu[1]<<8; temp+=(u16)dfu[0]; dfu+=4; HAL_FLASH_Program(FLASH_TYPEERASEDATA_WORD, fwaddr, temp); fwaddr+=4; } HAL_FLASH_Lock(); } u8 Flash_read_data(u32 dataxaddr) { uint8_t temp = *(__IO uint8_t*)(dataxaddr); return temp; } flash.h: #include "main.h" #include "stm32l1xx_hal_flash_ramfunc.h" #define u32 uint32_t #define u16 uint16_t #define u8 uint8_t void Flash_erase_pages(u32 erase_address); void writeFlashTest(u32 dataxaddr,u8 write_data[],u32 size); u8 Flash_read_data(u32 dataxaddr); unsigned char Flash_write_data(u32 dataxaddr,u32 write_data);
史海拾趣
|
C/C++ code //Send.exe keybd_event(VK_MENU, 0x0, KEYEVENTF_SILENT, 0); keybd_event(VK_MENU, 0x0, KEYEVENTF_SILENT | KEYEVENTF_KEYUP, 0); //Rev.exe BOOL CRev::PreTranslateMessage(MSG* pMsg) { &n ...… 查看全部问答> |
|
SHNotificationAdd在WINCE 5.0 .net下不弹出气泡通知 如下代码在windows mobile手机上是可以弹出气泡的,但是在wince 5.0开发板上弹不出来.根据MSDN似乎应该是可以的。 SHNP_INFORM Notification bubble displays for the set duration, then disappears. Note For Windows Mobile, this enum ...… 查看全部问答> |
|
CPU:S3C2440 调试环境:H-JTAG+ADS1.2 问题:读出501ID号不对 详述:501作为2440的图像显示模块,与2440连接方式为非 UMA方式,MMIO_BASE=0x2000_0000+0x03E0_0000,501上电 后MMIO_BASE+0x000060寄存器中初始化为0x0501xxa0,但 目前读出的数据 ...… 查看全部问答> |
|
1. S/W Engineer (Codec) 1) 4+ years working experience of video, audio codec development 2) Candidates should have strong knowledge and hands-on experience on MPEG-2/4, H.264, AAC/AAC+ algorithm 3) C/C++ and Verilog HDL program ...… 查看全部问答> |
|
ERROR: The Top module has not been specified. This can happen if no sources have been added to the project, 是什么意思?… 查看全部问答> |
|
这芯片怎么回事,我使用了SD16A的第一、二、三通道(AIN0、AIN1、AIN2),每五通道(AIN4)与TIMERA的PWM(TA1、TA2)是同一个引脚。我使用了PWM输出。在使用中发现,只要我打开SD16A的第三通道,TA1引脚输出就一直为低电平,不受PWM控制,当我关掉 ...… 查看全部问答> |
|
我在SD卡上构建dosfs文件系统是总是出错: 代码如下 #include \"copyright_wrs.h\"#include \"vxWorks.h\"#include \"taskLib.h\"#include \"blkIo.h\"#include \"stdlib.h\"#include \"stdio.h\"#include \"string.h\"#include \"dosFsLib.h\"#i ...… 查看全部问答> |




