指向端口寄存器

时间:2016-10-10 09:21:38

标签: c pointers bit

我有一些代码需要在2个不同的PCB上运行。在启动时,代码会检测/知道它运行的硬件并设置标志。

现在,一些信号根据硬件改变端口,即: 在HW1上,信号A在P9上为0x08,而在另一硬件上在P14上为0x02。

我可以轻松地检查每个地方使用信号A的标志 - 但是这个解决方案看起来不太好看'对我来说。

我也可以通过以下方式轻松更改启动端口:

if(cIsHW1) Reg = &P14;         
      else Reg = &P9;

并使用Reg访问每个HW上的正确端口。

但是,我如何更改位位置?我现在没有指向寄存器中某个位的指针 - 这实际上是我认为我需要的东西。

我需要读取这些端口位并设置/清除它。

我是否遗漏了某些东西或者我是否真的需要检查我需要访问该端口位的标志(如果...其他)?

由于 MCL

1 个答案:

答案 0 :(得分:1)

只需收集结构中与硬件相关的数据,并找出在启动时使用的数据:

struct hw_config {
  volatile uint32_t *reg;
  uint32_t mask;
} boardA = { .reg = &P14, .mask = 8 },
  boardB = { .reg = &P9,  .mask = 2 },
  * board;

int main(void)
{
  // Figure out which board we're on, and set the board pointer.
  board = running_on_board_a() ? &boardA : boardB;

  // Example usage.
  *board->reg |= board->mask;
}

如果你能想出在编译时使用哪一个,你当然可以通过永不定义冗余来优化它。