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控制了。本次分享结束,希望对大家有用。
本文暂时没有评论,来添加一个吧(●'◡'●)