请用stm32 hal 编写一个flash读写代码
时间: 2024-01-14 10:04:54 浏览: 25
好的,以下是一个简单的基于STM32 HAL的Flash读写代码示例:
```c
#include "stm32f1xx_hal_flash.h"
#define FLASH_USER_START_ADDR ADDR_FLASH_PAGE_127 /* Flash用户区起始地址 */
#define FLASH_USER_END_ADDR ADDR_FLASH_PAGE_127 + FLASH_PAGE_SIZE /* Flash用户区结束地址 */
HAL_StatusTypeDef flash_write(uint32_t addr, uint32_t data)
{
FLASH_EraseInitTypeDef eraseInitStruct;
uint32_t PageError = 0;
HAL_StatusTypeDef status = HAL_OK;
HAL_FLASH_Unlock();
/* 擦除扇区 */
eraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
eraseInitStruct.PageAddress = FLASH_USER_START_ADDR;
eraseInitStruct.NbPages = 1;
if (HAL_FLASHEx_Erase(&eraseInitStruct, &PageError) != HAL_OK)
{
status = HAL_ERROR;
goto end;
}
/* 写入数据 */
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, data) != HAL_OK)
{
status = HAL_ERROR;
}
end:
HAL_FLASH_Lock();
return status;
}
uint32_t flash_read(uint32_t addr)
{
return (*(__IO uint32_t*)addr);
}
```
使用示例:
```c
uint32_t data = 0x12345678;
flash_write(FLASH_USER_START_ADDR, data);
uint32_t read_data = flash_read(FLASH_USER_START_ADDR);
```
需要注意的是,STM32的Flash操作除了读取以外,都需要先解锁Flash,操作完成后再锁定Flash。另外,Flash写入操作需要先擦除所在扇区,因此需要指定擦除的扇区地址和大小。在本例中,我们只擦除了一个扇区。