OpenEdv-开源电子网

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

新手求助!STM32F407外部中断无法实现

[复制链接]

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2021-7-25
在线时间
3 小时
发表于 2021-7-25 11:37:32 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 Flareon 于 2021-7-25 11:42 编辑

本人刚入门STM32F4,在学习中断这一章节出现了问题。
所采用的是黑色开发板(STM32F407VET6)

拟设计代码实现功能:使用中断完成 按下按键后led灯由点亮转向熄灭
问题:编写完成代码后无法实现该功能

开发板的部分原理图如下:(“LED指示灯”和“用户按键”;设置按下K1按键(PE3)后,D3的LED灯熄灭(PA7))



以下是个人编写的代码,可能会有代码编写不规范的地方,请见谅

#include "stm32f4xx.h"
#define PAout(n) *(volatile uint32_t *)(0x42000000 + (GPIOA_BASE + 0x10 - 0x40000000)*32 + n*4)

static GPIO_InitTypeDef GPIO_InitStructure;
static EXTI_InitTypeDef EXTI_InitStructure;
static NVIC_InitTypeDef NVIC_InitStructure;

//中断服务函数;
void EXTI3_IRQHandler(void) {
    if (EXTI_GetITStatus(EXTI_Line3) == SET) {
        PAout(7) = 1;
    }
    EXTI_ClearITPendingBit(EXTI_Line3);
}

int main(void) {
    //初始化led灯;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
        
    //以下设置外部中断;
    //初始化按键;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    //按下按键的外部中断设置;
    RCC_AHB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//系统时钟;
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);    //设置PE3作为外部中断按键;
    EXTI_InitStructure.EXTI_Line = EXTI_Line3;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    //配置外部中断的NVIC;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x08;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x08;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
   
    while(1){
        PAout(7) = 0;
    }
}

代码1

代码1
1



恳请大佬帮忙解决(已被困扰一天)
谢谢!!!


代码3

代码3

代码2

代码2

原理图

原理图
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

2154

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4957
金钱
4957
注册时间
2015-1-10
在线时间
621 小时
发表于 2021-7-27 09:20:14 | 显示全部楼层
中断执行了你也应该看不出来灯灭,因为进中断就LED灭了,然后就从中断出来了,LED又亮了,前后时间应该不足1us,你怎么可能看得出来
回复

使用道具 举报

13

主题

645

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2012
金钱
2012
注册时间
2021-4-16
在线时间
512 小时
发表于 2021-7-27 09:45:27 | 显示全部楼层
你要有一个能看得出来的效果才行,mcu处理是很快的,你可以在外部中断服务函数里面写led灯反转的代码,主函数死循环里就不要操作那个led灯了。
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2021-7-27 10:00:27 | 显示全部楼层
main 函数的  while(1) 中延时2秒,你就能看到效果了
茵茵猪头
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2021-7-25
在线时间
3 小时
 楼主| 发表于 2021-7-28 21:00:00 | 显示全部楼层
我这里也是重新修改了些许代码,其中加入了延时函数(delay(void))修改后的代码如下:


#include "stm32f4xx.h"
#define PAout(n)  *(volatile uint32_t *)(0x42000000 + (GPIOA_BASE + 0x10 - 0x40000000)*32 + n*4)

static GPIO_InitTypeDef   GPIO_InitStructure;
static EXTI_InitTypeDef   EXTI_InitStructure;
static NVIC_InitTypeDef   NVIC_InitStructure;

//延时函数;
void delay(void){
        uint32_t i = 0x2000000;
        while(i--);
}

//中断服务函数;
void EXTI3_IRQHandler(void) {
    if (EXTI_GetFlagStatus(EXTI_Line3) == SET) {//????
            GPIO_ResetBits(GPIOA, GPIO_Pin_7);
                delay();
    }
    EXTI_ClearITPendingBit(EXTI_Line3);
}

int main(void){
       //led灯;
       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
       GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
       GPIO_Init(GPIOA, &GPIO_InitStructure);

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//系统时钟;
       //按键;
       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
       GPIO_Init(GPIOE, &GPIO_InitStructure);

       SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);
       EXTI_InitStructure.EXTI_Line = EXTI_Line3;
       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
       EXTI_InitStructure.EXTI_LineCmd = ENABLE;
       EXTI_Init(&EXTI_InitStructure);

       NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       NVIC_Init(&NVIC_InitStructure);

       EXTI_GenerateSWInterrupt(EXTI_Line3);

       while(1){

       }
}

但是我在调试的时候发现,我还没有按下用户按键,程序就自动跳到中断服务函数了???搞不懂

调试.zip

3.8 MB, 下载次数: 0

代码调试视频

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-25 14:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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