读写STM32内部flash读写代码
由于老师的要求,所以写了一份读写STM32内部FLASH的代码,这样的话就可以把STM32里面没有用来保存代码段的部分用来存储数据了。
由于《stm32flash编程手册》是很久很久以前看的,现在也没心情去仔细看那份手册了。大概浏览了一下,只看到了STM32里面的flash是以16位为单位读写的。
为什么记住这个,因为之前想写一个字节老是出错,所以翻翻手册,果然看到不能写1个字节数据。而且还发现,flash写地址为奇数时也会出错。所以这份代码里面
写flash的地址只能是偶数。浏览过程中还发现,手册里面说写flash和擦除flash的时候会影响cpu的运行速度,没仔细看(真心不想看)。其他具体手册里面的资料的话没有了.
看有没有高手仔细看完,然后写个总结什么的。。。
而且flash的读写保护也没看清楚,好像这些保护都是针对页大小来保护的话。这样的话就可以只保护代码段,这些放数据段不用保护了,这样可以省下flash芯片,不错吧。
废话不多说,直接上代码。。
flash读写代码也不用初始化,拿来直接就用。哈哈。。。。。。。。。。
-------------------DataFlash.c----------------------------------
<span style="color:#009900;">#include "DataFlash.h"uint16_t Flash_Write_Without_check(uint32_t iAddress, uint8_t *buf, uint16_t iNumByteToWrite) {uint16_t i;volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;i = 0;// FLASH_UnlockBank1();while((i < iNumByteToWrite) && (FLASHStatus == FLASH_COMPLETE)){FLASHStatus = FLASH_ProgramHalfWord(iAddress, *(uint16_t*)buf);i = i+2;iAddress = iAddress + 2;buf = buf + 2;}return iNumByteToWrite;
}
/*** @brief Programs a half word at a specified Option Byte Data address.* @note This function can be used for all STM32F10x devices.* @param Address: specifies the address to be programmed.* @param buf: specifies the data to be programmed.* @param iNbrToWrite: the number to write into flash* @retval if success return the number to write, -1 if error* */
int Flash_Write(uint32_t iAddress, uint8_t *buf, uint32_t iNbrToWrite) {/* Unlock the Flash Bank1 Program Erase controller */uint32_t secpos;uint32_t iNumByteToWrite = iNbrToWrite;
uint16_t secoff;
uint16_t secremain;
uint16_t i = 0; uint8_t tmp[FLASH_PAGE_SIZE];FLASH_UnlockBank1();
secpos=iAddress & (~(FLASH_PAGE_SIZE -1 )) ;//扇区地址
secoff=iAddress & (FLASH_PAGE_SIZE -1); //在扇区内的偏移
secremain=FLASH_PAGE_SIZE-secoff; //扇区剩余空间大小 volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;if(iNumByteToWrite<=secremain) secremain = iNumByteToWrite;//不大于4096个字节while( 1 ) {Flash_Read(secpos, tmp, FLASH_PAGE_SIZE); //读出整个扇区for(i=0;i<secremain;i++) {="" ="" 校验数据if(tmp[secoff+i]!=0XFF)break; //需要擦除 }if(i<secremain) {="" ="" 需要擦除FLASHStatus = FLASH_ErasePage(secpos); //擦除这个扇区if(FLASHStatus != FLASH_COMPLETE)return -1;for(i=0;i<secremain;i++) { ="" 复制tmp[i+secoff]=buf[i];}Flash_Write_Without_check(secpos ,tmp ,FLASH_PAGE_SIZE);//写入整个扇区 } else {Flash_Write_Without_check(iAddress,buf,secremain);//写已经擦除了的,直接写入扇区剩余区间.}if(iNumByteToWrite==secremain) //写入结束了break;else {secpos += FLASH_PAGE_SIZE;secoff = 0;//偏移位置为0 buf += secremain; //指针偏移iAddress += secremain;//写地址偏移iNumByteToWrite -= secremain;//字节数递减if(iNumByteToWrite>FLASH_PAGE_SIZE) secremain=FLASH_PAGE_SIZE;//下一个扇区还是写不完else secremain = iNumByteToWrite;//下一个扇区可以写完了}}FLASH_LockBank1();return iNbrToWrite;
}/*** @brief Programs a half word at a specified Option Byte Data address.* @note This function can be used for all STM32F10x devices.* @param Address: specifies the address to be programmed.* @param buf: specifies the data to be programmed.* @param iNbrToWrite: the number to read from flash* @retval if success return the number to write, without error* */
int Flash_Read(uint32_t iAddress, uint8_t *buf, int32_t iNbrToRead) {int i = 0;while(i < iNbrToRead ) {*(buf + i) = *(__IO uint8_t*) iAddress++;i++;}return i;
}</span>
-------------------DataFlash.h----------------------------------
<span style="color:#009900;">#ifndef __DATAFLASH_H__
#define __DATAFLASH_H__#include "stm32f10x.h"
#include "stm32f10x_flash.h"#if defined (STM32F10X_HD) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) || defined (STM32F10X_XL)#define FLASH_PAGE_SIZE ((uint16_t)0x800)#else#define FLASH_PAGE_SIZE ((uint16_t)0x400)
#endifint Flash_Read(uint32_t iAddress, uint8_t *buf, int32_t iNbrToRead) ;
int Flash_Write(uint32_t iAddress, uint8_t *buf, uint32_t iNbrToWrite);#endif</span>
读写STM32内部flash读写代码相关推荐
- STM32 内部Flash读写 程序源码 [已验证]
目录 STM32 内部Flash带缓存读写 程序源码 0 Macro 1.Flash_Erase 2. Flash_Read_Byte 3.Flash_Write_NoBuffer 4.Flash_W ...
- stm32内部Flash读写
文章目录 1.stm32内部flash介绍 2.读写驱动编写 3.源码 上篇文章讲到了STM32来驱动外部flah的操作,flash真是好东西啊,内存大,能存的东西多,这样我们就可以用它来做一些大点的 ...
- STM32内部Flash读写问题
STM32Flash读写之Flash调试技巧 文章目录 1.先熟悉所用MCU的Flash存储大小以及扇区地址 2.Flsah写之前为什么要先擦除 3.Flash擦除长时间占用CPU 4.实测Flash ...
- c语言 将结构体放在flash,stm32的内部flash读写操作(含结构体的保存)
不同的stm32单片机的flash大小不同,这个需要查阅芯片手册或者查看STM32CubeMX软件. stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实 ...
- 基于STM32的Flash读写详解
基于STM32的Flash读取 前言 介绍 STM32 FLASH 闪存的编程和擦除 Flash读写的标准库函数 软件设计 FLASH的读取 直接读取某一地址的内容 读取选定位置的选定大小的内容 FL ...
- 【dsPIC33E】内部Flash读写
基于某些安全考虑或者降成本,我们不希望使用外部存储器件,但有时我们由需要记录一下参数,确保断电不丢失,这时,富余的内部代码存储Flash就派上用场了. 不同于外部存储器,几乎所有的内部Flash读写都 ...
- STM32CUBEIDE(16)----内部Flash读写
STM32CUBEIDE(16)----内部Flash读写 概述 视频教学 csdn课程 硬件准备 配置时钟树 串口重定向 FLASH定义 低密度 中密度 高密度 变量定义 演示效果 最后 概述 本例 ...
- 基于STM32的flash读写和DAC音频播放
一.STM32的flash读写 1.利用STM32CUBEMX创建工程 之前有过很多次创建工程的例子,这里大致过程如下: 2.keil中添加代码及修改配置 在flash.c中添加如下代码, 在main ...
- 单片机编程php,STC单片机内部FLASH读写程序(最新整理)
<STC单片机内部FLASH读写程序(最新整理)>由会员分享,可在线阅读,更多相关<STC单片机内部FLASH读写程序(最新整理)(6页珍藏版)>请在人人文库网上搜索. 1.S ...
最新文章
- HDU_2112 HDU Today(DIjkstra + map映射)
- 学python是看书还是看视频-Python与豆瓣读书
- C/C++多线程编程之一】VC6.0安装pthread
- long类型20位示例_Java Long类lowerOneBit()方法与示例
- 现在很多人都做自媒体,谈谈个人的一些想法
- 认真学习系列:数据结构与算法——慕课网笔记
- 安卓安装之离线搭建Android Studio开发环境
- QT之QPainter用法
- MockingBrid(AI拟声)教程
- 1#组合数学初步——排列与组合之加法原理、乘法原理
- Python爬虫实战之三:requests-百度/360搜索关键词提交
- ST7735 TFT显示屏 显示问题
- 深度学习论文: Computer Vision for Road Imaging and Pothole Detection: A State-of-the-Art Review
- python定义公民类、变量有身份证号_Python趣解身份证号码的奥秘!
- 2022年西式面点师(中级)考试题及模拟考试
- SpringBoot并发压测工具ContiPerf
- zigzag convert
- 安卓手机小说阅读器_小说迷安卓app2020最新版下载安卓版下载_小说迷安卓app2020最新版下载v3.1.8手机版apk下载...
- 活久见!Linux命令行居然也可以用来查看图像?
- Windows 11最新版:任务管理器性能参数详解,什么是分页缓冲池和句柄
热门文章
- 团队任务分配管理软件,可以分配团队任务的团队管理软件
- Jmeter API文档分析
- 对象类型数据和对象实例数据_服务数据对象简介
- 一场激烈的变化袭来!没抓住机会的企业,将留重大遗憾!李宁、安踏纷纷中招..
- python实现读取传感器发送到串口的数据,并将读取的串口数据写入文件、数据库存储
- maching learning入门(二)
- 求1900到2017的闰年天数
- ANSYS经典界面2D和3D线圈磁场仿真
- [代码积累]解决HL7协议、TCP/IP通讯、16进制转字符串,中文乱码的问题。
- 十年一剑 高端OA迎来黄金收割期