我尝试使用HAL_FLASH_Program()
函数编写FLASH。准确地说,我已经编写了一个函数,预计会编写两个测量值
以设定的时间间隔(例如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();
}
答案 0 :(得分:0)
地址未正确对齐
Address
的声明未显示,但来自
Address = (uint32_t)mem;
我猜它是unsigned long
。之后,在第一次使用
Address
Address++;
并使用此值编程第二个值。但由于Address
可能是整数,而不是指针类型,它将增加1而不是字大小(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整除。