STM32单片机(2) 外部中断

发布者:真诚友谊最新更新时间:2018-05-19 来源: eefocus关键字:STM32  单片机  外部中断 手机看文章 扫描二维码
随时随地手机看文章

学习资料

李想stm32视频教程49集 http://pan.baidu.com/s/1kTyt03P  STM32的中断(上中下)外部中断(寄存器、库函数)
STM32的函数说明(中文).pdf    http://download.csdn.net/detail/leytton/7630851
中断管理函数.pdf  http://wenku.baidu.com/view/b90e5b82360cba1aa811dad3.html


概念基础

STM32共76个中断,16个内核中断,60个外部中断,即可屏蔽中断

中断分5组:0-4,所有中断只能放在同一组里

ISER[0]、ISER[1]是32位的中断使能寄存器数组,ISER[0]的bit0-31对应中断0-31、ISER[1]的bit0-27对应中断32-59,置1有效
ICER[0]、ICER[1]正好相反,是清除使能,置1有效

stm32中断抢占优先级和响应优先级有什么区别?
中断A抢占优先级比B高,那么A的中断可以在B里面触发,忽略响应优先级;
A和B抢占优先级相同,则A、B的响应优先级决定谁先响应;
抢占优先级高的可以打断抢占优先级低的中断,响应式则不能
数字越小,优先级越高


中断配置步骤




源代码

  1. /******************************************************************************* 

  2. *    

  3. * 软件功能:  中断闪灯实验(软件延时方式) 按键中断 

  4. *  

  5. *******************************************************************************/  

  6. #include "stm32f10x.h"  

  7. #include   

  8. #include "delay.h"  

  9.   

  10.   

  11.   

  12. void RCC_Configuration(void);  

  13. void GPIO_Configuration(void);  

  14. void NVIC_Configuration(void);  

  15. void EXTI_Configuration(void);  

  16.   

  17. /************************************************* 

  18. 函数: int main(void) 

  19. 功能: main主函数 

  20. 参数: 无 

  21. 返回: 无 

  22. **************************************************/  

  23. int main(void)  

  24. {  

  25.   RCC_Configuration();  

  26.   GPIO_Configuration();  

  27.   delay_init(72);  

  28.   NVIC_Configuration();  

  29.   EXTI_Configuration();  

  30.   GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭      

  31.   GPIO_ResetBits(GPIOA,GPIO_Pin_2);//灭  

  32.   while(1);  

  33. }  

  34.   

  35.   

  36. /************************************************* 

  37. 函数: void RCC_Configuration(void) 

  38. 功能: 复位和时钟控制 配置 

  39. 参数: 无 

  40. 返回: 无 

  41. **************************************************/  

  42. void RCC_Configuration(void)  

  43. {  

  44.   ErrorStatus HSEStartUpStatus;                    //定义外部高速晶体启动状态枚举变量  

  45.   RCC_DeInit();                                    //复位RCC外部设备寄存器到默认值  

  46.   RCC_HSEConfig(RCC_HSE_ON);                       //打开外部高速晶振  

  47.   HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速时钟准备好  

  48.   if(HSEStartUpStatus == SUCCESS)                  //外部高速时钟已经准别好  

  49.   {  

  50.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后  

  51.     FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延时  

  52.           

  53.     RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)时钟等于==SYSCLK  

  54.     RCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)钟==AHB时钟  

  55.     RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)钟==AHB1/2时钟  

  56.            

  57.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz  

  58.     RCC_PLLCmd(ENABLE);                                   //使能PLL时钟  

  59.      

  60.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL时钟就绪  

  61.     {  

  62.     }  

  63.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系统时钟 = PLL时钟  

  64.     while(RCC_GetSYSCLKSource() != 0x08)                  //检查PLL时钟是否作为系统时钟  

  65.     {  

  66.     }  

  67.   }  

  68.     

  69.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);  //允许 GPIOB、AFIO时钟  

  70. }  

  71.   

  72. /************************************************* 

  73. 函数: void GPIO_Configuration(void) 

  74. 功能: GPIO配置 

  75. 参数: 无 

  76. 返回: 无 

  77. **************************************************/  

  78. void GPIO_Configuration(void)  

  79. {  

  80.   GPIO_InitTypeDef GPIO_InitStructure;        //定义GPIO初始化结构体  

  81.   

  82.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;   

  83.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   

  84.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  85.   GPIO_Init(GPIOA, &GPIO_InitStructure);       //PA用于输出控制LED灯  

  86.   

  87.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;   

  88.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   

  89.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入  

  90.   GPIO_Init(GPIOB, &GPIO_InitStructure);       //PB.0用于接受按键k1输入  

  91.   

  92.     

  93.   

  94. }  

  95.   

  96. void NVIC_Configuration(void)    //中断分组和优先级配置    详见《STM32的函数说明(中文).pdf》P165  

  97. {  

  98.     NVIC_InitTypeDef NVIC_InitStructure;  

  99.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  //0组,先占优先级0位,从优先级4位  

  100.     NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //外部中断线 0 中断  

  101.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;    //0组无抢占优先级,所以只配置从优先级,即响应式优先级  

  102.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能  

  103.     NVIC_Init(& NVIC_InitStructure); //初始化配置  

  104. }  

  105.   

  106. void EXTI_Configuration(void)  //中断配置  //详见《STM32的函数说明(中文).pdf》   P99  

  107. {  

  108.     EXTI_InitTypeDef EXTI_InitStructure;          

  109.   

  110.     EXTI_ClearITPendingBit(EXTI_Line0);//清除 EXTI 线路挂起位  

  111.   

  112.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求  

  113.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设置输入线路下降沿为中断请求  

  114.     EXTI_InitStructure.EXTI_Line = EXTI_Line0; //外部中断线 0  

  115.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能  

  116.     EXTI_Init(& EXTI_InitStructure); //初始化配置  

  117.       

  118.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);    ///*将EXTI线0连接到PB0*/  

  119. }  

  120.   

  121.   

  122. /********************************************************* 

  123.                 中断服务程序 

  124. *********************************************************/  

  125. void EXTI0_IRQHandler()   //按下按钮还是放开按钮是下降沿??  

  126. {  

  127.      if(EXTI_GetITStatus(EXTI_Line0) == SET)//检查指定的EXTI线路触发请求发生与否,返回一个EXTI_Line新状态  

  128.       {  

  129.             EXTI_ClearITPendingBit(EXTI_Line0);//清除线路挂起位  

  130.             EXTI_ClearFlag(EXTI_Line0);//清除中断挂起位   

  131.             GPIO_SetBits(GPIOA,GPIO_Pin_0);//点亮LED                  

  132.             delay_ms(500);//延时  

  133.             GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭  

  134.             if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0))  GPIO_SetBits(GPIOA,GPIO_Pin_2);//点亮LED  

  135.             else  GPIO_ResetBits(GPIOA,GPIO_Pin_2);//灭  

  136.        }   

  137. }  


可另行参考文章:

STM32学习笔记之EXTI(外部中断)http://blog.sina.com.cn/s/blog_6623834301018woa.html


参考资料:STM32数据手册、网络资料

=========================================分割线=========================================

       外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置

输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独

立的屏蔽。挂起寄存器保持着状态线的中断要求。

=========================================分割线=========================================

19个中断如下:

未命名

17——EXTI线16连接到PVD输出

18——EXTI线17连接到RTC闹钟事件

19——EXTI线18连接到USB唤醒事件

 

注:有上图可知EXTI0连接的引脚为PA0、PB0、PC0、PD0、PE0、PF0、PG0,其他外部中断EXTI1——

EXTI15类似。所以在使用时尽量将需要的外部中断配置在不同的EXTIx上。

      例如需要3个外部中断,我们可以配置到PA0、PB4、PG3上,此时每个中断都有自己的中断处理程

     序段。如果配置到PA0、PB0、PC1,则PA0和PB0将公用一个中断程序段。当然如果特殊需要,也

     可以这样设计。

=========================================分割线=========================================

配置使用方法:

  1. 初始化相应的GPIO管脚

  2. 配置外部中断源并进行中断源和GPIO的连接

  3. 编写相应中断源的中断处理程序

=========================================分割线=========================================

程序代码

  • 初始化相应的GPIO管脚

GPIO_InitTypeDef GPIO_InitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);           
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
GPIO_Init(GPIOE, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
GPIO_Init(GPIOB, &GPIO_InitStructure);

注:GPIO的复用功能必须打开,如红字部分

  • 配置外部中断源并进行中断源和GPIO的连接


GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);

 
EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1|EXTI_Line8|EXTI_Line9;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

  • 编写相应中断源的中断处理程序


void EXTI0_IRQHandler(void)
{
  if(Sys_Status > MIN_STATUS)
  {
    Sys_Status --;
  }
  EXTI_ClearITPendingBit(EXTI_Line0);
}


void EXTI1_IRQHandler(void)
{
  PEout(2) = ~PEout(2);
  EXTI_ClearITPendingBit(EXTI_Line1);
}


#define Exti_From_Pin8 0x00000100
#define Exti_From_Pin9 0x00000200

void EXTI9_5_IRQHandler(void)
{

  u32 Temp = 0x00; 

  PEout(2) = ~PEout(2);
  Temp = EXTI->PR;       //取读是那个引脚的中断
  switch(Temp)
  {
    case Exti_From_Pin8:
      EXTI_ClearITPendingBit(EXTI_Line8);
      break;
    case Exti_From_Pin9:
      if(Sys_Status < MAX_STATUS)
      {
        Sys_Status ++;
      }
      EXTI_ClearITPendingBit(EXTI_Line9);
      break;
    default:break;
  }
}

=========================================分割线=========================================

中断处理程序说明,由于外部中断EXTI5——EXTI9公用了一个中断(EXTI10——EXTI15类似)所以要

区分不同的中断源需要进行相应的判断。如上EXTI9_5_IRQHandler中,通过取读EXTI->PR寄存器来判

断中断的来源。


关键字:STM32  单片机  外部中断 引用地址:STM32单片机(2) 外部中断

上一篇:STM32单片机(3) 串口中断通信
下一篇:STM32单片机(1) 总记 学习资料+参考手册+LED灯

推荐阅读最新更新时间:2024-03-16 16:03

51单片机入门实验
/************************************************************************************** * 静态数码管显示实验 * 实现现象:下载程序后数码管静态显示0。 注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。 ***************************************************************************************/ #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器
[单片机]
51单片机实验(一)定时/计数器及其中断
我们这学期开了单片机的课,不知道为什么我们要用汇编语言写程序,感觉汇编程序真的挺难写的,所以把实验记录下来把。 如果没有学过汇编的小伙伴建议先去熟悉一下简单的汇编指令,之前简单的实验我就不记录了,我们从定时计数器实验开始吧。 首先来回顾一下和中断,定时有关的知识 51单片机中断级别 中断源 中断允许寄存器IE EA---全局中允许位。 EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。 EA=0,关闭全部中断。 -------,无效位。 ET2---定时器/计数器2中断允许位。 EA总中断开关,置1为开; ET2=1,打开T2中断。 EX0为外部中断0(INT0)开关,…… ET
[单片机]
51<font color='red'>单片机</font>实验(一)定时/计数器及其中断
STM32基础知识2-分享PWM输入模式捕捉4路PWM波形的周期和占空比
前几天分享过一个帖子,因为网速原因没有上传源码,看到有人回复我说实验不成功,那么好吧!这是我的错误,这次就将源码和我的心得体会分享出来,供大家下载测试和成长。我其实也是菜鸟一个,如果讲解的地方有啥不对,或是程序设计的不好,欢迎大家提出意见,让我们一起来学习进步。 PWM输入是输入捕获的一个特殊应用,输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中。你可以开启捕获中断然后在中断处理函数中读出保存的计数值。 与输入捕获不同的是PWM输入模式会将同一个输入信号(TI1或TI2)连接到两个捕获装置(IC1和IC2)。这两个捕获装置一个捕获上升沿一个捕获下降沿。TI1FP1、TI2
[单片机]
<font color='red'>STM32</font>基础知识2-分享PWM输入模式捕捉4路PWM波形的周期和占空比
51单片机—用蜂鸣器播放音乐
#include reg52.h #include ./delay/delay.h //sbit key1 = P1^0; sbit beep = P2^7; #define SEGPORT P0 #define KEYPORT P1 sbit bit_select = P2^0; sbit seg_select = P2^1; unsigned char segdata = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char bitdata = {0xfe,0xfd,0xfb
[单片机]
基于51单片机GSM模块的家庭火灾报警系统设计
一.硬件方案 本设计利用被动式热释电型红外传感器检测人体辐射的红外线,当检测到红外信号变化时,将其转化为微弱的电信号,经过信号处理电路对电信号进行滤波、放大、比较、输出高电平作为告警信息送给MCU,MCU判断是否报警,如果满足报警条件,就会发出控制信号,通过串行通信接口RS232,控制GSM短信模块给用户发短信息,实现防盗报警。 主要由DS18B20温度传感器+MQ-2烟雾传感器+HC-SR501人体红外模块+SIM800C GSM模块+LCD1602显示屏组成;如图: 二.设计功能 (1)可检测环境温度、烟雾浓雾和人体信号并通过显示屏显示。 (2)可通过按键设置报警值,当检测值超过报警值时进行报警。 (3)报警可通过LE
[单片机]
基于51<font color='red'>单片机</font>GSM模块的家庭火灾报警系统设计
51单片机学习笔记8 -- OLED显示(SPI)
1.OLED简介 有机发光二极管(Organic Light-Emitting Diode, OLED)又称为有机电激光显示、有机发光半导体。由美籍华裔教授邓青云(Ching W. Tang)于1979年在实验室中发现。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低耗电、极高反应速度等优点。 1.2 OLED结构 由基板、阴极、阳极、空穴注入层(HIL)、电子注入层(EIL)、空穴传输层(HTL)、电子传输层(ETL)、电子阻挡层(EBL)、空穴阻挡层(HBL)、发光层(EML)等部分构成。其中,基板是整个器件的基础,所有功能层都需要蒸镀到器件的基板上;通常采用玻璃作为器件的基板,但是如果需要制作可弯曲的柔性
[单片机]
51<font color='red'>单片机</font>学习笔记8 -- OLED显示(SPI)
STM32——GPIO的CRL、CRH和CNF与MODE的关系
GPIO的CRL、CRH和CNF与MODE的关系 STM32的CRL控制着每个IO端口的位占用CRL的4个位,高两位为CNF,低两位为MODE。 CRH的作用和CRL完全一样,只是CRL控制的是低8位输出口,而CRH控制的是高8位输出口。
[单片机]
基于STM32对DS1302的驱动
// 程序名: STM32驱动DS1302 //头文件 #include “stm32f10x.h” #include “usart.h” #define uchar unsigned char #define uint unsigned int ////DS1302引脚定义,可根据实际情况自行修改端口定义 #define RST PAout(5) #define IO PAout(6) #define SCK PAout(7) //DS1302地址定义 #define ds1302_sec_add 0x80 //秒数据地址 #define ds1302_min_add 0x82 //分数据地址 #define ds1302_
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved