ST意法半导体
直播中

周棠亨

7年用户 1041经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

如何覆盖CubeMX I2C时序寄存器计算?

我正在使用 CubeMX 为 STM32F767 配置 BSP。我的时钟树有 54MHz 到 I2C2,当我将 I2C2 设置为 400KHz 的“I2C 速度频率”时,CubeMX 输出时序寄存器 (I2C_tiMINGR) 值为 0x6000030D。使用 7 和 20 个预分频周期的预分频器,实际理想频率约为 385KHz(我已经用示波器确认过。)

问题是,我实际上需要 400KHz 总线的全部带宽。我手动将CubeMX生成的main.c中的hi2c2.Init.Timing值修改为0x6000030C编译运行,这个值符合我的要求,在我的硬件上也能正常运行。(我知道假设理想的上升/下降时间,这会以略微超出规格的 ~406KHz 运行总线,但这对于应用程序来说是可以接受的。)

我的问题是:如何让 CubeMX 为 I2C2 的计时寄存器输出这个值,或者以 CubeMX 在重新生成时不会覆盖它的方式编辑 main.c?我知道用户代码部分,但 hi2c2.Init.Timing 已设置,然后在单个自动生成的代码部分中使用,中间没有用户代码部分。我无法在后续用户代码块中的 init 之后编辑时序寄存器,因为芯片规范禁止这样做。

我无法告诉 CubeMX 输出例如 410KHz 的时序以获得 406KHz 值,它拒绝超过 400 的值。虽然“时序”值在 I2C 参数页面上可见,但它呈灰色且不可编辑,我找不到使其可手动编辑的任何选项。

main.c中生成的init函数供参考:
  • static void MX_I2C2_Init(void)
  • {
  •   /* USER CODE BEGIN I2C2_Init 0 */
  •   /* USER CODE END I2C2_Init 0 */
  •   /* USER CODE BEGIN I2C2_Init 1 */
  •   /* USER CODE END I2C2_Init 1 */
  •   hi2c2.Instance = I2C2;
  •   hi2c2.Init.Timing = 0x6000030D;
  •   hi2c2.Init.OwnAddress1 = 0;
  •   hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  •   hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  •   hi2c2.Init.OwnAddress2 = 0;
  •   hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  •   hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  •   hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  •   if (HAL_I2C_Init(&hi2c2) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Configure Analogue filter
  •   */
  •   if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /** Configure Digital filter
  •   */
  •   if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /* USER CODE BEGIN I2C2_Init 2 */
  •   /* USER CODE END I2C2_Init 2 */
  • }


更多回帖

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