外部中断实验

实验4 外部中断实验

一、实验目的

理解中断的基本概念。

掌握STM32的中断源及中断优先级。

掌握STM32外部中断技术的基本使用方法。

掌握STM32中断处理程序的编程方法。

二、实验内容

硬件设计原理图如下图1所示:LED的连接在上一节已经介绍过了,在STM32开发板上的按键KEY0是接在PE4上,KEY1是接在PE3上的,KEY2是连在PE2上,WK_UP接在PA0上。

三、实验预备知识

中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加复杂。今天就将来探讨一下关于STM32中的中断系统。

ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。

STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。

STM32的每个IO口都可以作为中断输入,这点很好用。要把IO口作为外部中断输入,有以下几个步骤:

1)初始化IO口为输入。

这一步设置你要作为外部中断输入的IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。

2)开启IO口复用时钟,设置IO口与中断线的映射关系。

STM32的IO口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO口与中断线的对应关系。才能把外部中断与中断线连接起来。

3)开启与该IO口相对的线上中断/事件,设置触发条件。

这一步,我们要配置中断产生的条件,STM32可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。

4)配置中断分组(NVIC),并使能中断。

这一步,我们就是配置中断的分组,以及使能,对STM32的中断来说,只有配置了NVIC的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。关于NVIC的详细介绍,请参考前面章节。

5)编写中断服务函数。

这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃!所以在开启了某个中断后,一定要记得为该中断编写服务函数。在中断服务函数里面编写你要执行的中断后的操作。

通过以上几个步骤的设置,我们就可以正常使用外部中断了。

四、实验步骤

  1. 课下完成作业

按照教材42页-55页,新建工程,命名为“INT+你的学号”,文件夹名和工程名都为“INT+你的学号”(所需的“库函数、HARDWARE和SYSTEM文件夹”在本次实验文件夹中,自已添加即可)。工程建好后,按照教材153页,编写好main()主函数,之后编译。

  1. 2.         实验室完成

(1)           在课下完成的工程中修改代码,让串口向PC机打印你的“学号姓名”,之后编译、下载到开发板,看现象。

 

(2)           修改代码实现如下功能

  • 系统开机后,LED0,LED1闪两次,蜂鸣器响一声后停止;
  • 设置中断优先级分组为组3;
  • 按键KEY0抢占优先级为2,响应优先级为0,控制蜂鸣器,按一次,叫一声;
  • 按键KEY1抢占优先级为3,响应优先级为1,控制LED0,按一次,LED0亮一次,再按一次LED0灭;
  • 按键KEY2抢占优先级为3,响应优先级为1,控制LED1,按一次,LED1闪一次;
  • 按键WK_UP抢占优先级为2,响应优先级为1,控制LED0和LED1反转一次;
  • 问KEY0、KEY1、KEY2、WK_UP的中断优先级顺序为?

KEY0>WK_UP>KEY1=KEY2  (KEY2 KEY2看谁先按下谁优先)

  • KEY0、KEY1、KEY2、WK_UP分别对应的外部中断线为?

KEY0对于外部中断线 EXTI4

KEY1对于外部中断线 EXTI3

KEY2对于外部中断线 EXTI2

WK_UP 对于外部中断线 EXTI0

(3)           完成下列问题

假设KEY3接在PE6上,KEY4接在PE7上,输入方式配置成上拉输入,并分别控制LED0和LED1,每按一次各反转一次。

  • 按键初始化代码KEY_Init(void):

答:

 

void  KEY_Init(void)

{

GPIO_InitTypeDef   GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOE,&GPIO_InitStructure);

}

  • 中断初始化代码EXTIX_Init(void):

答:

void EXTIX_Init(void)

{

KEY_Init();

EXTI_InitTypeDef   EXTI_InitStructure;

NVIC_InitTypeDef   NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

//GPIOE.6  KEY3

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource6);

EXTI_InitStructure.EXTI_Line=EXTI_Line6;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;

//优先级

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

//GPIOE.7  KEY3

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource6);

EXTI_InitStructure.EXTI_Line=EXTI_Line7;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;

//优先级

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

  • 中断服务程序函数名为?

答:

void EXTI9_5_IRQHandler(void)

  • 编写中断服务程序:

答:

void EXTI9_5_IRQHandler(void)

{

If (EXTI_GetITstatus(EXTI_Line6)==Set)

{

delay_ms(10);

if(KEY6==1)

{

LED0 =!LED1;

}

EXTI_ClearITPendingBit(EXTI_Line6);

}

If (EXTI_GetITstatus(EXTI_Line7)==Set)

{

delay_ms(10);

if(KEY7===1)

{

LED1 =!LED1;

}

EXTI_ClearITPendingBit(EXTI_Line7);

}

}

  • 查看“STM32中文参考手册.pdf”第132-134页,根据“其它STM32F10XXX产品向量表”。

ü     说明STM32F10xxx有多少个中断源?

答:  73

 

ü     EXTI9_5、和EXTI15_10的中断入口地址是多少?

答: 0x0000_009C

     0x0000_00E0

时间: 2024-12-20 05:39:12

外部中断实验的相关文章

cortex_m3_stm32嵌入式学习笔记(四):外部中断实验

本章学习将STM32的IO口作为外部中断输入(实现和按键扫描一样的功能) STM32 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 的强大之处. STM32F103 的中断控制器支持 19 个外部中断/事件请求.每个中断设有状位,每个中断/事件都有独立的触发和屏蔽设置. STM32F103 的19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断.(本章只学习这一种) 线 16:连接到 PVD 输出. 线 17:连接到 RTC 闹钟事件. 线 18:连接到 USB

嵌入式02 STM32 外部中断实验

一.中断 由于某个事件的发生,CPU暂停当前正在执行的程序,转而执行处理事件的一个程序.该程序执行完成后,CPU接着执行被暂停的程序.这个过程称为中断.(我正在捉泥鳅,但是我妈喊我回家吃饭,我必须回家吃饭,回家途中,发现泥鳅没带,回去把泥鳅带回家,然后吃完饭继续捉泥鳅!!!) 中断是CPU处理外部突发事件的一个重要技术.引起中断的原因或者说发出中断请求的来源叫做中断源.根据中断源的不同,可以分为硬件中断和软件中断两大类,有了中断,系统可以更好更快的利用有限的系统资源解决系统响应速度和运行效率的一

嵌入式系统外部中断实验(按下按键,LED灯依次熄灭)

#include "stm32f10x.h"#include <stdio.h>#include <String.h> void RCC_cfg(void);void GPIO_cfg(void);void Delay(uint32_t nCount);void NVIC_cfg(void);void EXTIX_Init(void); u8 cnt; int main(void){ cnt=0; RCC_cfg(); GPIO_cfg(); NVIC_cfg(

51单片机第五弹---外部中断

写了半天掉线了... 不写了上定义... 什么叫中断 中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去 执行相应的服务处理程序:当服务处理程序运行完毕后,CPU再返回到暂停处继续执行原来的程序. 51单片机的中断 80c51提供有5个中断源,分别为:2个外部中断,2个定时/计数器中断,1个串口发送/接收中断.并且具有2个中断优先级,可以实现2级中断服务程序嵌套. 首先要弄中断设置 ,中断原理图如下: 以 设置INT0为例:I

cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)

很多单片机都有低功耗模式, STM32 也不例外.在系统或电源复位以后,微控制器处于运行状态.运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码.当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时.用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式. STM32 的低功耗模式有 3 种: 1)睡眠模式( CM3 内核停止,外设仍然运行) 2)停止模式(所有时钟都停止) 3)待机模式( 1.8V 内核电源关闭) 在这

「ZigBee模块」基础实验(3)外部中断

1.实现功能 使用中断方式实现: 按键KEY1按下LED1依次亮灭 按键KEY2按下LED2依次亮灭 2.元件连接方式 P1_0连接LED1 P1_1连接LED2 P0_0连接KEY1 P0_1连接KEY2 3.中断相关寄存器 PXIEN P0IEN P1IEN P2IEN 地址 0xAB 0x8D 0xAC PX[7:0] 各个控制口中断使能 (0:中断禁止 1:中断使能) PICTL: D0~D3设置各个端口的中断触发方式(0:上升沿触发 1:下降沿触发) D7控制I/O引脚在输出模式下的驱

CC2540开发板学习笔记(三)&mdash;&mdash;外部中断

一.实验内容 通过外部中断方式依次按下按键S1控制LED1的亮灭 二.实验过程 1.电路原理图同上 2.中断的概念 比如说我们在执行main函数时,突然来了个指令.优先级比现在执行的main还高,那我们便选择跳过去执行优先级高的,完了之后再执行main函数,中断就类似这样一个概念,使用中断可以减少CPU的无效浪费,降低能耗. 3.寄存器调度 (1)LED1的初始化..同前两节,就是SEL,DIR,INP三个,还有附初始状态. (2)外部中断初始化(S1的外部中断初始化) 按键S1外部中断初始化方

(八)中断、定时器的设计与应用 01 单一外部中断

1. 一 .单一外部中断应用案例 参考代码外部中断0 代码: 1 #include<reg52.h> 2 #define uchar8 unsigned char 3 #define uint16 unsigned int 4 5 /*****************************/ 6 // 函数名称: DelayMS( ) 7 // 函数功能: 延时 8 // 入口函数: 延时毫秒 9 // 出口函数: 无 10 /************************* ******

STM32学习笔记(九) 外部中断,待机模式和事件唤醒

学会知识只需要不段的积累和提高,但是如何将知识系统的讲解出来就需要深入的认知和系统的了解.外部中断和事件学习难度并不高,不过涉及到STM32的电源控制部分,还是值得认真了解的,在本文中我将以实际代码为例详细讲解这些内容,希望对每一个阅读者有帮助. 1.外部中断 如果已经学习了SysTick系统时钟滴答实验,掌握了Cortex-M3中断的相关知识,那么外部中断也是比较好理解的,和SysTick中断一样,外部中断也是当有信号触发时,如果中断屏蔽寄存器允许触发,就会产生中断,这时CPU查找中断向量表,