在sdcc中,中断处理函数使用关键字__interrupt标识,后面跟上中断号,8051中断号列表如下:
Interrupt # Description Vector Address
0 External 0 0x0003
1 Timer 0 0x000b
2 External 1 0x0013
3 Timer 1 0x001b
4 Serial 0x0023
5 Timer 2 (8052) 0x002b
虽然看上去很简单,但是在使用过程中还出现了一个小问题,由于我将程序分成了两个部分,main.c和timer.c,而在timer.c中的定时器中断处理函数timer0_isr始终是不能被执行,检查程序呢也未发现什么原因,通过查看sdcc中的源代码和上网查找timer部分代码,也未发现timer0初始化有任何问题,顿时就郁闷了。但是也发现两个一个不同之处,就是在main函数之前对中断处理函数做了一个声明,于是我就在我的程序中加上了这个声明,程序终于调用了中断处理函数,特此记录一下。完整的程序如下:
/* timer.c */
#include
#define OSC_FREQ 12000000UL
#define TIMER_MODE0 0x00
#define TIMER_MODE1 0x01
#define TIMER_MODE2 0x02
#define TIMER_MODE3 0x03
volatile unsigned int count = 0;
void timer0_isr(void) __interrupt 1
{
count++;
TH0 = (65536-1000*(OSC_FREQ/12000000)) >> 8;
TL0 = (65536-1000*(OSC_FREQ/12000000)) & 0x00FF;
}
void timer0_init(void)
{
TMOD &= 0xF0;
TMOD |= TIMER_MODE1; /* Timer 0 work on 16-bit timer mode */
TH0 = (65536-1000*(OSC_FREQ/12000000)) >> 8;
TL0 = (65536-1000*(OSC_FREQ/12000000)) & 0x00FF;
ET0 = 1; /* Enable timer 0 interrupt */
EA = 1;
TR0 = 1; /* Turn on timer 0 */
}
void delayms(unsigned int n)
{
while (count <= n);
count = 0;
}
/* timer.h */
#ifndef __TIMER_H
#define __TIMER_H
extern void timer0_init(void);
extern void delayms(unsigned int n);
#endif /* __TIMER_H */
/* main.c */
#include
#include "timer.h"
#define led1 P2_0
void timer0_isr(void) __interrupt 1;
void main(void)
{
timer0_init();
while (1) {
led1 = 0;
delayms(1000);
led1 = 1;
delayms(1000);
}
}
注:经验证,在Keil中未出现该问题。
关键字:sdcc 中断
引用地址:
sdcc 中断使用中的一个问题
推荐阅读最新更新时间:2024-03-16 15:32
PIC12F615 电平中断调试注意
昨天调试电平中断,想实现GP1按下,GP4上的LED灯状态改变。程序按步就班,GP1启用弱上拉,再接按钮到地线。可是接PICKit3上调试时,PCB上的LED灯就是不灭。一直以为是代码的问题,后来才发现,是PICKit3供电不足。接上5V电后就正常了。调试时怕麻烦,GP1可以接个1K~4.7K的电阻上拉也能正常使用。 相关程序代码如下: unsigned char GPtemp;//电平中断读取用 void DebounceDelay(unsigned char us) { while(us--); } void InitGPINT(void) //电平变化中断 查看Datasheet 44页 { nGP
[单片机]
51单片机实现在在定时中断里动态扫描数码管的程序
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: LED-74HC595 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200605 ---- @ModifiedTime: 20200605
[单片机]
STM32F429之 嵌套向量中断控制器NVIC
外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成,对于其它 产品,则有19个能产生事件/中断请求的边沿检测器。每个输入线可以独立地配置输入类型(脉冲 或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏 蔽。挂起寄存器保持着状态线的中断请求。 主要特性 EXTI控制器的主要特性如下: ● 每个中断/事件都有独立的触发和屏蔽 ● 每个中断线都有专用的状态位 ● 支持多达20个软件的中断/事件请求 ● 检测脉冲宽度低于APB2时钟宽度的外部信号。参见数据手册中电气特性部分的相关参数。 STM32中有两个优先级的概念:抢占式优先级和响应优先级(也叫副优先级)。 他们的特性是: 1:高
[单片机]
ARM 中断处理过程
1.寄存器R16用作CPSR(Current Program Status Register,当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。 每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register,备份的程序状态寄存器),当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。 由于用户模式和系统模式不属于异常模式,他们没有SPSR,当在这两种模式下访问SPSR,结果是未知的 当中断产生的时候,把CPSR保存在SPSR是自动完成的。
[单片机]
STM32库函数详解----(外部中断/事件控制器 EXTI)
1.void EXTI_DeInit (void) 函数解释:将EXTI外设寄存器重置为默注释。RCC_APB2PeriphResetCmd参数中没有EXTI外设的的宏,该外设重置采取的是直接向寄存器赋默认值的操作。 例子:EXTI_DeInit ( ); 2.void EXTI_Init (EXTI_InitTypeDef*EXTI_InitStruct) 函数解释:根据EXTI_InitStruct结构体中所配置的参数来初始化外设EXTI寄存器。结构体中模式成员设置了被使能线路是事件请求还是中断请求。 例子:EXTI_Init (&EXTI_InitStruct); EXTI_Line: EXTI_
[单片机]
STM32串口中断 RXNE TXE
RXNE中断 (使能位为RXNEIE) 串口接收寄存器非空中断, 通过读取接收寄存器清除中断标志位 TXE中断(使能位为TXEIE) 串口发送寄存器空中断, 当不需要发送数据时,需要失能此中断,否则由于满足发送寄存器为空的条件,会一直进入中断 通过写接收寄存器清除中断标志位,当发送完成时寄存器为空,此位又会被被硬件置1 进入中断时,需要判断中断标志位和中断使能位,当两个标志位同时为1时才满足中断的条件,否则由于不同中断源共用中断入口而导致错误。(如RXNE触发了中断,此时TXE标志位也可能为1,若没有对TXEIE位进行判断可能会误认为产生了TXE中断,造成错误)
[单片机]
基于AVR单片机捕获中断和热敏电阻的温度测量
1 负温热敏电阻 PSB型负温热敏电阻由Co,Mn,Ni等过渡金属元素的氧化物组成,经高温烧成半陶瓷,利用半导体毫微米的精密加工工艺,采用玻璃管封装,耐温性好,可靠性高,反应速度快、灵敏度高。他采用轴向型结构,便于安装,能承受更高温度,且玻璃封装耐高低温(-50~350℃)。PT-25E2热敏电阻温度阻值变化曲线图如图1所示。 2 AVR单片机测温原理 温度测量电路如图2所示,标准电阻Rp,热敏电阻Rt,电容C1与AVR单片机三个引脚相连。其中PC0,PC1为一般普通IO引脚,CP1为捕获触发输入引脚,可以设定上升沿触发捕获中断。 Rp为100 kΩ的精密电阻;Rt为100 kΩ精度为1%的热敏电阻;C1为
[单片机]
stm8s中断优先级程序的理解及设置方法
STM8的中断优先级 STM8S的中断由中断控制器(ITC)控制。STM8所有IO都支持中断,分为PA~PE 5个组,每组IO对应一个中断服务函数(也就是每组IO只有一个向量)。 STM8没有专门的中断状态寄存器,所以只能通过刚进入中断就读取IDR来判断,不过在某些情况下,此种方法就不好用了,所以在设计的时候就要考虑清楚,是不是会冲突。最好把有冲突的中断放到不同的组。STM8的外部中断采用软件优先级+硬件优先级的控制方法,来控制优先级分组。软件优先级优先于硬件优先级。 硬件优先级由向量号确定,向量号越小,优先级越高。STM8软件优先级设置可以分为4个等级(0~3),实际上可设置的就三个等级:1~3优先级顺序
[单片机]