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:启动/停止寄存器

假设配置一个间隔定时器,大致步骤如下:

  1. 启用系统时钟,针对定时时钟进行分频处理,TPS
    • 注意TPS寄存器设置CKm0的分频时,这个设置会影响单元0中所有使用CKm0的通道。
    • 他这里从系统时钟,分频出来,最多可十六分频。
    • 可以设置四种全局独立时钟频率。
  2. 初始化:配置通道模式
  3. 设置周期,TDR
  4. 配置输出,TOM, TO, TOE
  5. 如果是PWM要配置输出端口,P, PM
  6. 启动定时器,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(从)

参考资料

  1. Renesas Electronics. (2018). RL78/G13 User’s Manual: Hardware. https://www.renesas.cn/zh/document/man/rl78g13-users-manual-hardware 

results matching ""

    No results matching ""