写在前面
好久没发文章了,最近有好些在折腾的事,今天写一篇文章主要是为了分析本人所构思的一种脱离svd2rust
工具而自制ch32v103 rust hal库的实现,这对于我理解市面大部分mcu以及rust的no-std开发有着极其重要的作用,他对于我来说,不仅是一次项目,更是一次学习。
正文开始
结构设计
本人设想以rust语言编写一个大部分mcu库都在使用的寄存器-HAL
双层结构,能够以最简单易懂的方式完成对mcu的操作。众所周知rust相对C语言,有了许多高级的特性,trait、泛型、泛型约束、函数式编程、借用检查、内存安全等,意味着我需要以rust的惯用模式去设计,而不能简单的将库以“C的翻版”方式去写。让我们以GPIO为例子,去探讨设计一个简单好用的库。
为了简化,方便说明,假设我们的GPIO只有一组IO,其寄存器基地址为GPIO_BASE_ADDR
,为无符号32位整数,寄存器间地址偏移值均0x04。有了这个假设,按照双层结构,我们应该先设计寄存器层,我们将GPIO抽象成一个结构体,其结构为
- GPIO
- CFGR(端口配置寄存器,用来配置每个IO口的输入输出及其他模式)
- INDR(用于存放某IO当输入模式下存放的值)
- OUTDR(用于存放某IO当输出模式下输出的值,也就是上下拉)
- BSHR(端口置位寄存器)
- BCR(端口复位寄存器)
- LCKR(端口配置锁定寄存器,会锁定CFGR寄存器)