×
单片机 > 其他资讯 > 详情

STM32CubeMX学习教程之十一:硬件I2C读取SHT20温湿度

发布时间:2020-06-19 发布时间:
|

上一篇教程我们使用I2C进行了EEPROM的读写操作,实际上I2C上面挂的所有器件我们都可以操作。


本文的目标就是使用STM32CubeMX的硬件I2C读取麒麟座连接在I2C2上的SHT20芯片温湿度信息。


软件版本:


STM32CubeMX V4.25.0  


 


System Workbench V2.4


固件库版本:


STM32Cube FW_F1 V1.6.1


硬件:OneNet 麒麟座V2.3


在STM32CubeMX中新建项目,选择正确的MCU型号(或者旧项目另存一下也可以)。



首先设置RCC和SYS,如下图



然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M),如下图



设置I2C2,麒麟座V2.3 的 SHT20是接在I2C2上的,I2C的设置不需要改,用默认的值就好(默认速率为100KHz)。



打开串口USART1,串口设置也不需要修改,默认115200波特率。



引脚设置如下:



 


Project - setting ,ToolChain/IDE选择 SW4STM32,注意项目名称这里不能有空格,最好不要用中文。


勾选这里


保存以后,点击任务栏的生成代码图标


生成完毕以后在弹出的对话框点击"Open Project", System Workbench自动打开Eclipse并导入和打开了项目,然后展开项目树,


 


双击Src文件夹下的i2c.c, 把I2C时钟初始化提前到GPIO初始化前面(照例我们需要修改那个bug):


void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)

{

 

  GPIO_InitTypeDef GPIO_InitStruct;

  if(i2cHandle->Instance==I2C2)

  {

  /* USER CODE BEGIN I2C2_MspInit 0 */

  __HAL_RCC_I2C2_CLK_ENABLE(); //默认情况下这句时钟初始化代码放在了GPIO初始化之后,需要调整到这里,即GPIO初始化前

  /* USER CODE END I2C2_MspInit 0 */

  

    /**I2C2 GPIO Configuration    

    PB10     ------> I2C2_SCL

    PB11     ------> I2C2_SDA 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

 

    /* I2C2 clock enable */

//    __HAL_RCC_I2C2_CLK_ENABLE();//默认情况下这句时钟初始化代码放在了这里,这里需要注释掉

  /* USER CODE BEGIN I2C2_MspInit 1 */

 

  /* USER CODE END I2C2_MspInit 1 */

  }

}

然后编辑main.c,首先我们需要用printf输出一些信息并重定向到串口,参考前面的教程,我们做如下修改:


/* USER CODE BEGIN PFP */

 

/* Private function prototypes -----------------------------------------------*/

 

#ifdef __GNUC__

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif

/* USER CODE END PFP */

 

/* USER CODE BEGIN 0 */

 

PUTCHAR_PROTOTYPE

{

    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);

    return ch;

}

/* USER CODE END 0 */

注意我们需要输出浮点数,所以还需要进行如下修改,右键点击项目,选择:


 


project properties > C/C++ Build > Settings > Tool Settings (TAB) > MCU GCC Linker > Miscellaneous > Linker flags


在把-specs=nosys.specs -specs=nano.specs 改为 -specs=nosys.specs -specs=nano.specs -u _printf_float


 


另外不要忘记把STM32Cube_FW_F1_V1.6.0ProjectsSTM3210C_EVALExamplesUARTUART_Printfsyscalls.c 文件复制到Src目录


 


继续编辑main.c


/* USER CODE BEGIN Includes */

#include "sht20.h"

/* USER CODE END Includes */

while (1) {

 

  /* USER CODE END WHILE */

 

  /* USER CODE BEGIN 3 */

SHT20_GetValue();

printf( "Temperature:%0.1fC,  Humidity:%0.1f%%rn", sht20_info.tempreture, sht20_info.humidity);

HAL_Delay(1000);

}

  /* USER CODE END 3 */

 

}

其中sht20.h和sht20.c是基于麒麟座官方的例程移植的


右键点击项目,选择Properties, Run-Debug Settings, 点击右侧的New,在弹出对话框中选择Ac6 STM32 Debugging。



然后任务栏上点击Run图,当然会报错的,原因请查看另一篇我的博客,所以需要右键点击  项目名Run.cfg ,给它改个名字,



然后右键点击项目树里面的项目名称,选择“Propeties”,然后在Run/Debug Settings-选择项目名-Edit-Main-C/C++Application那里点击“Search Project”,然后选择出现的默认的elf文件:



然后在Debugger-User Defined-Browse 那里选择你自己改名的配置文件:



然后右键点击那个新的cfg文件,选择"Open With - Text Editor", 进行如下更改:


source [find interface/stlink.cfg] 更改为 source [find interface/stlink-v2.cfg]


reset_config srst_only srst_nogate connect_assert_srst 这一行改为 reset_config none 


然后再Run一下,就可以了。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
工业自动化控制包括着哪些内容