欢迎来到泰骏兴电子,大家有问题可以直接联系管理员QQ:233619809单片机 QQ群:59194556 各位游客也可以注册玩玩,享受更多权益。温馨提示:本网站仅提供平台学习以及渠道,一切后果自行承担,还望广大用户提高自我意识,请不要轻易相信他人,请不要轻易相信他人,请不要轻易相信他人。为了更好的管理论坛工作,所以现在使用邮箱注册,如果以前的邮箱不能修改的,请联系管理员代为修改

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 112|回复: 0

STM32F1外部中断

[复制链接]
发表于 2022-12-22 09:15:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 bcwx 于 2022-12-22 09:17 编辑
一、外部中断是什么?

首先我们要理解什么是中断。

想象一个场景:你在家里看书学习,这时候突然来电话了。你的做法是停止学习去接电话,电话打完再放下电话继续学习。这一个过程就体现了中断的思想。我们抽象一下,把自己想象成一个单片机系统,看书就是正在执行的主任务,如果没有外界干扰,这个系统会一直执行当前的主任务。而当外部有改变(电话响了)的时候,系统会第一时间响应,从主任务跳转到这个紧急任务中,这个突发的事件就是(外部)中断,而系统处理的紧急任务则是中断处理函数。当紧急任务(接电话)完毕之后,系统又会回到最初的主任务中。

这就是MCU的外部中断过程。
二、STM32外部中断概述
1. STM32的外部中断线

    STM32的每个IO都可以作为外部中断输入。
    STM32的中断控制器支持19个外部中断/事件请求:

线0~15:对应外部IO口的输入中断。

线16:连接到PVD输出。

线17:连接到RTC闹钟事件。

线18:连接到USB唤醒事件。

每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。

接下来就是代码部分


void EXTIX_Geiger_Tube_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;   
    NVIC_InitTypeDef NVIC_InitStructure;

    //外部中断,需要使能 AFIO 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;//PA4口
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//上拉输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);

   
   

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);//中断映射到PA4
   
   
    EXTI_InitStructure.EXTI_Line=EXTI_Line4;//中断线4
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;   
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);         //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器


    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;                //使能按键所在的外部中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    //抢占优先级2,
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;            //子优先级1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                    //使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);
        
  
}
void EXTI4_IRQHandler(void)//外部中断
{
    if(EXTI_GetITStatus(EXTI_Line4) != RESET)//到这里就是可以直接使用这个中断了
    {
       //自己需要执行的代码
        EXTI_ClearITPendingBit(EXTI_Line4);
    }   
}


实际上外部中断配合定时器可以检测输入的频率,但是不建议这样使用,小编做过类似的,外部中断执行的代码少还好,如果多,中断速度快了,很影响效率的。
外部中断小编配合定时器使用最大检测PWM方波在350HZ







高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|泰骏兴电子科技有限公司 ( 粤ICP备2023060260号-1 ) 单片机爱好者

GMT+8, 2025-10-31 17:19

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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