色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

使用DFU方案實(shí)現(xiàn)STM32單片機(jī)的高級(jí)開(kāi)發(fā)

技術(shù)讓夢(mèng)想更偉大 ? 來(lái)源:csdn ? 作者:ArthurZheng150 ? 2022-11-28 09:33 ? 次閱讀

什么是 DFU

DFU全稱為Device Firmware update,是ST官方推出的一個(gè)通過(guò)USB接口進(jìn)行IAP升級(jí)的方案,同串口ISP一樣,他們都集成在了芯片內(nèi)部的Bootloader區(qū)段,可以通過(guò)配置boot引腳來(lái)啟動(dòng)。(具體可參照ST文檔:AN2606)。不過(guò)內(nèi)置DFU的芯片大部分型號(hào)都比較新,如果你用的型號(hào)沒(méi)有內(nèi)置DFU程序,沒(méi)關(guān)系我們也可以通過(guò)CubeMX來(lái)快速生成和移植一個(gè)DFU功能程序到你的Flash中來(lái)使用。

DFU方案完整的組件包括單片機(jī)DFU Demo代碼、PC端升級(jí)程序、PC端Demo代碼以及相關(guān)資料手冊(cè)等。通過(guò)使用DFU方案,我們可以快速的集成升級(jí)功能到開(kāi)發(fā)的產(chǎn)品中,同時(shí)還能夠快速的開(kāi)發(fā)與之配套的升級(jí)程序。

使用CubeMX生成初始工程

由于官方提供的DFU例程并不多,我們很難找到現(xiàn)成的可已使用DFU程序,但是通過(guò)CubeMX我們可以很快速的配置和生成DFU的Bootloader,下面我們正式開(kāi)始。

新建CubeMX工程

首先選定好IC的型號(hào),進(jìn)入配置界面,由于只是Bootloader代碼所以這里我們只需要配置USB功能和一個(gè)做Bootloader觸發(fā)的引腳就可,其余的時(shí)鐘等部分一切按照正常方式配置。

設(shè)置USB引腳功能

設(shè)定USB模式為Device(HS還是FS并不影響DFU的功能,按照應(yīng)用選擇就可)。

cae4ea6a-6eb1-11ed-8abf-dac502259ad0.png

開(kāi)啟DFU組件

在MiddleWares中加入U(xiǎn)SB DFU組件

caece1ca-6eb1-11ed-8abf-dac502259ad0.png

設(shè)置DFU參數(shù)

開(kāi)啟DFU組件后,CubeMX的程序設(shè)置窗口的MiddleWares中就會(huì)出現(xiàn)DFU程序設(shè)置按鈕。

cb0498c4-6eb1-11ed-8abf-dac502259ad0.png

點(diǎn)開(kāi)它將APP加載的地址改為0x0800_c000,這個(gè)加載地址根據(jù)你實(shí)際的應(yīng)用設(shè)置,目前我們選擇讓flash的前三個(gè)sector為Bootloader的區(qū)域。

cb0e3366-6eb1-11ed-8abf-dac502259ad0.png

第二個(gè)全是字段的參數(shù)是用來(lái)在DFU連接升級(jí)軟件式傳輸給軟件用來(lái)獲取Flash結(jié)構(gòu)字符串?dāng)?shù)據(jù),很好理解這個(gè)小協(xié)議的內(nèi)容,點(diǎn)擊設(shè)置后,下方的CubeMX的參數(shù)說(shuō)明也寫(xiě)的很清晰,這里就不多說(shuō)了。當(dāng)然這些參數(shù)也在工程生成后在 usbd_conf.h 和 usbd_dfu_if.c 文件中修改。

cb21e7da-6eb1-11ed-8abf-dac502259ad0.png

最后的設(shè)置

最后我們添加一個(gè)外部的按鍵作為觸發(fā)單片機(jī)啟動(dòng)時(shí)進(jìn)入DFU的方式,按鍵按下后就啟動(dòng)DFU模式,否則直接加載后方APP程序,這里選用PA0引腳,給它設(shè)置個(gè)User Label 就叫 USER_BTN_GPIO_Port。

cb2daafc-6eb1-11ed-8abf-dac502259ad0.png

修改補(bǔ)全工程

實(shí)現(xiàn) DFU 功能代碼

打開(kāi) src 目錄下的 usbd_dfu_if.c 文件補(bǔ)全其中的功能代碼

Flash 解鎖

  1. uint16_tMEM_If_Init_HS(void)
    {
    HAL_FLASH_Unlock();
    return(USBD_OK);
    }
    

    Flash 上鎖

    uint16_tMEM_If_DeInit_HS(void)
    {
    HAL_FLASH_Lock();
    return(USBD_OK);
    }
    

    Flash 擦除

    staticuint32_tGetSector(uint32_tAddress)
    {
    uint32_tsector=0;
    
    if((Address=ADDR_FLASH_SECTOR_0))
    {
    sector=FLASH_SECTOR_0;
    }
    
    ......
    
    }
    elseif((Address=ADDR_FLASH_SECTOR_22))
    {
    sector=FLASH_SECTOR_22;
    }
    else
    {
    sector=FLASH_SECTOR_23;
    }
    returnsector;
    }
    
    uint16_tMEM_If_Erase_HS(uint32_tAdd)
    {
    uint32_tstartsector=0;
    uint32_tsectornb=0;
    /*VariablecontainsFlashoperationstatus*/
    HAL_StatusTypeDefstatus;
    FLASH_EraseInitTypeDeferaseinitstruct;
    
    /*Getthenumberofsector*/
    startsector=GetSector(Add);
    
    eraseinitstruct.TypeErase=FLASH_TYPEERASE_SECTORS;
    eraseinitstruct.VoltageRange=FLASH_VOLTAGE_RANGE_3;
    eraseinitstruct.Sector=startsector;
    eraseinitstruct.NbSectors=1;
    status=HAL_FLASHEx_Erase(&eraseinitstruct,§ornb);
    
    if(status!=HAL_OK)
    {
    return(USBD_FAIL);
    }
    return(USBD_OK);
    }
    

    Flash 寫(xiě)入

    uint16_tMEM_If_Write_HS(uint8_t*src,uint8_t*dest,uint32_tLen)
    {
    uint32_ti=0;
    
    for(i=0;i4)
    {
    /*Devicevoltagerangesupposedtobe[2.7Vto3.6V],theoperationwill
    bedonebybyte*/
    if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,(uint32_t)(dest+i),*(uint32_t*)(src+i))==HAL_OK)
    {
    /*Checkthewrittenvalue*/
    if(*(uint32_t*)(src+i)!=*(uint32_t*)(dest+i))
    {
    /*Flashcontentdoesn'tmatchSRAMcontent*/
    return(USBD_FAIL);
    }
    }
    else
    {
    /*ErroroccurredwhilewritingdatainFlashmemory*/
    return(USBD_FAIL);
    }
    }
    return(USBD_OK);
    }
    

    Flash 讀取

    uint8_t*MEM_If_Read_HS(uint8_t*src,uint8_t*dest,uint32_tLen)
    {
    /*ReturnavalidaddresstoavoidHardFault*/
    uint32_ti=0;
    uint8_t*psrc=src;
    
    for(i=0;i/*ReturnavalidaddresstoavoidHardFault*/
    return(uint8_t*)(dest);
    }
    

    獲取 Flash 擦寫(xiě)時(shí)間參數(shù)

    uint16_tMEM_If_GetStatus_HS(uint32_tAdd,uint8_tCmd,uint8_t*buffer)
    {
    /*USERCODEBEGIN11*/
    uint16_ttime;
    
    time=TimingTable[GetSector(Add)];
    
    switch(Cmd)
    {
    caseDFU_MEDIA_PROGRAM:
    buffer[1]=(uint8_t)time;
    buffer[2]=(uint8_t)(time<8);
    buffer[3]=0;
    break;
    
    caseDFU_MEDIA_ERASE:
    default:
    buffer[1]=(uint8_t)time;
    buffer[2]=(uint8_t)(time<8);
    buffer[3]=0;
    break;
    }
    return(USBD_OK);
    /*USERCODEEND11*/
    }
    

    usbd_dfu_if.h 文件添加的宏定義

    /*Defineflashaddress*///BLANK1#defineADDR_FLASH_SECTOR_00x08000000#defineADDR_FLASH_SECTOR_10x08004000#defineADDR_FLASH_SECTOR_20x08008000#defineADDR_FLASH_SECTOR_30x0800C000#defineADDR_FLASH_SECTOR_40x08010000#defineADDR_FLASH_SECTOR_50x08020000#defineADDR_FLASH_SECTOR_60x08040000#defineADDR_FLASH_SECTOR_70x08060000#defineADDR_FLASH_SECTOR_80x08080000#defineADDR_FLASH_SECTOR_90x080A0000#defineADDR_FLASH_SECTOR_100x080C0000#defineADDR_FLASH_SECTOR_110x080E0000//BLANK2#defineADDR_FLASH_SECTOR_120x08100000#defineADDR_FLASH_SECTOR_130x08104000#defineADDR_FLASH_SECTOR_140x08108000#defineADDR_FLASH_SECTOR_150x0810C000#defineADDR_FLASH_SECTOR_160x08110000#defineADDR_FLASH_SECTOR_170x08120000#defineADDR_FLASH_SECTOR_180x08140000#defineADDR_FLASH_SECTOR_190x08160000#defineADDR_FLASH_SECTOR_200x08180000#defineADDR_FLASH_SECTOR_210x081A0000#defineADDR_FLASH_SECTOR_220x081C0000#defineADDR_FLASH_SECTOR_230x081E0000/*Flashopratetimefromdatasheetpage128*/#defineFLASH_SECTOR_16KB_WRITE_ERASE_TIME500//500usbframe,means500ms#defineFLASH_SECTOR_64KB_WRITE_ERASE_TIME1100#defineFLASH_SECTOR_128KB_WRITE_ERASE_TIME2000
  2. 修改Main文件

    首先在main文件前添加幾個(gè)用于加載APP程序的變量和函數(shù)定義

    typedefvoid(*pFunction)(void);
    
    pFunctionJumpToApplication;
    uint32_tJumpAddress;1234

    然后再 main 函數(shù)中加入 外部按鍵的判斷、APP程序加載以及USB DFU初始化功能

    intmain(void)
    {
    /*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/
    HAL_Init();
    
    /*Configurethesystemclock*/
    SystemClock_Config();
    
    /*Initializeallconfiguredperipherals*/
    MX_GPIO_Init();
    
    if(HAL_GPIO_ReadPin(USER_BTN_GPIO_Port,USER_BTN_Pin)==GPIO_PIN_SET)
    {
    HAL_GPIO_WritePin(GPIOG,LD3_Pin,GPIO_PIN_SET);//Fordebug
    /*Testifusercodeisprogrammedstartingfromaddress0x0800C000*/
    if(((*(__IOuint32_t*)USBD_DFU_APP_DEFAULT_ADD)&0x2FF80000)==0x20000000)
    {
    HAL_GPIO_WritePin(GPIOG,LD4_Pin,GPIO_PIN_SET);//Fordebug
    /*Jumptouserapplication*/
    JumpAddress=*(__IOuint32_t*)(USBD_DFU_APP_DEFAULT_ADD+4);
    JumpToApplication=(pFunction)JumpAddress;
    
    /*Resetofallperipherals*/
    HAL_DeInit();
    
    /*Setinterruptvectortoappcode*/
    SCB->VTOR=USBD_DFU_APP_DEFAULT_ADD;
    
    /*Initializeuserapplication'sStackPointer*/
    __set_MSP(*(__IOuint32_t*)USBD_DFU_APP_DEFAULT_ADD);
    JumpToApplication();
    }
    }
    
    MX_USB_DEVICE_Init();
    
    while(1)
    {
    }
    }
    

編譯程序下載進(jìn)入單片機(jī)

使用DfuSe

從ST官網(wǎng)DfuSe的程序安裝包,并安裝。然后我們按下之前寫(xiě)的觸發(fā)按鍵并復(fù)位單片機(jī),讓單片機(jī)初始 USB DFU 功能,這時(shí)如果你插著單片機(jī)的USB線,系統(tǒng)應(yīng)該已經(jīng)識(shí)別了。如果沒(méi)有右鍵更新驅(qū)動(dòng)程序,手動(dòng)指定驅(qū)動(dòng)搜索路徑在DfuSe安裝目錄下的 BinDriver 內(nèi)。如果直接無(wú)法識(shí)別USB設(shè)備,建議在CubeMx配置完工程后就編譯下載測(cè)試一下,看看是不是你在移植過(guò)程中哪里寫(xiě)錯(cuò)了。

然后我們需要生成一個(gè)地址設(shè)定在0x0800_c000后的測(cè)試程序,就先編寫(xiě)一個(gè) Blink LED 的程序吧,生成bin、hex或S19文件。然后我們打開(kāi)DfuSe軟件的Dfu file manager來(lái)生成DFU軟件用的.dfu格式的文件。選擇第一項(xiàng),第二個(gè)是用來(lái)將.dfu反向變換回來(lái)的。大概的操作已經(jīng)標(biāo)在圖片上了,操作比較簡(jiǎn)單就不做詳細(xì)介紹了,記得把Address的地址改到偏移后的地址上否則下載會(huì)出錯(cuò),其他參數(shù)可以不用修改。

然后我們打開(kāi)DfuSe程序,在Upgrade中選擇生成好的blink.dfu文件,勾選校驗(yàn)功能,下載程序。成功后復(fù)位單片機(jī),LED開(kāi)始閃爍,移植成功。

更多

仔細(xì)區(qū)看看DfuSe的安裝目錄,里面有DFU的資料文檔,還有DFU的工程源代碼,可以用來(lái)改寫(xiě)自己需要的DFU升級(jí)程序。

審核編輯:郭婷


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 芯片
    +關(guān)注

    關(guān)注

    456

    文章

    50967

    瀏覽量

    424878
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7961

    瀏覽量

    265122
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10910

    瀏覽量

    356626

原文標(biāo)題:STM32高級(jí)開(kāi)發(fā)——使用DFU方案

文章出處:【微信號(hào):技術(shù)讓夢(mèng)想更偉大,微信公眾號(hào):技術(shù)讓夢(mèng)想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32單片機(jī)的特點(diǎn)介紹

    STM32系列單片機(jī)是由ST廠商推出的單片機(jī),基于專為高性能、低成本、低功耗嵌入式應(yīng)用設(shè)計(jì)的ARM Cortex-M內(nèi)核,具備一流的外設(shè)配置,使其在功耗和集成度方面表現(xiàn)出色,STM32
    的頭像 發(fā)表于 09-25 17:19 ?1719次閱讀

    單片機(jī)方案開(kāi)發(fā):如何給電子產(chǎn)品單片機(jī)選型?

    在給電子項(xiàng)目做IC方案開(kāi)發(fā)時(shí),總是需要考慮到許多關(guān)鍵因素。在本文中,對(duì)于給即將開(kāi)發(fā)的電子產(chǎn)品做好單片機(jī)選型。英銳恩單片機(jī)
    發(fā)表于 09-25 10:56

    基于STM32單片機(jī)的智能加濕器設(shè)計(jì)

    本文介紹了一種基于STM32單片機(jī)的智能加濕器。該加濕器配備了DHT11溫濕度傳感器、水位傳感器和濁度傳感器,數(shù)據(jù)通過(guò)單片機(jī)處理并顯示在OLED屏幕上。用戶可通過(guò)按鍵模塊設(shè)置閾值,并在檢測(cè)值與設(shè)定值
    的頭像 發(fā)表于 09-14 08:04 ?1229次閱讀
    基于<b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>的智能加濕器設(shè)計(jì)

    單片機(jī)STM32可以用Python寫(xiě)嗎?可以的開(kāi)發(fā)板有哪些?

    近年來(lái),隨著嵌入式技術(shù)的發(fā)展,Python語(yǔ)言逐漸被引入到單片機(jī)開(kāi)發(fā)中,尤其是一些高性能的單片機(jī)上。這一趨勢(shì)給開(kāi)發(fā)者帶來(lái)了極大的便利,尤其是在快速原型設(shè)計(jì)和實(shí)驗(yàn)中。本文將詳細(xì)探討
    的頭像 發(fā)表于 09-05 08:00 ?3862次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>STM32</b>可以用Python寫(xiě)嗎?可以的<b class='flag-5'>開(kāi)發(fā)</b>板有哪些?

    stm32單片機(jī)用什么軟件編程

    STM32單片機(jī)是一種廣泛應(yīng)用于嵌入式系統(tǒng)領(lǐng)域的微控制器,具有高性能、低功耗、豐富的外設(shè)接口等特點(diǎn)。要對(duì)STM32單片機(jī)進(jìn)行編程,需要選擇合適的軟件工具。 概述
    的頭像 發(fā)表于 09-02 10:16 ?1576次閱讀

    stm32單片機(jī)引腳介紹及功能

    STM32系列單片機(jī)是STMicroelectronics(意法半導(dǎo)體)推出的一款基于ARM Cortex-M內(nèi)核的32位微控制器。STM32單片機(jī)具有高性能、低功耗、豐富的外設(shè)和靈活
    的頭像 發(fā)表于 09-02 09:38 ?6308次閱讀

    stm32和51單片機(jī)的區(qū)別是什么

    架構(gòu)差異: STM32是基于ARM Cortex-M系列內(nèi)核的32位微控制器,具有更高效的處理能力和更豐富的外設(shè)。 51單片機(jī)是基于8051內(nèi)核的8位微控制器,處理能力相對(duì)較低,外設(shè)也相對(duì)有限
    的頭像 發(fā)表于 09-02 09:33 ?816次閱讀

    stm32單片機(jī)的優(yōu)勢(shì)有哪些?

    STM32作為一款強(qiáng)大而多功能的單片機(jī),憑借其性能、功能、開(kāi)發(fā)者生態(tài)系統(tǒng)以及廣泛的應(yīng)用領(lǐng)域,成為了眾多單片機(jī)中的佼佼者。無(wú)論是專業(yè)開(kāi)發(fā)
    發(fā)表于 07-29 09:29

    藍(lán)牙模塊如何實(shí)現(xiàn)單片機(jī)和手機(jī)端數(shù)據(jù)互傳

    藍(lán)牙模塊實(shí)現(xiàn)單片機(jī)和手機(jī)端數(shù)據(jù)互傳的過(guò)程可以分為以下幾個(gè)步驟: 硬件準(zhǔn)備 : 確保你有一個(gè)支持藍(lán)牙通信的單片機(jī)開(kāi)發(fā)板,如Arduino、Raspberry Pi等。 準(zhǔn)備一個(gè)兼容的藍(lán)牙
    的頭像 發(fā)表于 07-24 17:59 ?2706次閱讀
    藍(lán)牙模塊如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>單片機(jī)</b>和手機(jī)端數(shù)據(jù)互傳

    基于STM32單片機(jī)的智能冰箱控制系統(tǒng)設(shè)計(jì)

    基于單片機(jī)設(shè)計(jì)的一款智能冰箱控制系統(tǒng),可以控制冰箱的制冷裝置,可以采集冰箱的異味濃度,超過(guò)閩值之后控制紫外燈進(jìn)行消毒工作單片機(jī)采用單片機(jī)采用單片機(jī)采用
    的頭像 發(fā)表于 06-25 09:21 ?1304次閱讀
    基于<b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>的智能冰箱控制系統(tǒng)設(shè)計(jì)

    STM32單片機(jī)有哪幾種常見(jiàn)的開(kāi)發(fā)環(huán)境?

    STM32單片機(jī)是一款廣泛應(yīng)用于嵌入式系統(tǒng)開(kāi)發(fā)單片機(jī),針對(duì)其開(kāi)發(fā),有以下幾種常見(jiàn)的方式:STM32
    的頭像 發(fā)表于 05-18 08:04 ?3161次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>有哪幾種常見(jiàn)的<b class='flag-5'>開(kāi)發(fā)</b>環(huán)境?

    stm32單片機(jī)學(xué)習(xí)路線

    、函數(shù)、指針等。 2.了解電子電路基礎(chǔ) 對(duì)于單片機(jī)開(kāi)發(fā)來(lái)說(shuō),了解電子電路的基礎(chǔ)知識(shí)是非常重要的,包括基本的電路原理、電阻、電容、電感等元件的作用和特性。 第二步STM32入門(mén) 1.了解
    發(fā)表于 05-10 15:34

    STM32單片機(jī)最小化系統(tǒng)設(shè)計(jì)原理

    STM32最小系統(tǒng),就是能讓STM32單片機(jī)能夠正常工作所必須擁有的組成部分的集合,也是STM32單片機(jī)正常運(yùn)行的必要環(huán)境。
    發(fā)表于 04-23 14:54 ?2920次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>最小化系統(tǒng)設(shè)計(jì)原理

    使用STM32L4R9單片機(jī)開(kāi)發(fā)板,DfuSeDemo無(wú)法檢測(cè)到設(shè)備的原因?

    使用STM32L4R9單片機(jī)開(kāi)發(fā)板,官方例程STM32Cube_FW_L4_V1.16.0Projects32L4R9IDISCOVERYApplicationsUSB_DeviceD
    發(fā)表于 04-09 07:59

    51單片機(jī)開(kāi)發(fā)板的主要功能 51單片機(jī)開(kāi)發(fā)板能做什么

    51單片機(jī)開(kāi)發(fā)板是一種基于8051系列單片機(jī)芯片的開(kāi)發(fā)板,具有豐富的功能和廣泛的應(yīng)用。下面將詳細(xì)介紹51單片機(jī)
    的頭像 發(fā)表于 01-23 15:52 ?3867次閱讀
    主站蜘蛛池模板: 777米奇影院第七色色| 男插女高潮一区二区| 久久大香线蕉综合爱| 全黄h全肉短篇禁乱np| 野花韩国高清完整版在线观看5| jjzz动漫| 久久深夜视频| 小黄文污到你湿| yellow日本动漫观看免费| 久久精品国产久精国产果冻传媒| 十分钟免费看完整视频| 99re热视频这里只有精品| 娇妻中日久久持久久| 四库影院永久国产精品| jizz女学| 猫咪最新破解版下载| 亚洲手机在线人成视频| 国产国语在线播放视频| 强姧伦久久久久久久久| 最近中文字幕在线看免费完整版| 国产亚洲欧美在线中文BT天堂网| 日本湿姝在线观看| 99国产热视频在线观看| 久久免费精彩视频| 亚洲免费无码中文在线| 国产精品内射久久久久欢欢 | 国产亚洲精品久久久久久久 | 福利视频久久| 女教师杨雪的性荡生活| 中文在线观看免费网站| 很很射影院| 性色爽爱性色爽爱网站| 国产91青青成人a在线| 人妻 中文无码 中出| 97在线精品视频免费| 久久免费看少妇高潮A片JA| 亚洲精品视频在线观看视频| 国产毛A片久久久久久无码| 日韩精品无码免费专区| xxxx美国老师1819| 欧美成人无码A区在线观看免费 |