0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32的外部中断

汽车电子技术 来源:玩转单片机 作者:Julian 2023-02-10 14:53 次阅读

1、外部中断/事件线映射

poYBAGPl6cmAVGtJAAHWx2SaZnM342.png

从上表可知,STM32F10x 的 EXTI 供外部 IO 口使用的中断线有 16 根,但是我们使用的 STM32F103 芯片却远远不止 16 个 IO 口,那么 STM32F103 芯片怎么解决这个问题的呢?因为 STM32F103 芯片每个 GPIO 端口均有 16 个管脚,因此把每个 端 口 的 16 个 IO 对 应 那 16 根 中 断 线 EXTI0-EXTI15 。比 如 :GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 EXTI0-EXTI15,这样一来每个中断线就对应了最多 7 个 IO 口,比如:GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。但是中断线每次只能连接一个在 IO 口上,这样就需要通过 AFIO 的外部中断配置寄存器 1 的 EXTIx[3:0]位来决定对应的中断线映射到哪个 GPIO 端口上,对于中断线映射到 GPIO 端口上的配置函数在stm32f10x_gpio.c 和 stm32f10x_gpio.h 中,所以使用到外部中断时要把这个文件加入到工程中,在创建库函数模板的时候我们默认已经添加。

pYYBAGPl6b2AD0glAAEEwAL79pA733.png

2、EXTI 配置

#include "stm32f10x.h"

uint8_t main_temp = 0;    //标志位

void LED_Init()
{
  GPIO_InitTypeDef GPIO_InitStructure;            //定义结构体变量
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;          //选择你要设置的IO口
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;   //设置推挽输出模式
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  //设置传输速率
  GPIO_Init(GPIOC,&GPIO_InitStructure);            //初始化GPIO
  
  GPIO_SetBits(GPIOC,GPIO_Pin_0);                  //将LED端口拉高,熄灭所有LED
}

void KEY_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;       //定义结构体变量  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;     //选择你要设置的IO口
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD; //下拉输入  
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  //设置传输速率
  GPIO_Init(GPIOA,&GPIO_InitStructure);       //初始化GPIO
}

/*
 * 简单说明: 外部中断初始化
 */
void My_EXTI_Init(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  EXTI_InitTypeDef  EXTI_InitStructure;
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启 AFIO 时钟
  
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);//选择GPIO管脚用作外部中断线路
  
  
  //EXTI0 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;        //EXTI0中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;  //抢占优先级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;        //子优先级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //IRQ通道使能
  NVIC_Init(&NVIC_InitStructure);  //根据指定的参数初始化VIC寄存器
  
  EXTI_InitStructure.EXTI_Line=EXTI_Line0;                //中断/事件线
  EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;       //中断模式
  EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;    //上升沿触发
  EXTI_InitStructure.EXTI_LineCmd=ENABLE;                 //使能
  EXTI_Init(&EXTI_InitStructure);  //初始化EXTI
  
}

/*
 * 简单说明: 外部中断0函数
 */
void EXTI0_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line0)==1)  //判断中断线是否有中断发生
  {
    if( main_temp ){
      main_temp = 0x00;
    }
    else{
      main_temp = 0xff;
    }
  }
  EXTI_ClearITPendingBit(EXTI_Line0);  //清除中断标志位
}

int main( void )
{
  LED_Init();
  KEY_Init();
  My_EXTI_Init();
  while(1)
  {
    if( main_temp == 0x00 ){
      GPIO_SetBits(GPIOC,GPIO_Pin_0);
    }
    else{
      GPIO_ResetBits(GPIOC,GPIO_Pin_0);
    }
    
  }
}

--END--

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32F10x
    +关注

    关注

    1

    文章

    81

    浏览量

    20608
  • STM32F103
    +关注

    关注

    33

    文章

    475

    浏览量

    62900
  • EXTI
    +关注

    关注

    0

    文章

    26

    浏览量

    3631
收藏 人收藏

    评论

    相关推荐

    STM32CubeIDE软件实现STM32外部中断实例

    本文用STM32CubeIDE软件实现STM32外部中断实例。
    的头像 发表于 08-24 09:09 4020次阅读

    STM32外部中断的设置

    发现了一个关于STM32外部中断的设置小文章
    发表于 03-13 16:04

    STM32外部中断的怎么配置

    STM32中断分组STM32外部中断的配置过程使用GPIO口接按键进行外部
    发表于 03-02 07:34

    详细解析STM32外部中断

    说明:本文旨在详细解析STM32外部中断,以实现按键触发外部中断。其中包含“编程流程”、“程序代码”、“代码解析”、“原理分析”、“小结”
    发表于 08-13 07:50

    STM32外部中断简介

    STM32外部中断+TFTLCD显示STM32外部中断简介S
    发表于 08-16 07:46

    stm32外部中断简介

    stm32外部中断实验
    发表于 08-17 08:20

    STM32外部中断中断通道是什么?

    STM32外部中断中断通道是什么?
    发表于 11-16 09:12

    STM32外部中断怎么设置?

    STM32外部中断怎么设置?
    发表于 11-18 07:36

    STM32外部中断实现红外遥控功能

    STM32外部中断实现红外遥控功能。
    发表于 12-14 15:49 67次下载

    STM32_外部中断程序

    STM32 外部中断程序,很好的学习资料,快来下载吧
    发表于 02-15 17:09 30次下载

    STM32外部中断实验-EXTI

    STM32 外部中断简介STM32 的每个 IO 都可以作为外部中断
    发表于 11-29 16:06 9次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>外部</b><b class='flag-5'>中断</b>实验-EXTI

    STM32外部中断边沿触发存在延时问题

    STM32外部中断时延问题概括:通过软件调试,示波器观察的方式,来分析外部中断存在时延的原因。在调试模拟SPI接收的时候,想用
    发表于 12-27 18:27 20次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>外部</b><b class='flag-5'>中断</b>边沿触发存在延时问题

    STM32 外部中断实验参考程序

    STM32 外部中断实验程序,供STM32初学者参考。
    发表于 12-30 10:46 41次下载

    STM32如何配置外部中断STM32外部中断配置步骤

    STM32如何配置外部中断STM32外部中断配置步骤  作为一款现代化的微控制器,
    的头像 发表于 10-26 17:47 2548次阅读

    STM32外部中断大问题

    出现这种情况,明明没有触发外部中断,可是中断服务函数还是不断的++。问题一:电气噪声和抖动电气噪声和抖动是常见的问题,可能会导致STM32外部
    的头像 发表于 11-08 08:00 949次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>外部</b><b class='flag-5'>中断</b>大问题