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

共11条 1/2 1 2 跳转至

R8C开发板学习笔记

菜鸟
2014-02-24 15:16:56     打赏

放眼望去,论坛里讨论的大部分都是瑞萨新款MCU,RL78、Sakura,由于我是从基础的R8C族单片机开始着手的,还没有过渡到新款型号的片子。接下来的一段时间,我想向大家分享一下自己学习R8C的‘辛路历程’,不敢说是独树一帜,只期望可以跟盆友们多多交流!




关键词: R8C    

菜鸟
2014-02-24 15:32:09     打赏
2楼
1、我用的是瑞萨的R8C/35A系列的R5F21356芯片,仿真器是E8A。拿到板子,首先想到的是先把编译环境给搭建成功。但是囧况来了,官网上找不到HEW软件,能找到的都是它的updata。哎,都有点怀疑自己的智商存在bug了,仔细看英文说明才明白,

HEW需要绑定在特定的编译器(compiler)和仿真器(emulator),所以应该根据自己的MCU型号下载对应的编译器和仿真器,然后再下载HEW update才可以正常使用。

比如针对R8C系列MCU,用E8A调试,则按下面步骤执行

(1)下载nc30v600r00_ev编译器并安装

(2)下载E8aFullV105R01仿真器并安装

(3)下载hewv40901u_full_update软件并安装。

用了一天的时间终于顺利搞定,希望同样被这个问题困扰的盆友可以看到,少走弯路


菜鸟
2014-02-24 15:34:13     打赏
3楼
面对这么多大神,不敢说大作,我暂且叫‘记录’吧O(∩_∩)O哈哈~

菜鸟
2014-02-24 17:58:51     打赏
4楼

2、关于编译环境,遇到的第二个问题是用E8a下载程序到目标板时,提示内存错误:“memory area error. It overlaps the system range”

原因是E8A固件程序的分布空间与用户程序的分布空间相冲突,所以需要更改固程序的分布范围,具体在emulator setting对话框->firmware locaion选项->Enable advanced setting打对勾,接下来更改firmware location在user flash aea 区域的分布范围。

    一般是用户程序分布在internal ROM的低地址空间,把firmware location程序分布在internal ROM的高地址空间,以避免空间冲突。针对R5F2134cw芯片,最好把firmware location放在23800-23fff范围(即输入对话框提示的MAX)。

 


菜鸟
2014-02-26 10:38:39     打赏
5楼

3、同样是关于编译环境,用E8A调试R8C板子时,firmware location选项框是灰色的,无法修改。

 

原因是在HEW建立新的project时,粗心遗漏了一个细节,没有选择“use onchip debugging emulator”下拉框。


菜鸟
2014-02-28 15:30:15     打赏
6楼
嘻嘻,谢谢肯定!伙伴的关注使是我不断记录下去的动力!

菜鸟
2014-02-28 15:33:19     打赏
7楼

4、就好比刚开始学习C语言时,第一件事情就是输出“hello world!”作为自己的第一个成果。拿到一款新的开发板,最急迫的估计就是点亮LED灯吧呵呵。可是我当时就有点怀疑自己的智商了,编译下载都通过了,怎么就是不亮呢,跟死机了一样。

解决方法:R8C34WI/O口是有mode控制寄存器,需要首先设定LED占用的I/O口为output mode,然后才能通过程序控制它输出高电平或者低电平,具体参考数据手册里Port Pi Direction Register (PDi)寄存器。

 

 

 


菜鸟
2014-02-28 15:38:48     打赏
8楼

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-03-04 15:48:32     打赏
9楼
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     打赏
10楼

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


共11条 1/2 1 2 跳转至

回复

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