一、程序编写步骤
- 打开时钟RCC;
- 配置GPIO;
- 配置AFIO;
- 配置EXTI ,选择触发方式、响应方式;
- 配置NVIC,选择优先级;
二、程序内容如下
#include "stm32f10x.h" // Device header
void CountSensor_Init(void)
{
//时钟使能,AFIO和NVIC时钟常开,不需配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //GPIOB使能,参考原理图
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO使能
//配置GPIO
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量 GPIO_InitStructure
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;//原理图为PB14脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//配置AFIO
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
//配置EXTI
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //响应方式为中断
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //触发方式为下降沿
EXTI_Init(&EXTI_InitStructure);
//配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级为1
NVIC_Init(&NVIC_InitStructure);
}
三、分步解析
如图所示,光标放在程序名称中,右击鼠标可以查看程序的功能和形参的可输入数值
1、时钟使能函数分析。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //GPIOB使能,参考原理图
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO使能
图中圈起来为填写的第一个形参的可取数值。GPIO和AFIO的时钟都使用此函数使能。
2、GPIO口配置函数分析
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量 GPIO_InitStructure
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;//原理图为PB14脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
2.1首先声明并重定义结构体名称。
2.2定义结构体变量 GPIO_InitStructure 。
2.3对结构体对象的每一个取值进行分析。
2.3.1、输入模式我们选择 上拉输入。
2.3.2、GPIO口的宏定义,我们选择GPIO_Pin_14.
2.3.3、GPIO速率我们选择50MHZ(根据需求).
3、AFIO的函数及分析
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
如图所示为AFIO的配置函数,位置在stm32f10x_gpio.h里。
参数取值如下。
4、EXTI的配置函数及分析
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //响应方式为中断
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //触发方式为下降沿
EXTI_Init(&EXTI_InitStructure);
4.1EXTI的相关函数在stm32f10x_exti.h里
4.2、EXTI初始化函数的参数分析
4.2.1中断源的宏定义,我们选择EXTI_Line14
4.2.2、中断响应模式的选择,我们选择触发中断。
4.2.3、中断触发模式的选择,我们选择下降沿触发。
5、NVIC相关函数及分析。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级为1
NVIC_Init(&NVIC_InitStructure);
5.1、NVIC相关函数在misc.h里
5.2NVIC组优先级配置函数的参数如下图所示,我们选择NVIC_PriorityGroup_2.
5.3NVIC初始化函数的参数分析。
5.3.1NVIC的中断通道我们选择EXTI15_10_IRQn。
5.3.2因为上面选择为NVIC_PriorityGroup_2,所以NVIC的抢占优先级和响应优先级只能选择0--3
涉及C语言的宏定义,结构体,枚举等知识点,可以自己学习
注:以上资料整理自江科大自化协视频。