【发布时间】:2015-07-10 17:25:13
【问题描述】:
我正在尝试将硬件抽象层添加到 ST32F0 微控制器。 为了访问寄存器,我在这里使用方法布局:
https://github.com/kensmith/cortex-from-scratch
https://yogiken.files.wordpress.com/2010/02/c-register-access.pdf
我面临的问题是需要创建一个通用类 GPIO(例如),它允许操作所有 GPIO 端口(即 GPIOA、GPIOB、GPIOC...)。 在当前实现中,寄存器被描述为:
STM32LIB ::REG ::GPIOF ::MODER_D
| | | |
The LIB namespace The registers namespace the GPIOx struct The register i'm interested
//if i want to access the MODER_D on GPIOA i would write
STM32LIB::REG::GPIOA::MODER_D.set();
//or GPIOB
STM32LIB::REG::GPIOB::MODER_D.set();
我想让它对用户尽可能干净。像这样的:
GPIO LED;
LED.init(PA_5,GPIO::PIN_OUTPUT,GPIO::PullDefault,GPIO::Slow);
LED.ON();
我不希望让用户知道任何模板,但如果需要,那就没问题了。最重要的是用户不需要这样做:
GPIO<GPIOA,2> LED; // <-- This is OK(ish)
...
LED<GPIOA,2>.ON(); // <-- This is not...
我知道我可以为此使用模板,但我不喜欢编写相同的函数 X 次,只是更改 B 和 C 的 GPIOA 参数...
这是我声明所有外围寄存器的 hpp 文件。https://github.com/joaoc/STM32LIB/blob/baremetal/stm32Lib/HAL/Include/RegisterAccess/MCU/hpp/STM32F030.hpp
一个小例子是:
struct GPIOF{
struct MODER{
static reg_t<rw_t, 0x48001400, 30, 2> MODER15;
static reg_t<rw_t, 0x48001400, 28, 2> MODER14;
//...
};
static reg_t<rw_t, 0x48001400, 0, 32> MODER_D
};
【问题讨论】:
-
嗯,这可能是预处理器宏允许的用例之一,并让用户将特定目标平台绑定作为
-D编译器选项。 -
这是一个想法,但并不理想。如何定义引脚,一个在 GPIOA 上,另一个在 GPIOB 上?
-
也可以使用
typedef或using键入别名可能会有所帮助。 -
你会使用吗?我发布的 pdf 使用 using 关键字指定了 regs,如下所示:
using MODER15=reg_t<rw_t, 0x48001400, 30, 2>但我改变了它,试图允许使用某种指针,但失败了。 -
“你会使用吗?” 好吧,如前所述:在某些目标平台
#define依赖于config.h标头中,您的HAL 的客户端应该@ 987654332@.