使用HAL写STM32F103的内部flash,掉电不丢失

存储器介绍

SRAM属于RAM类,上面说过的的FLASH存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程的性能,还不会断电丢失数据同时可以快速读取数据。

 单片机内部flash

RAM(Random Access Memory) :掉电之后就丢失数据,读写速度块
ROM (Read Only Memory) :掉电之后仍然可以保持数据 

实现程序

flash.h

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2023-12-07     Windows       the first version
 */
#ifndef APPLICATIONS_FLASH_H_
#define APPLICATIONS_FLASH_H_

#include "main.h"
#include "stm32f1xx_hal_flash.h"

#define TYPEPROGRAM_CHAR                 0x00U  /*!<Program a char (8-bit) at a specified address.*/

void Flash_Write(uint32_t TypeProgram, uint32_t Address, uint64_t (*Data), uint32_t len);
void Flash_Read(uint32_t TypeProgram, uint32_t Address, uint64_t (*Data), uint32_t len);

#define FLASH_DATA_ADDR     0x0800FC00
// 0x0800FC

flash.c

#include "flash.h"
extern void    FLASH_PageErase(uint32_t PageAddress);
extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);

void Flash_Write(uint32_t TypeProgram, uint32_t Address, uint64_t (*Data), uint32_t len)
{
    HAL_FLASH_Unlock();

    FLASH_PageErase(Address);  // 擦除这个扇区
    CLEAR_BIT(FLASH->CR, FLASH_CR_PER);     // 清除CR寄存器的PER位,此操作应该在FLASH_PageErase()中完成!
                                            // 但是HAL库里面并没有做,应该是HAL库bug!
    if (TypeProgram == TYPEPROGRAM_CHAR) {
        for (int var = 0; var < len / 2; var++) {
            uint8_t data1 = (uint8_t)*Data;
            uint8_t data2 = (uint8_t)*(Data + 1);
            uint64_t datar = data2 << 8 | data1;
            HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address,datar);
            Address += 2;
            Data += 2;
        }
    } else {
        for (int var = 0; var < len; var++) {
            HAL_FLASH_Program(TypeProgram, Address, *Data);
            Address += (1 << TypeProgram);
            Data += 1;
        }
    }
    HAL_FLASH_Lock();
}

void Flash_Read(uint32_t TypeProgram, uint32_t Address, uint64_t (*Data), uint32_t len)
{
    int32_t i = 0;
    if (TypeProgram == TYPEPROGRAM_CHAR) {
        for (i = 0; i < len; i++, Address += 1, Data++){
            *Data = *(uint8_t *) Address;
        }
    }else if (TypeProgram == TYPEPROGRAM_HALFWORD) {
        for (i = 0; i < len; i++, Address+=2, Data++){
            *Data = *(uint16_t *) Address;
        }
    }else if (TypeProgram == TYPEPROGRAM_WORD) {
        for (i = 0; i < len; i++, Address+=4, Data++){
            *Data = *(uint32_t *) Address;
        }
    }else if (TypeProgram == TYPEPROGRAM_DOUBLEWORD) {
        for (i = 0; i < len; i++, Address+=8, Data++){
            *Data = *(uint64_t *) Address;
        }
    }
}

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32F103是意法半导体推出的一款32位单片机,内置了一块FLASH存储器,用于程序和数据的读。下面将详细介绍STM32F103内部FLASH的读操作。 首先,内部FLASH是非易失性存储器,可以长时间保存数据,即使在断电后也不会丢失。该存储器分为多个扇区,每个扇区大小为2KB或16KB,总的容量取决于具体型号。 对于操作,首先需要擦除要入的扇区。擦除是一个扇区级别的操作,即需要擦除整个扇区,每个扇区都有一个固定的扇区号。在擦除之前,必须保证该扇区的所有数据已经备份,因为擦除操作会将该扇区的数据全部清除。 擦除完成后,可以对扇区进行编程操作。编程是以字为单位进行的,每个单元的大小是2个字节。对于编程操作,可以选择使用不同的编程函数,例如“HAL_FLASH_Program”函数。编程时需要注意,每个单元只能由0xFF入0x00,即从1到0的入是不被允许的。而且,编程操作之前需要先校验该单元是否已经被编程过。 读取操作则比较简单,可以使用HAL_FLASH_Read”函数读取指定地址的数据。为了确保读取的数据的正确性,通常会在读取之前对要读取的地址进行校验。 需要注意的是,对于内部FLASH的读操作,必须先进行相应的初始化,例如,配置FLASH的读许可、时钟使能等。 综上所述,STM32F103内部FLASH的读操作主要包括擦除、编程和读取。通过合理地使用这些操作,可以对内部FLASH进行有效的数据存储和读取。 ### 回答2: STM32F103是一种基于ARM Cortex-M3内核的32位微控制器,它具有内部Flash存储器,可以用于程序的存储和执行。下面我们将讨论STM32F103内部Flash的读操作。 STM32F103内部Flash分为多个扇区,每个扇区的大小为2KB或16KB,具体取决于芯片的型号。在进行Flash之前,我们需要注意以下几点: 1. Flash编程需要先解锁,然后进行擦除和编程操作。解锁可以通过设置特定的Flash解锁和编程保护位来实现。 2. 在进行Flash编程之前,应该关闭中断,以防止程序干扰Flash访问过程。 3. Flash之前,必须先进行擦除操作。擦除是以扇区为单位进行的,可以选择擦除单个扇区或多个相邻扇区。 4. Flash时,需要将数据按字大小入,特别是在入半字(16位)或字(32位)数据时,需要确保数据对齐。 5. 每次Flash之后,应该进行校验,以确保数据入正确。校验可以通过读取Flash中的数据并与原始数据进行比较来实现。 总结起来,STM32F103内部Flash的读操作需要解锁、擦除、编程和校验等步骤。在进行这些操作时,应该注意保护位设置、中断关闭、数据对齐和校验等问题。这样才能确保程序正确地读取和内部Flash,并且保证数据的完整性和一致性。 ### 回答3: STM32F103是STMicroelectronics(意法半导体)推出的一款基于ARM Cortex-M3内核的微控制器芯片。它内置了Flash存储器,可以用于程序代码和数据的存储。 首先,STM32F103系列芯片的内部Flash存储器容量可以根据不同型号而不同,通常为64KB、128KB、256KB或512KB。通过编程将代码和数据存储在Flash中,可以实现可靠的程序执行,而且Flash可以被擦除和编程多次,使得开发者能够灵活地进行程序的更新和修改。 对于STM32F103内部Flash的读取,开发者可以通过读取指定地址的方式来访问存储在Flash中的数据。可以使用如`*(uint32_t*)address`的语法,将Flash的指定地址强制类型转换为指向32位无符号整数的指针,并通过解引用指针访问Flash中的数据。需要注意的是,Flash存储器的读取速度相对较慢,因此在程序执行过程中可能会遇到一定的延迟。 至于内部Flash入,由于Flash存储器具有较高的可靠性要求,所以入操作需要特定的处理来确保数据的完整性。开发者需要在编程序时使用特定的编程算法和接口,例如ST提供的Flash等库函数,来进行数据入。此外,为了避免入操作对Flash的擦除,开发者还需要提前进行相关的Flash扇区擦除操作。 总的来说,STM32F103内部Flash存储器提供了方便可靠的程序代码和数据存储方式。通过正确的读取和入操作,可以实现对Flash存储器的数据访问和更新。但需要开发者额外注意Flash的读取速度和入算法的正确性,以确保程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值