FLASH闪存的读取、擦除、编程(stm32f103c8t6)

一、stm32寄存器地址介绍

二、FLASH简介

(1)STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口可以对程序存储器和选项字节进行擦除和编程

(2) 读写FLASH的用途:利用程序存储器的剩余空间来保存掉电不丢失的用户数据;通过在程序中编程(IAP),实现程序的自我更新

(3)在线编程(In-Circuit Programming -ICP)用于更新程序存储器的全部内容,它通过JTAG、SWD协议或系统加载程序(Bootloader)下载程序

(4)在程序中编程(In-Application Programming - IAP)可以使用微控制器支持的任—种通信接口下载程序。(首先在 程序更新后不影响的地方自己写一个bootloader程序,需要更新程序之后,程序跳转到自定义的bootloader程序,然后通过任意一种通信接口接收数据,然后在通过对flash的读写,将接受到的数据放到程序正常运行的地方)

三、闪存模块组织

四、flash解锁和加锁

FPEC共有三个键值:

  • RDPRT键=Ox000000A5
  • KEY1 = Ox45670123
  • KEY2 = OxCDEF89AB

解锁步骤:
        复位后,FPEC被保护,不能写入FLASH_CR

        在FLASH_KEYR先写入KEY1,再写入KEY2,解锁

        错误的操作序列会在下次复位前锁死FPEC和FLASH_CR

加锁步骤:
        设置FLASH_CR中的LOCK位(置1)  锁住FPEC和FLASH_CR

加锁和解锁的目的是防止误操作

五、使用指针访问存储器

#define    _IO   volatile

使用指针读指定地址下的存储器:
        uint16_t Data = *((_I0 uint16_t *)(0×08000000)) ;

使用指针写指定地址下的存储器:
        *((___IO uint16_t*)(0x0800ee0e)) = ox1234;

六、编程过程

 

针对以上编程过程,库函数已经帮我们写好了,我们只需要调用函数接口即可

七、选项字节

当往RDP里面写入数据之后,需要往nRDP里面写入对应的补码,如果检测到RDP和nRDP的数据不是补码关系, 那么解除读保护错误。但是此操作硬件会自动帮我们完成

八、器件电子签名

        电子签名存放在闪存存储器模块的系统存储区域,包含的芯片识别信息在出厂时编写,不可更改,使用指针读指定地址下的存储器可获取电子签名

        闪存容量寄存器:
        基地址:Ox1FFF F7EO   大小: 16位

        产品唯一身份标识寄存器:
        基地址: Ox1FFF F7E8    大小: 96位

九、代码书写

#include "MyFLASH.h"

uint32_t MyFLASH_Readword (uint32_t Address)
{
    return *( (__Io uint32_t *)(Address) );
}

uint16_t MyFLASH_ReadHalfword (uint32_t Address)
{
    return *((__1o uint16_t *)(Address) );
}

uint8_t MyFLASH_ReadByte (uint32_t Address)
{
    return * ( (__Io uint8_t * ) (Address)) ;
}

void MyFLASH_EraseAllPages (void)
{
    FLASH_Unlock () ;
    FLASH_EraseAllPages ( ) ;
    FLASH_Lock () ;
}

void MyFLASH_ErasePage (uint32_t PageAddress)
{
    FLASH_Unlock ( );
    FLASH_ErasePage (PageAddress ) ;
    FLASH_Lock ();
}

void MyFLASH_Programword (uint32_t Address, uint32_t Data)
{
    FLASH_Unlock ( ) ;
    FLASH_Programword (Address,Data) ;
    FLASH_Lock ( ) ;
}

void MyFIASH_ProgramHalfword (uint32_t Address,uint16_t Data)
{
    FLASH_unlock ( ) ;
    FLASH_ProgramHalfword (Address,Data) ;
    FLASH_Lock ();
}

#include "MyFLASH.h"
#include "store.h"

uint16_t store_Data [ 512];

//上电调用初始化函数,然后就可以加载之前存储在flash中的数据
void store_Init (void)
{
    //0x0800Fc00最后一页的首地址;OxA5A5为了判断之前是否存储数据
    if (MyFLASH_ReadHalfword(0x0800Fc00)!= OxA5A5)
    {
        MyFLASH_ErasePage (0x0800FC00);
        MyFLASH_ProgramHalfword (0x0800FC00,0xA5A5);
        // 一页的大小是1K,存储数据数组大小是半字。第一位存储标志位,后面数据位清0
        for (uint16_t i = l; i < 512; i ++)
        {
            MyFLASH_ProgramHalfword (0x0800FC00 + i * 2,0x0000);
        }
    }
    for (uint16_t i = 0; i <512; i ++)
    {
        store_Data [i] = MyFLASH_ReadHalfword (0x0800FCO0 + i * 2);
    }
}

//调用保存函数就会将数据写入flash存储器中
void store_save (void)
{
    MyFLASH_ErasePage (0x080OFC00) ;
    for (uint16_t i = 0; i < 512; i ++)
    {
        MyFLASH_ProgramHalfword (0x0800Fc00 + i * 2,store_Data[i]);
    }
}

void store_clear (void)
{
    for (uint16_t i = 1; i < 512; i ++)
    {
        store_Data[i] = 0x0000;
    }
    store_save () ;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/262590.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Excel排序怎么做?记好这些正确操作!

“我是个职场新手&#xff0c;对excel的使用还不是很熟悉。但是我需要处理一份文件。有朋友可以简单介绍一下excel排序的操作方法吗&#xff1f;” Excel作为一个实用的办公工具&#xff0c;给用户带来了很多的方便。在使用excel时&#xff0c;排序功能是比较重要且常用的。我们…

宕机后,Redis如何实现快速恢复?

Redis作为非常火热的内存数据库&#xff0c;其除了具有非常高的性能之外&#xff0c;还需要保证高可用&#xff0c;在故障发生时&#xff0c;尽可能地降低故障带来的影响&#xff0c;Redis也提供了完善的故障恢复机制&#xff1a;哨兵。 下面就来具体来看看Redis的故障恢复是如…

声音克隆定制丰富和的系统源码+完整的代码包+搭建教程

随着科技的进步&#xff0c;人工智能&#xff08;AI&#xff09;技术已经逐渐渗透到我们生活的各个领域。声音克隆技术&#xff0c;作为AI领域的一个重要分支&#xff0c;通过模仿人类的声音特征&#xff0c;生成与目标声音相似的语音。这项技术在语音合成、语音识别、虚拟现实…

机器学习——损失函数

【说明】文章内容来自《机器学习——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 1、简介 损失函数(loss function)又称为误差函数(error function)&#xff0c;是衡量模型好坏的标准&#xff0c;用于估量模型的预测值与真实值的不一致程度&#xff0c;是一个…

深入剖析jsonp跨域原理

在项目中遇到一个jsonp跨域的问题&#xff0c;于是仔细的研究了一番jsonp跨域的原理。搞明白了一些以前不是很懂的地方&#xff0c;比如&#xff1a; 1&#xff09;jsonp跨域只能是get请求&#xff0c;而不能是post请求&#xff1b; 2&#xff09;jsonp跨域的原理到底是什么&…

这是最简单的轮播图,图片自己加

代码&#xff1a; <!DOCTYPE html> <html> <head> <title>轮播图</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } .container { position: relative; overflow: hid…

Golang 的内存管理

文章目录 1.内存管理角色1.常见的内存分配方法线性分配器空闲链表分配器TCMalloc 2.Go 内存管理组件mspanmcache初始化替换微分配器 mcentralmheap 3.内存分配4.内存管理思想参考文献 1.内存管理角色 内存管理一般包含三个不同的组件&#xff0c;分别是用户程序&#xff08;Mu…

Nginx快速入门:负载均衡upstream配置详解(四)

0. 引言 我们在第二章的时候简单演示了关于nginx实现负载均衡的演示&#xff0c;而实际上nginx支持很多负载均衡算法&#xff0c;并且多节点的转发也有多种策略。今天我们继续深入学习这块。 1. 负载均衡的应用场景 所谓负载均衡&#xff0c;Load Balance &#xff0c;就是将…

Jmeter自定义用户变量模拟多用户

java1234,56a801e9c869452fa092c9657cfc2051 jack,b6e528cca41143dea9c2c3e9ca5d6390

Linux环境安装Hadoop

&#xff08;1&#xff09;下载Hadoop安装包并上传 下载Hadoop安装包到本地&#xff0c;并导入到Linux服务器的/opt/software路径下 &#xff08;2&#xff09;解压安装包 解压安装文件并放到/opt/module下面 [roothadoop100 ~]$ cd /opt/software [roothadoop100 software…

基于SpringBoot的教学管理app的开发-计算机毕业设计源码65449

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对教学管理等问题&#xff0c;对其进行研究分…

如何在本地安装Flask并将其web界面发布到公网上远程访问协同开发

目录 前言 1. 安装部署Flask 2. 安装Cpolar内网穿透 3. 配置Flask的web界面公网访问地址 4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架&#xff0c;…

电气 接近开关

npn&#xff1a;和负载&#xff08;控制器或者继电器&#xff09;共阳极&#xff0c;低电平响应 pnp&#xff1a;和负载共阴极&#xff0c;高电平响应

MyBatisX生成时的选项的含义

一般&#xff0c;annotation和template勾选MyBatis-Plus 3 options中各选项的作用 comment&#xff1a;实体类各属性的注释&#xff08;数据库中有的话&#xff09;以及生成TableId注解&#xff0c;同时会给serialVersionUID属性加上TableField(exist false) toString/hashCo…

OpenSergo使用详解

简介 OpenSergo是一个基于微服务治理的标准和生态&#xff0c;覆盖了服务元信息、流量治理、服务容错、数据库/缓存治理、服务注册发现、配置治理等十几个关键领域&#xff0c;覆盖了完整的微服务生命周期&#xff08;从开发态到测试态&#xff0c;到发布态&#xff0c;再到运…

不用翻箱倒柜找数据线,电脑投屏到另一台电脑,无线、远程投屏方法!

对于职场人士来说&#xff0c;电脑投屏电脑绝对是必不可少的工具&#xff0c;稳定高效的投屏开会是职场人渴望的技能&#xff0c;总比天天抱着笔记本走来走去&#xff0c;还要去翻箱倒柜的找数据线要强。如何实现电脑间的稳定投屏&#xff0c;AirDroid Cast提供了一个好思路。 …

ssm基于vue.js的连锁干洗店后台管理系统论文

摘 要 使用旧方法对连锁干洗店后台管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在连锁干洗店后台管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次…

最小操作次数问题

思路如下&#xff1a; 1.其他颜色变成红色球的情况:蓝色变红色需要2步 所以"2 绿色变红色需要1步 所以 绿色 2.其他颜色变成蓝色球的情况:绿色变蓝色需要2步 红色变蓝色需要1步 3.其他颜色变成绿色球的情况 红色变绿色需要2步 蓝色变绿色需要1步 代码如下&#xff1a…

免费分享一套Springboot+Vue前后端分离的个人博客系统,挺漂亮的

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringbootVue前后端分离的个人博客系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringbootVue个人博客系统 毕业设计 Java毕业设计_哔哩哔哩_bilibili【免费】SpringbootVue个人博客系统 毕业设计 …

Unity DOTS物理引擎的核心分析与详解

最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎&#xff0c;今天我们来给大家分享和介绍一下这个物理引擎的使用。 Unity.Physics的设计哲学 Unity.Physics是基于DOTS设计思想的一个高性能C#物理引擎的实现, 包含了物理刚体的迭代计算与碰撞检测等查…