|
以前一直使用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,不知道现在有多少人在用,什么地方可以交流? |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版
IAP检测stack每次都过不了。加了你的那一句OK了,直接跳过去了,谢谢!!~~