打印
[STM32F4]

stm32f407之EXTI(操作寄存器)

[复制链接]
764|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
energy1|  楼主 | 2015-3-29 23:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
六、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.  清除中断挂起



程序:
[plain] view plaincopy


  • /************************************  
  •     标题:操作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解除挂起  
  •   }  
  • }


沙发
Vitality1| | 2015-3-30 00:03 | 只看该作者
外部中断/事件控制器包括用于生成高达23个事件/中断的请求

使用特权

评论回复
板凳
lovecat2015| | 2015-3-30 16:43 | 只看该作者
这个是讲中断请求的,得认真看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

94

主题

422

帖子

10

粉丝