RL78开发笔记
记录,为日后遇到类似问题提供思路。
本章详细参见瑞萨用户手册1
1. 关键信息
RL78系列主要分为一下两个系列,
- R5F100系列:标准型(通常为无CAN版本),常用有R5F100LGAFA(RAM 128K, ROM 12K)、R5F100FEAFP(RAM 64K, ROM 4K)
- R5F101系列:带CAN控制器版本(适用于汽车或工业控制),不常用
-
RL78是CPU内核,瑞萨自有内核(非ARM架构),CISC复杂指令集。同ARM Cortex-M0+(AMR架构),RISC(精简指令集)。孰强孰弱还是问问伟大的AI吧。
- 注意不同系列根据芯片类型差异,RAM起始地址不同,像R5F100xE, R5F101xE (x = 6 to 8, A to C, E to G, J, L): Start address FEF00H
- 无FPU,主打超低功耗和高性价比
- 16位定时器,8通道可用,
2. 芯片外设
2.1. Timer
128pin 有两个定时器单元,其他的pin大多仅有一个定时器单元。每个定时器单元有8个通道,意味着最少有8个可以独立工作的定时器。
独立通道工作模式(单通道即可实现)
- 间隔定时器/方波输出:最基本的定时功能。可以产生固定周期的中断,并能输出50%占空比的方波。
- 外部事件计数器:统计从外部引脚(TImn)输入的脉冲个数,达到设定值后产生中断。
- 分频器(仅通道0):将输入时钟分频后输出。
- 输入脉冲间隔测量:测量外部输入信号两个有效边沿之间的时间间隔。
- 输入信号高/低电平宽度测量:测量外部输入信号的高电平或低电平的持续时间。
- 延迟计数器:检测到外部输入信号的有效边沿后,延迟一段设定的时间再产生中断。
多通道联动工作模式(需要两个或更多通道配合实现)
- 单脉冲输出:使用两个通道,可以产生一个具有指定延迟时间和宽度的单脉冲。
- PWM(脉宽调制)输出:使用一个主通道(控制周期)和一个从通道(控制占空比),可以产生周期和占空比都可调的PWM波形。
- 多路PWM输出:使用一个主通道和多个从通道,可以同时产生多个周期相同但占空比不同的PWM信号。手册提到最多可以输出7路PWM。
2.1.1 配置
一般直接用编译器可以直接生成,再在例程上改改,再复制到自己的代码中即可🙂
重要的定时器控制寄存器如下,详细见用户手册6.3章节:
- TMRmn:定时器模式寄存器(定义模式)
- TDRmn:定时器数据寄存器(设定周期或占空比)
- TOMm:输出模式寄存器(决定是主通道还是从通道)
- TOEm:输出使能寄存器(让定时器接管引脚输出)
- TSm/TTm:启动/停止寄存器
假设配置一个间隔定时器,大致步骤如下:
- 启用系统时钟,针对定时时钟进行分频处理,TPS
- 注意TPS寄存器设置CKm0的分频时,这个设置会影响单元0中所有使用CKm0的通道。
- 他这里从系统时钟,分频出来,最多可十六分频。
- 可以设置四种全局独立时钟频率。
- 初始化:配置通道模式
- 设置周期,TDR
- 配置输出,TOM, TO, TOE
- 如果是PWM要配置输出端口,P, PM
- 启动定时器,TS
常见问题&解决办法
注意PWM输出需要两路定时器通道
问题背景,尝试使用瑞萨这款RL78这款芯片配置PWM输出,输出一个4KHz(250us周期)、50%占空比的PWM波,用于驱动一个载波电路。
打开瑞萨的代码生成器,我找到定时器TAU0,选择通道0,填入250us。选择通道1,设置为PWM输出模式,50%…生成代码!但是话说这里为什么这里用了两个通道?
PWM (Pulse Width Modulation) output
Two channels are used as a set to generate a pulse with a specified period and a specified duty factor.
查手册发现RL78的TAU定时器单元,每个通道只有一个比较寄存器,所以一个通道只能设置一个比较值。而PWM需要两个比较值——一个决定周期,一个决定占空比。
他与ARM内核的单片机不同,通常只需要一个定时器即可,初始化定时器并连接到指定的定时器通道上即可。这块芯片需要用到两个计时器通道,要区分主从,分别决定周期、占空比。这里有所差异需要注意。
设置周期和占空比:
- PWM周期 = (TDR01 + 1) × 计数时钟周期
- 占空比 = TDR01 / (TDR00 + 1) × 100%
生成的代码:
/* 通道0:主通道,设置周期250us */
TMR00 = _0000_TAU_CLOCK_SELECT_CKM0 | // 时钟源32MHz
_0001_TAU_MODE_PWM_MASTER; // PWM主模式
TDR00 = 7999; // (250us × 32MHz) - 1 = 7999
/* 通道1:从通道,设置50%占空比 */
TMR01 = _0000_TAU_CLOCK_SELECT_CKM0 | // 与主通道同时钟
_0009_TAU_MODE_PWM_SLAVE | // PWM从模式
_0400_TAU_TRIGGER_MASTER_INT; // 由主通道触发
TDR01 = 4000; // 50%占空比 = 7999 × 50% ≈ 4000
/* 组合输出设置 */
TOM0 |= _0002_TAU_CH1_OUTPUT_COMBIN; // 使能通道1组合输出
TOE0 |= _0002_TAU_CH1_OUTPUT_ENABLE; // 使能输出
/* 必须同时启动主从通道 */
TS0 |= _0001_TAU_CH0_START_TRG_ON | // 启动通道0(主)
_0002_TAU_CH1_START_TRG_ON; // 启动通道1(从)
参考资料
-
Renesas Electronics. (2018). RL78/G13 User’s Manual: Hardware. https://www.renesas.cn/zh/document/man/rl78g13-users-manual-hardware ↩