F4外部中断在未使能SYSCFG的情况下为什么可以进入

2019-07-21 04:16发布

如果不启用SYSCFG时钟,理论上不是应该无法正常中断么?
但是,在使用GPIOA_Pin_0时,竟然进中断了,为什么?

代码如下,引脚跟战舰探索者不一样,各位可以改下试试。。。求教下原因,求深入解释; [mw_shl_code=c,true]#include "stm32f4xx.h" uint32_t inc_ms = 0; uint8_t light_on = 0; void SysTickDelayms(uint32_t ms) { inc_ms = 0; SysTick->CTRL |= 0x01; while(inc_ms < ms); SysTick->CTRL &= ~(uint32_t)0x1; } void GPIOD_Init(void) { // 1.配置时钟 RCC->AHB1ENR |= (uint32_t)0x01 << 3; // 启用GPIOD的时钟 // 2.配置模式 GPIOD->MODER |= (uint32_t)0x01 << (12 * 2); // 设置GPIOD12的模式为输出 GPIOD->MODER |= (uint32_t)0x01 << (13 * 2); GPIOD->MODER |= (uint32_t)0x01 << (14 * 2); GPIOD->MODER |= (uint32_t)0x01 << (15 * 2); // 3.配置输出模式 GPIOD->OTYPER &= ~((uint32_t)0x0 << 12); // 0 推挽输出 GPIOD->OTYPER &= ~((uint32_t)0x0 << 13); GPIOD->OTYPER &= ~((uint32_t)0x0 << 14); GPIOD->OTYPER &= ~((uint32_t)0x0 << 15); // 4.配置上下拉 GPIOD->UPDR |= (uint32_t)0x01 << (12 * 2); // 01 上拉 GPIOD->UPDR |= (uint32_t)0x01 << (13 * 2); GPIOD->UPDR |= (uint32_t)0x01 << (14 * 2); GPIOD->UPDR |= (uint32_t)0x01 << (15 * 2); // 5.配置速度 GPIOD->OSPEEDR |= (uint32_t)0x01 << (12 * 2); // 01 25MHz GPIOD->OSPEEDR |= (uint32_t)0x01 << (13 * 2); GPIOD->OSPEEDR |= (uint32_t)0x01 << (14 * 2); GPIOD->OSPEEDR |= (uint32_t)0x01 << (15 * 2); // 6.锁定模式(可选,锁定之后引脚模式便不可以更改) // 略 // 7.配置完成,给定初始输出 GPIOD->BSRRL = (uint16_t)((uint16_t)0x1 << 12); // 置位寄存给定,关闭灯 GPIOD->BSRRH = (uint16_t)((uint16_t)0x1 << 13); // 复位寄存给定,打开灯 GPIOD->BSRRL = (uint16_t)((uint16_t)0x1 << 14); GPIOD->BSRRH = (uint16_t)((uint16_t)0x1 << 15); } void RCC_SetSYSCLK_HSE() { __IO uint32_t cfgr = 0; cfgr = RCC->CFGR; cfgr &= ~(uint32_t)0x03; cfgr |= (uint32_t)0x1; // SET HSE AS SYSTEM CLOCK RCC->CFGR = cfgr; } void SysTick_Init() { SysTick->LOAD = 1000 * 8 / 8; // HSE 8 MHz, FCLK = SYSCLK / 8 SysTick->CTRL &= ~((uint32_t)0x1 << 2); // CLKSOURCE, =1--FCLK, =0--STCLK(ARM未规定,STM32定义为AHB) SysTick->CTRL |= ((uint32_t)0x1 << 1); // 启用中断方式 } void EXTI0_Init() { RCC->AHB1ENR |= (uint32_t)0x01; // GPIOA NVIC_EnableIRQ(EXTI0_IRQn); // 库函数配置 // RCC->APB2ENR |= (uint32_t)0x1 << 14; // 启用SYSCFG,不启用也能中断? EXTI->IMR |= (uint32_t)0x1; EXTI->FTSR |= (uint32_t)0x1; // EXTI->RTSR |= (uint32_t)0x1; SYSCFG->EXTICR[0] &= ~(uint32_t)0xF; } void main() { uint32_t delayms = 500; RCC_SetSYSCLK_HSE(); SysTick_Init(); GPIOD_Init(); EXTI0_Init(); while(1) { while(light_on) { GPIOD->ODR ^= (uint16_t)0xF << 12; SysTickDelayms(delayms); //软中断测试 //EXTI->SWIER |= 0x1; } } } void SysTick_Handler(void) { inc_ms++; return; } void EXTI0_IRQHandler(void) { EXTI->R |= (uint32_t)0x1; light_on = !light_on; return; } [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
tangerine
1楼-- · 2019-07-21 05:55
回复【2楼】正点原子:
---------------------------------
这个我当时就检查了,没有开启,RCC->APB2ENR = 0;
设想如果没有启用SYSCFG,则只能是PA0或者Px0或者PAx能中断,
发现这个只是巧合(F4-Discovery的Key正好是PA0),感觉验证与否没有意义就没有去验证,
最好还是按规矩来吧,刚刚在探索者开发板的PE2、3、4试过,不开启SYSCFG无法进中断。
正点原子
2楼-- · 2019-07-21 10:59
你硬件仿真看下寄存器状态,是否SYSCFG的时钟真的没有开启?
正点原子
3楼-- · 2019-07-21 14:37
回复【3楼】tangerine:
---------------------------------

一周热门 更多>