STM32中Flash的操作
FLASH写入
void writeFlashTest(void)
{
/* 1/4解锁FLASH*/
HAL_FLASH_Unlock();
/* 2/4擦除FLASH*/
/*初始化FLASH_EraseInitTypeDef*/
/*擦除方式页擦除FLASH_TYPEERASE_PAGES,块擦除FLASH_TYPEERASE_MASSERASE*/
/*擦除页数*/
/*擦除地址*/
FLASH_EraseInitTypeDef FlashSet;
FlashSet.TypeErase = FLASH_TYPEERASE_PAGES;
FlashSet.PageAddress = addr;
FlashSet.NbPages = 1;
/*设置PageError,调用擦除函数*/
uint32_t PageError = 0;
HAL_FLASHEx_Erase(&FlashSet, &PageError);
/* 3/4对FLASH烧写*/
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, WriteFlashData);
/* 4/4锁住FLASH*/
HAL_FLASH_Lock();
}
擦除方式
按照不同容量产品,有按块和页擦除
取大于或等于x的最小整数
uint32_t bufLength = ceil(strlen(buf)/4.0);
编程擦除
因为103c6是小容量的,只有page,也就是页,没有sectors,就是扇区,所以勾选的擦除sectors就把唯一一个扇区,就是包含所有32页1kB的pages都擦除
写入flash
stm32 复位后,会自动对flash进行上锁,需要在擦除前进行unlock,才能进行擦除和写入
flash只能将1写为0,不能反过来,只能通过擦除将0变成1,所以在同一个地址重复写需要进行擦除
将连续的字节变成变量
uint8_t buf[32];
uint32_t data = *(uint32_t *)&buf;
强制转换指针类型后再取值
uint32_t data;
uint8_t buf[32];
memcpy(&data,buf,4);
使用memcpy内存拷贝函数