STM32外部中断无法进入中断程序,请问下面的程序哪里不对呀???

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32外部中断无法进入中断程序,请问下面的程序哪里不对呀???相关的知识,希望对你有一定的参考价值。

PC2口进行AD采样。程序编写思路:现将PC2口配置成外部中断的EXIT2,当EXIT2检测到上升沿时进入EXIT2的外部中断服务程序打开定时器5,定时一段时间后,在定时器5的中断服务程序中打开AD采样。
1、main.c中用下面一句话作为开启PC2口作为外部中断EXIT2,可以吗??
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,DISABLE);
2、exti.c中PC2口配置成外部中断 EXTI2
static void EXTI_GPIO_MODE_Config(void)

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStructure);

static void EXTI_NVIC_Configuration(void)

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

static void EXTI_MODE_Config(void)

EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

void EXTI_PC2_Config(void)

EXTI_GPIO_MODE_Config();
EXTI_NVIC_Configuration();
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);
EXTI_MODE_Config();

3、stm32f10x_it.c程序中
void EXTI2_IRQHandler(void)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,DISABLE);//禁止外部中断EXTI2
START_TIM5();//打开定时器5

我希望你学会一步一步地调试程序,而不是一上来就一股脑的把代码都加进去,结果出问题了,就很主观地认为是哪里哪里出问题。
你的思路是没问题的,但是你看不到实际的结果就以为是中断出了问题。
我建议你这样,
1、先查找一下你所使用的芯片数据手册,看一下外中断接口是哪一个IO。
2、只做外中断功能,检测到下降沿之后让一个连接LED的IO电平翻转,观察中断是否成功。
3、只做定时器功能,定时时间到让连接LED的IO电平翻转,观察定时器是否成功。
4、在定时器中的服务函数里,做AD采样功能,观察AD是否成功采样。

5、把上述的功能联合起来。追问

采样时做外部中断的IO口GPIO_Mode应该设置成什么模式啊,GPIO_Mode_IPU,GPIO_Mode_AIN,还是GPIO_Mode_IN_FLOATING??

追答

AIN是模拟输入的意思吗?不好意思,好久没用这个了,你到开源电子网下载一些正点原子的开发板例程吧

来自:求助得到的回答
参考技术A 1)我不知道你是怎么用DISABLE开启的。
2)请检查中断函数名是否与启动代码中的中断函数名一致。
3)你在中断函数里关时钟做什么用?
4)不要在中断函数里做处理。追问

我用外部中断为了检测到上升沿,之后直接开启定时器计时,所以要关闭中断

追答

外部中断怎么能用上升沿?高电平没办法把低电平拉高啊。
除非你一直都是低电平,靠按键什么的将电平拉高。
一直都是低电平会导致功耗增加。为什么不用下降沿触发??

本回答被提问者采纳

stm32外部中断这程序编译没问题,但触发不了外部中断,卡了一天了

#include "stm32f10x.h"
void init_GPIO()

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_10);//使LED熄灭

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);



void init_RCC()

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);



void init_EXIT()

EXTI_InitTypeDef EXTI_InitStructure;

EXTI_InitStructure.EXTI_Line = EXTI_Line1;
EXTI_ClearITPendingBit(EXTI_Line1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);



void init_NVIC()

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);


int main(void)

init_RCC();
init_GPIO();
init_EXIT();
init_NVIC();
while(1);


stm32f10x_it.c中的中断函数是
void EXIT1_IRQHandler(void)

if(EXTI_GetITStatus(EXTI_Line1)==SET)

GPIO_ResetBits(GPIOB, GPIO_Pin_10);//让LED亮
EXTI_ClearITPendingBit(EXTI_Line1);


GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);改为GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1);发的时候发错了

中断向量表地址没设置,系统发生中断找不到向量表追答

成功了,谢谢

参考技术A 给您这个文章看看:http://huhui1101.blog.163.com/blog/static/8784066520126294740460/追问

这个我早就看过了,不过还是谢谢你

参考技术B 不发程序怎么看,nvic配了吗追问

发错了

追答

还是找不到,就看到一条include

下面是程序,大哥快看看,弄了两天了

以上是关于STM32外部中断无法进入中断程序,请问下面的程序哪里不对呀???的主要内容,如果未能解决你的问题,请参考以下文章

stm32外部按键中断无法退出中断问题

STM32L051低功耗STOP模式串口中断唤醒

STM32进入中断怎么出不了中断

STM32开发板的TIM3开启和关闭

stm32 开启接收中断 PC 发送两次 为啥串口只接收到一次

STM32共用中断线的外部中断引脚的判断