Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9178189
  • 博文数量: 1728
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 19870
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1728)

文章存档

2024年(4)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: Android平台

2017-08-31 17:53:04

http://blog.csdn.net/flydream0/article/details/8208463
http://blog.csdn.net/flydream0/article/details/8209042


这张图是一条外部中断线或外部事件线的示意图  ,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19.
图中的蓝色虚线箭头,标出了外部中断信号的传输路,

  1. 首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输出到NVIC中断检测电路,
  2. 2号 这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了.
  3. 3号 或门,这个或门的另一个输入是软件中断/事件寄存器,从这里可以看出,软件可以优先于外部信号请求一个中断或事件,即当软件中断/事件寄存器的对应位为"1",不管外部信号如何,编号3的或门都会输出有效信号.即软件可以模拟一个中断信号处理出来. 一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器
  4. 到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化.
  5. 外部请求信号最后经过编号4的与门,NVIC中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为"0",则该请求信号不能传输到与门的另一端,实现了中断的屏蔽.


明白了外部中断的请求机制,就很容易理解事件的请求机制了
红色虚线箭头,标出了外部事件信号的传输路径
外部请求信号经过编号3的或门后,进入编号5的与门,
5号与门的作用与编号
4的与门类似,用于引入事件屏蔽寄存器的控制;最后脉冲发生器的一个跳变的信号转变为一个单脉冲,输出到芯片中的其它功能模块.
从这张图上我们也可以知道,从外部激励信号来看,中断和事件的产生源都可以是一样的.之所以分成2个部分,由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;
但是事件,是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等;

简单举例:
外部
I/O触发AD转换,来测量外部物品的重量;
如果使用传统的中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;
要是使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果;
相比之下,事件不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务了。


总结:

可以这样简单的认为,事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法;




//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

1.GPIO 的正确设置

[cpp] view plain copy
  1. GPIO_InitTypeDef GPIO_InitStructure;  
  2. /* Enable GPIOD clock */  
  3. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);  
  4.   
  5. /* Configure PD.03, PC.04, as input floating */  
  6. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ;  
  7.   
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  9. GPIO_Init(GPIOD, &GPIO_InitStructure);  
  10.   
  11. GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3); //PD3作为外部中断引脚  


其中GPIO_EXITLineConfig函数的声明如下:

[cpp] view plain copy
  1. /** 
  2. * @brief Selects the GPIO pin used as EXTI Line. 
  3. * @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines. 
  4. * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G). 
  5. * @param GPIO_PinSource: specifies the EXTI line to be configured. 
  6. * This parameter can be GPIO_PinSourcex where x can be (0..15). 
  7. * @retval None 
  8. */  
  9. void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)  


2.中断初始化

[cpp] view plain copy
  1. EXTI_InitTypeDef EXTI_InitStructure;  
  2.   
  3. // Configure EXTI Line3 to generate an interrupt on falling edge  
  4. EXTI_InitStructure.EXTI_Line = EXTI_Line3;  
  5. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  
  6. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
  7. EXTI_InitStructure.EXTI_LineCmd = ENABLE;  
  8. EXTI_Init(&EXTI_InitStructure);  
  9. GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource4);  
  10.   
  11. // Configure EXTI Line4 to generate an interrupt on falling edge  
  12. EXTI_InitStructure.EXTI_Line = EXTI_Line4;  
  13. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  
  14. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
  15. EXTI_InitStructure.EXTI_LineCmd = ENABLE;  
  16. EXTI_Init(&EXTI_InitStructure);  


3.在NVIC_Configuration 中Configures the NVIC and Vector Table base address.

[cpp] view plain copy
  1. /* Configure the Priority Group to 2 bits */  
  2. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
  3. /* enabling interrupt */  
  4. NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQChannel;  
  5. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  
  6. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  7. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  8. NVIC_Init(&NVIC_InitStructure);  
  9.   
  10. /* Enable the EXTI3 Interrupt on PD.3 */  
  11. NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;  
  12. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  
  13. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  14. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  15. NVIC_Init(&NVIC_InitStructure);  
  16. /* Enable the EXTI4 Interrupt on PD.4 */  
  17. NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel;  
  18. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  
  19. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
  20. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  21. NVIC_Init(&NVIC_InitStructure);  


4.在stm32f0x_it.c 中写入 中断处理函数

[cpp] view plain copy
  1. /******************************************************************************* 
  2. * Function Name : EXTI3_IRQHandler 
  3. * Description : This function handles External interrupt Line 3 request. 
  4. * Input : None 
  5. * Output : None 
  6. * Return : None 
  7. *******************************************************************************/  
  8. void EXTI3_IRQHandler(void)  
  9. {  
  10.     if(EXTI_GetITStatus(EXTI_Line3) != RESET)  
  11.     {  
  12.         // Led_RW_ON();  
  13.         GPIO_SetBits(GPIOC, GPIO_Pin_4| GPIO_Pin_5 );  
  14.   
  15.   
  16.         /* Clear the EXTI line 9 pending bit */  
  17.         EXTI_ClearITPendingBit(EXTI_Line3);  
  18.     }  
  19. }  
  20.   
  21. /******************************************************************************* 
  22. * Function Name : EXTI4_IRQHandler 
  23. * Description : This function handles External interrupt Line 4 request. 
  24. * Input : None 
  25. * Output : None 
  26. * Return : None 
  27. *******************************************************************************/  
  28. void EXTI4_IRQHandler(void)  
  29. {  
  30.     if(EXTI_GetITStatus(EXTI_Line4) != RESET)  
  31.     {  
  32.         //Led_RW_OFF();  
  33.         GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5);  
  34.         /* Clear the EXTI line 9 pending bit */  
  35.         EXTI_ClearITPendingBit(EXTI_Line4);  
  36.     }  
  37. }  


阅读(6708) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~