|
//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); } } }
|
STM32L4P5xx 系统内 Bootloader:RAM3 能否用作栈指针内存?
STM32的硬件部分
在 STM32CubeIDE 中生成 ioc 配置文件
CAN 总线多节点环境下进行固件升级
在 Bootloader 运行期间保持 GPIO 引脚电平状态不变
把 MCO1 时钟源选为 PLLCLK会怎样
I2C 错误代码含义
CubeIDE 下载程序时不整片擦除芯片
在编译C++ STM32项目时,如何将.hpp文件扩展名与合并了头文件声明和源文件定义的模板
sscanf 函数无法正确读取浮点值
微信公众号
手机版
学到了