STM32
直播中

发生的方式

9年用户 1325经验值
擅长:处理器/DSP
私信 关注
[问答]

STM32L431反向初始化TIM导致FLASH->SR寄存器的PGSERR位置1了,擦除失败怎么解决?

项目要求使用STM32L431内部FLASH存储一些调电保存参数,调试发现第一次将参数写入内部FLASH没有问题,当时当我再次写入时,报错,写入不成功,我调试发现在我写入之前FLASH->SR寄存器中的PGSERR位置1了,导致我擦除失败,我进一步调试发现,在我再次写之前这个标志位就已经置1了。     于是我单步调试发现这个标志置位发生在我调用“__HAL_tiM_DISABLE()”函数时(此函数位于HAL_TIM_Base_DeInit()中)自动置位的,我看手册也没找到产生这个问题的原因,是芯片BUG还是程序BUG?
/** 测试代码 :希望有条件的跑跑看 */
int main(void)
{
  /** 使能电源接口时钟 */
  __HAL_RCC_PWR_CLK_ENABLE();  
  /** Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /** 时钟初始化 */
  SystemClock_Config();
/** 下面这个函数会导致PGSERR置位 */
  HAL_TIM_Base_DeInit( TimHandle);
  HAL_Delay(1000);
  DEBUG("Run!!!n");
  for(;;)
  {
  }





回帖(1)

杨秀英

2024-4-9 17:58:33
首先,我们需要了解一下STM32L431的FLASH操作特性。

在STM32L431中,对FLASH进行擦除操作时,需要先将FLASH解锁,然后进行擦除操作,最后再锁定FLASH。如果在这个过程中发生了错误,那么可能会导致FLASH的某些标志位被置位,从而影响擦除操作的正常进行。

在你的情况下,当调用`__HAL_TIM_DISABLE()`函数时,发现FLASH->SR寄存器中的PGSERR位置1,导致擦除失败,可能是因为在调用该函数之前,你没有正确解锁FLASH,或者解锁FLASH之后没有将其锁定回去。

你可以尝试按照以下步骤进行操作:

1. 在进行FLASH操作之前,首先执行以下代码解锁FLASH:

   ```
   HAL_FLASH_Unlock();
   ```

2. 在进行FLASH操作之后,执行以下代码锁定FLASH:

   ```
   HAL_FLASH_Lock();
   ```

这样做的目的是为了确保在进行FLASH操作时,FLASH处于正确的状态。如果在操作FLASH之前没有解锁,或者操作FLASH之后没有锁定,可能会导致FLASH的某些标志位被错误地置位,影响后续的操作。

如果以上步骤没有解决问题,可能还需要进一步分析代码逻辑,查看是否存在其他地方可能导致FLASH操作异常的问题。另外,还需要确保使用的库函数和芯片手册中的FLASH操作相关函数的参数正确设置。

如果问题仍然存在,你可以尝试联系STM32L431的技术支持团队,寻求进一步的帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分