STM32F0使用LL庫實現SHT70通訊

2022-06-20 16:27:13 字數 4754 閱讀 8091

在本次專案中,限於空間要求我們選用了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為起始位址 ...