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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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外部中断EXTI简介

中断简介

STM32 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 的强大之处。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的19 个外部中断为:

线 0~15:对应外部 IO 口的输入中断。
线 16:连接到 PVD 输出。
线 17:连接到 RTC 闹钟事件。
线 18:连接到 USB 唤醒事件

从上面可以看出,STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一一对应起来的呢?于是 STM32 就这样设计,GPIO 的管教 GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 0~15。这样每个中断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上了。

下面我们看看 GPIO 跟中断线的映射关系图:

在这里插入图片描述

在这里插入图片描述

中断触发方式

  • 上升沿触发:数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间叫作上升沿。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。
  • 下降沿触发:数字电路中,数字电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。 [1] 下降沿触发是当信号有下降沿时的开关动作,当电位由高变低而触发输出变化的就叫下降沿触发。也就是当测到的信号电位是从高到低也就是下降时就触发,叫做下降沿触发。
    边沿触发:既可以上升触发也可以下降触发

上升沿触发 就是当电压从低变高时触发中断
下降沿触发 就是当电压从高变低时触发中断

中断优先级组

STM32 将中断分为 5 个组,组 0 ~ 4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10 ~ 8 来定义的。
在这里插入图片描述
在这里插入图片描述
通过这个表,我们就可以清楚的看到组 0~4 对应的配置关系,例如组设置为 3,那么此时所有的 60 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级。每个中断,你可以设置抢占优先级为 0 ~ 7,响应优先级为 1 或 0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。

第一,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

举例: 假定设置中断优先级组为 2,然后设置中断 3(RTC 中断)的抢占优先级为 2,响应优先级为 1。中断 6(外部中断> 0)的抢占优先级为 3,响应优先级为 0。中断 7(外部中断 1)的抢占优先级为 2,响应优先级为 0。那么这 3> 个中断的优先级顺序为:中断 7>中断 3>中断 6。 上面例子中的中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3> 却不可以相互打断!

使用案例

参见我的这篇博文:stm32震动感应控制继电器

以上是关于stm32外部中断这程序编译没问题,但触发不了外部中断,卡了一天了的主要内容,如果未能解决你的问题,请参考以下文章

STM32的“外部中断”和“事件”怎么理解

stm32 外部中断打断PWM

STM32 TIM1 ETR计数外部脉冲数,怎么用中断方法实现?

STM32-外部中断,没有硬件干扰就是快乐

STM32F401 外部中断误触发问题

STM32外部中断EXTI简介