微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 瑞萨HEW中写中断函数的方法

瑞萨HEW中写中断函数的方法

时间:10-02 整理:3721RD 点击:
以下用R8C/1B为例写TimerX的中断函数:
1、首先确认TimerX的中断向量标号为22,数据手册中断章节可以查到。
2、改写sect30.inc文件中的向量表

  1. .lword dummy_int ; vector 17
  2. .lword dummy_int ; vector 18
  3. .lword dummy_int ; vector 19
  4. .lword dummy_int ; vector 20
  5. .lword dummy_int ; vector 21
  6. .glb _TimerXInt
  7. .lword _TimerXInt ; vector 22
  8. .lword dummy_int ; vector 23
  9. .lword dummy_int ; vector 24
  10. .lword dummy_int ; vector 25

复制代码

3、写中断函数,用户程序文件当中
/**************************************************************
*函数原型: TimerXInt
*功能 : TIMER X 中断 中断向量22
**************************************************************/

  1. #pragma INTERRUPT TimerXInt() vect=22;
  2. void TimerXInt(void)    //1s
  3. {
  4. ir_txic = 0;
  5.            用户代码
  6. }

复制代码


4、开相关中断并设置中断优先级
/*************************************************************
*函数原型: InitTimerX()
*功能 : 短延时程序,约6US @8MHz
**************************************************************/

  1. void InitTimerX()    // 定时器X
  2. {

  3.     txck0 = 1;
  4.     txck1 = 0;
  5.     prex=125;
  6.     tx=125;
  7.     txmr = 0x00;
  8.     txic = 1;        // Interrupt priority level = 1
  9.     ir_txic = 0;     // Interrupt request flag clear
  10.     txs = 1;        // Timer X count start flag = start
  11. }

复制代码

5、开中断
asm("FSET I");
;================================================
标题二:R8C/1A 1B系列的相关例程和应用
TimerX的中断使用例程:

  1. 初始化程序:
  2. void InitTimerX()    // 定时器X
  3. {
  4. txck0 = 0;                                     /* Timer X count source = f1 */
  5.     txck1 = 0;

  6.     /* Setting main cycle timer */
  7.     /* 8MHz * 1/1 * 256 * 250 = 2ms */
  8.     prex = 256-1;                          /* Setting Prescaler X register */
  9.     tx   = 250-1;                            /* Setting timer X register */

  10.     txmr = 0x00;                           /* Timer X : timer mode */
  11.     txic = 5;                                   /* Interrupt priority level = 5 */

  12.     ir_txic = 0;                              /* Interrupt request flag clear */
  13.     txs = 1;                                  /* Timer X count start flag = start */

  14. }
  15. 中断程序:
  16. #pragma INTERRUPT TimerXInt() vect=22;
  17. void TimerXInt(void)    //6.4ms
  18. {
  19. //用户程序
  20. ir_txic = 0;

  21. }
  22. 中断向量:SECT30.INC文件中
  23. .glb _TimerXInt
  24. .lword _TimerXInt ; vector 22

复制代码


;================================================
标题三:关于M16C/62P的定时器中断

  1. #include "sfr62p.h"
  2. /******************************************************/
  3. //定时器模式,中断A0
  4. #pragma INTERRUPT/B vect 21 ms_timer_a0
  5. void ms_timer_a0(void){

  6. ta0 = 24000-1;     //1msec @24MHz

  7. if(beep_time==0)beep=1;
  8. else beep_time--;

  9. }

  10. /*****************************************************
  11. 等待20ms,直到PLL时钟稳定
  12. ******************************************************/
  13. void pll_stable_20ms(void)      
  14. {

  15. //TA0MR:定时器A0模式寄存器
  16. ta0mr = 0x80;                         //定时器模式,32分频

  17. ta0 = 3750-1;                         //20ms:@6MHz, f32

  18. ta0ic = 0x00;                          //Level 0
  19. tabsr = 0x01;                         //TimerA0启动

  20. while(ir_ta0ic == 0){}           //延时20ms;Vcc = 5V
  21. tabsr = 0x00;                         //TimerA0停止
  22. ir_ta0ic = 0;                           //清中断标志位

  23. }

  24. /******************************************************/
  25. //寄存器初始化
  26. void mcu_init(void)
  27. {

  28. prc0=1;//允许写PRC0
  29. prc1=1;//允许写PRC1

  30. pm0    = 0x00;        //单芯片模式
  31. pm1    = 0x08;

  32. cm0    = 0x08;        //主时钟
  33. cm1    = 0x20;        //系统时钟为主时钟

  34. plc0 = 0x12;

  35. pm2 = 0x00;

  36. plc0 = 0x92;              //PLL时钟启动

  37. pll_stable_20ms(); //等待20ms,直到PLL时钟稳定
  38. cm1 = 0x22;             //系统时钟为PLL时钟

  39. pclkr = 0x03;

  40. prc0=0;
  41. prc1=0;                     //PRCR禁止写

  42. adcon2 = 0x01;      //AD4分频;端口P10;采样保持

  43. adcon0 = 0x02;     //软件触发;单次模式;通道2

  44. adcon1 = 0x28;     //不使用ANEX0和ANEX1;Vref;10位模式

  45. //定时器设置
  46. ta0ic = 0x01;          //有中断请求,LEVEL 1
  47. ta0mr = 0x00;        //定时器模式,f1
  48. ta0 = 24000-1;      //1msec @24MHz
  49. ta0s = 1;                 //start counting

  50. }


  51. /******************************************************/
  52. void main(void)
  53. {
  54. mcu_init();    //寄存器初始化

  55. while(1){
  56.     }

  57. }

复制代码


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

谢谢分享,大赞!

小编,这些东西看不懂啊~~

...                               谢谢分享学习一下

好,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top