×
单片机 > 单片机程序设计 > 详情

STM32L152XX--读写内部Flash

发布时间:2020-05-19 发布时间:
|

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);


关键字:STM32L152XX  读写内部Flash 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会