赞
踩
上图就是stm32f103可用的外部中断
EXTI 触发方式:上升沿触发,下降沿触发,双边缘触发,软件触发)支持GPIO_Pin0-----GAIO_Pin15所有引脚触发
中断屏蔽寄存器:可以控制中断通道的开关断开,事件屏蔽寄存器同理。
请求挂起寄存器:可以在检测到中断信号时置标志位。
事件响应和中断响应的区别:略
AFIO:可以选择中断引脚
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
-
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;//同时配置Pin0hePin1为输入模式
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
void GPIO_EventOutputCmd(FunctionalState NewState);
配置引脚重映射函数
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
配置AFIO选择引脚函数
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
void EXTI_DeInit(void);恢复到默认定义初始化状态
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);初始化EXTI
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);配置EXTI参数
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);软件触发外部中断
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);获取挂起标志位(多用于主程序)
void EXTI_ClearFlag(uint32_t EXTI_Line);清楚挂起标志位(多用于主程序)
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);获取中断触发标志位(多用于中断程序)
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);清楚中断触发标志位(多用于中断程序)
- EXTI_InitTypeDef EXTI_InitStructure;
- EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line1 ;//选择1和0两个中断线
- EXTI_InitStructure.EXTI_LineCmd=ENABLE ;
- EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//外部触发模式
- EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿触发
-
- EXTI_Init(&EXTI_InitStructure);
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn ;//中断通道0
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE ;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//响应优先级
- NVIC_Init(& NVIC_InitStructure);
-
-
- NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn ;//中断通道1
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE ;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
- NVIC_Init(& NVIC_InitStructure);
- void EXTI0_IRQHandler (void)//检测到Pin0口下降沿触发中断
- {
-
-
- if(EXTI_GetITStatus(EXTI_Line0)==SET)//判断中断挂起位
- {
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
- {
- count--;
- }
- EXTI_ClearITPendingBit(EXTI_Line0);//清除中断挂起位
- }
-
- }
- void EXTI1_IRQHandler(void)//检测到Pin1口下降沿触发中断
- {
- if(EXTI_GetITStatus(EXTI_Line1)==SET)
- {
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0)
- {
- count++;
- }
- EXTI_ClearITPendingBit(EXTI_Line1);
- }

10-15通道和5-9通道分别公用同一个中断服务函数名
- #include "stm32f10x.h"
-
- uint16_t count;//储存计次值
- void Encoder_Init(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
-
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
-
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
-
- EXTI_InitTypeDef EXTI_InitStructure;
- EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line1 ;
- EXTI_InitStructure.EXTI_LineCmd=ENABLE ;
- EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
-
- EXTI_Init(&EXTI_InitStructure);
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn ;
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE ;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
- NVIC_Init(& NVIC_InitStructure);
-
-
- NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn ;
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE ;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
- NVIC_Init(& NVIC_InitStructure);
- }
- int16_t ReceiveDate(void)
- {
- int16_t Temp;
- Temp=count;
- count=0;
- return Temp;//返回计次值到主函数
-
- }
- void EXTI0_IRQHandler (void)
- {
-
-
- if(EXTI_GetITStatus(EXTI_Line0)==SET)
- {
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
- {
- count--;
- }
- EXTI_ClearITPendingBit(EXTI_Line0);
- }
-
- }
- void EXTI1_IRQHandler(void)
- {
- if(EXTI_GetITStatus(EXTI_Line1)==SET)
- {
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0)
- {
- count++;
- }
- EXTI_ClearITPendingBit(EXTI_Line1);
- }
-
-
-
-
- }

- #include "stm32f10x.h"
- #include "OLED.h"
- #include "Encoder.h"
- int16_t NUM;
- int main(void)
-
- {
- OLED_Init();
- Encoder_Init();
- OLED_ShowString(1,3,"Count:");
- while(1)
- {
- NUM += ReceiveDate();
-
- OLED_ShowSignedNum(2,1,NUM,4);
-
-
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。