实验内容:
学习I2C总线通信协议,完成基于I2C硬件协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。
一、什么是“软件I2C”和“硬件I2C”?
想要控制 STM32 产生 I2C 方式的通讯,可以采用软件模拟或硬件 I2C 这两种方式。
所谓
软件模拟
,即直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平。如控制产生 I2C 的起始信号时,如图 ,先控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL 线切换为低电平,这样就输出了一个标准的 I2C 起始信号。
而
硬件 I2C
是指直接利用 STM32 芯片中的硬件 I2C 外设,该硬件 I2C 外设跟 USART串口外设类似,只要配置好对应的寄存器,外设就会产生标准串口协议的时序。使用它的I2C 外设则可以方便地通过外设寄存器产生 I2C协议方式的通讯,如初始化好 I2C 外设后,只需要把某寄存器位置 1,那么外设就会控制对应的 SCL 及 SDA 线自动产生 I2C起始信号,而不需要内核直接控制引脚的电平。
比较起来,硬件 I2C 直接使用外设来控制引脚,可以减轻 CPU 的负担。不过使用硬件I2C 时必须使用某些固定的引脚作为 SCL 和
SDA,软件模拟 I2C 则可以使用任意 GPIO 引脚,相对比较灵活。
二、编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)
1、任务要求
每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。
2、实验器材
① STM32最小核心板(STM32F103C8T6)
②奥松AHT21B温湿度传感器
③USB转TTL(ch340芯片)
④ IDE:keil5
⑤ 实验所用串口:USART1
3、主要代码
#include "stm32f10x.h"
#include "bsp_usart.h"
#include "delay.h"
#include "bsp_aht20.h"
#include "bsp_led.h"
int main(void)
{
u32 CT_data[2]={0};
volatile float hum=0,temp=0;
USART_Config(); //USART1初始化
LED_GPIO_Config(); //LED端口初始化
delay_init(); //延时函数初始化
temphum_init(); //初始化温湿度传感器
while(1)
{
AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据
hum = CT_data[0]*100*10/1024/1024; //计算得到湿度值(放大了10倍)
temp = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)
printf("湿度:%.1f%%\r\n",(hum/10));
printf("温度:%.1f度\r\n",(temp/10));
printf("\r\n");
/*绿灯闪烁提示串口发送状态*/
green_led_on;
delay_ms(1000);
green_led_off;
delay_ms(1000);
}
}
安装 Ardunio IDE 和相关软件支持库,在Ardunio 完成STM32板子的串口通信程序
1、要求
1)持续向串口输出“Hello world!”
2)当接收到“stop!”时,停止输出。
步骤
1.
安装Ardunio
2.环境
① STM32最小核心板(STM32F103R)
②USB转TTL(ch340芯片)
③ IDE:Arduino
④ 实验所用串口:USART1
3.实验代码
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);//设置串口的波特率
pinMode(PC2,OUTPUT);//PC2是蓝色的,PC2表示LED的接口,还有一个是PC3
}
int flag=1;//串口发送标志位,1表示发送,0表示停止发送
void loop() {
// put your main code here, to run repeatedly:
if (flag == 1)
{
Serial.println("Hello World!");
digitalWrite(PC2, HIGH); //LED灭
delay(500); // 延时
digitalWrite(PC2, LOW); //LED亮
delay(500); //延时
}
stopSendData();
}
void stopSendData()
{
String stopflag="stop!";//停止发送数据信号
String receivedata="";//存放接受到的数据
while(Serial.available()>0)//判断串口是否还有数据
{
receivedata=Serial.readString();//读取接收到的数据
}
if(receivedata==stopflag)//判断接收到的数据是否为停止发送数据的信号
{
flag=0;
}
}
连接温湿度传感器
scl ———- pc6
sda ———- pc7
gnd ———- gnd
vcc ———- 3v3
结果展示:
4.配置设置
5.结果展示