目录
函数介绍:
STC32F10x_rcc:
GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
NVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup)
NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
EXTI15_10_IRQHandler
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)
EXTI_ClearITPendingBit(uint32_t EXTI_Line)
1,使用STM32开启外部中断需要几步?
4步即可完成!
1,开启GPIOx使能设置中断引脚(工作模式设置为上拉输入)
2.通过AFIO进行GPIO引脚属性设置,也就是把使能的引脚接到AFIO对于总线上
3,通过EXTI中结构体设置中断的一些参数
4,进行中断优先级分配
GPIO14外部中断EXTI初始化整体函数:
2.然后只需要使用对应中断函数运行程序即可:
完成工程项目:
GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
/**
* @brief选择用作EXTI Line的GPIO引脚。
* @param GPIO_PortSource:选择用于EXTI行的GPIO端口。
*取值为GPIO_PortSourceGPIOx,其中x为(A..G)。
* @param GPIO_PinSource:指定要配置的EXTI行。
*该参数可以是GPIO_PinSourcex,其中x可以是(0..15)。
* @retval没有
* /
根据说明文档,这个函数可以选中将开启的GPIO的引脚设置为ETXI中断引脚
EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
/**
* @brief根据指定初始化EXTI外设
* EXTI_InitStruct中的参数。
EXTI_InitStruct:指向EXTI_InitTypeDef结构体的指针
*,包含EXTI外设的配置信息。
* @retval没有
* /
根据说明文档,这个函数可以进行EXTI的初始化,不过使用的是结构体初始化,(结构体详情参考内部文档)
NVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup)
/**
* @brief配置优先级分组:抢占优先级和次优先级。
* @param NVIC_PriorityGroup:优先级分组位的长度。
*该参数可以是以下值之一:
* @arg NVIC_PriorityGroup_0: 0比特优先级抢占
* 4位subpriority
* @arg NVIC_PriorityGroup_1: 1位表示抢占优先级
* 3位subpriority
* @arg NVIC_PriorityGroup_2: 2位优先级抢占
* 2位subpriority
* @arg NVIC_PriorityGroup_3: 3位优先级抢占
* 1位subpriority
* @arg NVIC_PriorityGroup_4: 4位优先级抢占
* 0位subpriority
* @retval没有
* /
这个函数可以进行NVIC中断优先级分组
NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
/**
* @brief根据指定的初始化NVIC外设
* NVIC_InitStruct中的参数。
* @param NVIC_InitStruct:指向NVIC_InitTypeDef结构体的指针
*指定NVIC外设的配置信息。
* @retval没有
* /
这个函数可以初始化NVIC寄存器的各项参数,
EXTI15_10_IRQHandler
这个函数是10-15中断口执行函数
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)
/**
* @brief检查指定的EXTI行是否断言。
* @param EXTI_Line:指定要检查的EXTI行。
*该参数可以是:
* @arg EXTI_Linex:外部中断线x,其中x(0..19)
EXTI_Line (SET或RESET)的新状态。
* /
这个函数可以检查是否发生中断
/**
* @brief清除EXTI的行挂起位。
* @param EXTI_Line:指定要清除的EXTI行。
*该参数可以是EXTI_Linex的任意组合,其中x可以是(0..19)。
* @retval没有
* /
这个函数可以清楚中断标志位
如图:GPIO引脚接到AFIO如何AFIO的GPIO总线接到EXTI如何EXTI接到NVIC寄存器上
*AFIO:控制GPIO属性的寄存器,
*EXTI:外部中断寄存器
*NVIC:中断优先级控制寄存器
看着图片也就知道想要开启中断就要,
1,开启GPIOx使能设置中断引脚
2,通过AFIO进行GPIO引脚属性设置,也就是把使能的引脚接到AFIO对于总线上
3,通过EXTI中结构体设置中断的一些参数
4,通过NVIC中结构体进行中断优先级分配
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//打开AFIO时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
//设置开启的GPIO为中断口
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;//中断口
EXTI_InitStructure.EXTI_LineCmd= ENABLE;//开启EXTI中断
EXTI_InitStructure.EXTI_Mode= EXTI_Mode_Interrupt;//设置为中断模式
EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;//下降沿触发模式
EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//将中断请求进行分组,当前位分组2
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//配置中断请求线:10-15
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//允许中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级的优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级的优先级
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//配置中断请求线:10-15
这里要注意不同中断线,中断请求优先级中断口使用的参数不一样
这样便完成了中断函数的初始化!
void Exti_Init(void)
{
/*
配置GPIO与AFIO
*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//设置中断线
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
/*
配置EXTI外部中断控制寄存器
*/
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;//中断口
EXTI_InitStructure.EXTI_LineCmd= ENABLE;//开启EXTI中断
EXTI_InitStructure.EXTI_Mode= EXTI_Mode_Interrupt;//设置为中断模式
EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;//下降沿触发模式
EXTI_Init(&EXTI_InitStructure);
/*
配置NVIC中断优先级分配寄存器
*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//将中断请求进行分组,当前位分组2
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//配置中断请求线:10-15
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//允许中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级的优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级的优先级
NVIC_Init(&NVIC_InitStructure);
}
//GPIOX10-15外部中断执行函数
void EXTI15_10_IRQHandler(void)
{
//读取GPIO14中断线的状态
if(EXTI_GetITStatus(EXTI_Line14) == SET)
{
ExTi_number++;
//当外部中断请求后,需要软件复位
EXTI_ClearITPendingBit(EXTI_Line14);
}
}
应该注意到了中断函数中有两个函数,这两个函数的作用就是检查指定中断口是否发生中断,如果发送就清除中断,因为外部中断需要软复位
3.为了方便中断函数使用还需要自己写一个函数:
unsigned char Exti_cis(void)
{
return ExTi_number;
}
一个返回模块中断次数的函数
链接: https://pan.baidu.com/s/12aNKJARFA1CEojIquythkQ?pwd=c6cj 提取码: c6cj