;===============================================
标题一:瑞萨HEW中怎样写中断函数
以下用R8C/1B为例写TimerX的中断函数:
1、首先确认TimerX的中断向量标号为22,数据手册中断章节可以查到。
2、改写sect30.inc文件中的向量表
.lword dummy_int ; vector 17
.lword dummy_int ; vector 18
.lword dummy_int ; vector 19
.lword dummy_int ; vector 20
.lword dummy_int ; vector 21
.glb _TimerXInt
.lword _TimerXInt ; vector 22
.lword dummy_int ; vector 23
.lword dummy_int ; vector 24
.lword dummy_int ; vector 25
3、写中断函数,用户程序文件当中
/************************************************************************
*函数原型: TimerXInt
*功能 : TIMER X 中断 中断向量22
************************************************************************/
#pragma INTERRUPT TimerXInt() vect=22;
void TimerXInt(void) //1s
{
ir_txic = 0;
用户代码
}
4、开相关中断并设置中断优先级
/************************************************************************
*函数原型: InitTimerX()
*功能 : 短延时程序,约6US @8MHz
************************************************************************/
void InitTimerX() // 定时器X
{
txck0 = 1;
txck1 = 0;
prex=125;
tx=125;
txmr = 0x00;
txic = 1; // Interrupt priority level = 1
ir_txic = 0; // Interrupt request flag clear
txs = 1; // Timer X count start flag = start
}
5、开中断
asm("FSET I");
;==================================================================
标题二:R8C/1A 1B系列的相关例程和应用
TimerX的中断使用例程:
初始化程序:
void InitTimerX() // 定时器X
{
txck0 = 0; /* Timer X count source = f1 */
txck1 = 0;
/* Setting main cycle timer */
/* 8MHz * 1/1 * 256 * 250 = 2ms */
prex = 256-1; /* Setting Prescaler X register */
tx = 250-1; /* Setting timer X register */
txmr = 0x00; /* Timer X : timer mode */
txic = 5; /* Interrupt priority level = 5 */
ir_txic = 0; /* Interrupt request flag clear */
txs = 1; /* Timer X count start flag = start */
}
中断程序:
#pragma INTERRUPT TimerXInt() vect=22;
void TimerXInt(void) //6.4ms
{
//用户程序
ir_txic = 0;
}
中断向量:SECT30.INC文件中
.glb _TimerXInt
.lword _TimerXInt ; vector 22
;==================================================
标题三:关于M16C/62P的定时器中断
#include "sfr62p.h"
/*************************************************************************/
//定时器模式,中断A0
#pragma INTERRUPT/B vect 21 ms_timer_a0
void ms_timer_a0(void){
ta0 = 24000-1; //1msec @24MHz
if(beep_time==0)beep=1;
else beep_time--;
}
/*************************************************************************
等待20ms,直到PLL时钟稳定
*************************************************************************/
void pll_stable_20ms(void)
{
//TA0MR:定时器A0模式寄存器
ta0mr = 0x80; //定时器模式,32分频
ta0 = 3750-1; //20ms:@6MHz, f32
ta0ic = 0x00; //Level 0
tabsr = 0x01; //TimerA0启动
while(ir_ta0ic == 0){} //延时20ms;Vcc = 5V
tabsr = 0x00; //TimerA0停止
ir_ta0ic = 0; //清中断标志位
}
/*************************************************************************/
//寄存器初始化
void mcu_init(void)
{
prc0=1;//允许写PRC0
prc1=1;//允许写PRC1
pm0 = 0x00; //单芯片模式
pm1 = 0x08;
cm0 = 0x08; //主时钟
cm1 = 0x20; //系统时钟为主时钟
plc0 = 0x12;
pm2 = 0x00;
plc0 = 0x92; //PLL时钟启动
pll_stable_20ms(); //等待20ms,直到PLL时钟稳定
cm1 = 0x22; //系统时钟为PLL时钟
pclkr = 0x03;
prc0=0;
prc1=0; //PRCR禁止写
adcon2 = 0x01; //AD4分频;端口P10;采样保持
adcon0 = 0x02; //软件触发;单次模式;通道2
adcon1 = 0x28; //不使用ANEX0和ANEX1;Vref;10位模式
//定时器设置
ta0ic = 0x01; //有中断请求,LEVEL 1
ta0mr = 0x00; //定时器模式,f1
ta0 = 24000-1; //1msec @24MHz
ta0s = 1; //start counting
}
/*************************************************************************/
void main(void)
{
mcu_init(); //寄存器初始化
while(1){
}
}
文章评论(0条评论)
登录后参与讨论