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

HEW需要绑定在特定的编译器(compiler)和仿真器(emulator),所以应该根据自己的MCU型号下载对应的编译器和仿真器,然后再下载HEW update才可以正常使用。
比如针对R8C系列MCU,用E8A调试,则按下面步骤执行
(1)下载nc30v600r00_ev编译器并安装
(2)下载E8aFullV105R01仿真器并安装
(3)下载hewv40901u_full_update软件并安装。
用了一天的时间终于顺利搞定,希望同样被这个问题困扰的盆友可以看到,少走弯路

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)。

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的定义部分注释掉或删除。

Uart1通信例程
功能描述:用UART1从PC端接收字符,并把字符返给PC端。
模式:9600-8- even-1。
程序简介:
void main(void)
{
clk_set(); //设置时钟为无分频外部晶振
port_cfg(); //设置I/O口P0_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_3为CLK1
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 priotity为7,最高中断优先级
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灯闪烁一次。
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |