STM32CUBEIDE配置STM32F072使用FLASH进行读写操作

目录

  • 1. 配置
  • 2. 时钟
  • 3. 中断
  • 4. 增加代码部分
    • 4.1 stm32flash.c 内部代码
    • 4.2 stm32flash.h 内部代码
    • 4.3 例子

1. 配置

似乎没有与FLASH相关的…

在这里插入图片描述

2. 时钟

大同小异

在这里插入图片描述

3. 中断

中断:一定要打开

在这里插入图片描述

4. 增加代码部分

在此增加了 “stm32flash.c” 和 “stm32flash.h” 文件

在这里插入图片描述

4.1 stm32flash.c 内部代码

写入部分:

/*带检查的写入*/
#define FLASH_WAITETIME 1000#define STM32_FLASH_BASE   0x08000000 		//STM32 FLASH的起始地址#define STM_SECTOR_SIZE	2048	//大容量STM32的扇区大小为2Kuint16_t STMFLASH_BUF[STM_SECTOR_SIZE/2];void STMFLASH_Write(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite)
{uint32_t secpos;	   //扇区地址uint16_t secoff;	   //扇区内偏移地址(16位字计算)uint16_t secremain; //扇区内剩余地址(16位字计算)uint16_t i;uint32_t offaddr;   //去掉0X08000000后的地址if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*512))){return;//非法地址}HAL_FLASH_Unlock();					//解锁offaddr=WriteAddr-STM32_FLASH_BASE;		//实际偏移地址.secpos=offaddr/STM_SECTOR_SIZE;			//扇区地址  0~127 for STM32F103RBT6secoff=(offaddr%STM_SECTOR_SIZE)/2;		//在扇区内的偏移(2个字节为基本单位.)secremain=STM_SECTOR_SIZE/2-secoff;		//扇区剩余空间大小if(NumToWrite<=secremain){secremain=NumToWrite;//不大于该扇区范围}while(1){STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容for(i=0;i<secremain;i++)	//校验数据{if(STMFLASH_BUF[secoff+i]!=0XFFFF){break;//需要擦除}}if(i<secremain)				//需要擦除{FLASH_PageErase(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);	//擦除这个扇区FLASH_WaitForLastOperation(FLASH_WAITETIME);            	//等待上次操作完成CLEAR_BIT(FLASH->CR, FLASH_CR_PER);							//清除CR寄存器的PER位,此操作应该在FLASH_PageErase()中完成!//但是HAL库里面并没有做,应该是HAL库bug!for(i=0;i<secremain;i++)//复制{STMFLASH_BUF[i+secoff]=pBuffer[i];}STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区}else{FLASH_WaitForLastOperation(FLASH_WAITETIME);       	//等待上次操作完成STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.}if(NumToWrite==secremain){break;//写入结束了}else//写入未结束{secpos++;				//扇区地址增1secoff=0;				//偏移位置为0pBuffer+=secremain;  	//指针偏移WriteAddr+=secremain*2;	//写地址偏移(16位数据地址,需要*2)NumToWrite-=secremain;	//字节(16位)数递减if(NumToWrite>(STM_SECTOR_SIZE/2)){secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完}else{secremain=NumToWrite;//下一个扇区可以写完了}}};HAL_FLASH_Lock();		//上锁
}/**   无检查写入*   WriteAddr - 地址*   pBuffer - 数据*   NumToWrite - 长度** */
void STMFLASH_Write_NoCheck(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite)
{uint16_t i;for(i=0;i<NumToWrite;i++){HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,WriteAddr,pBuffer[i]);WriteAddr+=2;		//地址增加2.}
}

读取部分:

/** 读取半字  16位* faddr - 地址* */
uint16_t STMFLASH_ReadHalfWord(uint32_t faddr)
{return *(__IO uint16_t*)faddr;
}/*读取len个16位数据*/
void STMFLASH_Read(uint32_t ReadAddr,uint16_t *pBuffer,uint16_t NumToRead)
{uint16_t i;for(i=0;i<NumToRead;i++){pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.ReadAddr+=2;//偏移2个字节.}
}

4.2 stm32flash.h 内部代码

#ifndef __STMFLASH_H
#define __STMFLASH_H#include "stm32f0xx_hal.h"
#include "main.h"void STMFLASH_Write(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite);
void STMFLASH_Write_NoCheck(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite);void STMFLASH_Read(uint32_t ReadAddr,uint16_t *pBuffer,uint16_t NumToRead);
uint16_t STMFLASH_ReadHalfWord(uint32_t faddr);#endif

4.3 例子

#define  FLASH_0400_ADDR   0x0800F000   //地址宏  60Kuint16_t R_init_data = 16000;
uint16_t  R_0400_F=16000;if(STMFLASH_ReadHalfWord(FLASH_0400_ADDR) > 50000) //读半字 2byte,16位数据,初始为0xFFFF(65535);
{STMFLASH_Write(FLASH_0400_ADDR, &R_init_data, 1); //写入16位数据,16000(0x3E80),长度1个半字,2byte(1个16位数据);
}
else
{R_0400_F = STMFLASH_ReadHalfWord(FLASH_0400_ADDR); //读取数据赋值
}

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

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

相关文章

数据结构基础(基于c++)

数据结构基础&#xff08;基于c&#xff09; 文章目录 数据结构基础&#xff08;基于c&#xff09;前言1. 递归、迭代、时间复杂度、空间复杂度2. 数据结构 数组与链表1. 数组2. 链表3. 动态数组4. 数组与链表对比 前言 参考资料&#xff1a;Hello 算法 (hello-algo.com) 1. 递…

MySQL 的故事:一场 SQL 语句的戏剧演绎

本文由 ChatMoney团队出品 第一幕&#xff1a;解析与优化 - “翻译官与谋士” SQL 解析器是第一个上场的角色&#xff0c;任务就是把 SQL 请求翻译成 MySQL 能听懂的语言。就像你点餐时&#xff0c;服务员得听懂你到底要什么菜。不然你说“我要一盘炒青菜”&#xff0c;结果服…

基于STM32和人工智能的智能小车系统

目录 引言环境准备智能小车系统基础代码实现&#xff1a;实现智能小车系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能小车管理与优化问题解决方案与优化收尾与总结 1. 引言 随着机器人技术的发展&#xff0c;智能小…

烽宇团队走进社区,关爱老人、爱护环境,开展一系列公益活动

在这片城市的喧嚣与繁忙中,烽宇团队用实际行动展示了他们对社会的关爱与责任感。作为在科技和商业领域取得显著成就的团队,烽宇不仅专注于企业发展,还积极投身于社区公益活动,回馈社会。 关爱老人,温暖人心 社区中的老年人是社会的宝贵财富,他们的生活质量直接关系到社区的幸福…

【论文精读】树环水印Tree-Ring Watermarks:隐形且稳健的扩散图像的指纹

文章目录 一、文章概览&#xff08;一&#xff09;主要工作&#xff08;二&#xff09;相关工作 二、具体方法&#xff08;一&#xff09;威胁模型&#xff08;二&#xff09;树轮水印概述&#xff08;三&#xff09;构造树轮水印键&#xff08;四&#xff09;提取用于水印检测…

Spring中网络请求客户端WebClient的使用详解

Spring中网络请求客户端WebClient的使用详解_java_脚本之家 Spring5的WebClient使用详解-腾讯云开发者社区-腾讯云 在 Spring 5 之前&#xff0c;如果我们想要调用其他系统提供的 HTTP 服务&#xff0c;通常可以使用 Spring 提供的 RestTemplate 来访问&#xff0c;不过由于 …

口罩佩戴智能监测摄像机

智能监测摄像机在现代城市安全管理中扮演着关键角色&#xff0c;尤其是像口罩佩戴智能监测摄像机这样的设备&#xff0c;其应用正在日益扩展&#xff0c;对于公共卫生和安全至关重要。 这类摄像机利用先进的图像识别技术&#xff0c;能够实时监测人群中是否佩戴口罩。通过高精度…

python基础语法学习(工程向)-Stage3-数据可视化

json 是一种轻量的数据交互格式&#xff0c;可以按照json指定的格式去组织和封装数据&#xff0c;而本质上是一个带有特定格式的字符串。 功能 json是在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言之间的数据传递和交互。 格式 json的格式要求较为严格&#…

[Cloud Networking] Layer3 (Continue)

文章目录 1. DHCP Protocol1.1 DHCP 三种分配方式1.2 DHCP Relay (中继) 2. 路由协议 (Routing Protocol)2.1 RIP (Routing Information Protocol)2.2 OSPF Protocol2.2.1 OSPF Area2.2.2 Route ID / DR / BDR2.2.3 LSA / OSPF 邻居表 / LSDB / OSPF路由表 2.3 BGP Protocol2.4…

交易中的群体行为特征和决策模型

本文基于人的行为和心理特征&#xff0c;归纳出交易中群体的行为决策模型&#xff0c;并基于这个模型&#xff0c;分析股价波浪运行背后的逻辑&#xff0c;以及投机情绪的周期变化规律&#xff0c;以此指导交易&#xff0c;分析潜在的风险和机会&#xff0c;寻找并等待高性价比…

Python大数据-电商商品详情数据分析【JD电商平台为例】

一、项目背景 网上购物已经成为大众生活的重要组成部分。人们在电商平台上浏览商品并购物&#xff0c;产生了海量的用户行为数据&#xff0c;用户对商品的详情数据对商家具有重要的意义。利用好这些碎片化、非结构化的数据&#xff0c;将有利于企业在电商平台上的持续发展&…

mysql分析常用锁

这里写自定义目录标题 1.未提交事物&#xff0c;阻塞DDL&#xff0c;继而阻塞所有同表的后续操作,查看未提交事务的进程2.存着正在进行的线程数据。3.根据processlist表中的id杀掉未释放的线程4.查看正在使用的表5.mysql为什么state会有waiting for handler commit6.什么情况导…

鸿蒙实现金刚区效果

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 所谓“金刚区"是位于APP功能入口的导航区域&#xff0c;通常以“图标文字”的宫格导航的形式出现。之所以叫“金刚区”&#xff0c;是因为该区域会随着业务目标的改变&#xff0c;展示不同的功能图标&#xff…

快速压缩前端项目

背景 作为前端开发工程师难免会遇到需要把项目压缩成压缩文件来传送的情况&#xff0c;这时候需要压缩软件进行压缩文件处理 问题 项目中的依赖包文件非常庞大&#xff0c;严重影响压缩速度&#xff0c;即使想先删除再压缩&#xff0c;删除文件也不会很快完成 解决 首先要安…

Jmeter如何进行分布式测试

使用Jmeter进行性能测试时&#xff0c;有些同学问我如果并发数比较大(比如最近项目需要支持1000并发)&#xff0c;单台电脑的配置(CPU和内存)可能无法支持&#xff0c;怎么办就需要使用分布式压测 1.分布式原理&#xff1a; 1、Jmeter分布式测试时&#xff0c;选择其中一台作…

数据库复习——范式(Normal Form)

因为上课的时候一直在摸鱼没有听懂&#xff0c;所以复习的时候理解一下数据库中关于范式的相关知识点。涉及范式的定义&#xff0c;以及给定一个函数依赖集判断是那种范式的方法。 范式 迄今为止一共提出了 6 6 6 种范式&#xff0c;他们的关系是 5 N F ⊂ 4 N F ⊂ B C N F …

UE5 C++ 跑酷游戏练习 Part1

一.修改第三人称模板的 Charactor 1.随鼠标将四处看的功能的输入注释掉。 void ARunGANCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) {// Set up action bindingsif (UEnhancedInputComponent* EnhancedInputComponent CastChecked&…

UML详解

1.what is the UML UML 全称是 Unified Modeling Language&#xff08;统一建模语言&#xff09;&#xff0c;它以图形的方式来描述软件的概念 2.它存在的目的 UML 的目标是通过一定结构的表达&#xff0c;来解决现实世界到软件世界的沟通问题。 3.什么是模&#xff0c;…

Centos7安装自动化运维Ansible

自动化运维Devops-Ansible Ansible是新出现的自动化运维工具&#xff0c;基于Python 开发&#xff0c;集合了众多运维工具&#xff08;puppet 、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置 、批量程序部署、批量运行命令 等功能。Ansible…

【每日刷题】Day68

【每日刷题】Day68 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 451. 根据字符出现频率排序 - 力扣&#xff08;LeetCode&#xff09; 2. 最小的K个数_牛客题霸_牛客…