5、STM32外部中断的代码

需要把这出现的一条线给打通就好了

#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);

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值