我是想利用中断去唤醒MCU,不是wakeup事件; 是利用PC13与PA0的外部中断去唤醒; 现在的问题是;PC13无法触发外部中断; 由于PC13的默认功能不是GPIO 我首先将PC13配置为GPIO模式 然后就开始配置了;但是现在一直不能进中断;我用的是SMT32F030C8T6 下面是我的代码 USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE); /* Configure pins as AF pushpull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1); GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA,&GPIO_InitStructure); //FP_EN GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PWR_EN GPIO_Init(GPIOB,&GPIO_InitStructure); //FP 中断配置 PC13 RTC->TAFCR &= 0xFFF7FFFF; //PC13 作为GPIO用 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Line = EXTI_Line13; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource13);//PC13 中断线映射 EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_InitStructure.USART_BaudRate = 115200;//串口波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式. USART_Init(USART1, &USART_InitStructure); //初始化串口 USART_Cmd(USART1, ENABLE); //使能串口 下面是中断服务函数 void EXTI4_15_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line13)!=RESET) { //FP_Verify(); printf("\r\n FP Verify"); } EXTI_ClearITPendingBit(EXTI_Line13); } 我用GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13); 是能够读到触发的电平的,所以外部信号确认是有的; 不知道哪位大师做过这个 |
感谢;标准库的 帮助文档里面确实有;我都没想到去看
加一句
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 就可以了
什么例子
/*Configure GPIO pin : PC13 */
GPIO_InitStruct.Pin = GPIO_PIN_13; // PC13设置为下降沿中断
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0x06, 0); // PC13
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_13) // PC13触发的中断
{
Just_Wkup = TRUE;
}
}
while(1)
{
if(Just_Wkup == TRUE)
{
Just_Wkup = FALSE;
SystemClock_Config(); // 初始化系统时钟
}
}