[STM32F1] STM32F1HAL库的I2C应用注意事项

[复制链接]
 楼主| yukaigogogo 发表于 2016-11-22 08:27 | 显示全部楼层 |阅读模式
本帖最后由 yukaigogogo 于 2016-11-22 08:32 编辑

因为要用到I2C和流量传感器通信,也是第一次使用,直接使用stm32F1 HAL库来实现初始化,在STM32F10E评估板上直接和传感器通信,一次性成功通过。
当把调试好的流量计驱动程序往实际的板子上应用的时候发现会死等在某一处如下:
  1. while(__HAL_I2C_GET_FLAG(hi2c, Flag) != RESET)
  2.     {
  3.       /* Check for the Timeout */
  4.       if(Timeout != HAL_MAX_DELAY).......

以上代码是HAL库中的
网上查阅是I2C的固有BUG,真的是这样吗,官方的HAL库更新了好几代了都。。。
尝试
  1. void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
  2. {

  3.   GPIO_InitTypeDef GPIO_InitStruct;
  4.   if(i2cHandle->Instance==I2C2)
  5.   {
  6.   /* USER CODE BEGIN I2C2_MspInit 0 */
  7.   /*自已加了这一句代码,提前打开时钟,能解决前面的问题*/
  8.   __HAL_RCC_I2C2_CLK_ENABLE();</font>
  9.   /* USER CODE END I2C2_MspInit 0 */
  10.    
  11.     /**I2C2 GPIO Configuration   
  12.     PB10     ------> I2C2_SCL
  13.     PB11     ------> I2C2_SDA
  14.     */
  15.     GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
  16.     GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  17.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  18.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);      
  19.     /* Peripheral clock enable */


非常奇怪的时,在STM32f10E评估板上不用对CUBE生成的代码更改。
没有深入研究,好用就行。
flydream0 发表于 2016-11-22 17:43 | 显示全部楼层
谢谢分享
airwill 发表于 2016-11-26 16:02 | 显示全部楼层
HAL 代码确实挺方便的, 只是影响效率, 而硬件调试的时候也不直观
如果有外设库开发经验, 会被多种似是而非的定义搞晕了头
huangcunxiake 发表于 2016-11-26 22:40 | 显示全部楼层
主要这个STM32dIIC好多人说不好配置,好几个人我看最后选择了IO模拟,自己写时序。
huangcunxiake 发表于 2016-11-26 22:40 | 显示全部楼层
其实上面版主说的这个不灵活的弊端完全可以通过编译后定位原函数来查找具体的配置,然后修改成寄存器版本的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

25

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

5

主题

25

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部