STM32外部中断EXTI的配置(库函数模式)

4 篇文章 1 订阅
3 篇文章 0 订阅

1、配置RCC时钟,打开对应的端口的时钟

	//开启RCC时钟,配置GPIO和AFIO
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

2、配置GPIO(X),选择对应端口开启输入模式

    //配置GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

3、配置AFIO,选择GPIO连接到EXIT

	//配置AFIO,选择中断引脚
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);

4、配置EXTI,选择触发方式(上升沿、下降沿、双边沿)(选择触发方式:中断响应、事件响应)

	//配置EXTI,配置任意线路的模式(中断模式或事件模式),并选择触发方式(上升沿[Rising]、下降沿[Falling]、双边沿[Rising_Falling])、开启(关闭)中断
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTI_Init(&EXTI_InitStructure);

5、配置NVIC,为中断配置优先级

	//设置优先级分组:先占优先级和从优先级(这个模式范围需要在整个系统内统一)
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	//配置NVIC,配置中断通道(对应EXTI的线路),指定中断通道状态(使能/失能),最后分别配置线路的抢占优先级和响应优先级
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);

中断程序总代码

#include "stm32f10x.h"                  // Device header

    //定义中断的函数
void CountSensor_Init(void)
{
    //开启RCC时钟,配置GPIO和AFIO
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    
    //配置GPIO
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    //配置AFIO,选择中断引脚
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
    
    
    //配置EXTI,配置任意线路的模式(中断模式或事件模式),并选择触发方式(上升沿[Rising]、下降沿[Falling]、双边沿[Rising_Falling])、开启(关闭)中断
    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line14;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStructure);
    
    //设置优先级分组:先占优先级和从优先级(这个模式范围需要在整个系统内统一)
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    //配置NVIC,配置中断通道(对应EXTI的线路),指定中断通道状态(使能/失能),最后分别配置线路的抢占优先级和响应优先级
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
}

//开启中断的函数(函数为固定值,查表验证);不需要在.h文件额外声明,会自动执行的啦
//这里开启的是EXTI 10~15 的线路,不确定所以还要开启线路判断
void EXTI15_10_IRQHandler(void)
{
    //检查指定的 EXTI (14)线路触发请求发生与否
    if (EXTI_GetITStatus(EXTI_Line14) == SET)
    {
        //中断程序结束后,要清楚中断请求,结束中断
        EXTI_ClearITPendingBit(EXTI_Line14);
    }
}

EXTI中断

EXIT框图

 参考资料:【STM32入门教程-2023持续更新中】 https://www.bilibili.com/video/BV1th411z7sn/?p=12&share_source=copy_web&vd_source=75df8cb68ad3ea976a2f5faa2e9336aa

   本文为作者独立编写

 本BLOG上所有的原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处,否则属于侵权行为。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JASON丶LI

作者码力不足了,卑微的求个打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值