ST意法半导体
直播中

王兰

13年用户 877经验值
擅长:基础元器件
私信 关注
[问答]

STMCubeIDEV1.6.1没有正确生成SMBus外设的初始化代码怎么处理?

我正在使用 STM32F407 控制器并将 I2C1 配置为 SMBus。
但是在IDE中配置后,I2C1生成的初始化代码如下:
  • void MX_I2C1_SMBUS_Init(void)
  • {
  •   /* USER CODE BEGIN I2C1_Init 0 */
  •   /* USER CODE END I2C1_Init 0 */
  •   /* USER CODE BEGIN I2C1_Init 1 */
  •   /* USER CODE END I2C1_Init 1 */
  •   hsmbus1.Instance = I2C1;
  •   hsmbus1.Init.OwnAddress1 = 0;
  •   hsmbus1.Init.AddressingMode = SMBUS_ADDRESSINGMODE_7BIT;
  •   hsmbus1.Init.DualAddressMode = SMBUS_DUALADDRESS_DISABLE;
  •   hsmbus1.Init.OwnAddress2 = 0;
  •   hsmbus1.Init.GeneralCallMode = SMBUS_GENERALCALL_DISABLE;
  •   hsmbus1.Init.NoStretchMode = SMBUS_NOSTRETCH_DISABLE;
  •   hsmbus1.Init.PacketErrorCheckMode = SMBUS_PEC_DISABLE;
  •   hsmbus1.Init.PeripheralMode = SMBUS_PERIPHERAL_MODE_SMBUS_HOST;
  •   if (HAL_SMBUS_Init(&hsmbus1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** configuration Alert Mode
  •   */
  •   if (HAL_SMBUS_EnableAlert_IT(&hsmbus1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /* USER CODE BEGIN I2C1_Init 2 */
  •   /* USER CODE END I2C1_Init 2 */
  • }
在调试模式下运行代码时,以下断言失败:
  • assert_param(IS_SMBUS_CLOCK_SPEED(hsmbus->Init.ClockSpeed));
仔细检查后,“ClockSpeed”为零。
在上面的函数“MX_I2C1_SMBUS_Init”中,时钟速度没有设置,我相信它应该由 IDE 完成。
我必须手动设置时钟速度才能使其正常工作,这并不明显。
但是,它不能,因为它在配置外设时没有收到用户的输入。
如果我在这里做错了什么或错过了一步,请纠正我。
否则,请解决此问题。这是令人难以置信的混乱。









回帖(1)

黎锦荣

2022-12-29 15:27:56
我确认使用STM32CubeIDE 1.7.0STM32CubeMX 6.3.0时问题已解决。这里生成的代码带有时钟速度参数集:


  • static void MX_I2C1_SMBUS_Init(void)
  • {
  •   /* USER CODE BEGIN I2C1_Init 0 */

  •   /* USER CODE END I2C1_Init 0 */

  •   /* USER CODE BEGIN I2C1_Init 1 */

  •   /* USER CODE END I2C1_Init 1 */
  •   hsmbus1.Instance = I2C1;
  •   hsmbus1.Init.ClockSpeed = 100000;
  •   hsmbus1.Init.OwnAddress1 = 0;
  •   hsmbus1.Init.AddressingMode = SMBUS_ADDRESSINGMODE_7BIT;
  •   hsmbus1.Init.DualAddressMode = SMBUS_DUALADDRESS_DISABLE;
  •   hsmbus1.Init.OwnAddress2 = 0;
  •   hsmbus1.Init.GeneralCallMode = SMBUS_GENERALCALL_DISABLE;
  •   hsmbus1.Init.NoStretchMode = SMBUS_NOSTRETCH_DISABLE;
  •   hsmbus1.Init.PacketErrorCheckMode = SMBUS_PEC_DISABLE;
  •   hsmbus1.Init.PeripheralMode = SMBUS_PERIPHERAL_MODE_SMBUS_SLAVE;
  •   if (HAL_SMBUS_Init(&hsmbus1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** configuration Alert Mode
  •   */
  •   if (HAL_SMBUS_EnableAlert_IT(&hsmbus1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /* USER CODE BEGIN I2C1_Init 2 */

  •   /* USER CODE END I2C1_Init 2 */

  • }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分