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

使用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扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版