FLash
- 在嵌入式系统中,Flash 通常指的是微控制器中的闪存,它是一种非易失性存储器,用于存储程序代码(.bin和.hex)和一些常驻数据(静态数据),即便在掉电后数据也不会丢失。
- Flash的操作通常通过HAL_FLASH系列函数进行,包括编程、擦除以及保护等功能。
- Flash存储器可以用来实现Bootloader(引导加载程序),用于在系统启动时进行初步的硬件初始化,并可以选择性地更新应用程序代码。
- Bootloader可以通过串口、USB或其他接口接收新的固件,并将其写入Flash中,实现远程升级。
- 常用的一些函数
向指定FLash地址写入数据
HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
参数:FLASH_TypeProgram:指定编程类型(字节、半字或双字)。uint32_t Address:要编程的起始地址。uint32_t Data:要写入的数据。功能:擦除指定的Flash扇区或全部扇区。
HAL_FLASH_Erase()
参数:FLASH_EraseInitTypeDef *pFlashEraseInit:指向包含擦除初始化参数的结构体指针。uint32_t *PagesError:指向一个数组,用于返回擦除失败的页号。功能:解锁Flash访问。
HAL_FLASH_Unlock()功能:锁定Flash访问。
HAL_FLASH_Lock()-----------自己编写的FLash的接口函数-------------------
#include "stm32f1xx_hal.h"
#include "flash-ops.h"
int flash_ops_write(int addr, int *data, int len)
{int i; int ret; HAL_StatusTypeDef status; if ((len % 4) != 0) { int mode = len % 4; len -= mode; len += 4; }HAL_FLASH_Unlock(); FLASH_EraseInitTypeDef f; f.TypeErase = FLASH_TYPEERASE_PAGES; f.PageAddress = addr; f.NbPages = 1; uint32_t PageError = 0; status = HAL_FLASHEx_Erase(&f, &PageError); if (status != HAL_OK) { ret = -12; goto end; }for (i = 0; i < len / 4; i += 1) { HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + i * 4, data[i]); }ret = 0; end: HAL_FLASH_Lock(); return ret;
}int flash_ops_read(int addr, void *data, int len)
{int i; volatile char *ptaddr = (__IO char *)addr; char *ptdata = (char *)data; for (i = 0; i < len; i++) { ptdata[i] = ptaddr[i]; }return 0;
}
-------------------.h文件-------------------
#ifndef __flash_ops_HH_H
#define __flash_ops_HH_H
#define PAGE0_RBT6_ADDR 0x0801F000
#define PAGE1_RBT6_ADDR 0x0801F400
#define PAGE2_RBT6_ADDR 0x0801F800
#define PAGE3_RBT6_ADDR 0x0801FC00
#define PAGET_ADDR 0x08007000
#define PAGE0_RCT6_ADDR 0x0803D000
#define PAGE1_RCT6_ADDR 0x0803D800
#define PAGE2_RCT6_ADDR 0x0803E000
#define PAGE3_RCT6_ADDR 0x0803E800
#define PAGE4_RCT6_ADDR 0x0803F000
#define PAGE5_RCT6_ADDR 0x0803F800
int flash_ops_write(int addr, int *data, int len);
int flash_ops_read(int addr, void *data, int len);#endif
#include "main.h"
#include "flash-ops.h"
struct usrinfo{char wifiname[32]; char wifipasswd[16]; char usrname[16]; char usrpasswd[8]; long flags;
};ADC_HandleTypeDef hadc1;
RTC_HandleTypeDef hrtc;
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_RTC_Init(void);
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); return ch;
}
int main(void)
{HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC1_Init(); MX_USART1_UART_Init(); MX_RTC_Init(); struct usrinfo info;info.flags = 10086; strcpy(info.wifiname, "haiyangxing"); strcpy(info.wifipasswd, "12345678"); strcpy(info.usrname, "xiaowang"); strcpy(info.usrpasswd, "123456"); flash_ops_write(PAGE4_RCT6_ADDR, &info, sizeof(info)); memset(&info, 0, sizeof(info)); flash_ops_read(PAGE4_RCT6_ADDR, &info, sizeof(info)); while (1){printf("wifi=%s pass=%s username=%s usrpasswd=%s flags=%d\r\n",info.wifiname, info.wifipasswd, info.usrname, info.usrpasswd, info.flags);HAL_Delay(1000); }
}