#include “sys.h”
#include “usart.h”
#include “delay.h”
#include “flash.h”
/**********************************************************
FLASH 模拟EEPROM
其实这部分应该最早 学习32 的时候就应该 讲解到。
通过 操作 主存储区 的flash 空间来存放数据
读取数据
本实验使用的 芯片 是 stm32f103zet6
一页是 2K的字节空间
flash = 512KB
操作流程
1 FLASH解锁
2 清除FLASH 标志位
3 擦除FLASH 先擦除在写入
4 写入FLASH
5 锁定FLASH
STM32 的闪存模块由 主存储器---- 信息块 ---- 闪存存储器
接口寄存器3 部分组成。
主存储器:
用来存放代码和数据常数如 const 类型数据 大容量
产品分为 256 页每页 2KB 注意
小容量和中容量 每页只有1KB
主存储器的起始地址从 0x08000000
B0 B1 接地的时候就是从 0x08000000开始
信息块:
分2 小部分 启动程序代码用来存储ST自带的启动程序
用于出口下载代码 当 B0接3.3V B1 接GND 的时候
运行的就是这部分代码
用户选择字节一般用于配置写保护读保护功能
闪存储器接口寄存器:
用于控制闪存读/写 是整个闪存模块的 控制机构
对主存储器和信息块的写入由内嵌的闪存编程 / 擦除控制器 FPEC 管理
编程与擦除的高压由内部产生. 在执行闪存的写操作时任何闪存 的读
操作都会锁住总线 。在写操作完成后才能正确地进行 ;
即在进行写操作或擦除操作时 不能进行代码或数据的读取操作 。
内置闪存模块可以通过地址空间直接寻址
如何32位数据的读操作都能访问闪存模块的内容
并得到相应数据。
读接口在闪存端包含一个读控制器
一个AHB 接口与CPU 衔接。
这个接口的重要工作是产生读闪存的控制信号并
预取CPU 要求的指令块
预去指令块仅用于在I-Code 总线上的取指操作
数据常量是通过D - Code
总线访问
这两条总线的访问目标是相同的闪存模块
访问D-CODE 将比预取指令优先级高
1 在官网上提供了页擦除函数
所以还需要知道页的大小
2 页 地址
0 0x0800 0000 - 0x0800 07ff
1 0x0800 0800 - 0x0800 0fff
2 0x0800 1000 0x0801 17ff
3 0x0800 1800 0x0801 ffff
4 0x0802 0000 0x0802 07ff //2048 字节
3 2048 个字节也就是我们存放数据的空间
4 FLASH 的寄存器配置在 STM32F10xx 闪存编程手册
*********************************************************/
#define key0 PCin(13)
#define key1 PAin(0)
void static led_init()
{
RCC->APB2ENR |=1<<7; //开启F 的时钟
RCC->APB2ENR |=1<<5; //开启D 的时钟