📄 flash_write.c
字号:
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "flash_write.h"
/* Includes ------------------------------------------------------------------*/
char Flash_Write(char *flash_address,char *write_data,u16 write_len)
{
char *flash_address_bk = flash_address;
char *write_data_bk = write_data;
u16 write_len_bk = write_len;
u16 i;
u32 page_shift;
union
{
u32 b_word[PageSize/4];
char b_byte[PageSize];
}page_buffer;
FLASH_Status FLASHStatus = FLASH_COMPLETE;
RCC_HSICmd(ENABLE);
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
do
{
page_shift = (u32)flash_address%PageSize;
for(i=0;i<PageSize/4;i++)
page_buffer.b_word[i]=*((u32 *)(flash_address - page_shift) + i);
for(i=0;i<PageSize-page_shift;i++)
{
if(!write_len)
break;
page_buffer.b_byte[page_shift + i]=*write_data++;
write_len--;
}
FLASHStatus = FLASH_ErasePage((u32)flash_address);
while(FLASHStatus != FLASH_COMPLETE);
for(i=0;i<PageSize/4;i++)
{
FLASHStatus = FLASH_ProgramWord((u32)((u32 *)(flash_address - page_shift) + i), page_buffer.b_word[i]);
while(FLASHStatus != FLASH_COMPLETE);
}
flash_address += PageSize - page_shift;
}while(write_len);
RCC_HSICmd(DISABLE);
FLASH_Lock();
for(i=0;i<write_len_bk;i++)
if(*(flash_address_bk+i) != *(write_data_bk+i))
return ERROR;
return SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -