在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

MM32F0140 UART學習筆記

jf_pJlTbmA9 ? 來源:靈動MM32MCU ? 作者:靈動MM32MCU ? 2023-09-26 16:45 ? 次閱讀

UART簡介

UART是通用異步收發(fā)器,全稱為Universal Asynchronous Receiver and Transmitter,屬于異步串口通信協(xié)議的一種,能夠靈活進行全雙工數(shù)據(jù)交換。

MM32F0140的UART支持全雙工數(shù)據(jù)交換、同步單向通信、半雙工單線通信、多處理器之間的通信以及調制解調器(CTS/RTS)操作。

串行通信

串行通信是指使用一條數(shù)據(jù)線,將數(shù)據(jù)一位一位地依次傳輸,每一位數(shù)據(jù)占據(jù)一個固定的時間長度,只需要少數(shù)幾條線就可以在系統(tǒng)間交換信息。

串行通信按照數(shù)據(jù)傳輸方向分為:

● 單工通信

數(shù)據(jù)只能在一個方向上傳輸,通常采用兩線進行通信,分別是:GND、TX(發(fā)送數(shù)據(jù)輸出引腳)或RX(接收數(shù)據(jù)輸入引腳),發(fā)送設備與接收設備共地將參考電壓調節(jié)一致,MCU做發(fā)送或接收。

● 半雙工通信

相當于可切換方向的單工通信,在具體時刻,只允許數(shù)據(jù)在一個方向上傳輸,不能同時在兩個方向上傳輸。

● 全雙工通信

允許數(shù)據(jù)同時在兩個方向上傳輸,通常采用三線,分別是:GND、TX、RX,接收設備與發(fā)送設備均為雙向通信設備,若通信雙方有一方需為另一方提供電源,則兩設備的VDD相連。

異步通信

異步通信過程中,接收器和發(fā)送器使用各自的時鐘,以一個字符為傳輸單位,通信中兩個字符間的時間間隔不固定,但在同一個字符中的兩個相鄰位間的時間間隔固定,每一個字符要用起始位和停止位作為字符開始和結束的標志。

UART功能

如圖1所示,Device1做發(fā)送器,Device2做接收器進行通信,發(fā)送器對發(fā)送數(shù)據(jù)執(zhí)行“并->串”轉換,然后,數(shù)據(jù)從發(fā)送器的發(fā)送數(shù)據(jù)輸出引腳(TX)輸出,在傳輸線路上一位一位的傳輸?shù)浇邮掌鞯慕邮諗?shù)據(jù)輸入引腳(RX),接收器對接收到的數(shù)據(jù)進行“串->并”轉換。

wKgZomUD7mCAN4ULAABr3RY7zHI594.png 圖1. UART通信

數(shù)據(jù)傳輸

UART的數(shù)據(jù)傳輸如圖2所示,包含起始位、數(shù)據(jù)幀、奇偶校驗位、停止位、空閑幀與斷開幀。

● 起始位

在發(fā)送器被使能,且無數(shù)據(jù)發(fā)送時,TX引腳處于高電平,若要進行數(shù)據(jù)傳輸,發(fā)送器會在發(fā)送起始位拉低TX引腳,即將傳輸線從高電平拉到低電平并保持1個時鐘周期。

● 數(shù)據(jù)幀

數(shù)據(jù)幀包含需要傳輸?shù)臄?shù)據(jù),數(shù)據(jù)長度由UART通用控制寄存器(UART_CCR)的CHAR位配置,通常可以設置為5 ~ 8位,若不使用奇偶校驗位,數(shù)據(jù)幀長度可為9位。

發(fā)送數(shù)據(jù)需要將UART全局控制寄存器(UART_GCR)的TXEN位置1,數(shù)據(jù)從UART發(fā)送數(shù)據(jù)寄存器(UART_TDR)寫入,經(jīng)過一字節(jié)緩沖器緩沖,最后通過發(fā)送移位寄存器,以最低字節(jié)到最高字節(jié)的順序,串行在TX引腳上輸出。

接收數(shù)據(jù)需要將UART全局控制寄存器(UART_GCR)的RXEN位置1,讀UART接收數(shù)據(jù)寄存器(UART_RDR)可獲取接收到的數(shù)據(jù)并清零中斷狀態(tài)寄存器(UART_ISR)的RX_INTF(接收有效數(shù)據(jù)中斷標志)。

● 奇偶校驗位

檢驗數(shù)據(jù)中1的總個數(shù)為奇或偶,判斷傳輸器件數(shù)據(jù)是否發(fā)生改變。奇偶校驗可以通過UART通用控制寄存器(UART_CCR)的PEN位置1使能發(fā)送接收校驗,UART_CCR寄存器的PSEL位為1則數(shù)據(jù)偶校驗,PSEL位為0則數(shù)據(jù)奇校驗。

奇校驗:若數(shù)據(jù)位中1的數(shù)目是偶數(shù),則校驗位為1,如果1的數(shù)目是奇數(shù),校驗位為0。

偶校驗:若數(shù)據(jù)位中1的數(shù)目是偶數(shù),則校驗位為0,如果1的數(shù)目是奇數(shù),校驗位為1。

● 停止位

停止位用1表示一幀的結束,可通過配置UART通用控制寄存器(UART_CCR)的SPB0位設置停止位位數(shù),位數(shù)可設置為0.5、1、1.5、2個停止位。

● 空閑幀

包括停止位在內(nèi),一個完全由1組成的完整數(shù)據(jù)幀,定義為一個空閑符號,下一個數(shù)據(jù)幀的起始位跟在空閑符之后。

● 斷開幀

包括停止位在內(nèi),一個完全由0組成的完整數(shù)據(jù)幀,定義為一個斷開符號,在斷開幀結束時,發(fā)送器再發(fā)送一個停止位1,使得下一幀的起始位能夠被識別到(產(chǎn)生下降沿被檢測到)。斷開符號通過設置UART_CCR寄存器的BRK位進行發(fā)送,若BKP位置1,在當前數(shù)據(jù)發(fā)送完成后,將會發(fā)送一個斷開符號到TX引腳上。

wKgaomUD7mGAQ1tZAABe0hfRNvU263.png 圖2. UART數(shù)據(jù)傳輸

波特率

波特率表示數(shù)據(jù)傳輸速率,波特率發(fā)生器產(chǎn)生時鐘,經(jīng)過發(fā)送器和接收器的使能位置位控制后,供給發(fā)送或接收使用。對于大多數(shù)串行通信,需要將發(fā)送和接收設備的波特率設置為相同的值,若波特率不同,則發(fā)送與接收數(shù)據(jù)的時序可能受到影響。波特率的計算公式如圖3所示,UART波特率寄存器(UART_BRR)存放UART分配器除法因子(UARTDIV)的整數(shù)部分,UART分數(shù)波特率寄存器(UART_FRA)存放UARTDIV的小數(shù)部分。例如,若系統(tǒng)時鐘為48M,配置波特率為9600(每秒傳輸9600bit的數(shù)據(jù)),則(48000000 /9600) / 16的結果賦值到UART_BRR寄存器中,(48000000 / 9600) % 16的取余結果賦值到UART_FRA寄存器中。

wKgZomUD7mOATvEsAABHO-8YbcA724.png 圖3. UART的波特率公式

實驗

本實驗配置UART的基本發(fā)送與接收功能,配置時鐘速率為48MHz,波特率為9600,數(shù)據(jù)長度為8位,不使用校驗及自動流控制,設置PA9為TX引腳,PA10為RX引腳。通過串口調試工具觀察數(shù)據(jù)的傳輸,發(fā)送數(shù)據(jù)與接收數(shù)據(jù)相同。

配置系統(tǒng)時鐘 clock_init()

如圖4所示,高速外部時鐘(HSE)的頻率范圍為4 ~ 24MHz,實驗所使用的晶振為12M,要使系統(tǒng)時鐘為48MHz,則配置PLL輸出48MHz做系統(tǒng)時鐘,操作時鐘控制寄存器(RCC_CR)的HSEON位使能HSE,等待HSERDY位拉高(即HSE時鐘被釋放),設置PLL配置寄存器(RCC_PLLCFGR)中的PLLSRC位為1,并根據(jù)公式配置對應參數(shù),PLL配置公式如圖5所示。配置閃存訪問控制寄存器(FLASH_ACR)啟用閃存預取,配置時鐘配置寄存器(RCC_CFGR)設置分頻并配置PLL輸出做系統(tǒng)時鐘。

void clock_init()
{
    /* Enable HSE. */
    RCC->CR |= RCC_CR_HSEON_MASK;
    while ( RCC_CR_HSERDY_MASK != (RCC->CR   RCC_CR_HSERDY_MASK ) ) /* Waiting HSE ready. */
    {
    }
    /* F_clko = F_refin * N/(M * P), F_refin = 12M, 12*8/(1*2) = 48. */
    RCC->PLLCFGR = RCC_PLLCFGR_PLLSRC(1)  /* HSE clock is used as PLL input clock. */
                 | RCC_PLLCFGR_PLLDN(7)   /* N = DN + 1 = 7 + 1 = 8. */
                 | RCC_PLLCFGR_PLLDM(1)   /* M = DM + 1 = 1 + 1 = 2. */
                 | RCC_PLLCFGR_PLLDP(0)   /* P = DP + 1 = 0 + 1 = 1. */
                 | RCC_PLLCFGR_PLLLDS(1)  /* PLL lock detector accuracy select. */
                 | RCC_PLLCFGR_PLLICTRL(3)  /* 10uA. */
                 ;
    /* Enable PLL. */
    RCC->CR |= RCC_CR_PLLON_MASK;
    while( 0u == ( RCC->CR   RCC_CR_PLLRDY_MASK ) ) /* Waiting PLL ready. */
    {
    }
    /* Enable the FLASH prefetch. */
    RCC->AHB1ENR |= RCC_AHB1ENR_FLITFEN_MASK; /* Enable the access to FLASH. */
    FLASH->ACR = FLASH_ACR_LATENCY(1u)        /* Setup divider: 1 for 48Mhz. */
               | FLASH_ACR_PRFTBE_MASK        /* Enable flash prefetch. */
               ;
    /* Setup the dividers for each bus. */
    RCC->CFGR = RCC_CFGR_HPRE(0)     /* Div=1 for AHB freq. */
              | RCC_CFGR_PPRE1(0x0)  /* Div=1 for APB1 freq. */
              | RCC_CFGR_PPRE2(0x0)  /* Div=1 for APB2 freq. */
              | RCC_CFGR_MCO(7)      /* Use PLL/2 as output. */
              ;
    /* Switch the system clock source to PLL. */
    RCC->CFGR = ( (RCC->CFGR   ~RCC_CFGR_SW_MASK ) | RCC_CFGR_SW(2) ); /* Use PLL as SYSCLK. */
    /* Wait till PLL is used as system clock source. */
    while ( (RCC->CFGR    RCC_CFGR_SWS_MASK ) != RCC_CFGR_SWS(2) )
    {
    }
}

wKgaomUD7mSAVouFAABUECiS1Do309.png 圖4. MM32F0140部分時鐘樹
wKgZomUD7maAVyWyAABdsLxCS7U107.png 圖5. PLL配置公式

啟用UART外設時鐘 enable_clock()

UART1的UART1_TX與UART1_RX復用引腳為PA9與PA10,因此初始化GPIOA與UART1的外設時鐘,UART1在APB2上,GPIOA在AHB上。

void enable_clock()
{
    /* Enable UART1 clock. */
    RCC->APB2ENR |= RCC_APB2_PERIPH_UART1;
    /* Enable GPIOA clock. */
    RCC->AHB1ENR |= RCC_AHB1_PERIPH_GPIOA;
}

配置引腳 pin_init()

由于UART的TX與RX引腳配置為復用功能配置,如圖6所示,PA9, PA10的UART1_TX與UART1_RX均使用AF1,對端口復用功能高位寄存器(GPIO_AFRH)的端口9、端口10對應位賦值。

void pin_init()
{
    /* Setup PA9, PA10. */
    GPIOA->CRH  = ~GPIO_CRH_MODE9_MASK;
    GPIOA->CRH |= GPIO_PinMode_AF_PushPull;     /* PA9 multiplexed push-pull output. */
    GPIOA->AFRH  = ~GPIO_AFRH_AFR_MASK;
    GPIOA->AFRH |= (GPIO_AF_1 << GPIO_CRH_MODE9_SHIFT);   /* Use AF1. */

    GPIOA->CRH  = ~GPIO_CRH_MODE10_MASK;
    GPIOA->CRH |= GPIO_PinMode_In_Floating;     /* PA10 floating input. */
    GPIOA->AFRH |= (GPIO_AF_1 << GPIO_CRH_MODE10_SHIFT);    /* Use AF1. */
}

wKgZomUD7meAD4a3AAEkrgICFmQ839.png 圖6. 部分引腳復用表格

UART初始化 uart_init()

初始化UART需要配置:時鐘頻率、波特率、數(shù)據(jù)長度、停止位、傳輸模式及是否使用校驗。

如圖7所示,UART全局控制寄存器(UART_GCR)的TXEN位與RXEN位控制傳輸模式,兩位均置1表示傳輸模式為TX與RX,AUTOFLOWEN位控制是否使用自動流控制,UARTEN位控制UART的使能。

如圖8所示,UART通用控制寄存器(UART_CCR)的SPB1、SPB0位控制停止位位數(shù),CHAR位控制數(shù)據(jù)寬度,PSEL位選擇采用奇校驗還是偶校驗,PEN位控制校驗使能;UART波特率寄存器(UART_BRR)與UART分數(shù)波特率寄存器(UART_FRA)分別存儲UART分頻器除法因子的整數(shù)與小數(shù)。

void uart_init()
{
    /* Clear the corresponding bit to be used. */
    UART1->CCR  = ~( UART_CCR_PEN_MASK | UART_CCR_PSEL_MASK | UART_CCR_SPB0_MASK | UART_CCR_SPB1_MASK | UART_CCR_CHAR_MASK );
    UART1->GCR  = ~( UART_GCR_AUTOFLOWEN_MASK | UART_GCR_RXEN_MASK | UART_GCR_TXEN_MASK );
    /* WordLength. */
    UART1->CCR |= UART_CCR_CHAR_MASK;
    /* XferMode. */
    UART1->GCR |= (UART_XferMode_RxTx << UART_GCR_RXEN_SHIFT);
    /* Setup baudrate, BOARD_DEBUG_UART_FREQ = 48000000u, BOARD_DEBUG_UART_BAUDRATE = 9600u. */
    UART1->BRR = (BOARD_DEBUG_UART_FREQ / BOARD_DEBUG_UART_BAUDRATE) / 16u;
    UART1->FRA = (BOARD_DEBUG_UART_FREQ / BOARD_DEBUG_UART_BAUDRATE) % 16u;
    /* Enable UART1. */
    UART1->GCR |= UART_GCR_UARTEN_MASK;
}

wKgaomUD7mmAMUfIAAC-8dJ1nho116.png 圖7. MM32F0140 UART_GCR寄存器
wKgaomUD7muAIC8-AAHSFZ4nuZM280.png 圖8. MM32F0140 UART_CCR寄存器部分位

UART發(fā)送數(shù)據(jù) uart_putchar()

通過讀取UART當前狀態(tài)寄存器(UART_CSR)獲取當前狀態(tài),當發(fā)送緩沖區(qū)為空時,可進行數(shù)據(jù)發(fā)送,將發(fā)送數(shù)據(jù)傳入UART發(fā)送數(shù)據(jù)寄存器(UART_TDR),定義發(fā)送數(shù)據(jù)函數(shù)uart_putchar(),變量“c”為需要發(fā)送的數(shù)據(jù)。

void uart_putchar(uint8_t c)
{
    while ( 0u == ( UART_STATUS_TX_EMPTY   (UART1->CSR) ) )  /* Waiting tx buffer empty. */
    {}
    UART1->TDR = (uint8_t)c;
}

UART接收數(shù)據(jù) uart_getchar()

通過讀取UART當前狀態(tài)寄存器(UART_CSR)獲取當前狀態(tài),當接收緩沖接收了一個完整字節(jié)的數(shù)據(jù)時,可讀取UART接收數(shù)據(jù)寄存器(UART_RDR)獲取接收數(shù)據(jù),定義接收數(shù)據(jù)函數(shù)uart_getchar(),該函數(shù)返回接收的數(shù)據(jù)。

uint8_t uart_getchar(void)
{
    while ( 0u == ( UART_STATUS_RX_DONE   (UART1->CSR) ) )  /* Waiting rx buffer receives a complete byte of data. */
    {}
    return (uint8_t)(UART1->RDR   0xff);
}

UART輸出字符串 uart_putbuffer()

使用UART發(fā)送函數(shù)編寫發(fā)送字符串函數(shù)。

void uart_putbuffer(uint8_t *str)
{
    while ((*str) != '?')
    {
        uart_putchar(*str);
        str++;
    }
}

main()函數(shù)

main()函數(shù)結合上述操作,不斷循環(huán)接收數(shù)據(jù)函數(shù)uart_getchar()與發(fā)送數(shù)據(jù)函數(shù)uart_putchar(),將接收到的數(shù)據(jù)發(fā)送出去,實驗現(xiàn)象如圖9所示,程序運行后串口輸出"uart_basic example.",通過串口調試工具輸入"mindmotion",UART輸出"mindmotion",輸入數(shù)據(jù)與輸出數(shù)據(jù)相同。

int main(void)
{
    uint8_t c;

    clock_init();
    enable_clock();
    pin_init();
    uart_init();

    uart_putbuffer((uint8_t *)"rnuart_basic example.rn");
    while (1)
    {
        c = uart_getchar();
        uart_putchar(c);
    }
}

wKgZomUD7m2AbgAMAADDOwfwwAw414.png 圖9. 實驗現(xiàn)象

來源:靈動MM32MCU

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 收發(fā)器
    +關注

    關注

    10

    文章

    3559

    瀏覽量

    107125
  • uart
    +關注

    關注

    22

    文章

    1254

    瀏覽量

    102962
  • 串行通信
    +關注

    關注

    4

    文章

    584

    瀏覽量

    35961
  • GND
    GND
    +關注

    關注

    2

    文章

    541

    瀏覽量

    39409
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    靈動微課堂 (第203講) | MM32F0140 UART 學習筆記

    MM32F0140UART支持全雙工數(shù)據(jù)交換、同步單向通信、半雙工單線通信、多處理器之間的通信以及調制解調器(CTS/RTS)操作。串行通信串行通信是指使用一條數(shù)據(jù)線,將數(shù)據(jù)一位一位地依次傳輸,每一位
    發(fā)表于 03-17 18:54

    AN0052從MM32F0130移植到MM32F0140(英文版)

    AN0052 從MM32F0130移植到MM32F0140(英文版)
    發(fā)表于 02-22 18:43 ?0次下載
    AN0052從<b class='flag-5'>MM32F</b>0130移植到<b class='flag-5'>MM32F0140</b>(英文版)

    MM32F0140 產(chǎn)品手冊(中文版)

    MM32F0140 產(chǎn)品手冊(中文版)
    發(fā)表于 02-22 18:45 ?0次下載
    <b class='flag-5'>MM32F0140</b> 產(chǎn)品手冊(中文版)

    MM32F0140 產(chǎn)品手冊(英文版)

    MM32F0140 產(chǎn)品手冊(英文版)
    發(fā)表于 02-22 18:45 ?0次下載
    <b class='flag-5'>MM32F0140</b> 產(chǎn)品手冊(英文版)

    MM32F0140 用戶手冊(中文版)

    MM32F0140 用戶手冊(中文版)
    發(fā)表于 02-22 18:46 ?0次下載
    <b class='flag-5'>MM32F0140</b> 用戶手冊(中文版)

    MM32F0140 用戶手冊(英文版)

    MM32F0140 用戶手冊(英文版)
    發(fā)表于 02-22 18:46 ?0次下載
    <b class='flag-5'>MM32F0140</b> 用戶手冊(英文版)

    MM32F0140 勘誤表(中文版)

    MM32F0140 勘誤表(中文版)
    發(fā)表于 02-22 18:47 ?0次下載
    <b class='flag-5'>MM32F0140</b> 勘誤表(中文版)

    MM32F0140 勘誤表(英文版)

    MM32F0140 勘誤表(英文版)
    發(fā)表于 02-22 18:48 ?0次下載
    <b class='flag-5'>MM32F0140</b> 勘誤表(英文版)

    基于MM32F0140的UDS Bootloader學習筆記

    基于MM32F0140的UDS Bootloader學習筆記
    的頭像 發(fā)表于 10-30 17:11 ?998次閱讀
    基于<b class='flag-5'>MM32F0140</b>的UDS Bootloader<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>

    MM32F0140學習筆記——CRC

    MM32F0140學習筆記——CRC
    的頭像 發(fā)表于 11-10 18:27 ?864次閱讀
    <b class='flag-5'>MM32F0140</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>——CRC

    MM32F0140學習筆記——窗口看門狗(WWDG)

    MM32F0140學習筆記——窗口看門狗(WWDG)
    的頭像 發(fā)表于 10-27 09:45 ?840次閱讀
    <b class='flag-5'>MM32F0140</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>——窗口看門狗(WWDG)

    MM32F0140學習筆記——FlexCAN 控制器局域網(wǎng)

    MM32F0140學習筆記——FlexCAN 控制器局域網(wǎng)
    的頭像 發(fā)表于 10-27 09:25 ?1692次閱讀
    <b class='flag-5'>MM32F0140</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>——FlexCAN 控制器局域網(wǎng)

    MM32F0140 SPI學習筆記

    MM32F0140 SPI學習筆記
    的頭像 發(fā)表于 09-26 16:51 ?784次閱讀
    <b class='flag-5'>MM32F0140</b> SPI<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>

    MM32F0140 DMA學習筆記

    MM32F0140 DMA 學習筆記
    的頭像 發(fā)表于 09-18 16:57 ?871次閱讀
    <b class='flag-5'>MM32F0140</b> DMA<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>

    MM32F0140 GPIO學習筆記

    MM32F0140 GPIO學習筆記
    的頭像 發(fā)表于 09-26 16:42 ?730次閱讀
    <b class='flag-5'>MM32F0140</b> GPIO<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>
    主站蜘蛛池模板: 亚洲五月激情综合图片区 | 天堂网www最新版在线资源 | 最新bt合集 | 久久频这里精品99香蕉久网址 | 国产资源在线免费观看 | 在线观看高清视频 | 久久深夜福利 | 色中色在线视频 | 亚洲四虎在线 | www.色午夜.com| 永久免费观看黄网站 | 特黄特黄 | 男人你懂的网站 | 午夜剧场官网 | 激情综合五月网 | 国产 高清 在线 | 在线观看三级网站 | 欧美潘金莲一级风流片a级 欧美片欧美日韩国产综合片 | 亚洲视频在线一区二区三区 | 中文字幕亚洲一区二区三区 | 免费一级毛片视频 | 五月婷婷激情综合网 | 天天av天天翘天天综合网 | 成人免费黄色 | 99国内视频| 大片毛片女女女女女女女 | 黄床大片| 模特视频一二三区 | 中文字幕三级久久久久久 | 色四虎 | www久久久| 日本口工福利漫画无遮挡 | 精品国产乱码久久久久久浪潮 | 国产精品免费看久久久香蕉 | 站长工具天天爽视频 | 亚洲国产精品va在线观看麻豆 | 爱看精品福利视频观看 | 四虎地址8848最新章节 | 亚洲高清成人 | 中文字幕在线一区二区三区 | 欧美精品啪啪 |