完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
LZ用的是F103C8T6,先将PA0挂在EXti0线上,然后通过按下PA0进入停机模式,停机模式唤醒的条件是任意EXTI线,所以如果我再按一下PA0就会唤醒,但实际操作中并不可以。不知道是理解错了还是程序的问题,求大佬们指点。。 |
|
相关推荐
28个回答
|
|
楼主用的是什么模式?stadbay还是STOP?
|
|
|
|
|
|
|
|
STANDBY只能通过wakeup、RTC唤醒。
|
|
|
|
楼主应该先测试一下在 正常模式下EXTI0能否响应中断。
|
|
|
|
好的 我改成stop模式试一下,,话说我上边理解的那些没问题吧。。 |
|
|
|
STOP模式是exit可以唤醒的。
|
|
|
|
|
|
|
|
我在中断里写的printf输出,在串口上看到的可以进入中断 |
|
|
|
|
|
|
|
换成407试了一下还是不行,下面是进入停机的函数
void Sys_Enter_Standby(void) { while(WK_UP==0); //等待WK_UP按键松开(在有RTC中断时,必须等WK_UP松开再进入待机) printf("停机"); delay_ms(50); RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟 PWR_BackupAccessCmd(ENABLE);//后备区域访问使能 RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。 RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。 EXTI_ClearITPendingBit(EXTI_Line0); EXTI_ClearITPendingBit(EXTI_Line13); // PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志 // // PWR_WakeUpPinCmd(ENABLE);//设置WKUP用于唤醒 // PWR_EnterSTANDBYMode(); //进入待机模式 PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI); SystemInit(); } |
|
|
|
resetIO时钟以后,重新设置IO时钟,并且配置外部中断。我没有看到IO口状态的配置和外部中断的配置。
|
|
|
|
按键的配置: void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //KEY0 KEY1 KEY2对应引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //KEY0 KEY1 KEY2对应引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOE2,3,4 } 外部中断的配置 void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource0); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13); EXTI_InitStructure.EXTI_Line=EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line=EXTI_Line13; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } |
|
|
|
这两个中断单独进入中断函数都是可以的,就是不能够唤醒,所以我怀疑要么是上面的void Sys_Enter_Standby()函数错了,要么就是硬件问题了。。
|
|
|
|
进入STOP模式之前,重新配置一下对应IO时钟、中断配置。
|
|
|
|
void Sys_Enter_Standby(void) { SystemInit(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); /* 84MHZ*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_SYSCFG, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOA, ENABLE); KEY_Init(); //这个是配置按键IO口的函数 EXTI_Configuration(); //这个是配置中断的函数 printf("停机,重新配置"); delay_ms(50); RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口 // RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟 // PWR_BackupAccessCmd(ENABLE);//后备区域访问使能 RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。 RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。 EXTI_ClearITPendingBit(EXTI_Line0); EXTI_ClearITPendingBit(EXTI_Line13); EXTI_ClearITPendingBit(EXTI_Line2); // PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志 // // PWR_WakeUpPinCmd(ENABLE);//设置WKUP用于唤醒 // PWR_EnterSTANDBYMode(); //进入待机模式 PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI); SystemInit(); } |
|
|
|
是这个意思吗,,我这么配置了还是不行
|
|
|
|
配置放在 RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);后面。
|
|
|
|
还是不能唤醒。。 void Sys_Enter_Standby(void) { while(WK_UP==0); //等待WK_UP按键松开(在有RTC中断时,必须等WK_UP松开再进入待机) printf("停机,重新配置"); delay_ms(50); RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口 SystemInit(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); /* 84MHZ*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_SYSCFG, ENABLE);/* 168MHZ */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOA, ENABLE); KEY_Init(); /* 按键配置 */ EXTI_Configuration(); /* 外部中断配置 */ //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟 RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。 RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。 EXTI_ClearITPendingBit(EXTI_Line0); EXTI_ClearITPendingBit(EXTI_Line13); EXTI_ClearITPendingBit(EXTI_Line2); PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI); } |
|
|
|
我是如下配置,可以的:
/* Configure PC13 pin as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Connect EXTI Line13 to PC13 pin */ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13); /* EXTI configuration *********************************************************/ EXTI_ClearITPendingBit(EXTI_Line13); EXTI_InitStructure.EXTI_Line = EXTI_Line13; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable the RTC Alarm Interrupt */ Std_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); EXTI_ClearITPendingBit(EXTI_Line13); |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
991 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
970 浏览 2 评论
2080 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1177 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1599 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 22:03 , Processed in 0.954012 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号