STM32 HAL_FLASH_Program无法按预期工作

时间:2018-01-30 01:27:00

标签: stm32

我尝试使用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();

}

1 个答案:

答案 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整除。