野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11258|回复: 3

我自己在写EXTI中断函数时遇到的问题

[复制链接]
发表于 2015-10-21 15:34:29 | 显示全部楼层 |阅读模式
火哥,我自己再写EXTI中断实验时遇到了以下几个问题,实验的目的就是通过按下PA0,PC13时两个小灯知道外部中断产生时亮或者灭。虽然实验是成功了,但是问题不解决就像卡在喉咙里的刺难受,还请帮我分析分析
(1)不开总中断,中断服务函数照样运行
(2)中断外设的GPIO模式无论设置为上升沿或者设置为下降沿,对程序都没有什么影响,如GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
(3)GPIO用作EXTI中断时,GPIO的端口配置到底用不用配置端口速度,如
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;这句话到底用不用配置


程序如下
main()程序
#include "bsp_led.h"
#include "key.h"
#include "stm32f10x.h"
void main()
{                LED_GPIO_Config();                NVIC_confg();
                key_confg();
        while(1)
        {}

}
#include "key.h"
void key_confg(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        EXTI_InitTypeDef EXTI_InitStruct;
       
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//EXTIóÃ2»óÿaÆôê±ÖóÄØ£¬êÇ2»êÇAFIO¾íêÇÖD¶ÏμÄê±ÖóÄØ
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
        //GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
        EXTI_InitStruct.EXTI_Line=EXTI_Line0;
        EXTI_InitStruct.EXTI_LineCmd=ENABLE;
        EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_Init(&EXTI_InitStruct);
       
       
       
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;
        //GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStruct);
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);
        EXTI_InitStruct.EXTI_Line=EXTI_Line13;
        EXTI_InitStruct.EXTI_LineCmd=ENABLE;
        EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_Init(&EXTI_InitStruct);
}
void NVIC_confg(void)
{
        NVIC_InitTypeDef NVIC_InitStruct;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
        NVIC_Init(&NVIC_InitStruct);
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_InitStruct);
}

void LED_GPIO_Config(void)
{               
                GPIO_InitTypeDef GPIO_InitStructure;
                RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);                                                                                                           
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;       
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOB, &GPIO_InitStructure);                                                                                                          
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;       
                GPIO_Init(GPIOC, &GPIO_InitStructure);
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;       
                GPIO_Init(GPIOC, &GPIO_InitStructure);       
                GPIO_SetBits(GPIOB, GPIO_Pin_0);
                GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);         
}

回复

使用道具 举报

发表于 2015-10-21 17:59:54 | 显示全部楼层
(1)系统启动时默认开启中断允许的
(2)GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;不是上升沿,是上拉引脚,楼主可去了解下上拉电阻的作用,程序中设置中断触发方式才是上升沿或者下降沿
(3)引脚的速度一般为允许的最大速度,已经为兆级速度,按下按键速度达不到级别所以才没影响
对于高速的输入源这个引脚速度才会有影响。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-22 15:06:07 | 显示全部楼层
亽亼 发表于 2015-10-21 17:59
(1)系统启动时默认开启中断允许的
(2)GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;不是上升沿,是上拉引脚, ...

系统启动时默认开启中断允许,那我是不是也可以手动设置,在哪里设置。你的第二个回答我明白你的意思,但是你看我发到这个图片,当我的按键按下时PC13电平被拉低,但是它有上拉电阻,作为输入信号,那么我的输入模式应该设置为上拉输入还是下拉输入,这一点还不太明白。
QQ截图20151022144859.png
回复 支持 反对

使用道具 举报

发表于 2015-10-22 17:29:05 | 显示全部楼层
#define CLI()      __set_PRIMASK(1)                /* 关闭总中断 */  
#define SEI() __set_PRIMASK(0)                                /* 开放总中断 */
可以使用这两个配置中断;
至于要配置成上拉还是下拉问题是你对上拉电阻或者下拉电阻的作用不了解
正如电路图中R4电阻作为上拉电阻的作用是当按键没被按下时让PC13这个引脚保持在高电平状态,相比去掉R4电阻时候(不考虑PC13程序设置情况)这个引脚状态可能受某个影响出现电平波动情况而可能产生误触发。
同样的程序设置也是想要达到一样的目的,所以这里要设置为上拉输入
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-10 22:17 , Processed in 0.035089 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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