需要把这出现的一条线给打通就好了
#include “stm32f10x.h”
//在这里进行外部中断的控制
void CountSensor_Init(void){
//1、配置RCC,把所牵扯到的外设的时钟给打开
//开启时钟,主要是三个开启时钟的函数
RCC_APB2PeriphClockCmd(RCC_APB2Perph_GPIOB,ENABLE))
RCC_APB2PeriphClockCmd(RCC_APB2Perph_AFIO,ENABLE))
//剩下的两个都不需要开始时钟
//2、配置GPIO,选择端口为输入模式
//2、使用GPIO_Init函数初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
//若要开启多个,那么就GPIO_Pin_0 | GPIO_Pin_1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIO
//3、配置AFIO,选择使用的GPIO连接到EXTI
//函数是在gpio文件夹里面
//GPIO——AFIODeInit(void)//调用这个函数对AFIO的函数就配置就会清除
//GPIO_PinkLockConfig(GPIO, GPIO_Pin);//用来锁定GPIO引脚的配置,防止被以外更改
//进行引脚重映射,第一个是重映射的方式,第二个是新的状态
//void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
//配置AFIO的数据选择器,选择我们想要中断的引脚
//void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//配置完成之后,这个14个数据选择器就拨号了,
//其中输入端被博导GPIOB的外设上,对应的PB14引脚,输出端固定连接的是EXTI的第14个中断线路
//这样PB14号引脚的电平信号就可以顺利的通过AFIO,进入到后稷的EXTI电路了
//4、配置EXTI,选择边沿触发方式,比如上升沿,下降沿,或者双边沿
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTL_Line = EXTI_Line14 ;//配置中断线
EXTI_InitStructure.EXTL_Cmd = ENABLE ;
EXTI_InitStructure.EXTL_Mode = EXTI_Mode_Interrupt; //选择中断模式还是事件模式
EXTI_InitStructure.EXTL_Trigger = EXTI_Trigger_Falling;//下降沿触发
EXTI_Init(&EXTI_InitStructure)
//也可以选择触发响应方式,中断响应和事件响应
//5、配置NVIC,给中断选择一个合适的优先级
//然后后通过NVIC,外部中断信号就可以进入到CPU了
//有配置是先占(抢占)优先级还是从占优先级.整个开发板只能有一共分组
NVIC_PriorityroupConfig(NVIC_PriorityGroup_2)
NVIC_ Ini tTypeDef NVIC InitStructure;
NVIC InitSt ructure.NVIC IRQChannel = EXTI15_10_IRQn;
NVIC_ InitStructure.NVIC_ IRQChannelCmd = ENABLE;
NVIC_ Initstructure.NVIC_ IRQChannelPreemptionPriority = 1;
NVIC_ InitStructure.NVIC_ IRQChannelSubPriority = 1;
NVIC_ Init ( &NVIC_ Initstructure) ;
//第一个是中断通道
}
uint8 num = 0;
//下面是中断函数
//中断函数都是无参无返回值的,
void EXTF_15_10_IRQHandler(void){
//进行中断标志位的判断,是不是EXTF14
//只有中断标志位置为1了,他才会进入中断
//如果不清除中断标志位,他就会一直申请中断
if (EXTI_GetITStatus(EXTI_Line14) == SET){
number++;
EXTI_ClearITPendingBit(EXTI_Line14);
//执行完成后,需要清除中断标志位
}
}
EXEI的库函数
//调用后把EXTI的配置都清楚,恢复成上电默认的状态
void EXTI_DeInit(void);
//这个结构体的参数配置的EXTI外设,初始化的使用
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
//软件触发外部中断的,给定一共中断线
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
在主程序查看和清除标志位,就用上面这两个函数
获取指定的标志位是否置为1了
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
可以对置为1的标志位进行清除
void EXTI_ClearFlag(uint32_t EXTI_Line);
在中断程序中查看和清楚标志位,用下面的两个函数
获取中断标志位是否置为1了
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
清除中断挂起标志位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);