中断学习笔记

本文详细介绍了STM32中NVIC中断控制器的功能,如何配置中断优先级,以及使用EXTI进行GPIO中断的配置和处理。以GPIOPA0和PB0为例,展示了如何设置中断模式、触发条件和编写中断服务函数EXTI0_IRQHandler。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内核中断10个,外设70个

中断优先级寄存器

跟内核相关的函数找core_cm3.c/h,misc.c/h

NVIC的功能就是中断优先级分组、中断优先级的配置、读中断请求标志、清除中断请求标志、使能中断、清除中断等,它控制着STM32中断向量表中的中断相关功能!!。

先比较主优先级,再比较子优先级,都相同比较硬件的编号

1-中断函数名称要好启动文件里中断向量表里的函数名称一样,因为启动文件是弱定义,所以重定义就可以覆盖。写错了就只会执行启动文件里的。

2-为了方便管理在stm32f10x_it.c里写函数

具体的实例—GPIO中断

EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

读取GPIO的变化由EXTI产生中断来交给内核NVIC

输入线

1,输入线20根,具体是

2,

各个寄存器都可以找到

定义化EXTI结构体

上面那些都是给寄存器赋值

编程

硬件图是要求用按键来产生中断

代码整理

main.c


int main()
{
    void EXTI_Key_Config();
    EXTI_Key_Config();
    void EXTI0_IRQHandler(void);
        EXTI0_IRQHandler();
    while (1)

{}

}
    

bsp_exti.c


#include "stm32f10x.h"                  // Device header
//说明文件只能被当前的文件调用
static void EXTI_Config()
{    //定义NVIC结构体
    NVIC_InitTypeDef NVIC_Ins;
    //设置中断线
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    //指定通道
    NVIC_Ins.NVIC_IRQChannel=EXTI0_IRQn ;
    //设定组优先级
    NVIC_Ins.NVIC_IRQChannelPreemptionPriority=1;
    //设定子优先级,数字越小越高
    NVIC_Ins.NVIC_IRQChannelSubPriority=1;
    //指定通道是启用还是禁止
    NVIC_Ins.NVIC_IRQChannelCmd=ENABLE;
    //调用初始化函数
    NVIC_Init(&NVIC_Ins);
    
    



}
void EXTI_Key_Config()
{
    //初始化EXTI的结构体
    EXTI_InitTypeDef GPIO_InitStruct;
    //配置中断优先级
    EXTI_Config();
    
    //初始化GPIO 开启PA0 复用输入
    GPIO_InitTypeDef led_init;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
    led_init.GPIO_Speed =GPIO_Speed_50MHz;
    led_init.GPIO_Pin=GPIO_Pin_0;
    led_init.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &led_init);
    //初始化GPIO 开启PB0 推挽输出
    GPIO_InitTypeDef le_init;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE );
    le_init.GPIO_Speed =GPIO_Speed_50MHz;
    le_init.GPIO_Pin=GPIO_Pin_0;
    le_init.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &le_init);
    
    
    //打开EXTI的时钟 打开的是AFIO EXTI中断在AFIO里
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE );
    
    //初始化EXTI
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
    //配置中断线
    GPIO_InitStruct.EXTI_Line=EXTI_Line0  ;
    //配置中断模式
    GPIO_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
    //配置为上升沿触发
    GPIO_InitStruct.EXTI_Trigger= EXTI_Trigger_Rising;
    //配置开启
    GPIO_InitStruct.EXTI_LineCmd=ENABLE;
    
    
    //结构题设置好了后写入固件库 结构体是变量,对于输入指针要用&
    EXTI_Init(&GPIO_InitStruct);
    
    //编写中断函数在stm32f10x_it.c文件中
    
    
}

stm32f10x_it.c



void EXTI0_IRQHandler(void)
{
    //判断中断线是否有中断
    if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
    {
        GPIOB->ODR^=GPIO_Pin_0 ;
    
    }//清楚中断标志位
EXTI_ClearITPendingBit(EXTI_Line0);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小C学Python青春版

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值