关于 EXTI 中断

关于 EXTI 中断

(2013-04-03 20:53:42)
 分类: STM32

一、EXTI 中断
      PA0,PB0,......PG0  共用一个中断标志 EXT0
      PA1,PB1,......PG1  共用一个中断标志 EXT1
      ...................................
      ...................................
      PA15,PA15,......PG15  共用一个中断标志 EXT15
      疑问:官方库函数有19条EXTI_Line,EXTI_Line0 -- EXTI_Line18,多出来的3条在哪里?
               祥见 EXTI_InitTypeDef.EXTI_Line 段落
二、在NVIC中:
      EXTI0--EXTI4各自有独立的IRQ_Channel,对应的中断服务函数是 void EXTI(n)_IRQHandler(void),(n)=0--4。
      EXTI5--EXTI9共用一个IRQ_Channel,对应的中断服务函数是 void EXTI9_5_IRQHandler(void)。
      EXTI10--EXTI15共用一个IRQ_Channel,对应的中断服务函数是 void EXTI15_10_IRQHandler(void)。
三、如何启用EXTI中断
      1 .启动所需GPIOn_Pin及AFIO的RCC时钟:
           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,RCC_APB2Periph_AFIO,ENABLE);
          !!!千万别忘记启动RCC_APB2Periph_AFIO!!!,否则管脚只能做普通高低电平来用。
      2 .用GPIO_InitStructure(用GPIO_InitTypeDef预先定义一下)设置所需GPIO口的Pin,Speed,Mode,

          然后用GPIO_Init(GPIOn,&GPIO_InitStructure)来启用这些GPIO的Pin。
      3 .用GPIO的中断线控制函数启动指定GPIO的某个Pin
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource7);
      4 .初始化中断,类似初始化GPIO
          a)定义一个初始化的结构变量 EXTI_InitTypeDef  EXTI_InitStructure;
             !!!这步应该在函数外预先声明名!!!
          b)输入该结构的成员值:EXTI_Line,EXTI_Mode,EXTI_Trigger,EXTI_LineCmd
          c)用EXTI_Init(&EXTI_InitStructure);完成初始化
          例:
             RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO , ENABLE );

             
            GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource7);

             
            EXTI_InitStructure.EXTI_Line = EXTI_Line7;
            EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
            EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
            EXTI_InitStructure.EXTI_LineCmd = ENABLE;
            EXTI_Init(&EXTI_InitStructure);
四、可以用软件模拟一个EXTI中断的产生,命令如下:
          EXTI_GenerateSWInterrupt(EXTI_Line7);//产生EXTI_Line7的中断。

五、对应的中断服务函数在 "stm32f10x_it.c" 中

六、需用的 ".c" 文件有:

         stm32f10x_rcc.c

         stm32f10x_nvic.c

         stm32f10x_gpio.c

         stm32f10x_exti.c

         stm32f10x_it.c

 原文:http://blog.sina.com.cn/s/blog_537d61430101a2t9.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于STM32F103ZE的霍尔测速传感器测转速的库函数代码,供参考: ```c #include "stm32f10x.h" #define HALL_SENSOR_PIN GPIO_Pin_0 #define HALL_SENSOR_PORT GPIOA #define HALL_SENSOR_EXTI_LINE EXTI_Line0 #define HALL_SENSOR_NVIC_IRQ EXTI0_IRQn volatile uint32_t hall_sensor_count = 0; void hall_sensor_init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 配置GPIO口 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = HALL_SENSOR_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(HALL_SENSOR_PORT, &GPIO_InitStructure); // 配置外部中断线 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = HALL_SENSOR_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // 配置NVIC中断 NVIC_InitStructure.NVIC_IRQChannel = HALL_SENSOR_NVIC_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(HALL_SENSOR_EXTI_LINE) != RESET) { hall_sensor_count++; EXTI_ClearITPendingBit(HALL_SENSOR_EXTI_LINE); } } uint32_t hall_sensor_get_rpm(void) { uint32_t rpm = 0; rpm = hall_sensor_count * 30; hall_sensor_count = 0; return rpm; } ``` 使用方法: 1. 在代码中调用 `hall_sensor_init()` 函数初始化霍尔传感器。 2. 调用 `hall_sensor_get_rpm()` 函数获取转速,单位为 RPM (Revolutions per Minute)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值