|
//IIC+中断 //记住不光要开IT中断,还要把I2C global中断打开 include "sht30.h"// IT状态标志(仅用于批量读取) volatile uint8_t ina226_IT_rx_done = 0; // 接收完成标志 volatile uint8_t ina226_IT_rx_error = 0; // 接收错误标志 uint8_t ina226_IT_read_buf[4] = {0}; // 批量读取缓存(6字节:3个16位寄存器) float Power, Current, BusVoltage; uint16_t num_of_Current = 0; uint8_t sht30_rx_err = 0; HAL_StatusTypeDef INA226_Read_ALL_IT(uint8_t Dev_addr) { // 检查上一次IT是否还在进行 if (HAL_I2C_GetState(&INA226_IIC) == HAL_I2C_STATE_BUSY_RX) { return HAL_BUSY; } // 重置IT状态和缓存 ina226_IT_rx_done = 0; ina226_IT_rx_error = 0; for (uint8_t i = 0; i < 4; i++) { ina226_IT_read_buf[i] = 0; } // 启动IT批量读取:从0x02寄存器开始,连续读取6字节(0x02/0x03/0x04各2字节) // 核心:利用INA226寄存器地址自动递增特性,一次读取3个寄存器 HAL_StatusTypeDef ret = HAL_I2C_Mem_Read_IT( &INA226_IIC, Dev_addr<<1, // 设备地址(Mem_Read自动处理读位,无需|0x01) INA226_REG_POWER, // 起始寄存器地址(0x02) I2C_MEMADD_SIZE_8BIT, // 寄存器地址8位 ina226_IT_read_buf, // IT接收缓存(6字节) 4 // 读取长度:3个寄存器×2字节=6字节 ); if (ret != HAL_OK) { return ret; // IT启动失败 } return HAL_OK; } /**
/** @brief I2C IT错误回调(仅处理INA226) / void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) { if (hi2c->Instance == INA226_IIC.Instance) { if(num_of_Current != 0) { ina226_IT_rx_done = 1; // 标记传输结束 ina226_IT_rx_error = 1; // 标记错误 INA226_Read_ALL_IT(addr_1); } else { sht30_rx_err = 1; SHT30_Read_ALL_IT(SHT30_ADDR_1); } } }
|
NUCLEO G474RE无法运行程序
STM32F407VGT6 开发板Beak at address "0x0" with no debug information our outside
BootLoader 与 DFU 模式的区别
STM32 是否有各种接口的官方 Bootloader 方案
调度器原子变量相关问题
运行到 WRITE_REG (FLASH->OPTKEYR, FLASH_OPTKEY1)跳转 HardFaultHandler
STM32F417IG 单端外部时钟旁路HSE Bypass问题
STM32L4A6 SDMMC 无法使用 1.8V IO 驱动 microSD 卡
STM32L4P5xx 系统内 Bootloader:RAM3 能否用作栈指针内存?
STM32的硬件部分
微信公众号
手机版
学到了