一、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;

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

被折叠的 条评论
为什么被折叠?



