将单片机的外部中断1、定时器中断0打开,要求定时器0的中断优先级高于外部中断1,外部中断1采用边沿?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将单片机的外部中断1、定时器中断0打开,要求定时器0的中断优先级高于外部中断1,外部中断1采用边沿?相关的知识,希望对你有一定的参考价值。

沿触发方式。请至少用两种方式对中断系统初始化

关于中断的优先级有一下原则:
1、CPU同时接收到几个中断时,首先响应优先级最高的中断请求,低优先的进入队列等待;
2、正在进行的中断过程不能被新的同级或低优先级的中断请求所中断;
3、正在进行的低优先级中断服务,能被高优先级中断请求中断;

那么,IP寄存器的某一中断配置为1就成为高优先级。每一个中断在IP里面只占一位配置位(IP.x=0或OP.x=1),也就是说系统里只存在两种优先级,要么是高优先级,要么是低优先级。

如果,任何中断都不配置IP寄存器的优先级,也等同于系统上电时,默认的优先级顺序如下:

外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断

关于外部中断的寄存器已经了解清楚了,接下来看代码设计:

外部中断0(下降沿触发)
/*-----------------------------------------------
  功能:外部中断0边沿触发
  现象:首先将P3.2口通过上拉电阻接到电源,保证在空闲时P3.2处于高电平;
       当外部中断信号输出口P3.2接到GND时,产生了一个下降沿信号,接到P0.0
       口的LED灯反转;若此后P3.2持续接到GND,LED只反转一次,这与电平触发
       有区别。
------------------------------------------------*/
#include 
sbit LED=P0^0; //定义LED端口
void DelayMs(unsigned char t)     //大致延时1mS

 unsigned short T=500;
 while(t--)
 
     while(--T);
 

void INT0_init(void) //外部中断0初始化

  LED=1;       //LED口初始值
  EA=1;          //全局中断开
  EX0=1;         //外部中断0开
  IT0=1;         //边沿触发

main()

  INT0_init();
  while(1)
     //主循环
 

//中断服务程序  interrupt 0 指明是外部中断0的中断函数
/*
interrupt 0  指明是外部中断0;
interrupt 1  指明是定时器中断0; 
interrupt 2  指明是外部中断1;
interrupt 3  指明是定时器中断1;
interrupt 4  指明是串行口中断;
*/
void ISR_Key(void) interrupt 0 using 1

 if(!INT0)
    DelayMs(10);       //防抖动
    if(!INT0)         
     LED=!LED;         //按下触发一次,LED取反一次
   
 

外部中断0(电平触发)
/*-----------------------------------------------
  功能:外部中断0电平触发
  现象:首先将P3.2口通过上拉电阻接到电源,保证在空闲时P3.2处于高电平;
       当外部中断信号输出口P3.2接到GND时,产生了一个低电平信号,接到P0.0
       口的LED灯反转;若此后P3.2持续接到GND,LED会反复反转,这与边沿触
       发有区别。
------------------------------------------------*/
#include 
sbit LED=P0^0; //定义LED端口
void DelayMs(unsigned char t)     //大致延时1mS

 unsigned short T=500;
 while(t--)
 
     while(--T);
 

void INT0_init(void) //外部中断0初始化

  LED=1;       //LED口初始值
  EA=1;          //全局中断开
  EX0=1;         //外部中断0开
  IT0=0;         //电平触发

main()

  INT0_init();
  while(1)
     //主循环
 

//中断服务程序  interrupt 0 指明是外部中断0的中断函数
/*
interrupt 0  指明是外部中断0;
interrupt 1  指明是定时器中断0; 
interrupt 2  指明是外部中断1;
interrupt 3  指明是定时器中断1;
interrupt 4  指明是串行口中断;
*/
void ISR_Key(void) interrupt 0 us
参考技术A PT0=1;//此句能编译,因IP寄存器可位寻址。
ET0=1;

ET1=1;
EA=1;
EX1=1;
IT1=1;追问

要两种方式呢

追答

另一种方式应该是直接写 IP=0X02 // PT0 IP.1 定时器0中断优先级设为1,其余为0
IE=0X9F
IE的D7到D0位分别是:
EA=1
空闲 - 设为0

空闲-设为0
ES=1

ET1=1
EX1=1
ET0=1

EX0=0

参考技术B :通过外部中断0,触发一个延时过程,假定延时时间为1秒,延时期间可以点亮一个LED或让蜂鸣器发出声音。已知单片机晶振频率为6 .00MHz。提示:可以使用定时器中断,也可以不使用定时器中断。如果使用定时器中断,则把中断重新启动工作放在外部中断服务程序中,一旦定时器从新启

STM32外部中断无法进入中断程序,请问下面的程序哪里不对呀???

PC2口进行AD采样。程序编写思路:现将PC2口配置成外部中断的EXIT2,当EXIT2检测到上升沿时进入EXIT2的外部中断服务程序打开定时器5,定时一段时间后,在定时器5的中断服务程序中打开AD采样。
1、main.c中用下面一句话作为开启PC2口作为外部中断EXIT2,可以吗??
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,DISABLE);
2、exti.c中PC2口配置成外部中断 EXTI2
static void EXTI_GPIO_MODE_Config(void)

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStructure);

static void EXTI_NVIC_Configuration(void)

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

static void EXTI_MODE_Config(void)

EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

void EXTI_PC2_Config(void)

EXTI_GPIO_MODE_Config();
EXTI_NVIC_Configuration();
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);
EXTI_MODE_Config();

3、stm32f10x_it.c程序中
void EXTI2_IRQHandler(void)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,DISABLE);//禁止外部中断EXTI2
START_TIM5();//打开定时器5

我希望你学会一步一步地调试程序,而不是一上来就一股脑的把代码都加进去,结果出问题了,就很主观地认为是哪里哪里出问题。
你的思路是没问题的,但是你看不到实际的结果就以为是中断出了问题。
我建议你这样,
1、先查找一下你所使用的芯片数据手册,看一下外中断接口是哪一个IO。
2、只做外中断功能,检测到下降沿之后让一个连接LED的IO电平翻转,观察中断是否成功。
3、只做定时器功能,定时时间到让连接LED的IO电平翻转,观察定时器是否成功。
4、在定时器中的服务函数里,做AD采样功能,观察AD是否成功采样。

5、把上述的功能联合起来。追问

采样时做外部中断的IO口GPIO_Mode应该设置成什么模式啊,GPIO_Mode_IPU,GPIO_Mode_AIN,还是GPIO_Mode_IN_FLOATING??

追答

AIN是模拟输入的意思吗?不好意思,好久没用这个了,你到开源电子网下载一些正点原子的开发板例程吧

来自:求助得到的回答
参考技术A 1)我不知道你是怎么用DISABLE开启的。
2)请检查中断函数名是否与启动代码中的中断函数名一致。
3)你在中断函数里关时钟做什么用?
4)不要在中断函数里做处理。追问

我用外部中断为了检测到上升沿,之后直接开启定时器计时,所以要关闭中断

追答

外部中断怎么能用上升沿?高电平没办法把低电平拉高啊。
除非你一直都是低电平,靠按键什么的将电平拉高。
一直都是低电平会导致功耗增加。为什么不用下降沿触发??

本回答被提问者采纳

以上是关于将单片机的外部中断1、定时器中断0打开,要求定时器0的中断优先级高于外部中断1,外部中断1采用边沿?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用外部中断要打开syscfg时钟

外部中断和计时器要点

51单片机的中断嵌套怎么实现呢?

51单片机外部中断0函数执行时,又来了个外部中断0信号

单片微机原理P2:80C51外部中断与定时器系统

[电子百科] 单片机怎样管理中断?怎样开放和禁止中断?怎样设置优先级?