首页 > 解决方案 > 如何从中断例程将数据发送到 EEPROM

问题描述

我有一个 EEPROM AT24C256。我想从定时器中断程序写入这个 EEPROM。但是当我尝试时,STM卡住了。其他代码行不会发生这种情况。

void TIM3_IRQHandler(void)
{
    //read adc 
    adc_value = HAL_ADC_GetValue(&hadc1);
    normalized_adc_value = (255.0f/4095.0f) * adc_value;  // range 0..255 
        
    _writeEEPROM(&hi2c2, 0xA0, pointerOfEeprom, normalized_adc_value);

    HAL_TIM_IRQHandler(&htim3);
}
void _writeEEPROM(I2C_HandleTypeDef *i2cbus, uint8_t devAdres, uint16_t memAdres, uint8_t value) {
    uint8_t val[3] = { 0 };
    val[0] = (memAdres >> 8) & 0xFF;
    val[1] = (memAdres & 0xFF);
    val[2] = value;

    uint8_t buf2[50] = { 0 };
    ret = HAL_I2C_Master_Transmit(i2cbus, devAdres, val, 3, 1000);
    HAL_Delay(10);
    if (ret != HAL_OK) {
        strcpy((char*) buf2, "EEPROM Write Error I2C-TX\r\n");
    } else {
        strcpy((char*) buf2, "EEPROM Write Success I2C-TX\r\n");
    }
}

我的代码是这样的。

我该如何管理?

标签: stm32i2cstm32f1

解决方案


此代码中的许多问题:

主要的一个:

  1. 不要HAL_Delay()在中断上下文中使用。此函数在 sysTick 中断中递增的计数器上进行中继,该中断可以具有较低的优先级。

次要: 2. 不要在中断程序中使用任何延迟。

  1. 尽量不要调用执行时间长的函数。不要打电话给任何人HAL_,除非你确定他们不使用HAL_Delay

  2. uint8_t buf2[50] = { 0 };是一个局部自动变量。


推荐阅读