gpt4 book ai didi

c - 使用微 Controller 有效控制 DAC

转载 作者:行者123 更新时间:2023-11-30 15:11:46 25 4
gpt4 key购买 nike

我有一个 Analog Devices 的 DAC8562。这是一个数据表:

http://www.analog.com/media/en/technical-documentation/data-sheets/DAC8562.pdf

它是一个并行 12 位 DAC。我有一个用 C 语言编写的函数,它控制 GPIO 引脚以锁存 DAC 的输入值。我的问题是我的功能相当慢。这是代码:

void setOut(uint16_t data) {

//Set DATA
if (data & 0x01) {
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P4, GPIO_PIN2);
} else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN2);
}
if (data & 0x02) {
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P4, GPIO_PIN0);
} else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN0);
}
if (data & 0x04) {
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P6, GPIO_PIN1);
} else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P6, GPIO_PIN1);
}
if (data & 0x08) {
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7);
} else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN7);
}
if (data & 0x10) {
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN6);
} else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN6);
}
if (data & 0x20) {
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4);
} else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4);
}
if (data & 0x40) {
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN6);
} else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN6);
}
if (data & 0x80) {
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P6, GPIO_PIN6);
} else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P6, GPIO_PIN6);
}
if (data & 0x100) {
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P6, GPIO_PIN7);
} else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P6, GPIO_PIN7);
}
if (data & 0x200) {
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN3);
} else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN3);
}
if (data & 0x400) {
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN1);
} else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN1);
}
if (data & 0x800) {
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN5);
} else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P3, GPIO_PIN5);
}

// Set CE Low
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN4);

// Set CE High
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P4, GPIO_PIN4);}

问题是电路板的布局需要我正在使用的特定端口/引脚分配。截至目前,我正在单独检查每个位,并匹配该位代表的引脚输出为高或低。有没有更有效的方法来做到这一点?

附加信息:我正在使用 MSP432P401R 作为微 Controller 。我正在使用 TI 的驱动程序库来控制 GPIO。

最佳答案

更好的智能代码!在这里你有:

解决方案1:

struct param_t
{
uint8_t bitmask;
uint??_t gpio_port;
uint??_t gpio_pin;
}

const param_t param[XXXX] =
{
{0x01, GPIO_PORT_P4, GPIO_PIN2},
{0x02, GPIO_PORT_P4, GPIO_PIN0},
{...},
}

void setOut(uint16_t data)
{
for(int i=0; i<XXXX; i++)
{
if(data & param[i].bitmask)
{
MAP_GPIO_setOutputHighOnPin(param[i].gpio_port, param[i].gpio_pin)
}
else
{
MAP_GPIO_setOutputLowOnPin(param[i].gpio_port, param[i].gpio_pin)
}
}
}

解决方案2:

const callback_t callback[2] =
{
MAP_GPIO_setOutputHighOnPin,
MAP_GPIO_setOutputLowOnPin
}

void setOut(uint16_t data)
{
callback[(int)(data & 0x01 == 0)](GPIO_PORT_P4, GPIO_PIN2};
callback[(int)(data & 0x02 == 0)](GPIO_PORT_P4, GPIO_PIN0};
...
}

解决方案3:(不确定是否可行)

之后我认为 MAP_GPIO_setOutputXxxxOnPin 很慢。它读取修改然后写回寄存器。您应该读取一次,在内存中本地修改其所有引脚,然后将其写回一次,而不是在同一端口上多次调用该函数。

关于c - 使用微 Controller 有效控制 DAC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35445683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com