stm32H库的内部FLASH读写操作与结构体数组数据写入与读取

您所在的位置:网站首页 结构体存储数据 stm32H库的内部FLASH读写操作与结构体数组数据写入与读取

stm32H库的内部FLASH读写操作与结构体数组数据写入与读取

2024-07-10 23:56| 来源: 网络整理| 查看: 265

stm32H库的内部FLASH读写操作与结构体数组数据写入与读取 1.软硬件准备2.关于STM32的Flash的一些说明3.实验结果

参考博主-STM32系列(HAL库)——内部FLASH读写实验

1.软硬件准备

软件:CubeMX、SSCOM(串口调试助手)

硬件:SMT32F103C8T6

2.关于STM32的Flash的一些说明

(1)STM32根据闪存(Flash)容量的大小,将Flash分为每页1K字节 或 每页2K字节。超过256K容量的每页为2K字节。对于本次使用的SMT32F103C8T6,其容量为64K,则内部分为每页1K字节

(2)SMT32的Flash起始地址为0X0800 0000 。本次使用的STM32F103C8T6的FLASH范围是0X08000000-0X0800FFFF。示意图如下 在这里插入图片描述

(3)STM32运行代码从地址0X0800 0000开始,所以我们使用的Flash空间开始地址应该往后偏移,不然就会将程序部分覆盖掉。

(4)Flash的写操作,需要擦除一整页后再重新写入,不能对特定处进行修改,写的时候可以分多次写入

(5)擦写次数较多数据的不建议使用内部Flash进行存储,手册中给的数据是擦写1W次

3.STM32配置及主要代码 CubeMX简单配置一个串口1即可,usart.c添加打印函数,即

#include "stdio.h" /********************************************************* * *重定义 fputc 函数 * *********************************************************/ int fputc(int ch,FILE *f) { HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY ); return ch; }

main.c 创建一个结构体FuyuState,结构体下的变量随便赋值后经过FLASH写入后,读出出该地址的值赋值给另外一个数值datatemp,再通过打印输出查看是否正确

/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * © Copyright (c) 2022 STMicroelectronics. * All rights reserved. * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "usart.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "stmflash.h" #include "stdio.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ const u8 TEXT_Buffer_1[]={"STM32 FLASH TEST_1"};//要写入到STM32 FLASH的字符串数组 const u8 TEXT_Buffer_2[]={"STM32 FLASH TEST_2"};//要写入到STM32 FLASH的字符串数组 #define SIZE sizeof(TEXT_Buffer_1) //数组长度 /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ typedef __packed struct { u16 Set_Temperature; //设置温度 = 保持温度 u16 SetTime; //设置时间 u16 CurrentTemp[3]; //当前温度 u16 ProtectTemp[3]; //保护温度 u16 Speed; u32 RemainTime; u16 Current; u16 PWM_Time; u8 ActiveState; } FuyuState,*pFuyuState; FuyuState g_FuyuState= {0}; /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ u16 datatemp[20]; //Flash读取缓存数组 u16 *p=datatemp; //数组指针 /* USER CODE END 1 */ u8 i; /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ printf("串口打印正常!\r\n"); //结构体变量赋值 g_FuyuState.Set_Temperature = 50; //设置温度 = 保持温度 g_FuyuState.SetTime = 2 ; g_FuyuState.CurrentTemp[0] = 3 ; g_FuyuState.CurrentTemp[1] = 4 ; g_FuyuState.CurrentTemp[2] = 5 ; g_FuyuState.ProtectTemp[0] = 6 ; g_FuyuState.ProtectTemp[1] = 7 ; g_FuyuState.ProtectTemp[2] = 8 ; g_FuyuState.Speed = 5; g_FuyuState.RemainTime = 6; g_FuyuState.Current = 7; g_FuyuState.PWM_Time = 8; g_FuyuState.ActiveState = 9; STMFLASH_Write(FLASH_SAVE_ADDR,(uint16_t*)&g_FuyuState,sizeof(g_FuyuState));//第一次写 HAL_Delay(50); STMFLASH_Read(FLASH_SAVE_ADDR,(uint16_t*)datatemp,sizeof(g_FuyuState)); for(i=0;iAR, PageAddress); SET_BIT(FLASH->CR, FLASH_CR_STRT); #if defined(FLASH_BANK2_END) } #endif /* FLASH_BANK2_END */ } 3.实验结果

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3