这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 瑞萨中断sample

共14条 1/2 1 2 跳转至

瑞萨中断sample

助工
2009-08-28 22:28:56     打赏

;===============================================
标题一:瑞萨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){
    }

}




关键词: 瑞萨     中断     sample     .lword     vecto    

菜鸟
2009-09-01 19:34:48     打赏
2楼
写得很好啊

菜鸟
2009-09-02 09:21:47     打赏
3楼

补充2点。
1  中断一旦响应,中断请求标志IR位会自动清除。
2  如果在sec30中指定了中断函数地址,应该不用写vect = XXX,这个是使用自动生成向量表时使用的。


菜鸟
2009-12-29 22:02:48     打赏
4楼

不错,这个刚好用到。明天试试。


菜鸟
2009-12-30 17:43:00     打赏
5楼
很感谢!调试通过.

助工
2009-12-30 17:59:43     打赏
6楼
共勉,呵呵

助工
2010-01-05 16:26:45     打赏
7楼
学习中~~~~

助工
2010-01-05 17:50:05     打赏
8楼
我一直都没搞清楚 ,#pragma INTERRUPT/B vect 21 ms_timer_a0
中 /B是什么意思,,虽然我是瑞萨代理,也是个工程师,但是找了很多地方都没发现对/B的描述.

助工
2010-01-07 17:52:37     打赏
9楼

菜鸟
2010-01-12 21:56:01     打赏
10楼

bu cuo ! 


共14条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]