eefocus_3914144 发表于 2026-9-10 17:27:21

【瑞萨BLE/WIFI模块测评】Zephyr快速点个灯

本帖最后由 eefocus_3914144 于 2026-9-10 17:31 编辑

# Zephyr 移植分享:RA-Eco-RA4M2-100PIN 点灯(RA4M2 从无到有点亮 LED)

> 一块第三方 RA4M2 开发板(无蓝牙、无官方 Zephyr 板卡对应),如何用 Zephyr 官方 `ek_ra4m2` 板卡从零点灯。全程最大的坑是**晶振**和**引脚差异**,本文记录完整过程与验证结果。
>
> 环境:Zephyr 4.4.0(`v4.4.0-24-g58069e646a8`)/ Zephyr SDK 1.0.1 / Windows + west / J-Link Ultra。

## 1. 硬件背景

- 开发板:RA-Eco-RA4M2-100PIN(第三方,非瑞萨官方 EK-RA4M2),MCU **R7FA4M2AD3CFP**(Cortex-M33,512KB Flash / 128KB RAM,LQFP-100),与 Zephyr 官方板卡 `ek_ra4m2/r7fa4m2ad3cfp` 同型号。
- 与官方板的两处关键差异(来自原理图与参考 FSP 工程):
**LED 引脚不同**:官方板 P415/P404/P405,本板 **LED1=P405、LED2=P404、LED3=P002**(均高电平点亮)。
- 按键反而一致(SW1=P005、SW2=P006),调试口 SWD(P108/P300),USB 转串口是 CH340 接 SCI9(P109/P110)。

## 2. 应用骨架

在 west 工作区下建 `app/ra4m2_ble/`,四个文件:

app/ra4m2_ble/
├── CMakeLists.txt
├── prj.conf
├── boards/
│   └── ek_ra4m2.overlay   ← 移植的灵魂
└── src/
└── main.c

```
### CMakeLists.txt

```cmake
cmake_minimum_required(VERSION 3.20.0)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(ra4m2_ble)

target_sources(app PRIVATE src/main.c)
```

### prj.conf

```conf
CONFIG_GPIO=y
CONFIG_TICKLESS_KERNEL=y

# RTT 调试输出(经 J-Link SWD,不占串口;SCI0 留给 BLE 模块)
CONFIG_PRINTK=y
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y
CONFIG_UART_CONSOLE=n
```

选 RTT 而不是 UART 控制台的原因:板载 CH340 串口是 SCI9,而后续蓝牙模块要占 SCI0;RTT 走 SWD 调试线,一个串口都不占,是这个工作区的惯例。

### src/main.c

```c
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>

static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios);

int main(void)
{
        printk("app start\n");

        if (!gpio_is_ready_dt(&led)) {
                printk("led device not ready\n");
                return 0;
        }
        if (gpio_pin_configure_dt(&led, GPIO_OUTPUT_INACTIVE) != 0) {
                printk("led config failed\n");
                return 0;
        }

        while (1) {
                gpio_pin_toggle_dt(&led);
                k_msleep(500);
        }

        return 0;
}
```

### boards/ek_ra4m2.overlay(关键)

```dts
#include <zephyr/dt-bindings/gpio/gpio.h>

/* 板上无晶振:关闭 xtal/subclk/PLL/PLL2,系统时钟改由 HOCO(20MHz)直驱 */
&xtal   { status = "disabled"; };
&subclk { status = "disabled"; };
&pll    { status = "disabled"; };
&pll2   { status = "disabled"; };
&uclk   { status = "disabled"; };/* USB 时钟源是 PLL2,一并关 */

&pclkblock {
        clocks = <&hoco>;
};

&iclk{ clock-frequency = <DT_FREQ_M(20)>; div = <1>; };
&pclka { div = <2>; };
&pclkb { div = <2>; };
&pclkc { div = <2>; };
&pclkd { div = <2>; };
&fclk{ div = <2>; };

/* LED 引脚按本板原理图重定义:先删官方节点再建,alias led0..2 保持不变 */
/delete-node/ &led1;
/delete-node/ &led2;
/delete-node/ &led3;

/ {
        leds {
                led1: led1 {
                        gpios = <&ioport4 5 GPIO_ACTIVE_HIGH>;   /* P405 */
                        label = "LED1";
                };
                led2: led2 {
                        gpios = <&ioport4 4 GPIO_ACTIVE_HIGH>;   /* P404 */
                        label = "LED2";
                };
                led3: led3 {
                        gpios = <&ioport0 2 GPIO_ACTIVE_HIGH>;   /* P002 */
                        label = "LED3";
                };
        };
};

&ioport0 { status = "okay"; };
&ioport4 { status = "okay"; };
```

要点:瑞萨 RA 的 GPIO 在设备树里是 `ioport<端口号>` + 引脚号,`&ioport4 5` 即 P405。时钟树的节点(`xtal`/`hoco`/`pclkblock`/`iclk`…)在 SoC dtsi 里已有定义,overlay 只改状态、时钟源和分频。

## 3. 编译与烧录

```bat
cd /d D:\luglZephyrproject
set ZEPHYR_SDK_INSTALL_DIR=D:\luglZephyrproject\zephyr-sdk-1.0.1\zephyr-sdk-1.0.1
set ZEPHYR_TOOLCHAIN_VARIANT=zephyr
west build -b ek_ra4m2/r7fa4m2ad3cfp app\ra4m2_ble -p
west flash
```

编译结果:

```
Memory region         Used SizeRegion Size%age Used
         FLASH:       22776 B       512 KB      4.34%
             RAM:      6248 B       128 KB      4.77%
```

验证 overlay 是否生效可以查生成的合并设备树 `build/zephyr/zephyr.dts`:

```
led1: led1 {
        gpios = < &ioport4 0x5 0x0 >;   /* P405,来自应用 overlay */
};
```

## 4. 上板验证(含 RTT 实抓日志)

烧录后板载 **LED1 以 500ms 间隔闪烁**。

RTT 日志用 `JLinkRTTLogger.exe` 抓取(地址从 elf 里查 `_SEGGER_RTT` 符号得到 0x20000410):

```bat
arm-zephyr-eabi-nm build\zephyr\zephyr.elf | findstr _SEGGER_RTT
:: 20000410 B _SEGGER_RTT

JLinkRTTLogger.exe -Device R7FA4M2AD -If SWD -Speed 4000 ^
    -RTTAddress 0x20000410 -RTTChannel 0 rtt.log
```

然后 J-Link Commander 复位目标板(`r` + `g`),实际抓到的启动日志:

```
*** Booting Zephyr OS build v4.4.0-24-g58069e646a84 ***
app start
```

> 小坑:RTT Logger 默认可能选中空通道(Zephyr 建了 3 个 up-channel,日志在通道 0 "Terminal"),务必加 `-RTTChannel 0`,否则一直是 0 Bytes/s。

## 5. 踩坑总结

| 坑 | 现象 | 解法 |
|---|---|---|
| 官方板 dts 假设 24MHz 晶振 | 烧录后完全无反应(启动卡死) | overlay 关闭 xtal/subclk/PLL,时钟源改 HOCO |
| LED 引脚与官方板不同 | 程序在跑但"灯不亮" | 按本板原理图重定义 leds 节点 |
| 控制台 | CH340 串口(SCI9)与后续外设规划冲突 | printk 走 SEGGER RTT,不占任何 UART |
| RTT Logger 通道 | 0 Bytes/s 无输出 | `-RTTChannel 0` |

时钟改成 HOCO 20MHz 后性能比官方板的 PLL 配置低,但点灯/串口/BLE 透传都够用;需要满血 100MHz 时再研究贴晶振或用 HOCO 倍频(注意 RA4M2 的 PLL 不支持 HOCO 作源时需查手册确认)。

## 6. 下一步

这块板子要跑的是 BLE 应用:DA14531 蓝牙模块(欣瑞利定制,AT+透传固件)插 PMOD2,占 SCI0(P410/P411)+ P609(LPR)+ P414(CONNECT)。点灯验证了工具链、设备树 overlay、时钟和烧录链路全部打通,接下来就是 UART 收发。

页: [1]
查看完整版本: 【瑞萨BLE/WIFI模块测评】Zephyr快速点个灯