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);
}
}