您的位置 首页 制造

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

李想stm32视频教程49集http://pan.baidu.com/s/1kTyt03PSTM32的中断(上中下)外部中断(寄存器、库函数)STM32的函数说明(中文).pdf…

李想stm32视频教程49集http://pan.baidu.com/s/1kTyt03PSTM32的中止(上中下)外部中止(寄存器、库函数)

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的呼应优先级决议谁先呼应;
抢占优先级高的能够打断抢占优先级低的中止,呼应式则不能
数字越小,优先级越高

中止装备过程

源代码

/**	* 软件功用:	 中止闪灯试验(软件延时方法) 按键中止* */#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)时钟等于==SYSCLKRCC_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 = 72MHzRCC_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; //外部中止线 0EXTI_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);//点亮LEDelse  GPIO_ResetBits(GPIOA,GPIO_Pin_2);//灭} }

可另行参阅文章:

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寄存器来判

断中止的来历。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/263922.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部