作为一个资深51玩家,现在要玩低功耗,不得不转移到STM32L0系列。
看看L0的资料就够头大的,一长串不熟悉的函数命名,各种初始化操作,头疼欲裂,怀念51的直接寄存器读写操作。
再有牢骚,还是得把工作干了,谁叫咱要挣钱养家呢?
项目需要对SHT3X系列温湿度传感器进行读写,必须用I2C通信,你在网上搜一下,几乎全是对STM32 I2C的抱怨,全是说厂家的软硬件有BUG,最好采样模拟I2C方式。
花了两天时间搜搜,模拟I2C显然不适合我学习STM32的初衷,于是看看这个BUG究竟是什么?
搜到微雪课堂的一篇文章:
STM32CubeMX系列教程9:内部集成电路(I2C) - STM32CubeMX系列教程 微雪课堂 http://www.waveshare.net/study/article-648-1.html
正文一般般,倒是留言说明了解决BUG的办法:
1. IIC的回调函数里面需要将时钟初始化放在引脚初始化之前
/* USER CODE BEGIN I2C1_MspInit 0 */
__HAL_RCC_I2C1_CLK_ENABLE(); //默认生成的放在了引脚初始化后面!
/* USER CODE END I2C1_MspInit 0 */
看到这个,信心大增,立马用STM32CubeMX 配置了我的板子(STM32L053C8T6),然后生产工程和代码。
接下来,修改stm32l0xx_hal_msp.c 中I2C的初始化代码,把时钟初始化放在引脚初始化之前,
最后用两个函数操作I2C读写:
HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
编译通过,连上SHT3X,一次成功!!!