本人水平有限,若存在错误谢谢指错!
每个IO口的使用,每种功能的实现都要配置寄存器,而配置寄存器一般都采用结构体的申明引用。
故先看看中断配置初始化的结构体有哪些
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
三个分别对应io口的寄存器,外部中断寄存器,嵌套向量寄存器
GPIO_InitStructure.GPIO_Pin=k_left;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
这里GPIO采用的是上拉输入
还有一段代码
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
这段代码是实现IO的复用功能(AFIO)
看看EXTI_InitStruct结构体中有哪些成员
typedef struct
{
uint32_t EXTI_Line; //线路0~19;
EXTIMode_TypeDef EXTI_Mode; //中断与事件
EXTITrigger_TypeDef EXTI_Trigger; //触发方式
FunctionalState EXTI_LineCmd; .
}EXTI_InitTypeDef;
typedef enum
{
EXTI_Mode_Interrupt = 0x00,
EXTI_Mode_Event = 0x04
} EXTIMode_TypeDef;
typedef enum
{
EXTI_Trigger_Rising = 0x08,
EXTI_Trigger_Falling = 0x0C,
EXTI_Trigger_Rising_Falling = 0x10
}EXTITrigger_TypeDef;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
中断和事件的区别(转载另一篇csdn)
简单举例:外部I/O触发AD转换,来测量外部物品的重量;如果使用传统的中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;要是使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果;相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务了。
最后是NVIC寄存器
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//这个是中断优先级的分组
typedef struct
{
uint8_t NVIC_IRQChannel; //中断向量
uint8_t NVIC_IRQChannelPreemptionPriority; //中断向量的中断响应
uint8_t NVIC_IRQChannelSubPriority; //中断向量的抢占响应
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
配置加上三个初始化的函数中断配置完成。
虽然写的不怎么好,但每次写完后收获挺多的。所以写一写。
、