STM32F4X 内部FLASH使用

STM32F4X 内部FLASH使用

  • STM32F4X 内部FLASH
    • STM32F4X内部FLASH结构
      • STM32F40X和STM32F41X内部FLASH结构
      • STM32F42X和STM32F43X内部FLASH结构
    • STM32F4X内部FLASH操作
    • 例程
      • internal_flash.h
      • internal_flash.c
      • main.c

在嵌入式开发中,经常需要实时保存一些数据。如果工程的代码量比较大的话可以使用一些外部的存储器件进行数据的保存。如果工程的代码量比较小则可以利用MCU的内部FLASH进行数据的存储。

STM32F4X 内部FLASH

当我们把程序编译好之后下载到MCU之后,下载器会把程序文件下载到MCU的内部FLASH中,内部FLASH除非人为擦除,否则会永久保存。内部FLASH除了可以保存代码之外,还可以保存数据。STM32F4X的内部FLASH有以下特点。

  • STM32F40X和STM32F41X的内部FLASH容量是1MB,而STM32F42X和STM32F43X的内部FLASH容量是2MB
  • STM32F4X的内部FLASH支持字节、半字、字和双字写入
  • STM32F4X的内部FLASH支持扇区擦除和全擦除

STM32F4X内部FLASH结构

STM32F40X和STM32F41X内部FLASH结构

在这里插入图片描述

可以看到STM32F40X和STM32F41X将1MB的内部FLASH分成了12个扇区,每个扇区的大小都不一样,分别是4个16KB的扇区,1个64KB的扇区和7个128KB的扇区。

STM32F42X和STM32F43X内部FLASH结构

在这里插入图片描述
STM32F42X和STM32F43X的内部FLASH结构跟STM32F40X和STM32F41X的差不多,只是有点细微的差别。STM32F42X和STM32F43X将内部2MB的FLASH分成了2个块,每个块是1MB,每个块分成了12个扇区,每个扇区的大小都不一样,分别是4个16KB的扇区,1个64KB的扇区和7个128KB的扇区。

STM32F4X内部FLASH操作

  • 先将内部FLASH解锁
  • 擦除扇区
  • 往FLASH中写入数据
  • 读出写入的数据进行校验
  • FLASH上锁

例程

internal_flash.h

#ifndef __INTERNAL_FLASH__H
#define __INTERNAL_FLASH__H#include "stm32f4xx.h"
#include "stdio.h"#define ADDR_FLASH_SERTOR_0 (0x8000000) 
#define ADDR_FLASH_SERTOR_1 (0x8004000) 
#define ADDR_FLASH_SERTOR_2 (0x8008000) 
#define ADDR_FLASH_SERTOR_3 (0x800C000) 
#define ADDR_FLASH_SERTOR_4 (0x8010000) 
#define ADDR_FLASH_SERTOR_5 (0x8020000) 
#define ADDR_FLASH_SERTOR_6 (0x8040000) 
#define ADDR_FLASH_SERTOR_7 (0x8060000) 
#define ADDR_FLASH_SERTOR_8 (0x8080000) 
#define ADDR_FLASH_SERTOR_9 (0x80A0000) 
#define ADDR_FLASH_SERTOR_10 (0x80C0000) 
#define ADDR_FLASH_SERTOR_11 (0x80E0000) int flash_test(void);
unsigned int get_sector_index(unsigned int start_address);
int compare_u8_data(const unsigned char *src,unsigned int start_address,int len);
int compare_u16_data(const unsigned short *src,unsigned int start_address,int len);
int compare_u32_data(const unsigned int *src,unsigned int start_address,int len);
#endif

internal_flash.c

#include "internal_flash.h"static unsigned char test_data_u8[] = 
{
//随机数个数:100;每行显示个数:10;取值范围:0到255157,	115,	145,	130,	66,	251,	215,	97,	214,	233,	
69,	161,	177,	204,	140,	72,	143,	247,	248,	120,	
219,	190,	224,	68,	45,	233,	65,	194,	17,	98,	
166,	97,	10,	49,	75,	125,	214,	170,	129,	49,	
244,	229,	84,	109,	100,	111,	108,	72,	174,	63,	
49,	151,	37,	236,	51,	190,	109,	29,	200,	198,	
59,	64,	247,	176,	92,	127,	148,	9,	249,	239,	
173,	191,	25,	11,	37,	51,	103,	98,	159,	143,	
54,	140,	157,	90,	194,	98,	233,	74,	184,	111,	
53,	89,	249,	161,	254,	26,	155,	68,	182,	78,		
};static unsigned short test_data_u16[] = 
{
//随机数个数:100;每行显示个数:10;取值范围:256到6553510301,	24195,	26063,	23491,	30667,	1467,	25287,	28733,	28285,	649,	
20974,	22870,	22983,	28195,	8943,	22043,	4696,	15632,	15502,	9559,	
17054,	31636,	5956,	17834,	30344,	11887,	27433,	31707,	22671,	11207,	
29976,	4975,	16375,	32866,	5901,	3451,	29778,	13592,	22481,	12726,	
19015,	2184,	1498,	13778,	32145,	28939,	364,	28429,	27722,	31462,	
29189,	16899,	5994,	22212,	27384,	17606,	3211,	11363,	17240,	18224,	
7407,	1421,	9495,	13688,	1475,	25930,	5999,	2308,	28069,	24404,	
2177,	15230,	23397,	17355,	6717,	28714,	2568,	13098,	13953,	18295,	
15891,	11898,	11909,	4308,	32774,	30661,	26998,	20164,	24614,	22222,	
26209,	16693,	10111,	5631,	5459,	27150,	6698,	19363,	19391,	16391,	
};static unsigned int test_data_u32[] = 
{
//随机数个数:100;每行显示个数:10;取值范围:65536到10000077260,	82517,	87839,	66237,	89695,	72376,	96222,	92678,	95797,	93033,	
80246,	71041,	65849,	67378,	98262,	66674,	82041,	77441,	81670,	96973,	
83937,	83480,	75533,	69009,	76105,	91653,	83731,	84311,	86195,	87253,	
93123,	75563,	95693,	82693,	81139,	82842,	83646,	88761,	89735,	68620,	
77854,	96176,	71826,	87637,	91718,	72568,	84671,	71302,	70603,	94686,	
77552,	75529,	86341,	96681,	77604,	87789,	84565,	75144,	86686,	78462,	
78822,	67912,	67140,	80409,	96178,	91978,	83013,	97086,	80136,	78389,	
89854,	81895,	71373,	87784,	95007,	83992,	85698,	90803,	83209,	82360,	
75268,	88518,	68987,	94879,	80601,	86505,	96622,	84208,	74665,	75118,	
90429,	83369,	98123,	86628,	97033,	95608,	88707,	88590,	68700,	93137,	
};unsigned int get_sector_index(unsigned int start_address)
{if(start_address >= ADDR_FLASH_SERTOR_0 && start_address < ADDR_FLASH_SERTOR_1)return FLASH_Sector_0;else if(start_address >= ADDR_FLASH_SERTOR_1 && start_address < ADDR_FLASH_SERTOR_2)return FLASH_Sector_1;else if(start_address >= ADDR_FLASH_SERTOR_2 && start_address < ADDR_FLASH_SERTOR_3)return FLASH_Sector_2;else if(start_address >= ADDR_FLASH_SERTOR_3 && start_address < ADDR_FLASH_SERTOR_4)return FLASH_Sector_3;else if(start_address >= ADDR_FLASH_SERTOR_4 && start_address < ADDR_FLASH_SERTOR_5)return FLASH_Sector_4;else if(start_address >= ADDR_FLASH_SERTOR_5 && start_address < ADDR_FLASH_SERTOR_6)return FLASH_Sector_5;else if(start_address >= ADDR_FLASH_SERTOR_6 && start_address < ADDR_FLASH_SERTOR_7)return FLASH_Sector_6;else if(start_address >= ADDR_FLASH_SERTOR_7 && start_address < ADDR_FLASH_SERTOR_8)return FLASH_Sector_7;else if(start_address >= ADDR_FLASH_SERTOR_8 && start_address < ADDR_FLASH_SERTOR_9)return FLASH_Sector_8;else if(start_address >= ADDR_FLASH_SERTOR_9 && start_address < ADDR_FLASH_SERTOR_10)return FLASH_Sector_9;else if(start_address >= ADDR_FLASH_SERTOR_10 && start_address < ADDR_FLASH_SERTOR_11)return FLASH_Sector_10;elsereturn FLASH_Sector_11;}int flash_test(void)
{unsigned int i,write_setor,ret = 0;FLASH_Unlock();write_setor = get_sector_index(ADDR_FLASH_SERTOR_6); // 判断FLASH地址的扇区索引/* 字节读写测试 */if(FLASH_EraseSector(write_setor,VoltageRange_3) != FLASH_COMPLETE) // 扇区擦除printf("flash erase error\r\n");elseprintf("flash erase success\r\n");for(i = 0;i < sizeof(test_data_u8);i++)FLASH_ProgramByte(ADDR_FLASH_SERTOR_6 + i,test_data_u8[i]); // 写数据if(compare_u8_data(test_data_u8,ADDR_FLASH_SERTOR_6,sizeof(test_data_u8)) != 0) // 比较{printf("flash write u8 error\r\n");ret = 1;goto end;}else	printf("flash write u8 success\r\n");/* 半字读写测试 */if(FLASH_EraseSector(write_setor,VoltageRange_3) != FLASH_COMPLETE) // 扇区擦除 printf("flash erase error\r\n");elseprintf("flash erase success\r\n");for(i = 0;i < sizeof(test_data_u16);i++)FLASH_ProgramHalfWord(ADDR_FLASH_SERTOR_6 + i * 2,test_data_u16[i]); // 写数据if(compare_u16_data(test_data_u16,ADDR_FLASH_SERTOR_6,sizeof(test_data_u16)) != 0)  // 比较{printf("flash write u16 error\r\n");ret = 1;goto end;}else	printf("flash write u16 success\r\n");/* 字读写测试 */if(FLASH_EraseSector(write_setor,VoltageRange_3) != FLASH_COMPLETE) // 扇区擦除 printf("flash erase error\r\n");elseprintf("flash erase success\r\n");for(i = 0;i < sizeof(test_data_u32);i++)FLASH_ProgramWord(ADDR_FLASH_SERTOR_6 + i * 4,test_data_u32[i]); // 写数据if(compare_u32_data(test_data_u32,ADDR_FLASH_SERTOR_6,sizeof(test_data_u32)) != 0) // 比较 {printf("flash write u32 error\r\n");ret = 1;goto end;}else	printf("flash write u32 success\r\n");
end:	FLASH_Lock();return ret;
}int compare_u8_data(const unsigned char *src,unsigned int start_address,int len)
{int i;for(i = 0;i < len;i++){if(*((unsigned char *)(start_address + i)) != src[i])return 1;}return 0;
}
int compare_u16_data(const unsigned short *src,unsigned int start_address,int len)
{int i;for(i = 0;i < len;i++){if(*((unsigned short *)(start_address + i * 2)) != src[i])return 1;}return 0;
}
int compare_u32_data(const unsigned int *src,unsigned int start_address,int len)
{int i;for(i = 0;i < len;i++){if(*((unsigned int *)(start_address + i * 4)) != src[i])return 1;}return 0;
}	

main.c

#include "stm32f4xx.h"
#include "delay.h"
#include "usart.h"
#include "internal_flash.h"int main(void)
{int i;NVIC_PriorityGroupConfig(2);system_tick_init();bsp_usart_init(115200);if(flash_test() == 0)printf("STM32F4X Internal Test Scuess\r\n");elseprintf("STM32F4X Internal Test Error\r\n");while(1){}}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity使用UniStorm 5.1.0.unitypackage增加天气

添加天天气组件unistorm 然后添加一个player 导入包会报错,需要修改代码 using UnityEngine; using UnityEngine.PostProcessing;namespace UnityEditor.PostProcessing {[CustomPropertyDrawer(typeof(UnityEngine.PostProcessing.MinAttribute))]sealed class MinDrawer : …

Git小书系列笔记

Git准备 首先根据自己的系统安装git&#xff0c;安装成功后可以通过如下指令查看git版本。 使用Git之前&#xff0c;需要配置用户名称和电子邮件。 1.设置全局的用户名和电子邮件 git config --global user.name "Your Name" git config --global user.email &quo…

高并发 发送请求(asyncio)

在接手这个项目之前&#xff0c;关于数据存储的代码逻辑如上图&#xff0c;看起来按部就班&#xff0c;也很合理。&#xff08;本人觉得这就像个玩具车&#xff09; 在最后一步发送HTTP request响应足够快的话&#xff0c;其实速度说不上快但稳定&#xff0c;可以接受。但偏偏…

【力扣】2578. 最小和分割

【力扣】2578. 最小和分割 文章目录 【力扣】2578. 最小和分割1. 题目介绍2. 思路3. 解题代码4. 疑问&#xff1f;5. Danger参考 1. 题目介绍 给你一个正整数 num &#xff0c;请你将它分割成两个非负整数 num1 和 num2 &#xff0c;满足&#xff1a; num1 和 num2 直接连起来…

20231008工作心得:sql

1.SQL语句里的if的嵌套使用 if(product A and brand_name B,C,if(product A and brand_name !B,D,product)) as product if&#xff08;A,B,C&#xff09;。SQL里if函数&#xff0c;如果条件A成立&#xff0c;就显示B的值&#xff0c;否则就显示C。 这个代码的意思的&#x…

京东数据分析平台:9月中上旬白酒消费市场数据分析

9月份&#xff0c;围绕白酒的热点不断。9月5日&#xff0c;瑞幸咖啡官微发布消息称&#xff0c;瑞幸与贵州茅台跨界合作推出的酱香拿铁刷新单品纪录&#xff0c;首日销量突破542万杯&#xff0c;销售额破1亿元。9月14日&#xff0c;贵州茅台官微发布消息称与德芙推出联名产品“…

矩阵的相似性度量的常用方法

矩阵的相似性度量的常用方法 1&#xff0c;欧氏距离 欧式距离是最易于理解的一种距离计算方法&#xff0c;源自欧式空间中两点间的距离公式。 (1)二维平面上的点 a ( x 1 , y 1 ) a(x_1,y_1) a(x1​,y1​)和点 b ( x 2 , y 2 ) b(x_2,y_2) b(x2​,y2​)的欧式距离为 d ( x …

Zookeeper经典应用场景实战(二)

文章目录 1、 Zookeeper 分布式锁实战1.1、 什么是分布式锁1.2、 基于数据库设计思路1.3、 基于Zookeeper设计思路一1.4、 基于Zookeeper设计思路二 1、 Zookeeper 分布式锁实战 1.1、 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候&#xff0c;大家往往采用Sync…

Python中如何快速解析JSON对象数组

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 由于浏览器可以迅速地解析JSON对象&#xff0c;它们有助于在客户端和服务器之间传输数据。 本文将描述如何使用Python的JSON模块来传输和接收JSON数据。 JavaSc…

gici-open示例数据运行(ground_truth坐标的转换)

1. 坐标系转换说明 涉及的两个坐标转换&#xff1a; nmea_pose_to_pose &#xff1a;激光IMU中心到数据集IMU中心&#xff0c;主要是杆臂误差&#xff0c;转换关系为&#xff1a; //坐标转换的主要步骤(若发现有错误的地方&#xff0c;请评论指出) //定义激光IMU和数据集IMU之…

Java Agent之ByteBuddy

1&#xff1a;前言 在上一篇文章介绍 Java Agent 技术时&#xff0c;结合 Byte Buddy 技术实现了统计方法执行时间的功能。本次分享深入介绍 Byte Buddy 的一些基础知识&#xff0c;SkyWalking Agent 强大的地方就是重度使用该工具实现探针数据动态生成代码填充参数的。 2&am…

指定加拿大|环境科学老师获阿尔伯塔大学邀请函

U老师入选了省公派出国项目&#xff0c;其指定加拿大&#xff0c;并要求专业为世界排名领先&#xff0c;或者是能填补国内科研和技术空白的短板学科。我们利用广泛资源&#xff0c;开展精准申请&#xff0c;先后得到多所大学反馈&#xff0c;并获得4所大学的邀请函&#xff0c;…