【问题标题】:Checking the status of the GPIO even before main starts in embedded programming甚至在嵌入式编程的 main 启动之前检查 GPIO 的状态
【发布时间】:2019-09-13 08:10:27
【问题描述】:

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

if(vol < BIAS_VOLTAGE)
{

    //Execute this

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

}

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

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

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

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

【问题讨论】:

  • 为什么不让BIAS_VOLTAGE成为一个变量,一旦初始化完成,你就可以读取GPIO引脚状态。
  • 您无法在运行时更改定义值,因此我可以看到 spdude 建议的唯一替代方法是拥有两个版本的应用程序并使用小型启动应用程序来检测实际电压水平,并基于此调用适当版本的主应用程序..
  • 定义由预处理器处理(编译前),不能在运行时修改。
  • 如果您不能自动检测到它,您必须以某种形式对其进行硬编码(驱动程序中的平台数据,或某些操作系统中的 DT blob 等平台描述)。顺便说一句,您使用任何操作系统(例如 Zephyr)吗?
  • 为什么要在main()之前?只需要在确定使用之前?

标签: c embedded microcontroller gpio


【解决方案1】:

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

给定:

#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

}

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

【讨论】:

    【解决方案2】:

    闻起来像是应该尽早完成的事情。如果是这样,您必须调整当前的“CRT”(库启动代码)或自己编写,这是我只推荐给资深嵌入式开发人员的工作。

    不幸的是,大多数工具链都带有 CRT,它在业余项目之外毫无用处。可以在此处找到有关如何正确编写它的一些建议:https://stackoverflow.com/a/47940277/584518。如果您当前的 CRT 与那里给出的建议不同 - 特别是如果它让 CRT 使用默认的内部 RC 振荡器运行整个 .data/.bss 设置,并且没有启用 wdog,您应该询问您的工具供应商为什么他们让不称职的庸医写 CRT。

    【讨论】:

    • 最后一句话是侮辱性的,离题(不,我不是为工具链供应商工作)
    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多