我要介紹的這種方法是基于rt-thread操作系統(tǒng)的,先介紹一下操作系統(tǒng),我們初學(xué)單片機(jī)一般都是不跑操作系統(tǒng)的(俗稱裸機(jī)),那些開發(fā)板的教程還有網(wǎng)上能找到的例程絕大部分也都是不跑操作系統(tǒng)的,初學(xué)者聽到操作系統(tǒng)可能會(huì)害怕,其實(shí)使用操作系統(tǒng)并沒有想象中那么難,在某些方面甚至比裸機(jī)更簡(jiǎn)單(比如我今天要講的這個(gè)bh1750的驅(qū)動(dòng)),好了,廢話不多說(shuō),馬上開整(步驟我分的比較細(xì),看起來(lái)好像很復(fù)雜,其實(shí)用過(guò)RT-thread的都知道,這個(gè)操作很簡(jiǎn)單)。
如果你不想使用操作系統(tǒng),要用裸機(jī)的話,可以參考我發(fā)布的博文:BH1750光照傳感器超詳細(xì)攻略 (從原理到代碼講解,看完你就懂了)
一、搭載RT-thread需要的環(huán)境
參考我的博文:RT-Thread零基礎(chǔ)快速入門第0講——環(huán)境安裝
我們這里需要用到的軟件主要有2個(gè):1:keil5(版本在5.24以上),2:env
當(dāng)然,如果你不確定是否要用rtt操作系統(tǒng)的話,也可以先不搭建環(huán)境,先跳到第二步下載我已經(jīng)做好的工程,先運(yùn)行一下看下效果(我用的是stm32f103)。
二、獲取RT-thread官方源碼,并新建一個(gè)工程
參考我的博文:RT-Thread零基礎(chǔ)快速入門第1講——新建工程
根據(jù)你的單片機(jī)型號(hào),選擇合適的bsp,生成一個(gè)新的工程。
我這里用的是stm32f103,整個(gè)工程都已經(jīng)做好了,需要的話可以在下面的鏈接下載。
源碼下載鏈接1:https://pan.baidu.com/s/1HnedCg3sC4HU8iEOf4dYOw ,提取碼:xs8o
源碼下載鏈接2:https://pan.baidu.com/s/1QOC01P5M99LzP4i1Voro6g,提取碼:abcd
三、下載bh1750軟件包
參考我的博文:RT-Thread零基礎(chǔ)快速入門第8講——軟件包的使用
注意:RT-thread的bh1750軟件包有幾個(gè)版本,v1.0.0是單獨(dú)的驅(qū)動(dòng)(只有IIC通信部分的驅(qū)動(dòng),和裸機(jī)的程序類似),v2.0.0和latest版本除了IIC通信部分的驅(qū)動(dòng)還加入了sensor的框架(這是rtt自己做的一個(gè)中間層框架,它的意義在于把很多不同種類的傳感器合并到同一個(gè)框架里面,這樣應(yīng)用層就不需要針對(duì)不同的傳感器編寫不同的模塊代碼),總的來(lái)說(shuō)就是,選擇的版本不同,應(yīng)用層的代碼會(huì)有所區(qū)別(我這里用的是v1.0.0版本)。
env配置如下:
下載完之后在工程目錄下可以找到一個(gè)bh1750-v1.0.0文件夾,里面有兩個(gè)文件,bh1750.c和bh1750.h,這個(gè)就是我們需要的驅(qū)動(dòng)代碼。
四、配置IIC引腳
在工程根目錄下打開env,輸入menuconfig進(jìn)入配置菜單,選擇路徑Hardware Drivers Config -> on-chip Peripheral Drivers -> Enable I2C1 BUS,配置IIC1的引腳號(hào)(不需要特定的IIC引腳,隨便兩個(gè)普通IO即可)
注意:1、不同芯片的工程(不同的bsp),配置菜單上面的選項(xiàng)在描述上可能有所不同。2、不一定要選擇IIC1,也可以選IIC2或者IIC3,后面編寫應(yīng)用層代碼時(shí),IIC使用的通道號(hào)和現(xiàn)在選的一致即可。
五、編寫應(yīng)用層程序
RTT的工程里面都有一個(gè)maic.c文件,默認(rèn)寫的都是一個(gè)呼吸燈,我在這里添加一個(gè)線程專門用于bh1750的數(shù)據(jù)采集和打印,當(dāng)然,也可以不用線程直接在main函數(shù)里面調(diào)用bh1750相關(guān)的函數(shù)。
不知道什么是線程概念的話可以看下我的博文:RT-Thread零基礎(chǔ)快速入門第6講——線程管理
/* main.c
* 功能:采集bh1750的數(shù)據(jù)并通過(guò)串口1打印,另外還有一個(gè)LED燈定時(shí)閃爍
*/
#include "rtthread.h"
#include "rtdevice.h"
#include "board.h"
#include "bh1750.h"
#include <string.h>
#include <stdio.h>
#include "math.h"
#include "stdio.h"
/* 宏定義 */
#define LED0_PIN GET_PIN(E, 5) // LED:PE5
#define BH1750_DEV "i2c1" // 這里和第五步配置的IIC通道要保持一致
float light; // 光照值,注意:這里定義的是浮點(diǎn)型,如果要通過(guò)串口打印或者顯示屏顯示,需要轉(zhuǎn)換一下數(shù)據(jù)
/* BH1750數(shù)據(jù)處理線程 */
int bh1750_handle_entry(void)
{
static bh1750_device_t dev = RT_NULL;
if (dev)
{
bh1750_deinit(dev);
}
dev = bh1750_init(BH1750_DEV);
while(1)
{
light = bh1750_read_light(dev); // 該函數(shù)就在第四步下載的bh1750.c文件里面
// 串口1打印光照值
rt_kprintf("read bh1750 sensor intensity: %d%d%d%d%d.%d lxn", (int)(light * 10)/100000%10, (int)(light * 10)/10000%10, (int)(light * 10)/1000%10,
(int)(light * 10)/100%10, (int)(light * 10)/10%10, (int)(light * 10)/1%10);
rt_thread_mdelay(500); // 采集周期500ms
}
}
/* 主函數(shù) */
int main(void)
{
// LED引腳初始化
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
// 創(chuàng)建一個(gè)線程(用來(lái)單獨(dú)做bh1750的數(shù)據(jù)采集和打?。?/span>
rt_thread_t bh1750_thread = rt_thread_create("bh1750_handle", bh1750_handle_entry, RT_NULL, 1024, 20, 20);
if(bh1750_thread)
{
rt_thread_startup(bh1750_thread); // 啟動(dòng)線程
}
while (1)
{
// LED燈定時(shí)閃爍
rt_pin_write(LED0_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED0_PIN, PIN_LOW);
rt_thread_mdelay(500);
}
}
六、總結(jié)
1、先搭載好rt-thread操作系統(tǒng)所需要的環(huán)境
2、了解rtt-thread的基本使用方法
3、編寫應(yīng)用層驅(qū)動(dòng)代碼(rtt的優(yōu)點(diǎn)在于很多底層驅(qū)動(dòng)都不需要自己寫,只要在應(yīng)用層調(diào)用相關(guān)的函數(shù)即可,所以使用操作系統(tǒng)有些時(shí)候比裸機(jī)更簡(jiǎn)單)
4、編譯運(yùn)行
本文用到的工程源碼可以在下面的鏈接下載:
源碼下載鏈接1:https://pan.baidu.com/s/1HnedCg3sC4HU8iEOf4dYOw ,提取碼:xs8o
源碼下載鏈接2:https://pan.baidu.com/s/1QOC01P5M99LzP4i1Voro6g,提取碼:abcd
不熟悉rt-thread操作系統(tǒng)的話可以參考我發(fā)布的博文:
RT-Thread零基礎(chǔ)快速入門第0講——環(huán)境安裝
RT-Thread零基礎(chǔ)快速入門第1講——新建工程
RT-Thread零基礎(chǔ)快速入門第2講——添加新文件到工程
RT-Thread零基礎(chǔ)快速入門第3講——點(diǎn)亮LED燈
RT-Thread零基礎(chǔ)快速入門第4講——按鍵輸入
RT-Thread零基礎(chǔ)快速入門第5講——外部中斷
RT-Thread零基礎(chǔ)快速入門第6講——線程管理
RT-Thread零基礎(chǔ)快速入門第7講——FinSH控制臺(tái)
RT-Thread零基礎(chǔ)快速入門第8講——軟件包的使用
RT-Thread零基礎(chǔ)快速入門第9講——串口(UART/RS485)
BH1750電路原理部分我這邊沒有介紹,可以看下我之前發(fā)布的博文:BH1750光照傳感器超詳細(xì)攻略 (從原理到代碼講解,看完你就懂了)