OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8128|回复: 3

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

[复制链接]

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-12-19
在线时间
0 小时
发表于 2014-12-22 16:58:29 | 显示全部楼层 |阅读模式
5金钱
如果不启用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]

最佳答案

查看完整内容[请看2#楼]

回复【2楼】正点原子: --------------------------------- 这个我当时就检查了,没有开启,RCC->APB2ENR = 0; 设想如果没有启用SYSCFG,则只能是PA0或者Px0或者PAx能中断, 发现这个只是巧合(F4-Discovery的Key正好是PA0),感觉验证与否没有意义就没有去验证, 最好还是按规矩来吧,刚刚在探索者开发板的PE2、3、4试过,不开启SYSCFG无法进中断。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-12-19
在线时间
0 小时
 楼主| 发表于 2014-12-22 16:58:30 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
这个我当时就检查了,没有开启,RCC->APB2ENR = 0;
设想如果没有启用SYSCFG,则只能是PA0或者Px0或者PAx能中断,
发现这个只是巧合(F4-Discovery的Key正好是PA0),感觉验证与否没有意义就没有去验证,
最好还是按规矩来吧,刚刚在探索者开发板的PE2、3、4试过,不开启SYSCFG无法进中断。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-12-22 19:36:27 | 显示全部楼层
你硬件仿真看下寄存器状态,是否SYSCFG的时钟真的没有开启?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-12-22 23:18:31 | 显示全部楼层
回复【3楼】tangerine:
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 09:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表