• STM32CUBEMX(10)--内部Flash读写


    概述

    本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是STM32F103RBT6,128K大小的Flash。
    最近在弄ST和GD的课程,需要GD样片的可以加群申请:6_15061293 。

    视频教学

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

    STM32CUBEIDE(16)----内部Flash读写

    csdn课程

    课程更加详细。
    https://download.csdn.net/course/detail/35611

    硬件准备

    使用STM32CUBEMX生成例程,这里使用NUCLEO-F103RB开发板

    在这里插入图片描述
    查看原理图,PA2和PA3设置为开发板的串口。
    在这里插入图片描述
    配置串口。

    在这里插入图片描述
    查看原理图,PA8设置为PWM输出管脚,PA0设置为定时器输入捕获管脚。
    在这里插入图片描述

    配置时钟树

    配置时钟为64M。
    在这里插入图片描述

    串口重定向

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

    /* USER CODE BEGIN Includes */
    #include "stdio.h"
    /* USER CODE END Includes */
    
    • 1
    • 2
    • 3

    函数声明和串口重定向:

    /* USER CODE BEGIN PFP */
    /* retarget the C library printf function to the USART */
    int fputc(int ch, FILE *f)
    {
    	HAL_UART_Transmit(&huart2 , (uint8_t *)&ch, 1, 0xFFFF);
        return ch;
    }
    /* USER CODE END PFP */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    FLASH定义

    对于STM32F103,有低、钟、高密度的FLASH类型。
    在这里插入图片描述

    低密度

    在这里插入图片描述

    中密度

    在这里插入图片描述

    高密度

    在这里插入图片描述
    对于STM32F103RB,FLASH大小为128KB,固为中密度的Flash。

    变量定义

    /* USER CODE BEGIN 0 */
    uint32_t WriteFlashData[3] = {0x11111111,0x22222222,0x33333333};//数据
    uint32_t addr = 0x0801FC00;
    /* USER CODE END 0 */
    
    • 1
    • 2
    • 3
    • 4

    如果要对FLASH进行写入数据,需要执行以下四步:

    1. 解锁FLASH
    2. 擦除FLASH
    3. 写入FLASH
    4. 锁住FLASH

    擦除只能是按页或者整块擦除。
    STM32F103RBT6的Flash容量是128KB,所以只有128页,每页1KB。
    我们可以写入到页127中,即0x0801FC00-0x0801FFFF中。
    由于单片机是32位,故连续写入多个uint32_t的数据时,地址应该依次增加4。

    /* USER CODE BEGIN 4 */
    
    /*FLASH写入程序*/
    void WriteFlashTest(uint32_t L,uint32_t Data[],uint32_t addr)
    {
    	uint32_t i=0;
    	/* 1/4解锁FLASH*/
    	HAL_FLASH_Unlock();
    	/* 2/4擦除FLASH*/
    	/*初始化FLASH_EraseInitTypeDef*/
    	/*擦除方式页擦除FLASH_TYPEERASE_PAGES,块擦除FLASH_TYPEERASE_MASSERASE*/
    	/*擦除页数*/
    	/*擦除地址*/
    	FLASH_EraseInitTypeDef FlashSet;
    	FlashSet.TypeErase = FLASH_TYPEERASE_PAGES;
    	FlashSet.PageAddress = addr;
    	FlashSet.NbPages = 1;
    	/*设置PageError,调用擦除函数*/
    	uint32_t PageError = 0;
    	HAL_FLASHEx_Erase(&FlashSet, &PageError);
    	/* 3/4对FLASH烧写*/
    	for(i=0;i<L;i++)
    	{
    		HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr+4*i, Data[i]);
    	}
    	/* 4/4锁住FLASH*/
    	HAL_FLASH_Lock();
    }
    
    
    /*FLASH读取打印程序*/
    void PrintFlashTest(uint32_t L,uint32_t addr)
    {
    	uint32_t i=0;
    	for(i=0;i<L;i++)
    	{
    		printf("\naddr is:0x%x, data is:0x%x", addr+i*4,  *(__IO uint32_t*)(addr+i*4));
    	}
    	
    }
    /* USER CODE END 4 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    主程序

      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */		
    		WriteFlashTest(3,WriteFlashData,addr);
    		PrintFlashTest(3,addr);
    		HAL_Delay(5000);
      }
      /* USER CODE END 3 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    演示效果

    在这里插入图片描述
    通过STM32CUBEIDE查看地址也可以看到,值正确写入。

    在这里插入图片描述

    最后

    以上的代码会在Q群里分享。QQ群:615061293。
    或者关注微信公众号『记贴』,持续更新文章和学习资料,可加作者的微信交流学习!
    在这里插入图片描述

  • 相关阅读:
    Linux离线安装插件
    高级前端进阶(五)
    远程代码执行渗透测试——B模块测试
    linux线程互斥锁
    葡萄糖-聚乙二醇-刀豆球蛋白A,ConcanavalinA-PEG-Glucose
    【推导】线性变换与在基下的矩阵一一对应
    【Leetcode】 416. 分割等和子集
    springcloudgateway Actuator API
    SpringCloudAlibaba:1.体系概述
    git stash/git fetch/git rebase/git cherry pick/git reset
  • 原文地址:https://blog.csdn.net/qq_24312945/article/details/127504619