我正在尝试将硬件抽象层添加到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();我不希望让用户知道任何模板,但如果需要的话,它将是OKish。最重要的是,用户不需要这样做:
GPIO<GPIOA,2> LED; // <-- This is OK(ish)
...
LED<GPIOA,2>.ON(); // <-- This is not...我知道我可以使用模板,但我不喜欢只改变B和C的GPIOA参数X次编写相同的函数……
这是我声明所有外围设备寄存器的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
};发布于 2015-07-11 03:30:02
这会有帮助吗?http://torjo.blogspot.pt/2007/10/template-construct.html
我不完全理解那个链接中解释的方法,但这个想法似乎对我有帮助……
我不知道是不是很清楚,但我知道这里面有什么:
class GPIO{
\\ ...
void ON(){
STM32LIB::REG::GPIOx::BSRR_D.write(gpio_mask);
}
}如果我将一个LED实例化为
GPIO LED(GPIOA,3,...);
LED.ON();则on函数上的GPIOx将转换为GPIOA。我需要有这样的可能性:
GPIO LED_GREEN(GPIOA,3,...);
GPIO LED_RED(GPIOB,2,...);
LED_GREEN.ON(); //-> this would translate to STM32LIB::REG::GPIOA::BSRR_D.write(gpio_mask);
LED_RED.ON(); //and this to STM32LIB::REG::GPIOB::BSRR_D.write(gpio_mask);请记住,我可以更改在我发布链接的标题上声明寄存器的方式。我只是想要一种方法来制作我想要的东西,记住这是一个嵌入式程序。如果有可能在编译器阶段进行更改...
https://stackoverflow.com/questions/31346806
复制相似问题