在本次專案中,限於空間要求我們選用了stm32f030f4作為控制晶元。這款
mcu不但封裝緊湊,而且自帶的
flash
空間也非常有限,所以我們選擇了
ll庫實現。本篇我們將基於
ll庫採用模擬
i2c介面的方式實現溫濕度採集。
1、
sht70
簡述sht70是一款集溫濕度測量於一體的感測器,
現在對其作簡要介紹。其引腳定義如下:
sht7x溫濕度感測器使用的
2線通訊,類似於i2c匯流排,但並不相同,使用普通的
gpio
就可實現通訊。此次採用stm32f030f4來操作sht70,具體的連線方式如下:
sck 用於微處理器與
sht1x
之間的通訊同步。由於介面包含了完全靜態邏輯,因而不存在最小
sck
頻率。data 引腳為三態結構,用於讀取感測器資料
. 當向感測器傳送命令時
, data
在 sck
上公升沿有效且在
sck
高電平時必須保持穩定。
data
在 sck
下降沿之後改變。為避免訊號衝突,微處理器應驅動
data
在低電平。需要乙個外部的上拉電阻(例如:
10kω
)將訊號提拉至高電平。上拉電阻通常已包含在微處理器的
i/o
電路中。
2、軟體實現
我們了解了sht70的相關特點,基於它類
i2c的通訊方式,我們採用相關的
gpio
來模擬i2c
通訊。這裡所說的
i2c,並非常規意義上的
i2c,而是面向
sht70
的協議的
i2c。
2.1、埠配置
所謂的埠配置其實就是對應的gpio引腳的配置,其實就是將用於模擬
i2c通訊的引腳按需要配置為不同的
gpio
輸入輸出特性。具體**如下:
*溫濕度變送器
gpio
埠配置*/static void sht_gpio_configuration(void)
ll_gpio_inittypedef gpio_initstruct;
/* 使能
gpio
埠時鐘
*/ll_ahb1_grp1_enableclock(ll_ahb1_grp1_periph_gpioa);
ll_ahb1_grp1_enableclock(ll_ahb1_grp1_periph_gpiob);
ll_gpio_setoutputpin(i2c_scl_gpio_port, i2c_scl_pin);
ll_gpio_setoutputpin(i2c_sda_gpio_port, i2c_sda_pin);
/* 配置
sht15
通訊介面
gpio pa9
、pa10 */
gpio_initstruct.pin = i2c_scl_pin;
gpio_initstruct.mode = ll_gpio_mode_output;
gpio_initstruct.speed = ll_gpio_speed_freq_high;
gpio_initstruct.outputtype = ll_gpio_output_pushpull;
gpio_initstruct.pull = ll_gpio_pull_up;
ll_gpio_init(i2c_scl_gpio_port, &gpio_initstruct);
gpio_initstruct.pin = i2c_sda_pin;
gpio_initstruct.mode = ll_gpio_mode_output;
gpio_initstruct.speed = ll_gpio_speed_freq_high;
gpio_initstruct.outputtype = ll_gpio_output_pushpull;
gpio_initstruct.pull = ll_gpio_pull_up;
ll_gpio_init(i2c_sda_gpio_port, &gpio_initstruct);
2.2、
i2c操作函式
前面我們介紹了sht70採用的是類似
i2c的通訊介面,所以我們需要按照
sht70
的要求來寫這個類
i2c的操作函式。主要有
3個內容:
(1)
sck時鐘線的輸出操作
/*操作
sck引腳
,設定高低操作
*/static void operationsckpin(buspinvalue value)
if (value==set)
ll_gpio_setoutputpin(i2c_scl_gpio_port, i2c_scl_pin);
else if(value==reset)
ll_gpio_resetoutputpin(i2c_scl_gpio_port, i2c_scl_pin);
(2)
sda資料線的輸出操作
/*操作
data引腳,
設定高低操作
*/static void operationdatapin(buspinvalue value)
if (value==set)
ll_gpio_setoutputpin(i2c_sda_gpio_port, i2c_sda_pin);
else if(value==reset)
ll_gpio_resetoutputpin(i2c_sda_gpio_port, i2c_sda_pin);
(3)
sda資料線的方向操作
/*將data
線設定為輸入輸出方向模式
*/void setdatapinedirection(iodirection direction)
ll_gpio_inittypedef gpio_initstruct;
gpio_initstruct.pin = i2c_sda_pin;
if(direction)
gpio_initstruct.mode = ll_gpio_mode_output;
gpio_initstruct.speed = ll_gpio_speed_freq_high;
gpio_initstruct.outputtype = ll_gpio_output_pushpull;
gpio_initstruct.pull = ll_gpio_pull_up;
else
gpio_initstruct.mode = ll_gpio_mode_input;
gpio_initstruct.pull = ll_gpio_pull_up;
ll_gpio_init(i2c_sda_gpio_port, &gpio_initstruct);
2.3、通訊函式
現在說明一下感測器通訊的實現。首先看一看其操作命令。感測器的命令包含三個位址位(目前只支援000,這就是只能掛接在空閒的
iic匯流排上的原因)和五個命令位。
sht1x
會以下述方式表示已正確地接收到指令:在第8個
sck
時鐘的下降沿之後,將
data
下拉為低電平(
ack
位)。在第9個
sck
時鐘的下降沿之後,釋放
data
(恢復高電平)。命令集如下:
命令
**
預留0000x
溫度測量
00011
濕度測量
00101
讀狀態暫存器
寫狀態暫存器
預留0101x-1110x
軟復位,介面復位,
狀態暫存器復位即恢復為預設狀態
.在要傳送下乙個命令前,至少等待
11ms.
11110
而關於各種該命令操作的實現,sht70與
sht1x
是完全相同的,在我們前面的文章中曾詳述。而且這部分與
ll實際上是沒關係的,準確的說與任何庫都沒關係,所以不再重複,有興趣可以產看前面的文章。
3、總結
從上圖,我們可以看到溫濕度的資料與實際一致。
STM32F0系列串列埠DMA收發資料
這裡用的庫函式版本,晶元型號為stm32f030c8t6.在用到串列埠dma時,要按以下幾個步驟進行。1.確定使用的串口號,這裡,我用的是usart2,對應復用的引腳是pa2,pa3。再根據資料手冊查詢其對應dma通道。2.先進行串列埠初始化配置 void usart2 init 3.再配置dma初...
STM32F0 休眠模式下 ADC取樣失效
筆者最近在作某汽車上的智慧型方向盤按鍵專案,系統要求待機電流小於100ua,同時能檢測系統輸入電壓狀態,做到能自檢欠壓和過壓,並通過lin傳送給中控。故筆者在對輸入電壓加了乙個分壓電路來檢測,現在客戶測試發現過壓和欠壓的判斷閾值與要求不符合,筆者在實際測試過程中也確實發現了問題,但未燒錄過程式的板子...
STM32F0非對齊訪問引起的硬體錯誤及其排除
前段時間在用stm32l0晶元時遇到乙個硬體錯誤,主要是記憶體的非對齊訪問導致的。注 cm3 核心支援非對齊訪問,而 cm0不支援非對齊訪問。先科普一下,什麼是非對齊訪問 如上圖所示,若要訪問的變數是int float u32型別的 佔4位元組 則這些變數在記憶體中,只能以圖中0 4 8為起始位址 ...