这玩意坑死人不偿命。 开始没注意到这个,后来才发现这奇葩现象, 具体现象就是EXTI中断会在2.8US内连续触发两次,解决办法是在中断函数里延时若干个US。 将之复现到STM32L-DISCOVER上给各位验证:
打开DISCOVER温度测量例程,修改如下:
将
int main(void)
{
/* Configure Clocks for Application need */
RCC_Configuration();
/* Configure RTC Clocks */
RTC_Configuration();
/* Set internal voltage regulator to 1.8V */
PWR_VoltageScalingConfig(PWR_VoltageScaling_Range1);
/* Wait Until the Voltage Regulator is ready */
while (PWR_GetFlagStatus(PWR_FLAG_VOS) != RESET) ;
/* Enable debug features in low power modes (Sleep, STOP and STANDBY) */
#ifdef DEBUG_SWD_PIN
DBGMCU_Config(DBGMCU_SLEEP | DBGMCU_STOP | DBGMCU_STANDBY, ENABLE);
#endif
修改为
int main(void)
{
RCC_Configuration();//原样
RTC_Configuration();//原样
PWR_VoltageScalingConfig(PWR_VoltageScaling_Range1);//原样
while (PWR_GetFlagStatus(PWR_FLAG_VOS) != RESET) ;//原样
Init_GPIOs(); //LED KEY KEY=EXTI0 LED_BULE=PB6 LED_GREEN=PB7
AHBENR = 0XFFFFFFFF;//打开GPIO
configureWakeup ();//开唤醒中断 唤醒中断=EXTI20
RTC_WakeUpCmd(ENABLE); //使能
PWR_ClearFlag(PWR_FLAG_WU); //清除标志
while(1)
; //卡死这里坐等中断
将中断函数修改
void EXTI0_IRQHandler(void)
{
GPIO_TOGGLE(GPIOB,LD_GREEN_GPIO_PIN);//闪灯
setUserButtonFlag();
EXTI_ClearITPendingBit(EXTI_Line0);
}
void RTC_WKUP_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
{
GPIO_TOGGLE(GPIOB,LD_BLUE_GPIO_PIN);//闪灯
RTC_ClearITPendingBit(RTC_IT_WUT);
EXTI_ClearITPendingBit(EXTI_Line20);
}
}
下载直接运行,示波器两支表笔接到PB6,PB7,依次设置PB6和PB7上升沿触发,触发电平2V, 等待闹钟中断或者按动按键中断,见证坑爹奇迹的时刻到了,LED并没有一闪一闪亮晶晶,反倒是示波器捕捉到了一个个的接近3US的高脉冲看的眼睛冒星星。
|