stm32L431 使用hal库 读写内部flash详细步骤和完整代码案例
时间: 2023-12-27 11:04:15 浏览: 414
以下是使用HAL库在STM32L431微控制器上读写内部Flash的详细步骤和完整代码案例:
步骤1:打开STM32CubeMX并选择STM32L431微控制器。然后在“Pinout & Configuration”选项卡中配置Flash的引脚和时钟。
步骤2:在“Project Manager”选项卡中选择“Generate Code”按钮以生成代码。
步骤3:在生成的代码中打开“main.c”文件。
步骤4:在“main.c”文件中添加以下代码以初始化Flash:
```c
HAL_FLASH_Unlock();
FLASH_Erase_Sector(FLASH_SECTOR_2, VOLTAGE_RANGE_3);
HAL_FLASH_Lock();
```
这将解锁Flash并擦除扇区2。
步骤5:使用以下代码向Flash中写入数据:
```c
uint32_t Address = 0x08008000;
uint32_t Data = 0x12345678;
HAL_FLASH_Unlock();
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, Data) == HAL_OK)
{
// Data has been successfully written to Flash
}
HAL_FLASH_Lock();
```
这将在Flash的地址0x08008000处写入数据0x12345678。
步骤6:使用以下代码从Flash中读取数据:
```c
uint32_t Address = 0x08008000;
uint32_t Data;
Data = *(uint32_t*)Address;
```
这将从Flash的地址0x08008000处读取数据并将其存储在变量Data中。
完整代码示例:
```c
#include "main.h"
#include "stm32l4xx_hal.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
uint32_t Address = 0x08008000;
uint32_t Data = 0x12345678;
HAL_FLASH_Unlock();
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, Data) == HAL_OK)
{
// Data has been successfully written to Flash
}
HAL_FLASH_Lock();
uint32_t ReadData = *(uint32_t*)Address;
while (1)
{
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSICalibrationValue = 0;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
}
```
请注意,此示例代码仅写入和读取了一个32位数据。您可以根据自己的需求修改代码以读写更多数据。此外,还应该添加错误处理程序以在出现错误时通知用户。
阅读全文