本帖最后由 xujiantj 于 2019-1-2 10:33 编辑 功能描述: PC13连接外部user按键,外部接10K上拉电阻,按键另一端接地,按下按键PC13端口电平变低,下降沿触发中断。PA5控制指示灯闪烁,上电后间隔100ms亮灭1次,按user键后,变成间隔1000ms亮灭1次。 故障描述: 单片机上电或复位后,运行正常,指示灯按100ms间隔不停的亮灭显示。按user键后指示灯常亮或常灭(每次按user键,指示灯状态不确定),感觉单片机检测到了中断,但是没办法进入中断执行,好像死机一样。 程序如下,请各位大侠帮我分析一下问题出在哪里,多谢了!!! #include "mbed.h" #include "stm32f4xx_hal.h" #include "stm32f4xx.h" #include "stm32f4xx_hal_gpio.h" static GPIO_InitTypeDef GPIO_InitStruct; int16_t count1 = 100; void EXTI15_10_IRQHandler(void) { HAL_NVIC_ClearPendingIRQ(EXTI15_10_IRQn); HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13); { // EXTI line interrupt detected if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_13) != RESET) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13); HAL_GPIO_EXTI_Callback(GPIO_PIN_13); } } } void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_13) { count1 = 1000; } } int main() { HAL_Init(); /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_13; //PC13 as interrupt test GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING ; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); //EXTI interrupt init HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); /* -2- Configure PA05 IO in output push-pull mode to drive external LED */ GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); while (1) { // HAL_NVIC_DisableIRQ(EXTI15_10_IRQn); HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); /* Insert delay 100 ms */ HAL_Delay(count1); // Flashing(1000); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); } } |
STM32F407 定时器触发DMA 求助大神
【MCU实战经验】基于STM32F407的音频播放器设计
盘古UE-STM32F407工控板原理图
【STM32F429心得\疑问】+STM32F4之FSMC和FMC
STM32F429读取IO口传输的数据速率
STM32F407ZGT6 手摸芯片背部重启
STM32F4 SPI 动作时,软件片选信号被拉高,IO口程序逻辑失控
STM32F401RE NUCLEO求助,串口一直不能进中断
读取STM32F407内部温度传感器值错误
STM32F429多路内部ADC独立采集的办法
那个PC13应该设置上拉才对。 GPIO_InitStruct.Pull = GPIO_PULLUP;
进入的那个状态是硬件出错中断。还有那个stm32f4xx.it.c关于外部中断的代码应该贴出来看看,或许你没有在里头设置外部中断头函数void EXTI15_10_IRQHandler(void){}
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN13);
}
然后在处理函数里:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN13)
{//处理过程
.
.
}
}
而不应该在中断函数里是重复调用中断函数。
改成这样也不行,现象一样
void EXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}
void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_13) {
count1 = 1000;
}
}
ST官方有例程可以参考的:
把例程中的中断端口有PA0改为PC13,指示灯显示改为PA5,(为了和STM32F401 Nucleo开发板上的硬件匹配)。上电后指示灯闪烁正常,按PC13按键后,指示灯常亮或常灭,未执行中断。
在keil中单步执行后,观察MR13置1(PC13开中断),TR13置1(设置为下降沿触发),运行后,按PC13按键后,观察PR13置1,说明已经检测到了外部中断PC13。但是不执行中断回调函数(例程中只有回调函数HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin),没有中断服务函数EXTI15_10_IRQHandler(void),应该是不需要)。
不知道为什么进入不了中断?
这部分应该是对EXTI的设置,PC13为外部中断入口
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_13; //PC13 as interrupt test
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING ;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
//EXTI interrupt init
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
350 USART6_IRQHandler
351 I2C3_EV_IRQHandler
352 I2C3_ER_IRQHandler
353 FPU_IRQHandler
354 SPI4_IRQHandler
355
356 B .
357
358 ENDP
359
360 ALIGN
361
362 ;*********************************************
363 ; User Stack and Heap initialization
364 ;*********************************************
365 IF EF:__MICROLIB
366
367 EXPORT __initial_sp
368 EXPORT __heap_base
369 EXPORT __heap_limit
PC13设置成上拉之前试过,也不行。硬件PC13外部有10K电阻的上拉,设置成浮空输入应该也行。
我再看看stm32f4xx.it.c文件中的中断部分的代码,非常感谢!!!
void EXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}
非常感谢!!!
非常感谢楼上大哥,问题已解决!!!
就是例程的stm32f4xx.it.c中原先的中断服务函数是:
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(KEY_BUTTON_PIN);
}
需要改为:
void EXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}
就可以了!!!
非常感谢!!!