干貨 | 了解庫開發,我們從STM32標準庫學起

李肖遙 2021-06-26 09:09
關注、星標公眾號,直達精彩內容

來源:華為云社區

作者:LongYorke


?

摘要:從STM32新建工程、編譯下載程序出發,讓新手由淺入深,盡享STM32標準庫開發的樂趣。

?

自從CubeMX等圖像配置軟件的出現,同學們往往點幾下鼠標就解決了單片機的配置問題。對于追求開發速度的業務場景下,使用快速配置軟件是合理的,高效的,但對于學生的學習場景下,更為重要的是知其然并知其所以然。

以下是學習(包括但不限于)嵌入式的三個重要內容,

1、學會如何參考官方的手冊和官方的代碼來獨立寫自己的程序。

2、積累常用代碼段,知道哪里的問題需要哪些代碼處理。

3、跟隨大佬步伐,一步一個腳印。

首先:我們都知道編程時一般查的是《參考手冊》,而進行芯片選型或需要芯片數據時,查閱的是《數據手冊》。此外市面上所有關于STM32的書籍都是立足于前二者(+Cortex內核手冊)進行編著。

其次:要分清什么是內核外設與內核之外的外設,為了便于區分,按照網上的一種說法,將“內核之外的外設”以“處理器外設”代替。再者:如今很少使用標準庫了,都是HAL庫,但作為高校目前教學方式,

我們將以STM32f10xxx為例對標準庫開發進行概覽。

一、STM32 系統結構

STM32f10xxx 系統結構

內核IP

從結構框圖上看,Cortex-M3 內部有若 干個總線接口,以使 CM3 能同時取址和訪內(訪問內存),它們是:指令存儲區總線(兩條)、系統總線、私有外設總線。有兩條代碼存儲區總線負責對代碼存儲區(即 FLASH 外設)的訪問,分別是 I-Code 總線和 D-Code 總線。

I-Code 用于取指,D-Code 用于查表等操作,它們按最佳執行速度進行優化。

系統總線(System)用于訪問內存和外設,覆蓋的區域包括 SRAM,片上外設,片外 RAM,片外擴展設備,以及系統級存儲區的部分空間。

私有外設總線負責一部分私有外設的訪問,主要就是訪問調試組件。它們也在系統級存儲區。

還有一個 DMA 總線,從字面上看,DMA 是 data memory access 的意思,是一種連接內核和外設的橋梁,它可以訪問外設、內存,傳輸不受 CPU 的控制,并且是雙向通信。簡而言之,這個家伙就是一個速度很快的且不受老大控制的數據搬運工。

處理器外設(內核之外的外設)

從結構框圖上看,STM32 的外設有 串口、定時器、IO 口、FSMC、SDIO、SPI、I2C 等,這些外設按 照速度的不同,分別掛載到 AHB、APB2、APB1 這三條總線上。

二、寄存器

什么是寄存器?寄存器是內置于各個 IP 外設中,是一種用于配置外設功能的存儲器,并且有想對應的地址。一切庫的封裝始于映射

是不是“又臭又長”,如果進行寄存器開發,就需要懟地址以及對寄存器進行字節賦值,不僅效率低而且容易出錯。

來,開個玩笑。

你也許聽說過“國際 C 語言亂碼大賽(IOCCC)”下面這個例子就是網上廣為流傳的 一個經典作品:

#include <stdio.h>
 
main(t,_,a)char *a;{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#\
;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \
){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \
}'+}##(!!/"
)
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m.vpbks,fxntdCeghiry"),a+1);}

庫的存在就是為了解決這類問題,將代碼語義化。語義化思想不僅僅是嵌入式有的,前端代碼也在追求語義特性。

三、萬物始于點燈

(1)內核庫文件分析

cor_cm3.h

這個頭文件實現了:

1、內核結構體寄存器定義。 

2、內核寄存器內存映射。 

3、內存寄存 器位定義。跟處理器相關的頭文件 stm32f10x.h 實現的功能一樣,一個是針對內核的寄存器,一個是針對內核之外,即處理器的寄存器。

misc.h

內核應用函數庫頭文件,對應 stm32f10x_xxx.h。

misc.c

內核應用函數庫文件,對應 stm32f10x_xxx.c。在 CM3 這個內核里面還有一些功能組 件,如 NVIC、SCB、ITM、MPU、CoreDebug,CM3 帶有非常豐富的功能組件,但是芯片廠商在設計 MCU 的時候有一些并不是非要不可的,是可裁剪的,比如 MPU、ITM 等在 STM32 里面就沒有。

其中 NVIC 在每一個 CM3 內核的單片機中都會有,但都會被裁剪,只能是 CM3 NVIC 的一個子集。在 NVIC 里面還有一個 SysTick,是一個系統定時器,可以提供時基,一般為操作系統定時器所用。misc.h 和 mics.c 這兩個文件提供了操作這些組件的函數,并可以在 CM3 內核單片機直接移植。

(2)處理器外設庫文件分析

startup_stm32f10x_hd.s

這個是由匯編編寫的啟動文件,是 STM32 上電啟動的第一個程序,啟動文件主要實現了

  • 初始化堆棧指針 SP;
  • 設置 PC 指針=Reset_Handler ;
  • 設置向量表的地址,并 初始化向量表,向量表里面放的是 STM32 所有中斷函數的入口地址
  • 調用庫函數 SystemInit,把系統時鐘配置成 72M,SystemInit 在庫文件 stytem_stm32f10x.c 中定義;
  • 跳轉到標號_main,最終去到 C 的世界。

system_stm32f10x.c

這個文件的作用是里面實現了各種常用的系統時鐘設置函數,有 72M,56M,48, 36,24,8M,我們使用的是是把系統時鐘設置成 72M。

Stm32f10x.h

這個頭文件非常重要,這個頭文件實現了:

1、處理器外設寄存器 的結構體定義。

2、處理器外設的內存映射。

3、處理器外設寄存器的位定義。

關于 1 和 2 我們在用寄存器點亮 LED 的時候有講解。

其中 3:處理器外設寄存器的位定義,這個非常重要,具體是什么意思?

我們知道一個寄存器有很多個位,每個位寫 1 或 者寫 0 的功能都是不一樣的,處理器外設寄存器的位定義就是把外設的每個寄存器的每一 個位寫 1 的 16 進制數定義成一個宏,宏名即用該位的名稱表示,如果我們操作寄存器要開啟某一個功能的話,就不用自己親自去算這個值是多少,可以直接到這個頭文件里面找。

我們以片上外設 ADC 為例,假設我們要啟動 ADC 開始轉換,根據手冊我們知道是要控制 ADC_CR2 寄存器的位 0:ADON,即往位 0 寫 1,即:

ADC->CR2=0x00000001;

這是 一般的操作方法?,F在這個頭文件里面有關于 ADON 位的位定義:

 #define ADC_CR2_ADON ((uint32_t)0x00000001)

有了這個位定義,我們剛剛的 代碼就變成了:

ADC->CR2=ADC_CR2_ADON

stm32f10x_xxx.h

外設 xxx 應用函數庫頭文件,這里面主要定義了實現外設某一功能 的結構體,比如通用定時器有很多功能,有定時功能,有輸出比較功能,有輸入捕捉功 能,而通用定時器有非常多的寄存器要實現某一個功能。

比如定時功能,我們根本不知道 具體要操作哪些寄存器,這個頭文件就為我們打包好了要實現某一個功能的寄存器,是以機構體的形式定義的,比如通用定時器要實現一個定時的功能,我們只需要初始化 TIM_TimeBaseInitTypeDef 這個結構體里面的成員即可,里面的成員就是定時所需要 操作的寄存器。

有了這個頭文件,我們就知道要實現某個功能需要操作哪些寄存器,然后 再回手冊中精度這些寄存器的說明即可。

stm32f10x_xxx.c

stm32f10x_xxx.c:外設 xxx 應用函數庫,這里面寫好了操作 xxx 外設的所有常用的函 數,我們使用庫編程的時候,使用的最多的就是這里的函數。

(3)SystemInit

工程中新建main.c 。

在此文件中編寫main函數后直接編譯會報錯:

?

Undefined symbol SystemInit (referred from startup_stm32f10x_hd.o).

?

錯誤提示說SystemInit 沒有定義。從分析啟動文件startup_stm32f10x_hd.s時我們知道,

;Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
;IMPORT SystemInit
;LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
?

匯編中;分號是注釋的意思

?

第五行第六行代碼Reset_Handler 調用了SystemInit該函數用來初始化系統時鐘,而該函數是在庫文件system_stm32f10x.c 中實現的。我們重新寫一個這樣的函數也可以,把功能完整實現一遍,但是為了簡單起見,我們在main 文件里面定義一個SystemInit 空函數,為的是騙過編譯器,把這個錯誤去掉。

關于配置系統時鐘之后會出文章RCC 時鐘樹詳細介紹,主要配置時鐘控制寄存器(RCC_CR)和時鐘配置寄存器(RCC_CFGR)這兩個寄存器,但最好是直接使用CubeMX直接生成,因為它的配置過程有些冗長。

如果我們用的是庫,那么有個庫函數SystemInit,會幫我們把系統時鐘設置成72M。

現在我們沒有使用庫,那現在時鐘是多少?答案是8M,當外部HSE 沒有開啟或者出現故障的時候,系統時鐘由內部低速時鐘LSI 提供,現在我們是沒有開啟HSE,所以系統默認的時鐘是LSI=8M。

(4)庫封裝層級

如圖,達到第四層級便是我們所熟知的固件庫或HAL庫的效果。當然庫的編寫還需要考慮許多問題,不止于這些內容。我們需要的是了解庫封裝的大概過程。

將庫封裝等級分為四級來介紹是為了有層次感,就像打怪升級一樣,進行認知理解的升級。

我們都知道,操作GPIO輸出分三大步:

時鐘控制:

STM32 外設很多,為了降低功耗,每個外設都對應著一個時鐘,在系統復位的時候這些時鐘都是被關閉的,如果想要外設工作,必須把相應的時鐘打開。

STM32 的所有外設的時鐘由一個專門的外設來管理,叫RCC(reset and clockcontrol),RCC 在STM32 參考手冊的第六章。

STM32 的外設因為速率的不同,分別掛載到三條總系上:AHB、APB2、APB1,AHB為高速總線,APB2 次之,APB1 再次之。所以的IO 口都掛載到APB2 總線上,屬于高速外設。

模式配置:

這個由端口配置寄存器來控制。端口配置寄存器分為高低兩個,每4bit 控制一個IO 口,所以端口配置低寄存器:CRL 控制這IO 口的低8 位,端口配置高寄存器:CRH控制這IO 口的高8bit。

在4 位一組的控制位中,CNFy[1:0] 用來控制端口的輸入輸出,MODEy[1:0]用來控制輸出模式的速率,又稱驅動電路的響應速度,注意此處速率與程序無關,具體內容見文章:【嵌入式】GPIO引腳速度、翻轉速度、輸出速度區別輸入有4種模式,輸出有4種模式,我們在控制LED 的時候選擇通用推挽輸出。

輸出速率有三種模式:2M、10M、50M,這里我們選擇2M。

電平控制:

STM32 的IO 口比較復雜,如果要輸出1 和0,則要通過控制:端口輸出數據寄存器ODR 來實現,ODR 是:Output data register 的簡寫,在STM32 里面,其寄存器的命名名稱都是英文的簡寫,很容易記住。

從手冊上我們知道ODR 是一個32 位的寄存器,低16位有效,高16 位保留。低16 位對應著IO0~IO16,只要往相應的位置寫入0 或者1 就可以輸出低或者高電平。

第一層級:基地址宏定義 

時鐘控制:

在STM32 中,每個外設都有一個起始地址,叫做外設基地址,外設的寄存器就以這個基地址為標準按照順序排列,且每個寄存器32位,(后面作為結構體里面的成員正好內存對齊)。

查表看到時鐘由APB2 外設時鐘使能寄存器(RCC_APB2ENR)來控制,其中PB 端口的時鐘由該寄存器的位3 寫1 使能。我們可以通過基地址+偏移量0x18,算出RCC_APB2ENR 的地址為:0x40021018。那么使能PB 口的時鐘代碼則如下所示:

 #define RCC_APB2ENR *(volatile unsigned long *)0x40021018

 // 開啟端口B 時鐘
 RCC_APB2ENR |= 1<<3;

模式配置:

同RCC_APB2ENR 一樣,GPIOB 的起始地址是:0X4001 0C00,我們也可以算出GPIO_CRL 的地址為:0x40010C00。那么設置PB0 為通用推挽輸出,輸出速率為2M 的代碼則如下所示:

同上,從手冊中我們看到ODR 寄存器的地址偏移是:0CH,可以算出GPIOB_ODR 寄存器的地址是:0X4001 0C00 + 0X0C = 0X4001 0C0C?,F在我們就可以定義GPIOB_ODR 這個寄存器了,代碼如下:

#define GPIOB_ODR *(volatile unsigned long *)0x40010C0C

//PB0 輸出低電平
GPIOB_ODR = 0<<0;

第一層級:基地址宏定義完成用STM32 控制一個LED 的完整代碼:

#define RCC_APB2ENR *(volatile unsigned long *)0x40021018
#define GPIOB_CRL *(volatile unsigned long *)0x40010C00
#define GPIOB_ODR *(volatile unsigned long *)0x40010C0C

int main(void)
{
 // 開啟端口B 的時鐘
 RCC_APB2ENR |= 1<<3;

 // 配置PB0 為通用推挽輸出模式,速率為2M
 GPIOB_CRL = (2<<0) | (0<<2);

 // PB0 輸出低電平,點亮LED
 GPIOB_ODR = 0<<0;
}

void SystemInit(void)
{
}

第二層級:基地址宏定義+結構體封裝

外設寄存器結構體封裝

上面我們在操作寄存器的時候,操作的是寄存器的絕對地址,如果每個寄存器都這樣操作,那將非常麻煩。我們考慮到外設寄存器的地址都是基于外設基地址的偏移地址,都是在外設基地址上逐個連續遞增的,每個寄存器占 32 個或者 16 個字節,這種方式跟結構體里面的成員類似。

所以我們可以定義一種外設結構體,結構體的地址等于外設的基地址,結構體的成員等于寄存器,成員的排列順序跟寄存器的順序一樣。這樣我們操作寄存器的時候就不用每次都找到絕對地址,只要知道外設的基地址就可以操作外設的全部寄存器,即操作結構體的成員即可。

下面我們先定義一個 GPIO 寄存器結構體,結構體里面的成員是 GPIO 的寄存器,成員的順序按照寄存器的偏移地址從低到高排列,成員類型跟寄存器類型一樣。(struct用法參考【C語言】(2):關鍵字的詳細介紹)

typedef struct 
{

 volatile uint32_t CRL;
 volatile uint32_t CRH;
 volatile uint32_t IDR;
 volatile uint32_t ODR;
 volatile uint32_t BSRR;
 volatile uint32_t BRR;
 volatile uint32_t LCKR;
} GPIO_TypeDef;

《STM32 中文參考手冊》8.2 寄存器描述章節,我們可以找到結構體里面的7 個寄存器描述。在點亮LED 的時候我們只用了CRL 和ODR 這兩個寄存器,至于其他寄存器的功能大家可以自行看手冊了解。

在GPIO 結構體里面我們用了兩個數據類型,一個是uint32_t,表示無符號的32 位整型,因為GPIO 的寄存器都是32 位的。這個類型聲明在標準頭文件stdint.h 里面使用typedef對unsigned int重命名,我們在程序上只要包含這個頭文件即可。

另外一個是volatile(volatile用法參考【C語言】(2):關鍵字的詳細介紹),作用就是告訴編譯器這里的變量會變化不因優化而省略此指令,必須每次都直接讀寫其值,這樣就能確保每次讀或者寫寄存器都真正執行到位。

外設封裝

STM32F1 系列的GPIO 端口分A~G,即GPIOA、GPIOB。。。。。。GPIOG。每個端口都含有GPIO_TypeDef 結構體里面的寄存器,我們可以根據手冊各個端口的基地址把GPIO 的各個端口定義成一個GPIO_TypeDef 類型指針,然后我們就可以根據端口名(實際上現在是結構體指針了)來操作各個端口的寄存器,代碼實現如下:

#define GPIOA ((GPIO_TypeDef *) 0X4001 0800)
#define GPIOB ((GPIO_TypeDef *) 0X4001 0C00)
#define GPIOC ((GPIO_TypeDef *) 0X4001 1000)
#define GPIOD ((GPIO_TypeDef *) 0X4001 1400)
#define GPIOE ((GPIO_TypeDef *) 0X4001 1800)
#define GPIOF ((GPIO_TypeDef *) 0X4001 1C00)
#define GPIOG ((GPIO_TypeDef *) 0X4001 2000)

外設內存映射

講到基地址的時候我們再引人一個知識點:Cortex-M3 存儲器系統,這個知識點在《Cortex-M3 權威指南》第5 章里面講到。CM3 的地址空間是4GB,如下圖所示:

我們這里要講的是片上外設,就是我們所說的寄存器的根據地,其大小總共有512MB,512MB 是其極限空間,并不是每個單片機都用得完,實際上各個MCU 廠商都只是用了一部分而已。STM32F1 系列用到了:0x4000 0000 ~0x5003 FFFF。現在我們說的STM32 的寄存器就是位于這個區域

APB1、APB2、AHB 總線基地址

現在我們說的STM32 的寄存器就是位于這個區域,這里面ST 設計了三條總線:AHB、APB2 和APB1,其中AHB 和APB2 是高速總線,APB1 是低速總線。不同的外設根據速度不同分別掛載到這三條總線上。

從下往上依次是:APB1、APB2、AHB,每個總線對應的地址分別是:APB1:0x40000000,APB2:0x4001 0000,AHB:0x4001 8000。

這三條總線的基地址我們是從《STM32 中文參考手冊》2.3 小節—存儲器映像得到的:APB1 的基地址是TIM2 定時器的起始地址,APB2 的基地址是AFIO 的起始地址,AHB 的基地址是SDIO 的起始地址。其中APB1 地址又叫做外設基地址,是所有外設的基地址,叫做PERIPH_BASE。

現在我們把這三條總線地址用宏定義出來,以后我們在定義其他外設基地址的時候,只需要在這三條總線的基址上加上偏移地址即可,代碼如下:

#define PERIPH_BASE ((uint32_t)0x40000000)
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)

GPIO 端口基地址

因為GPIO 掛載到APB2 總線上,那么現在我們就可以根據APB2 的基址算出各個GPIO 端口的基地址,用宏定義實現代碼如下:

#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)

第二層級:基地址宏定義+結構體封裝完成用STM32 控制一個LED 的完整代碼:

#include <stdint.h>
#define __IO volatile

typedef struct 
{

 __IO uint32_t CRL;
 __IO uint32_t CRH;
 __IO uint32_t IDR;
 __IO uint32_t ODR;
 __IO uint32_t BSRR;
 __IO uint32_t BRR;
 __IO uint32_t LCKR;
} GPIO_TypeDef;

typedef struct 
{

 __IO uint32_t CR;
 __IO uint32_t CFGR;
 __IO uint32_t CIR;
 __IO uint32_t APB2RSTR;
 __IO uint32_t APB1RSTR;
 __IO uint32_t AHBENR;
 __IO uint32_t APB2ENR;
 __IO uint32_t APB1ENR;
 __IO uint32_t BDCR;
 __IO uint32_t CSR;
} RCC_TypeDef;

#define PERIPH_BASE ((uint32_t)0x40000000)

#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)

#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)

#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
#define RCC ((RCC_TypeDef *) RCC_BASE)


#define RCC_APB2ENR *(volatile unsigned long *)0x40021018
#define GPIOB_CRL *(volatile unsigned long *)0x40010C00
#define GPIOB_ODR *(volatile unsigned long *)0x40010C0C

int main(void)
{
 // 開啟端口B 的時鐘
 RCC->APB2ENR |= 1<<3;

 // 配置PB0 為通用推挽輸出模式,速率為2M
 GPIOB->CRL = (2<<0) | (0<<2);

 // PB0 輸出低電平,點亮LED
 GPIOB->ODR = 0<<0;
}

void SystemInit(void)
{
}

第二層級變化:

①、定義一個外設(GPIO)寄存器結構體,結構體的成員包含該外設的所有寄存器,成員的排列順序跟寄存器偏移地址一樣,成員的數據類型跟寄存器的一樣。

②外設內存映射,即把地址跟外設建立起一一對應的關系。

③外設聲明,即把外設的名字定義成一個外設寄存器結構體類型的指針。

④通過結構體操作寄存器,實現點亮LED。

第三層級:基地址宏定義+結構體封裝+“位封裝”(每一位的對應字節封裝)

上面我們在控制GPIO 輸出內容的時候控制的是ODR(Output data register)寄存器,ODR 是一個16 位的寄存器,必須以字的形式控制其實我們還可以控制BSRR 和BRR 這兩個寄存器來控制IO 的電平,下面我們簡單介紹下BRR 寄存器的功能,BSRR 自行看手冊研究。

位清除寄存器BRR 只能實現位清0 操作,是一個32 位寄存器,低16 位有效,寫0 沒影響,寫1 清0。現在我們要使PB0 輸出低電平,點亮LED,則只要往BRR 的BR0 位寫1 即可,其他位為0,代碼如下:

GPIOB->BRR = 0X0001;

這時PB0 就輸出了低電平,LED 就被點亮了。

如果要PB2 輸出低電平,則是:

GPIOB->BRR = 0X0004;

如果要PB3/4/5/6。。。。。。這些IO 輸出低電平呢?

道理是一樣的,只要往BRR 的相應位置賦不同的值即可。因為BRR 是一個16 位的寄存器,位數比較多,賦值的時候容易出錯,而且從賦值的16 進制數字我們很難清楚的知道控制的是哪個IO。

這時,我們是否可以把BRR 的每個位置1 都用宏定義來實現,如GPIO_Pin_0 就表示0X0001,GPIO_Pin_2 就表示0X0004。只要我們定義一次,以后都可以使用,而且還見名知意。“位封裝”(每一位的對應字節封裝) 代碼如下:

#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */

這時PB0 就輸出了低電平的代碼就變成了:

GPIOB->BRR = GPIO_Pin_0;

(如果同時讓PB0/PB15輸出低電平,用或運算,代碼:

GPIOB->BRR = GPIO_Pin_0|GPIO_Pin_15;

為了不使main 函數看起來冗余,上述庫封裝 的代碼不應該放在main 里面,因為其是跟GPIO 相關的,我們可以把這些宏放在一個單獨的頭文件里面。

在工程目錄下新建stm32f10x_gpio.h,把封裝代碼放里面,然后把這個文件添加到工程里面。這時我們只需要在main.c 里面包含這個頭文件即可。

第四層級:基地址宏定義+結構體封裝+“位封裝”+函數封裝

我們點亮LED 的時候,控制的是PB0 這個IO,如果LED 接到的是其他IO,我們就需要把GPIOB 修改成其他的端口,其實這樣修改起來也很快很方便。

但是為了提高程序的可讀性和可移植性,我們是否可以編寫一個專門的函數用來復位GPIO 的某個位,這個函數有兩個形參,一個是GPIOX(X=A...G),另外一個是GPIO_Pin(0...15),函數的主體則是根據形參GPIOX 和GPIO_Pin 來控制BRR 寄存器,代碼如下:

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
 GPIOx->BRR = GPIO_Pin;
}

這時,PB0 輸出低電平,點亮LED 的代碼就變成了:

GPIO_ResetBits(GPIOB,GPIO_Pin_0);

同理, 我們可以控制BSRR 這個寄存器來實現關閉LED,代碼如下:

// GPIO 端口置位函數
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
 GPIOx->BSRR = GPIO_Pin;
}

這時,PB0 輸出高電平,關閉LED 的代碼就變成了:

GPIO_SetBits(GPIOB,GPIO_Pin_0);

同樣,因為這個函數是控制GPIO 的函數,我們可以新建一個專門的文件來放跟gpio有關的函數。

在工程目錄下新建stm32f10x_gpio.c,把GPIO 相關的函數放里面。這時我們是否發現剛剛新建了一個頭文件stm32f10x_gpio.h,這兩個文件存放的都是跟外設GPIO 相關的。

C 文件里面的函數會用到h 頭文件里面的定義,這兩個文件是相輔相成的,故我們在stm32f10x_gpio.c 文件中也包含stm32f10x_gpio.h 這個頭文件。別忘了把stm32f10x.h 這個頭文件也包含進去,因為有關寄存器的所有定義都在這個頭文件里面。

如果我們寫其他外設的函數,我們也應該跟GPIO 一樣,新建兩個文件專門來存函數,比如RCC 這個外設我們可以新建stm32f10x_rcc.c 和stm32f10x_rcc.h。其他外依葫蘆畫瓢即可。

(5)實例編寫

以上,是對庫封住過程的概述,下面我們正在地使用庫函數編寫LED程序

①管理庫的頭文件

當我們開始調用庫函數寫代碼的時候,有些庫我們不需要,在編譯的時候可以不編譯,可以通過一個總的頭文件stm32f10x_conf.h 來控制,該頭文件主要代碼如下:

//#include "stm32f10x_adc.h"
//#include "stm32f10x_bkp.h"
//#include "stm32f10x_can.h"
//#include "stm32f10x_cec.h"
//#include "stm32f10x_crc.h"
//#include "stm32f10x_dac.h"
//#include "stm32f10x_dbgmcu.h"
//#include "stm32f10x_dma.h"
//#include "stm32f10x_exti.h"
//#include "stm32f10x_flash.h"
//#include "stm32f10x_fsmc.h"
#include "stm32f10x_gpio.h"
//#include "stm32f10x_i2c.h"
//#include "stm32f10x_iwdg.h"
//#include "stm32f10x_pwr.h"
#include "stm32f10x_rcc.h"
//#include "stm32f10x_rtc.h"
//#include "stm32f10x_sdio.h"
//#include "stm32f10x_spi.h"
//#include "stm32f10x_tim.h"
//#include "stm32f10x_usart.h"
//#include "stm32f10x_wwdg.h"
//#include "misc.h"

這里面包含了全部外設的頭文件,點亮一個LED 我們只需要RCC 和GPIO 這兩個外設的庫函數即可,其中RCC 控制的是時鐘,GPIO 控制的具體的IO 口。所以其他外設庫函數的頭文件我們注釋掉,當我們需要的時候就把相應頭文件的注釋去掉即可。

stm32f10x_conf.h 這個頭文件在stm32f10x.h 這個頭文件的最后面被包含,在第8296行:

#ifdef USE_STDPERIPH_DRIVER
#include "stm32f10x_conf.h"
#endif

代碼的意思是,如果定義了USE_STDPERIPH_DRIVER 這個宏的話,就包含stm32f10x_conf.h 這個頭文件。

我們在新建工程的時候,在魔術棒選項卡C/C++中,我們定義了USE_STDPERIPH_DRIVER 這個宏,所以stm32f10x_conf.h 這個頭文件就被stm32f10x.h 包含了,我們在寫程序的時候只需要調用一個頭文件:stm32f10x.h 即可。(預處理指令詳細內容會在【C語言】的文章中提到)

②編寫LED 初始化函數

經過寄存器點亮LED 的操作,我們知道操作一個GPIO 輸出的編程要點大概如下:

1、開啟GPIO 的端口時鐘

2、選擇要具體控制的IO 口,即pin

3、選擇IO 口輸出的速率,即speed

4、選擇IO 口輸出的模式,即mode

5、輸出高/低電平

STM32 的時鐘功能非常豐富,配置靈活,為了降低功耗,每個外設的時鐘都可以獨自的關閉和開啟。STM32 中跟時鐘有關的功能都由RCC 這個外設控制,RCC 中有三個寄存器控制著所以外設時鐘的開啟和關閉:RCC_APHENR、RCC_APB2ENR 和RCC_APB1ENR,AHB、APB2 和APB1 代表著三條總線,所有的外設都是掛載到這三條總線上,GPIO 屬于高速的外設,掛載到APB2 總線上,所以其時鐘有RCC_APB2ENR 控制。

GPIO 時鐘控制

固件庫函數:RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE)函數的

原型為:

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph,
                              FunctionalState NewState)

{
 /* Check the parameters */
 assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
 assert_param(IS_FUNCTIONAL_STATE(NewState));
 if (NewState != DISABLE) 
 {
  RCC->APB2ENR |= RCC_APB2Periph;
 } 
 else 
 {
  RCC->APB2ENR &= ~RCC_APB2Periph;
 }
}

當程序編譯一次之后,把光標定位到函數/變量/宏定義處,按鍵盤的F12 或鼠標右鍵的Go to definition of,就可以找到原型。固件庫的底層操作的就是RCC 外設的APB2ENR這個寄存器,宏RCC_APB2Periph_GPIOB 的原型是:0x00000008,即(1<<3),還原成存器操作就是:RCC->APB2ENR |= 1<<<3。相比固件庫操作,寄存器操作的代碼可讀性就很差,只有才查閱寄存器配置才知道具體代碼的功能,而固件庫操作恰好相反,見名知意。

GPIO 端口配置

GPIO 的pin,速度,模式,都由GPIO 的端口配置寄存器來控制,其中IO0~IO7 由端口配置低寄存器CRL 控制,IO8~IO15 由端口配置高寄存器CRH 配置。固件庫把端口配置的pin,速度和模式封裝成一個結構體:

typedef struct 
{

 uint16_t GPIO_Pin;
 GPIOSpeed_TypeDef GPIO_Speed;
 GPIOMode_TypeDef GPIO_Mode;
} GPIO_InitTypeDef;

pin 可以是GPIO_Pin_0~GPIO_Pin_15 或者是GPIO_Pin_All,這些都是庫預先定義好的宏。speed 也被封裝成一個結構體:

typedef enum 
{
 GPIO_Speed_10MHz = 1,
 GPIO_Speed_2MHz,
 GPIO_Speed_50MHz
} GPIOSpeed_TypeDef;

速度可以是10M,2M 或者50M,這個由端口配置寄存器的MODE 位控制,速度是針對IO 口輸出的時候而言,在輸入的時候可以不用設置。mode 也被封裝成一個結構體:

typedef enum 
{
 GPIO_Mode_AIN = 0x0// 模擬輸入
 GPIO_Mode_IN_FLOATING = 0x04// 浮空輸入(復位后的狀態)
 GPIO_Mode_IPD = 0x28// 下拉輸入
 GPIO_Mode_IPU = 0x48// 上拉輸入
 GPIO_Mode_Out_OD = 0x14// 通用開漏輸出
 GPIO_Mode_Out_PP = 0x10// 通用推挽輸出
 GPIO_Mode_AF_OD = 0x1C// 復用開漏輸出
 GPIO_Mode_AF_PP = 0x18 // 復用推挽輸出
} GPIOMode_TypeDef;

IO 口的模式有8 種,輸入輸出各4 種,由端口配置寄存器的CNF 配置。平時用的最多的就是通用推挽輸出,可以輸出高低電平,驅動能力大,一般用于接數字器件。至于剩下的七種模式的用法和電路原理,我們在后面的GPIO 章節再詳細講解。

最終用固件庫實現就變成這樣:

// 定義一個GPIO_InitTypeDef 類型的結構體
GPIO_InitTypeDef GPIO_InitStructure;

// 選擇要控制的IO 口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

// 設置引腳為推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

// 設置引腳速率為50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

/*調用庫函數,初始化GPIOB0*/
GPIO_Init(GPIOB, &GPIO_InitStructure);

倘若同一端口下不同引腳有不同的模式配置,每次對每個引腳配置完成后都要調用GPIO初始化函數,代碼如下:

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;                      
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                  //上拉輸入
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;                     
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;               //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); 

GPIO 輸出控制

GPIO 輸出控制,可以通過端口數據輸出寄存器ODR、端口位設置/清除寄存器BSRR和端口位清除寄存器BRR 這三個來控制。端口輸出寄存器ODR 是一個32 位的寄存器,低16 位有效,對應著IO0~IO15,只能以字的形式操作,一般使用寄存器操作。

// PB0 輸出高電平,點亮LED
GPIOB->ODR = 1<<0;

端口位清除寄存器BRR 是一個32 位的寄存器,低十六位有效,對應著IO0~IO15,只能以字的形式操作,可以單獨對某一個位操作,寫1 清0。

// PB0 輸出低電平,點亮LED
GPIO_ResetBits(GPIOB, GPIO_Pin_0);

BSRR 是一個32 位的寄存器,低16 位用于置位,寫1 有效,高16 位用于復位,寫1有效,相當于BRR 寄存器。高16 位我們一般不用,而是操作BRR 這個寄存器,所以BSRR 這個寄存器一般用來置位操作。

// PB0 輸出高電平,熄滅LED
GPIO_SetBits(GPIOB, GPIO_Pin_0);

綜上:固件庫LED GPIO 初始化函數

void LED_GPIO_Config(void)
{
 // 定義一個GPIO_InitTypeDef 類型的結構體
 GPIO_InitTypeDef GPIO_InitStructure;

 // 開啟GPIOB 的時鐘
 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);

 // 選擇要控制的IO 口
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

 // 設置引腳為推挽輸出
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

 // 設置引腳速率為50MHz
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 /*調用庫函數,初始化GPIOB0*/
 GPIO_Init(GPIOB, &GPIO_InitStructure);

 // 關閉LED
 GPIO_SetBits(GPIOB, GPIO_Pin_0);
}

主函數

#include "stm32f10x.h"


void SOFT_Delay(__IO uint32_t nCount);
void LED_GPIO_Config(void);

int main(void)
{
 // 程序來到main 函數之前,啟動文件:statup_stm32f10x_hd.s 已經調用
 // SystemInit()函數把系統時鐘初始化成72MHZ
 // SystemInit()在system_stm32f10x.c 中定義
 // 如果用戶想修改系統時鐘,可自行編寫程序修改

 LED_GPIO_Config();

 while ( 1 ) 
 {
  // 點亮LED
  GPIO_ResetBits(GPIOB, GPIO_Pin_0);
  Time_Delay(0x0FFFFF);

  // 熄滅LED
  GPIO_SetBits(GPIOB, GPIO_Pin_0);
  Time_Delay(0x0FFFFF);
 }
}
// 簡陋的軟件延時函數
void Time_Delay(volatile uint32_t Count)
{
 for (; Count != 0; Count--);
}

注意void Time_Delay(volatile uint32_t Count)只是一個簡陋的軟件延時函數,如果小伙伴們有興趣可以看一看MultiTimer,它是一個軟件定時器擴展模塊,可無限擴展所需的定時器任務,取代傳統的標志位判斷方式, 更優雅更便捷地管理程序的時間觸發時序。

本文分享自華為云社區《【嵌入式】層層遞進,了解庫開發》,原文作者:LongYorke。

來源:https://huaweicloud.blog.csdn.net/article/

本文來源網絡版權歸原作者所有。如涉及作品版權問題,請聯系我進行刪除。

????????????????  END  ????????????????

推薦閱讀:


嵌入式編程專輯
Linux 學習專輯
C/C++編程專輯
Qt進階學習專輯

關注我的微信公眾號,回復“加群”按規則加入技術交流群。


點擊“閱讀原文”查看更多分享。

李肖遙 公眾號“技術讓夢想更偉大”,作者:李肖遙,專注嵌入式,只推薦適合你的博文,干貨,技術心得,與君共勉。
評論
  • 行業痛點凸顯,飛凌嵌入式FET3572-C重磅登場工業4.0與AIoT發展下,嵌入式核心板作為設備“工業大腦”,面臨性能與功耗的雙重考驗——既要支撐復雜算法和多路數據處理,又要兼顧便攜設備、工業終端的低功耗需求,傳統核心板“高性能必高功耗”的困境制約設備升級。為此,飛凌嵌入式推出基于RK3572處理器的FET3572-C核心板,以2×Cortex-A73+6×Cortex-A53八核架構為核心,實現“性能翻倍、功耗減半”的突破,為中高端嵌入式場景提供優質算力底座。八核異構架構,解鎖性能功耗最優解
    飛凌嵌入式 2026-07-31 09:47 173瀏覽
  • 智能寵物用品這幾年快速普及,自動清理幾乎成了智能貓砂盆的標配。貓咪用完離場,設備自動翻轉清理,養寵家庭省去了每天彎腰清理的麻煩。但自動清理的第一步,是先準確判斷貓到底在不在盆里。這個看似簡單的問題,在小空間里并不容易做好。近場檢測的痛點:距離太遠反而誤事貓砂盆內部空間有限。如果傳感器的檢測距離設得偏大,盆外路過的貓、人甚至物品都會被誤判為貓在盆內,結果該清理時不清理、不該清理時亂清理,體驗直接崩壞。這類產品的核心訴求其實就一句話:近距離、小范圍、精準識別,不能有半點誤判。常規感應方案常因檢測距離
    唯創知音語音芯片 2026-07-31 16:51 217瀏覽
  • 光芯片,正在從光模塊的“配角”逆襲為AI產業鏈的“命門”2026年3月,英偉達一紙公告震動整個光通信行業——分別向Lumentum和Coherent各投資20億美元,合計40億美元。這哪是什么財務投資,這是一次對AI基礎設施關鍵環節的“掐尖式”卡位。光芯片,這個曾經被市場當作光模塊BOM表里一個標準配套元器件的東西,正在成為AI產業鏈上“卡位”最強、話語權最硬的環節。一、為什么是光芯片?老黃早就把話挑明了英偉達CEO黃仁勛的原話是:數據傳輸速度已成為人工智能發展的新瓶頸。AI集群從萬卡級往十萬卡
    用戶1774416745629 2026-07-31 11:22 271瀏覽
  • 在EMC測試過程中,傳導發射(Conducted Emission,CE)超標是工程師最常遇到的問題之一。更令人頭疼的是,同樣的超標曲線背后,可能對應著完全不同的干擾機理:有的是差模噪聲沿電源回路傳播,有的是共模電流通過寄生路徑耦合,還有些問題甚至并非來自電源本身,而是負載、電纜布局或接地結構引起的連鎖反應。 · 150kHz~1MHz 超標:多為差模噪聲為主,干擾沿火線-零線回路傳輸。 · 1MHz~30MHz 超標:通常共模噪聲占主導,干擾通過火線/零線對地回路傳播。 如果條件允許,用電流探
    譽磁電磁兼容EMC 2026-07-31 18:45 280瀏覽
  • 在芯片總成本中占比不到 1%,卻可能因一處品質偏差導致整片晶圓報廢——半導體切割/研磨膠帶,正隨著先進封裝的爆發,成為封測產線選型中最謹慎對待的耗材之一。但鮮有人注意到,決定這層膠帶性能上限的,是上游一層更薄的基膜。這個長期由日本企業主導的隱形環節,正在出現國產突圍的信號。一、需求之變:先進封裝與“韜定律”重塑膠帶市場AI 算力芯片、HBM 高帶寬存儲、Chiplet 芯粒等先進封裝產品持續放量,國內封測產線擴產節奏不減。作為晶圓減薄與切割工序的必需耗材,晶圓膠帶的需求同步擴容。據 QYRese
    芯膜前沿 2026-07-31 16:35 264瀏覽
  • ?摘要:低價大流量卡正全面退市,政策收緊已成定局。面對傳統號卡的不確定性,隨身WiFi憑借穩定連接、多設備共享、獨立設備和靈活套餐等優勢,成為務實可靠的備選方案。1、流量卡黃金時代要結束了通信行業正迎來一場前所未有的“地震式”調整——曾讓無數用戶追捧的低價大流量卡,正在全速退出各大平臺。這早已不是一次普通的競合,而是一場趨勢性的行業洗牌?;赝^去,19元200G的神卡,那時真是“睡著都能笑醒”,便宜到不敢相信,爽到忍不住炫耀。那些日子,好像隨便刷、隨便看,流量自由觸手可及??扇缃?,回頭再看,那種
    愛上電路設計 2026-08-03 10:21 75464瀏覽
  • 摘要防爆自控系統同時布設本安信號、工業總線、動力供電三類線路,僅依靠標識標牌管控插接極易出現人為錯插問題,高壓動力回路竄入本安弱電回路會突破安全柵限能標準,產生點火風險。依托 A、D、K 標準化機械防呆編碼體系,搭配護套顏色區分管理,適配 3 針 3 孔免焊接冷壓增安型防爆航插、5PIN 總線防爆航空插頭、8 芯焊接防爆法蘭插座的選型使用,從物理結構層面杜絕防爆接近開關連接器、防爆傳感器航插接頭混用插接問題,補齊防爆系統被動安全防護體系。關鍵詞圓形防爆連接器,防呆編碼防爆航插,防爆航空插頭,防爆
    用戶1783664076620 2026-07-31 18:29 260瀏覽
  • 摘要在防爆電氣設計中,只參照芯數選型而忽略額定載流量,長期滿負荷運行會出現插頭發熱、接觸面氧化、IP67 密封受熱老化等問題。結合常用 3 針 3 孔、4 芯、5PIN、8PIN 圓形防爆連接器,制作分級電流參數對照表,區分冷壓免焊接、焊接兩種接線結構的安全載流數值,設置合理電流冗余系數,搭配使用環境修正參數,規范防爆接近開關連接器、防爆法蘭插座的選型計算方式。關鍵詞圓形防爆連接器,載流參數表,防爆法蘭插座,防爆端子接頭,IP67 防爆防水接插件1 產品概述圓形防爆連接器觸點載流能力由插針直徑、
    用戶1783664076620 2026-08-03 09:18 75316瀏覽
  •     長期專注WiFi領域,也算是行業老兵了!同行閑聊中,時不時能提起我和我們!從疫情起,國產替代風生水起,起起落落,大浪淘沙,生存下來的都是強者!    WiFi模塊應用廣泛,對于高端市場和特定市場,要求WIFI模塊需要過CE/FCC之類的認證,也就是說沒有認證的模塊,不具備導入產品設計.接下來就和大家聊聊認證模塊選型參考!    WIFi模塊硬件方面主要考慮以下九點特性:    1
    納拓科技 2026-07-31 17:56 130瀏覽
  • Synopsys 這次沒有再給行業看一條只能站在展臺邊圍觀的 demo。7 月 27 日,Synopsys 在 DAC 2026 期間公布兩條 autonomous EDA workflow:一條處理 debug closure,另一條處理 implementation and closure??蛻艨梢酝ㄟ^ Synopsys 申請在 Microsoft Discovery 上評估,AMD 正在評估這些工作流能否用于下一代產品開發。公告里最扎眼的是 25%–40%。Synopsys 稱
    麒芯說AI 2026-07-31 14:21 160瀏覽
  • 今年好幾個客戶都問過我同一件事。藍牙音頻產品到底用 WT2605 這種單芯片,還是老老實實 MCU 外掛藍牙模組。兩種方案我都落地過,說點實在的,WT2605 剛出來那陣我也犯嘀咕,怕是營銷噱頭,真拿來做完一版樣機才服氣。一、選型先看三個維度外圍數量。這是最直觀的。傳統做法是 MCU 加藍牙模組,再加音頻編解碼、功放、晶振和一堆阻容,板子上密密麻麻十幾二十顆料。WT2605 把藍牙、解碼、功放全收進一顆,外圍就剩少量被動件。開發周期。傳統方案得自己接藍牙協議棧,配網、A2DP 解碼、音頻通路一一
    唯創知音語音芯片 2026-07-31 16:35 308瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 控制美女老板遥控器在线看| 电视剧好先生全集 | 神探狄仁杰第四部| 三年中文免费播放观看 | 高清《黑皮书》电影| 免费观看三年大片完整版电影 | 花宫亚美| xl司令的动漫全集免费观看| 美容室的特殊待遇是4| 红场阅兵2015直播| 麦乐迪与父亲家庭矛盾在线观看| 艳母在线| 高清我要成为超级巨星未删减| 双女任务在线播放| 超能陆战队免费观看| 《志愿军:雄兵出击》免费观看| 免费观看三年大片完整版电影 | 特殊游泳课在线观看| 丛林肉搏4.5团该干嘛| 少女第一夜| 小千的开发日记| 有情饮水饱国语| 茶啊二中电影版在线观看| 村姑2国语免费观看| 浴室情欲HD三级| rio ed2k| 销售的销售的秘密6HD中字| 梦十vs西班牙| 火蓝刀锋第二部| 白峰美羽电影在线观看| 成吉思汗的电视剧| 做的视频| 坎贝奇《品味人生无憾》完整版免费 | 史上最强女人强奸男人的电影在线观看| 温碧霞《灯草和尚》| 私人航空免费观看| 农场主和他的三个女儿们| 奥巴马白宫记者晚宴| 3对一在线观看| 善良的子5hd| 荣誉守则成人版在线看| 后营露营第二季无增减| 宫村与崛| 难忘之夜泰剧免费观看完整版| 毒医肥尸电影在线完整版| 黑帮少爷爱上我免费观看第一集泰剧| 溢出动漫在线观看| 美丽的水蜜蜂第一季免费观看| 银魂265| 《女律师替夫还债》剧情介绍曹查理| 电视剧使命在线观看| 忍风战队破里剑者| 人民的名义18集| 《何百芮的地狱恋曲》| 插曲的痛免费高清完整版| 毒爱国语版| 《淫的方程式》动漫| 新版金瓶梅在线观看| 高清为你遗憾| 需要爸爸种子免费观看电视剧意大利玛丽玛丽 | 《肉蔻之香》法国手机在线观看| 凶宅处理专员在线全集观看| 皖乡食妹| 不良义姐| 别打扰我读书电视剧结局免费观看| 美丽人妻出差按摩NBD| 蜜桃成熟快播| 电视剧归路免费观看全集高清版| 特殊保险销售员5| 一念之差| 高压监狱法版在线| 阿婴王祖贤电影完整版| 大乐透24142期开奖结果| 安妮日记| 浪客剑心追忆篇免费观看完整版| 邵氏《女儿国》满天星| 欲望的火花免费观看完整版| 刘可雯的电影片| 新金银悔1—5普| 《大侦探 第十一季》未删减| 捉鬼敢死队2016女版H版| 开心小和尚电视剧全集免费观看| 见好就收电视剧| 加勒比女海盗1免费在线观看| 法国电影《Cleves》| 年经母8| 蛇园短剧全集免费播放下载| 梦断乐缘堂| 高邮市| 和台湾这次打得起来吗| 姐妹医牙完整版| 凡尘称尊:仙帝弃少全集免费| 《峡谷》电影免费看| 火蓝刀锋30集| 国产三年免费在线| 千金小姐电影在线完整版免费观看| 惊弦电视剧免费完整版| 《荣誉守则》| 筐出未来| 极品女士第三季| 360大佬爱上我| 甜美姐姐动漫在线观看免费版 | 如果你也听说 周杰伦| 公之浮之手中有字9| 香烟爱上火柴广场舞| 《圣特罗佩姑娘们》免费观看| 红高粱全集免费| 《电影灭火女警2》| 镇魂 电视剧| 千言万语未删减版完整版在线观看| 爱唯侦察dvd免费观看| 鉴证实录| 全红婵蒙特利尔决赛回放| 低俗小说免费| 老家有喜| 女职员的特殊待遇电影| 囧妈电影完整版免费| 高清毒劫| 兄嫂动漫在线观看第一集免费| 风之舞 电视剧| 维修工的艳遇韩国电影在线看 | 鸭王2电影在线免费观看| 三夫四君 小说| (丰满的继牳3)理伦片在线观看| 刘德华演唱会2011| 睫毛膏4美国1983| 法国航空4免费播放| 新少年包拯电视剧免费观看| 维修工工人的艳遇| 灯草和尚电影下载| 电视剧斗罗大陆在线观看| 长空电影完整版免费观看| 法国版《古墓丽影》免费观看| 电影《魔女3》超清在线观看| 牙医姐妹在线观看 赤子板栗| 纪连海 灌篮高手| 黄色伦理片善良的同学欧美片 - 百度| 走火40集全免费观看| 与我同眠 完整版| 海天之恋全集| 猛鬼山坟 电影| xl司令第一季全集在线观看完整版免费| 捉鬼敢死队美国满天星| 女生按摩胸部电影免费观看 | 新女员工的味道| 假情真爱 阿华| 平邑县| 火口的两人全集免费观看| 夸克满天星在线播放国语版| 1982年邵氏版《武松》| 高清《别逼我结婚》| 第二个农场姑娘们| 四月一日灵异事件簿·继动漫| 裸体女医生的特殊服务| 默杀 电影| 我们在线观看免费BD视频| 瞒天过海:美人计| 两个人日本免费完整版图片| 酒店1-5集在线观看免费| 尚格云顿电影大全| 郝板栗《千金小姐》无删减全集 | 《百劫红颜》| 魅男gv| 变成黑辣皮之后第1集| 光辉岁月无吉他伴奏| 电影《粉红大白菜》完整版| 千里难寻 电视剧| 生活中马玛丽| 张军高凌| 这个大叔不太囧 电影| 尖东老泥妹| 凶猛的办公室日本动漫电影| 浪漫女家教在线免费观看| 春光灿烂周三强| 壮志凌云女版(H)| 新水浒传26集| 电视剧扫毒风暴| 美容院:特殊待遇| 玉浦团之| 睫毛膏5美国1983中文| 魔法灰姑娘电影| 武则天风流艳史| 《怪谈》免费观看| 爱的妇产科电视剧全集| 爱唯侦察dvd| 倔强驱魔师| 风雨哈佛路电影| 小峓子高潮理伦片| 天若有情3粤语| 你妈妈也一样在线观看| 妈咪快跑:爹地追来了短剧全集| 卧底48天全集在线看| 铿铿锵锵锵锵免费观看在线观看| 海扁王2百度影音| 唐朝好男人电视剧40| 林中小屋2百度影音| 行尸走肉第二季13集| 沙漠行动在线观看免费完整版| 高清《时光与你都很甜》大结局| 瓜达卢佩玫瑰在线播放| 爱情睡醒了21| 港片在线观看免费完整版影院| 重生之毒妃飒爆了全集免费| 乞丐王子央视版全集| 21世纪指南完整版| 《机智的医生生活》电视剧| 满天星版《黑鹰坠落》女主| 《丰满女朋友》在线观看| 游轮梦魇| 新妈妈在线免费观看| 因父去世休假被辞| 五河县| 老公说想放在里面睡觉| xl司令真人版第一季全集免费cb | 妖精视频在线观看免费播放电视剧| 星际宝贝神奇大冒险| 我喜欢你 电视剧| 《陆判换心》徐锦江在线观看| 诺亚方舟:创世之旅| over flower无码| 年轻的母亲韩国在线| 骗中传奇国语| 神舟七号电影| 腓尼基计划电影| 姨母的绣感中字4| 我是刑警第六集| 禁忌1980满天星帕克| 陷阱韩国版在线看| 按摩店的特殊待遇在线观看| 在异世界开迷宫无修| 爱我几何原版免费观看| 钓鱼台国宴| 销售的销售秘密2免费观看高清版| 少女免费观看高清电视剧| 捉鬼敢死队2016女版H版| 徐若瑄天使三部曲| 绿光森林电视剧| 含好不许吐h| 东北女不戴套在线看| 高清《圣墟》动漫| 我在他乡挺好的更新时间| 事物的秘密2浴室吃奶的更新时间| 快嘴李翠莲高清| 薛刚反唐全集| 韩国演艺圈悲惨1-33集| 双性受抽搐潮喷调教老师与学生| 月满云知电视剧免费观看| 西班牙情事| 21世纪前女指南无删减免费看 | 1—5集普通话版免费下载 | 杀人度假屋| 赖猫的狮子倒影33全集| 紧急行动电视剧| 夏日情人在线观看| 电影时间停止器在线观看完整版| 名侦探柯南普通话版免费观看| 免费观看爱我几何| 电视剧长沙保卫战全集在线观看 | 人前是爸爸背后是老公| 生死劫电视剧| 韩国情书第二季| 星乃せあら| 视觉监狱| 黄鼠狼迷人| 无限挑战110716| 扫黑行动 电影| 伙记办大事| 死亡游行| 天机富春山居图在线观看| 春心荡漾电视剧| 征程之星火| 佐藤江梨| 公之孚手中字9| 斗罗大陆89| 凌云志志(法国)满天星| 雪恋电影在线观看| 姐妹牙医完整版| 高清《最强大脑 第十三季》| 《图书馆的女朋友》动漫在线观看完整免费版电视剧 | 《肉蔻之香法版》| 轧戏电视剧在线观看免费高清全集| 义姐不良| 变态研讨会| 激战后厨第1-6集在线播放 | 《overflower》1-8集 www.appopen.com.cn| 猪猪侠泡泡糖| 《特殊的旅行》韩剧| 一路向北原唱| 女保险公司推销员8中文手机| 青海男子将亲生儿子以3万元卖掉| 五月天激情小说网| 成均馆绯闻10| 法影巜私人航空》| 少帅电视剧全集下载| 酒店刺激战场免费观看| 刘美君电影| 被义子侵犯的继拇在线观看| 特邀送货员完整版| 黑白配高清在线免费观看| 平凡的世界全集| 法国空姐2019满天星法版:星辉照耀| 短剧《萌孙出击》免费播放| 牙医赤板栗完整版在线观看| 校花的贴身高手无删减版电视剧 | 芳草地电影免费观看2023年上映| 黑夜传说4电影| 天娇电视剧| 全球投资者正重返中国| 安倍中枪瞬间曝光:捂胸口跪地倒下| 《有翡》观看免费完整版| 魔兽主页| 《大兵的寝室》电影完整版在线观看 | 天天向上20090109| www. ddd| 生活大爆炸第十季| 韩国伦理水电工 | 一个明星的诞生| 鹿邑县| 江苏卫视好好学习| 兵变1929| 97电视剧在线播放免费观看| 相泽南在线播放| 处恋时间| 归路在线观看免费完整版高清| 死神来了6国语完整版免费观看| 欢喜冤家 江苏卫视| 绝对权力电视剧全集完整版观看| 猎豹突击电视剧| 人肉叉烧包1黄秋生| 行政助理(2014)完整版观看| 上司的女人| 大内密探之零零| 爱我几何模拟卡完整版| 魔法留学生国语版全集| 男生女生一起相愁愁愁观看电视剧 | 高清《唯妆至上》| 米小圈电视剧| 美和花园电影在线观看最新集数 | 丈夫属下占用妻子电影| 我是歌手官方网站| 新来的瑜伽教练无删减版高清在线观 | 韩剧我的野蛮王妃| 儿媳份的味道| 强制兽爱| 金银梅普通话免费观看完整版| 海盗2:鬼怪的旗帜 电影在线观看| 爆操老妈46集在线| 同居的日子| 电影《姐妹牙医》在线播放| 爱恋在线观看| 女超人 满天星版麦乐迪马克斯在线观看 | 活着电视剧| 十堰重庆路车祸| 肚子抽脂多少钱| 换伴5免费观看完整版| 黄种人粤语| 食物链6大尺寸原声试听| 第二次人生电视剧免费播放| 妻子游泳教练HD中字| 《秘密》电影全集| 夸克满天星电影在线观看高清| 高清《她和她的她》电视剧| 天与地电影| 无心法师2| 聊斋志异之婴宁全集| 金银悔1一5集| 恨锁金瓶在线观看| 美国式保罗2高清免费看| 楚汉传奇80集免费观看完整版高清| 双人调情按摩术韩国在线观看| 贝兹旅馆| 破密电视剧40集免费观看全集| 反黑粤语在线观看| 公之浮手完整版免费看| 武则天秘史快播| 妽子丰满妽子HD| 欢乐家长群2电视剧观看| 高压监狱3未删减版在线观看| 18岁电影| 康体水疗完整版在线观看免费播放 | 看了又看蓝燕| 小凤新婚在线| 教堂姐姐在线观看| 女律师替夫还债| 边防风暴| 需要爸爸播撒种子电影播放| 电视剧江山| 圣特罗佩姑娘们满天星电影| 奇诺之旅第二季| 男按摩师做乳房按摩电影在线观看 | 俘虏之锁1~4集免费观看中文版| 最终幻想动漫| 监狱女狱警法国剧| 新笑傲江湖花絮| 锦绣安宁免费看电视剧| 陆贞传奇电视剧全集59| 停车坐爱枫林晚全诗| 荣誉守则翻拍版成人版| 阿虎视频免费观看| 《她被搬运工侵犯在线播放| 中原镖局之天地英豪| 杏堂夏| 旖旎婚色短剧大结局免费观看全集 | 爱我几何完整版| 乱世三义电视剧免费观看 | 满天星女军医| 女儿 电影| 3对1,初次体检2| 火箭军高层间谍是谁| 动感之星妖精168集免费播放在线观看 | 《部长出差的日子》韩国电影| 都市条形码直播| 酒店1-80集免费看全集| 交个朋友的直播间| 男按摩师做乳房按摩电影在线| 对讲机爆炸事件再次上演| 死亡地带第一季| 韩国美女vip内部1101| 超清国语黄色仓库网vlp| 三十而立剧情介绍| HD版泰山《激战丛林》完整版免费兵王影视| 残酷的温柔 彭佳慧 | 乌蒙小燕| G点1985无删减免费看| 姐妹免费观看国语| 我的幸福婚约| 公元前2000年| 罗马帝国艳情史迅雷下载| 梅德韦杰娃| 军事不当免费观看| 青青草在 线免费观看| 1dldss00361当我打电话叫应召女郎时,我发现了一个高傲的大胸秘书......在办公 | 午夜寂寞影院列表| 困惑的浪漫百度影音| 双人高潮按摩在线观看免费高清版| 大男当婚 下载| 电影17.3| 错点鸳鸯电视剧50集免费播放| 泾川县| 梅西c罗拿过大力神杯吗| 斗罗大陆2第二季免费观看| 告别单身| 父母姐弟未删减| 电影牙医姊妹完整版免费观看| 怪医文三块高清全集| 《束缚游戏》第一季免费观看真人版台漫 | 女状元文武:双全惊天下短剧全集| 神木丽| 最后的格格全集| 战狼6免费观看在线播放完整版下载| 完美搭档演员表| 东北往事黑道风云20百度影音| 高清隔壁的星光未删减| 凯迪拉克撞救护车| 《丛林激情》男女主| 从结婚到恋爱电视剧免费观看全集| 急诊护士免费观看| 安塔芮丝迅雷下载| 战狼6老姨免费观看电视剧| 国模私拍合集| 疯女人的舞会| 阿基米德大战| 昌黎二中| 四个少妇的按摩电影| 佐罗满天星版在线播放哪一年拍的 | 抽曲的痛免费观看完整版海外| 鹰眼黑寡妇| 漂亮的小姨韩剧免费观看| 你太过分了韩剧| 妻子的姐妹免费版电视剧大全| 电视剧绿萝花| 同流合乌电影| 欧美电影售楼女王在线观看| 她很漂亮韩国版| 斯巴达HR版| 海豚寄宿学园在线观看完整版| 乐都县| 胜女的代价2插曲| 电影《二十条》| 满天星电影在线播放 | 牛莉电视剧| 日韩剧,维修工艳遇| 电影《维和防暴队》| 韩国三级水电工| 大明风华在线观看免费下载播放| 五年级上册习作三| 高清《神奇女侠》免费观看| 星际迷航1电影| 女律师的陨落免费观看| 反黑先锋国语版全集在线观看| 建元风云 百度影音| 房奴试爱电视剧第一集开头原声| 超智能足球第二季| 南海飞行员牺牲| 九零弃少:创业成商业巨头全集免费 | 想成为主人公| 苏迪曼杯2023赛程| 我们都是坏孩子高清| 筐出未来| 斯巴达第4季全集免费| 贪婪:欲望之岛 电影| 特殊治疗室| 姜昕言吻戏| 使徒行者3在线看免费| 法国空姐第4部完整版在线播放 | 漂亮瘦子10| 丁小芹孙协志| 女老师5| 一块五花肉错位关系| 伦理《法国空乘13》观看| 鬼吹灯之怒晴湘西| 橄榄球的电影| 和部长日本出差电影免费| 黑暗天使萧淑慎| 铿铿铿锵锵锵免费观看电视剧| 黑白道粤语| 与我同眠 bt| 电影莫莉3| 回复术士的重启人生10| 荒野渔夫完整版| 阿修罗 剧场版| 龙门镖局| 男按摩师在线观看一级片中文字幕| 天师钟馗94版| 四个女忍者 满天星 雪姬| 纯情罗曼史动漫| 夺粮剿匪记在线观看| 上海一家人电视连续剧全集| 无人区高清在线观看免费| 爱我几何未删除| 千王之王2000国语| 前任攻略4| 非常突然在线观看| 极限挑战第2季 综艺| 阿娇张开双腿实干十三分钟| 销售的销售秘密3hd中字| 冲宫那美作品在线播放| 朝国年经继2| 麻花传剧原创MV在线看赘婿| 我的流氓爱人 电影| loveme枫和铃声樱花| 韩国金银瓶电影在线观看| 爱神电影| 特派外卖员| 欲望中的女人在线观看无删减| 逆天改命:锦绣嫡女短剧全集 | 荷尔蒙6美国| 咏春大师被ko| 《女销售的销售秘密2》| 《剿匪英雄》电视剧| 《家弑服务》| 伦理《女律师的堕落》| 南洋十大邪术未删减版本国语| 甜蜜蜜电视剧| 日本公妇里乱片A片在线播放保姆| 天若有情3粤语| 正在播放:美丽寡妇偿还债务,巨乳少女葵司献身还债 - 17 | 日韩做Aj的视频免费观看| 眷思量免费观看全集| 太平年全集免费看| 功夫熊猫英语版| 恋空电影下载| 同桌100网| HD版泰山《激战丛林》主演 | 新来的瑜伽教练免费| 黑雾 电视剧| 激战丛林2无删减版| 王力宏什么歌好听| 断金在线观看免费高清国语| 《新人类毒医肥尸》免费观看 | 武动乾坤动漫第二季| 乔家大院全集| 壮志凌云2011满天星| 烈火军校电视剧免费版| 乡村爱情 第三部| 十九岁完整版在线观看好看 | 白峰美羽伦理片| 爱的创口贴全集| 陆小凤传奇4| 白峰美羽高傲女教师| 婚姻攻略全集免费观看| 电影《生活中的玛丽》免费播放| 盗亦有道| 妻子成为临时模特的日本电影| 入室暴行魔电影免费观看高清 | 金枝玉叶分集剧情介绍| 嗨皮兔儿歌小兔子乖乖| 第十九层电视剧| 商务旅馆带绿帽子在线观看| 破烂男女在线观看电影全集免费| 《幸福来敲门》| 白峰美羽教师| 战昆仑电视剧| 高压监狱2019伦理法国| 意外国语| 爱情雨大结局| 日剧和部长一起去出差| 李丽珍爱的 精灵| 李金斗相声| 《四大美人之王昭君》免费看| 高清《暗夜情报员 第三季》电视剧| 部长| 男艺妓回忆录| 上海著名滑稽演员傅子明逝世| 年经母年| 年轻的家长3| 公交车扒开稚嫩挺进去J赵知梨| 僵尸道长1| 最佳福星完整版免费观看| 法国空姐2大结局| 致命弯道2在线观看| 伦理《法国护士长》观看| 电视剧冒牌英雄| 年轻的小婊3韩剧中文版| 法国空姐4法版| 《田耕纪》电视剧| 大唐诡事录2电视剧免费观看全集| 女人村庄演员表| 奇葩说第六季在线观看| 艾莉拉特满天星七个男子汉| 薇娃 碧安卡| 锋刃 电视剧| 五月天情色电影| 汉末皇叔| 我的左手右手演员表| 西班牙电影《体检》在线观看| 电影强我| 牙医姐妹日语版免费播| 黄飞鸿之无头将军| 《扫黑·决战》电影| 诛仙电影版在线观看| 泰剧祁安《秘密爱》| 火山两人没有打马赛| 蒲剧舍饭| 邵氏电影大全国语版| 国风按摩院1一6| 拯救大兵瑞恩电影免费观看完整| 青岛女子家中马桶变“喷泉”| 乡村爱情4在线观看| 四肢无力肌肉酸痛| 日本战狼20免费播放最新一期| 高清《摩绪》电视剧| 哥哥姐姐的花样年华电视剧| 孤男寡女战狼4妈妈结局| 古惑仔之fing头妹| 地宫下的女人| 人猿泰山hr版1995无删减在线完整| 魑魅魍魉之主| 九歌在线观看| 《索命舞娘》| 第一目标电视剧全集| 《女儿国满天星版》在线看| 高清《女仆小姐的贪吃日常》电视剧| 李丽珍蜜桃| 美妙发型屋韩国| 《超时空辉夜姬!》| 末班车后动漫| 战狼6欧式少女全部视频苹果| 电影 敢死队| 风火战纪| 色诱修理工| 成龙电影全集粤语| 乡村爱情10 下载| 年轻母亲在线免费观看| 贝克汉姆任意球集锦| xl司令第一季免费全集在线观看| 斗罗大陆177在线观看| 电影叶问4| 热辣披萨女郎在线观看完整视频 | 成熟的麦子2| 玉观音孙俪| 高清《高嫁柳嫁家》在线看| 禁忌1980满天星凯·帕克| 哪吒之魔童降临2免费播放| 越狱第一季| 北越暴行| 女教师的滋味在线播放| 2020中国好声音| 一起愁愁愁30分钟免费观看电视| 斗罗大陆206集| 彭丹徐锦江《孽缘》| 布兰迪洛夫《不当军事行为》2017免费| 死神来了3的d9版| 胖子视界| 麦乐迪《忠诚少女》完整版| 广场舞玩腻| 武动乾坤 起点| 丰满的继牳3小早川怜子电影| 天美影院电视剧| 安妈超正最新今天| 《妻子做社长签署偿还债务 | 致命罗密欧国语| 澳门风云2 粤语| 台版1987渔夫荒野史记在线看| 英雄虎胆电视剧全集| 韩国 艳舞| 爱我几何《莫妮卡》电影| 盖欧扎克| 大决战一共多少集| 电影公的浮之9| 青柠在线观看免费高清电视剧荣耀| 第一伞兵队电视剧| 最后99天电视剧全集在线观看| 禁忌女孩:重置| 隔壁邻居很美味免费观看电视剧| 哈巴河县| 电视剧北平往事| 映山红歌谱| 特战荣耀 电视剧| 三妹43集播放| 爱人 韩国电影快播| 蜡笔小新国语下载| 《房屋销售的秘密》日本| 长安的荔枝免费播放| 庞贝末日 电影| 黑白配版普通话| 薄冰电视剧免费观看| 帝王计划:怪兽遗产 第二季未删减| 俄罗斯伦理片需要爸爸的种子| 小鸡不好惹第五部| 爱我几何在线观看完整版免费高清 | 男人们的恋爱2| 封神榜之武王伐纣全集| 致美丽的你第三集| 女保险公司销售员2| 变脸印度电影| 第一炉香电影完整版观看| 欢喜冤家电影在线看| 一本之道| 桂宝之爆笑闯宇宙| 女战狼6免费高清版999加拿大版| 万里江山入我怀免费观看| 《交通费》电影| 错位温情短剧免费观看| 媛崽好困原视频完整版| 借枪在线观看| VICTORYDAY护士| 韩剧《爷爷与媳妇》剧情介绍分集| 甜蜜惩恶第一季免费观看全集高清| 黑皮辣妹是我的兄弟第一季免费| KKKBO| 二胡教程| 搞笑一家人韩国版百度影音 | 大男人的小胶妻| 电影爱我几何莫妮卡免费观看高清播放 | 金太狼幸福生活电影| 玩火的女孩| 女版战狼10在线观看免费高清9 | 从后面挺进护士体内| 阿荣旗| 初恋优酷| 诺斯费拉图| 高清今天开始是人类| 动漫女装少女| 神勇双响炮国语| 不惑之旅一共多少集| 艳女十八式婬乱史在线| 伦敦奥运会男子篮球决赛| 一路向西电影完整版种子| 美国《爱上儿子》电影 | 女子输血感染艾滋10年后才发现| 一见不钟情大结局| 和讨厌前任一起出差| 熊出没逆转时空| 重症外伤中心韩剧全集免费播放| 巨茎挺进李淑芬视频-高清电影电影未| 骑驴看马| 爱情有烟火免费观看| 《特殊的治疗》中字| 兽性新人类2| 外景拍照姿势| 妻子的妈妈双字ID| 开心姐姐在美国| 房奴试爱电视剧开头原声视频| 海扁王2 危在蛋夕| 手足兄弟短剧| 旋风小子国语| 台湾版《棘手狂情》电影免费观看下| 极速蜗牛插曲| 鬼父在线观看视频| 白峰电影高清无广告看| 东城西就2011| 《破·地狱》国语版免费看| 《外卖员的艳遇》| 特邀外卖员电影免费在线| 恶魔恋人第2季| 人肉叉烧包之八仙饭店| 少女按摩记| 倩女幽魂| 《无法抗拒的温柔》大结局| 日本年经的继拇3| 世界上毛最多的人| 永生动漫在线观看免费全集高清| 奸魔者| 高清忒弥斯的不确定法庭| 命案2023国语版在线播放| 朝九晚五电影| 人猿泰山1995意大利网盘| 精武家庭| 虎虎是只喵| 安姨《房屋售楼员》电影| 乡村爱情3| 老婆招待丈夫朋友| 进击的巨人在线看观看| 私人家教1983在线观看 | 需要爸爸播种 在线观看| 薄冰电视剧在线观看免费完整版 | 恶魔奶爸2季| 《女销售员的销售秘密》| 韩国电影娼| 恋之罪免费观看完整版高清| 元氏县| 入室讨债奸汙妻子电影在線觀看| 雪豹38集| 咱们结婚吧1—6| 浮之手| 电视剧绝对权力| 非诚勿扰第15期| 兰姨悄悄关上房门去了次卧| 《酒店服务员》在线观看| 老公原谅我在线| 蜂鸟电视剧| 二十一世纪性格爱情指南| 国模小黎吧| 黑帮老大和我的365天第一部 | 谏臣韩剧免费播放在线观看全集| 春潮烂漫海棠红| 性欢愉2做爰HD| 游泳教练的湿润教育电影在线观看| 雷政富减刑出狱 与朋友海南聚会| 明日之战电影在线观看西瓜| 日韩激情小说| 绝密543电视剧在线观看全集免费| 禽我无删减版在线观看| 电视剧芈月传全集免费观看| 赤子板《姐妹牙医》在线| 可疑的美发店| 《好东西》剧情介绍| 超级整蛊霸王国语版| 美女脱个精光扒开| 母亲4高清| 大哥的宝库免费观看全集高清| 美景之屋6| 和部长一起泡温泉| 金蝉脱壳| 三级小说| 高压监狱2完整版在线播放| 网游之王者世界jar| 一起吃拉面吧韩国电影完整版| 双女任务在线播放| 决战刹马镇演员表|