没有合适的资源?快使用搜索试试~ 我知道了~
STM32F4--FLASH读写demo程
需积分: 39 91 下载量 41 浏览量
2018-12-01
20:37:45
上传
评论 3
收藏 225KB PDF 举报
温馨提示
试读
16页
STM32F4 -- FLASH 读 写 dem o程。数据保存到stm32f4的内部Flash中。于是调了一下 午Flash,整理出了下面这个demo程序。发现stm32f4的功能还挺强
资源推荐
资源详情
资源评论
STM32F4--FLASH读写demo程序
www.51hei.com 2015-6-5 13:47
最近在写机器人的姿态解算,需要把一些数据保存到stm32f4的内部Flash中。于是调了一下
午Flash,整理出了下面这个demo程序。发现stm32f4的功能还挺强的,
8位、16位、32位、64位的数据都能读写。而且还能写入负数,虽然库里提供的函数写数据
的类型是无符号的,我也不知道这是什么原因。
flash.c
#include "flash.h"
/****************************************************************************
* 功 能: 获取地址Address对应的sector编号
* 入口参数:地址
* 出口参数:sector编号
* 说 明:无
* 调用方法:无
****************************************************************************/
uint16_t Flash_GetSector(uint32_t Address)
uint16_t sector = 0;
if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0))
sector = FLASH_Sector_0;
else if((Address < ADDR_FLASH_SECTOR_2) && (Address >=
ADDR_FLASH_SECTOR_1))
sector = FLASH_Sector_1;
else if((Address < ADDR_FLASH_SECTOR_3) && (Address >=
ADDR_FLASH_SECTOR_2))
sector = FLASH_Sector_2;
else if((Address < ADDR_FLASH_SECTOR_4) && (Address >=
ADDR_FLASH_SECTOR_3))
sector = FLASH_Sector_3;
else if((Address < ADDR_FLASH_SECTOR_5) && (Address >=
ADDR_FLASH_SECTOR_4))
sector = FLASH_Sector_4;
else if((Address < ADDR_FLASH_SECTOR_6) && (Address >=
ADDR_FLASH_SECTOR_5))
sector = FLASH_Sector_5;
else if((Address < ADDR_FLASH_SECTOR_7) && (Address >=
ADDR_FLASH_SECTOR_6))
sector = FLASH_Sector_6;
else if((Address < ADDR_FLASH_SECTOR_8) && (Address >=
ADDR_FLASH_SECTOR_7))
sector = FLASH_Sector_7;
else if((Address < ADDR_FLASH_SECTOR_9) && (Address >=
ADDR_FLASH_SECTOR_8))
sector = FLASH_Sector_8;
else if((Address < ADDR_FLASH_SECTOR_10) && (Address >=
ADDR_FLASH_SECTOR_9))
sector = FLASH_Sector_9;
else if((Address < ADDR_FLASH_SECTOR_11) && (Address >=
ADDR_FLASH_SECTOR_10))
sector = FLASH_Sector_10;
else/*(Address < FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_11))*/
sector = FLASH_Sector_11;
return sector;
/****************************************************************************
* 功 能: 擦除指定扇区
* 入口参数:SectorNum 扇区号
* 出口参数:无
* 说 明:无
* 调用方法:无
****************************************************************************/
void Flash_EraseSector(uint16_t SectorNum)
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
if (FLASH_EraseSector(SectorNum, VoltageRange_3) != FLASH_COMPLETE) while (1);
FLASH_Lock();
/****************************************************************************
* 功 能: 写入长度为length的32位数据
* 入口参数:address:地址
length: 数据长度
data_32:要写入的数据指针
* 出口参数:无
* 说 明:无
* 调用方法:无
****************************************************************************/
void Flash_Write32BitDatas(uint32_t address, uint16_t length, int32_t* data_32)
uint16_t StartSector, EndSector,i;
FLASH_Unlock(); //解锁FLASH后才能向FLASH中写数据。
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);
StartSector = Flash_GetSector(address); //获取FLASH的Sector编号
EndSector = Flash_GetSector(address+4*length);
for (i = StartSector; i < EndSector; i += 8) //每次FLASH编号增加8,可参考上边FLASH
Sector的定义。
if (FLASH_EraseSector(i, VoltageRange_3) != FLASH_COMPLETE) while (1);
for(i=0; i<length; i++)
if (FLASH_ProgramWord(address, data_32[i]) == FLASH_COMPLETE) //将DATA_32写
入相应的地址。
剩余15页未读,继续阅读
资源评论
weixin_38827143
- 粉丝: 1
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功