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

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

[复制链接]
dsjsjf 发布时间:2015-1-8 14:04
以前一直使用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,不知道现在有多少人在用,什么地方可以交流?
收藏 1 评论28 发布时间:2015-1-8 14:04

举报

28个回答
abend 回答时间:2015-1-8 14:45:57
HAL库函数目前的质量确实是相当坑爹,希望后续意法半导体能够安排更多人力资源加以改进。哎,楼主这么认真的帖子没有人回,淹没在一堆炒冷饭、造轮子的水贴中...
dsjsjf 回答时间:2015-1-8 16:22:24
abend 发表于 2015-1-8 14:45
HAL库函数目前的质量确实是相当坑爹,希望后续意法半导体能够安排更多人力资源加以改进。哎,楼主这么认真 ...

估计使用Cube的人还不多吧,还是我写得太明白了,没人参与讨论,,唉,伤心,都没人回
abend 回答时间:2015-1-8 16:28:32
dsjsjf 发表于 2015-1-8 16:22
估计使用Cube的人还不多吧,还是我写得太明白了,没人参与讨论,,唉,伤心,都没人回 ...

cubeMX确实好,特别是配IO脚、外设、时钟、中断,生成的项目模板也好用。
dsjsjf 回答时间:2015-1-8 21:16:20
abend 发表于 2015-1-8 16:28
cubeMX确实好,特别是配IO脚、外设、时钟、中断,生成的项目模板也好用。

你也在项目中使用吗?
serge 回答时间:2015-1-8 21:37:27
谢谢楼主分享,,,,很好的经验,值得借鉴
zhous 回答时间:2015-1-8 21:57:35
不错不错,搞得我也想试试了
54840977 回答时间:2015-1-8 22:08:09
不错,正准备用STM32L系列的,不知道有没有这些问题,到时候还要来请教啊。。。
dsjsjf 回答时间:2015-1-8 22:28:16
zhous 发表于 2015-1-8 21:57
不错不错,搞得我也想试试了

试试,到时可以一起交流学习啊
dsjsjf 回答时间:2015-1-8 22:28:43
54840977 发表于 2015-1-8 22:08
不错,正准备用STM32L系列的,不知道有没有这些问题,到时候还要来请教啊。。。 ...

没问题,大家一起交流交流
123下一页

所属标签

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 手机版