【发布时间】: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)地址线