HAL库之读写STM32F103内部的FLASH空间

在此声明——本文摘自这里:
【码神岛】STM32F0x HAL库学习笔记(5)片内FLASH的读写操作

本文开发环境

  1. MCU型号:STM32F103C8T6
  2. IDE环境: MDK 5.25
  3. 代码生成工具:STM32CubeMx 5.0.1
  4. HAL库版本:v1.9.0

本文内容

  1. MCU片内Flash(闪存)的擦除与读写
  2. 一个Flash读写例子

在这里插入图片描述

/*main.c中的代码*/
void FLASH_EEPROM_Write(uint32_t n);
uint32_t FLASH_EEPROM_Read(void);


int main(void)
{     
    uint32_t Read;
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();                      //USART1串口的波特率为115200
    KEY_Init();
    
    printf("**************888888******************\r\n");//表示串口没有问题
    Read=FLASH_EEPROM_Read();
    printf("Read:%d\r\n",Read);//每次上电读取FLASH中的内容
    
    while (1)
    {     

        FLASH_EEPROM_Write(4000);
    }
}
/**
  * @brief  在FLASH中存储变量值,目前并不清楚这个程序有多大,能写到多少页,先定义在第127页中
  * @param  用STM32中FLASH存储空间模拟EEPROM的读写
  * @retval 参数:写入要存储的值
  */
void FLASH_EEPROM_Write(uint32_t n)
{
    HAL_FLASH_Unlock();     //解锁
    uint32_t PageError = 0;
    if (HAL_FLASHEx_Erase(&EraseInitStruct,&PageError) == HAL_OK) //如果结构体中的起始地址0x0801FC00,这一页的数据擦除成功,返回OK
    {
        printf("擦除 成功\r\n");
    }
    uint32_t writeFlashData = n;        //代写入的值
    uint32_t addr = 0x0801FC00;                  //写入的地址
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,addr, writeFlashData); //向FLASH中写入
    printf("at address:0x%x, read value:%d\r\n", addr, *(__IO uint32_t*)addr);
    HAL_FLASH_Lock();
    while(1);
}
/**
  * @brief  读出存储地址中的内容
  * @param  用STM32中FLASH存储空间模拟EEPROM的读写
  * @retval 返回值:从FLASH中读出数据
  */
uint32_t FLASH_EEPROM_Read(void)
{
    HAL_FLASH_Unlock();
    uint32_t Page = 0;
    uint32_t addr = 0x0801FC00;                  //写入的地址
    Page=*(__IO uint32_t*)addr;
    return Page;
}

最后在调试助手上查看结果:
在这里插入图片描述
结束

### 回答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的读取速度和写入算法的正确性,以确保程序的稳定性和可靠性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值