芯达stm32入门系列教程之九《初试stm32中断》

上传人:kms****20 文档编号:46729658 上传时间:2018-06-27 格式:PDF 页数:9 大小:333.07KB
返回 下载 相关 举报
芯达stm32入门系列教程之九《初试stm32中断》_第1页
第1页 / 共9页
芯达stm32入门系列教程之九《初试stm32中断》_第2页
第2页 / 共9页
芯达stm32入门系列教程之九《初试stm32中断》_第3页
第3页 / 共9页
芯达stm32入门系列教程之九《初试stm32中断》_第4页
第4页 / 共9页
芯达stm32入门系列教程之九《初试stm32中断》_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《芯达stm32入门系列教程之九《初试stm32中断》》由会员分享,可在线阅读,更多相关《芯达stm32入门系列教程之九《初试stm32中断》(9页珍藏版)》请在金锄头文库上搜索。

1、Copyright2009-2010 福州芯达工作室 ALL rights reservedSTM32 入门系列教程初试STM32中断RevisionRevisionRevisionRevision 0.010.010.010.01( 2010-04-23 )Copyright2009-2010 福州芯达工作室 ALL rights reserved其它啥也不说,我们先看下芯达 STM32 外部中断所采用电路,非常简单, 如下图所示:该电路直接从 STM32 系列的 CPU 引脚直接引出两个 GPIO(PE2/PE3) ,外 加上拉电阻后,使用一个轻触开关接地。很明显,按下开关时,PE2/PE

2、3 引脚接 地,否则为高电平。 学习 STM32 中断时,我们可以一边回想单片机中断系统一边学习。这里的 思路就与单片机类似:当按下按键时,电平变动,使用上升或下降沿触发中断。 对于单片机来说,很简单,开中断即可。但 STM32 却有所不同。我们使能配置 EXTI、NVIC 中断后,还需要注意 IO 口时钟的使能。笔者当初忽略了 AFIO 时 钟,调试 2 天没有结果,重新查看 datasheet 时,发现 AFIO 时钟没有打开。下面 简单列出外部中断的编程思路: 1、系统初始化,如系统时钟初始化,使之进入 72MHZ 主频; 2、GPIO 配置,务必注意打开 GPIO 时钟时,一定打开 A

3、FIO 时钟。 3、EXTI 配置,在这里配置需要选择哪个引脚作为中断引脚。 4、NVIC 配置,这也是比单片机多出来的部分,我们必须把 NVIC 中对应 的通道使能,并且设置优先级别。 5、使用 while(1)进行死循环,并在中断程序中写入中断发生时应如何处理。 好吧,开始 STM32 的外部中断的编程之旅吧,详细的例程代码,请参考光 盘中的 芯达 STM32 配套例程 文件夹。 本期例程使用的模板, 是刚刚从 STM32 官网上下载的最新版本的 3.0 固件模板,其工程文件放在根目录下的 ProjectTemplateRVMDK 目录中, 点击工程文件即可打开。 同样只要关注 main.

4、c 文件即可。步骤一步骤一 系统初始化,使用固件模板中自带的 SystemInit();函数即可。通过 分析这个函数,我们会发现此函数把主频默认调整到 72MHZ。步骤二步骤二GPIO 配置,这以后均是需要自己编写的函数,例程中采用 GPIO_Config();函数,如下所示:Copyright2009-2010 福州芯达工作室 ALL rights reservedvoid GPIO_Config(void) GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Peri

5、ph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);/* * LED1 - PB8,LED2 - PB9 , LED3 - PE0 , LED4 - PE1 *Key1 - PE2,Key2 - PE3 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 |GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, GPIO_InitSt

6、ructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE, GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 |GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_M

7、ode_IN_FLOATING; GPIO_Init(GPIOE, 在这里函数里,我们首先使能了 GPIOB、GPIOE 的时钟,因为我们使用 PB8PB9PE0PE1 作为用户指示灯来验证外部中断, 使用 PE2PE3 作为中断触发 引脚。注意它们的配置中,同样是 GPIO 引脚,却需要把 PE2PE3 配置为浮空输 入模式,而其他配置为输出模式 很好理解,因为 LED 指示灯是由 CPU 驱 动点亮的,而中断引脚 PE2PE3,是外界按键驱动的,相对于 CPU 来说,是“输 入” 。步骤三步骤三EXTI 的配置。此步相当于单片机的中断配置,使用的函数是 EXTI_Config();函数。

8、void EXTI_Config(void) EXTI_InitTypeDef EXTI_InitStructure;GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);/ 管 脚 选择 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3); EXTI_ClearITPendingBit(EXTI_Line3);Copyright2009-2010 福州芯达工作室 ALL rights reservedEXTI_ClearITPendingBit(EXTI_Line

9、2);EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init( 该函数中,首先指明当前系统中使用哪个引脚作为触发外部中断的引脚,这 个直接使用固件库中提供的 GPIO_EXTILineConfig();函数即可。我们指明了 P

10、E2PE3 引脚作为触发中断引脚。 然后使用 EXTI_ClearITPendingBit();函数清除中断标志位。 关于中断标志位, 大家应该都很熟悉。我们进入中断服务程序后,首先做的就是清除中断标志位, 否则它会不断响应中断,不断进入中断函数。当然,我们这里做这个步骤,只是 为了预防万一,您也可以删除此句试验下。 另外需要说明的是 EXTI_Line3,这个表示的是中断线 3。对于外部中断中的 GPIO,有 16 个中断线,分别是 0-15,刚好对应于每个 GPIO 端口的 0-15 引脚。 接下来设置外部中断结构体的成员,比如 EXTI_Mode_Interrupt 即为中断请 求,还有

11、一个是 EXTI_Mode_Event,事件请求。这里就有一个问题了,事件和 中断到底啥关系呢?请参考如下语句(网络上查的) : “事件:是表示检测有一某件触发事件发生了。 中断:有某个事件发生并产生中断,并跳转到对应的中断处理程序中。 事件可以触发中断,也可以不触发 中断有可能被更优先的中断屏蔽,事件不会事件本质上就是一个触发信号,是用来触发特定的外设模块或核心本身(唤醒).事件只是一个触发信号(脉冲) ,而中断则是一个固定的电平信号” 我们采用的触发方式是上升沿触发 EXTI_Trigger_Rising,使用的中断线是 EXTI_Line2 和 EXTI_Line3,实际上就是指明使用的

12、是 GPIO 的第 2 引脚和 第 3 引脚。最后不要忘了务必要使能它,呵呵。步骤四步骤四NVIC 配置。先解释下 NVIC,它的中文全称是“嵌套向量中断控 制器。 ”我们进行 NVIC 配置时,采用的是 NVIC_Config();函数,下面列出该函 数: void NVIC_Config(void) NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQChannel;/通道 NVIC_

13、InitStructure.NVIC_IRQChannelPreemptionPriority = 0;/ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;/ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(Copyright2009-2010 福州芯达工作室 ALL rights reservedNVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = EXTI3

14、_IRQChannel;/通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( 该函数的编写分两个部分,一个部分是专门针对中断线 2 的,另一个部分针 对中断线 3 的。实际上学习外部中断,只要其中一个即可。由于芯达 STM32 开 发板上配置了两个按键, 都可以用作外部中断的学习,因此我们这里列出了两个

15、中断线。 整个函数比较简单, 从函数名即可知道其含义。 大家在查看这些函数的时候, 请务必查看他们具体是如何实现的。比如 NVIC_PriorityGroupConfig();函数,不 能只看这个函数是用于优先级组配置,还要稍微关注下它的实现。操作是,双击 该 函 数 名 , 选 中 它 , 然 后 右 键 , 点 击 “ GoToDefiniton of NVIC_PriorityGroupConfig ” ,如下图所示,即可查看该函数的具体实现。步骤五步骤五中断服务子程序的编写。经过以上四个步骤,我们已经把中断配置 完毕。剩下的工作,就是编写中断服务子程序,实现进入中断后会如何处理。 我

16、们在这里举了 PE2 上的开关按下后的动作: void EXTI2_IRQHandler(void) if ( EXTI_GetITStatus(EXTI_Line2) != RESET ) Copyright2009-2010 福州芯达工作室 ALL rights reservedEXTI_ClearITPendingBit(EXTI_Line2); /*=LED34-ON=*/ GPIO_SetBits(GPIOB , GPIO_Pin_8); GPIO_SetBits(GPIOB , GPIO_Pin_9); GPIO_ResetBits(GPIOE , GPIO_Pin_0); GPIO_SetBits(GPIOE , GPIO_Pin_1); Delay(0xfffff); Delay(0xfffff

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号