日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bme280 环境传感器开发板_STM32Cube14 | 使用硬件I2C读写环境光强度传感器

發(fā)布時間:2025/3/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bme280 环境传感器开发板_STM32Cube14 | 使用硬件I2C读写环境光强度传感器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
更多精彩~點(diǎn)擊上面藍(lán)字關(guān)注我們呀!??

尋求更好的閱讀體驗(yàn),請點(diǎn)擊閱讀原文移步:Mculover666的個人博客。

本篇詳細(xì)的記錄了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外設(shè)讀取環(huán)境光強(qiáng)度傳感器數(shù)據(jù)(BH1750)。

1. 準(zhǔn)備工作

硬件準(zhǔn)備

  • 開發(fā)板
    首先需要準(zhǔn)備一個開發(fā)板,這里我準(zhǔn)備的是STM32L4的開發(fā)板(BearPi):

  • BH1750模塊
    BH1750FV1是兩線式串行總線接口(IIC)的16位數(shù)字輸出型環(huán)境光強(qiáng)度傳感器,利用它的高分辨率可以探測較大范圍內(nèi)的光照強(qiáng)度變化(1lx - 65535lx)。

BH1750的原理圖如下:

軟件準(zhǔn)備

  • 需要安裝好Keil - MDK及芯片對應(yīng)的包,以便編譯和下載生成的代碼;

Keil MDK和串口助手Serial Port Utility 的安裝包都可以在文末關(guān)注公眾號獲取,回復(fù)關(guān)鍵字獲取相應(yīng)的安裝包:

2.生成MDK工程

選擇芯片型號

打開STM32CubeMX,打開MCU選擇器:

搜索并選中芯片STM32L431RCT6:

配置時鐘源

  • 如果選擇使用外部高速時鐘(HSE),則需要在System Core中配置RCC;

  • 如果使用默認(rèn)內(nèi)部時鐘(HSI),這一步可以略過;

這里我都使用外部時鐘:

配置串口

小熊派開發(fā)板板載ST-Link并且虛擬了一個串口,原理圖如下:

這里我將開關(guān)撥到AT-MCU模式,使PC的串口與USART1之間連接。

接下來開始配置USART1:

配置硬件I2C

首先查看小熊派開發(fā)板的原理圖,確定EEPROM接在哪個I2C接口上,如圖:

接下來開始配置I2C接口1:

配置時鐘樹

STM32L4的最高主頻到80M,所以配置PLL,最后使HCLK = 80Mhz即可:

生成工程設(shè)置

代碼生成設(shè)置

最后設(shè)置生成獨(dú)立的初始化文件:

生成代碼

點(diǎn)擊GENERATE CODE即可生成MDK-V5工程:

3. 在MDK中編寫、編譯、下載用戶代碼

修改I2C初始化代碼的小BUG

重定向printf( )函數(shù)

參考:【STM32Cube_09】重定向printf函數(shù)到串口輸出的多種方法。

4. 編寫B(tài)H1750驅(qū)動程序

參考『bh1750FVI Datasheet』進(jìn)行編程。

宏定義BH1750器件地址

BH1750的器件地址由ADDR端口的高低電平?jīng)Q定:

結(jié)合原理圖,在 bh1750_i2c_drv.h 頭文件中可以定義如下:

#define????BH1750_ADDR_WRITE???0x46????//01000110
#define????BH1750_ADDR_READ????0x47????//01000111

枚舉BH1750工作模式

參考數(shù)據(jù)手冊在 bh1750_i2c_drv.h 頭文件中進(jìn)行如下枚舉定義:

typedef?enum
{
????POWER_OFF_CMD???=???0x00,???//斷電:無激活狀態(tài)
????POWER_ON_CMD????=???0x01,???//通電:等待測量指令
????RESET_REGISTER??=???0x07,???//重置數(shù)字寄存器(在斷電狀態(tài)下不起作用)
????CONT_H_MODE?????=???0x10,???//連續(xù)H分辨率模式:在11x分辨率下開始測量,測量時間120ms
????CONT_H_MODE2????=???0x11,???//連續(xù)H分辨率模式2:在0.51x分辨率下開始測量,測量時間120ms
????CONT_L_MODE?????=???0x13,???//連續(xù)L分辨率模式:在411分辨率下開始測量,測量時間16ms
????ONCE_H_MODE?????=???0x20,???//一次高分辨率模式:在11x分辨率下開始測量,測量時間120ms,測量后自動設(shè)置為斷電模式
????ONCE_H_MODE2????=???0x21,???//一次高分辨率模式2:在0.51x分辨率下開始測量,測量時間120ms,測量后自動設(shè)置為斷電模式
????ONCE_L_MODE?????=???0x23????//一次低分辨率模式:在411x分辨率下開始測量,測量時間16ms,測量后自動設(shè)置為斷電模式
}?BH1750_MODE;

發(fā)送命令和讀取數(shù)據(jù)

接下來編寫bh1750_i2c_drv.c驅(qū)動文件,參考數(shù)據(jù)手冊中的這部分:

本驅(qū)動程序底層使用 HAL 庫的 IIC 初始化文件,所以包含如下頭文件:

#include?"bh1750_i2c_drv.h"
#include?"i2c.h"

根據(jù)上圖,發(fā)送命令的函數(shù)如下:

/**
?*?@brief????向BH1750發(fā)送一條指令
?*?@param????cmd?——?BH1750工作模式指令(在BH1750_MODE中枚舉定義)
?*?@retval????成功返回HAL_OK
*/
uint8_t????BH1750_Send_Cmd(BH1750_MODE?cmd)
{
????return?HAL_I2C_Master_Transmit(&hi2c1,?BH1750_ADDR_WRITE,?(uint8_t*)&cmd,?1,?0xFFFF);
}

接收光照強(qiáng)度數(shù)據(jù)的函數(shù)如下:

/**
?*?@brief????從BH1750接收一次光強(qiáng)數(shù)據(jù)
?*?@param????dat?——?存儲光照強(qiáng)度的地址(兩個字節(jié)數(shù)組)
?*?@retval????成功?——?返回HAL_OK
*/
uint8_t?BH1750_Read_Dat(uint8_t*?dat)
{
????return?HAL_I2C_Master_Receive(&hi2c1,?BH1750_ADDR_READ,?dat,?2,?0xFFFF);
}

數(shù)據(jù)轉(zhuǎn)換函數(shù)

根據(jù)數(shù)據(jù)手冊中給出的公式,編寫將從BH1750讀出的兩個字節(jié)數(shù)據(jù)轉(zhuǎn)換為對應(yīng)強(qiáng)度值的函數(shù):

/**
?*?@brief????將BH1750的兩個字節(jié)數(shù)據(jù)轉(zhuǎn)換為光照強(qiáng)度值(0-65535)
?*?@param????dat??——?存儲光照強(qiáng)度的地址(兩個字節(jié)數(shù)組)
?*?@retval????成功?——?返回光照強(qiáng)度值
*/
uint16_t?BH1750_Dat_To_Lux(uint8_t*?dat)
{
????uint16_t?lux?=?0;
????lux?=?dat[0];
????lux?<<=?8;
????lux?+=?dat[1];
????lux?=?(int)(lux?/?1.2);

????return?lux;
}

5. 測試驅(qū)動程序

在main.c中測試驅(qū)動程序是否正常:

int?main(void){
????uint8_t?dat[2]?=?{0};????????//dat[0]是高字節(jié),dat[1]是低字節(jié)

????HAL_Init();
????SystemClock_Config();
????MX_GPIO_Init();
????MX_I2C1_Init();
????MX_USART1_UART_Init();

????while?(1)
????{
????????if(HAL_OK?==?BH1750_Send_Cmd(ONCE_H_MODE))
????????{
????????????//printf("send?ok\n");
????????}
????????else
????????{
????????????//printf("send?fail\n");
????????}

????????HAL_Delay(200);
????????if(HAL_OK?==?BH1750_Read_Dat(dat))
????????{
????????????//printf("recv?ok\n");
????????????printf("current:?%5d?lux\n",?BH1750_Dat_To_Lux(dat));

????????}
????????else
????????{
????????????//printf("recv?fail");
????????}

????????HAL_Delay(1000);
????}
}

編譯下載運(yùn)行,測試結(jié)果如下:

至此,我們已經(jīng)學(xué)會如何使用硬件IIC接口讀取環(huán)境光強(qiáng)度傳感器數(shù)據(jù)(BH1750),下一節(jié)將講述如何使用硬件IIC接口讀取溫濕度傳感器數(shù)據(jù)并使用軟件CRC校驗(yàn)(SHT30)。

更多精彩文章及資源,請關(guān)注我的微信公眾號:『mculover666』。

歷史好文集合(點(diǎn)擊標(biāo)題可跳轉(zhuǎn)):

四軸學(xué)習(xí)課程連接、資料分享、交流群匯總

PCB設(shè)計就別再用AD了,有更好的選擇!

[飛控]從零開始建模(一)-牛頓歐拉方程

開源STM32F1小四軸完整資料發(fā)布一(源代碼、原理圖、3D庫、PCB)

如何制作炫酷的PCB板3D效果圖

基于面向?qū)ο笏季S的STM32開發(fā)基本思路--以GPIO口的操作為例

靈動微MM32F103C8T6使用初體驗(yàn)

原來飛機(jī)還可以這樣玩——手拋飛機(jī)改無刷背推

宇宙最強(qiáng)編輯器VS Code(十)(完結(jié))

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的bme280 环境传感器开发板_STM32Cube14 | 使用硬件I2C读写环境光强度传感器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。