0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32C011开发(3)----Flash操作

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2025-09-18 16:48 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

概述

STM32C011 系列微控制器内置 Flash 存储器,支持程序存储与数据保存,具备页面擦除、双字写入、读写保护等功能。本文将简要介绍 STM32C011 的 Flash 结构与特性,并通过实际代码示例,讲解 Flash 的擦除、写入与读取等基本操作。

最近在弄ST的教程,需要样片的可以加群申请:615061293/925643491 。

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。 主控为STM32C011F4P6

视频教学

https://www.bilibili.com/video/BV1KTBtY4EpD

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

源码下载

https://download.csdn.net/download/qq_24312945/90228577

参考程序

https://github.com/CoreMaker-lab/STM32C011_TSSOP20

https://gitee.com/CoreMaker/STM32C011_TSSOP20

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32C011F4P6。 配置时钟树,配置时钟为48M。

串口配置

查看原理图,PA0和PA1设置为开发板的串口。

配置串口,速率为115200。

堆栈设置

若无法正常运行需要修改优化等级。

串口重定向

打开魔术棒,勾选MicroLIB

在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}
/* USER CODE END PFP */

FLASH

STM32C011 的嵌入式 Flash 通过 AHB 总线与 Cortex-M0+ CPU 连接,支持访问、擦除和编程操作。
Flash 构成:
● 存储单元:Flash 单元为 64 位宽,用于存储代码及数据。
● 主存储器结构:
○ 共 16 页,每页大小为 2 KB,总计 32 KB。
● 信息块区域:
○ 包括选项字节(2 KB)、工程字节(1 KB)、OTP(1 KB)及系统存储器(6 KB)。

要向 FLASH 写入数据,需要依次完成以下四个步骤:

  1. 解锁 FLASH
  2. 擦除 FLASH
  3. 写入 FLASH
    锁定 FLASH 需要注意,FLASH 的擦除只能按页或整块进行。 STM32C011F4P6 的 FLASH 容量为 16 KB,共分为 8 页,每页大小为 2 KB。 我们可以将数据写入第 7 页,其地址范围为 0x08003800 - 0x08003FFF。 单次写入的单位为 64 位(8 字节)。

数据初始化

● WriteFlashData:
○ 这是一个待写入的 64 位数据数组,包含 3 个双字(64 位)数据。
○ 每个元素的大小是 8 字节,总计 24 字节的数据。
addr 和 Page:
○ addr 是目标地址,表示从 Flash 的第 7 页(Page 7)开始写入。
○ STM32 的 Flash 以 2 KB 为一页,因此第 7 页的起始地址是 0x08003800。

/* USER CODE BEGIN 0 */
uint64_t WriteFlashData[3] = {0x1111222233334444,0x5555666677778888,0x9999AAAABBBBCCCC};//数据

uint32_t addr = 0x08003800;//page 7
uint32_t        Page = 7;

void PrintFlashTest(uint32_t L,uint32_t Page);
void WriteFlashTest(uint32_t L,uint64_t Data[],uint32_t Page,uint32_t addr);

/* USER CODE END 0 */

FLASH 读写

/* USER CODE BEGIN 4 */
/* FLASH 写入程序 */
void WriteFlashTest(uint32_t L, uint64_t Data[], uint32_t Page, uint32_t addr)
{
    uint32_t i = 0;
    uint32_t PageError = 0;

    // 1/4 解锁 FLASH
    if (HAL_FLASH_Unlock() != HAL_OK)
    {
        printf("Error: Failed to unlock FLASH.n");
        return;
    }

    // 2/4 初始化擦除结构体并擦除指定页
    FLASH_EraseInitTypeDef FlashSet;
    FlashSet.TypeErase = FLASH_TYPEERASE_PAGES; // 擦除类型:页擦除
    FlashSet.Page = Page;                       // 页索引
    FlashSet.NbPages = 1;                       // 一次擦除 1 页

    if (HAL_FLASHEx_Erase(&FlashSet, &PageError) != HAL_OK)
    {
        printf("Error: Failed to erase FLASH. PageError: %dn", PageError);
        HAL_FLASH_Lock();
        return;
    }
    printf("FLASH Page %u erased successfully.n", Page);

    // 3/4 将数据写入指定地址
    for (i = 0; i < L; i++)
    {
        if (HAL_FLASH_Program(TYPEPROGRAM_DOUBLEWORD, addr + 8 * i, Data[i]) != HAL_OK)
        {
            printf("Error: FLASH program failed at address 0x%08X.n", addr + 8 * i);
            HAL_FLASH_Lock();
            return;
        }
    }
    printf("FLASH programming completed successfully.n");

    // 4/4 锁住 FLASH
    HAL_FLASH_Lock();
}


/* FLASH 读取并打印程序 */
void PrintFlashTest(uint32_t L, uint32_t addr)
{
    uint32_t i = 0;
    uint64_t data = 0;

    printf("Reading FLASH data from address 0x%08X:n", addr);

    for (i = 0; i < L; i++)
    {
        data = *(__IO uint64_t *)(addr + i * 8); // 按 64 位读取数据
                printf("Address: 0x%08X, Data: 0x%016llXn", addr + i * 8, data);

    }

    printf("FLASH read completed.n");
}
/* USER CODE END 4 */

测试 FLASH 写入和读取功能,分为两次写入操作,并在每次写入后进行验证。 ● 两次写入操作,分别测试不同数据的写入和读取。 ● 验证写入是否正确,通过读取打印结果进行比对。

/* USER CODE BEGIN 2 */
    printf("=== First Write and Read ===n");
    WriteFlashTest(3,WriteFlashData,Page,addr);
    PrintFlashTest(3,addr);//WriteFlashData[3] = {0x1111222233334444,0x5555666677778888,0x9999AAAABBBBCCCC};//数据
    printf("n=== Modify Data and Rewrite ===n");
    WriteFlashData[0]=0x9999;
    WriteFlashData[1]=0x8888;
    WriteFlashData[2]=0x7777;
    WriteFlashTest(3,WriteFlashData,Page,addr);
    PrintFlashTest(3,addr);
  /* USER CODE END 2 */

演示

测试结果如下所示。

第一次写入。

第二次写入。

STM32CubeProgrammer读取。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • stm32cubemx
    +关注

    关注

    5

    文章

    287

    浏览量

    17151
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32C011的芯片不能被IAR识别到,为什么?

    目前我在使用IAR8.5做开发,但是发现STM32C011的芯片不能被IAR识别到,显示的没有这颗芯片,目前除了升级IAR版本来兼容这颗芯片外还有别的方法吗?
    发表于 05-24 07:03

    采用cubemx将stm32c011的NRST引脚配置成ADC口,输入一拉低就复位怎么解决?

    采用cubemx将stm32c011的NRST引脚配置成ADC口,生成程序,输入为高时候可以正常采样,但是输入一拉低就复位,配置有什么需要注意的吗?
    发表于 03-07 08:06

    stm32 HAL库Flash该如何去操作

    stm32f1xx_hal_flash.cstm32f1xx_hal_flash_ex.c代码实例目录stm32的hal库确实提供有关flash操作代码库,,但是我们在
    发表于 08-19 06:26

    STM32 Flash操作介绍

    记录一下,方便以后翻阅~主要内容:1)STM32 Flash操作介绍;2)寄存器和库函数介绍;3)相关实验代码解读。参考资料:《STM32F
    发表于 08-20 07:23

    使用stm32f030c8t6进行flash操作报错这是为什么

    47.1 引言本次开发中遇到一个问题,就是使用stm32f030c8t6的时候,要进行写flash操作,调用FLASH_ProgramHal
    发表于 01-17 07:34

    使用STM32C0轻松实现从8bit到32bit的平台升级

    内容包含:STM32C011 / C031 结构框图、DMA、CRC较CheckSum更能提高系统数据的可靠性等内容。
    发表于 09-05 07:30

    STM32学习心得三十三:FLASH闪存编程原理与实验

    记录一下,方便以后翻阅~主要内容:1) STM32 Flash操作介绍;2) 寄存器和库函数介绍;3) 相关实验代码解读。参考资料:《STM3
    发表于 11-26 17:51 27次下载
    <b class='flag-5'>STM32</b>学习心得三十三:<b class='flag-5'>FLASH</b>闪存编程原理与实验

    STM32单片机-操作访问内部Flash

    目录:1、STM32 FLASH操作流程2、Flash基本知识点3、OK,上干货,上代
    发表于 11-26 18:21 7次下载
    <b class='flag-5'>STM32</b>单片机-<b class='flag-5'>操作</b>访问内部<b class='flag-5'>Flash</b>

    STM32F103:内部Flash的读写

    64-128KB(STM32F10X_MD)3、大容量产品:Flash大小为256KB以上(STM32F10X_HD)2. ST库函数ST库中对Fl
    发表于 12-01 20:51 16次下载
    <b class='flag-5'>STM32</b>F103:内部<b class='flag-5'>Flash</b>的读写

    STM32F1 使用easyflash操作片内flash

    STM32F1 使用easyflash操作片内flash
    发表于 12-09 10:06 15次下载
    <b class='flag-5'>STM32</b>F1 使用easyflash<b class='flag-5'>操作</b>片内<b class='flag-5'>flash</b>

    韦东山嵌入式Linux学习——015 Nand Flash(1)-Nand Flash操作原理

    Nand Flash操作原理/* *硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3) *软件平台:运行于VMware Workstation 12 P
    发表于 12-16 16:53 6次下载
    韦东山嵌入式Linux学习——015 Nand <b class='flag-5'>Flash</b>(1)-Nand <b class='flag-5'>Flash</b><b class='flag-5'>操作</b>原理

    DS11100_STM32L011x3, STM32L011x4单片机数据手册

    DS11100_STM32L011x3, STM32L011x4单片机数据手册
    发表于 11-23 08:40 3次下载
    DS11100_<b class='flag-5'>STM32L011x3</b>, <b class='flag-5'>STM32L011</b>x4单片机数据手册

    MHMF011L1C3-操作手册 - PANATERM Ver6.0 松下

    电子发烧友网为你提供Panasonic(Panasonic)MHMF011L1C3-操作手册 - PANATERM Ver6.0相关产品参数、数据手册,更有MHMF011L1C3-操作
    发表于 06-11 19:25
    MHMF<b class='flag-5'>011L1C3</b>-<b class='flag-5'>操作</b>手册 - PANATERM Ver6.0 松下

    STM32C011开发(1)----开发板测试

    STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能,基于 ARM Cortex-M0 内核,具有高效能和低功耗的特点
    的头像 发表于 12-16 17:14 2699次阅读
    <b class='flag-5'>STM32C011</b><b class='flag-5'>开发</b>(1)----<b class='flag-5'>开发</b>板测试

    STM32C011开发(2)----nBOOT_SEL设置

    程序接口(UART、USB DFU、I2C、SPI和CAN)读取、写入及验证器件内存。 STM32CubeProgrammer的功能广泛,可以对STM32内部存储器(如Flash、R
    的头像 发表于 12-16 17:27 3515次阅读
    <b class='flag-5'>STM32C011</b><b class='flag-5'>开发</b>(2)----nBOOT_SEL设置