STM32
直播中

小黑羊

11年用户 1008经验值
擅长:31274
私信 关注
[问答]

请问STM8S207如何让编译器stvd+cosmic复位后不给这个变量初始化成0?

我用的是STM8S207 用的是stvd+cosmic编译环境 ,想对一个变量"value"持续计数,掉电存储一次内部EEPROM,上电判断上电标志(一管脚通过电阻给电容充电,上电时开始为0V,过一会充满电为VCC),上电标志0则读出EEPROM数据,为1则为看门狗热复位不读EEPROM,变量value仍保持原数据继续计数。

我没有初始化但编译器复位的时候就给初始化成0了;

例如:unsigned char value;

         则看门狗复位后读出的数据为0了,我得到了错误的结果0。
         我期望得到的是:看门狗热复位 value不清0,然后一判断上电标志位1就不需读EEPROM,这样可以按原来热复位之前的内存数据持续计数了。
        大家有没有让编译器不给我这个未初始化的变量初始化成0的办法啊。谢谢!

回帖(1)

djfldsthtr

2024-5-9 16:35:51
要在STM8S207上使用STVD+Cosmic编译器实现您的需求,您需要遵循以下步骤:

1. 首先,您需要将变量`value`存储在非易失性存储器(如内部EEPROM)中。这样,在掉电后,变量的值仍然可以保留。

2. 在程序开始时,您需要检查上电标志。如果上电标志为0,说明是正常上电,此时需要从EEPROM读取`value`变量的值。如果上电标志为1,说明是看门狗复位,此时不需要从EEPROM读取`value`变量的值。

3. 为了避免编译器在复位时将`value`变量初始化为0,您可以使用`__no_init`属性。这将告诉编译器不要为该变量分配初始化空间,从而避免在复位时将其初始化为0。

以下是实现上述步骤的示例代码:

```c
#include
#include

__no_init unsigned char value; // 使用__no_init属性避免初始化为0

void eeprom_read_value(void) {
    // 从EEPROM读取value变量的值
    eeprom_read(&value, sizeof(value));
}

void eeprom_write_value(void) {
    // 将value变量的值写入EEPROM
    eeprom_write(&value, sizeof(value));
}

void main(void) {
    unsigned char up_flag = GPIO_ReadInputPin(PA, PA_IN1); // 读取上电标志

    if (up_flag == 0) {
        eeprom_read_value(); // 正常上电,从EEPROM读取value变量的值
    }

    // 执行其他程序逻辑,更新value变量的值

    if (up_flag == 0) {
        eeprom_write_value(); // 正常上电,将value变量的值写入EEPROM
    }

    while (1) {
        // 持续计数,更新value变量的值
        // ...

        // 根据需要将value变量的值写入EEPROM
        eeprom_write_value();
    }
}
```

请注意,您需要根据您的硬件设计和EEPROM库实现`eeprom_read()`和`eeprom_write()`函数。此外,确保在程序中定期将`value`变量的值写入EEPROM,以防止在掉电时丢失数据。

通过以上步骤,您应该可以实现在STM8S207上使用STVD+Cosmic编译器对`value`变量进行持续计数,同时在掉电后能够从EEPROM中恢复变量的值。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分