1基本结构
我们首先要对中断进行区分,中断是一个较大的概念,其中对中断通道又包括EXTI(外部中断),TIM,ADC,USART等。在下文中我仅对外部中断进行介绍
正如我所说在stm32中很多外设都具有中断的功能,图片中的n是接入的通道数。
一些概念我们也要进行区分
响应优先级:在等待的中断中进行插队让下一个叫号的就是自己。
抢占优先级;别的中断正在进行打断直接自己上。
所以我们往往需要去配置一个中断源的优先级就是排大小麻,上面两个优先级是由四个二进制数进行决定例如(我们设置四位中的前面两位进行抢占优先级,那么后面两位就是响应优先级各有4种)
我们可以看到其中有一个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 开始一段函数之旅。
看到这里你们是不是应该打开电脑,跃跃欲试,,带兄弟们再冲一把。话说回来多练习呗
之后我分享更多资源和学习新得。