你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用STM32cubeMX中遇到的一点问题,与大家分享

[复制链接]
dsjsjf 发布时间:2015-1-8 13:54
以前一直使用STM32F1系列的MCU做产品,去年参加了ST无锡研讨会,了解到STM32cubeMX,回来后就下载了,发现功能还是比较强大。正好一款产品需要改版,所以就选择了STM32F030,正好也偿试一下STM32cubeMX的强大功能。
打开软件,选择MCU,配置IO,配置外设,配置时钟,配置功能,一气呵成。不得不说,图形化的界面真的很直观,每个IO的复用功能,每个外设的时钟频率,等等一目了然。最后,可以直接生成IAR工程文件(当然也可以生成其他工程文件),再也不要为建工程而烦恼了。。。
接着,打开IAR,打开刚刚生成的工程文件,开始写应用程序(此过程省略)。
由于有标定值需要储存,没几个字节,就打算存在内部FLASH中,因为之前也是这样做的。等到调试的时候,发现每次读出的值都是0xff,很明显是没有写进FLASH,于是就开始找原因
void WriteRevise(void)
{
  HAL_FLASH_Unlock();
  FLASH_PageErase(0x8003c00);
  HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, 0x8003c00, RealFlow);
  HAL_FLASH_Lock();
}

void GetRevise(void)
{
  RealFlow = *(__IO uint32_t*)(0x8003c00);

  if(RealFlow == 0xffff)// > 8000 || RealFlow < 500)
  {
    RealFlow = 2060;
    WriteRevise();
  }
}

读写函数都很简单,看不出问题。
于是重写测试程序,单步跟踪,先来 读-加1-写-再读 操作,发现结果正确,接着,再来 读-加1-写-再读-擦除-再读 操作,发现结果也正确;这时候我有郁闷了,读,写,擦除操作都没问题,为什么程序里有不行呢?
没找到根本原因,就在原写函数中,每一步操作后加了一个读操作,也就是,解锁-读-擦除-读-写-读……发现写完之后再读就是0xff了,中间各种测试,延时、去掉擦除操作等等,最终,单独的写操作或者是擦除操作都是没有问题的,连起来就是不行。
在无技可施的时候,就去看看库函数里的实现方法,在看到擦除函数的时候发现:
/**
  * @brief  Erase the specified FLASH memory page
  * @param  PageAddress: FLASH page to erase
  *         The value of this parameter depend on device used within the same series      
  *
  * @retval None
  */
void FLASH_PageErase(uint32_t PageAddress)
{
  /* Clear pending flags (if any) */  
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR);

  /* Proceed to erase the page */
  SET_BIT(FLASH->CR, FLASH_CR_PER);
  WRITE_REG(FLASH->AR, PageAddress);
  SET_BIT(FLASH->CR, FLASH_CR_STRT);
}

该函数中,只是置位了FLASH_CR_PER,然后写地址,开始擦除,而完成之后并没有清除该位。问题就出现在这儿,只要调用了擦除函数后,该位就一直为高,所以导致数据无法写入,而不调用擦除函数时,写正常。于是对该函数修改,如下:
void FLASH_PageErase(uint32_t PageAddress)
{
  /* Clear pending flags (if any) */  
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR);

  /* Proceed to erase the page */
  SET_BIT(FLASH->CR, FLASH_CR_PER);
  WRITE_REG(FLASH->AR, PageAddress);
  SET_BIT(FLASH->CR, FLASH_CR_STRT);

  FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
  CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
}

增加等待操作完成,清除FLASH_CR_PER,至此,读写FLASH正常。


========================================================================================
以上是我在第一次使用STM32cubeMX中遇到的一点问题,应该是ST在设计过程中出现的BUG,我也看了之前的F1库函数,在擦除后是需要清的。
希望ST的工作人员看到之后能对此优化,也希望各位工程师能避免此问题。

STM32cubeMX也刚出来不久,使用确实比较方便,但也难免有些BUG,不知道现在有多少人在用,什么地方可以交流?

收藏 5 评论7 发布时间:2015-1-8 13:54

举报

7个回答
dsjsjf 回答时间:2015-1-8 14:05:23
好像发错地方了
阏男秀 回答时间:2016-10-14 16:14:40
很好!正式我想需要的!
zhangdaijin 回答时间:2016-10-14 17:12:45
谢谢分享
阏男秀 回答时间:2016-10-14 17:39:02
我移植你的代码到我的STM32F0,读写不成功啊!
benlarden 回答时间:2016-11-23 10:12:20
非常感谢,昨天搞了大半天,每次写入时,读出就为0xff,刚开始还以为是加密了,后来看OB都没有问题,
IAP检测stack每次都过不了。加了你的那一句OK了,直接跳过去了,谢谢!!~~
yiban-406032 回答时间:2016-12-30 11:09:55
好东西
damiaa 回答时间:2017-1-2 11:39:52
谢谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版