bme280 环境传感器开发板_STM32Cube14 | 使用硬件I2C读写环境光强度传感器
尋求更好的閱讀體驗(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 表情选择,php imagett
- 下一篇: Eclipse MySql之登录