STM32 HAL库的基本flash操作

文章部分内容来源网络,有问题请留言,谢谢。

读操作

读flash,直接用指针操作即可,但注意这里stm32是32位系统,所以读一次是半个字,也就是2个字节,写也是一样的;

uint16_t FLASH_ReadHalfWord(uint32_t faddr)
{
	return *(__IO uint16_t*)faddr; 
}
//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToWrite:半字(16位)数
void Flash_ReadData(uint32_t ReadAddr,uint16_t *pBuffer,uint16_t NumToRead)   	
{
	uint16_t i;
	for(i=0;i<NumToRead;i++)
	{
		pBuffer[i]=FLASH_ReadHalfWord(ReadAddr);//读取2个字节.
		ReadAddr+=2;//偏移2个字节.	
	}
}

写操作

直接上代码,跟读一样,长度如果是字节数,一定要除以2;

void Flash_WriteData(uint32_t addr,uint16_t *data,uint16_t Size)
{
    //1、解锁FLASH
    HAL_FLASH_Unlock();

    //2、擦除FLASH
    //初始化FLASH_EraseInitTypeDef
    FLASH_EraseInitTypeDef f;
    f.TypeErase = FLASH_TYPEERASE_PAGES;
    f.PageAddress = addr;
    f.NbPages = 1;
    //设置PageError
    uint32_t PageError = 0;
    //调用擦除函数
    HAL_FLASHEx_Erase(&f, &PageError);

    //3、对FLASH烧写
    uint16_t TempBuf = 0;
    for(uint16_t i = 0;i< Size ;i++)
    {
        TempBuf = *(data+i);
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD , addr + i * 2, TempBuf);
    }

    //4、锁住FLASH
    HAL_FLASH_Lock();
}

测试

//实际应用中我们一般会使用一个结构体来保存参数,注意,数据长度要为偶数,所以我加了个NC在最后面
typedef struct 
{
    uint8_t test1
    uint8_t test2
    uint16_t test3;
    uint8_t test4;
    uint8_t NC;
}Tag_Para;

Tag_Para para;
#define PARA_ADDR 0x0800 0E00
void main()
{
	//写flash
	Flash_WriteData(PARA_ADDR, (uint16_t *)&para, (sizeof(Tag_Para))/2);
	//读flash
	Flash_ReadData(PARA_ADDR, (uint16_t *)&para, (sizeof(Tag_Para))/2);
}
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用STM32Cube HAL库编写的Flash编程示例。该示例演示了如何在STM32F4系列MCU上使用HAL库编程来擦除和编程Flash存储器。 ```c #include "stm32f4xx_hal.h" /* Private variables ---------------------------------------------------------*/ FLASH_EraseInitTypeDef EraseInitStruct; uint32_t SectorError = 0; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); void Error_Handler(void); int main(void) { /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Enable Flash access */ __HAL_FLASH_UNLOCK(); /* Erase the user Flash area (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) */ /* Fill EraseInit structure*/ EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; EraseInitStruct.Sector = FLASH_SECTOR_5; EraseInitStruct.NbSectors = 4; if (HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK) { /* Error occurred while sector erase. User can add here some code to deal with this error. SectorError will contain the faulty sector and then to know the code error on this sector, user can call function 'HAL_FLASH_GetError()' */ Error_Handler(); } /* Program the user Flash area word by word (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/ uint32_t flash_address = FLASH_USER_START_ADDR; uint32_t data[3] = {0x12345678, 0x87654321, 0xDEADBEEF}; for (int i=0; i<3; i++) { if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, flash_address, data[i]) != HAL_OK) { /* Error occurred while writing. User can add here some code to deal with this error. */ Error_Handler(); } flash_address += 4; } /* Lock the Flash to disable the flash control register access (recommended to protect the FLASH memory against possible unwanted operation) *********/ __HAL_FLASH_LOCK(); /* Infinite loop */ while (1) { } } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; 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_HSI; 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_0) != HAL_OK) { Error_Handler(); } } /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* User can add his own implementation to report the HAL error return state */ while(1) { } } ``` 此示例程序假定您已经定义了以下宏: ```c #define FLASH_USER_START_ADDR ADDR_FLASH_SECTOR_5 /* Start @ of user Flash area */ #define FLASH_USER_END_ADDR ADDR_FLASH_SECTOR_9 /* End @ of user Flash area */ ``` 此外,您还需要在链接器脚本(例如,在使用Keil MDK时的“scatter file”)中定义以下符号: ```c FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K ``` 这样可以确保程序不会覆盖Flash中的任何其他部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值