历史上的今天
今天是:2024年10月11日(星期五)
2021年10月11日 | STM32中按键中断分析
2021-10-11 来源:eefocus
在按键学习中,我们有用到查询的方法来判断按键事件是否发生,这种查询按键事件适用于程序工作量较少的情况下,一旦程序中工作量较大较多,则势必影响程序运行的效率,为了简化程序中控制的功能模块的执行时间,引入中断控制就很有必要,,一旦有中断时间发生,则程序立马跳转到中断向量的执行程序中,执行完成后就恢复到正常的程序状态。
在STM32F中采用中断控制器NVIC来设定中断。按照中断初始化配置的结构体文件,我们需要在NVIC初始化结构体配置如下:
void EXti_PB12_Config(void)
{
//定义结构体
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
//开启外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
NVIC_Configuration();
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 中断向量模式(PB12)
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);
//给中断向量成员赋值,这是因为PB12连接到EXTI_Line12;
EXTI_InitStructure.EXTI_Line = EXTI_Line12;
//设置中断触发模式,通过这个来不断查询相应的寄存器
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//设置触发模式为下降沿触发
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
//使能
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
//调用库函数
EXTI_Init(&EXTI_InitStructure);
}
static void NVIC_Configuration(void)
{
//定义结构体
NVIC_InitTypeDef NVIC_InitStructure;
//把NVIC中断优先级分组设置为第一组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//PB12配置为EXT1第10-15线的中断向量
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
//设置抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//设置响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//使能
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//调用库函数
NVIC_Init(&NVIC_InitStructure);
}
从代码可以看出,我们可以创建两个文件,一个是EXTI_KEY.C和EXTI_KEY.H文件,将上述代码放置于EXTI_KEY.C文件中。我们在配置中断时,需要做以下工作:
1、使能EXTIx线的时钟和第二功能时钟,前者是具体某个GPIO口的时钟,这里代码是PB12的时钟;
2、配置EXTIx的中断优先级;主要体现在优先级分组,响应优先级,抢占优先级,优先级分组取值意味着设定了抢占优先级和响应优先级的个数,最大支持16个,也就是说他们之和是16,抢占优先级和响应优先级取值越低,意味着优先级越高,一般来说,优先级高的优先执行。
3、选定要配置的EXTI的I/0线和I/O的工作模式,这里主要GPIO的初始化配置,以及该引脚挂靠的EXTI线。这里挂靠线为LINE12。
4、配置EXTI中断线工作模式。这里主要是配置中断触发模式(如上升沿触发,下降沿触发等等)
在做完初始化工作后,我们发现,其实中断配置的模式很固定化,一般修改值为工作2和3,可以实现不同GPIO口的中断配置和中断优先级配置。
完成中断初始化配置后,我们需要写入中断服务函数。在这里就要涉及到中断标志位,触发中断和清除中断标志位。其中断服务函数如下:
void EXTI15_10_IRQHandler(void)
{
IF (EXTI_GetITStatus(EXTI_Line12) != RESET) //确保是否产生了中断
{
写入要控制的功能;
EXTI_ClearITPendingBit(EXTI_Line12); //清除中断标志位
}
}
在中断服务函数中,我们发现这个模板很固定,其采用的配置和中断配置很相似,唯一的区别就是采用哪个功能引脚配置。
在这一节中,我们主要是学习如何使用中断。虽说在中断没有学习之前,都想象的难度很大。但是在使用STM32F的库函数编程后,我们发现,类似于这种复杂的编程机器用库函数轻松驾驭。所采用的的模板和格式都可以在官方的库函数中找到原型,方便了程序的编写。
最后总结一下,中断时打破当前程序的运行,直接执行中断服务函数里面的功能,在中断执行完之后一定要清除中断,这样才能跳出中断,回到之前程序运行的阶段。
史海拾趣
|
SUPERSYNC PWB-1537、SUPERSYNC EM-1428二种机型彩色显示器的电源电路图 SUPERSYNC PWB-1537、SUPERSYNC EM-1428二种机型彩色显示器的电源电路图… 查看全部问答> |
|
昨天花了一天时间画的原理图,这是CPU控制部分,与数据采集板的接口部分还没有打网络标号(包括电平转换的芯片),打算先把这一块板给做出來调软件,本来打算用LPC2103作为从控制器,后来画到后面想想还是换成了MSP430F135,因为LPC2103要用双电源供电,如果 ...… 查看全部问答> |
|
太阳能供电 一块土豆就可以供电,相比较某些产品用苹果展示,土豆应该是更省电的吧,呵呵 利用RF无线传输能量 利用手摇电筒制作成发电机供电 一杯热水就能供电?杯子底部的热电偶产生电能,一样可以供MCU使用 背景资料: 意法半 ...… 查看全部问答> |
|
在千篇一律的DIY、MOD场合里,许多玩家费尽心机所改造出来的灯光效果都是静止的,如果在Lanparty上千人一面的改造MOD比比皆是,你的改造又怎么能脱颖而出呢?增加一个动感的超炫灯光效果势在必行!想像一下在姹紫嫣红的炫目光彩照耀下,观众早已疲 ...… 查看全部问答> |
|
在获取滚动条的SB_THUMBPOSITION事件位置值,总是不对 当触发滚动条的SB_THUMBPOSITION事件时,我把滚动条的滑块托到最后,得到值不是SCROLLINFO中的nMax值,为什么啊。… 查看全部问答> |
|
猎头职位:Hardware Design Engineer (欧洲一家做控制系统的公司,地点:上海) Listed in London Stock Exchange, our client is a global group of five businesses that supply control and automation solutions that deliver efficiency, safety and effectiveness in process automation, controls and transportation e ...… 查看全部问答> |
|
输入时钟为27M,通过锁相环倍频成270M,270M是ASI IP核使用的时钟。目前有8个PCB,可以正常使用的有4个,不能正常使用的有4个,同样的FPGA程序。不能正常使用的PCB中,signaltap使用此270M做采样时钟,会显示waiting for clock 或者采出很乱的波形 ...… 查看全部问答> |




