sdcc 中断使用中的一个问题

发布者:梦幻之光最新更新时间:2017-02-04 来源: eefocus关键字:sdcc  中断 手机看文章 扫描二维码
随时随地手机看文章

在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函数之前对中断处理函数做了一个声明,于是我就在我的程序中加上了这个声明,程序终于调用了中断处理函数,特此记录一下。完整的程序如下:


  1. /* timer.c */  

  2. #include   

  3.   

  4. #define OSC_FREQ        12000000UL  

  5.   

  6. #define TIMER_MODE0     0x00  

  7. #define TIMER_MODE1     0x01  

  8. #define TIMER_MODE2     0x02  

  9. #define TIMER_MODE3     0x03  

  10.   

  11. volatile unsigned int count = 0;  

  12.   

  13. void timer0_isr(void) __interrupt 1  

  14. {  

  15.         count++;  

  16.   

  17.         TH0 = (65536-1000*(OSC_FREQ/12000000)) >> 8;  

  18.         TL0 = (65536-1000*(OSC_FREQ/12000000)) & 0x00FF;  

  19. }  

  20.   

  21. void timer0_init(void)  

  22. {  

  23.         TMOD &= 0xF0;  

  24.         TMOD |= TIMER_MODE1;    /* Timer 0 work on 16-bit timer mode */  

  25.         TH0 = (65536-1000*(OSC_FREQ/12000000)) >> 8;  

  26.         TL0 = (65536-1000*(OSC_FREQ/12000000)) & 0x00FF;  

  27.         ET0 = 1;                /* Enable timer 0 interrupt */  

  28.         EA = 1;  

  29.         TR0 = 1;                /* Turn on timer 0 */  

  30. }  

  31.   

  32. void delayms(unsigned int n)  

  33. {  

  34.         while (count <= n);  

  35.   

  36.         count = 0;  

  37. }  



  1. /* timer.h */  

  2. #ifndef __TIMER_H  

  3. #define __TIMER_H  

  4.   

  5. extern void timer0_init(void);  

  6. extern void delayms(unsigned int n);  

  7.   

  8. #endif /* __TIMER_H */  



  1. /* main.c */  

  2. #include   

  3.   

  4. #include "timer.h"  

  5.   

  6. #define led1 P2_0  

  7.   

  8. void timer0_isr(void) __interrupt 1;  

  9.   

  10. void main(void)  

  11. {  

  12.         timer0_init();  

  13.   

  14.         while (1) {  

  15.                 led1 = 0;  

  16.                 delayms(1000);  

  17.                 led1 = 1;  

  18.                 delayms(1000);  

  19.         }  

  20. }  



注:经验证,在Keil中未出现该问题。


关键字:sdcc  中断 引用地址:sdcc 中断使用中的一个问题

上一篇:ubuntu下搭建msp430开发环境
下一篇:8051定时器的使用

推荐阅读最新更新时间: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
[单片机]
51单片机实现在在定时<font color='red'>中断</font>里动态扫描数码管的程序
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为
[单片机]
基于AVR单片机捕获<font color='red'>中断</font>和热敏电阻的温度测量
stm8s中断优先级程序的理解及设置方法
  STM8的中断优先级   STM8S的中断由中断控制器(ITC)控制。STM8所有IO都支持中断,分为PA~PE 5个组,每组IO对应一个中断服务函数(也就是每组IO只有一个向量)。   STM8没有专门的中断状态寄存器,所以只能通过刚进入中断就读取IDR来判断,不过在某些情况下,此种方法就不好用了,所以在设计的时候就要考虑清楚,是不是会冲突。最好把有冲突的中断放到不同的组。STM8的外部中断采用软件优先级+硬件优先级的控制方法,来控制优先级分组。软件优先级优先于硬件优先级。   硬件优先级由向量号确定,向量号越小,优先级越高。STM8软件优先级设置可以分为4个等级(0~3),实际上可设置的就三个等级:1~3优先级顺序
[单片机]
stm8s<font color='red'>中断</font>优先级程序的理解及设置方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved