首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32 HAL_FLASH_Program没有按预期工作

STM32 HAL_FLASH_Program没有按预期工作
EN

Stack Overflow用户
提问于 2018-01-30 01:27:00
回答 1查看 7.3K关注 0票数 2

我正在尝试使用HAL_FLASH_Program()函数编写闪存程序。确切地说,我已经编写了一个函数,它期望在一个固定的时间间隔(例如,3秒)写两个测量值来闪光。但是,当调用时,该函数只能编写第一个函数,而忽略第二个函数。HAL_FLASH_Program不能用两次吗?我做错了什么?我只想提一下,我对STM32编程完全陌生,所以任何有帮助的建议都会很感激。以下是代码:

代码语言:javascript
复制
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();

}
EN

回答 1

Stack Overflow用户

发布于 2018-02-02 09:28:54

地址没有正确对齐

没有显示Address的声明,而是从行中显示

代码语言:javascript
复制
Address = (uint32_t)mem;

我猜是unsigned long。稍后,您将在第一次使用

代码语言:javascript
复制
Address++;

并使用此值对第二个值进行编程。但是,由于Address可能是一个整数,而不是指针类型,所以将增加一个而不是单词大小(4),并且指向一个地址,该地址与以前写的值部分重叠,并且不对齐字大小的写入。第二个写操作将不可避免地失败。正如@JMA在注释中所建议的,请检查HAL_FLASH_Program()的返回值和错误代码

代码语言:javascript
复制
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位整数。

代码语言:javascript
复制
HAL_FLASH_Program(TYPEPROGRAM_DOUBLEWORD, Address, ((uint64_t)var2.i << 32) | var1.i);

只需确保Address与双字边界对齐,即可被8整除。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48512534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档