这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Renesas » R8C开发板学习笔记

共15条 2/2 1 2 跳转至
菜鸟
2014-02-28 15:38:48     打赏
11楼

5、R8C34W中断向量定义错误提示,如“Interrupt number "22" of "vector" has multiple definition.

解决方法:出现的原因是对中断号为22的中断向量重复定义,在用户程序定义该中断函数,如:

// timer RA (software int 22)

#pragma interrupt _timer_ra(vect=22)

void  timer_ra(void);

void  timer_ra(void){

//具体应用程序

}

但是忽略了HEW自动生成文件intprg.c包含对中断向量的定义,应该把intprg.c文件里对中断向量22的定义部分注释掉或删除。

 


院士
2014-02-28 15:40:44     打赏
12楼
学习了楼主的帖子,谢谢分享。

菜鸟
2014-03-04 15:48:32     打赏
13楼
R8C&UART常见FAQ.docFAQS for E8A.doc

Uart1通信例程

功能描述:用UART1PC端接收字符,并把字符返给PC端。

模式:9600-8- even-1

程序简介:

void main(void)

{

clk_set();      //设置时钟为无分频外部晶振

port_cfg();     //设置I/OP0_1/TXD1为输出端口、P0_2/RXD1为输入端口

uart_intial();  //UART1 初始化设置

rcv_cnt = 0;    //接收字符个数清零

ENABLE_IRQ;     // 允许中断

}

/**********************************************************************

 *   Function Name: uart_intial()

 * Description:  Set UART1:9600-8-N-1.

 *             Note: None 

 *  Parameters: None.

 * Returns: None

 * Ext. References: None

 * Preemptible: No.

 *   Reentrant: No.

 *********************************************************************/

void uart_intial(void)

{

        txd1sel0 = 1; 

        txd1sel1 = 0;   //选择P0_1为 TXD1

        rxd1sel0 = 1;  

        rxd1sel1 = 0;   //选择P0_2为 RXD1

        clk1sel0 = 1;

        clk1sel1 = 0;   //选择P0_3CLK1

        smd2_u1mr = 1;

        smd1_u1mr = 0;

        smd0_u1mr = 1;  //UART mode, transfer data 8 bits long

        ckdir_u1mr = 0; //select Internal clock

        stps_u1mr = 0;  //1 stop bit

        pry_u1mr = 1;   //Even 校验

        prye_u1mr = 1;  //校验使能

        clk0_u1c0 = 0;  

        clk1_u1c0 = 0;  //选择f1作为BRG count source

        u1brg = 129;    // bit rate 9600bps

        te_u1c1 = 1;    //UART1 Transmit enable

        re_u1c1 = 1;    //UART1 receive  enable

        u1irs_u1c1 = 0; //选择trans buffer empty(TI=1)作为UART1 transmit中断源 

        u1rrm_u1c1 = 0; //continuous receive mode disabled

        ilvl0_s1ric = 1;

        ilvl1_s1ric = 1;

        ilvl2_s1ric = 1;//UART1 receive inttupt priotity7,最高中断优先级

        IPL_0;          // IPL=0,即响应所有优先级别的中断

}

/**********************************************************************

 *   Function Name: uart1_receive()

 * Description: Reback the data to PC port with UART1.

 *             Note: None 

 *  Parameters: None.

 * Returns: None

 * Ext. References: None

 * Preemptible: No.

 *   Reentrant: No.

 *********************************************************************/

// UART1 receive (software int 20)

#pragma interrupt uart1_receive(vect=20)

void  uart1_receive(void)

{

    LED2 =!LED2;     //LED2闪烁一次

    ir_s1ric = 0;    //IR清零        

    rcv_work = u1rb; // Copy character from UART buffer to rcv_work变量 

    if (++rcv_cnt >= 8)

        {

            rcv_cnt = 0;

        }           

    uart1receive_buff[rcv_cnt] = (unsigned char) rcv_work;

    while(ti_u1c1 == 0)

        {

            //Wait for transmit buffer is empty 

        }

        u1tbl = uart1receive_buff[rcv_cnt];   //把单片机接收到的重新传给PC        

      }

运行效果:

并且每接收一个字符,LED2灯闪烁一次。


菜鸟
2014-03-04 16:52:55     打赏
14楼

(补充运行效果图,刚上传的看不到)


菜鸟
2014-03-21 16:10:50     打赏
15楼

timerRA应用实例

实现功能:用定时器timerRA提供3个不同频率信号0.5Hz,1Hz和2Hz,分别用3个指示灯LED1、LED2、LED3以上诉3种不同的频率闪烁。LED1亮灭时间相同,LED2与LED3常态是灭状态,在频率边沿处闪烁一次。

注:用示波器可以更加精确地捕获输出信号的频率

 

流程图:

 

 

程序简介:

int led_shifttime = 0;
int led3_shifttime = 0;

void main(void)
{
 /* Timer RA initialization sequence */
 /* Low speed on-chip oscillator is used (125kHz) instead of external clocking */
 //ocd2=1; // 选择On-chip oscillator clock作为system clock,因为复位后ocd2为1所以可以省略此句


 /* 设置TRAO为输出端口 */
 toena_traioc = 1;
 
 /* 设置timerRA 位Timer mode */
 tmod0_tramr = 0;
 tmod1_tramr = 0;
 tmod2_tramr = 0;
 
 /* 选择片上低速时钟Low speed on-chip oscillator作为timerRA的时钟源 */
 tck0_tramr = 0;
 tck1_tramr = 1;
 tck2_tramr = 0;
 
 //RA timmer 中断发生间隔为t,则t=(trapre+1)*(pre+1)*1/ F(OCO)
  trapre = 249;
 tra = 249;  //RA timer中断时间间隔为0.5s
 
 /* 清零timerRA中的标志位 */
 ir_traic = 0;
 
 /* 设置timerRA中断等级为1级 */
 ilvl1_traic = 1;
 
 /* 开启timerRA定时器 */
 tstart_tracr = 1;
 
 /*  允许中断 */
 ENABLE_IRQ;

 /* LED0 LED1 LED2 LED3初始状态都是灭状态 */ 
 p3 = 0x5A;

pd3 = 0xFF;
 
 while (1)
 {  
      if (led_shifttime == 2)
       {
            led_shifttime = 0; //led_shifttime计数周期为2个RA timer中断间隔,即2*0.5s=1s
            LED1 = !LED1;      //LED1每隔1s变换一次状态
     
            LED2 = !LED2;
            LED2 = !LED2;      //LED2每隔1s闪烁一次
   }
  else
   {
   }
  
  if(led3_shifttime == 1)
   {
       led3_shifttime =0; //led3_shifttime计数周期为1个RA timer中断间隔,即0.5s
       LED3 = !LED3;
             LED3 = !LED3;      //LED3闪烁一次,间隔为0.5s
   }
  else
   {
   }
 
  
 }

 
}


/***********************************************************************************
Function Name: timer_ra
Description: Timer RA中断函数.
Parameters:  None
Return Value: None
***********************************************************************************/
/* timer RA   (software int 22) */
#pragma interrupt timer_ra(vect=22)
void timer_ra(void)
{  
 led_shifttime++; 
 led3_shifttime++;  //每进入一次RA timer中断,间隔为0.5s,两个计数加1
     
 ir_traic = 0;      //中断标志位IR清零
}

总结:

定时器timerRA的使用重点,首先设置timerRA的工作模式为timer mode;

第二,选择timerRA的时钟源;

第三,通过设置寄存器trapre和tra来得到发生timerRA中断的时间间隔

 

每次发生timerRA中断的间隔时间确定后,再在timerRA中断函数中设定相应的动作。相当于以中断间隔作为该动作发生的长度标尺。

 

 


共15条 2/2 1 2 跳转至

回复

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