STM32F0 使用 RTC Tamper 的几个注意事
问题:
该问题由某客户提出,发生在
STM32F072
器件上。据其软件工程师讲述:使用
STM32F0
系列的标准
设库中
RTC_Tamper 的例程来进行修改,例程中配置的是当在 RTC_TAMP1 引脚检测到上升沿的时候,复 位备份寄存器并产生中
断;客户根据其实际应用将配置中的上升沿改成下降沿,以期待在检测到下 沿的时候,复位备份寄存器并产生中断。结果,
客户发现经常是只要一开始跑程序,会产生中断,复 位备份寄存器。使用示波器观察 RTC_TAMP1 引脚,并没有发现下降
沿波形。客户百思不得其解。
调研:
问题(一)
首先,我们检测一下 STM32F0xx 标准外设库中 RTC_Tamper 例程的 Readme.txt,我们发现其中描述 此程序的功能为将
Tamper 引脚配置成下降沿并使能中断,当给 RTC_AF1(RTC_TAMPER1/PC13) 加低电平时,RTC 备份数据寄存器将被
复位,并产生 Tamper 中断。不过我们再看一下例程,发现在 例程中配置其实是上升沿的中断,也就是说,此 Readme.txt
与程序不符。所以,我们先不管 Readme.txt 所描述的内容。
我们来看一下客户的程序,发现客户只是在例程中修改了两个配置的语句。修改如下:
(1) 例程:
/* Enable The external line19 interrupt */
EXTI_ClearITPendingBit(EXTI_Line19);
EXTI_InitStructure.EXTI_Line = EXTI_Line19;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger =
EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
客户程序修改为:
/* Enable The external line19 interrupt */
EXTI_ClearITPendingBit(EXTI_Line19);
EXTI_InitStructure.EXTI_Line = EXTI_Line19;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
(2)
例程:
/* Configure the Tamper 1 Trigger */
RTC_TamperTriggerConfig(RTC_Tamper_1, RTC_TamperTrigger_RisingEdge);
客户程序修改为:
/* Configure the Tamper 1 Trigger */
RTC_TamperTriggerConfig(RTC_Tamper_1, RTC_TamperTrigger_FallingEdge)
我们使用 STM320518_EVAL(使用芯片为 STM32F051R8T6)来跑客户的程序,发现确实如客户所
说的现象,只要一运
行程序,经常会进入中断并复位备份数据寄存器。
我们来看一下客户所修改的两个部分:第 2 个部分修改是将 RTC_Tamper_1 的触发设置为下降沿触 发,这个肯定没有问题,
那么我们主要来看一下第 1 个部分是否需要修改。
我们查看参考手册
RM0091
“12 Interrupts and events”
一章,在
“12.2 Extended interrupts and
events controller (EXTI)”
这里看到这么一句话:
“The active edge of each external interrupt line can
be chosen independently, whilst for internal
interrupt the active edge is always the rising one.”
“12.2.4 Functional description”
中也有一句
“For the internal interrupt
lines, the active edge is
always the rising edge”
。它们的意思就是说内部中断的有效边沿永远是上升沿!我们再来看
EXTI
的框图
从框图也可以看到,内部事件确实是要
EXTI
设置为上升沿中断的。
EXTI
线
19
是连接到
RTC
Tamper
TimeStamp
件的,为内部事件
由此,我们知道客户修改的两部分代码中,第一部分关于 EXTI 的边沿是无需修改的,应该保持为上升 沿的配置,所以需
要改回来:EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
再测试,发现问题已经解决,不会再一运行程序就经常进入中断。