目录
EXTI基本结构
配置步骤
第一步,时钟配置
EXTI和NVIC两个外设的时钟是一直开的 ,NVIC内核外设都是不需要开启时钟
第二步,配置GPIO端口为输入模式对于EXTI来说,模式为浮空输入|上拉输入|下拉输入;不知该写什么模式,可以看参考手册中的外设GPIO外设配置表
第三步,配置AFIO外设中断引脚选择
AFIO的库函数是和GPIO在一个文件里,可以查看Library文件中的gpio.h查看函数GPIO_PinRemapConfig 配置引脚重映射
GPIO_EXTILineConfig 配置AFIO的数据选择器,选择想要的引脚
第四步,配置EXTI,这样PB14的电平信号就能够通过EXTI通向下一级的NVIC了第五步,配置NVIC,NVIC是内核外设,所以它的库函数在misc.h
代码
CountSensor.c
#include "stm32f10x.h" // Device header
uint16_t CountSensor_Count;
void CountSensor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//1、RCC给GPIO和AFIO供电
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;//2、定义GPIO结构体,每个成员都定义出来(上拉电阻)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB , GPIO_PinSource15);//3、配置AFIO外部中断引脚选择,具体用的是GPIOA还是B,几脚
EXTI_InitTypeDef EXTI_InitStructure;//4、定义外部中断的结构体,定义每个成员的参数,(几脚、使能、立即中断、下降沿触发)
EXTI_InitStructure.EXTI_Line = EXTI_Line15;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_Init(&EXTI_InitStructure);
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;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
}
uint16_t CountSensor_Get(void)
{
return CountSensor_Count;
}
void EXTI15_10_IRQHandler(void)//启动文件里复制来10-15引脚的中断名(固定的)
{
if(EXTI_GetITStatus(EXTI_Line15) == SET)
{
CountSensor_Count ++;
EXTI_ClearITPendingBit(EXTI_Line15);
}
}
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"
int16_t Num;
int main(void)
{
OLED_Init();
Encoder_Init();
OLED_ShowString(1,1,"Num:");//字符串
while (1)
{
Num += Encoder_Get();
OLED_ShowSignedNum(1,5,Num,5);
}
}