一個嚴(yán)謹(jǐn)?shù)腟TM32串口DMA發(fā)送&接收機(jī)制

嵌入式電子 2024-07-22 07:54
1 前言

直接存儲器訪問(Direct Memory Access),簡稱DMA。DMA是CPU一個用于數(shù)據(jù)從一個地址空間到另一地址空間“搬運”(拷貝)的組件,數(shù)據(jù)拷貝過程不需CPU干預(yù),數(shù)據(jù)拷貝結(jié)束則通知CPU處理。

因此,大量數(shù)據(jù)拷貝時,使用DMA可以釋放CPU資源。DMA數(shù)據(jù)拷貝過程,典型的有:

  • 內(nèi)存—>內(nèi)存,內(nèi)存間拷貝
  • 外設(shè)—>內(nèi)存,如uart、spi、i2c等總線接收數(shù)據(jù)過程
  • 內(nèi)存—>外設(shè),如uart、spi、i2c等總線發(fā)送數(shù)據(jù)過程

2 串口有必要使用DMA嗎

串口(uart)是一種低速的串行異步通信,適用于低速通信場景,通常使用的波特率小于或等于115200bps。

對于小于或者等于115200bps波特率的,而且數(shù)據(jù)量不大的通信場景,一般沒必要使用DMA,或者說使用DMA并未能充分發(fā)揮出DMA的作用。

對于數(shù)量大,或者波特率提高時,必須使用DMA以釋放CPU資源,因為高波特率可能帶來這樣的問題:

  • 對于發(fā)送,使用循環(huán)發(fā)送,可能阻塞線程,需要消耗大量CPU資源“搬運”數(shù)據(jù),浪費CPU
  • 對于發(fā)送,使用中斷發(fā)送,不會阻塞線程,但需浪費大量中斷資源,CPU頻繁響應(yīng)中斷;以115200bps波特率,1s傳輸11520字節(jié),大約69us需響應(yīng)一次中斷,如波特率再提高,將消耗更多CPU資源
  • 對于接收,如仍采用傳統(tǒng)的中斷模式接收,同樣會因為頻繁中斷導(dǎo)致消耗大量CPU資源

因此,高波特率場景下,串口非常有必要使用DMA。

3 實現(xiàn)方式

整體設(shè)計圖

4 STM32串口使用DMA

關(guān)于STM32串口使用DMA,不乏一些開發(fā)板例程及網(wǎng)絡(luò)上一些博主的使用教程。使用步驟、流程、配置基本大同小異,正確性也沒什么毛病,但都是一些基本的Demo例子,作為學(xué)習(xí)過程沒問題;實際項目使用缺乏嚴(yán)謹(jǐn)性,數(shù)據(jù)量大時可能導(dǎo)致數(shù)據(jù)異常。

測試平臺:

  • STM32F030C8T6
  • UART1/UART2
  • DMA1 Channel2—Channel5
  • ST標(biāo)準(zhǔn)庫
  • 主頻48MHz(外部12MHz晶振)
在這里插入圖片描述

5 串口DMA接收

5.1 基本流程

串口接收流程圖

5.2 相關(guān)配置

關(guān)鍵步驟

【1】初始化串口

【2】使能串口DMA接收模式,使能串口空閑中斷

【3】配置DMA參數(shù),使能DMA通道buf半滿(傳輸一半數(shù)據(jù))中斷、buf溢滿(傳輸數(shù)據(jù)完成)中斷

為什么需要使用DMA 通道buf半滿中斷?

很多串口DMA模式接收的教程、例子,基本是使用了“空間中斷”+“DMA傳輸完成中斷”來接收數(shù)據(jù)。

實質(zhì)上這是存在風(fēng)險的,當(dāng)DMA傳輸數(shù)據(jù)完成,CPU介入開始拷貝DMA通道buf數(shù)據(jù),如果此時串口繼續(xù)有數(shù)據(jù)進(jìn)來,DMA繼續(xù)搬運數(shù)據(jù)到buf,就有可能將數(shù)據(jù)覆蓋,因為DMA數(shù)據(jù)搬運是不受CPU控制的,即使你關(guān)閉了CPU中斷。

嚴(yán)謹(jǐn)?shù)淖龇ㄐ枰鲭pbuf,CPU和DMA各自一塊內(nèi)存交替訪問,即是"乒乓緩存” ,處理流程步驟應(yīng)該是這樣:

【1】第一步,DMA先將數(shù)據(jù)搬運到buf1,搬運完成通知CPU來拷貝buf1數(shù)據(jù)

【2】第二步,DMA將數(shù)據(jù)搬運到buf2,與CPU拷貝buf1數(shù)據(jù)不會沖突

【3】第三步,buf2數(shù)據(jù)搬運完成,通知CPU來拷貝buf2數(shù)據(jù)

【4】執(zhí)行完第三步,DMA返回執(zhí)行第一步,一直循環(huán)

雙緩存DMA數(shù)據(jù)搬運過程

STM32F0系列DMA不支持雙緩存(以具體型號為準(zhǔn))機(jī)制,但提供了一個buf"半滿中斷"

即是數(shù)據(jù)搬運到buf大小的一半時,可以產(chǎn)生一個中斷信號。基于這個機(jī)制,我們可以實現(xiàn)雙緩存功能,只需將buf空間開辟大一點即可。

【1】第一步,DMA將數(shù)據(jù)搬運完成buf的前一半時,產(chǎn)生“半滿中斷”,CPU來拷貝buf前半部分?jǐn)?shù)據(jù)

【2】第二步,DMA繼續(xù)將數(shù)據(jù)搬運到buf的后半部分,與CPU拷貝buf前半部數(shù)據(jù)不會沖突

【3】第三步,buf后半部分?jǐn)?shù)據(jù)搬運完成,觸發(fā)“溢滿中斷”,CPU來拷貝buf后半部分?jǐn)?shù)據(jù)

【4】執(zhí)行完第三步,DMA返回執(zhí)行第一步,一直循環(huán)

使用半滿中斷DMA數(shù)據(jù)搬運過程

UART2 DMA模式接收配置代碼如下,與其他外設(shè)使用DMA的配置基本一致,留意關(guān)鍵配置:

  • 串口接收,DMA通道工作模式設(shè)為連續(xù)模式
  • 使能DMA通道接收buf半滿中斷、溢滿(傳輸完成)中斷
  • 啟動DMA通道前清空相關(guān)狀態(tài)標(biāo)識,防止首次傳輸錯亂數(shù)據(jù)
左右滑動查看全部代碼>>>
void?bsp_uart2_dmarx_config(uint8_t?*mem_addr,?uint32_t?mem_size)
{
???DMA_InitTypeDef?DMA_InitStructure;
?
?DMA_DeInit(DMA1_Channel5);?
?DMA_Cmd(DMA1_Channel5,?DISABLE);
?DMA_InitStructure.DMA_PeripheralBaseAddr??=?(uint32_t)&(USART2->RDR);/*?UART2接收數(shù)據(jù)地址?*/
?DMA_InitStructure.DMA_MemoryBaseAddr???=?(uint32_t)mem_addr;?/*?接收buf?*/
?DMA_InitStructure.DMA_DIR??????=?DMA_DIR_PeripheralSRC;??/*?傳輸方向:外設(shè)->內(nèi)存?*/
?DMA_InitStructure.DMA_BufferSize????=?mem_size;?/*?接收buf大小?*/
?DMA_InitStructure.DMA_PeripheralInc???=?DMA_PeripheralInc_Disable;?
?DMA_InitStructure.DMA_MemoryInc????=?DMA_MemoryInc_Enable;?
?DMA_InitStructure.DMA_PeripheralDataSize??=?DMA_PeripheralDataSize_Byte;?
?DMA_InitStructure.DMA_MemoryDataSize???=?DMA_MemoryDataSize_Byte;
?DMA_InitStructure.DMA_Mode??????=?DMA_Mode_Circular;?/*?連續(xù)模式?*/
?DMA_InitStructure.DMA_Priority?????=?DMA_Priority_VeryHigh;?
?DMA_InitStructure.DMA_M2M??????=?DMA_M2M_Disable;?
?DMA_Init(DMA1_Channel5,?&DMA_InitStructure);?
?DMA_ITConfig(DMA1_Channel5,?DMA_IT_TC|DMA_IT_HT|DMA_IT_TE,?ENABLE);/*?使能DMA半滿、溢滿、錯誤中斷?*/
?DMA_ClearFlag(DMA1_IT_TC5);?/*?清除相關(guān)狀態(tài)標(biāo)識?*/
?DMA_ClearFlag(DMA1_IT_HT5);
?DMA_Cmd(DMA1_Channel5,?ENABLE);?
}

DMA 錯誤中斷“DMA_IT_TE”,一般用于前期調(diào)試使用,用于檢查DMA出現(xiàn)錯誤的次數(shù),發(fā)布軟件可以不使能該中斷。

5.3 接收處理

基于上述描述機(jī)制,DMA方式接收串口數(shù)據(jù),有三種中斷場景需要CPU去將buf數(shù)據(jù)拷貝到fifo中,分別是:

  • DMA通道buf溢滿(傳輸完成)場景
  • DMA通道buf半滿場景
  • 串口空閑中斷場景

前兩者場景,前面文章已經(jīng)描述。串口空閑中斷指的是,數(shù)據(jù)傳輸完成后,串口監(jiān)測到一段時間內(nèi)沒有數(shù)據(jù)進(jìn)來,則觸發(fā)產(chǎn)生的中斷信號。

5.3 .1 接收數(shù)據(jù)大小

數(shù)據(jù)傳輸過程是隨機(jī)的,數(shù)據(jù)大小也是不定的,存在幾類情況:

  • 數(shù)據(jù)剛好是DMA接收buf的整數(shù)倍,這是理想的狀態(tài)
  • 數(shù)據(jù)量小于DMA接收buf或者小于接收buf的一半,此時會觸發(fā)串口空閑中斷

因此,我們需根據(jù)“DMA通道buf大小”、“DMA通道buf剩余空間大小”、“上一次接收的總數(shù)據(jù)大小”來計算當(dāng)前接收的數(shù)據(jù)大小。

/*?獲取DMA通道接收buf剩余空間大小?*/
uint16_t?DMA_GetCurrDataCounter(DMA_Channel_TypeDef*?DMAy_Channelx);

DMA通道buf溢滿場景計算

接收數(shù)據(jù)大小?=?DMA通道buf大小?-?上一次接收的總數(shù)據(jù)大小

DMA通道buf溢滿中斷處理函數(shù):

左右滑動查看全部代碼>>>

void?uart_dmarx_done_isr(uint8_t?uart_id)
{
???uint16_t?recv_size;
?
?recv_size?=?s_uart_dev[uart_id].dmarx_buf_size?-?s_uart_dev[uart_id].last_dmarx_size;

?fifo_write(&s_uart_dev[uart_id].rx_fifo,?
???????(const?uint8_t?*)&(s_uart_dev[uart_id].dmarx_buf[s_uart_dev[uart_id].last_dmarx_size]),?recv_size);

?s_uart_dev[uart_id].last_dmarx_size?=?0;
}

DMA通道buf半滿場景計算

接收數(shù)據(jù)大小?=?DMA通道接收總數(shù)據(jù)大小?-?上一次接收的總數(shù)據(jù)大小
DMA通道接收總數(shù)據(jù)大小?=?DMA通道buf大小?-?DMA通道buf剩余空間大小

DMA通道buf半滿中斷處理函數(shù):

左右滑動查看全部代碼>>>

void?uart_dmarx_half_done_isr(uint8_t?uart_id)
{
???uint16_t?recv_total_size;
???uint16_t?recv_size;
?
?if(uart_id?==?0)
?{
????recv_total_size?=?s_uart_dev[uart_id].dmarx_buf_size?-?bsp_uart1_get_dmarx_buf_remain_size();
?}
?else?if?(uart_id?==?1)
?{
??recv_total_size?=?s_uart_dev[uart_id].dmarx_buf_size?-?bsp_uart2_get_dmarx_buf_remain_size();
?}
?recv_size?=?recv_total_size?-?s_uart_dev[uart_id].last_dmarx_size;
?
?fifo_write(&s_uart_dev[uart_id].rx_fifo,?
???????(const?uint8_t?*)&(s_uart_dev[uart_id].dmarx_buf[s_uart_dev[uart_id].last_dmarx_size]),?recv_size);
?s_uart_dev[uart_id].last_dmarx_size?=?recv_total_size;/*?記錄接收總數(shù)據(jù)大小?*/
}

串口空閑中斷場景計算

串口空閑中斷場景的接收數(shù)據(jù)計算與“DMA通道buf半滿場景”計算方式是一樣的。

串口空閑中斷處理函數(shù):

左右滑動查看全部代碼>>>

void?uart_dmarx_idle_isr(uint8_t?uart_id)
{
???uint16_t?recv_total_size;
???uint16_t?recv_size;
?
?if(uart_id?==?0)
?{
????recv_total_size?=?s_uart_dev[uart_id].dmarx_buf_size?-?bsp_uart1_get_dmarx_buf_remain_size();
?}
?else?if?(uart_id?==?1)
?{
??recv_total_size?=?s_uart_dev[uart_id].dmarx_buf_size?-?bsp_uart2_get_dmarx_buf_remain_size();
?}
?recv_size?=?recv_total_size?-?s_uart_dev[uart_id].last_dmarx_size;
?s_UartTxRxCount[uart_id*2+1]?+=?recv_size;
?fifo_write(&s_uart_dev[uart_id].rx_fifo,?
???????(const?uint8_t?*)&(s_uart_dev[uart_id].dmarx_buf[s_uart_dev[uart_id].last_dmarx_size]),?recv_size);
?s_uart_dev[uart_id].last_dmarx_size?=?recv_total_size;
}

注:串口空閑中斷處理函數(shù),除了將數(shù)據(jù)拷貝到串口接收fifo中,還可以增加特殊處理,如作為串口數(shù)據(jù)傳輸完成標(biāo)識、不定長度數(shù)據(jù)處理等等。

5.3.2 接收數(shù)據(jù)偏移地址

將有效數(shù)據(jù)拷貝到fifo中,除了需知道有效數(shù)據(jù)大小外,還需知道數(shù)據(jù)存儲于DMA 接收buf的偏移地址。

有效數(shù)據(jù)偏移地址只需記錄上一次接收的總大小即,可,在DMA通道buf全滿中斷處理函數(shù)將該值清零,因為下一次數(shù)據(jù)將從buf的開頭存儲。

在DMA通道buf溢滿中斷處理函數(shù)中將數(shù)據(jù)偏移地址清零:

void?uart_dmarx_done_isr(uint8_t?uart_id)
{
??/*?todo?*/
?s_uart_dev[uart_id].last_dmarx_size?=?0;
}

5.4 應(yīng)用讀取串口數(shù)據(jù)方法

經(jīng)過前面的處理步驟,已將串口數(shù)據(jù)拷貝至接收fifo,應(yīng)用程序任務(wù)只需從fifo獲取數(shù)據(jù)進(jìn)行處理。前提是,處理效率必須大于DAM接收搬運數(shù)據(jù)的效率,否則導(dǎo)致數(shù)據(jù)丟失或者被覆蓋處理。

6 串口DMA發(fā)送

6.1 基本流程

串口發(fā)送流程圖

6.2 相關(guān)配置

關(guān)鍵步驟

【1】初始化串口

【2】使能串口DMA發(fā)送模式

【3】配置DMA發(fā)送通道,這一步無需在初始化設(shè)置,有數(shù)據(jù)需要發(fā)送時才配置使能DMA發(fā)送通道

UART2 DMA模式發(fā)送配置代碼如下,與其他外設(shè)使用DMA的配置基本一致,留意關(guān)鍵配置:

  • 串口發(fā)送是,DMA通道工作模式設(shè)為單次模式(正常模式),每次需要發(fā)送數(shù)據(jù)時重新配置DMA
  • 使能DMA通道傳輸完成中斷,利用該中斷信息處理一些必要的任務(wù),如清空發(fā)送狀態(tài)、啟動下一次傳輸
  • 啟動DMA通道前清空相關(guān)狀態(tài)標(biāo)識,防止首次傳輸錯亂數(shù)據(jù)
左右滑動查看全部代碼>>>
void?bsp_uart2_dmatx_config(uint8_t?*mem_addr,?uint32_t?mem_size)
{
???DMA_InitTypeDef?DMA_InitStructure;
?
?DMA_DeInit(DMA1_Channel4);
?DMA_Cmd(DMA1_Channel4,?DISABLE);
?DMA_InitStructure.DMA_PeripheralBaseAddr??=?(uint32_t)&(USART2->TDR);/*?UART2發(fā)送數(shù)據(jù)地址?*/
?DMA_InitStructure.DMA_MemoryBaseAddr???=?(uint32_t)mem_addr;??/*?發(fā)送數(shù)據(jù)buf?*/
?DMA_InitStructure.DMA_DIR??????=?DMA_DIR_PeripheralDST;??/*?傳輸方向:內(nèi)存->外設(shè)?*/
?DMA_InitStructure.DMA_BufferSize????=?mem_size;????/*?發(fā)送數(shù)據(jù)buf大小?*/
?DMA_InitStructure.DMA_PeripheralInc???=?DMA_PeripheralInc_Disable;?
?DMA_InitStructure.DMA_MemoryInc????=?DMA_MemoryInc_Enable;?
?DMA_InitStructure.DMA_PeripheralDataSize??=?DMA_PeripheralDataSize_Byte;?
?DMA_InitStructure.DMA_MemoryDataSize???=?DMA_MemoryDataSize_Byte;
?DMA_InitStructure.DMA_Mode??????=?DMA_Mode_Normal;???/*?單次模式?*/
?DMA_InitStructure.DMA_Priority?????=?DMA_Priority_High;??
?DMA_InitStructure.DMA_M2M??????=?DMA_M2M_Disable;?
?DMA_Init(DMA1_Channel4,?&DMA_InitStructure);??
?DMA_ITConfig(DMA1_Channel4,?DMA_IT_TC|DMA_IT_TE,?ENABLE);?/*?使能傳輸完成中斷、錯誤中斷?*/
?DMA_ClearFlag(DMA1_IT_TC4);?/*?清除發(fā)送完成標(biāo)識?*/
?DMA_Cmd(DMA1_Channel4,?ENABLE);?/*?啟動DMA發(fā)送?*/
}

6.3 發(fā)送處理

串口待發(fā)送數(shù)據(jù)存于發(fā)送fifo中,發(fā)送處理函數(shù)需要做的的任務(wù)就是循環(huán)查詢發(fā)送fifo是否存在數(shù)據(jù),如存在則將該數(shù)據(jù)拷貝到DMA發(fā)送buf中,然后啟動DMA傳輸。

前提是需要等待上一次DMA傳輸完畢,即是DMA接收到DMA傳輸完成中斷信號"DMA_IT_TC"

串口發(fā)送處理函數(shù):

左右滑動查看全部代碼>>>

void?uart_poll_dma_tx(uint8_t?uart_id)
{
???uint16_t?size?=?0;
?
?if?(0x01?==?s_uart_dev[uart_id].status)
????{
????????return;
????}
?size?=?fifo_read(&s_uart_dev[uart_id].tx_fifo,?s_uart_dev[uart_id].dmatx_buf,
??????s_uart_dev[uart_id].dmatx_buf_size);
?if?(size?!=?0)
?{
????????s_UartTxRxCount[uart_id*2+0]?+=?size;
????if?(uart_id?==?0)
??{
????????????s_uart_dev[uart_id].status?=?0x01;?/*?DMA發(fā)送狀態(tài)?*/
?????bsp_uart1_dmatx_config(s_uart_dev[uart_id].dmatx_buf,?size);
??}
??else?if?(uart_id?==?1)
??{
????????????s_uart_dev[uart_id].status?=?0x01;?/*?DMA發(fā)送狀態(tài),必須在使能DMA傳輸前置位,否則有可能DMA已經(jīng)傳輸并進(jìn)入中斷?*/
???bsp_uart2_dmatx_config(s_uart_dev[uart_id].dmatx_buf,?size);
??}
?}
}
  • 注意發(fā)送狀態(tài)標(biāo)識,必須先置為“發(fā)送狀態(tài)”,然后啟動DMA 傳輸。如果步驟反過來,在傳輸數(shù)據(jù)量少時,DMA傳輸時間短,“DMA_IT_TC”中斷可能比“發(fā)送狀態(tài)標(biāo)識置位”先執(zhí)行,導(dǎo)致程序誤判DMA一直處理發(fā)送狀態(tài)(發(fā)送標(biāo)識無法被清除)。

注:關(guān)于DMA發(fā)送數(shù)據(jù)啟動函數(shù),有些博客文章描述只需改變DMA發(fā)送buf的大小即可;經(jīng)過測試發(fā)現(xiàn),該方法在發(fā)送數(shù)據(jù)量較小時可行,數(shù)據(jù)量大后,導(dǎo)致發(fā)送失敗,而且不會觸發(fā)DMA發(fā)送完成中斷。因此,可靠辦法是:每次啟動DMA發(fā)送,重新配置DMA通道所有參數(shù)。該步驟只是配置寄存器過程,實質(zhì)上不會占用很多CPU執(zhí)行時間。

DMA傳輸完成中斷處理函數(shù):

void?uart_dmatx_done_isr(uint8_t?uart_id)
{
??s_uart_dev[uart_id].status?=?0;?/*?清空DMA發(fā)送狀態(tài)標(biāo)識?*/
}

上述串口發(fā)送處理函數(shù)可以在幾種情況調(diào)用:

  • 主線程任務(wù)調(diào)用,前提是線程不能被其他任務(wù)阻塞,否則導(dǎo)致fifo溢出
void?thread(void)
{
????uart_poll_dma_tx(DEV_UART1);
????uart_poll_dma_tx(DEV_UART2);
}
  • 定時器中斷中調(diào)用
void?TIMx_IRQHandler(void)
{
????uart_poll_dma_tx(DEV_UART1);
????uart_poll_dma_tx(DEV_UART2);
}
  • DMA通道傳輸完成中斷中調(diào)用
void?DMA1_Channel4_5_IRQHandler(void)
{
?if(DMA_GetITStatus(DMA1_IT_TC4))
?{
??UartDmaSendDoneIsr(UART_2);
??DMA_ClearFlag(DMA1_FLAG_TC4);
??uart_poll_dma_tx(DEV_UART2);
?}
}

每次拷貝多少數(shù)據(jù)量到DMA發(fā)送buf:

關(guān)于這個問題,與具體應(yīng)用場景有關(guān),遵循的原則就是:只要發(fā)送fifo的數(shù)據(jù)量大于等于DMA發(fā)送buf的大小,就應(yīng)該填滿DMA發(fā)送buf,然后啟動DMA傳輸,這樣才能充分發(fā)揮會DMA性能。

因此,需兼顧每次DMA傳輸?shù)男屎痛跀?shù)據(jù)流實時性,參考著幾類實現(xiàn):

  • 周期查詢發(fā)送fifo數(shù)據(jù),啟動DMA傳輸,充分利用DMA發(fā)送效率,但可能降低串口數(shù)據(jù)流實時性
  • 實時查詢發(fā)送fifo數(shù)據(jù),加上超時處理,理想的方法
  • 在DMA傳輸完成中斷中處理,保證實時連續(xù)數(shù)據(jù)流

7 串口設(shè)備

7.1 數(shù)據(jù)結(jié)構(gòu)

/*?串口設(shè)備數(shù)據(jù)結(jié)構(gòu)?*/
typedef?struct
{

?uint8_t?status;???/*?發(fā)送狀態(tài)?*/
?_fifo_t?tx_fifo;??/*?發(fā)送fifo?*/
?_fifo_t?rx_fifo;??/*?接收fifo?*/
?uint8_t?*dmarx_buf;??/*?dma接收緩存?*/
?uint16_t?dmarx_buf_size;/*?dma接收緩存大小*/
?uint8_t?*dmatx_buf;??/*?dma發(fā)送緩存?*/
?uint16_t?dmatx_buf_size;/*?dma發(fā)送緩存大小?*/
?uint16_t?last_dmarx_size;/*?dma上一次接收數(shù)據(jù)大小?*/
}uart_device_t;

7.2 對外接口

左右滑動查看全部代碼>>>
/*?串口注冊初始化函數(shù)?*/
void?uart_device_init(uint8_t?uart_id)
{
???if?(uart_id?==?1)
?{
??/*?配置串口2收發(fā)fifo?*/
??fifo_register(&s_uart_dev[uart_id].tx_fifo,?&s_uart2_tx_buf[0],?
??????????????????????sizeof(s_uart2_tx_buf),?fifo_lock,?fifo_unlock);
??fifo_register(&s_uart_dev[uart_id].rx_fifo,?&s_uart2_rx_buf[0],?
??????????????????????sizeof(s_uart2_rx_buf),?fifo_lock,?fifo_unlock);
??
??/*?配置串口2?DMA收發(fā)buf?*/
??s_uart_dev[uart_id].dmarx_buf?=?&s_uart2_dmarx_buf[0];
??s_uart_dev[uart_id].dmarx_buf_size?=?sizeof(s_uart2_dmarx_buf);
??s_uart_dev[uart_id].dmatx_buf?=?&s_uart2_dmatx_buf[0];
??s_uart_dev[uart_id].dmatx_buf_size?=?sizeof(s_uart2_dmatx_buf);
??bsp_uart2_dmarx_config(s_uart_dev[uart_id].dmarx_buf,?
??????????sizeof(s_uart2_dmarx_buf));
??s_uart_dev[uart_id].status??=?0;
?}
}

/*?串口發(fā)送函數(shù)?*/
uint16_t?uart_write(uint8_t?uart_id,?const?uint8_t?*buf,?uint16_t?size)
{
?return?fifo_write(&s_uart_dev[uart_id].tx_fifo,?buf,?size);
}

/*?串口讀取函數(shù)?*/
uint16_t?uart_read(uint8_t?uart_id,?uint8_t?*buf,?uint16_t?size)
{
?return?fifo_read(&s_uart_dev[uart_id].rx_fifo,?buf,?size);
}

8 相關(guān)文章

依賴的fifo參考該文章:

通用環(huán)形緩沖區(qū)模塊:

https://acuity.blog.csdn.net/article/details/78902689

9 完整源碼

代碼倉庫:

https://github.com/Prry/stm32f0-uart-dma

串口&DMA底層配置:

左右滑動查看全部代碼>>>

#include?
#include?
#include?
#include?"stm32f0xx.h"
#include?"bsp_uart.h"

/**
?*?@brief??
?*?@param??
?*?@retval?
?*/

static?void?bsp_uart1_gpio_init(void)
{
????GPIO_InitTypeDef????GPIO_InitStructure;
#if?0
?RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,?ENABLE);
?
????GPIO_PinAFConfig(GPIOB,?GPIO_PinSource6,?GPIO_AF_0);
????GPIO_PinAFConfig(GPIOB,?GPIO_PinSource7,?GPIO_AF_0);?
?
?GPIO_InitStructure.GPIO_Pin??=?GPIO_Pin_6?|?GPIO_Pin_7;
????GPIO_InitStructure.GPIO_Mode??=?GPIO_Mode_AF;
?GPIO_InitStructure.GPIO_OType??=?GPIO_OType_PP;
????GPIO_InitStructure.GPIO_Speed???=?GPIO_Speed_Level_3;
????GPIO_InitStructure.GPIO_PuPd??=?GPIO_PuPd_UP;
????GPIO_Init(GPIOB,?&GPIO_InitStructure);
#else
?RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,?ENABLE);
?
????GPIO_PinAFConfig(GPIOB,?GPIO_PinSource9,?GPIO_AF_1);
????GPIO_PinAFConfig(GPIOB,?GPIO_PinSource10,?GPIO_AF_1);?
?
?GPIO_InitStructure.GPIO_Pin??=?GPIO_Pin_9?|?GPIO_Pin_10;
????GPIO_InitStructure.GPIO_Mode??=?GPIO_Mode_AF;
?GPIO_InitStructure.GPIO_OType??=?GPIO_OType_PP;
????GPIO_InitStructure.GPIO_Speed???=?GPIO_Speed_Level_3;
????GPIO_InitStructure.GPIO_PuPd??=?GPIO_PuPd_UP;
????GPIO_Init(GPIOA,?&GPIO_InitStructure);
#endif
}

/**
?*?@brief??
?*?@param??
?*?@retval?
?*/

static?void?bsp_uart2_gpio_init(void)
{
?GPIO_InitTypeDef?GPIO_InitStructure;
?
?RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,?ENABLE);
?
?GPIO_PinAFConfig(GPIOA,?GPIO_PinSource2,?GPIO_AF_1);
?GPIO_PinAFConfig(GPIOA,?GPIO_PinSource3,?GPIO_AF_1);
?
?GPIO_InitStructure.GPIO_Pin???=?GPIO_Pin_2?|?GPIO_Pin_3;
?GPIO_InitStructure.GPIO_Mode??=?GPIO_Mode_AF;
?GPIO_InitStructure.GPIO_OType?=?GPIO_OType_PP;
?GPIO_InitStructure.GPIO_Speed?=?GPIO_Speed_10MHz;
?GPIO_InitStructure.GPIO_PuPd??=?GPIO_PuPd_UP;
?GPIO_Init(GPIOA,?&GPIO_InitStructure);
}

/**
?*?@brief??
?*?@param??
?*?@retval?
?*/

void?bsp_uart1_init(void)
{
?USART_InitTypeDef?USART_InitStructure;
?NVIC_InitTypeDef?NVIC_InitStructure;
?
?bsp_uart1_gpio_init();
?
?/*?使能串口和DMA時鐘?*/
?RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,?ENABLE);
?RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,?ENABLE);
?
?USART_InitStructure.USART_BaudRate????????????=?57600;
?USART_InitStructure.USART_WordLength??????????=?USART_WordLength_8b;
?USART_InitStructure.USART_StopBits????????????=?USART_StopBits_1;
?USART_InitStructure.USART_Parity??????????????=?USART_Parity_No;
?USART_InitStructure.USART_HardwareFlowControl?=?USART_HardwareFlowControl_None;
?USART_InitStructure.USART_Mode????????????????=?USART_Mode_Rx?|?USART_Mode_Tx;
?USART_Init(USART1,?&USART_InitStructure);
?
?USART_ITConfig(USART1,?USART_IT_IDLE,?ENABLE);?/*?使能空閑中斷?*/
?USART_OverrunDetectionConfig(USART1,?USART_OVRDetection_Disable);
?
?USART_Cmd(USART1,?ENABLE);
?USART_DMACmd(USART1,?USART_DMAReq_Rx|USART_DMAReq_Tx,?ENABLE);?/*?使能DMA收發(fā)?*/

?/*?串口中斷?*/
?NVIC_InitStructure.NVIC_IRQChannel?????????=?USART1_IRQn;
?NVIC_InitStructure.NVIC_IRQChannelPriority?=?2;
?NVIC_InitStructure.NVIC_IRQChannelCmd??????=?ENABLE;
?NVIC_Init(&NVIC_InitStructure);

?/*?DMA中斷?*/
???NVIC_InitStructure.NVIC_IRQChannel??????=?DMA1_Channel2_3_IRQn;???????
???NVIC_InitStructure.NVIC_IRQChannelPriority?=?0;?
?NVIC_InitStructure.NVIC_IRQChannelCmd??????=?ENABLE;
???NVIC_Init(&NVIC_InitStructure);
}

/**
?*?@brief??
?*?@param??
?*?@retval?
?*/

void?bsp_uart2_init(void)
{
?USART_InitTypeDef?USART_InitStructure;
?NVIC_InitTypeDef?NVIC_InitStructure;
?
?bsp_uart2_gpio_init();
?
?/*?使能串口和DMA時鐘?*/
?RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,?ENABLE);
?RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,?ENABLE);

?USART_InitStructure.USART_BaudRate????????????=?57600;
?USART_InitStructure.USART_WordLength??????????=?USART_WordLength_8b;
?USART_InitStructure.USART_StopBits????????????=?USART_StopBits_1;
?USART_InitStructure.USART_Parity??????????????=?USART_Parity_No;
?USART_InitStructure.USART_HardwareFlowControl?=?USART_HardwareFlowControl_None;
?USART_InitStructure.USART_Mode????????????????=?USART_Mode_Rx?|?USART_Mode_Tx;
?USART_Init(USART2,?&USART_InitStructure);
?
?USART_ITConfig(USART2,?USART_IT_IDLE,?ENABLE);?/*?使能空閑中斷?*/
?USART_OverrunDetectionConfig(USART2,?USART_OVRDetection_Disable);
?
?USART_Cmd(USART2,?ENABLE);
?USART_DMACmd(USART2,?USART_DMAReq_Rx|USART_DMAReq_Tx,?ENABLE);??/*?使能DMA收發(fā)?*/

?/*?串口中斷?*/
?NVIC_InitStructure.NVIC_IRQChannel?????????=?USART2_IRQn;
?NVIC_InitStructure.NVIC_IRQChannelPriority?=?2;
?NVIC_InitStructure.NVIC_IRQChannelCmd??????=?ENABLE;
?NVIC_Init(&NVIC_InitStructure);

?/*?DMA中斷?*/
?NVIC_InitStructure.NVIC_IRQChannel?????????=?DMA1_Channel4_5_IRQn;???????
???NVIC_InitStructure.NVIC_IRQChannelPriority?=?0;?
?NVIC_InitStructure.NVIC_IRQChannelCmd??????=?ENABLE;
???NVIC_Init(&NVIC_InitStructure);
}

void?bsp_uart1_dmatx_config(uint8_t?*mem_addr,?uint32_t?mem_size)
{
???DMA_InitTypeDef?DMA_InitStructure;
?
?DMA_DeInit(DMA1_Channel2);
?DMA_Cmd(DMA1_Channel2,?DISABLE);
?DMA_InitStructure.DMA_PeripheralBaseAddr??=?(uint32_t)&(USART1->TDR);
?DMA_InitStructure.DMA_MemoryBaseAddr???=?(uint32_t)mem_addr;?
?DMA_InitStructure.DMA_DIR??????=?DMA_DIR_PeripheralDST;??/*?傳輸方向:內(nèi)存->外設(shè)?*/
?DMA_InitStructure.DMA_BufferSize????=?mem_size;?
?DMA_InitStructure.DMA_PeripheralInc???=?DMA_PeripheralInc_Disable;?
?DMA_InitStructure.DMA_MemoryInc????=?DMA_MemoryInc_Enable;?
?DMA_InitStructure.DMA_PeripheralDataSize??=?DMA_PeripheralDataSize_Byte;?
?DMA_InitStructure.DMA_MemoryDataSize???=?DMA_MemoryDataSize_Byte;
?DMA_InitStructure.DMA_Mode??????=?DMA_Mode_Normal;?
?DMA_InitStructure.DMA_Priority?????=?DMA_Priority_High;?
?DMA_InitStructure.DMA_M2M??????=?DMA_M2M_Disable;?
?DMA_Init(DMA1_Channel2,?&DMA_InitStructure);??
?DMA_ITConfig(DMA1_Channel2,?DMA_IT_TC|DMA_IT_TE,?ENABLE);?
?DMA_ClearFlag(DMA1_IT_TC2);?/*?清除發(fā)送完成標(biāo)識?*/
?DMA_Cmd(DMA1_Channel2,?ENABLE);?
}

void?bsp_uart1_dmarx_config(uint8_t?*mem_addr,?uint32_t?mem_size)
{
???DMA_InitTypeDef?DMA_InitStructure;
?
?DMA_DeInit(DMA1_Channel3);?
?DMA_Cmd(DMA1_Channel3,?DISABLE);
?DMA_InitStructure.DMA_PeripheralBaseAddr??=?(uint32_t)&(USART1->RDR);
?DMA_InitStructure.DMA_MemoryBaseAddr???=?(uint32_t)mem_addr;?
?DMA_InitStructure.DMA_DIR??????=?DMA_DIR_PeripheralSRC;??/*?傳輸方向:外設(shè)->內(nèi)存?*/
?DMA_InitStructure.DMA_BufferSize????=?mem_size;?
?DMA_InitStructure.DMA_PeripheralInc???=?DMA_PeripheralInc_Disable;?
?DMA_InitStructure.DMA_MemoryInc????=?DMA_MemoryInc_Enable;?
?DMA_InitStructure.DMA_PeripheralDataSize??=?DMA_PeripheralDataSize_Byte;?
?DMA_InitStructure.DMA_MemoryDataSize???=?DMA_MemoryDataSize_Byte;
?DMA_InitStructure.DMA_Mode??????=?DMA_Mode_Circular;?
?DMA_InitStructure.DMA_Priority?????=?DMA_Priority_VeryHigh;?
?DMA_InitStructure.DMA_M2M??????=?DMA_M2M_Disable;?
?DMA_Init(DMA1_Channel3,?&DMA_InitStructure);?
?DMA_ITConfig(DMA1_Channel3,?DMA_IT_TC|DMA_IT_HT|DMA_IT_TE,?ENABLE);/*?使能DMA半滿、全滿、錯誤中斷?*/
?DMA_ClearFlag(DMA1_IT_TC3);
?DMA_ClearFlag(DMA1_IT_HT3);
?DMA_Cmd(DMA1_Channel3,?ENABLE);?
}

uint16_t?bsp_uart1_get_dmarx_buf_remain_size(void)
{
?return?DMA_GetCurrDataCounter(DMA1_Channel3);?/*?獲取DMA接收buf剩余空間?*/
}

void?bsp_uart2_dmatx_config(uint8_t?*mem_addr,?uint32_t?mem_size)
{
???DMA_InitTypeDef?DMA_InitStructure;
?
?DMA_DeInit(DMA1_Channel4);
?DMA_Cmd(DMA1_Channel4,?DISABLE);
?DMA_InitStructure.DMA_PeripheralBaseAddr??=?(uint32_t)&(USART2->TDR);
?DMA_InitStructure.DMA_MemoryBaseAddr???=?(uint32_t)mem_addr;?
?DMA_InitStructure.DMA_DIR??????=?DMA_DIR_PeripheralDST;??/*?傳輸方向:內(nèi)存->外設(shè)?*/
?DMA_InitStructure.DMA_BufferSize????=?mem_size;?
?DMA_InitStructure.DMA_PeripheralInc???=?DMA_PeripheralInc_Disable;?
?DMA_InitStructure.DMA_MemoryInc????=?DMA_MemoryInc_Enable;?
?DMA_InitStructure.DMA_PeripheralDataSize??=?DMA_PeripheralDataSize_Byte;?
?DMA_InitStructure.DMA_MemoryDataSize???=?DMA_MemoryDataSize_Byte;
?DMA_InitStructure.DMA_Mode??????=?DMA_Mode_Normal;?
?DMA_InitStructure.DMA_Priority?????=?DMA_Priority_High;?
?DMA_InitStructure.DMA_M2M??????=?DMA_M2M_Disable;?
?DMA_Init(DMA1_Channel4,?&DMA_InitStructure);??
?DMA_ITConfig(DMA1_Channel4,?DMA_IT_TC|DMA_IT_TE,?ENABLE);?
?DMA_ClearFlag(DMA1_IT_TC4);?/*?清除發(fā)送完成標(biāo)識?*/
?DMA_Cmd(DMA1_Channel4,?ENABLE);?
}

void?bsp_uart2_dmarx_config(uint8_t?*mem_addr,?uint32_t?mem_size)
{
???DMA_InitTypeDef?DMA_InitStructure;
?
?DMA_DeInit(DMA1_Channel5);?
?DMA_Cmd(DMA1_Channel5,?DISABLE);
?DMA_InitStructure.DMA_PeripheralBaseAddr??=?(uint32_t)&(USART2->RDR);
?DMA_InitStructure.DMA_MemoryBaseAddr???=?(uint32_t)mem_addr;?
?DMA_InitStructure.DMA_DIR??????=?DMA_DIR_PeripheralSRC;??/*?傳輸方向:外設(shè)->內(nèi)存?*/
?DMA_InitStructure.DMA_BufferSize????=?mem_size;?
?DMA_InitStructure.DMA_PeripheralInc???=?DMA_PeripheralInc_Disable;?
?DMA_InitStructure.DMA_MemoryInc????=?DMA_MemoryInc_Enable;?
?DMA_InitStructure.DMA_PeripheralDataSize??=?DMA_PeripheralDataSize_Byte;?
?DMA_InitStructure.DMA_MemoryDataSize???=?DMA_MemoryDataSize_Byte;
?DMA_InitStructure.DMA_Mode??????=?DMA_Mode_Circular;?
?DMA_InitStructure.DMA_Priority?????=?DMA_Priority_VeryHigh;?
?DMA_InitStructure.DMA_M2M??????=?DMA_M2M_Disable;?
?DMA_Init(DMA1_Channel5,?&DMA_InitStructure);?
?DMA_ITConfig(DMA1_Channel5,?DMA_IT_TC|DMA_IT_HT|DMA_IT_TE,?ENABLE);/*?使能DMA半滿、全滿、錯誤中斷?*/
?DMA_ClearFlag(DMA1_IT_TC5);
?DMA_ClearFlag(DMA1_IT_HT5);
?DMA_Cmd(DMA1_Channel5,?ENABLE);?
}

uint16_t?bsp_uart2_get_dmarx_buf_remain_size(void)
{
?return?DMA_GetCurrDataCounter(DMA1_Channel5);?/*?獲取DMA接收buf剩余空間?*/
}

壓力測試:

  • 1.5Mbps波特率,串口助手每毫秒發(fā)送1k字節(jié)數(shù)據(jù),stm32f0 DMA接收數(shù)據(jù),再通過DMA發(fā)送回串口助手,毫無壓力。
  • 1.5Mbps波特率,可傳輸大文件測試,將接收數(shù)據(jù)保存為文件,與源文件比較。
  • 串口高波特率測試需要USB轉(zhuǎn)TLL工具及串口助手都支持才可行,推薦CP2102、FT232芯片的USB轉(zhuǎn)TTL工具。
1.5Mbps串口回環(huán)壓力測試


原文鏈接:https://blog.csdn.net/qq_20553613/article/details/108367512


關(guān)注公眾號,加星標(biāo),回復(fù)1024獲取學(xué)習(xí)資料,每天進(jìn)步一點點。


聲明:

本號原創(chuàng)、轉(zhuǎn)載的文章、圖片等版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。

?

關(guān)注、點贊、在看、轉(zhuǎn)發(fā),支持優(yōu)質(zhì)內(nèi)容!?

評論
  • 在前六期中,我們已經(jīng)分別討論了 CRA 的適用范圍、整體影響、漏洞通報義務(wù)、風(fēng)險評估與技術(shù)文檔證據(jù)鏈、第三方組件與 SBOM 供應(yīng)鏈治理,以及產(chǎn)品上市后的支持期、安全更新、用戶說明和終止支持管理。到這里,企業(yè)已經(jīng)能夠回答幾個核心問題:產(chǎn)品是否落入 CRA 適用范圍,產(chǎn)品由哪些組件構(gòu)成,企業(yè)如何證明自己在設(shè)計、開發(fā)和上市前采取了必要的安全措施,以及產(chǎn)品上市后如何持續(xù)維護(hù)和安全下線。但對于真正準(zhǔn)備落地 CRA 合規(guī)的企業(yè)來說,還有一個更現(xiàn)實的問題:CRA 的法規(guī)條文相對原則化,企業(yè)應(yīng)當(dāng)如何把“網(wǎng)絡(luò)安
    虹科云科技 2026-08-03 16:51 166535瀏覽
  • 在EMC測試過程中,傳導(dǎo)發(fā)射(Conducted Emission,CE)超標(biāo)是工程師最常遇到的問題之一。更令人頭疼的是,同樣的超標(biāo)曲線背后,可能對應(yīng)著完全不同的干擾機(jī)理:有的是差模噪聲沿電源回路傳播,有的是共模電流通過寄生路徑耦合,還有些問題甚至并非來自電源本身,而是負(fù)載、電纜布局或接地結(jié)構(gòu)引起的連鎖反應(yīng)。 · 150kHz~1MHz 超標(biāo):多為差模噪聲為主,干擾沿火線-零線回路傳輸。 · 1MHz~30MHz 超標(biāo):通常共模噪聲占主導(dǎo),干擾通過火線/零線對地回路傳播。 如果條件允許,用電流探
    譽磁電磁兼容EMC 2026-07-31 18:45 507瀏覽
  • 摘要在防爆電氣設(shè)計中,只參照芯數(shù)選型而忽略額定載流量,長期滿負(fù)荷運行會出現(xiàn)插頭發(fā)熱、接觸面氧化、IP67 密封受熱老化等問題。結(jié)合常用 3 針 3 孔、4 芯、5PIN、8PIN 圓形防爆連接器,制作分級電流參數(shù)對照表,區(qū)分冷壓免焊接、焊接兩種接線結(jié)構(gòu)的安全載流數(shù)值,設(shè)置合理電流冗余系數(shù),搭配使用環(huán)境修正參數(shù),規(guī)范防爆接近開關(guān)連接器、防爆法蘭插座的選型計算方式。關(guān)鍵詞圓形防爆連接器,載流參數(shù)表,防爆法蘭插座,防爆端子接頭,IP67 防爆防水接插件1 產(chǎn)品概述圓形防爆連接器觸點載流能力由插針直徑、
    kyfbest科迎法電氣 2026-08-03 09:18 128645瀏覽
  • 做藍(lán)牙音箱的工程師大概都碰過這個局面。產(chǎn)品要連手機(jī)放歌,要本地播開機(jī)提示音和按鍵音,還要接 App 做配網(wǎng)和狀態(tài)上報。三件事拆開,早先的常規(guī)做法是音頻藍(lán)牙一顆料、數(shù)傳藍(lán)牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機(jī)電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍(lán)牙、BLE 數(shù)傳和 MP3 本地播放三樣全包了。對藍(lán)牙音箱來說,最實在的好處就
    唯創(chuàng)知音語音芯片 2026-08-06 15:14 293瀏覽
  • ?摘要:低價大流量卡正全面退市,政策收緊已成定局。面對傳統(tǒng)號卡的不確定性,隨身WiFi憑借穩(wěn)定連接、多設(shè)備共享、獨立設(shè)備和靈活套餐等優(yōu)勢,成為務(wù)實可靠的備選方案。1、流量卡黃金時代要結(jié)束了通信行業(yè)正迎來一場前所未有的“地震式”調(diào)整——曾讓無數(shù)用戶追捧的低價大流量卡,正在全速退出各大平臺。這早已不是一次普通的競合,而是一場趨勢性的行業(yè)洗牌。回望過去,19元200G的神卡,那時真是“睡著都能笑醒”,便宜到不敢相信,爽到忍不住炫耀。那些日子,好像隨便刷、隨便看,流量自由觸手可及。可如今,回頭再看,那種
    愛上電路設(shè)計 2026-08-03 10:21 128883瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 117556瀏覽
  • 文:杜杰編輯:侯煜當(dāng)?shù)貢r間7月28日,美國特朗普政府落地最新科技封鎖政策,美國聯(lián)邦通信委員會(FCC)正式更新《受管制清單》,新增兩大類設(shè)備——境外生產(chǎn)的先進(jìn)機(jī)器人設(shè)備、境外生產(chǎn)的聯(lián)網(wǎng)電力逆變器。FCC在官方情況說明書中明確,該類境外制造產(chǎn)品,“會對美國國家安全或美國民眾的人身安全構(gòu)成無法承受的風(fēng)險”。本次新規(guī)設(shè)置明確豁免機(jī)制:經(jīng)美國國防部(DoW)、電力逆變器品類經(jīng)美國國土安全部(DHS)審核并授予“有條件批準(zhǔn)”,認(rèn)定對應(yīng)設(shè)備品類不存在重大安全風(fēng)險,即可獲得準(zhǔn)入豁免。同時政策嚴(yán)格執(zhí)行新老劃斷原
    華爾街科技眼 2026-08-03 21:28 330瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩(wěn)定起振的成品,要經(jīng)過十幾道精密工序。它內(nèi)部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產(chǎn)過程里哪怕0.1微米的誤差,都會直接廢掉整批產(chǎn)品,這也是小尺寸晶振過去長期依賴進(jìn)口,國內(nèi)廠商花了十幾年才啃下量產(chǎn)硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 387瀏覽
  • 在物聯(lián)網(wǎng)從“萬物互聯(lián)”邁向“萬物智聯(lián)”的進(jìn)程中,LTE Cat.1憑借其在速率、成本與網(wǎng)絡(luò)覆蓋之間的完美平衡,正成為中低速物聯(lián)網(wǎng)市場的絕對主力。隨著2G/3G網(wǎng)絡(luò)的逐步退網(wǎng)以及新國標(biāo)對終端設(shè)備智能化、定位功能的強制要求,Cat.1模組迎來了爆發(fā)式的增長窗口。在這一關(guān)鍵節(jié)點,基于華為海思Hi2131芯片設(shè)計的LTE Cat.1模組,憑借其在能效、射頻、架構(gòu)及物理規(guī)格上的底層創(chuàng)新,成功打破了“高性能必高功耗”的傳統(tǒng)魔咒,為行業(yè)提供了極具競爭力的連接最優(yōu)解。核心技術(shù)優(yōu)勢:重塑Cat.1能效與連接標(biāo)桿海
    用戶1778981989717 2026-08-05 21:04 174瀏覽
  • 導(dǎo)語在現(xiàn)代高速數(shù)字電路設(shè)計中,信號的完整性已不僅是理想波形推演,而是一場與物理非理想特性正面博弈的工程實踐。濾波器芯片作為凈化傳輸鏈路的關(guān)鍵屏障,其核心挑戰(zhàn)在于:能否有效識別并濾除那些隱匿在電平跳變過程中的亞納秒級瞬態(tài)脈沖干擾,這類干擾持續(xù)極短,卻足以在高速鏈路中引發(fā)誤觸發(fā)。然而,傳統(tǒng)函數(shù)發(fā)生器受限于采樣率與邊沿速率,根本無法忠實復(fù)現(xiàn)如此狹窄且陡峭的異常波形。針對此困境,德思特TS-AWG7000系列任意波形發(fā)生器以17 GS/s采樣率與50 ps原生邊沿速度,為瞬態(tài)脈沖提供精細(xì)刻畫,配合SPG
    德思特測試測量 2026-08-05 14:06 5瀏覽
  • 產(chǎn)品使用18V供電,配套4串鋰離子電池,需要設(shè)計一個充電器。因為輸入18V,電池最高 16.8V,壓差僅 1.2V。因為壓差太小。使用開關(guān)型的充電控制芯片不穩(wěn)定。嘗試自行設(shè)計一個。整體采用分立三極管 + TL431架構(gòu),分4個功能單元:使能控制回路、限流環(huán)路、TL431 精密恒壓反饋環(huán)路、PNP 功率管主功率輸出回路;實現(xiàn)完整鋰電池充電邏輯。使能控制回路按鍵按下:5V 電壓經(jīng) R12 (2kΩ) 送入 NPN 管 Q3 基極,Q3 飽和導(dǎo)通,對地拉低 R1、R2 組成的分壓控制節(jié)點電位;該節(jié)點直
    southcreek 2026-08-07 13:45 345瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 高压监1| 黑金电影完整版| 哇嘎哇嘎哇嘎在线观看| 你是我爱人电视剧全集| 大红灯笼高高挂电影| 盛唐风流电影在线观看高清国语影视| 冲上云霄2大结局是什么| 韩国情书复古舞| 《罗丽星克迷宫》免费观看| 麻将电影| 坎贝尔电影大全免费观看| 祝福祖国歌谱| 恋爱恐惧症电视剧| 美式1984美式保罗1| 满清十大酷刑电影| 银瓶梅韩版| 新建文件夹2免费完整版| 诺言郭有才| 女大学生的心理沙龙室| 月升沧海免费观看| 坎坝奇品味人生| 魔术快斗02| 狂飙电视剧全集免费高清播放| 完美儿媳谎言短剧全集| 高清春日狂热未删减| 隐身帽子在线播放完整版电影 | 朴亚珍《隐形帽》原版在线观看| 我是刑警40集全免费看| 泽塔奥特曼第一集| 女飞行员(法国)满天星女版2011在线观看 | 知更鸟罗宾| 壮志凌云女版啄木鸟满天星法版 | 法国电影《塔日酒店》高清| 狙击蝴蝶电视剧在线观看 | 密挑在线观看| 少年派2正版全集免费观看| 年轻的妈妈5在完整有限中| 退钱哥又让退钱了| 目光所及免费观看电视剧| 《禁忌》大结局剧情| 劳拉失魂记| 圣诞节舞蹈| 大阅兵2019直播| 宅宅萝卜| 插曲的痛免费观看完整| 张大仙全球首吐| 爱唯侦察2024年最新合集| 第一滴血1| 流浪地球1在线观看完整免费高清 夫君是敌国战神:和亲公主全集免费 | 九歌 电影| 女女免费观看高清完整版电视剧| 傅玄屹魏语娴全文免费结局| 著名养猪专家姚民仆逝世| 别墅轮换2的剧情简介 | 暴躁少女在线观看免费版英文| 霹雳娇娃2| 蛇姬恋泰国电影完整版| 相亲遇见美女| 莫妮卡贝普奇牺牲最大的| 鬼宿舍电影| 晚娘全集在线观看| 男女一起愁愁愁免费观看全集高清完整版| 哭泣女人的诅咒| 荷尔蒙6在线观看免费版| 国产真人做爰视频免费| 《跛豪》粤语完整版在线看| 老酒馆电视剧剧情介绍| 《倒插门》大结局| 需要爸爸播种子电影在线观看| 木下之影| 《女超人:麦乐迪| 幸福到万家电视剧在线观看21| 刚结婚和部长一起去出差旅电影| 奔跑吧兄弟第十季| 情歌大连唱| 从职员到老板:打工人逆袭全集免费 | 一起来看流星雨36| 《女销售的销售秘诀2》| 老司机福利午夜| 生化危机终章| 向往的生活第五季第三期免费观看| 刚之炼金师| 坎贝奇三部曲| 下辈子做你的女人电视剧| 男女一起愁愁愁电视剧在线观看| 正负之间台剧免费观看| 电影在线免费观看修理工的艳遇 | 即刻上场 电视剧| 美容院的特殊待遇 在线| 埃及猫原版动画| 叼嗨片| 班杰明现状| 死神来了6完整版高清免费看| 六一儿童节儿歌| 公交车一路被C| 花与蛇2《牙医诊所》| 起飞英文| 斯巴达第四季全集免费| 胸肌撕裂者| 三年中国免费下载现看| 艰难爱情19| 轮到你了短剧合集| 追鱼传奇全集| 乖乖女被躁到失禁H| 分娩按摩《4》| 独立日 电影| 法国电影《金牌销售》在线播放 | 孩子走丢妈妈冲上舞台求助| 19岁大学生免费观看电视剧详情| 高清入间同学入魔了! 第四季| 韩国电影免费完整版高清在线观看| 赚它一千万| 动漫在线观看鬼父完整版动漫| 日本视频h| 日本一本到道免费| 恐怖故事之红豆绿豆| 小鸡快跑电影免费完整版| 国模小黎吧| 高清国家元首未删减| 好好说话电视剧免费观看完整版| 激战5李丽珍牺牲最大的一集在线播放 | 关晓彤在好先生的翘臀| 一杆枪勇闯无底洞2免费观看2023年上映时间表 | 野兽韩国在线完整版观看| 还珠格格电视剧全集免费观看| 新杨门女将赵丽颖电视剧在线观看| 开心麻花甜咸配| 落叶归根百度影音| 仔仔影视| 今夜有戏 杨紫| 红场阅兵2015直播| 哇嘎日本片免费观看视频| 裸男 疯狂猜图| 姊妹牙医完整版在线观看免费| 大掌门电视剧全集| 高跟鞋smvk| 电视剧五十玫瑰| 水晶兰为什么叫死亡之花| 痛爱当我遇上你| 云菲菲邂逅伴奏| 男女一起愁愁愁免费观看全集| 高清另一个贝内特家的姐妹| 下属的妻子电影| 沧元图第二季番外篇| 《秒速5厘米》| 巴萨0-4皇马| 曹云金相声全集| 战狼6高清完整免费观看国语| 动漫在线观看免费全集| 八尺夫人满天星1978年版| 我爱男闺蜜迅雷下载| 《模特人生》韩剧| 韩版花样男子国语版| 美丽人妻在超市被春药| 电影《财阀夫人》免费观看| 尼古拉斯尼克贝| 半是蜜糖| 高清《四大元素之大地情缘》电视剧| 河南发生重大刑案警方悬赏5万元| 17岁在线观看完整版| 坎贝奇品味人生在线观看免费高清| 小爸爸爱奇艺| 2对一商务服务| 太空堡垒国语| 落魄贵族琉璃川免费全集| 嘿咻嘿咻| 隆回县| 新红楼梦| 野花高清在线观看免费3中文 | 好妈妈高清在线播放中文| 妈妈的味道HD中字免费| 工厂蛇患| 电视剧 追踪| 电视剧《脱身》全集| 星银岛下载| 许家印最新世界排名| 云中玫瑰国语版| 天降财神国语高清| 病毒姐妹在线观看| 坠落女律师完整版在线观看| 武汉三镇主帅考虑执教国足| 牙医电影完整版2000年| 纯真时代| 一起相愁愁全集免费观看| 同门粤语| 欢乐颂电视剧免费观看全集高清版 | 斛珠夫人电视剧在线观看| 骸骨骑士大人奇幻世界冒险中| 镖行天下前传| 国色天香十七区品质怎么样| 孙子兵法三十六计| 让她降落下载| 越南腐剧《雇佣契约》| 向往的生活第五季第三期免费观看| 金瓶梅高清完整版百度影音| 谁在你背后| 门弟电视连续剧| 藏族踢踏舞组合| 夜夜狂情| 狂野的爱| 森奈奈子伦理片免费在线观看| 隋炀帝电视剧| 古剑奇谭迅雷下载| 大奉打更人免费观看| 功夫熊猫2免费观看完整版国语| 天涯左央事件| 使徒行者3粤语电视剧| 亲爱的,别!| 渔夫的荒淫史蒋玲玲版| 六指琴魔 电视剧| 《大学生按摩在线观看| 神墓在线观看全集免费观看动漫| 男生和女生在一起愁愁愁电视剧在线观看30| 日本大妈| 战狼6女版| 绝望的主妇第八季| 盛唐风流完整免费观看| 第三只眼| 美式的忌讳5—7| 快递员的特殊待遇| 儿媳妇的味道| 消失的厨神| 炸天小姐在线观看免费版高清| 不扣纽扣女孩免费观看完整电影| 革吉县| 疯狂汉堡| 天地无伦完整版| 妓院十二房| 黄金大劫案 下载| 《除恶》| 我和我的祖国免费| 瓜达卢佩的玫瑰哪里能免费看| 飞屋环游记电影国语版免费版观看| 姐妹牙医未删减版1986| 我们免费观看高清完整版日本| 混血大学生精油按摩电影完整版| 使徒行者31集| 需要爸爸播种子第二集 | 仙帝弃少:凡人皆俯首全集免费| 为了奥运会巴黎地铁椅子终于洗了| 银河护卫队圣诞特别篇| 一闪一闪亮晶晶电视剧免费观看 | 妈妈的工作5| 婚姻攻略全集免费观看| 酒店激战第10集的内容与解读| 决战中途岛评价| 赤裸的无名指| 喋血街头电影| 免费观看已满十八岁电视剧悠悠| 九一神雕侠侣| 叶玉卿电影全高清| 部长出差的日子完整版| 氪金玩家第一季免费播放| 《私人航空》在线看中文| 星汉灿烂月升沧海在线观看| 日本《乳房按摩》在线| 辣椒教室国语| 小乌酱黑白双丝脚足在线播放| 饭冈かなこ在线播放| 粉红女郎电视剧| 珠帘玉幕电视剧免费观看| 李多海的电视剧| 为防导弹攻击 东京都修地下掩体| 韩国cc| 《法国空乘4》在线观看外国色情电影| 爱的勘探法电视剧| 漂亮妈妈9中字开头歌曲| 老公我要电影免费观看| 毒医肥尸无删减在线播放第一季| 长江七号电影免费完整版在线观看| 法国空姐5免费高清原声满天星| 玉璞团之鉴宝2高清| 近距离爱上你第七集| 长相思在线观看| 《善良的妻子》| 1992在线观看| 执掌大权:豪门弃少短剧全集| 你的婚礼资源| 多乐士油漆广告| 生化危机终章| 无名高地电视剧| 青梅竹马是消防员动漫| 高清《热带雨》完整版视频| 台湾版粉红大白菜1987年| 哈哈哈哈哈哈三季| 哇嘎美国| 挚爱游戏在免费观看| xl司令第一季全集免费完整版在线观看 | 爱我几何手机高清在线免费播放 | 百万新娘之爱无悔53| 爸爸种子的秘密免费观看电视剧| 万里归途电影抢先看| 麦乐迪在线观看完整版| 杨敏思版1-5集免费观看电视剧在线观| 渔夫荒野台湾版免费观看| 粉色大白菜(法国)完整板| 渔夫荒野史电影完整版| 此时此刻台剧| 恭喜发财歌曲原唱播放| 花朵动漫| 太极藤球| 紫钗奇缘26| 舒克贝塔动画片全集| 担保韩国电影| 赖汉的幸福指数 电视剧| 龙虾店老板深夜崩溃把店砸了| 多利特的奇幻冒险| 姐妹5高清韩剧播放| 擦枪走火 电影| 一路向前1-40集免费观看| 常高兴的酸甜苦辣电视剧| 在姨妈家的客厅| 茶道少女樱花动漫| 宋小宝2022年最新小品| 《色降》关秀媚无删减| 使徒行者1电影版国语| 壮志凌云2女飞行员版在线观看| 陆小凤与花满楼结局| 棘手狂情电影完整版| 赌圣之上海滩粤语| 房东2| 大唐电视剧| 伊波拉病毒2国语版免费观看| 中国母亲电视剧| 坎贝奇的《品味人生》| 农民伯伯乡下妹完整版| 情逢敌手| 岳母的幸福生活电视剧| 欢乐颂1免费观看全集电视剧完整版 | 小城大爱电视剧| 咒术回战第一季免费高清观看| 美国的忌讳1-5| 心理测量者| 棘手狂情电影| 电影僵尸| 俄罗斯女儿与父亲相恋的电影| 不要向下看| 大胸的继拇| 向风而行在线观看| 空中世界二战| 方糖映画| 光武大帝| ‘私人女子监狱| 抗日奇侠全集播放| 《美国灭火宝贝2| 国足大连备战仅不到20名记者到场| 康体水疗完整版在线观看免费播放| 玛丽娜 阿布拉莫维奇| 罗丽星克莱尔的经典电影| 电视剧最美是你| 丫丫吃甘蔗小心翼翼| 我是真的讨厌异地恋电影在线观看| 八角笼中免费观看| 太极马畅| 火影492| 高清死亡账号| 第八个嫌疑人演员表| 法国空姐2019满天星法版在线观看免费版| 宿醉2百度影音| 炸天小姐满天星观看| 83版射雕英雄传| 田渊正浩在《社长》观看| 《秘密》电影全集| 《特殊游泳教练》| 明日之后半感染者职业| 湄公河惨案电视剧| 红字 韩国电影| 电影前度| 韩国电影韩国少妇勾引水电工| 明星有戏寻找唢呐王| 秋瓷炫《生死决断》完整版 | 韩国电影需要爸爸播种| 五十八天| 法国空姐满天星法版-佳片在线影院观看 | 乞救之噬,覆食殆尽未删减 | 功夫熊猫1国语高清| 台湾版(武松)蒋玲玲| 破梦游戏电影免费观看完整版高清| 播放电影孕妇在线观看免费| 聊斋先生25集全免费| 黑袍纠察队第一季未删减免费观看| 大姨姐在线观看| 东北插班生免费观看全集| 壮志凌云1(法国)满天星法版免费完整| 高清《鬼父上卷》1| 酒店1-75集免费播放高清| 电影版《异人之下》免费观看高清| 楼外楼电视剧| 棋士电视剧在线观看全集免费| 我们都要好好的在线观看| medoly女超人| 人民公社大食堂| 柔铺团之极宝乐| 爱国让你想起什么| 卖房子的女销售在线观看| 国产电影《突袭》在线观看| 亲吻姐姐2| 电视剧血誓全集| 谁都会说我爱你全集| 木下檀檩子伦理电影| 仙武传在线观看全集免费播放| 混血儿的摇篮曲1973| 速度与激情9英语免费观看| 东阿县| 八犬传东方八犬异闻第二季| 《地球上的星星2》| 战狼6欧式少女所有视频 | 插曲的痛免费高清观看完| 侣行攻略之确认你是我的人| 丈夫犯错妻子偿还的电影如何观看 | 美国大片国语普通话| 西城男孩经典歌曲| 欧式少女16集全集在线看视频网站| 波野结衣全集种子| 欢乐颂1免费观看全集电视剧完整版 | 高清《我的僵尸女儿》电影| 小超的农村事| 箭在弦上42| 销冠的秘密3在线| 电影《偷香》完整版| 丽卡《驯服》电影完整版| 私じゃなかったんだね谐音| 韩国电影售楼小姐| 东北黑道风云20全集| 孙菲菲我是娱乐圈霸凌事件亲历者| 梅花红桃电视剧免费观看完整版 | 俄罗斯美女学校泳池派对| 完 陈奕迅| HR版女版壮志凌云2010| 王杰的电影| 奔跑吧兄弟20141226| 朝鲜驱魔师电影在线观看免费高清| 帽子的编织方法| 《初体验5》电影完整版在线观看| 港汇跳楼| 金牌销售的秘密3hd中字| 电视剧风筝全集观看| 以家人之名在线| 赘婿全集36集资源| 有一天你会明白有些人不再回来| 丝袜社长妻子| 卢靖姗顺产36小时生下女儿| 女版战狼7在线观看999| 二婶电视剧全集| 一个人的突击队| 龙虎少年队2 电影| 星辰变在线观看完整版免费观看| 公与媳2| 电车魔女| 你的目光所及之处| 京城怪物免费观看| 部长的夫人的味道电影| 公浮之5| 海贼王480| 郝板栗《千金》免费观看| 箭侠电视剧| 《极度召唤》| 男人女人愁愁愁免费看电视剧 | 牙医姐妹郝板栗1986免费| 游击兵工厂全集| 女超人(麦乐迪)版迅雷| 飞越疯人院电影| 胜女的代价2演员表| 迁西县委书记李富贵现状如何| 母亲5免费完整版全集电视剧| 插曲的痛免费观看高清版在线观看| 继承人电视剧全集| xl司令免费全集观看| 平安唱的我爱你中国| 写写画画| 法国《空乘》2009| 韩剧拜托小姐| 女律师的坠落| 我的山与海未删减| 延禧攻略70集免费播放西瓜 | 欢迎来到实力至上主义的教室| 死神来了:血脉诅咒 电影| 玉女聊斋电影全集| 《美丽妻子替丈夫还债》韩国版剧名 | 台湾棘手狂情 在线播放| 原罪无删除全集免费版在线观看| 魔鬼恋人10| 五十玫瑰大结局| 电视连续剧爱| 男女一起愁愁愁在线视频| 勇敢的心迅雷下载| 电视剧大秦赋| 名侦探柯南在线观看免费| 少女免费观看完整电视电影 | 小丑免费| 美好的时光电视剧在线播放| 警戒线 电视剧| 天使快播| 八戒8| 梦回云南| 许我耀眼 电视剧 在线观看| 《执行秘书》正片| 好心作怪粤语24| 战狼6欧氏少女全部剧情介绍大全视频 | 致命的危机| 金助理为何那样 漫画| 加勒比海盗女海盗1在线看免费完整版 | 落翅女的黄昏电影| 木下檀檀子全部电影| 《爱丈夫更深爱着公》主演| 木下子檀檩子电影免费播放| 亲爱的热爱的2| 超时空辉夜姬!| 1—5集免费普通话版在线观看| 恋爱暴君1| 黑白配高清完整版免费观看中文版| 善良的姐姐在线播放| 狗哥短剧全集免费播放| 欧美经典黑白配在线观看| 超神学院第二集| 青川县| 东京难民| 怪医杜立德3| 爱你几何 在线| 情圣 周星驰| 情欲电车2伦理| 劳拉迷宫1997免费观看| 爱情真善美40| 绵竹市| 邢台属于几线城市| 憨豆先生在线观看| 性的暴行北越未删减版 | 欲火狂蜜| 东北往事之黑道风云全集| 二阶堂梦作品在线观看| 龙过鸡年| 金瓶悔1一5集免费| 新乱世佳人小叔吃扔扔扔哪一集 | 南北少林| 快递小哥花400万打赏女主播| 幸福到万家电视剧在线观看21 | 17.3关于X电影完整版| 步步惊心qvod| 荒岛女儿国满天星版在线观看| 风水弃少:改运旺家短剧全集| 强奸蓝洁瑛的是谁| https://www.yalan365.com/shiwutv/rindafid.html | 两个妻子国语版| 舒淇主演《玉女心》电影免费观看| 姨母家客厅| 烈焰在线观看完整版| 咒电影完整版高清免费观看| 性感的老师在线播放| 家庭教师剧场版国语| 苍老师电影大全免费观看电视剧| 极速60秒在线观看| 春风物语6| 倔强驱魔师1-4集免费观看| 陷阱电影高清完整免费韩国| 暖婚短剧全集免费观看| 王多鱼打扑克牌免费视频 | 扬思敏1一5集国语版免费| 一代女皇武则天| 一愁愁愁电视剧在线起观| 担保韩国电影| 修真界帝尊短剧全集免费观看| 《xl司令》在线观看完整版动漫| 从结婚开始恋爱1-35集免费观看| 娘家的故事第四部| 《女的心愿》台湾原版| 唐朝浪漫英雄下载| 韩国电影夫妻的世界| 灵魂符咒| 电视剧一生为奴| 花房姑娘第三季剧情介绍| 滑精怎么办| 凌云壮志女版(法国)满天星在线 | 财阀家的小儿子 电视剧| 麦乐迪《家庭矛盾》| 看见爱台剧有无删减版本| 冲上云霄2粤语全集| 1986牙医姐妹赤子板栗手机免费| 《雪花女神龙》电视剧| 波多野结全集种子| 妻子8免费观看全集完整版| 峰爆 电影| 少林寺方丈在联合国气候大会发声| 黑衣人3高清完整版下载| 红十字:女人们的入伍通知单| 酒店激战第1-5集免费观看李丽珍 《私人家教》1983版又叫什么版本 | 妻子替弟还债全集免费观看| 失控drive| 女鬼剑剑宗| 《香醇的绣感》| 筋膜黏连| 万惠文妻子孙丹丹简历| 《法国空乘2| 水饺皇后未删减| 蜀南竹海门票| 大长今在看着| 天龙高清远古电视剧在线观看 | 私人助理在线看| 《吠城》电影高清免费观看全集| 霍州市| 高清《狙击手-斯莫希军官》| 冷暖人生溺爱| 动漫《落魄贵族琉璃川》免费观看 | 影音先锋色戒| 灭门惨案ii之借种| 闲话行尸第一季| 黄色仓库电影在线免费观看| 水手服饲育| 第一次遇见花香的那刻| 《落魄贵族琉璃川》1-4集在线观看| 郑钦文第三轮比赛直播时间| 九五至尊粤语| 公公给儿媳妇的礼物| 连续剧甄嬛传| 缘来一家人第一季| 《花开半夏》电视剧| 监控还原39人遇难火灾经过| 美丽的海棠红5| 沙场归来宠家:女战神短剧全集| 我们的秘密免费观看全集| 高清《借钱》韩剧| 女员工的付出中字1230| 好事成双电视剧2023年上映| 雷霆战警| 马蒂达尔梅满天星| 电视剧长风渡全集免费观看| 空蝉之森酒法子完整版| 夏日大作战qvod| 爱逢时短剧免费播放| 韩国电影售楼处的秘密| 王牌对王牌最新| 新乌托邦韩剧在线观看| 奸魔| 再见爱人第四期在线观看| 速度与激情10 电影| 万宁市| 醉酒的玫瑰高清在线观看| 哦我的鬼神大人 电视剧| 舒淇的献身| 落魄贵族琉璃川在线观看| 金瓶梅电影 未删减版| 朋友的妻子肉H| 插曲的痛免费播放完整| 春心荡漾在线观看完整版| 评书岳飞传刘兰芳| 岑溪市| xl司令第一季无马赛免费| 血洛大陆| 美国式禁忌在线播放| 《伊波拉病毒》普通话| 夏娃的时间ova| 大江大河第二部全集免费观看| 韩国电影隐身帽子| 泰剧折翼天使| 璀璨人生全集下载| 薛丁山演员表全部| 电影伦理《法国护士长》2006| 高清《当哒当:邪视》电影| 金瓶梅1-5电视剧| 隔山有眼3免费观看完整版高清| 高清《曾少年》电视剧| 善恶无赦| 肉蔻之香| 斗罗大陆真人版电视剧全集免费| 电视剧枪神| 霸气逆袭| 出差遇到渣男前任完整版在线观看| 千尸屋2百度影音| 爱人欲望| 美容室的待遇6免费| 萧亚轩mv| 樊振东贴脸开大盛李豪| 爱恋205| 黑白配视频免费大全在线观看| 邻家娇妻文秋| 3380理论| 新金银屏1-5美国普通话| 韩剧电影免费在线播放| 这个杀手好怕丑| 法版风女管家2008版电影| 韩国女战狼| 电影《种马猎人》在线观看| 绝命交错| 美国空乘伦理4| 我的世界天堂| 非你莫属2010| 忘年恋电影在线观看免费| 朴诗妍电影免费观看| 张莜雨人体艺术照| 天鹅挽歌| 金银悔1一5普通话| 晚上睡不着看的免费| 纵有疾风起免费观看全集| 沙漠行动2007俄罗斯满天星| 亲兄热弟剧情| 日本阅兵| 海口市| 坎呗奇无憾电影| 部长和社畜的恋情令人着急电视剧| 青年医生演员表名单| 《怪盗女谍》天海翼| 变形金刚2国语版免费观看| 燕赤霞猎妖传| 山河明月全集在线播放| 《新人类毒医肥尸》免费观看 | 唐探1900电影免费观看 | 女儿为妈妈还债的电影| ごっくんする在线| 《黑色的眼泪》在线播放免费观看 | 疯狂电影在线高清观看免费| 男按摩师做乳房按摩在线观看| 搞笑漫画日和中文| 我喜欢你免费观看电视剧完整版| 美姊妹牙医 | 印度球迷撕碎C罗巨幅人像| 需要爸爸播种2在线播放免费| 恋夏38度| 制暴 电影包贝尔| 日剧《和部长一起去出差旅》中文| 刺客567第五季樱花动漫| 青春之旅电影| 黑超特警组1| 渔女实战| 电影《飞夺泸定桥》在线观看免费| 英雄本色2| 公之浮手电影免费播放| star467| 核污水排海个人防护指南| 电视剧与狼共舞第一部全集免费播放| 罗丽星克莱尔迷宫HD版免费观看| 老阿姨2免费播放电视剧大全| 蜘蛛侠之英雄无归| 意大利八尺夫人未删减版剧情简介| 徐若瑄魔鬼天使| 大地8中文在线观看免费高清成全| 一个人的武林粤语| 插曲的痛第60集| 纯情罗曼史第一季| 小明星大跟班| 夜半歌声| JIZZ.日本| 寄宿公寓2韩国电影| 霜落又识君 电视剧| 永仁县| 牝老师4| 一起再看流星雨1| 我为爱狂意大利版| 性辱女警2之未删减版| 《特殊的保险推销员》| 黑社会之龙城岁月| 哭笑不得造句| 赛仑《渔夫的妻子》| 正阳门下电视剧全集36| 偷偷藏不住免费完整版电视剧| 《花子vs倔强驱魔师》| 农村阳宅风水| 无法坦诚相对| 李晓鹏的父是谁| 淫的方程式动漫| 人民日报评电视收费乱象| 商道国语版| 《刚结婚陪部长出差的日子》| 草在结它的种子| 聊斋艳谭第3集| 超人解放| 《性的暴行》未删减版| 密室大逃脱第2季| 犯了规短剧| 流金岁月在线观看| 打扑克免费观看| star-464| 毛泽东免费| xl司令第2季无马赛免费观看高清初级| 365dni电影完整免费观看| 无边泳池| 布鲁克读大学满天星| 电影《她被丈夫的老板欺负》| 妙妙米奇屋| 上位完整版下载| 爸爸需要播种| 人民的名义 李达康| 维珍朋克:发条女孩| 狂飙在线看| 大牛战狼6免费观看高清版电影| 苏格兰牧羊犬好养吗| 超级教师| 新瓶梅| 男子充9万话费:90年都用不完| 特站先锋| 多哈十米台决赛| 女版捉鬼敢死队满天星| 绝密543免费全集(36集全)| 歌手在线观看免费完整版| 民警抓嫌犯时遭车重压身亡| 卖房子的女销售中文字幕未删减完整版在线免费观看 | 横冲直撞的游泳教练在线观看| 步步紧逼电视剧免费观看全集| 詹俊英超精华| 正阳门下全集在线观看| 劳拉迷宫1997免费观看| 杨乃武与小白菜粤语版| 人间正道是沧桑50集全免费观看 | 唤醒电影凯登克罗斯在线观看| 真命小和尚之十二铜人| 追着彩虹的我们电视剧免费观看| 有你才有家免费观看全集完整版| 按摩胸部伦理片| 唐诡西行电视剧| 剑王朝电视剧免费观看| 血誓电视剧全30集| 男女愁愁愁全集| 心宅猎人电视剧在线观看| 战火青春电视剧| 地狱空荡荡 魔鬼在人间| 1—5集免费普通话版金| 还魂第二季| 北京地铁电视剧| 天使心 徐若瑄| 金银1-5hd普通版| 由良千岁电影大全在线播放免费观看| 破烂男女在线观看电影全集免费| 武警小哥GRY2022| 哆啦a梦:大雄的宇宙英雄记| 湿润的继拇HD中文| 日本的妈妈| 搞笑一家人国语版全集| 春雨免费版在线观看全集电影 | 《裸体模特》电影| 朝鲜战争 王树增| 美国大片国语普通话| 替身电影在线观看完整版| 朋友的母亲8中语版| 张百乔向小雪求婚| 斯托雅《壮志凌云》| 无理的同居| 刘亦菲合成10p| 强奸系列电影| 木下凛凛子在线播放| 冤家亲家电视剧全集在线观看| 快播韩国电影| 雷洛五亿探长1普通话免费观看| 花蝴蝶7免费版大全多少集1到8集更新时间| 我本千金电视剧免费观看| 百日郎君| 热情邻居| 《法国空姐2024版》| 姐姐的朋友1| 凌晨三点在线播放| 扒开双腿疯狂进出爽爽爽动态照片| 《总统》星克莱尔1997年满天星在线观| 月饼来历| 泰迪熊电影完整版|