手机看到的文章:https://blog.csdn.net/WangSanHuai2010/article/details/7932867
今天想自己分析一下:
STM32L471
【0--255】
一共256页
每页2K一共512Kflash
page255起始地址0X0807F800
如果有下页(其实没有了)
起始地址是0X0807F800+0X800=0X08080000
整个FLASH地址是[0X0800 0000-->0X0808 0000)512K
问题:[0X0808 0000-->0x0810 0000)是什么?也是512k
回答:我们的骗子是512K 有的是1M呀
开始做文章的代码:
#define uint16 uint16_t
#define uint8 uint8_t
#define EEPROM_BASE_ADDR 0x08080000
#define EEPROM_BYTE_SIZE 0x0FFF
void EEPROM_ReadBytes(uint16 Addr,uint8 *Buffer,uint16 Length)
{
uint8 *wAddr;
wAddr=(uint8 *)(EEPROM_BASE_ADDR+Addr);
while(Length--){
*Buffer++=*wAddr++;
}
}
#define EN_INT __enable_irq(); //系统开全局中断
#define DIS_INT __disable_irq(); //系统关全局中断
#define PEKEY1 0x89ABCDEF //FLASH_PEKEYR
#define PEKEY2 0x02030405 //FLASH_PEKEYR
void EEPROM_WriteBytes(uint16 Addr,uint8 *Buffer,uint16 Length)
{
uint8 *wAddr;
wAddr=(uint8 *)(EEPROM_BASE_ADDR+Addr);
DIS_INT
FLASH->KEYR=PEKEY1; //unlock
FLASH->KEYR=PEKEY2;
while(FLASH->CR&FLASH_CR_LOCK);
FLASH->CR|=FLASH_CR_FSTPG; //not fast write
while(Length--){
*wAddr++=*Buffer++;
while(FLASH->SR&FLASH_SR_BSY);
}
FLASH->CR|=FLASH_CR_LOCK;
EN_INT
}
void EEPROM_test(void)
{
uint8 test[]={"HELLO"};
EEPROM_WriteBytes(EEPROM_BASE_ADDR,test,sizeof(test));
}
我写不下去了。。。。
EEPROM_WriteBytes(EEPROM_BASE_ADDR,test,sizeof(test));这里有问题 需要地址是U16的
我上哪儿给你地址?你自己定义的地址是U32的!!!文档没有找到介绍 说明:没有EEPROM!!
荒谬啊!
或者--再后来,突然发现STM32L15x竟然有自带EEPROM,不禁大喜!
算了 没价值的东西!