我正在尝试使用HAL_FLASH_Program()函数编写闪存程序。确切地说,我已经编写了一个函数,它期望在一个固定的时间间隔(例如,3秒)写两个测量值来闪光。但是,当调用时,该函数只能编写第一个函数,而忽略第二个函数。HAL_FLASH_Program不能用两次吗?我做错了什么?我只想提一下,我对STM32编程完全陌生,所以任何有帮助的建议都会很感激。以下是代码:
void writeFlash(void){
mem = returnPointerToFirstEmptyAddressInSector();
Address = (uint32_t)mem;
var1.f = Temperature;
var2.f = SD;
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR | FLASH_FLAG_PGPERR);
HAL_FLASH_Program(TYPEPROGRAM_WORD, Address, var1.i );
Address++;
HAL_FLASH_Program(TYPEPROGRAM_WORD, Address, var2.i);
HAL_FLASH_Lock();
}发布于 2018-02-02 09:28:54
地址没有正确对齐
没有显示Address的声明,而是从行中显示
Address = (uint32_t)mem;我猜是unsigned long。稍后,您将在第一次使用
Address++;并使用此值对第二个值进行编程。但是,由于Address可能是一个整数,而不是指针类型,所以将增加一个而不是单词大小(4),并且指向一个地址,该地址与以前写的值部分重叠,并且不对齐字大小的写入。第二个写操作将不可避免地失败。正如@JMA在注释中所建议的,请检查HAL_FLASH_Program()的返回值和错误代码
uint32_t ret = HAL_FLASH_Program(TYPEPROGRAM_WORD, Address, var2.i);
switch(ret) {
case HAL_OK:
break;
case HAL_TIMEOUT:
printf("HAL_FLASH_Program() timeout!\n");
break;
case HAL_ERROR:
printf("HAL_FLASH_Program() error 0x%08x, see *hal_flash.h for bit definitions\n", HAL_FLASH_GetError());
break;
default:
printf("HAL_FLASH_Program() returned unknown status %lu\n", ret);
}一次写一个双字
HAL库支持一次写入64位值,因此您可以在一次操作中编写两个32位整数。
HAL_FLASH_Program(TYPEPROGRAM_DOUBLEWORD, Address, ((uint64_t)var2.i << 32) | var1.i);只需确保Address与双字边界对齐,即可被8整除。
https://stackoverflow.com/questions/48512534
复制相似问题