STM32
直播中

李华瑞

7年用户 941经验值
私信 关注
[问答]

stm32F103使用CubeMX FreeRTOS通过其配置访问24C16,读取时会陷入死循环的原因?

我是STM32F103,使用CubeMX FreeRTOS,通过其配置访问24C16,碰到一个非常奇怪的问题:
原生cubeMX生成的代码,在同样一批板子上,有大概10%,在代码第一次读取24C16时,会陷入死循环,停在
stm32f1xx_hal_i2c.c中的

  while((__HAL_I2C_GET_FLAG(hi2c, Flag) ? SET : RESET) == Status)
这里。

查了一些资料,对代码做了修改:

就OK了,无论是10%还是90%都可以正常工作。
分享给大家,

在stm32f1xx_hal_msp.c文件中,
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
函数中,在user code里增加如下两句
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  if(hi2c->Instance==I2C1)
  {
  /* USER CODE BEGIN I2C1_MspInit 0 */
  /* USER CODE END I2C1_MspInit 0 */
  
    /**I2C1 GPIO Configuration   
    PB6     ------> I2C1_SCL
    PB7     ------> I2C1_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB,  GPIO_InitStruct);
    /* Peripheral clock enable */
    __HAL_RCC_I2C1_CLK_ENABLE();
  /* USER CODE BEGIN I2C1_MspInit 1 */
    __HAL_RCC_I2C1_FORCE_RESET();
    __HAL_RCC_I2C1_RELEASE_RESET();

  /* USER CODE END I2C1_MspInit 1 */
  }
}



一来有点疑问请教大家:
1、这个原因是为什么?道理是什么?
2、为何STM的HAL库不这样实现?如果是Bug,这个Bug我看存在了很久了,STM不这样修改的原因是什么?
3、这样有什么隐患么?

回帖(1)

迷你洼哇

2024-4-29 18:18:11
在您的情况下,STM32F103使用CubeMX FreeRTOS通过其配置访问24C16时,遇到死循环的问题可能是由于以下几个原因导致的:

1. I2C时钟配置问题:STM32F103的I2C时钟配置可能不正确,导致通信速度不稳定。您可以尝试调整I2C时钟源和时钟频率,以确保与24C16的通信速度匹配。

2. I2C引脚配置问题:STM32F103的I2C引脚可能没有正确配置,导致通信失败。请检查I2C_SCL和I2C_SDA引脚的配置,确保它们与24C16的引脚相匹配。

3. I2C地址配置问题:STM32F103的I2C地址可能与24C16的地址不匹配,导致无法正确读取数据。请检查24C16的地址设置,并确保STM32F103的I2C地址配置与之相匹配。

4. I2C通信超时问题:STM32F103的I2C通信超时设置可能过短,导致在某些情况下无法完成通信。您可以尝试增加I2C通信超时时间,以避免死循环。

5. 硬件问题:部分STM32F103板子可能存在硬件问题,导致I2C通信不稳定。您可以尝试更换板子或检查板子上的I2C引脚连接。

针对您提到的修改,您在stm32f1xx_hal_msp.c文件中的HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)函数中,在user code里增加了如下两句:

```c
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
  // ...
  // User code
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_SYSCFG_CLK_ENABLE();
}
```

这两行代码的作用是启用GPIOB的时钟和系统配置(SYSCFG)的时钟。这可能解决了您遇到的死循环问题,因为它们确保了I2C引脚的时钟和系统配置是可用的。

总之,要解决STM32F103使用CubeMX FreeRTOS通过其配置访问24C16时的死循环问题,您需要检查和调整I2C时钟配置、引脚配置、地址配置以及硬件连接。同时,您可以尝试增加I2C通信超时时间,以避免死循环。
举报

更多回帖

×
20
完善资料,
赚取积分