OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2420|回复: 0

STM32F1外部中断原理及代码

[复制链接]

28

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2019-10-16
在线时间
18 小时
发表于 2019-11-16 22:29:57 | 显示全部楼层 |阅读模式
STM32的每个IO都可以作为外部中断输入。
STM32的中断控制器支持19个外部中断/事件请求:
线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。
每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。
从上面可以看出,STM32IO使用的中断线只有16个,但是STM32F10x系列的IO口多达上百个,STM32F103ZET6(112),
STM32F103RCT6(51),那么中断线怎么跟io口对应呢?
外部中断.png
GPIOx.0映射到EXTI0GPIOx.1映射到EXTI1…         GPIOx.15映射到EXTI15
对于每个中断线,我们可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能 是不是16个中断线就可以分配16个中断服务函数呢?IO口外部中断在中断向量表中只分配了7个中断向量,也就是   只能使用7个中断服务函数
中断服务函数.png
从表中可以看出,外部中断线5~9分配一个中断向量,共用一个服务函数    外部中断线10~15分配一个中断向量,共用一个中断服务函数。 中断服务函数列表:
  1. EXTI0_IRQHandler           
  2. EXTI1_IRQHandler
  3. EXTI2_IRQHandler           
  4. EXTI3_IRQHandler           
  5. EXTI4_IRQHandler           
  6. EXTI9_5_IRQHandler         
  7. EXTI15_10_IRQHandler
复制代码
  1. 外部中断常用库函数
  2. ①void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
  3.    //设置IO口与中断线的映射关系
  4.    exp:  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
  5. ②void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
  6. //初始化中断线:触发方式等
  7. ③ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
  8. //判断中断线中断状态,是否发生
  9. ④void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
  10. //清除中断线上的中断标志位


  11. EXTI_Init函数
  12. void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

  13. typedef struct
  14. {
  15.   uint32_t EXTI_Line;   //指定要配置的中断线           
  16.   EXTIMode_TypeDef EXTI_Mode;   //模式:事件 OR中断
  17.   EXTITrigger_TypeDef EXTI_Trigger;//触发方式:上升沿/下降沿/双沿触发
  18.   FunctionalState EXTI_LineCmd;  //使能 OR失能
  19. }EXTI_InitTypeDef;

  20. EXTI_InitStructure.EXTI_Line=EXTI_Line2;         
  21. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
  22. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  23. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  24. EXTI_Init(&EXTI_InitStructure);

复制代码
外部中断的一般配置步骤:
初始化IO口为输入。
       GPIO_Init();
   开启IO口复用时钟。
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
设置IO口与中断线的映射关系。
        void GPIO_EXTILineConfig();
初始化线上中断,设置触发条件等。
       EXTI_Init();
配置中断分组(NVIC),并使能中断。
       NVIC_Init();
   编写中断服务函数。
      EXTIx_IRQHandler();
清除中断标志位
      EXTI_ClearITPendingBit();

exti.h
  1. #ifndef __EXTI_H
  2. #define __EXTI_H         
  3. #include "sys.h"
  4.          
  5. void EXTIX_Init(void);//外部中断初始化                                                             
  6. #endif

复制代码

exti.c
  1. #include "exti.h"
  2. #include "led.h"
  3. #include "key.h"
  4. #include "delay.h"
  5. #include "usart.h"
  6. #include "beep.h"

  7. void EXTIX_Init()
  8. {
  9.        
  10.         EXTI_InitTypeDef EXTI_Initstrcue;
  11.         NVIC_InitTypeDef NVIC_Initstructure;
  12.        
  13.         EXTI_Initstrcue.EXTI_Line=EXTI_Line4 ;
  14.         EXTI_Initstrcue.EXTI_LineCmd=ENABLE;
  15.         EXTI_Initstrcue.EXTI_Mode=EXTI_Mode_Interrupt;
  16.         EXTI_Initstrcue.EXTI_Trigger=EXTI_Trigger_Falling;
  17.        
  18.         NVIC_Initstructure.NVIC_IRQChannel=EXTI4_IRQn;
  19.         NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE;
  20.         NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=2;
  21.         NVIC_Initstructure.NVIC_IRQChannelSubPriority=2;
  22.        
  23.        
  24.         KEY_Init();
  25.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  26.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
  27.         EXTI_Init(&EXTI_Initstrcue);
  28.        
  29.         NVIC_Init(&NVIC_Initstructure);
  30.        

  31. }

  32. void EXTI4_IRQHandler()
  33. {
  34.         delay_ms(10);
  35.         if(KEY0==0)
  36.         {
  37.                 LED0=!LED0;
  38.                 LED1=!LED1;
  39.         }
  40.         EXTI_ClearITPendingBit(EXTI_Line4);
  41.        
  42. }

复制代码

main.c
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "usart.h"
  6. #include "exti.h"
  7. #include "beep.h"

  8. int main(void)
  9. {               

  10.         delay_init();                     //延时函数初始化          
  11.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  12.         uart_init(115200);         //串口初始化为115200
  13.         LED_Init();                                  //初始化与LED连接的硬件接口
  14.         BEEP_Init();                         //初始化蜂鸣器IO
  15.         EXTIX_Init();                 //初始化外部中断输入
  16.         LED0=0;                                        //先点亮红灯
  17.         while(1)
  18.         {            
  19.                 printf("OK\r\n");       
  20.                 delay_ms(1000);          
  21.         }         
  22. }
复制代码
有关led,beep,key的函数可以找我别的帖子。






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 20:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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