结果:Zephyr 4.4 已在 RA6W1 上跑起来:hello_world 正常启动,blinky 以 1Hz 翻转 P1_15。
1. 启动映射
实测:boot ROM 把 RTOS 镜像的 IVT 映射到 CPU 0x0(= sflash 0x2400 = 镜像 0x2000 + DA16 头 0x400),且 VTOR 保持 0(运行中官方固件 VTOR=0 已证实)。
Zephyr/裸机镜像正确链接基址 = CPU 0x0,向量表就在 bin 偏移 0;CONFIG_FLASH_LOAD_OFFSET=0。
笔记 08 §6.1 的"sflash 0x2000 对应 CPU 0x2000"假设错误;按 0x2400/0x400/0x2000 链接都会立刻崩(绝对地址全部偏移)。
崩溃特征(排查耗时大头):入口即 HardFault→lockup(PC=0xEFFFFFFE),因为向量内容按错误偏移指向了 IVT 区/数据区。定位手段:SRAM 邮箱 + 寄存器金丝雀(调试器可读),因 FPB 断点在 remap 低地址区不生效。
官方固件运行时 CPU 0x0 处看到的是它重定位后的 IVT(handler 指向 0x0800xxxx SRAM 别名区,FSP 的 bsp_vector_table_copy + ICACHE remapper 行为)。
SYS_RAM 代码别名在 0x0800_0000(datasheet Table 31):官方固件部分代码拷到 RAM 经此执行
2. 烧录链路(已封装 tools/flash_ra6w1.sh)
# 打包 python tools/rafw-fsp-packs/v2.2.1/Renesas.rafw_mcu_ra6w1.2.2.1/scripts/gen_rrq61_flash_image.py zephyr.bin zephyr.img RA6W1-RRQ61001 # 烧录(RFP CLI,走 SWD,外部 flash 偏移 0) "/c/Program Files (x86)/Renesas Electronics/Programming Tools/Renesas Flash Programmer V3.24/rfp-cli.exe" -d RA6W1 -t jlink:1100011279 -if swd -a -run -bin 0x0 zephyr.img -noprogress -noquery
RFP 烧录地址必须是 0x0(外部 flash 物理起点),不是 e2 studio launch 文件里的 0x0A000000。
板载 J-Link OB-RA4M2(S/N 1100011279),首次连接会自动升级固件。
RFP 支持 -d RA6W1(V3.24 已内置 flash_configurations + uartboot.bin)。
SEGGER J-Link 用 device Cortex-M33 即可连接(不认识 R7SA6W1,但通用 M33 够用:halt/regs/mem32/savebin 都正常;FPB 断点在低地址 remap 区疑似不生效,单步/断点不可靠)。
3. Zephyr 侧改动(zephyr目录)
| dts/arm/renesas/ra/ra6/r7sa6w1ce.dtsi | flash0 基址改 0x0(remap 窗);新增 gpio0: gpio@400b0000(renesas,ra6w1-gpio,ngpios=30) |
| boards/renesas/ek_ra6w1/ek_ra6w1_defconfig | CONFIG_FLASH_LOAD_OFFSET=0(向量表必须压在 CPU 0x0) |
| boards/renesas/ek_ra6w1/ek_ra6w1.dts | led0 = &gpio0 29(P1_15,跳线接 J611 LED);&gpio0 okay |
| soc/renesas/ra/ra6w1/soc.c | soc_early_init_hook:①冻结 WDT(CRG_TOP SET_FREEZE_REG 0x400C0004 bit9,否则 ~81s 复位)②CLK_AMBA_REG(0x400C0000)bit23 PERI_CLK_ENABLE 置位——ROM 是关的,不开 UART 波特率时钟无输出(TXFF 卡死)③UART0/1 时钟门(CRG_PER/CRG_COM SET 0x200 |
| soc/renesas/ra/ra6w1/Kconfig.defconfig | SYS_CLOCK_HW_CYCLES_PER_SEC=40000000(实测 HCLK=40MHz) |
| drivers/gpio/gpio_ra6w1.c | GPIO_W 驱动:线性引脚号 P0_00..P0_13=0..13、P1_00..P1_15=14..29(MODE_REG 紧凑排列,P1_00=0x400B005C=索引 14,不是 port*16+pin!);PUPD[9:8] 定方向、PPOD 开漏、SET/RESET_DATA_REG 输出;中断未实现(-ENOSYS);ACTIVE_LOW 由 Zephyr 通用层处理(gpio_driver_data.invert),驱动只管物理电平 |
| dts/bindings/gpio/renesas,ra6w1-gpio.yaml | 绑定;注意要有 gpio-cells: [pin, flags](名称列表),不要重复声明 #gpio-cells |
| drivers/gpio/{Kconfig,CMakeLists.txt} | Kconfig.ra6w1 / gpio_ra6w1.c |
构建(Git Bash):
cd /d/Zephyrproject export ZEPHYR_SDK_INSTALL_DIR="D:luglZephyrprojectzephyr-sdk-1.0.1zephyr-sdk-1.0.1" export ZEPHYR_TOOLCHAIN_VARIANT=zephyr west build -b ek_ra6w1 zephyr/samples/basic/blinky -d build_ek_ra6w1_blinky -- -DCONFIG_ARM_MPU=n -DCONFIG_FPU=n -DCONFIG_RTT_CONSOLE=y -DCONFIG_USE_SEGGER_RTT=y -DCONFIG_UART_CONSOLE=n
(MPU/FPU 关掉只是早期排障时的保守设置,未回归验证是否需要——待办:试回默认。)
4. 验证记录
hello_world:RTT console 输出 *** Booting Zephyr OS build v4.4.0 *** + Hello World! ek_ra6w1/r7sa6w1ce。
blinky:RTT 连续打印 LED state: ON/OFF,P1_15_MODE_REG=0x2300(输出、GPIO);运行远超 81s 未复位(WDT 冻结生效)。
UART console 已通(外接 USB-TTL 直连 P0_04/P0_05):console 用 UART1(0x40001000,IRQ3),PPA PID 6/7 映射 P0_04(RX)/P0_05(TX)。
实测踩掉的坑(按发现顺序):
UART1 时钟门:CRG_PER/CRG_COM 的 SET_CLK_COM_REG bit10(UART2_ENABLE 名)ROM 没开,Zephyr 要写寄存器全被吞 → soc_early_init_hook 里补开(0x40090408/0x400C0208 写 0x400)。
TX 引脚 PUPD=3 必须显式给:datasheet 说 OA 功能方向自动设置——不成立,PUPD=0 时 UART TX 根本驱动不到焊盘。
WA_REG(0x4C,WAE)复位值为 1(32 位字访问模式):字节写 DR 时每串只发出第一个字节。FSP 显式清 0,soc_early_init_hook 对三个 UART 都清。
CR bit4(datasheet 标 reserved)必须置位:否则每串只发 1 字节后移位器停摆(官方 CR=0xC311 含 bit4;CTSEn/RTSEn 不要开,无主机 RTS 时 TX 会被 CTS 门控)。已在 drivers/serial/uart_pl011.c 的 pl011_enable() 里加 #ifdef CONFIG_SOC_SERIES_RA6W1 cr |= BIT(4)。
FIFO 模式(FEN=1)在这颗片子上 TXFF 标志行为异常(发 ~10 字节后卡死)——dtsi 三个 UART 都加 fifo-disable(pl011 驱动自带该属性),用单字节保持寄存器模式。
uartclk=40MHz(IBRD=21/FBRD=45 实测文本干净;IBRD=43 是官方固件开 PLL 后的 80MHz 用法)。
时钟实测(DWT CYCCNT 对墙上时钟,两次一致):boot ROM 交接后 HCLK=40MHz(XTAL40M 直驱,PLL 未加速;CLK_AMBA_REG HCLK_DIV=0)。笔记 08 的"ROM 配好 160MHz"假设错误。SYS_CLOCK_HW_CYCLES_PER_SEC=40000000、dtsi uartclk=40000000 已按此修正;修错时 blinky 翻转 4x(160M 假设)/2x(80M)慢。SysTick 与 CYCCNT 同源。芯片额定 160MHz:datasheet §7.3.2 Table 32(PLL480 分频档);FSP bsp_clocks.c 的 pll_enable 序列(LDO_PLL1→PLL_CLK_SEL=2→HCLK_DIV=0→PLL_PERI_ENABLE=1)可把系统拉到 160MHz/外设 80MHz——后续做时钟驱动时照此办理。
官方 gpio 示例实测:P1_14 读 P1_15 写正常;J601 pin14=P1_14/pin16=P1_15、J203 pin17/19=P1_14/15。
我要赚赏金
