STM32F407之EXTI

       外部中断/事件控制器包括用于生成高达23个事件/中断的请求。每条中断线可独立配置选择类型(响应或挂起)和相应的触发事件(上升或下降或两者)。每一中断线可以独立屏蔽。有一个挂起寄存器维持中断线的状态请求。

 

EXTI线0~15连接到PX0~15(可编程配置)

EXTI线16连接到PVD的输出事件
EXTI线17连接到RTC报警事件
EXTI线18连接的USB OTG FS唤醒事件
EXTI线19连接到以太网唤醒事件
EXTI线20连接的USB OTG HS(在FS配置)唤醒事件
EXTI线21连接到RTC的篡改和TimeStamp事件
EXTI线22连接到RTC唤醒事件

 

 设置步骤:

1.     使能相关时钟

2.     设置中断优先级分组(如果之前没有设置),这个最好一个程序里只在开头设置一次。

3.     设置中断线所要连接到的IO的输入模式

4.     设置屏蔽寄存器,不能把中断屏蔽掉

5.     设置中断方式

6.     把中断线连接到IO口

7.     设置中断优先级

8.     使能中断线

9.     编写中断服务函数(函数名是固定的)

10.  中断服务函数里检查是哪个中断挂起

11.  编写相应的程序

12.  清除中断挂起


程序1:

/************************************  
    标题:操作EXTI的练习  
    软件平台:IAR for ARM6.21  
    硬件平台:stm32f4-discovery  
    主频:168M  
      
    author:小船  
    data:2012-01-17  
*************************************/  
  
#include <stm32f4xx.h>   
  
void Led_Init (void);  
  
void main ()  
{     
    
  RCC->AHB1ENR |= 0x00000009; //使能GPIOD和GPIOA时钟  
  RCC->APB2ENR |= (1<<14);  //使能syscfg时钟  
  
  SCB->AIRCR = 0x05FA0000 | 0x400;  //中断优先级分组 抢占:响应=3:1  
    
  Led_Init();  
    
  GPIOA->MODER &= 0xFFFFFFFC; //浮空输入模式  
  GPIOA->PUPDR &= 0xFFFFFFFC;   
    
  EXTI->IMR |= ( 1 << 0 );  //不屏蔽外中断线0  
    
  EXTI->FTSR |= ( 1 << 0 ); //下降沿触发  
    
  SYSCFG->EXTICR[0] &= 0xFFFFFF00;  //配置外中断线0到PA口  
    
  NVIC->IP[6] = 0xe0;   //最低抢占优先级,最高响应优先级1110  
    
  NVIC->ISER[0] |= (1<<6);  //使能中断线6,也就是外中断0  
    
    
  while(1)  
  {  
  };  
}  
  
  
void Led_Init()  
{  
  GPIOD->MODER &= 0x00FFFFFF; //设置PD12,13,14,15输出  
  GPIOD->MODER |= 0x55000000;   
    
  GPIOD->OTYPER &= 0xFFFF0FFF; //设置PD12,13,14,15推挽输出  
    
  GPIOD->OSPEEDR &= 0x00FFFFFF; //PD12,13,14,15 速度100m  
  GPIOD->OSPEEDR |= 0xff000000;  
    
  GPIOD->PUPDR &= 0x00FFFFFF;  //PD12,13,14,15 无上拉无下拉  
    
  GPIOD->BSRRH = 0xf000;  //reset register GPIOx_BSRRH, write only  
                          //set register GPIOx_BSRRL, write only  
  SYSCFG->CMPCR = 0x00000001; //使用IO补偿单元  
}  
  
void EXTI0_IRQHandler(void)  
{  
  uint32_t tmp;  
  if(EXTI->PR & 0x00000001 != 0)  //检查是不是外中断0挂起  
  {  
    tmp = (~GPIOD->ODR) & 0x0000f000;   //PD15 14 13 12翻转,板子上四个LED的亮灭  
    GPIOD->ODR &= 0xffff0fff;  
    GPIOD->ODR |= tmp;  
      
    EXTI->PR = (1<<0);  //外中断0解除挂起  
  }  
}


程序2:

//比如要是使用GPC3作为中断源,上升沿触发
//外部中断必须配置好EXTI和NVIC
//使用以下函数打开SYSCFG的时钟
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE)

//GPIO设置如下
void GPIO_Configuration(void)
{

	GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOF Periph clock enable */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//注意要打开SYSCFG时钟

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/*
因为要用的IO口做中断源,故IO的复用功能必须使能,F4的与F103的有些不同,它的外部中断复用功能是由SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOx,GPIO_PinSourcex);  进行配置的。
*/
void EXTI_Configuration(void)
{
	EXTI_InitTypeDef EXTI_InitStructure;


    //GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3);
 //这是以前的F103所用的配置函数
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource3);    //407使用的配置函数
	EXTI_InitStructure.EXTI_Line = EXTI_Line3;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
}

//设置外部中断源和优先级
void NVIC_Config(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
  /* Enable the USARTx Interrupt */
	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}


//中断处理函数
void EXTI3_IRQHandler(void)
{

	if(EXTI_GetITStatus(EXTI_Line3) != RESET)
	{
		do something();

		EXTI_ClearITPendingBit(EXTI_Line3);
		printf("EXTI3_IRQHandler\r\n");
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值