STM32中断学习(本文只对外部中断EXTI进行讨论)

 1基本结构

我们首先要对中断进行区分,中断是一个较大的概念,其中对中断通道又包括EXTI(外部中断),TIM,ADC,USART等。在下文中我仅对外部中断进行介绍

STM32中断学习(本文只对外部中断EXTI进行讨论)_第1张图片

 正如我所说在stm32中很多外设都具有中断的功能,图片中的n是接入的通道数。

一些概念我们也要进行区分

响应优先级:在等待的中断中进行插队让下一个叫号的就是自己。

抢占优先级;别的中断正在进行打断直接自己上。

所以我们往往需要去配置一个中断源的优先级就是排大小麻,上面两个优先级是由四个二进制数进行决定例如(我们设置四位中的前面两位进行抢占优先级,那么后面两位就是响应优先级各有4种)

2外部中断

STM32中断学习(本文只对外部中断EXTI进行讨论)_第2张图片

我们可以看到其中有一个AFIO这个外设负责GPIO的选择,然后将选择的引脚接到NVIC上面。注意上面的16是有16个通道,举例我们选择PA3(GPIOA_3 )进行那么就会连接到EXTI3这个上面,其他的以此类推但是,不能够同时选择相同相同口(如PA3和PB3,PC4和PD4这种类型)。我们可以看到当我们选择PA(5-9)或者PA(10-15)时会连接到EXTI9_5和EXTI15_10上面,理由是节省资源。

1初始化要连接到EXTI的GPIO

下面我们直接上程序不多bb,那个外设第一步将都是相似的,就三板斧,打开时钟,配置对应参数,将配置好的参数搞进去

RCC_APB2PeriphClockCmd(这里面写对这个外设的时钟总线);

GPIO_InitStructure.GPIO_Pin =;//写端口

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//我这里是浮空输入模式也就是外面传进来的是什么电平,这个端口就是什么电平。  

/、GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 因为是浮空输入所以速度这一项不需要

GPIO_Init(KEY1_EXTI_GPIO_PORT, &GPIO_InitStructure);

2初始化EXTI用于产生中断/事件

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_EXTILineConfig(GPIOX,GPIO_Pin_X);//选择端口和对应GPIO

EXTI_InitStruct.EXTI_Line=KEY1_EXTI_LINE;

   EXTI_InitStruct.EXTI_Mode= EXTI_Mode_Interrupt;//两种模式我选择的是中断模式

EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;//选择触发方式有高电平,低电平等

EXTI_InitStruct.EXTI_LineCmd=ENABLE;//使能就是开关

EXTI_Init(&EXTI_InitStruct);

啥都不说了这不是和初始化GPIO神似吗!

3初始化NVIC,用于处理中断

外部中断好了又如何,我总中断还接着初始化

void NVIC_Confing()

{ NVIC_InitTypeDef  NVIC_InitTstruct;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//1.先设置nvic优先级分组

//配置nvic的初始化结构体

NVIC_InitTstruct.NVIC_IRQChannel =  EXTI0_IRQn ;//选择中断通道

NVIC_InitTstruct.NVIC_IRQChannelPreemptionPriority=1;//配置主优先级同上为1

  NVIC_InitTstruct.NVIC_IRQChannelSubPriority=3;//配置响应优先级

  NVIC_InitTstruct.NVIC_IRQChannelCmd=ENABLE ;//使能

  //调用初始化函数

NVIC_Init(&NVIC_InitTstruct);}

真的难受每一个都要去那些头文件和C文件里面找对应的参数所以同学们加油

4编写中断服务函数

还记得大明湖畔的不,是51单片机里面的中断服务函数不Preemption_Priority_Group 是一个用于配置 STM32 中断优先级的参数1。它决定了中断服务程序(ISR)是否可以被更高优先级的中断打断(抢占)2。不同的 Preemption_Priority_Group 值会影响抢占优先级(Preemption Priority)和子优先级(SubPriority)的位数分配3。例如,如果 Preemption_Priority_Group 为 0,那么所有 4 位都用于指定响应优先级,没有抢占优先级;如果 Preemption_Priority_Group 为 4,那么所有 4 位都用于指定抢占优先级,没有子优先级4抢占优先级和子优先级的数值越小,优先级越高。

怎么写分为三步

第一步 在stm32f10x_it.c文件中写

第二步 在startup_stm32f10x_hd.s中找到你那个通道的函数名

第三步.回到第一步中的文件敲下宝贵的void 开始一段函数之旅。

看到这里你们是不是应该打开电脑,跃跃欲试,,带兄弟们再冲一把。话说回来多练习呗

之后我分享更多资源和学习新得。

你可能感兴趣的:(stm32,学习,嵌入式硬件)