博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
stm32打怪升级之不要碰中断
阅读量:5153 次
发布时间:2019-06-13

本文共 2293 字,大约阅读时间需要 7 分钟。

stm32中断概念:单片机cpu在执行当前程序的时候,由于外界出现外界请求或内部请求,使cpu暂停正在执行的程序而去处理相应的请求程序,当程序运行完毕后,cpu再来执行原先被暂停的程序,这个过程就是中断。又由于在处理请求程序过程中,可能被其他更高级或者低级的外界请求干扰,这时候就要判断优先级,先处理哪个请求程序,这个就是中断优先级。中断优先级分为抢占优先级和响应优先级,规则是:抢占优先级高可以中断抢占优先级低的中断函数,相同抢占之间不能相互中断,而响应优先级则看一下中断表里的排位顺序.

在使用中断时的时候,要用NVIC分组,为什么?判断中断表中的排序决定先处理哪一个而nvic就是这个中断分组。

在stm32中有一个专门的函数来配置中断优先级NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)其中 u32 NVIC_PriorityGroup可以设置成NVIC_PriorityGroup0~4。NVIC需要使用misc.h库文件

EXTI是外部中断,外部中断初始化包含以下几个结构体GPIO_Init(),NVIC_Init(),EXTI_Init()

PA0(15)---->AFIO_EXTICR1中EXTI0(15)--------->EXTI0
注意:一次性使用中断只能有16个,且每组io序号只能用一次
2.AFIO_代表gpio的复用功能,有adc,串口等,而用作外部中断或者使用重印射功能必须开启afio时钟
由上图可以知道
首先得设置分组,然后io初始化。选择io口,开启中断通道且设置参数
只要是外设就需要使用rcc外部时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)

然后gpio初始化GPIO_Init()有个结构体

GPIO_InitStructure.GPIO_Pin=k_left;         #这里的k_left实际上是一个外设,按键

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //是上拉电阻输入,没有输入信号的时候为高电平

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
其次设置输入的io口GPIO_EXTILineConfig()
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2)//因为我的按键在gpio的引脚为GPIOE组的第二管脚

然后对中断优先级NVIC_Init()有个结构体

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //这里使用的是中断优先级1组即1个抢占优先级,3个响应优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //打开 EXTI2的全局中断//这里使用2作为中断向量,在stm32f10x.h中的IRQn可以找到定义,这里与EXTI_Line2对应的
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);

最后初始化外部中断EXTI_Init()有个结构体
EXTI_InitStructure.EXTI_Line=EXTI_Line2;//读取外部中断2,01234独立一个,5-9共同一个,10-15共用一个
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//中断触发模式
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure)

外部中断的中断函数EXTI2_IRQHandler()//2跟上面同理,看引脚是什么,这里是需要自己按需求写,中断后运行什么程序就是在这里面修改

包含EXTI_GetITStatus()函数读取中断标志

EXTI_ClearITPendingBit()函数 清除中断标志

实际上原理就是,先把自己的外设(cpu需要执行的程序)初始化好,配置好参数,然后把中断初始化配置好,自己中断(外界请求或内部触发命令程序)会运行什么,按键?,传感器?还是其他的,把这些都初始化好(中断配置管脚和外部请求等程序得一一对应),然后再通过EXTI2_IRQHandle()函数将cpu执行的程序和中断后执行的程序联系起来。这就是我理解的一个完整的中断程序过程,打红线的部分就是按需要而进行修改的东西。是不是很简单

转载于:https://www.cnblogs.com/bebox/p/7267981.html

你可能感兴趣的文章
Notes of Daily Scrum Meeting(12.8)
查看>>
Apriori算法
查看>>
onlevelwasloaded的调用时机
查看>>
求出斐波那契数组
查看>>
Vue.js 基础学习之组件通信
查看>>
lr_start_transaction/lr_end_transaction事物组合
查看>>
每天一个Linux命令 - 【chkconfig】
查看>>
△UVA10106 - Product(大数乘法)
查看>>
golang (7) 文件操作
查看>>
关于 Object.defineProperty()
查看>>
[转] Maven 从命令行获取项目的版本号
查看>>
CodeIgniter学习笔记(四)——CI超级对象中的load装载器
查看>>
.NET CLR基本术语
查看>>
ubuntu的home目录下,Desktop等目录消失不见
查看>>
建立,查询二叉树 hdu 5444
查看>>
[Spring框架]Spring 事务管理基础入门总结.
查看>>
2017.3.24上午
查看>>
Python-常用模块及简单的案列
查看>>
(VC/MFC)多线程(Multi-Threading) -1. 基本概念.
查看>>
快数据时代下,Moka携手DataPipeline提升招聘效能
查看>>