stm32hal库flash读写一个字节例程
时间: 2023-07-01 18:09:46 浏览: 228
STM32L151HAL库例程.rar
以下是基于STM32 HAL库的Flash读写一个字节的例程:
```c
#include "stm32f4xx_hal.h"
#define FLASH_USER_START_ADDR ADDR_FLASH_SECTOR_5 //Flash起始地址
#define FLASH_USER_END_ADDR ADDR_FLASH_SECTOR_5 + FLASH_SECTOR_SIZE -1 //Flash结束地址
#define FLASH_PAGE_SIZE ((uint32_t)0x400) //Flash页大小
#define FLASH_TIMEOUT ((uint32_t)0xFFFF) //Flash操作超时时间
/* Flash读一个字节 */
uint8_t Flash_ReadByte(uint32_t addr)
{
return (*(__IO uint8_t*)addr);
}
/* Flash写一个字节 */
HAL_StatusTypeDef Flash_WriteByte(uint32_t addr, uint8_t data)
{
HAL_StatusTypeDef status = HAL_OK;
/* 使能Flash写入 */
status = HAL_FLASH_Unlock();
if(status != HAL_OK)
{
return status;
}
/* 擦除要写入的页 */
uint32_t page_error = 0;
FLASH_Erase_Sector(FLASH_SECTOR_5, FLASH_VOLTAGE_RANGE_3);
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, addr, data);
if(status != HAL_OK)
{
return status;
}
/* 禁止Flash写入 */
status = HAL_FLASH_Lock();
return status;
}
int main(void)
{
HAL_Init();
__HAL_RCC_FLASH_CLK_ENABLE();
uint8_t data = 0xAA;
uint8_t read_data = 0;
/* 写入数据 */
Flash_WriteByte(FLASH_USER_START_ADDR, data);
/* 读取数据 */
read_data = Flash_ReadByte(FLASH_USER_START_ADDR);
while(1)
{
/* 业务逻辑处理 */
}
return 0;
}
```
需要注意的是,Flash的写入需要先擦除对应的Flash页,因此在写入之前需要调用`FLASH_Erase_Sector()`函数擦除要写入的Flash页。同时,在写入之前需要先调用`HAL_FLASH_Unlock()`函数使能Flash写入,在写入完成后需要调用`HAL_FLASH_Lock()`函数禁止Flash写入。
阅读全文