简单的中断学习

单片机:stm32f103c8t6

资料:stm3f103中文参考手册,stm32固件库使用手册,相关文章

一.了解中断含义:

    Cpu在执行程序时,发生一些随机的事件(可能来自外部,也可能来自内部,比如说外部按键,com传过的数据),引起了cpu暂时中断正在运行的程序,转过去执行其他的任务,然后再去执行接下来的程序。
Stm32 有16个内部中断,64个外部中断可以使用。
内部中断SysTick系统定时器等等,外部中断AD,I2C等等。
 在设置中断的时候要考虑中断的优先级,
这里的优先级包括抢占优先级和相应优先级,
抢占优先级高的可以打断级别低的,
响应优先级中,当抢占优先级相同的时候先执行响应优先级高的部分,再执行低的。
当抢占优先级不同时到来的时候,响应按顺序执行。
 
抢占优先级的道理就是当狼和老虎同时面向食物,食物自然是高等级的老虎的。
响应优先级的道理就是当小虎和大虎同时面向食物,食物是谁的看先来后到。
 
 二.具体实例
     利用手中现有的stm32f103c8t6板子,选择外部按键作为中断输入,一个led灯作为输出,编写一个简单的中断程序。
首先对系统时钟,端口,函数进行初始化
int main(void)
{
   RCC_Configuration();
   GPIO_Configuration();
   EXTI_Configuration();
   NVIC_Configuration();
  
   while(1);   
}
 
void RCC_Configuration(void)
{
    SystemInit();
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//配置管脚的时钟,使用一个c管脚,一个b管脚
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开管脚的复用功能,因为要使用中断,把GPIO口作为exti外部中断,需要开启afio时钟
}//
 
 
 
配置GPIO口的输入输出,定义GPIO宏操作结构体
配置led灯的输出,选择pb5管脚,io口翻转速度为50mhz,输出模式,并进行初始化
void GPIO_Configuration(void)
{
    GPIO_InitTypeDefGPIO_InitStructure;   
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;  // pb5¶Ë
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB,&GPIO_InitStructure);//³õʼ»¯
   
配置按键,选择pc5管脚,并进行初始化
 
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_Init(GPIOC,&GPIO_InitStructure);
}
 
配置中断函数
void EXTI_Configuration(void)
{
    EXTI_InitTypeDefEXTI_InitStructure;
//定义一个结构体变量
   
    //    
    EXTI_ClearITPendingBit(EXTI_Line5);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);
 
    EXTI_InitStructure.EXTI_Line=EXTI_Line5;//配置管脚
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;  给使能
 
    EXTI_Init(&EXTI_InitStructure);//进行初始化
}
 
中断配置函数,EXTI_InitTypeDef
可以在stm的库函数中查找其相关参数进行使用
有四个可以使用的参数EXTI_Line; EXTIMode_TypeDef EXTI_Mode; EXTIrigger_TypeDefEXTI_Trigger; FunctionalState EXTI_LineCmd;
1.首先要确定中断线,根据所使用的管脚选择中断线
2.然后选择使能线路的模式,EXTI_Mode分为事件和中断,参数为EXTI_Mode_Event ,EXTI_Mode_Interrupt,前者为事件,后者为中断
3. EXTI_Trigger 设置触发边沿,其中EXTI_Trigger_Falling为下降沿为中断请求 EXTI_Trigger_Rising 上升沿为中断请求 EXTI_Trigger_Rising_Falling 上升沿和下降沿为中断请求
.4. EXTI_LineCmd给使能,有两种状态,分别为ENABLE和DISABLE
 
 
最后设置中断响应的优先级
void NVIC_Configuration(void)
 
{
   NVIC_InitTypeDefNVIC_InitStructure;
    //定义结构体
   
 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
 
NVIC_InitTypeDef函数所包含的参数有NVIC_IRQChannel;NVIC_IRQChannelPreemptionPriority; NVIC_IRQChannelSubPriority; NVIC_IRQChannelCmd;
 
1.NVIC_IRQChannel用来指明使能的通道,因为上面选用的第5个中断线,在这里需要查询表查得

需要使用EXTI9_5_IRQChannel

2. NVIC_IRQChannelPreemptionPriority设置前面的抢占优先级,其中数字越小,级别越高。
3.NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1;设置响应优先级
4.NVIC_IRQChannelCmd定义通道是使能还是失能。
 

猜你喜欢

转载自blog.csdn.net/qq_33169543/article/details/81025694