首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设计硬件抽象层的最佳方法

设计硬件抽象层的最佳方法
EN

Stack Overflow用户
提问于 2015-07-11 01:25:13
回答 1查看 1.6K关注 1票数 2

我正在尝试将硬件抽象层添加到ST32F0微控制器中。为了访问寄存器,我在这里使用了方法布局:

https ://github.com/kensmith/cortex from-scratch

https ://yogiken.files.wordpress.com/2010/02/c-register-access.pdf

我面临的问题是需要创建一个泛型类GPIO (例如),它允许操作所有的GPIO端口(即。GPIOA、GPIOB、GPIOC等)。在当前实现中,寄存器描述如下:

代码语言:javascript
复制
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();

我想让这对用户尽可能的干净。如下所示:

代码语言:javascript
复制
GPIO LED;
LED.init(PA_5,GPIO::PIN_OUTPUT,GPIO::PullDefault,GPIO::Slow);
LED.ON();

我不希望让用户知道任何模板,但如果需要的话,它将是OKish。最重要的是,用户不需要这样做:

代码语言:javascript
复制
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

一个小的例子是:

代码语言:javascript
复制
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
};
EN

回答 1

Stack Overflow用户

发布于 2015-07-11 03:30:02

这会有帮助吗?http://torjo.blogspot.pt/2007/10/template-construct.html

我不完全理解那个链接中解释的方法,但这个想法似乎对我有帮助……

我不知道是不是很清楚,但我知道这里面有什么:

代码语言:javascript
复制
class GPIO{
\\ ...
   void ON(){
      STM32LIB::REG::GPIOx::BSRR_D.write(gpio_mask);
   }
}

如果我将一个LED实例化为

代码语言:javascript
复制
GPIO LED(GPIOA,3,...);
LED.ON();

则on函数上的GPIOx将转换为GPIOA。我需要有这样的可能性:

代码语言:javascript
复制
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);

请记住,我可以更改在我发布链接的标题上声明寄存器的方式。我只是想要一种方法来制作我想要的东西,记住这是一个嵌入式程序。如果有可能在编译器阶段进行更改...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31346806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档