// 初始化vl53l0x // dev:设备I2C参数结构体 VL53L0X_Error vl53l0x_init(VL53L0X_Dev_t *dev) { GPIO_InitTypeDef GPIO_InitStructure; VL53L0X_Error Status = VL53L0X_ERROR_NONE; VL53L0X_Dev_t *pMyDevice = dev; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 先使能外设IO PORTA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; // 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); // 根据设定参数初始化GPIOA GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 禁止JTAG,从而PA15可以做普通IO使用,否则PA15不能做普通IO!!! pMyDevice->I2cDevAddr = VL53L0X_Addr; // I2C地址(上电默认0x52) pMyDevice->comms_type = 1; // I2C通信模式 pMyDevice->comms_speed_khz = 400; // I2C通信速率 VL53L0X_i2c_init(); // 初始化IIC总线 VL53L0X_Xshut = 0; // 失能VL53L0X delay_ms(30); VL53L0X_Xshut = 1; // 使能VL53L0X,让传感器处于工作 delay_ms(30); vl53l0x_Addr_set(pMyDevice, 0x54); // 设置VL53L0X传感器I2C地址 if (Status != VL53L0X_ERROR_NONE) goto error; Status = VL53L0X_DataInit(pMyDevice); // 设备初始化 if (Status != VL53L0X_ERROR_NONE) goto error; delay_ms(2); Status = VL53L0X_GetDeviceInfo(pMyDevice, &vl53l0x_dev_info); // 获取设备ID信息 if (Status != VL53L0X_ERROR_NONE) goto error; AT24CXX_Read(0, (u8 *)&Vl53l0x_data, sizeof(_vl53l0x_adjust)); // 读取24c02保存的校准数据,若已校准 Vl53l0x_data.adjustok==0xAA if (Vl53l0x_data.adjustok == 0xAA) // 已校准 AjustOK = 1; else // 没校准 AjustOK = 0; error: if (Status != VL53L0X_ERROR_NONE) { print_pal_error(Status); // 打印错误信息 return Status; } return Status; }优化这段代码
时间: 2024-02-27 12:56:35 浏览: 229
这段代码的优化可以从以下几个方面考虑:
1. 减少不必要的代码量,比如可以将初始化I2C总线的函数放在vl53l0x_Addr_set()函数中一起调用,避免重复的代码。
2. 减少使用goto语句的次数,可以使用if-else语句或者switch语句等结构代替。
3. 将一些常量或者变量的定义放在函数外部,避免多次定义和初始化。
4. 将一些常用的操作封装成函数,提高代码的可读性和可维护性。
优化后的代码如下:
```c
// 初始化vl53l0x
VL53L0X_Error vl53l0x_init(VL53L0X_Dev_t *dev) {
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
VL53L0X_Dev_t *pMyDevice = dev;
// 初始化GPIO口
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
// 初始化VL53L0X设备
pMyDevice->I2cDevAddr = VL53L0X_Addr;
pMyDevice->comms_type = 1;
pMyDevice->comms_speed_khz = 400;
VL53L0X_i2c_init();
VL53L0X_Xshut = 0;
delay_ms(30);
VL53L0X_Xshut = 1;
delay_ms(30);
vl53l0x_Addr_set(pMyDevice, 0x54);
Status = VL53L0X_DataInit(pMyDevice);
if (Status != VL53L0X_ERROR_NONE) {
print_pal_error(Status);
return Status;
}
delay_ms(2);
Status = VL53L0X_GetDeviceInfo(pMyDevice, &vl53l0x_dev_info);
if (Status != VL53L0X_ERROR_NONE) {
print_pal_error(Status);
return Status;
}
// 读取24C02保存的校准数据
AT24CXX_Read(0, (u8 *)&Vl53l0x_data, sizeof(_vl53l0x_adjust));
AjustOK = (Vl53l0x_data.adjustok == 0xAA) ? 1 : 0;
return Status;
}
```
阅读全文
相关推荐


















