Skip to content

feat(bsp): CH57x 最小 BSP + 上板自检例程(board_check_ch57x) - #21

Merged
gqf2008 merged 1 commit into
masterfrom
feat/ch57x-bsp-board-check
Sep 19, 2026
Merged

gqf2008 merged 1 commit into
masterfrom
feat/ch57x-bsp-board-check

Conversation

@gqf2008

@gqf2008 gqf2008 commented Sep 19, 2026

Copy link
Copy Markdown
Owner

把 issue #14 里"只能上板回答"的那批核对点,收敛成一次烧写就能出答案的自检例程;
顺带补上 ch57x 家族的最小 BSP(ch583/ch572 的 UART 与 PA 口寄存器同址同偏移,一份够用)。

BSP(src/bsp/ch57x/)

  • uart::configure(clk_hz, baud) / putc / write_str + core::fmt::Write 出口。
  • 寄存器与公式照官方 EVT 源码:基址 0x40003400(IER@+1 / FCR@+2 / LCR@+3 / LSR@+5(bit6 发送全空) / THR@+8 / R16_DL@+0x0C / R8_DIV@+0x0E)、初始化序列同
    UART1_DefInit()、波特率 DL = round(clk/(8*baud))。
  • PA 口:PA_DIR@0x400010A0 / PA_OUT@+08 / PA_CLR@+0C(LED/示波器打点)。
  • 不碰 SAM 解锁/PLL —— 时钟树留给后续(见下"阶段一"为什么先不碰)。

自检例程(examples/board_check_ch57x.rs)

阶段一:按 8/16/24/32/48/60/100 MHz 逐个假设各打一行标记——哪行可读,复位默认主频
就是那个值
(不配 PLL 时主频未知,只能这样测;这也顺手回答了 env 里的频率假设)。
阶段二(把 CLK_HZ 改成测出的值后重烧)打印:

  • 启动头:_bootvec 地址 + 魔数回读(符号地址即它在 flash 的位置),期望 F3F9BDA9;
  • STK_CTLR(期望 ch583 0x2F / ch572 0x0F)、STK_SR、PFIC_IENR[0] bit12;
  • INTSYSCR(自定义 CSR 0x804)回读——非 0 说明硬件压栈/嵌套没关,36 字帧前提不成立;
  • mcycle 前后差(0 = 无 Zicntr;本口 delay_us 已改用 SysTick,不依赖它);
  • 软中断自检:yield_now() 前后读 PFIC ISR[0] bit14——pending 被硬件取走即
    SWI_IRQn=14 通路成立,残留则可疑;
  • 活性测试:两个同优先级任务各自周期打印计数器与 tick()——两者都涨 =
    时基、上下文切换、同优先级时间片在真机上成立。

验证(本机无硬件,能做的都做了)

  • 例程在 ch583(riscv32imac) 与 ch572(riscv32imc) 两种目标下都编译+链接通过,
    启动头产物校验 PASS(三道:ch583-imac/ch583-imc/ch572-imc 里含新增的两个 board_check 构建)。
  • bash ci/gate.sh 全绿(host 159 / ISR 向量 / 启动头 ×3 / 乒乓 / kernel_tests 24-24 ×3 / smp 9-9);
    门禁新增两条 board_check 构建步骤,防止 BSP 腐烂。
  • ⚠️ 例程的输出只能在真机上看到——本机没有硬件,故"阶段一测出的主频、阶段二的各项读数"
    仍是待验项(这正是本 PR 的目的:让有板子的人 5 分钟拿到答案)。

Refs #14

把 issue #14 里"只能上板回答"的那批核对点,收敛成**一次烧写就能出答案**的自检例程;
顺带补上 ch57x 家族的最小 BSP(ch583/ch572 的 UART 与 PA 口寄存器同址同偏移,一份够用)。

## BSP(`src/bsp/ch57x/`)

- `uart::configure(clk_hz, baud)` / `putc` / `write_str` + `core::fmt::Write` 出口。
- 寄存器与公式**照官方 EVT 源码**:基址 `0x40003400`(`IER@+1 / FCR@+2 / LCR@+3 /
  LSR@+5(bit6 发送全空) / THR@+8 / R16_DL@+0x0C / R8_DIV@+0x0E`)、初始化序列同
  `UART1_DefInit()`、波特率 `DL = round(clk/(8*baud))`。
- PA 口:`PA_DIR@0x400010A0 / PA_OUT@+08 / PA_CLR@+0C`(LED/示波器打点)。
- 不碰 SAM 解锁/PLL —— 时钟树留给后续(见下"阶段一"为什么先不碰)。

## 自检例程(`examples/board_check_ch57x.rs`)

**阶段一**:按 8/16/24/32/48/60/100 MHz 逐个假设各打一行标记——**哪行可读,复位默认主频
就是那个值**(不配 PLL 时主频未知,只能这样测;这也顺手回答了 env 里的频率假设)。
**阶段二**(把 `CLK_HZ` 改成测出的值后重烧)打印:
- 启动头:`_bootvec` 地址 + **魔数回读**(符号地址即它在 flash 的位置),期望 `F3F9BDA9`;
- `STK_CTLR`(期望 ch583 `0x2F` / ch572 `0x0F`)、`STK_SR`、`PFIC_IENR[0]` bit12;
- **INTSYSCR(自定义 CSR `0x804`)回读**——非 0 说明硬件压栈/嵌套没关,36 字帧前提不成立;
- `mcycle` 前后差(0 = 无 Zicntr;本口 `delay_us` 已改用 SysTick,不依赖它);
- **软中断自检**:`yield_now()` 前后读 `PFIC ISR[0]` bit14——pending 被硬件取走即
  `SWI_IRQn=14` 通路成立,残留则可疑;
- **活性测试**:两个同优先级任务各自周期打印计数器与 `tick()`——两者都涨 =
  时基、上下文切换、同优先级时间片在真机上成立。

## 验证(本机无硬件,能做的都做了)

- 例程在 **ch583(riscv32imac)** 与 **ch572(riscv32imc)** 两种目标下都编译+链接通过,
  启动头产物校验 PASS(三道:ch583-imac/ch583-imc/ch572-imc 里含新增的两个 board_check 构建)。
- `bash ci/gate.sh` 全绿(host 159 / ISR 向量 / 启动头 ×3 / 乒乓 / kernel_tests 24-24 ×3 / smp 9-9);
  门禁新增两条 board_check 构建步骤,防止 BSP 腐烂。
- ⚠️ 例程的**输出**只能在真机上看到——本机没有硬件,故"阶段一测出的主频、阶段二的各项读数"
  仍是待验项(这正是本 PR 的目的:让有板子的人 5 分钟拿到答案)。

Refs #14
@gqf2008
gqf2008 force-pushed the feat/ch57x-bsp-board-check branch from a2ac733 to 5fb5297 Compare September 19, 2026 09:24
@gqf2008
gqf2008 merged commit ed2ed5f into master Sep 19, 2026
1 of 2 checks passed
@gqf2008
gqf2008 deleted the feat/ch57x-bsp-board-check branch September 19, 2026 09:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant