stm32g070 Flash HAL读写操作

本文详细介绍了STM32G070微控制器的内部Flash使用,包括内存布局、分区设计、驱动方法(64位/双32位写入)、擦除策略以及读写操作,展示了如何在G0系列中正确处理Flash操作以确保数据安全和兼容性。

一、stm32g070 Flash

由于没有外挂Flash,内存又比较小,所以在此使用内置Flash作为缓存,
stmG070CBT6整体flash位128K,为flash规划分区,分区表如下。

在这里插入图片描述

从STM32G070寄存器手册可以看到,内部flash是2K对齐总共有64个页,同时写操作flash时要注意地址为4字节对齐。
我这里把flash,分成几个区域,如下图
在这里插入图片描述

二、驱动方法

1、G0系列的驱动需要注意Flash需要进行64位或快速双32位写入,不支持单字节写入,这是和F103系列最大区别。读写时候是一样的!
这里是 stmflash.h。flash的头文件

/**
 ****************************************************************************************************
 * @file        stmflash.h
 * @author      935848559@qq.com
 * @version     V1.0
 * @date        2024-03-12
 * @brief       STM32G0内部FLASH读写 驱动代码
 * @license     Copyright (c) 
 ****************************************************************************************************
 * @attention
 *
 *
 ****************************************************************************************************
 */

#ifndef __STMFLASH_H
#define __STMFLASH_H


#include "main.h"


#define UPDATE_FLAG     0x123456        //升级标志
#define UPDATE_OVER     0xffffff       //升级完成标志

#define CONFIG_ADDR     0X8004800       //升级标志位存储分区
#define APP1_ADDR       0x8005000       //APP1 跳转地址
#define OTA_ADDR        0x8012800       //OTA  升级地址
#define ERASE_LEN       54              //擦除长度,单位kb



typedef enum
{
   
   
    FLASH_OK =0x00U,
    FLASH_ERROR,    
}FLASH_SATAE_T;


FLASH_SATAE_T Write_Flash(uint32_t address, uint8_t *buf, uint32_t length);
FLASH_SATAE_T Write_Config(uint64_t data);



#endif

stmflash.c文件

/**
 ****************************************************************************************************
 * @file        stmflash.c
 * @author      935848559@qq.com
 * @version     V1.0
 * @date        2024-03-12
 * @brief       STM32G0内部FLASH读写 驱动代码
 * @license     Copyright (c) 
 ****************************************************************************************************
 * @attention
 *
 *
 ****************************************************************************************************
 */


#include "./BSP/STMFLASH/stmflash.h"

uint32_t addr = OTA_ADDR;   //最新的Flash地址


/**
 * @brief       获取 地址Addr 在 Flash中式第几页。根据每页大小2k 
 * @param       Addr    开头地址
 * @retval      FLASH页数
 */
static uint32_t GetPage(uint32_t Addr)
{
   
   
    uint32_t page = 0;
    page = (Addr-FLASH_BASE) / FLASH_PAGE_SIZE;
    return page;
}

/**
 * @brief       擦除指定位置和大小的Flash,擦除flash之前必须解锁flash。
 * @param       addr    开头地址
 * @param       num    内存大小/kb
 * @retval      FLASH_SATAE_T state
 */
static FLASH_SATAE_T Erase_Flash(uint32_t addr,uint8_t num) 
{
   
   
    uint32_t SectorError=0;
    FLASH_EraseInitTypeDef UPDATE_FLASH;
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值