stm32 - 如何从中断例程将数据发送到 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");
}
}
我的代码是这样的。
我该如何管理?
解决方案
此代码中的许多问题:
主要的一个:
- 不要
HAL_Delay()
在中断上下文中使用。此函数在 sysTick 中断中递增的计数器上进行中继,该中断可以具有较低的优先级。
次要: 2. 不要在中断程序中使用任何延迟。
尽量不要调用执行时间长的函数。不要打电话给任何人
HAL_
,除非你确定他们不使用HAL_Delay
uint8_t buf2[50] = { 0 };
是一个局部自动变量。
推荐阅读
- swift - 可以通过 opener 属性链接两个 WKWebView 吗?
- ruby-on-rails - 这些创作方式的区别?Ruby on Rails
- teststack - 无法使用测试堆栈单击窗口中的按钮或填充文本框
- javascript - 函数中的 if / else 语句
- angular - Nativescript - 类型“ImageAsset”上不存在属性“getImage”
- angular - Angular 6 - http错误的返回值
- android - Flutter:默认标签栏控制器在滑动后不保持状态
- javascript - 将函数传递给 React 中的组件
- raml - RAML Osprey-Mock-Service TypeError:无法读取 null 的属性“absolutePath”
- asp.net-mvc - Sitecore 或 IIS URL 重写中的 301 重定向