学习外部中断前必须先知道什么是中断
举个例子:当你在公司上班时候敲着代码,这时有经理找你去干啥的时候,然后你干完那件事之后回来继续敲代码
1.打断原来做的事情(敲代码)-->打断工作
2.保留现场(敲代码的进度)-->保留工作进度
3.处理中断-->经理交代的事情
4.回到现场-->继续处理剩下的代码
回归正传
一,如何在stm32中配置中断
1.初始化用来中断GPIO口 (要记得使能时钟,哪一个口对应哪一个时钟)
typedef struct //配置GPIO的结构体
{
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured*/
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.*/
}GPIO_InitTypeDef;
2.初始化EXTI(也叫边缘检测电路-->上升沿/下降沿触发中断)
3.配置NVIC(中断优先级)
4.编写中断服务函数
代码编写
#include "exti.h"
#include "stm32f10x.h"
void exti_init(void)
{
GPIO_InitTypeDef GPIO_init;
EXTI_InitTypeDef exti_init; //外部中断源
NVIC_InitTypeDef nvic_init; //配置中断优先级 (在misc.h里找结构体)
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE); //GPIO的时钟还需配置外部中断时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE); //复用时钟即可 GPIOA既是gpio也是外部中断时钟
//因为GPIOA是要设置成外部中断源配置
GPIO_EXTILineConfig( GPIO_PortSourceGPIOA, GPIO_PinSource1); //外部中断线配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置优先级组
GPIO_init.GPIO_Mode = GPIO_Mode_IPD;
GPIO_init.GPIO_Pin = GPIO_Pin_1;
GPIO_init.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_init);
exti_init.EXTI_Line = EXTI_Line1; //选择中断line
exti_init.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
exti_init.EXTI_LineCmd = ENABLE; //使能
exti_init.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿
EXTI_Init(&exti_init); //初始化
nvic_init.NVIC_IRQChannel = EXTI1_IRQn;
nvic_init.NVIC_IRQChannelSubPriority = 1;
nvic_init.NVIC_IRQChannelPreemptionPriority = 1;
nvic_init.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic_init);
}
4.配置中断函数在main函数
#include "stm32f10x.h"
int main()
{
GPIO_SetBits(GPIOA, GPIO_Pin_3);
while(1)
{
}
}
void EXTI1_IRQHandler(void)
{
if( EXTI_GetITStatus( EXTI_Line1) !=RESET) //需要判断中断是否发生
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
delay_ms(1000);
GPIO_SetBits(GPIOA, GPIO_Pin_3);
delay_ms(1000);
}
EXTI_ClearFlag( EXTI_Line1); //清除中断
}