在嵌入式编程中 main 启动之前检查 GPIO 的状态

标签 c embedded microcontroller gpio

我有两个版本的板,其中代码的特定部分根据#define BIAS_VOLTAGE 的值执行

if(vol < BIAS_VOLTAGE)
{

    //Execute this

}
else if (vola >= BIAS_VOLTAGE)
{
 //Execute This

}

现在 BIAS_VOLTAGE 在头文件中#defined (#define BIAS_VOLTAGE 3) 但对于不同的电路板,它是 5(5V)。

检测此问题的唯一方法是轮询一个 GPIO 状态(在 main 中的 GPIO 初始化后保持高或低。这只完成一次)。

如果它是高的,BIAS_VOLTAGE 3 否则 5 由于#BIAS_VOLTAGE 在许多地方使用,我如何在启动时(甚至在 main 之前)知道 GPIO 的状态并修复#define 值。

我知道#define 在编译时得到修复,但我需要在运行时修复这个常量值。(这将永远保持) 更新:工具链是 IAR,微 Controller 是 STM32F4

最佳答案

你可能把一个简单的事情复杂化了:

给定:

#define BIAS_3V0 3
#define BIAS_5V0 5

int getBiasVoltage()
{
    static int bias_voltage = 0 ;

    // Initialise on first use...
    if( bias_voltage == 0 )
    {
        bias_voltage = boardId() ? BIAS_3V0 : BIAS_5V0 ;
    }

    return bias_voltage ;
}

其中boardId()是GPIO读取识别变体(根据需要替换成你自己的代码),那么你的代码变成:

if(vol < getBiasVoltage() )
{

    //Execute this

}
else if (vola >= getBiasVoltage() )
{
 //Execute This

}

板的身份在第一次使用时被检查一次,然后返回先前确定的值。因为变量隐藏在函数内部,所以它也是只读的。

关于在嵌入式编程中 main 启动之前检查 GPIO 的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57919680/

相关文章:

arm - "CPU is not halted"和 "No APB-AP found"错误

c++ - 如何将函数放置在 C 中的特定地址?

c - 具有其他阻挡功能的Arduino IR Remote

c - 面向对象的 ANSI C?

c - 如何连接#define 值?

linux - 用于 C/C++ 的 Eclipse IDE 中的远程调试

c - 嵌入式 C : what does var = 0xFF; do?

c - 通过UDP协议(protocol)发送巨大的(大约40K字节)数据,怎么可能呢?

c - for 循环中的 sum 问题

带有外部共享库的 PHP 自定义 C 扩展