比如我们使用外部中断,下面我就结合自己的学习讲讲使用外部中断的一般步骤:
1、初始化对应的GPIO口。假如我们使用的是GPIOB。
(1)首先定义初始化用到的结构体名称。
GPIO_InitTypeDefGPIO_InitStructure
说明一下:GPIO_InitTypeDef 是stm32给我们定义好的结构,里面有相应的成员变量,我们只需要定义结构体的名称即GPIO_InitStructure,然后配置它的成员。
(2)开启GPIOB的时钟。
开启时钟用到系统为我们提供好袭搭派的函数
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
说明:因为我们要复用GPIO口,所以也要开启GPIO口的复用功能时钟RCC_APB2Periph_AFIO;
(3)配置结构GPIO_InitStructure。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0//选用管脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_IPU//设置输出模式,改模式是将stm32管脚内部拉高保证处于高电平,并且做输入管脚使用。
(4)这一步设置输入速度的我们可以不要,当GPIO口做输入时,不需要对速度进行配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
(5)GPIO_Init(GPIOB, &GPIO_InitStructure)//调用初始化函数,将配置应用到GPIOB口中。
2、连拍贺接GPIO到EXTI
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0)//将GPIOB0口连接到EXTI0,可能有些同学就不明白了,为什么是EXTI0,这里简单的说明一下GPIO口如果连接的是0管脚,则对应EXTI0,如果是1管脚则对应EXTI1。
3、配置外部枝世中断的触发方式
EXTI_InitTypeDefEXTI_InitStructure
EXTI_InitStructure.EXTI_Line=EXTI_Line0
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising
EXTI_InitStructure.EXTI_LineCmd=ENABLE
EXTI_Init(&EXTI_InitStructure)
4、设置中断优先级寄存器
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//这里我们选择分组2,也就是说给抢占优先级分配两位,给响应优先级分两位
5、配置中断控制寄存器(NVIC)
(1)NVIC_InitTypeDefNVIC_InitStructure//这一步是给我们的结构体命名,下面是对结构进行配置
(2)NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//选择中断类型也就选择外部中断0,这些语句其实stm32都给我们,中断名称在IRQn_Type结构体中为我们定义好了,我们只需要选择一个我们要用的中断就好了,stm32f10xx.h中我们可以找到它。
(3)NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01//设置抢占优先级。
(4)NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01//设置响应优先级。
(5)NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE//设置开启中断。可以理解为开启总中断。
(6)NVIC_Init(&NVIC_InitStructure);//调用出事换函数,初始化这个中断。
6、最都不要忘记在stm32f10x_it.c中编写中断服务程序。不要忘记,清除中断标志位。
void PPP_IRQHandler(void)
{}
我们在这个函数中写中断程序,PPP意思就是设备。不过同学们要记住我们不能直接就在里面写我们要将PPP写该成我们的中断口,void EXTI0_IRQHandler(void) {}
这样才可以,课能同学又要问了怎样确定这个名称呢。
答案是我们要在stm32的启动文件startup_stm32f1xx.s这个汇编文件中找,就可以找到每个中断所对应的名称了。
慢慢学 其实没有我们想象的那么难
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)