stm32 读写flash
时间: 2023-08-24 10:06:11 浏览: 43
STM32可以通过内部FLASH存储器进行数据的读写。下面是一个简单的代码示例,展示了如何使用HAL库读写FLASH:
```c
#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_flash.h"
#define FLASH_USER_START_ADDR ADDR_FLASH_PAGE_62 /* Start @ of user Flash area */
#define FLASH_USER_END_ADDR ADDR_FLASH_PAGE_63 + FLASH_PAGE_SIZE - 1 /* End @ of user Flash area */
uint32_t GetPage(uint32_t Addr);
int main(void)
{
HAL_Init();
/* Unlock the Flash to enable the flash control register access *************/
HAL_FLASH_Unlock();
/* Erase the user Flash area
(area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/
/* Get the 1st page to erase */
uint32_t FirstPage = GetPage(FLASH_USER_START_ADDR);
/* Get the number of pages to erase from 1st page */
uint32_t NbOfPages = GetPage(FLASH_USER_END_ADDR) - FirstPage + 1;
/* Fill EraseInit structure*/
FLASH_EraseInitTypeDef EraseInitStruct;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = FirstPage;
EraseInitStruct.NbPages = NbOfPages;
uint32_t PageError = 0;
HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
/* Program the user Flash area word by word
(area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/
uint32_t Address = FLASH_USER_START_ADDR;
uint32_t Data = 0x12345678;
while (Address < FLASH_USER_END_ADDR)
{
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, Data) == HAL_OK)
{
Address = Address + 4;
}
else
{
/* Error occurred while writing data in Flash memory */
break;
}
}
/* Lock the Flash to disable the flash control register access (recommended
to protect the FLASH memory against possible unwanted operation) *********/
HAL_FLASH_Lock();
while (1)
{
}
}
uint32_t GetPage(uint32_t Addr)
{
uint32_t page = 0;
if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))
{
/* Bank 1 */
page = (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;
}
else
{
/* Bank 2 */
page = (Addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
}
return page;
}
```
在上面的代码示例中,我们首先解锁Flash并擦除要写入的Flash页面。然后,我们使用HAL库的`HAL_FLASH_Program()`函数逐个字编程Flash。最后,我们锁定Flash以保护它免受未经授权的操作。