STM32单片机学习(2) 外部中断

发布者:TranquilBreeze最新更新时间:2016-05-12 来源: 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的响应优先级决定谁先响应;
抢占优先级高的可以打断抢占优先级低的中断,响应式则不能
数字越小,优先级越高

 

 

中断配置步骤

 

STM32单片机学习(2) 外部中断


 

源代码

 

/*
*	
* 软件功能:	 中断闪灯实验(软件延时方式) 按键中断
* 
*/
#include "stm32f10x.h"
#include 
#include "delay.h"



void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void EXTI_Configuration(void);

/*
函数: int main(void)
功能: main主函数
参数: 无
返回: 无
/
int main(void)
{
  RCC_Configuration();
  GPIO_Configuration();
  delay_init(72);
  NVIC_Configuration();
  EXTI_Configuration();
  GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭	  
  GPIO_ResetBits(GPIOA,GPIO_Pin_2);//灭
  while(1);
}


/*
函数: void RCC_Configuration(void)
功能: 复位和时钟控制 配置
参数: 无
返回: 无
/
void RCC_Configuration(void)
{
  ErrorStatus HSEStartUpStatus;                    //定义外部高速晶体启动状态枚举变量
  RCC_DeInit();                                    //复位RCC外部设备寄存器到默认值
  RCC_HSEConfig(RCC_HSE_ON);                       //打开外部高速晶振
  HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速时钟准备好
  if(HSEStartUpStatus == SUCCESS)                  //外部高速时钟已经准别好
  {
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后
    FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延时
      	
    RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)时钟等于==SYSCLK
    RCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)钟==AHB时钟
    RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)钟==AHB1/2时钟
         
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz
    RCC_PLLCmd(ENABLE);                                   //使能PLL时钟
   
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL时钟就绪
    {
    }
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系统时钟 = PLL时钟
    while(RCC_GetSYSCLKSource() != 0x08)                  //检查PLL时钟是否作为系统时钟
    {
    }
  }
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);  //允许 GPIOB、AFIO时钟
}

/*
函数: void GPIO_Configuration(void)
功能: GPIO配置
参数: 无
返回: 无
/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;        //定义GPIO初始化结构体

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_Init(GPIOA, &GPIO_InitStructure); 	   //PA用于输出控制LED灯

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入
  GPIO_Init(GPIOB, &GPIO_InitStructure); 	   //PB.0用于接受按键k1输入

  

}

void NVIC_Configuration(void)	 //中断分组和优先级配置	 详见《STM32的函数说明(中文).pdf》P165
{
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);	 //0组,先占优先级0位,从优先级4位
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //外部中断线 0 中断
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 	  //0组无抢占优先级,所以只配置从优先级,即响应式优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
	NVIC_Init(& NVIC_InitStructure); //初始化配置
}

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

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

	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设置输入线路下降沿为中断请求
	EXTI_InitStructure.EXTI_Line = EXTI_Line0; //外部中断线 0
	EXTI_InitStructure.EXTI_LineCmd	= ENABLE;//使能
	EXTI_Init(& EXTI_InitStructure); //初始化配置
	
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);	 ///*将EXTI线0连接到PB0*/
}


/*
                中断服务程序
*/
void EXTI0_IRQHandler()	  //按下按钮还是放开按钮是下降沿??
{
	 if(EXTI_GetITStatus(EXTI_Line0) == SET)//检查指定的EXTI线路触发请求发生与否,返回一个EXTI_Line新状态
      {
            EXTI_ClearITPendingBit(EXTI_Line0);//清除线路挂起位
            EXTI_ClearFlag(EXTI_Line0);//清除中断挂起位 
            GPIO_SetBits(GPIOA,GPIO_Pin_0);//点亮LED                
            delay_ms(500);//延时
			GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭
			if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0))  GPIO_SetBits(GPIOA,GPIO_Pin_2);//点亮LED
			else  GPIO_ResetBits(GPIOA,GPIO_Pin_2);//灭
       } 
}

 

可另行参考文章:

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

 

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

==================================================================================

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

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

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

==================================================================================

19个中断如下:

STM32单片机学习(2) 外部中断

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单片机学习(12) 红外信号接收解码(外部中断)

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

FPGA和STM32的区别是什么 stm32与fpga的优缺点分析
FPGA基本原理和内部结构 一、FPGA原理 FPGA中的基本逻辑单元是CLB模块,一个CLB模块一般包含若干个基本的查找表、寄存器和多路选择器资源,因此FPGA中的逻辑表达式基于LUT的。 FPGA内部的编程信息一般存储在SRAM单元中,因此通常的FPGA都是基于SRAM的,所以掉电后信息会丢失,下次上电需要先配置才能使用。 着重介绍Xilinx FPGA, 二、FPGA产品的速度等级 速度等级一般反映一款芯片的性能,速度等级越高,说明芯片内的逻辑延时和布线延时越小,设计的性能要求也越容易达到,随之付出的成本也越大。 对Xilinx FPGA,速度等级一般有“-1”、“-2”、“-3”等,数字越大,速度等级越高,芯片价钱
[单片机]
FPGA和<font color='red'>STM32</font>的区别是什么 <font color='red'>stm32</font>与fpga的优缺点分析
STM32】GPIO工作原理(八种工作方式分析,附电路图)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO ) 芯片数据手册(datasheet) STM32的GPIO介绍 STM32引脚说明 GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F103ZET6芯片为144脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同时每组GPIO口组有16个GPIO口。通常简略称为PAx、PBx、PCx、PDx、PEx、
[单片机]
【<font color='red'>STM32</font>】GPIO工作原理(八种工作方式分析,附电路图)
初探STM32 SPI2中断接受多组数据的处理方式
一、描述 两块STM32板子之间进行SPI通讯,都使用的是SPI2。主机连续发送多组数据(数据的格式为半字,即16位),从机采用SPI2中断方式接受主机发过来的多组数据。 针对从机中断接受方法我尝试了两种方案: 方案一:从机每接收主机发来的一组数据就进入中断一次,即主机发来几组数据从机就进入几次中断。 方案二:仅当主机发来第一组数据时,从机才触发一次中断,然后关闭中断,以循环接受的方式接受主机发过来的剩下几组数据,当所有数据接受完后,再打开从机的接受中断。 二、程序 因为两种方案的主机程序是一样的,如下: uint16_t ADC_ConvertedValueLocal ; uint8_
[单片机]
基于STM32、STM8处理器万能试验机的多个功能模块设计
基于STM32、STM8处理器,设计完成了万能试验机的多个功能模块。为了提高小信号的采集精度与速度,用多处理器设计了一种混合式的锁相放大器,并运用数字处理进行进一步处理,具有很高的性价比。在位移信号采集中。运用STM8S实现了低成本的设计。实验表明,本系统在速度与精度上满足万能试验机要求,总体性价比高。 万能材料试验机是一种配备全数字化测量控制系统的试验机,主要用于橡胶、塑料、金属、水泥等材料拉伸剥离等力学性能试验。材料试验机作为一种精密测试仪器,对于材料科学的发展,工业产品和工程结构设计,有效的使用材料,改进工艺,减轻产品重量和缩小体积,提高产品质量和降低成本,以及保证产品安全可靠,提高使用寿命,都具有极其重要的作用。目
[单片机]
STM32芯片异常复位的原因有哪些
问题描述 某STM32用户反馈,当使用STM32L4芯片的时候,程序运行一段时间后,会忽然复位。复位后程序继续运行,但是还会继续复位,原因不详。 问题解析 初步确定复位的原因,是硬件复位,如外部NRST被拉低,还是软件复位,包括软件直接调用复位,或者看门狗复位,还是低功耗模式如standby模式被唤醒时产生中断。 查看复位状态寄存器了解复位大方向,然后做进一步得拆解分析。 目前客户项目的复位原因是因为看门狗复位,即客户使用了IWDG,但由于某种原因没有及时喂狗,导致IWDG超时复位。初步怀疑由于客户软件的问题,程序跑飞,进入异常处理。 因为客户的异常处理函数中并没有做任何动作,导致独立看门狗IWDG复位。基于此,我
[单片机]
<font color='red'>STM32</font>芯片异常复位的原因有哪些
STM32 HAL固件库编程的文件构架
  对于我这种以前只接触过51和AVR单片机编程的小菜来说,现在开始学习STM32的编程,对于函数的功能以及C语言的语法都还好理解,难的是它提供的那一套硬件抽象层(HAL)驱动是怎么和其他的东东搭配在一起组成一个又一个的工程。   首先上两张从ST官方提供的HAL固件库文档截图 从这两张图的话,能对它的构架看出个一二,下面稍稍具体一点分析   HAL固件库编程,它的文件组织大致分三个部分     - HAL驱动     - CMSIS驱动     - 用户编写程序 而假如你使用的是ST官网的开发板,那么你还有一套现成的驱动可供使用,板级支持包(BSP),那么正好向我一样,但是,我不太喜欢使用这个东西,能自己写还是自己写的好。
[单片机]
<font color='red'>STM32</font> HAL固件库编程的文件构架
STM32 编译指令 #pragma pack 的配对使用
#pragma pack 可以用来指定数据结构的成员变量的内存对齐数值。 可选值为: 1、2、4、8、16。 使用 pack 指令要配对使用,以避免意外影响项目中其他源文件的结构成员的内存对齐。 如果影响了其他源文件的结构成员内存对齐,那么在你按照默认对齐来计算那些结构成员占用内存大小或者使用指针移动计算结构成员偏移位置的时候,就可能会出现意料之外的异常。 主要可能的异常是内存定位错误或非法内存访问,结果可能导致错误的定位或数值,极端的情况下可能导致程序崩溃。 下面的例子用来展示基本的配对使用方式。 1)#pragma pack(n)的配对使用 #pragma pack(1) //内存对齐设置为1个字节
[单片机]
142条STM32遇到的坑,你知道几个?
1、AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2 1,意思是APB2接高速设备。 2、Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用 3、HSE Osc(High Speed External Oscillator)高速外部晶振,一般为8MHz,HSI RC(High Speed InternalRC)高速内部RC,8MHz 4、LSE Osc(Low Speed External Oscillator)低速外部晶振,一般为32.768KHz,LSI RC(Low Speed InternalR
[单片机]
142条<font color='red'>STM32</font>遇到的坑,你知道几个?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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