在单片机系统中,程序的存储一般放在flash中,不易丢失的数据一般存放在EEROM中(比如说我们经常使用的AT24C02,、AT24C256),一般情况不建议将频繁读写的数据存放在Flash中,一方面FLASH在单片机中都是1K或2K为一页,在执行擦除指令时,一次最少要擦除一页的数据。FLASH支持单字节读写,但每次在更新数据前都必须先擦除原数据,然后才能重新写入数据,而不能在原数据基础上更新内容。另一方面,频繁读写Flash会缩短Flash的使用时间。
flash的读写一般用作两种情况,第一种是通过程序下载或仿真将程序下载到单片机Flash,另一种是在单片机运行过程中实现在线升级(IAP)。对于初学者,参照编程手册做一次编程练习以便进一步加深理解是有必要的。
flash的读写要注意两点:
1、注意读写Flash的地址是否数据对齐或者可读写,特别注意区分读写半字或字、读写的地址是否在Flash区 (0x800,0000-64K)。
2、注意当前Flash是否处于读写保护模式。
当遇到HardFault时,当然就是这两点有其一出错了。一般是Flash读写的地址错误!
这些内容都可以从相应正在使用的芯片编程手册中获得,这里也做了截图如下:
Flash的读操作非常简单,其操作与读取特殊功能寄存器完全一致,举例如下:
test_r=*(__IO uint16_t*)0x8003000;
Flash的写操作就有点复杂了,其中包括,解锁、擦除、写、上锁4步。当然编程手册中也给出了具体的步骤如图所示:
由于有了固件库的使用,实际上编程操作非常简单,当然通过分析这些固件库函数可以更加深入的理解Flash读写步骤。程序如下:
FLASH_SetLatency(FLASH_Latency_1); //设置延迟
FLASH_Unlock(); //解锁
FLASH_ErasePage(0x8003000); //擦除
FLASH_ProgramHalfWord(0x8003000,test16); //写半字
FLASH_Lock(); //上锁
test_r=*(__IO uint16_t*)0x8003000; //验证
解锁、擦除、写、上锁4步是必须的,一般频率在24MHZ以上的为了Flash读写正确需要设置延迟,当然不设置也并不会出错,将写入Flash的内容读出一般是为了验证写入的是否正确,写错了当然要重头再写一遍了,对于可靠性要求不高的话,只有解锁、擦除、写、上锁4步就可以了。
关键字:固件库 STM32 读写FLASH HardFault
引用地址:
结合固件库探讨STM32读写FLASH步骤、HardFault问题
推荐阅读最新更新时间:2024-03-16 16:11
STM32单片机ADC库函数的定义和使用方法
ADC的基本概念希望各位网友查阅相应的手册,上面对ADC有比较详尽的介绍,包括误差的分析和消除。这里主要介绍ADC的基本库函数的定义和使用。 1.ADC_DeInit函数的功能是将外设ADCx的全部寄存器重设为默认值。 ADC_DeInit(ADC2); 2.ADC_Init函数的功能是根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器。其中ADC_InitTypeDef定义在stm32f10x_adc.h中。其结构体如下所示: typedef struct { u32 ADC_Mode;//可以设置ADC_Mode FunctionalState ADC_ScanConvMode;//规定了模数转换工
[单片机]
集成电机驱动方案(STM32+DRV8841)
以前的博客中介绍过一款分立元器件实现的H桥的博文,现在提供一个更简单的单芯片方案。 驱动电路主要由一款DRV8841芯片组成,它是一个集成的电机驱动解决方案,内置两个功率NMOS H桥,可通过PWM驱动两个直流电机,或者一个步进电机。它还集成了电流感知、调节电路与保护装置,支持过热、过电流与欠压保护,并且自带最大3.75us的死区。电机电压支持8.2V到45V,最大电流为2.5A。 主要的原理图如下 我使用的控制芯片是STM32F405RGT6,引脚连接关系如下 网络标号 引脚 功能 备注 MAP PC6 桥A输入1 MAOP的控制端,内部下拉,与单片机T8C1连接(Timer8的通道1)。 MAN PC7 桥A输入
[单片机]
STM32仿真器运行正常,脱离仿真器后无法运行
调试STM32的程序时,发现程序在仿真器环境下运行一切OK,但是固化程序后,程序在完成初始化后就不运行了。 参照网上一些朋友说的检查复位电路、晶振电路、boot0和boot1管脚电平等等都是正常的。 最后发现是由于调试信息引起的:在程序仿真过程中,使用了printf对数据进行打印调试信息,程序运行到printf函数后就不运行了,将调试信息删除后,程序运行正常。 希望对大家能有帮助。
[单片机]
STM32的RS485通信
1.简介 与CAN类似,RS-485是一种工业控制环境中常用的通讯块议,它具有抗干扰能力强、传输距离远的特点。RS-485通讯协议由RS-232协议改进而来,协议层不变,只是改进了物理层,因而保留了串口通讯协议应用简单的特点。 用的是SP3485芯片: 通信的时候,A端口连接另一个设备的A端口,B端口连接B端口,不是交叉相连。 最多能够连接128个设备,所以在某种情况下可以取代网络,RE引脚用来控制通讯数据的方向,要么进行接收,要么进行发送。 本质还是串口通信 RS485_RE为高电平的时候,DE为高电平有效,允许发送数据 RS485_RE为低电平的时候,RE为低电平有效,允许接收数据 所以当你要发送数据的时候 ,
[单片机]
一步步写STM32 OS【二】环境搭建
一、安装IAR for ARM6.5 二、新建工程 1、选择处理器:STM32F407VG,暂不使用FPU 2、必要的路径配置和宏定义 3、使用SWO重定向IO输出 4、使用ST-LINK仿真器 5、下载配置 6、设置CPU频率,防止SWO输出乱码 三、代码调试 四、工程下载 stepbystep_stm32_os_template.rar
[单片机]
stm32——跑马灯实验(用库函数实现)
库函数介绍 1,初始化函数: void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 作用:初始化一个或者多个IO口(同一组)的工作方式和速度。该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的有时候有设置BSRR或者BRR寄存器 例如: GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_5;//LED0-- PB.5 端口配置 GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_OUT_PP;//
[单片机]
STM32如何收发float类型数据?
在之前文章里提到了共用体用来传输浮点数的用法,但那篇笔记中没有详细介绍,这篇笔记我们一起来看一看具体实例。 实际应用中,我们可能需要两个设备通过串口传输浮点数据: 本篇笔记为了方便演示,使用串口助手模拟其中一个设备,本篇笔记内容如下: 我们创建一个用于管理float类型数据的共用体: unionfloat_data { floatf_data; uint8_tbyte ; }; 数据的流向如: 本次使用串口助手模拟发送设备,省略了第一步,主要看第②、③步。 创建两个共用体变量,用于发送与接收: unionfloat_datarx_float_data,tx_float_data; 收发相关代码: 左
[单片机]