×

stm32F407VET6--------计算浮点型,进入硬件错误

zxjy辉 zxjy辉 发表于2025-04-11 15:06:11 浏览546 评论0

抢沙发发表评论

通过函数传入一个指针,在函数中计算完毕,将值赋值给这个指针,发现,只要涉及小数计算的时候,直接进入硬件错误,去掉小数部分的计算,则一点问题都没有

  1. 问题代码:
    // 读取电压(单位: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, &reg, 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;
    }


    1. 只要在计算的时候,涉及的小数78.125,就会进入硬件错误,进入调试,报一个数据总线错误:IMPRECISERR错误

  2. 由于移植了freertos,以为是移植带来的问题,尤其是,在使用调试的时候,在打开Call Stack窗口,跳转的代码跑到freertos的相关代码中,最终发现,和rtos无关,这个错误是由于在keil中启用了硬件fpu的原因。但是代码中没有配置相关的设置,导致在计算小数的时候,直接就进入硬件错误,如下图,改为不使用,就没问题了

    image.png


#好好学习!

群贤毕至

访客