程序员开发实例大全宝库

网站首页 > 编程文章 正文

STM32F103系列—Backup Register小陷阱

zazugpt 2024-08-22 04:41:44 编程文章 13 ℃ 0 评论

STM32F103系列单片机有一部分寄存器可以作为Backup寄存器,只要VBAT上有电,该寄存器的值不会随着芯片VDD消失而Reset或者软件复位该寄存器值不会Reset。这一块寄存器被应用RTC(实时时钟)或者存储一些用户信息。

在我之前的文章中,STM32F103系列(HAL)—Bootloader实现2(Backup Register应用),将Backup Register应用于Firmware从Bootloadable跳转到BootLoader,软件复位之前将Backup Register的相应位置1,这样,Firwmare就可以停在BootLoader,不会自动跳转至Bootloadable,进而,我们可以在芯片维持Bootloader的状态下,对其进行操作,如Firmware的升级。

我在实际使用过程中,发现了一个奇怪的现象:STM32F103的引脚PC13作为GPIO输出的时候,一直没有反应。(即:通过软件控制该GPIO输出High,可是一直是低)。

尝试过各种手段,如,重新开GPIO的CLK,将GPIO的Speed设置为Low,等等,都没有效果,开始怀疑是不是该引脚没有焊好,将一个新的Firmware,只对PC13进行控制,发现该引脚就可以控制。因此锁定了肯定是我之前的Firmware在开外设的时候对该GPIO有影响,转而在STM32的资料中开始找问题的根源。

在Backup Register的描述中,有下面一段话,逐步让我意识到问题可能出在了这儿。

BackUp Register和RTC的应用中,PC13这个引脚是可以复用,在RTC中,PC13是可以输出Clock的分频时钟的,用于校准RTC的(因为温度,Clock工艺的影响,RTC是有误差的)。另外,PC13还可以作为侵入检测的引脚,主要是为了预防拆机,然后导致芯片信息泄露。但检测到侵入事件(相当于一个中断),BackUp Resister是可以被清除的,即使VDD没有电,只要VBAT有电,该操作也是有效的。

然后回过头来查看自己的代码:

static void MX_RTC_Init(void)
{
  /** Initialize RTC Only
  */
  hrtc.Instance = RTC;
  hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
  hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN RTC_Init 2 */
  /* USER CODE END RTC_Init 2 */
}

上面的代码是默认产生的,我当时没有在这儿多想,就应用的默认的设置,先回过头来看,是有问题,将PC13复用了其他用途。

相关的寄存器如下:

上面的几个寄存器就是配置PC13复用的寄存器,需要将其设置为普通的GPIO用途即可,修改之后的代码如下:

static void MX_RTC_Init(void)
{
  /** Initialize RTC Only
  */
  hrtc.Instance = RTC;
  hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
  hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;//设置ASOS,ASOE以及CCO
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN RTC_Init 2 */
  CLEAR_BIT(BKP->CR, BKP_CR_TPE); //确保TPE的BIT置0
  /* USER CODE END RTC_Init 2 */
}

经测试,PC13可以用作普通的GPIO控制了。本次分享结束,希望对大家有用。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表