通过函数传入一个指针,在函数中计算完毕,将值赋值给这个指针,发现,只要涉及小数计算的时候,直接进入硬件错误,去掉小数部分的计算,则一点问题都没有
问题代码: // 读取电压(单位:mV) 电压值需按公式转换:VCELL = (data[0] << 8 | data[1]) * 78.125μV HAL_StatusTypeDef MAX17048_ReadVoltage(uint16_t *voltage) { uint8_t reg = REG_VCELL; uint8_t data[2]; HAL_StatusTypeDef status = HAL_I2C_Master_Transmit(&hi2c2, MAX17048_ADDR, ®, 1, 1000); if (status != HAL_OK) return status; status = HAL_I2C_Master_Receive(&hi2c2, MAX17048_ADDR, data, 2, 1000); *voltage = (data[0] << 8 | data[1])*78.125/1000; return status; }只要在计算的时候,涉及的小数78.125,就会进入硬件错误,进入调试,报一个数据总线错误:IMPRECISERR错误
由于移植了freertos,以为是移植带来的问题,尤其是,在使用调试的时候,在打开Call Stack窗口,跳转的代码跑到freertos的相关代码中,最终发现,和rtos无关,这个错误是由于在keil中启用了硬件fpu的原因。但是代码中没有配置相关的设置,导致在计算小数的时候,直接就进入硬件错误,如下图,改为不使用,就没问题了

#好好学习!