单片机
返回首页

STM32之EXTI

2017-11-26 来源:eefocus

STM32因为具有NVIC使其中断体系大大提升,NVIC使用来管理异常与中断的,并且NVIC模块中还包含SysTick。

这次我们来讲一下EXTI外部中断。

 

1.在用到时我们必须要设置中断向量表,我们要将中断向量表存储在一个固定的位置,究竟是RAM还是FLASH就得看你的需求了。

 

2.STM32中中断优先级分组总共有四种分组方式,我们只能用其中的一组。所以在设置完毕中断向量表的存储位置后我们就得选择合适我们的中断优先级分组。(这一部分可以我的STM32之NVIC一文)

 

3.然后你要使用哪个外部中断就对此中断设置抢占优先级,亚优先级,以及打开。

 

4.然后就是相应中断的模式,方式,等配置了

 

5.设置相应的引脚为输入浮空

 

下面我们上两个框图看一下:

 

这里我们可以形象的看到STM32共有64个外部中断,公用16个外部中断通道,并与NVIC中断分组里的16级对应起来

 

通过这张图我们可以清楚的看到中断或者事件相应的过程,如果有什么不清楚的请回复我会继续补充

 

下面我们就把程序拿上来,供大家做参考(基于V3.3.0的库)

 


  1. /******************************************************************************** 

  2.   * @file    EXTI/main.c  

  3.   * @author  swei 

  4.   * @version V3.3.0 

  5.   * @date    04/16/2010 

  6.   * @brief   Main program body. 

  7.   ******************************************************************************/  

  8. #include 'stm32f10x.h'  

  9. void RCC_Configuration(void);   //时钟配置函数  

  10. void NVIC_Configuration(void);  //NVIC配置函数  

  11. void EXTI_Configuration(void);  //外部中断配置函数  

  12. void GPIO_Configuration(void);  //GPIO配置函数  

  13. int main(void)  

  14. {  

  15.     RCC_Configuration();  

  16.     NVIC_Configuration();  

  17.     GPIO_Configuration();  

  18.     EXTI_Configuration();  

  19.     while(1)  

  20.     {  

  21.       

  22.     }  

  23. }  

  24. void RCC_Configuration(void)               //时钟配置,如果不明白请看我的STM32之RCC一文  

  25. {  

  26.     RCC_DeInit();  

  27.     RCC_HSEConfig(RCC_HSE_ON);  

  28.     while(!RCC_WaitForHSEStartUp());  

  29.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  

  30.     FLASH_SetLatency(FLASH_Latency_2);  

  31.     RCC_HCLKConfig(RCC_SYSCLK_Div1);  

  32.     RCC_PCLK2Config(RCC_HCLK_Div1);  

  33.     RCC_PCLK1Config(RCC_HCLK_Div2);  

  34.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);  

  35.     RCC_PLLCmd(ENABLE);  

  36.     while(!(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==SET));  

  37.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  

  38.     while(!(RCC_GetSYSCLKSource()==0x08));  

  39.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);//打开相应模块的时钟  

  40. }  

  41. void NVIC_Configuration(void)  

  42. {  

  43.     NVIC_InitTypeDef NVIC_InitStructure;  

  44. #ifdef  VECT_TAB_RAM                                 //条件编译,对异常向量表进行配置(放在RAM还是FLASH)  

  45.     NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);  

  46. #else  

  47.     NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);  

  48. #endif  

  49.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  //选择中断优先级分组,此处选择0。使0级抢占式优先级,16级亚优先级  

  50.     NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;        //相应的通道配置,此处选择中断通道  

  51.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //抢占式优先级配置  

  52.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;          //亚优先级配置  

  53.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //时能通道  

  54.     NVIC_Init(&NVIC_InitStructure);                             //使用结构体完成配置  

  55. }  

  56. void EXTI_Configuration(void)                                   //相应的中断配置  

  57. {  

  58.     EXTI_InitTypeDef EXTI_InitStructure;  

  59.     EXTI_DeInit();                                              //还原到默认配置  

  60.     EXTI_InitStructure.EXTI_Line = EXTI_Line15;                 //选择中断线  

  61.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         //选择中断模式  

  62.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;     //选择中断方式  

  63.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   //时能中断  

  64.     EXTI_Init(&EXTI_InitStructure);  

  65. }  

  66. void GPIO_Configuration(void)                                   //GPIO引脚的配置,如果不明白请看我的STM32之GPIO一文  

  67. {  

  68.     GPIO_InitTypeDef GPIO_InitStructure;  

  69.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  

  70.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;  

  71.     GPIO_Init(GPIOB,&GPIO_InitStructure);  

  72.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

  73.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  74.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;  

  75.     GPIO_Init(GPIOA,&GPIO_InitStructure);  

  76. }  

  77. /******************* (C) COPYRIGHT 2010 SWEI ********************END OF FILE****/  


 


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章