STM32L1XX系列的Flash

stm32不同芯片种类对flash的分配情况都是有些许差别的,所以建议阅读芯片手册,这里将简述L1系列的flash。

1 NVM overview

1.1主存储块(Main/Program memory)

主要保存程序和一些const变量,地址从0x0800 0000开始,每4K为一个扇区,每个扇区由16页组成,每页包含256bytes。


image.png

程序文件是从 0x0800 0000 地址写入,这个是STM32开始执行的地方,0x0800 0004是STM32的中断向量表的起始地址,M3复位后,从0x08000004取出复位中断的地址,并且跳转到复位中断程序,中断执行完之后会跳到主函数,主函数里边一般是一个死循环,进去后就不会再退出,当有中断发生的时候,M3将PC指针强制跳转回中断向量表,然后根据中断源进入对应的中断函数,执行完中断函数之后,再次返回main函数中
L1系列最小擦除粒度是一页(256bytes),而F1系列是1K或者2K

1.2信息块

1.2.1系统存储器(System memory)

存放了一个启动程序,在ISP下载是执行,由芯片商写入,锁死,无法更改。

开始地址 0x1FF0 0000
结束地址 0x1FF0 1FFF

1.2.2选项字节(Option Bytes)

存储芯片的配置信息和主存储的保护信息。

开始地址 0x1FF8 0000/0x1FF8 0080
结束地址 0x1FF8001F/0x1FF8 009F

1.3 EEPROM

这就是L系列专门开辟出用来于存放一些需要掉电保存的用户数据。
不同芯片EEPROM的大小也是不同的,但是起始地址均是0x0808 0000,由于他并不属于程序flash所以在烧写程序擦除时不会影响.

2 外设地址

详情可见L1参考手册2.3节table 5 Register boundary addresses
设备挂载地址说明

STM32将外设映射为了地址,对该地址进行读写实际上就是在操作寄存器。例如外设TIM2,他的所有寄存器被排布在了0x4000 0000 - 0x4000 03FF地址中,顺序是固定的,在库函数中变利用基地址的偏移来对寄存器操作。
所有外设地址排布从0x4000 0000开始

3 SRAM

也就是内存,芯片不同大小也不同,最大80k,用来存储程序中的变量,在掉电后数据会丢失。
他可以通过8bits、16bits、32bits进行访问,开始地址0x2000 0000

4 HAL库中的EEPROM接口函数

锁与解锁,在调用擦除和写入是调用。

HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Unlock(void);
HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Lock(void);
擦除
TypeErase 擦除方式 FLASH_TYPEERASEDATA_WORD ,FLASH_TYPEERASEDATA_HALFWORD ,FLASH_TYPEERASEDATA_BYTE
Address 擦除地址 32位地址
HAL_StatusTypeDef 返回状态 OK=0,ERROR =1,BUSY =2,TIMEOUT = 3
HAL_StatusTypeDef HAL_FLASHEx_DATAEEPROM_Erase(uint32_t TypeErase, uint32_t Address);

写入
TypeProgram 写入方式 FLASH_TYPEPROGRAMDATA_WORD ,FLASH_TYPEPROGRAMDATA_HALFWORD,FLASH_TYPEPROGRAMDATA_BYTE,FLASH_TYPEPROGRAMDATA_FASTBYTE,FLASH_TYPEPROGRAMDATA_FASTHALFWORD,FLASH_TYPEPROGRAMDATA_FASTWORD
Address 擦除地址 32位地址
HAL_StatusTypeDef 返回状态 OK=0,ERROR =1,BUSY =2,TIMEOUT = 3
HAL_StatusTypeDef   HAL_FLASHEx_DATAEEPROM_Program(uint32_t TypeProgram, uint32_t Address, uint32_t Data)

使能失能固定时间编程

void HAL_FLASHEx_DATAEEPROM_EnableFixedTimeProgram(void);
void HAL_FLASHEx_DATAEEPROM_DisableFixedTimeProgram(void);

5 附言

根据官方产品描述C8T6和CBT6一个是64K flash一个是128K,但在下程序是,我误将一个128k程序下载到了C8T6的硬件上,居然发现能正常运行,而且实际上后面的内存(00x8010000~0x801FFFF)是能够进行读写的。于是在网上查找资料发现

STM32F103C8T6和STM32F103CBT6 是在同一圆晶上制造的,但测试时,只测试手册提供的参数范围所包含的内容,也就意味这 STM32F103C8T6也是128k Flash,只不过只测试了前面64k,然后打上 STM32F103C8T6标注(当然内部就写上 C8T6 的 ID)

你可能感兴趣的:(STM32L1XX系列的Flash)