@@ -170,7 +170,7 @@ cargo objcopy --release -- -O binary firmware.bin && python3 genimage.py
170
170
171
171
固件的写入可以借助任何烧录工具, 包括 ` dd ` 命令.
172
172
173
- ## 开始编写裸机 Rust 程序
173
+ ## 开始编写裸机 Rust 程序 (Start Writing Some Bare-Metal Code)
174
174
175
175
搞定了固件的加载, SoC 的控制流程就可以交给我们的程序了. 这里我们使用 Rust 语言编写裸机程序.
176
176
从相关代码阅读得知, TF card 中代码被加载到了 0x80300000 ~ 0x80400000. 为了避免额外的不确定性, 可以直接使用 U-Boot 的 linker script.
@@ -283,7 +283,7 @@ macro_rules! println {
283
283
284
284
有了 ` println! ` 宏, 我们可以方便地输出调试信息了! 大大提高了开发效率.
285
285
286
- ## 完善初始化代码
286
+ ## 完善初始化代码 (Complete Initialization Code)
287
287
288
288
目前为止, 我们只初始化了堆栈, 系统的中断, 乃至 .bss 段都没有初始化. 这些在一个完整的嵌入式程序中都是必顼的.
289
289
@@ -434,7 +434,7 @@ DDR init / (SDRAM 初始化) 是一个比较复杂的过程, 一般需要初始
434
434
DDR init 之后, 我们就可以使用 DDR 区域的内存. 这里有个比较坑的地方, DDR 内存起始地址是 0x0000_0000,
435
435
然而 Rust 访问零地址有诸多限制, 多数函数会直接 panic. 程序中应该避免使用 0x0000_0000 地址.
436
436
437
- ## 正式开始裸机编程
437
+ ## 正式开始裸机编程 (Start Real Bare-Metal Programming)
438
438
439
439
有了以上的初始化基础, 我们终于可以开始正式的裸机编程了. 例如初始化其他外设, 读写外设寄存器, 甚至是实现一些简单的功能.
440
440
@@ -537,7 +537,7 @@ fn buzzer() {
537
537
}
538
538
```
539
539
540
- ## 一些延展思考
540
+ ## 一些延展思考 (Some Extended Thoughts)
541
541
542
542
### Why 裸机?
543
543
@@ -625,7 +625,7 @@ cpuid: 09140b0d 10050000 260c0001
625
625
当然有个搞笑的, ` mhartid ` 是 0, 说明 K230 并没有满足 RISC-V 规范给不同的 hart 分配不同的 ID. 这个在实际开发中是需要注意的.
626
626
只能通过 misc CSR 来区分不同的 hart.
627
627
628
- ## 结语
628
+ ## 结语 (Conclusion)
629
629
630
630
通过此次在 K230 芯片 上的 Rust 裸机嵌入式开发,我们深入探索了 MPU 与 MCU 在启动方式和使用模式上的区别,掌握了使用 Rust 进行 MPU 芯片裸机开发的关键步骤,包括启动流程、固件格式解析、中断和外设的初始化等。实践中,我们成功实现了 UART 调试输出、GPIO 点灯、PWM 蜂鸣器等功能,加深了对 K230 底层启动机制和硬件特性的理解。这些成果为日后在 K230 以及其他 RISC-V 芯片上开展更复杂的嵌入式开发奠定了坚实的基础。展望未来,我们可以进一步完善外设驱动,探索多核协同工作、RVV 向量指令的应用,以及结合 Rust 生态构建高效、安全的嵌入式系统,为 RISC-V 开源社区贡献更多力量。(由 GPT 总结)
631
631
0 commit comments