0

私は 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");
    }
}

私のコードはこのようなものです。

どうすればこれを管理できますか?

4

1 に答える 1

0

このコードの多くの問題:

主なもの:

  1. HAL_Delay()割り込みコンテキストでは使用しないでください。この関数は、優先度の低い sysTick 割り込みでインクリメントされたカウンターを中継します。

2 次: 2. 割り込みルーチンで遅延を使用しないでください。

  1. 長時間実行される関数を呼び出さないようにしてください。HAL_使用していないことが確実でない限り、呼び出してはいけません。HAL_Delay

  2. uint8_t buf2[50] = { 0 };ローカル自動変数です。

于 2021-06-06T13:26:34.640 に答える