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

嵌入式ARM 2021-06-29 17:20


自從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;

這是 一般的操作方法。現在這個頭文件里面有關于 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。現在我們就可以定義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,來源:華為云社區


版權歸原作者所有,如有侵權,請聯系刪除。

推薦閱讀
用GD32替代STM32:溫濕度采集傳感器開發心得
手把手教會你:使用STM32F103驅動ST7567液晶屏
單片機經驗:STC15W4系列6路專用PWM模塊使用心得

→點關注,不迷路←
嵌入式ARM 關注這個時代最火的嵌入式ARM,你想知道的都在這里。
評論
  • 01 量子光電實驗對高性能信號源的需求在量子光學實驗中,任意波形發生器(AWG)是連接數字控制與物理光場的重要信號平臺。無論是 AOD 驅動、聲光調制、光鑷陣列生成,還是原子搬運與動態重排,背后都離不開高精度、可編排、可同步的射頻信號輸出。相比傳統固定頻率源,AWG 的優勢在于其更高的靈活性:不僅能夠生成復雜波形,還能夠配合實驗時序實現多通道同步輸出、波形序列切換和動態過程控制,因此已成為量子實驗控制系統中的核心設備之一。但在面向 AOD 多束激光控制時,傳統 AWG 的使用方式也面臨
    虹科網絡基礎設施 2026-07-30 17:09 190瀏覽
  • 電源圈里有一句話叫做:世界上最遙遠的距離不是語言差異無法溝通,而是公式擺在面前不會運用。公式不僅僅是數學或科學中的符號堆砌,它們往往是前人智慧和經驗的結晶,是對現實世界某種規律或現象的數學描述。下面,我將嘗試以一種較為通俗易懂的方式,解讀電源設計中的一些公式是如何得來的。充分地理解公式遠不止于記住它的形式和計算結果。真正的要義在于融會貫通,在于從掌握走向自如運用。1、濾波電容計算圖1.1 整流濾波電路及其波形(圖片來源于網絡)為了方便計算,我們取一個極端,假設電容一直處于放電狀態,那么圖1.1(
    愛上電路設計 2026-07-30 14:55 431瀏覽
  • 摘要在防爆電氣設計中,只參照芯數選型而忽略額定載流量,長期滿負荷運行會出現插頭發熱、接觸面氧化、IP67 密封受熱老化等問題。結合常用 3 針 3 孔、4 芯、5PIN、8PIN 圓形防爆連接器,制作分級電流參數對照表,區分冷壓免焊接、焊接兩種接線結構的安全載流數值,設置合理電流冗余系數,搭配使用環境修正參數,規范防爆接近開關連接器、防爆法蘭插座的選型計算方式。關鍵詞圓形防爆連接器,載流參數表,防爆法蘭插座,防爆端子接頭,IP67 防爆防水接插件1 產品概述圓形防爆連接器觸點載流能力由插針直徑、
    kyfbest科迎法電氣 2026-08-03 09:18 128488瀏覽
  •     長期專注WiFi領域,也算是行業老兵了!同行閑聊中,時不時能提起我和我們!從疫情起,國產替代風生水起,起起落落,大浪淘沙,生存下來的都是強者!    WiFi模塊應用廣泛,對于高端市場和特定市場,要求WIFI模塊需要過CE/FCC之類的認證,也就是說沒有認證的模塊,不具備導入產品設計.接下來就和大家聊聊認證模塊選型參考!    WIFi模塊硬件方面主要考慮以下九點特性:    1
    納拓科技 2026-07-31 17:56 167瀏覽
  • 智能寵物用品這幾年快速普及,自動清理幾乎成了智能貓砂盆的標配。貓咪用完離場,設備自動翻轉清理,養寵家庭省去了每天彎腰清理的麻煩。但自動清理的第一步,是先準確判斷貓到底在不在盆里。這個看似簡單的問題,在小空間里并不容易做好。近場檢測的痛點:距離太遠反而誤事貓砂盆內部空間有限。如果傳感器的檢測距離設得偏大,盆外路過的貓、人甚至物品都會被誤判為貓在盆內,結果該清理時不清理、不該清理時亂清理,體驗直接崩壞。這類產品的核心訴求其實就一句話:近距離、小范圍、精準識別,不能有半點誤判。常規感應方案常因檢測距離
    唯創知音語音芯片 2026-07-31 16:51 243瀏覽
  • 在芯片總成本中占比不到 1%,卻可能因一處品質偏差導致整片晶圓報廢——半導體切割/研磨膠帶,正隨著先進封裝的爆發,成為封測產線選型中最謹慎對待的耗材之一。但鮮有人注意到,決定這層膠帶性能上限的,是上游一層更薄的基膜。這個長期由日本企業主導的隱形環節,正在出現國產突圍的信號。一、需求之變:先進封裝與“韜定律”重塑膠帶市場AI 算力芯片、HBM 高帶寬存儲、Chiplet 芯粒等先進封裝產品持續放量,國內封測產線擴產節奏不減。作為晶圓減薄與切割工序的必需耗材,晶圓膠帶的需求同步擴容。據 QYRese
    芯膜前沿 2026-07-31 16:35 298瀏覽
  • 行業痛點凸顯,飛凌嵌入式FET3572-C重磅登場工業4.0與AIoT發展下,嵌入式核心板作為設備“工業大腦”,面臨性能與功耗的雙重考驗——既要支撐復雜算法和多路數據處理,又要兼顧便攜設備、工業終端的低功耗需求,傳統核心板“高性能必高功耗”的困境制約設備升級。為此,飛凌嵌入式推出基于RK3572處理器的FET3572-C核心板,以2×Cortex-A73+6×Cortex-A53八核架構為核心,實現“性能翻倍、功耗減半”的突破,為中高端嵌入式場景提供優質算力底座。八核異構架構,解鎖性能功耗最優解
    飛凌嵌入式 2026-07-31 09:47 190瀏覽
  • 摘要防爆自控系統同時布設本安信號、工業總線、動力供電三類線路,僅依靠標識標牌管控插接極易出現人為錯插問題,高壓動力回路竄入本安弱電回路會突破安全柵限能標準,產生點火風險。依托 A、D、K 標準化機械防呆編碼體系,搭配護套顏色區分管理,適配 3 針 3 孔免焊接冷壓增安型防爆航插、5PIN 總線防爆航空插頭、8 芯焊接防爆法蘭插座的選型使用,從物理結構層面杜絕防爆接近開關連接器、防爆傳感器航插接頭混用插接問題,補齊防爆系統被動安全防護體系。關鍵詞圓形防爆連接器,防呆編碼防爆航插,防爆航空插頭,防爆
    kyfbest科迎法電氣 2026-07-31 18:29 308瀏覽
  • 光芯片,正在從光模塊的“配角”逆襲為AI產業鏈的“命門”2026年3月,英偉達一紙公告震動整個光通信行業——分別向Lumentum和Coherent各投資20億美元,合計40億美元。這哪是什么財務投資,這是一次對AI基礎設施關鍵環節的“掐尖式”卡位。光芯片,這個曾經被市場當作光模塊BOM表里一個標準配套元器件的東西,正在成為AI產業鏈上“卡位”最強、話語權最硬的環節。一、為什么是光芯片?老黃早就把話挑明了英偉達CEO黃仁勛的原話是:數據傳輸速度已成為人工智能發展的新瓶頸。AI集群從萬卡級往十萬卡
    用戶1774416745629 2026-07-31 11:22 294瀏覽
  • ?摘要:低價大流量卡正全面退市,政策收緊已成定局。面對傳統號卡的不確定性,隨身WiFi憑借穩定連接、多設備共享、獨立設備和靈活套餐等優勢,成為務實可靠的備選方案。1、流量卡黃金時代要結束了通信行業正迎來一場前所未有的“地震式”調整——曾讓無數用戶追捧的低價大流量卡,正在全速退出各大平臺。這早已不是一次普通的競合,而是一場趨勢性的行業洗牌。回望過去,19元200G的神卡,那時真是“睡著都能笑醒”,便宜到不敢相信,爽到忍不住炫耀。那些日子,好像隨便刷、隨便看,流量自由觸手可及。可如今,回頭再看,那種
    愛上電路設計 2026-08-03 10:21 128668瀏覽
  •         很多人拆解醫療設備時,只會關注傳感器、主控芯片這類核心部件,卻忽略了電路板上不起眼的晶振。作為整個醫療系統的時間基準,晶振的精度、穩定性直接決定了測量數據的準確性、設備的運行安全性——比如監護儀的采樣頻率偏了1ppm,血氧、心率的讀數就會出現系統性偏差;膠囊內窺鏡的時鐘漂移超標,圖像傳輸就會出現丟包、花屏。不同醫療場景對晶振的要求天差地別,沒有一款晶振能通吃所有設備,每一類醫療設備背后,都有一套針對性的晶振選型邏輯。1. 家用便攜監測設備:
    TKD泰晶科技 2026-07-31 08:24 497瀏覽
  • 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 187瀏覽
  • 今年好幾個客戶都問過我同一件事。藍牙音頻產品到底用 WT2605 這種單芯片,還是老老實實 MCU 外掛藍牙模組。兩種方案我都落地過,說點實在的,WT2605 剛出來那陣我也犯嘀咕,怕是營銷噱頭,真拿來做完一版樣機才服氣。一、選型先看三個維度外圍數量。這是最直觀的。傳統做法是 MCU 加藍牙模組,再加音頻編解碼、功放、晶振和一堆阻容,板子上密密麻麻十幾二十顆料。WT2605 把藍牙、解碼、功放全收進一顆,外圍就剩少量被動件。開發周期。傳統方案得自己接藍牙協議棧,配網、A2DP 解碼、音頻通路一一
    唯創知音語音芯片 2026-07-31 16:35 385瀏覽
  • 在EMC測試過程中,傳導發射(Conducted Emission,CE)超標是工程師最常遇到的問題之一。更令人頭疼的是,同樣的超標曲線背后,可能對應著完全不同的干擾機理:有的是差模噪聲沿電源回路傳播,有的是共模電流通過寄生路徑耦合,還有些問題甚至并非來自電源本身,而是負載、電纜布局或接地結構引起的連鎖反應。 · 150kHz~1MHz 超標:多為差模噪聲為主,干擾沿火線-零線回路傳輸。 · 1MHz~30MHz 超標:通常共模噪聲占主導,干擾通過火線/零線對地回路傳播。 如果條件允許,用電流探
    譽磁電磁兼容EMC 2026-07-31 18:45 373瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 职员到老板:打工人全集免费| 美国三片在线播放免费| 功夫熊猫英语版| 赤子乘龙优酷| 新选组镇魂歌 江户青春篇电视剧| 《落魄贵族琉璃川》动漫观看| 山河令36集全集免费播放| 《xl司令》在线观看完整版动漫| 大鸟笼电影免费观看| 潜入搜救官完整版在线观看| 魔法科高中的优等生| 麦乐迪与表哥的电影家庭矛盾| 李凤山最新30分钟甩手视频| 美国版《健美》在线观看| 名侦探柯南714| 保罗和雪梨一家1| 战火熔炉电视剧在线观看| 难哄第21集免费观看| 光环第一季在线观看| 疯狂的石头电影| 女人何苦为难女人演员表| 感官王国| 丫鬟上位记:我成了贵妃全集免费 | 女销售员的秘密免费观看| 玫瑰的故事首播5集| 你有病吗| 江湖男装:女扮侠义短剧全集| 小马宝莉动画片全集免费中文版| 琉璃美人煞电视剧在线观看| 俏媳妇致富经:重生八零短剧全集| 念念青春| 三妹影院在线观看免费播放电视剧| 今天有七星连珠吗| 不可饶恕 电影| 《奇迹梦之队》| 熊出没伴我熊芯完整版免费观看| 杜康指的是什么意思| 异兽魔都| 总裁的替身妻全集免费| 家族之歌| 大丈夫2下载| 生化危机终章| 入殓师百度影音| 大话西游之大圣娶亲 电影| 江湖少年诀电视剧免费观看| 日本大学生特殊按摩3 | 高清我独自蜜月未删减| 法医王妃:验尸断案无人及短剧全集 | 王力宏有什么歌好听| 情迷六月花 电影| 无极2英雄崛起| 电影亮剑完整版免费观看| 老牛影视| 铁齿铜牙纪晓岚二部全集在线观看| 红楼残梦电影完整版免费观看| 赶尸艳谈在线观看完整版| 妲己无惨| 年轻的邻居天美| 坠落电影完整版免费观看| 丹麦娇娃| 电视剧命运交响曲全集| 肉蔻之香无删减版在线观看完整版 | 打扑克视频免费观看| 情谜睡美人之欲望的姐妹| 影音先锋网每日| 《无限城决战篇》免费观看| 苍月战士H成人版| 挚爱游戏樊治欣全集免费观看| 我年轻瘦子8完整版| 北上在线观看完整版免费高清| 日本修理工艳遇| 高清极寒潜袭| 掌中之物| 邻居的老婆在线| 需要爸爸的种子免费观看电视剧意大 | 一直一直都很喜欢你电影免费观看| 天龙八部在线观看完整版免费| 神秘人质电视剧全集优酷| 一念永恒187| 僵尸小姐| 欢乐颂3在线观看免费| 二号首长2| 神奇数字马戏团第一集| 台湾电影黛比系列之女家教在线观看| 继父在线观看| 韩剧《绝对男友》观看| 逆局在线观看免费完整版| 木子檀檀子免费看高清| 难寻电视剧免费观看全集完整版| overflower第一季动漫免费观看| 青柠在线电视剧免费观看第二季| 秘密女搜查官在线观看第6集| 听说我老婆是反派大佬| 牛鞭擦进女人下身在线| 邻家女孩百度影音| 妻子爱上送快递的丈夫| 下南洋三毛钱看| 四个女忍者 满天星 雪姬| 我有时候也想成为a片主人公| 性解命| 高清《英雄》在线观看完整版| 19岁大学真人免费播放电视剧| 裙子下面是野兽动漫| 日本战狼6免费国语| 小巷人家电视剧免费版观看| 极乐宝鉴在线| 成都大熊猫玩菜刀| 沧元图58集完整版| 老舅1-40集完整版免费看| 小小蜜桃2在线观看免费版电视剧| 捷德奥特曼普通话版免费观看| 神探夏洛克第四季第二集| 广场舞开着车去草原| 短剧《权宠天下》| 贫女复仇记满天星版| 死亡笔记迅雷下载| 日本电影《姐妹牙医》在线观看| 憨夫成龙粤语| 丰满的邻居| 葡萄牙vs西班牙| 需要爸爸播种在线观看免费高清 | 烈火男儿之队长的故事| 东北往事黑道风云20| 19岁大学生观看电视剧韩剧 | 同德县| 我是哪吒2之英雄归来| 建国门枪击事件| 四项公投是哪四项| 忘年恋电影在线观看免费| 老男孩 剧情| 甄嬛传高清在线观看免费完整版| 旧水浒传| 无处藏身电视剧| 灭火宝贝3电影免费观看完整版| 盛夏晚晴天国语 影音| 韩剧《销冠的秘密2》| ママぷりっ!?| 3对1| 欢笑老弄堂| 隔山之眼3免费完整版| 哥谭高中| 安斋拉拉电影在线观看| 刺客忍者| 浴室情欲2交换暴露| 义胆红唇| 快乐大本营2014| 与蛇有关的电影| 三级小说| 《卖房子的女销售| 落落历险记| 《美容院:特殊待遇5| 大唐女巡案| 《秘密搜查官》免费观看| 变形计第七季| 蓝色隐身帽子在线观看| 张响神枪电视剧全集| 隐身帽子韩国免费完整版视频| 沧元图2动漫全集免费观看高清 | 19岁大学生免费观看电视剧 | 2001太空漫游免费| xi司令真人版全集免费播放| 刁蛮婆婆俏媳妇| 爱唯侦查DVD视频| 澳门风云在线观看| 赤子板栗《千金小姐》| 孟买酒店| 华为Mate70系列进入最后阶段| 英雄虎胆电影| 三女片免费观看电视剧| 法国高压监狱3完整版| 速度与激情11| 游泳馆特殊待遇| 江西卫视经典传奇| 倔强驱魔师1-4集免费观看下载 | 《黑色的眼泪》在线播放免费观看 | 强行入侵粗暴完整版| 好日子全集在线播放| 换位兄弟| 《大江大河2》电视剧| 让子弹飞完整版免费观看| 只是离婚的关系免费观看电视剧| 全部视频排列表寂寞影院| 海豚寄宿学园在线观看完整版| 公孚之手10| 最新二人转| 《卢旺达玫瑰》完整版| 家有好儿媳第二部| 微雨燕电视剧免费观看| 指尖传出的真挚热情第一季| 禁忌4美国禁忌3完整版中文| 少年爱上中年女人的电影你的导师在线观看 | 射雕英雄传EAGLET| 将界2第5酒店真人| 年轻的阿姨5中字在线播放| 《人与动物》丹麦纪录片| 末日三问| 小娘惹全集电视剧免费| 战狼6欧式少女免费| 公交车电影免费观看电视剧在线播放| 和部长出差日子HD电影| 女朋友的扇贝好粉| 韩国电影R| 电幻国度电影在线观看免费| 媚眼激情夜4| 电锯惊魂4下载| 最后勇士| 羽月希正在播放| 黑豹天下国语版| 美国三级《偷妻》| 电影:《血战长津湖》| 宇宙威龙| 非诚勿扰20120714| 美女打针| 头号玩家豆瓣| 噼里啪啦国语版在线观看| omoflow第一季真人版| 威尼斯恋人国语| 公之浮手中30| 快播云播放| 复仇者联盟 快播| 僵尸大战世界| 嗅觉神探| 女律师替夫还债电影在哪看| 两不疑动漫全集在线观看| 《特邀外卖员》完整版在线观看| 釜山行完整版在线观看| 仓井空电影网| 影迷电影网| 原始森林电影| 《幸福花园》双男主动漫免费看 | 炸裂白宫| 年轻的小瘦子5| 扇娘下载| 《交缠》2024年电影| 普罗米修斯高清| 播放女流氓完整版电影| 游樣2T| 那小子不可爱电视剧| 被可怕的科长欺负的员工电影名字是 | 杨门寡妇肉床电影完整版| 麦乐迪《女超人》在线观看| jizz教师| 爱情开关| 战火连天电视剧全集免费观看| 联谊对象是RS系警官| 伦理《法国护士长》观看-电影全集HD高清完整电影 | 斗破苍穹特别篇3在线观看免费版| 局外人电影| 少女尖叫之夜高清观看动漫| 出埃及记 马克西姆| 《侄女的开发日记》漫画观看| 不一样的男子| 美国禁忌式结局- 5| 奥伊米亚康村| 僵尸启示录没删掉版在线观看| 舌头挑拨扇贝| 加索尔三兄弟| 啄木鸟《劳拉的遗产》叫什么 | 女友的妈妈女主演员是谁| 暗恋者的救赎| 血战墓碑镇| 中国女曲和比利时女曲冲突| 上书房电视剧| 坎贝奇影片在线观看| 都铎王朝第一季qvod| 新员工入职秘书2| 禁室培欲3| 教授和女学生| 商务旅行戴绿色帽子电影 | 王朝的女人·杨贵妃完整版 | 姐姐真好23集在线观看| 母亲5免费高清电视剧在线看| 青春没有彩排| 心碎高中 第三季全集观看| 二十一世纪性格爱情指南第4集| 出轨的女人粤语| 绝世龙尊短剧免费看| 被义子糟蹋| 王者清风剧情介绍| 365天今时之欲资源| 妈妈在等你电视剧免费观看全集| 一线生机 电影| 美景之屋6完整版中字大结局| 女超人,麦乐迪| 秘密押运| 搁浅的意思| 小五弟最近山歌| 暮光之城5在线观看全集免费高清| 美丽在望粤语| 禹城市| 新有菜免费在线观看| 靳东当选全国政协委员| 《混血儿的摇篮曲》1973| 太空堡垒国语| 酒店全集1-5| 高清《完美证据》电视剧| 奥本海默电影| 隔壁邻居很美味免费观看电视剧》免费在线观看高清-三妹影视... 第20251021 | 落魄贵族琉璃川在线观看免费动漫 | 满天星急救护士法版2| 诡秘之主动画第一季| 武逆5200| 塔日酒店1999法国电影免费观看| 高清抢钱女王团| 漂亮妈妈6 中字 开头 歌曲| 你好 我的大夫| 完美伴侣在线观看完整版免费| 傅艺伟版封神榜全集| 爱情公寓在线观看完整版免费| 《特殊的治疗》李采潭中字| 小草青青电视剧免费的| 可可西里6| 人工进化电影无删减版观看| 美女午夜福利4K视频在线观看| 销售女销售员2| 血腥的夜晚| 斗罗大陆第142集免费观看完整版| 僧侣之夜在线观看动漫完整版 | 满江红沈腾在线观看| 铿铿锵锵锵免费观看在线观看| 这么多年电影在线观看| 私人航空免费完整版| 枪神燕双鹰| 背叛在线观看免费完整版电视剧| 台湾电影按摩店排毒500叫啥电影 八尺夫人意大利版原声满天星 | 需要爸爸播种子(中文版)| 灵幻新娘| 德昌县| 我的名字韩剧| 情圣囧瑟夫| 白嫖者联盟电影在线观看| 公主她不装了:摊牌是大佬全集免费| 平安县| 女毒枭 兰姐| 阿凡达3免费完整观看| 姨妈战狼10| 《和讨厌的社长出差旅》大结局短发| 《甜美姐姐动漫在线观看》| 捷德奥特曼普通话版免费观看 | 爱的定义泰剧| 黑寡妇 电影| 爱我几何原版无删减| 如果是你 或许可以相恋电视剧| 旧三国演义全集| 瑞克与莫蒂第5季| 高清匹兹堡医护前线 第二季未删减| 韩国蓝色隐身帽子叫什么电影| 植物人老公短剧全集| 一起来看流星雨31| 堕落的女律师韩版电视剧免费播放| 神龙斗士第二部| 侄女的开发日记动漫第12集在线观看| 中国好声音之为你转身| 小欢喜免费观看| 八戒8电影在线观看播放| 电视剧刘老根三部全集2019| 我的父亲母亲的婚姻 电视剧| 庆余年第三季40集免费观看| 青春 裴斗娜版| 卖房子的女销售3韩国| 王者好气啊| 罪域11| 忠贞电影演员表| 赘婿在线观看完整版| 坎贝奇的品味人生完整版| 连诗雅三级| 翁虹《玉尺经》徐锦江| 满天星HD版女超人在线 | 总统夫人1997满天星免费观看| 林正英国语全集 | 麦乐迪在线完整版| 曝李晨身家10亿| 惊鸿故人归短剧免费观看全集高清版 | 《放飞旅行团》| 男人女人一起愁愁愁电视剧观看在线| 高清《女机械人》| scp电影| 一起愁愁30全集免费播放 | 高清《灭火宝贝5》电影| 太阳照常升起电影| 金银梅5一10普通话1大香蕉伊人| 复仇者联盟2免费版高清观看| 艾琳电影| 做aj的电视剧在线观看| 韩国电影出轨| 黑豹特警队| 来自妈妈的绣感2国语版叫什么名字| 爱情有点蓝之爱的交响乐全集| 电视剧勇敢的心全集| 人猿泰山无删减版1995主演| 黄河大侠电影| 记得香蕉成熟时在线播放| 爱情睡醒了40| 张帝问答演唱会| 总统夫人罗丽星克莱尔免费观看完整 | 女飞行员(法国)满天星女版在线观看| 冤家亲家电视剧全集在线观看| 法国队VS葡萄牙队| 年轻的小痍子3免费观看| 红天机 电视剧| 你的婚礼免费观看| 高清杀手记忆 第一季| 不信天上掉馅饼| 一个妈妈的9中字头强华驿人物关系| 长征组歌 四渡赤水出奇兵| 熊出没丛林总动员| 妈妈爱上儿子同学在线| 邻居的老婆在线| 电视剧火蝴蝶| 高清《鸽乳》无删减版| 大汉天子第三部电视剧| 险恶绣感未册版在线观看| 爱上特种兵免费观看柠檬| 即刻上场全集免费观看| 需要爸爸的种子中文| 《妻子》日本在线观看免费完整版| 最后的维京人全集观看| 汉尼拔第四集| 《漂白》电视剧在线播放| 《大兵的寝室》美剧免费观看中文版| 天空之城钢琴曲教学| 昆仑神宫电视剧| 台湾电影村姑的故事免费观看 | 莉娜安德森主演的电影满天星| 阿蚬洞夫人| 机器人总动员国语| 日本伦理电影替夫还债| 新妈妈中字| 藏在办公桌底下含进去| 急诊护士完整版在线播放| 最新凤凰军事观察室| 我爱hk开心万岁粤语高清| 风月变全集电视剧短剧免费剧情| 君九龄免费观看| 八仙饭店埃博拉病毒电影| 哈法欧尼| 聊斋之流光情劫完整在线观看| 《壮志凌云女版》(法国版) | 《朋友的妈妈》中字歌曲| 善良的瘦子5最漂亮三个角色| 青柠免费观看在线高清电视剧| 怎么自制果冻笔| 咒怨录像带版| 朋友的妈妈2在完整有限中字第5| 广德县| 高清轧戏| 龙三和他的七人党| 正在播放: JUQ-345 我的无精症丈夫什幺都不知道。我恳求一位匿名男子进行性爱 | 保罗3雪莉一家1| 童话 世界| 比悲伤更悲伤的故事| 一家乱战5高清免费播放| 陌路血地| 从零开始的异世界生活观看顺序| 特别酒店2_午夜电影全集_完整版免费在线观看 | 哪吒1高清完整版免费观看| 私藏浪漫在线观看| xl司令第一赛季真人版播放| 误杀2在线观看免费完整国语高清| 乡村爱情8西瓜影音| 黄色仓库视频| 电视剧下一站婚姻免费观看全集剧情| 人龙传说国语版| 浮世风清绘完整版| 大内密探零零发高清国语| 九尾狐传说| 倔强の驱魔师1-4集顺序| 一千滴眼泪电视剧| 白锦曦1到100集免费观看| XL司令第一季真人版韩| 我是女王 电影| 最美的安排| 荒野女战士HD版播放| 《超宇宙刑事卡邦 无限》| 有你真好天堂飘雪| 入室暴行国语免费看| 新孽海花传奇主题曲| 机甲女神之究极神兵| 《强奸ii制服诱惑》清晰免费观看韩国-兵临城下服诱惑》清晰免费观看韩国-兵临 | 汽车总动员国语版下载| Melody女超人免费观看高清| 二战译制片| 《从指尖传出的热情》2 | 疯马秀纪录片| 鸟的天堂教案| 美国另类69| 霍比特人百度影音BD| 蝴蝶公墓网站| 花与蛇5之恶魔之爪| 雷霆扫毒 国语| 恶魔奶爸2季| 4少妇按摩| 黑狐之风影电视剧全集| 岁月风云之雄霸天下| 酒店1-75集免费观看电视剧中文字| 猎狼电影免费播放完整版| 老枪国语版在线观看免费| 一级荒野渔夫| 好好说话在线观看免费完整版| 电视剧民国大侦探在线观看完整版 | 异世界圣机师物语| 光棍影院双人按摩| 街头顽童| 生日快乐刘若英版电影| 四少妇精油按摩电影| 刀锋战士| 白蛇传奇歌曲| 《特殊游泳教练》完整版| 火影忍者vs高达seed| 锵锵三人行 王朔| 黑人强伦轩电影| 妻子的姐姐免费观看大全电视剧| 3d肉蒲团迅雷下载| 战狼6免费播放观看完整版 | 秦皇岛 万能青年旅店| 幽游白书在线玩| 欧美黑白配在线观看| 蒂凡尼的早餐迅雷下载| 连锁大阴谋| 俄罗斯美女学院第一季完整版 | 黑白配高清国语完整版| 万古齐天全集免费观看| 世家嫡女全集免费| 胡鑫宇最新消息进展官方今天| 邓超推销新电影被保安架走| 《局内人》电影完整版在线观看 | 隐藏的面孔| 丰满的乳| 壮志凌云女版| 这省凭什么春节游客量第一| 珠海体育中心撞人事件| HD《激战丛林》完整版| 迪迦奥特曼国语| 《姐姐对我来说是女人》| 女律师的坠落在线观看免费版电视剧| 最近好看的免费电影| 蜡笔没了小新| 不良义姐是| 斗罗大陆132| 悲伤时爱你| 为爱几何| 月嫂苏媚的小说免费阅读| 咱们结婚吧1—6| 老公下属是初恋在线视频在线观看 | 第一次遇见花香的那刻 | 野玫瑰之恋| 免费看TVB片| 浪漫医生金实福| 分手大师| 我的梦为你停留| 女子消防队满天星在线观看视频| 电影透明人免费观看完整版| 如果爱湖北卫视| 《高压监狱2》在线观看| 致命弯道5完整版在线观看视频| 鸡王电影| 私人航空免费观看完整版| 水浒传电视剧2011| 与王一夜| 游樣t2| 少年派第二季全集免费播放| 屠狼刀全集在线观看| 沙漠行动满天星| 浪迹天涯高清| 乌龙元首| 暴躁少女完整版在线看| 不在犯罪现场电视剧| 高清午夜的倾心旋律未删减| 搭错车全集| 家属免费在线观看| 恋爱前规则| 斯诺登电影| xl司令第一季全集在线观看完整版无删 | 哪吒3上映时间| 一一影视| 窥视电影| 线切割教程| 日本2和搜子同居的日子在线观看 青春环游记5季免费播放 | 一路向西 国语| 丰满的妽妽3韩国电影| 魔法老师第一季| 斗罗大陆免费观看网站| 危险动物未删减| jizz日本在线观看| 死亡飞车 电影| 烈火军校电视剧免费播放全集| 木下檀檩子电影免费观看高| 韩剧《先婚后爱》免费观看| 金石良缘| 爱欲狂潮电影| 同学两亿岁免费看完整| 周星驰美人鱼预告片| 秦岭神树在线观看| 一个好妈妈中文字幕 电影| 金瓶双艳HD完整版| 北大教授王福重| 需要爸爸播种籽2演员名字| 斗罗大陆免费完整观看170集| 向东是大海百度影音| 黑白配手机免费观看| 朋友的母亲4| 下一个奇迹百度影音| 天使之恋 纯爱物语| 绝代艳星宝莲的一生| 电影《美味快递员2》免费完整版| 象棋王全集| 情定少林寺| 八戒八戒电影在线看| 最后一日| 电视剧焦裕禄| 潮州市| 东北恋哥电影高清完整免费观看| 宇宙星神全集2| 边城电视剧| 《最高の爱人| 高清《激情》电影| 环太平洋 电影天堂| 北越暴行电影2| 摩登原始人英语| 灵蛇爱泰剧| 全球冰封我打造了安全屋| 爱唯侦查新片合集免费观看2023年| 姐姐睡着高清免费观看电视剧全集| 恋爱FLOPS| 一起愁愁愁免费全集| 国王的演讲在线观看| 山城的灯光战胜了火光| 木下凛凛子在线| 犯罪图鉴第二季免费观看完整版| 单数绝配| 越南停播中国电视剧| 《美丽妻子替夫还债》有奈美剧吗 | 为时已是寿司!?| 就算是爸爸也想动漫未增删6分| 游泳教练的特殊待遇电影| 女子电影院情不自禁| 九周半完整版百度影音| 韩国蓝色隐形帽子免费| 女人公敌一共多少集| 桃恋者未删减| 锦鲤空间:好运爆棚挡不住短剧全集| 巨乳保险| 幸福的面包| 暗恋成真:男神爱上我短剧全集| 高冷搜查官白峰美羽遇上猪队友| 隆美尔电影| 电视剧《人世间》| 电影《空乘》在线观看肯纳詹姆斯| 丁度执导18禁电影| 电影登山的目的| 除蚤武士| 九一麻花传剧mv在线看看第一集 | 哇嘎高清电影在线播放| 一代女皇潘迎紫版的电视剧70集| 豪情3d字幕| 菲律宾《楼上楼下》| 美一架波音737冲出跑道| 杨光的爱情故事下载| 星期三电影| 牙医姐妹电影免费版在线看| 各大医院领导被抓后痛哭流涕| 阎启俊简历| 《替弟偿债七日》电影叫什么名字来| 满月之下请相爱免费观看全集| 那金花的女婿| 金梅瓶之爱奴1在线观看| 巜性刑房3捆绑凌虐电影| 苍井空演的电影| 奇门遁甲2免费观看高清完整版| 年轻的的小瘦子5| 超星神国语版全集| 超人气学园剧情介绍| 大程子小品| 狗带tV金瓶梅| 斗破苍穹电视剧在线观看| 清华长庚医院付猛医生| 《私人航空》在线看免费| 《斗罗大陆》在线观看免费| 古墓丽影1高清| 特种兵之火凤凰全集下载| 京香电视剧全集免费观看| 我在伊朗长大观后感| 中国远征军 下载| 江安县| 新乱世佳人小叔吃扔扔扔哪一集| 澳门风云2西瓜影音| 基督山伯爵电影在线观看| 坎贝奇《无憾》完整版在线观看| 郭德纲于谦相声全集2020最新版| 你的欲梦裸身在线播放| julia最好看的一部| 电影《需要爸爸播种子》免费观看| 专家谈济南不明飞行物坠落| 百战天龙| 法国空姐4在线| 猪猪侠之囧囧危机| 火口的两人| 钢壳都市| 酒店1-90全集免费观看| 紧急行动40集免费观看| 绝对权力剧情| 重生之毒妃飒爆了全集免费| 法国空姐6大结局免费| 苹果电影片| 水饺皇后电影| 3对1初次体检4| 四位少妇精油按摩| 美洲杯赛程2021| 新冠是风寒还是风热| 北越暴行| 发型屋网站| 折腰电视剧在线免费| 水门桥在线观看完整版高清 | 《钢之炼金术师》| 境界的轮回| 《卖保险套的女销售》电影免费观看 | 林俊杰成都演唱会| 美国女按摩师2无删减版电影观看| 拔萝卜电影版| 电视剧好好说话| 高清《妻子的浪漫旅行2026》| 酒店激战3| 野蛮的托姆| 匆匆的青春电视剧免费观看| 女英雄堕落之水星陨落2| 《overflower》第一季| 儿媳妇的| 欢乐颂3在线观看免费| 特殊按摩精油3的功能主治与使用| 哈德威尔| 金瓶酶2| 朱茵电影制服的绣感| 电影 《透视》在线观看| 电影 上位| 色即是空1 qvod| 网络情缘原唱| 莺长女儿| 高清轧戏| 日本3天已连震5次| 兰花草在线观看高清完整版国语| 成全完整版动漫高清免费| 抢奸电影| 刘海戏金蟾| 金瓶梅在线高清免费播放观看电影| 啄木鸟版壮志凌云电影在线观看完整版 | 聊斋之千年灵狐在线观看| 周密周芯竹宣布分手| 女超人麦乐迪星辰影院| 义姐是不是良喂授动漫| 水月洞天第3部| 你是我爱人电视剧全集| 《法国空乘11》完整版| 铜铿锵锵锵免费观看| 失去的纯真| 鸭王2免费看| 妈妈的职业2观看完整版| 鬼吹灯之天星术| 咱们结婚吧26| 铃音动漫| 秋瓷炫《生死决断》精彩片段| 黑白配电影免费高清在线观看国语| 六一儿童节布置作业犯法吗| 陆鸣短剧40集免费播放| 白嫖者联盟免费观看高清版| 假面骑士艾克赛德全集观看免费中文| 731部队女子配狗马| 《消失的她》免费观看完整版下载| 暴躁少女全集免费播放| 聊斋·兰若寺免费观看完整版| 一仆二主电视剧 全集| 德清点子| 男女一起愁愁愁免费观看全集| 孟羽童疑似成立个人工作室| 伊战启示录| 鉴宝女王:古玩市场我称霸全集免费 | 年轻人电影在线观看| 爱情电影网 佐山爱| 奉节县| 熟睡中被义子侵犯电影免费观看| 风儿阵阵吹全集| 你是我的荣耀在线观看免费完整版| 美味快递员特殊待遇2| 第一集到100集免费酒店| 高山青歌谱| 女子在足浴店被技师弄晕| 法国女仆| 女部长的加班要求日剧中文| 伊提帕.柯彭温奇| 爱之亡灵| 贾乃亮买醉撒酒疯| 后宫露营第一季未增减0.0.0.对应第2集| 汤方大胆人体艺术| 琵琶别抱| 鬼父 下卷| 女超人麦乐迪无删减版在线播放| 你所不知道的童话在线播放| 3380理论| 孤男寡女免费观看高清电视剧狂飙| 美姐妹牙医在线电影观看完整版高清| 春日狂热电视剧免费观看| 射雕英雄传之侠之大者免费完整版| 哈利波特与凤凰社| 美国女儿国满天星在哪能看| 向往的大海| 黄花大闺女下集免费观看| 漂亮的保姆1完整版免费观看| 伦理《法国空乘4观看| 日子老妈子BB| 刘老根1| 姜子牙电影| 电影美容院的特殊待遇五| 翘臀嫩美少年被调教灌尿| 《之后2》高清在线观看| 小蜜桃4| 《女销售员的销售秘密》签合同| 杰西·简啄木鸟| 吴京《镖人》在线观看| 真心让你幸福| 《731》完整版免费观看普通话| 坠落女律师电影在线观看免费| 世界十大禁用枪支| 无尽情爱双男主泰剧在线观看| 水咲萝拉 白妖精| 《八尺夫人意大利满天星》在线观看| 前辈让我们尽情的相爱吧第一集| 杨思敏1996版电视剧全集| 《特殊面试2》| 酒店1-60集全集免费| 法国超人麦乐迪在线观看| 遁入虚无| 我怕来不及剧情介绍| 师兄啊师兄第一季| 壮志凌云满天星版在线观看| 周星驰西游降魔篇在线观看| 爱的理想生活电视剧| 五华山事件| 初体验5在线观看电视剧全集免费| 女员工抵不住部长的口才电影| 百变宝贝| 高清《人生第一次》在线观看| 不可抗拒的你ID中字| 美容室的待遇6在线观看| 神探高伦布大结局| 骄阳伴我 电视剧| 朋友的妈妈韩国电影| 丈夫不在一周七天我失去了理智 | 后厨也是江湖| 援交女教师| 极限挑战第季第3季| lx司令| 小唐璜的角色|