MC9S中断函数编写

MC9S的中断编程主要有两种方式:
  1.使用符号“TRA_PROC” ,TRAP_PROC 提示编译器下面的函数是中断服务例程。编译器会用一个特殊的中断返回指令来结束这个函数(对大多数处理器来说,一般是RTI指令).
  2.使用“interrupt”关键字,“interrupt”关键字是一个非标准ANSI-C的关键字,因此,它不能被所有ANSI-C编译器厂商所支持。同样,对不同的编译器,“interrupt”关键字的用法可能会改变。“interrupt”关键字同样会提示编译器下面的函数是一个中断服务例程。
  一旦中断服务函数写好了,必须把中断服务例程和中断向量表联系起来,这通过初始化中断向量表来实现,可以通过下面两种方法来初始化中断向量表:
  1.在PRM文件中,使用“VECTOR ADDRESS”或“VECTOR”命令。连接器提供两个命令来初始化中断向量表:VECTOR ADDRESS 或 VECTOR,你使用VECTOR ADDRESS 命令中断服务例程的地址写到中断向量表里。
  2.使用“interrupt”关键字,在写中断服务例程的时候,可以在ANSI-C源文件里直接把中断服务例程和特殊的中断号联系起来。


下面是MC9SDG128B的16位自由定时器溢出中断处理程序,已调试通过:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

int intcount = 0; 
void timer_init(void) 
{ 
    TSCR2_PR0 = 1; //prescale factor is 128 
    TSCR2_PR1 = 1; 
    TSCR2_PR2 = 1; 
    TSCR2_TOI = 1; //overflow enable 
    TFLG2_TOF = 1; 
    TSCR1_TEN = 1; //timer enable
}

#pragma CODE_SEG NON_BANKED
interrupt 16 void timer_interrupt_handle(void)
{ 
    intcount++; 
    TFLG2_TOF = 1; //clear interrupt flag
}
#pragma CODE_SEG DEFAULT 

void main(void)
{ 
    EnableInterrupts; 
    timer_init(); 
    for(;;) {}
}

  以下是采用TRAP_PROC符号编写的中断服务程序:

#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
int intcount = 0;
void timer_init(void)
{ 
    TSCR2_PR0 = 1; //prescale factor is 128 
    TSCR2_PR1 = 1; 
    TSCR2_PR2 = 1; 
    TSCR2_TOI = 1; //overflow enable 
    TFLG2_TOF = 1; 
    TSCR1_TEN = 1; //timer enable
}

#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
void timer_interrupt_handle(void)
{
    intcount++; 
    TFLG2_TOF = 1;
};
#pragma CODE_SEG DEFAULT

void main(void)
{ 
    EnableInterrupts; 
    timer_init(); 
    for(;;) {}
}

  中断服务程序编写完后你需要在.prm文件里添加如下一句:

VECTOR 16 timer_interrupt_handle

  这样中断服务程序才和相应的中断号联系起来。

  中断服务例程必须被定位于non-banked 区域,通过使用“#pragma CODE_SEG NON_BANKED”可以把中断例程定位于non-banked 区域。同时你必须确保“sectionNON_BANKED”不能出现在.prm文件中。在中断服务例程的末尾你需要添加“#pragma CODE_SEG DEFAULT”,否则的话,后面的函数也会被定位在“non-banked”区域。
  所以说我们的中断服务例程必须被“#pragma CODE_SEG NON_BANKED”和“#pragma CODE_SEG DEFAULT”包围起来。

### 回答1: MC9S12是一款高性能、低功耗的16位微控制器,适用于各种嵌入式系统开发。MC9S12开发例程是指为了帮助开发人员更好地使用MC9S12微控制器而提供的一些示例代码和应用程序。这些开发例程涵盖了MC9S12常用的功能模块,如IO口、定时器、中断控制器、串口通信等。通过学习和使用这些开发例程,开发人员可以更加快速和方便地开发出符合自己需求的嵌入式系统。 MC9S12开发例程一般包含以下几个方面的内容: 1. IO口示例:展示如何配置和使用MC9S12的IO口,包括输入输出、中断等功能。通过这些示例,开发人员可以了解MC9S12的IO口工作原理和相关寄存器的配置方法。 2. 定时器示例:介绍如何使用MC9S12的定时器模块,并展示定时器的应用场景,如定时中断、计时器功能等。这些示例帮助开发人员掌握MC9S12定时器的使用方法和编程技巧。 3. 中断控制器示例:演示如何配置和使用MC9S12的中断控制器,包括中断向量表的设置、中断服务函数编写等。通过这些示例,开发人员能够实现对特定事件的中断响应和处理。 4. 串口通信示例:展示如何通过MC9S12的串口模块进行数据的收发和通信。开发人员可以学习串口通信的原理和相关寄存器的配置,以及如何实现简单的串口通信协议。 通过使用MC9S12开发例程,开发人员可以快速入门MC9S12微控制器的应用开发,加快开发进度,提高开发效率。同时,开发人员还可以根据自己的需求修改和扩展这些例程,以实现更加复杂的功能。总之,MC9S12开发例程是开发人员在使用MC9S12微控制器时的宝贵参考资料,对于快速掌握MC9S12的开发技巧和实现自己的嵌入式系统非常有帮助。 ### 回答2: MC9S12开发例程是一种用于MC9S12单片机的软件开发指南,旨在帮助开发人员快速地理解和学习使用MC9S12系列单片机进行嵌入式系统开发。它提供了丰富的代码示例和详细的说明,帮助开发人员了解MC9S12的基本功能和特性。 MC9S12开发例程通常包括以下几个方面的内容: 1. 硬件初始化:包括对MC9S12单片机外设的初始化配置,如GPIO、定时器、中断等。 2. 中断处理:介绍如何配置和处理MC9S12的中断,如外部中断、定时器中断等。 3. 通信接口:包括串口、SPI、I2C等通信接口的初始化和使用方法,帮助开发人员与外部设备进行通信。 4. 定时器和计数器:介绍MC9S12内部定时器和计数器的使用方法,包括定时器中断、定时器输出比较等功能。 5. 脉宽调制(PWM):介绍如何使用MC9S12的PWM模块来生成脉宽调制信号,实现对电机、LED等设备的控制。 6. FLASH编程:介绍如何使用MC9S12内部的FLASH模块进行程序的下载和更新。 MC9S12开发例程不仅提供了代码示例,还提供了详细的说明文档,帮助开发人员理解代码的原理和使用方法。通过学习和实践这些例程,开发人员可以更好地掌握MC9S12单片机的开发和应用,提高开发效率,减少开发风险。总之,MC9S12开发例程是一种非常有价值的学习和工作工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值