datasheet

STM32F4 内部flash驱动(寄存器操作)

2019-07-11来源: eefocus关键字:STM32F4  内部flash驱动  寄存器操作

stm32f4_flash.c


/*************************************************************************************************************

 * 文件名: stm32f4_flash.c

 * 功能: STM32F4 内部FLASH编程驱动函数

 * 作者: cp1300@139.com

 * 创建时间: 2013-10-20

 * 最后修改时间: 2018-01-13

 * 详细: 用于STM32F4内部flash读写驱动

2018-01-13:初始版本,默认位宽为32位,写入的数据必须32位对齐,供电必须在2.7-3.6V之间,建议使用3.3V供电

2018-01-16:修复扇区擦除时没有解锁问题

*************************************************************************************************************/

#include "stm32f4_flash.h"

#include "system.h"

 

//FLASH 扇区的起始地址

#define ADDR_FLASH_SECTOR_0     ((u32)0x08000000) //扇区0起始地址, 16 Kbytes  

#define ADDR_FLASH_SECTOR_1     ((u32)0x08004000) //扇区1起始地址, 16 Kbytes  

#define ADDR_FLASH_SECTOR_2     ((u32)0x08008000) //扇区2起始地址, 16 Kbytes  

#define ADDR_FLASH_SECTOR_3     ((u32)0x0800C000) //扇区3起始地址, 16 Kbytes  

#define ADDR_FLASH_SECTOR_4     ((u32)0x08010000) //扇区4起始地址, 64 Kbytes  

#define ADDR_FLASH_SECTOR_5     ((u32)0x08020000) //扇区5起始地址, 128 Kbytes  

#define ADDR_FLASH_SECTOR_6     ((u32)0x08040000) //扇区6起始地址, 128 Kbytes  

#define ADDR_FLASH_SECTOR_7     ((u32)0x08060000) //扇区7起始地址, 128 Kbytes  

#define ADDR_FLASH_SECTOR_8     ((u32)0x08080000) //扇区8起始地址, 128 Kbytes  

#define ADDR_FLASH_SECTOR_9     ((u32)0x080A0000) //扇区9起始地址, 128 Kbytes  

#define ADDR_FLASH_SECTOR_10    ((u32)0x080C0000) //扇区10起始地址,128 Kbytes  

#define ADDR_FLASH_SECTOR_11    ((u32)0x080E0000) //扇区11起始地址,128 Kbytes  

 

 

 

/*************************************************************************************************************************

* 函数 : void STM32FLASH_Unlock(void)

* 功能 : 解锁STM32的FLASH

* 参数 : 无

* 返回 : 无

* 依赖 : 底层

* 作者 : cp1300@139.com

* 时间 : 2013-10-20

* 最后修改时间 : 2013-10-20

* 说明 :

*************************************************************************************************************************/

void STM32FLASH_Unlock(void)

{

FLASH->KEYR=FLASH_KEY1; //写入解锁序列.

FLASH->KEYR=FLASH_KEY2;

}

 

 

 

/*************************************************************************************************************************

* 函数 : void STM32FLASH_Lock(void)

* 功能 : 上锁STM32的FLASH

* 参数 : 无

* 返回 : 无

* 依赖 : 底层

* 作者 : cp1300@139.com

* 时间 : 2013-10-20

* 最后修改时间 : 2018-01-13

* 说明 :

*************************************************************************************************************************/

void STM32FLASH_Lock(void)

{

FLASH->CR|=(u32)1<<31; //上锁

}

 

 

 

 

/*************************************************************************************************************************

* 函数 : STM32FLASH_STATUS STM32FLASH_GetStatus(void)

* 功能 : 得到FLASH状态

* 参数 : 无

* 返回 : STM32FLASH_STATUS

* 依赖 : 底层

* 作者 : cp1300@139.com

* 时间 : 2013-10-20

* 最后修改时间 : 2018-01-03

* 说明 :

*************************************************************************************************************************/

STM32FLASH_STATUS STM32FLASH_GetStatus(void)

{

u32 temp=FLASH->SR; 

if(temp&(1<<16))return STM32FLASH_BUSY; //忙

else if(temp&(1<<4))return STM32FLASH_WPRERR; //写保护错误

else if(temp&(1<<5))return STM32FLASH_PGAERR; //编程对齐错误

else if(temp&(1<<6))return STM32FLASH_PGPERR; //并行位数错误

else if(temp&(1<<7))return STM32FLASH_PGSERR; //编程顺序错误

return STM32FLASH_OK; //操作完成

}

 

 

 

/*************************************************************************************************************************

* 函数 : STM32FLASH_STATUS STM32FLASH_WaitDone(u32 time)

* 功能 : 等待操作完成

* 参数 : time:要延时的长短,单位us

* 返回 : STM32FLASH_STATUS

* 依赖 : 底层

* 作者 : cp1300@139.com

* 时间 : 2013-10-20

* 最后修改时间 : 2018-01-03

* 说明 :

*************************************************************************************************************************/

STM32FLASH_STATUS STM32FLASH_WaitDone(u32 time)

{

STM32FLASH_STATUS status;

if(time < 1) time = 1;

do

{

status=STM32FLASH_GetStatus(); //获取状态

if(status!=STM32FLASH_BUSY)break; //非忙,无需等待了,直接退出.

Delay_US(1);

time--;

}while(time);

 

return status;

}

 

 

 

/*************************************************************************************************************************

* 函数 : STM32FLASH_STATUS STM32FLASH_EraseSector(u8 sectoraddr)

* 功能 : 扇区擦除

* 参数 : sectoraddr:扇区地址,0-11

* 返回 : STM32FLASH_STATUS

* 依赖 : 底层

* 作者 : cp1300@139.com

* 时间 : 2018-01-03

* 最后修改时间 : 2018-01-03

* 说明 : 扇区大小:0~3:16KB扇区;4:64KB扇区;5~11:128KB扇区

128KB扇区擦除足最大2秒

2018-01-16:修复扇区擦除时没有解锁问题

*************************************************************************************************************************/

STM32FLASH_STATUS STM32FLASH_EraseSector(u8 sectoraddr)

{

STM32FLASH_STATUS status;

status=STM32FLASH_WaitDone(200000); //等待上次操作完成,最大时间2秒,如果已经操作完成了会直接跳过

STM32FLASH_Unlock(); //解锁 

if(status==STM32FLASH_OK) //没有错误

FLASH->CR&=~(3<<8); //清除PSIZE原来的设置

FLASH->CR|=2<<8; //设置为32bit宽,确保VCC=2.7~3.6V之间!!

FLASH->CR&=~(0X1F<<3); //清除原来的设置

FLASH->CR|=sectoraddr<<3; //设置要擦除的扇区 

FLASH->CR|=1<<1; //扇区擦除 

FLASH->CR|=1<<16; //开始擦除

status=STM32FLASH_WaitDone(200000); //等待操作结束,最大2s  

if(status!=STM32FLASH_BUSY) //非忙

{

FLASH->CR&=~(1<<1); //清除扇区擦除标志.

}

}

STM32FLASH_Lock(); //上锁

return status; //返回状态

}

 

 

 

 

/*************************************************************************************************************************

* 函数 : STM32FLASH_STATUS STM32FLASH_WriteWord(u32 addr, u32 data)

* 功能 : 在FLASH指定地址写入一个字的数据(32bit写入)

* 参数 : faddr:指定地址(此地址必须为4的倍数!!);data:要写入的数据

* 返回 : STM32FLASH_STATUS

* 依赖 : 底层

* 作者 : cp1300@139.com

* 时间 : 2018-01-03

* 最后修改时间 : 2018-01-03

* 说明 : 警告,地址必须为4的倍数

*************************************************************************************************************************/

STM32FLASH_STATUS STM32FLASH_WriteWord(u32 faddr, u32 data)

{

STM32FLASH_STATUS status;

status=STM32FLASH_WaitDone(200); //判断状态

if(status==STM32FLASH_OK) //没有错误

{

FLASH->CR&=~(3<<8); //清除PSIZE原来的设置

FLASH->CR|=2<<8; //设置为32bit宽,确保VCC=2.7~3.6V之间!!

  FLASH->CR|=1<<0; //编程使能

*(vu32*)faddr=data; //写入数据

status=STM32FLASH_WaitDone(200); //等待操作完成,一个字编程,最多100us.

if(status!=STM32FLASH_BUSY) //非忙

{

FLASH->CR&=~(1<<0); //清除PG位.

}

return status;

 

 

 

/*************************************************************************************************************************

* 函数 : u32 STM32FLASH_ReadWord(u32 faddr)

* 功能 : 读取指定地址的一个字(32位数据) 

* 参数 : faddr:指定地址(此地址必须为4的倍数!!);

* 返回 : 数据

* 依赖 : 底层

* 作者 : cp1300@139.com

* 时间 : 2018-01-03

* 最后修改时间 : 2018-01-03

* 说明 : 警告:地址必须是4的整数倍

*************************************************************************************************************************/

u32 STM32FLASH_ReadWord(u32 faddr)

{

return *(vu32*)faddr; 

}

 

 

/*************************************************************************************************************************

* 函数 : u8 STM32FLASH_GetFlashSector(u32 faddr)

* 功能 : 获取某个地址所在的扇区

* 参数 : faddr:指定地址

* 返回 : 删除编号,0-11,如果超出了也会限制到11

* 依赖 : 底层

* 作者 : cp1300@139.com

* 时间 : 2018-01-03

* 最后修改时间 : 2018-01-03

* 说明 : 地址请不要超出范围

*************************************************************************************************************************/

u8 STM32FLASH_GetFlashSector(u32 faddr)

{

if(faddr

else if(faddr

else if(faddr

else if(faddr

else if(faddr

else if(faddr

else if(faddr

else if(faddr

else if(faddr

else if(faddr

else if(faddr

else return 11;

}

 

 

/*******************************************************

[1] [2]

关键字:STM32F4  内部flash驱动  寄存器操作

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic467441.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32开发笔记46:STM32F0低功耗设计
下一篇:怎样用STM32 中的 I2C读写EEPROM(二)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

解决stm32f103通过stlink不能烧录程序问题

问题:   stm32(stm32f103c8T6)开发板只能通过串口烧录程序,而st—link居然不行描述:解决:st-link固件升级用stm32cubemx快速开发时没有配置好调试模式重新生成代码就可以了如果还是不行的话,就得升级一下stlink固件了,具体升级方法可百度
发表于 2019-07-19
解决stm32f103通过stlink不能烧录程序问题

STM32F4标准外设库模板工程建立与使用

sysclk为168MHzFSMC和FMCSTM32F4的某些系列是FSMC,有些是FMC浮点处理器FPUhttp://www.stmcu.org/module/forum/thread-581903-1-1.html打开 option for target 选择 C/C++ 标签, 在define中添加:USE_HAL_DRIVER,STM32F407xx,__TARGET_FPU_VFP,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING,ARM_MATH_CM4,__CC_ARM,由于我的是HAL的库,所以前面有USE_HAL_DRIVER的全局宏定义,如果你用的不是HAL库,而是使用固件库的话,一般会有
发表于 2019-07-19
STM32F4标准外设库模板工程建立与使用

STM32F1系列单片机USB外设相关寄存器的定义

Keil MDK网站上下载的Keil.STM32F1xx_DFP.2.2.0.pack包中的stm32f10x.h头文件里面没有USB_TypeDef的定义,只有寄存器位的定义,是不完整的头文件。没有USB的数据结构就会给访问USB寄存器带来一定的困难。虽然可以参照STM32参考手册中的USB register map自己编写出USB_TypeDef结构体,但是这样比较麻烦。不过,STM32CubeMX工具生成的STM32F103工程中的头文件stm32f103xe.h中就有完整的USB数据结构,该头文件的版本是V4.2.0,日期为31-March-2017,作者仍然是Keil里面的MCD Application Team
发表于 2019-07-19

STM32F103 DMA 通道对应的外设

今天在调试stm32f103的时候,使用串口1的RX对应DMA1通道5是正确的,但是当我调试调试到串口2的RX的时候依然在用原通道,完全忽略了芯片不同的外设所对应的DMA通道是不同的。 
发表于 2019-07-19
STM32F103 DMA 通道对应的外设

不同stm32f103芯片内部外设资源

由表可知,芯片内部的外设资源除了跟stm32f103后面的第一个字母有关外,还和flash的大小有关。上面的表中只有一部分,具体的可以参考Keil的芯片型号选择部分。下面是stm32f103c8t6的资源:  TIM1_BRK_IRQn               = 24,       TIM1_UP_IRQn                = 25,      
发表于 2019-07-19
不同stm32f103芯片内部外设资源

一种可行的STM32F103外设RTC使用方法

前言最近做的项目需要用RTC功能,记录掉上电时间。然后就开始琢磨STM32的RTC,在使用的过程中出现各种问题。搞的很是头痛。几经折腾,终于弄出一种稳定的使用方法。刚开始最大的问题就是掉电后时钟不走,代码改来该去,最后发现不管是第一次初始化还是每次上电运行,都需要打开PWR和BKP时钟。下面就把我的代码全贴出来,可以直接调用。代码#ifndef BSP_RTC_H#define BSP_RTC_H#include "stm32f10x.h"#include <time.h>//BCD码表示时间typedef struct systemtime_tag{    unsigned
发表于 2019-07-19

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved