开发环境使用MounRiver_Studio_Setup_V180,安装后界面:
由于需要理解腾讯云平台,所以需要更新腾讯云固件,使用乐鑫公司出的固件更新工具。
固件名字叫:
QCloud_IoT_AT_ESP8266_v2.1.1_20200903_UART_1_3.bin
从github上下载官方的Tencent OS Tiny 例程。CH32V-RISC-V物联网操作系统TencentOS-Tiny案例实践指南。
https://github.com/OpenAtomFoundation/TencentOS-tiny
打开clone下来的整个代码仓源码,进入 <TencentOS-tiny\board\TencentOS_Tiny_CH32V307_EVB> 目录,打开CH32V_EVB_TencentOS_Tiny_IoT_Explorer工程。
编写代码之前,先查看硬件原理图接口:
IIC接口使用的是PB10和PB11
#ifndef __BH1750_H__
#define __BH1750_H__
#include "debug.h"
#define uchar unsigned char
#define uint unsigned int
#define sda GPIO_Pin_11 //PB11
#define scl GPIO_Pin_10 //PB10
#define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
//ALT ADDRESS引脚接地时地址为0x46,接电源时地址为
extern uchar BUF[8]; //接收数据缓存区
extern int dis_data; //变量
extern int mcy; //表示进位标志位
void Init_BH1750(void);
void conversion(uint temp_data);
void Single_Write_BH1750(uchar REG_Address);//单个写入数据
uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
void mread(void); //连续的读取内部寄存器数据
void Delay_5us(void);
void Delay_mms(uint16_t tmp);
void BH1750_GPIO_Config(void);
void Get_Illu_Task(void);
unsigned int Read_BH1750(void);//读取光度值
#endif
#include "bh1750.h"
#include <math.h>
#include "stdio.h"
unsigned char BUF[8]; //接收数据缓存区
int dis_data; //变量
int mcy;
void BH1750_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/*开启GPIOB的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = sda | scl ;
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void Delay_5us(void)
{
Delay_Us(5);
}
void Delay_mms(uint16_t tmp)
{
Delay_Ms(tmp);
}
/***开始信号***/
void BH1750_Start()
{
GPIO_SetBits(GPIOB, sda); //拉高数据线
GPIO_SetBits(GPIOB, scl); //拉高时钟线
Delay_5us(); //延时
GPIO_ResetBits(GPIOB, sda); //产生下降沿
Delay_5us(); //延时
GPIO_ResetBits(GPIOB, scl); //拉低时钟线
}
/*****停止信号******/
void BH1750_Stop()
{
GPIO_ResetBits(GPIOB, sda); //拉低数据线
GPIO_SetBits(GPIOB, scl); //拉高时钟线
Delay_5us(); //延时
GPIO_SetBits(GPIOB, sda); //产生上升沿
Delay_5us(); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(int ack)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = sda;
GPIO_Init(GPIOB, &GPIO_InitStruct);
if(ack == 1) //写应答信号
GPIO_SetBits(GPIOB, sda);
else if(ack == 0)
GPIO_ResetBits(GPIOB, sda);
else
return;
GPIO_SetBits(GPIOB, scl); //拉高时钟线
Delay_5us(); //延时
GPIO_ResetBits(GPIOB, scl); //拉低时钟线
Delay_5us(); //延时
}
/**************************************
接收应答信号
**************************************/
int BH1750_RecvACK()
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; /*这里一定要设成输入上拉,否则不能读出数据*/
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = sda;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_SetBits(GPIOB, scl); //拉高时钟线
Delay_5us(); //延时
if(GPIO_ReadInputDataBit( GPIOB, sda ) ==1 )//读应答信号
mcy = 1 ;
else
mcy = 0 ;
GPIO_ResetBits(GPIOB, scl); //拉低时钟线
Delay_5us(); //延时
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init( GPIOB, &GPIO_InitStruct );
return mcy;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(uchar dat)
{
uchar i;
for (i=0; i<8; i++) //8位计数器
{
if( 0X80 & dat )
GPIO_SetBits( GPIOB, sda);
else
GPIO_ResetBits( GPIOB, sda);
dat <<= 1;
GPIO_SetBits(GPIOB, scl); //拉高时钟线
Delay_5us(); //延时
GPIO_ResetBits(GPIOB, scl); //拉低时钟线
Delay_5us(); //延时
}
BH1750_RecvACK();
}
uchar BH1750_RecvByte()
{
uchar i;
uchar dat = 0;
uchar bit;
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; /*这里一定要设成输入上拉,否则不能读出数据*/
GPIO_InitStruct.GPIO_Pin = sda;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOB, &GPIO_InitStruct );
GPIO_SetBits( GPIOB, sda); //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
GPIO_SetBits( GPIOB, scl); //拉高时钟线
Delay_5us(); //延时
if( SET == GPIO_ReadInputDataBit( GPIOB, sda ) )
bit = 0X01;
else
bit = 0x00;
dat |= bit; //读数据
GPIO_ResetBits( GPIOB, scl); //拉低时钟线
Delay_5us(); //延时
}
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init( GPIOB, &GPIO_InitStruct );
return dat;
}
void Single_Write_BH1750(uchar REG_Address)
{
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
BH1750_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页
// BH1750_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
BH1750_Stop(); //发送停止信号
}
//初始化BH1750,根据需要请参考pdf进行修改****
void Init_BH1750()
{
Single_Write_BH1750(0x01);
}
//连续读出BH1750内部数据
void mread(void)
{
uchar i;
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
for (i=0; i<3; i++) //连续读取6个地址数据,存储中BUF
{
BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
if (i == 3)
{
BH1750_SendACK(1); //最后一个数据需要回NOACK
}
else
{
BH1750_SendACK(0); //回应ACK
}
}
BH1750_Stop(); //停止信号
Delay_mms(5);
}
unsigned char ge,shi,bai,qian,wan; //显示变量
unsigned int temp_data=0;
//读取光度值数据
unsigned int Read_BH1750(void)
{
float temp;
Single_Write_BH1750(0x01); // power on
Single_Write_BH1750(0x10); // H- resol ution mode
mread(); //连续读出数据,存储在BUF中
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1]; //合成数据
temp=(float)dis_data/1.2;
temp_data = fabs(temp);
if(temp_data>1000)
{
temp_data = 999;
}
printf( "\r\n gVarInfo.illu=%d lx\r\n", temp_data );
}
同样先看原理图接口:
LED使用的是PC10引脚
LED的驱动函数比较简单
void new_led_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_10);
}
产品物模型设置:
设备在线:
设备数据调试:
实验结果已发布到B站。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。