【问题标题】:Code for pin mapping引脚映射代码
【发布时间】:2018-02-05 16:47:49
【问题描述】:

假设我有一个带有插头连接器的 PCB。其中一些引脚是模拟输入,称为 A0-A15。这些引脚连接到 MCU 上的 ADC 输入,但为了简化布局任务,信号未与索引一对一连接。所以在我的板子特定头文件中,我定义了引脚映射,其中 BOARD_A0 指的是板子连接器上的输入 A0,后跟 MCU ADC 的相应索引:

#define BOARD_A0            13
#define BOARD_A1            4
#define BOARD_A2            5
#define BOARD_A3            14
....

总共有 16 个频道。我希望能够使用 for 循环转储所有通道值,因此我需要遍历整个映射并翻译每个引脚。为此,我有以下功能:

unsigned int adc_get_board_channel(int channel)
{
  int adc_channel;

  switch(channel) {
    case 0:
    adc_channel = BOARD_A0;
    break;

    case 1:
    adc_channel = BOARD_A1;
    break;

    case 2:
    adc_channel = BOARD_A2;
    break;

    case 3:
    adc_channel = BOARD_A3;
    break;

    case 4:
    adc_channel = BOARD_A4;
    break;

    ....
  } 
  adc_get_channel_value(ADC,adc_channel);
}

我不禁想知道是否有一种更优雅的方式来为这种引脚映射编写代码?

【问题讨论】:

  • 是的,有。使用查找表。 4-5 行代码加上表格本身
  • 顺便说一句:你的函数应该返回一个unsigned int,但它不返回任何东西。这通常是一个错误。
  • 将 ADC PCB 接头命名为“A0”、“A1”、“Ax”是个坏主意。这些名称按惯例用于(CPU)地址线

标签: c embedded mapping


【解决方案1】:

是的,有:

unsigned int adc_get_board_channel(int channel)
{
  static int boards[] = 
     {BOARD_A0, BOARD_A1, ..., BOARD_16};     // I let you take care of the typing

  return adc_get_channel_value(ADC, boards[channel]);
}

顺便说一句:在您的原始函数中,adc_get_channel_value 之前可能缺少一个 return

【讨论】:

  • 肯定是宏而不是函数 - 这是嵌入的 ;-)
猜你喜欢
  • 2010-10-19
  • 1970-01-01
  • 2018-08-17
  • 2023-03-25
  • 2012-04-09
  • 1970-01-01
  • 2013-09-05
  • 2014-04-02
  • 2016-12-02
相关资源
最近更新 更多