STM32F103 用内部FLASH 存数据保存
时间: 2024-10-08 19:21:08 浏览: 30
STM32F103系列微控制器通常采用内置Flash作为非易失性的存储区域,用于长期保存程序代码和部分用户数据。以下是使用STM32F103内部Flash存数据的基本步骤:
1. **配置 Flash 管理器**:首先,需要通过寄存器设置,如 Flash 配置寄存器(FLASH_ACR)、程序存储器启动地址寄存器(FLASH_PSR),以及 Flash 控制寄存器(FLASH_CR)等,来初始化Flash操作模式、设置擦除块大小等。
2. **数据写入**:通过访问Flash的数据线(Data Line),可以将内存中的数据字节逐个写入Flash。STM32提供了专门的API函数如`HAL_FLASH_Program()`,开发者需要先申请一片Flash区域,然后按照指定的地址写入数据。
3. **擦除操作**:在写入新数据之前,通常需要先擦除原来的Flash块。可以使用`HAL_FLASH_Erase()`函数执行此操作,它接受要擦除的区域地址作为参数。
4. **等待周期**:由于Flash有写入延迟,所以在数据写入后,可能需要执行若干个等待周期(Write Wait Time,Wt)直到操作完成才能读取该地址的数据。
5. **验证数据**:为了确保数据已经成功写入并保存,可以在程序运行期间检查所写数据是否正确。
6. **电源管理**:如果设备进入休眠状态或掉电,记得使用适当的中断和服务来保存数据到外部存储器或者断电保护功能来保护内部Flash中的关键数据。
相关问题
STM32F103 内部FLASH 保存数据的代码
STM32F103单片机内部Flash主要用于长期存储程序代码和配置数据。在C语言中,我们可以使用HAL库提供的函数来操作Flash。下面是一个简单的示例,展示如何向Flash写入数据:
```c
#include "stm32f1xx_hal.h"
void WriteToFlash(uint8_t *data, uint32_t address, uint16_t length) {
HAL_FLASH_Unlock(); // 解锁Flash,因为写操作需要
for (uint16_t i = 0; i < length; i++) {
HAL_FLASH_Program(FLASH_TYPEPROGRAM, address + i, data[i]); // 写入每个字节
}
HAL_FLASH_Lock(); // 写完后锁定Flash,防止意外修改
// 检查写入是否成功
if (HAL_FLASH_GetError() == HAL_FLASH_ERROR_NONE) {
printf("Data written to Flash at %08X successfully.\n", address);
} else {
printf("Failed to write to Flash with error %d.\n", HAL_FLASH_GetError());
}
}
```
在这个例子中,`data`是要写入Flash的数据指针,`address`是Flash的起始地址,`length`是数据的长度。
注意,这只是一个基本的写入过程,实际应用中可能还需要处理错误处理、分块写入等细节,并且解锁和上锁的操作应该谨慎,避免在不必要的时候影响其他部分的代码执行。
STM32F103 内部FLASH 读写数据的代码
STM32F103单片机内部Flash存储器通常用于长期保存程序和配置数据。以下是使用Keil MDK(一种常见的STM32开发工具集)以及HAL库编写的基本示例代码,它展示了如何通过GPIO控制Flash的读取操作:
```c
#include "stm32f1xx_hal.h"
// 假设GPIOA的PA8和PA9用于Flash地址线
__IO uint32_t *flash_address = (uint32_t *)0x08000000; // Flash的起始地址
void WriteFlash(uint32_t addr, const uint8_t* data, uint32_t size) {
HAL_StatusTypeDef status;
// 开启Flash等待状态
__HAL_FLASH_SET_LATENCY(FLASH_LATENCY_4);
// 配置GPIOs作为地址线
GPIO_InitTypeDef gpio_init_struct;
gpio_init_struct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
gpio_init_struct.Mode = GPIO_MODE_AF_PP;
gpio_init_struct.Pull = GPIO_NOPULL;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
gpio_init_struct.Alternate = GPIO_AF6_FLASH;
HAL_GPIO_Init(GPIOA, &gpio_init_struct);
// 设置地址
for (int i = 0; i < 16; i++) {
flash_address[i] = addr >> (i * 8);
}
// 打开Flash
__HAL_FLASH_ENABLE();
// 写入Flash
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BANK1, addr, (uint32_t*)data, size);
if (status != HAL_OK) {
while (1); // 挂起,处理错误
}
// 关闭Flash并释放GPIO资源
__HAL_FLASH_DISABLE();
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_8 | GPIO_PIN_9);
}
// 示例:向Flash地址0x08000000开始处写入16字节的数据
const uint8_t test_data[] = {0x01, 0x02, ...};
WriteFlash(0x08000000, test_data, sizeof(test_data));
```
阅读全文