久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4224|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

stm32發(fā)送中斷編程思路

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104126 發(fā)表于 2016-1-23 00:47 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
u8 TxBuffer[2];
u8 TxCounter=0;
u8 count=0;
void USART_SendData_Int(u8 *str)
{
        while(*str != '\0')
        {
                TxBuffer[count++] = *str++;
        }  
        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);        
}
void delay(void)
{
        long i,j;
        for(i=0;i<1500;i++)
                for(j=0;j<2000;j++);
}
int main(void)
{
    USART_Configuration();
    NVIC_Configuration();

    while (1)
    {
          USART_SendData_Int("012345678901234567890123456789012345\n");        
          USART_SendData_Int("abcdefghijklmn\n");
          delay();   
    }
}
void USART_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;

  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);                  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;               
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  USART_InitStructure.USART_BaudRate = 115200;
  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_RXNE, ENABLE);
  USART_ITConfig(USART1, USART_IT_TXE, DISABLE);        
  USART_ClearFlag(USART1,USART_FLAG_TC);
  USART_Cmd(USART1, ENABLE);
}
void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}
void USART1_IRQHandler(void)
{

  if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
  {   

    USART_SendData(USART1, TxBuffer[TxCounter++]);                    


    USART_ClearITPendingBit(USART1, USART_IT_TXE);

    if(TxCounter == count)
    {

      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
    }   
  }
}

這個(gè)程序經(jīng)過(guò)調(diào)試,在串口調(diào)試助手上一點(diǎn)問(wèn)題都沒(méi)有。!不過(guò)似乎從程序上看問(wèn)題很多:1、我定義的串口緩存TxBuffer[2],為什么大小只有兩個(gè)字節(jié)(應(yīng)該說(shuō)是任意字節(jié)大小都可以),我程序在發(fā)送數(shù)據(jù)時(shí),數(shù)據(jù)大小遠(yuǎn)遠(yuǎn)超過(guò)兩個(gè)字節(jié),但是卻沒(méi)報(bào)錯(cuò),更是還能正確運(yùn)行。。。沒(méi)懂?2、我定義的兩個(gè)全局變量u8 TxCounter=0;u8 count=0;每發(fā)送一次數(shù)據(jù),都會(huì)相應(yīng)自加上數(shù)據(jù)的長(zhǎng)度,程序中沒(méi)有對(duì)其清零, 卻似乎永遠(yuǎn)沒(méi)有溢出的跡象。怎么解釋?

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:104126 發(fā)表于 2016-1-23 00:47 | 只看該作者
查詢方式:發(fā)送數(shù)據(jù)——先發(fā)后查;

                     接收數(shù)據(jù)——先查后收。

中斷方式:發(fā)送數(shù)據(jù)——發(fā)送、等待中斷、中斷中發(fā)送;

                    接收數(shù)據(jù)——等待中斷、在中斷中接收。


發(fā)送一個(gè)字符串
查詢發(fā)送:發(fā)送完一個(gè)字節(jié),等待發(fā)送完,繼續(xù)發(fā)送下個(gè)字節(jié),直到整個(gè)字符串發(fā)送完
          在這期間一直占用CPU
中斷發(fā)送:發(fā)送完一個(gè)字節(jié)CPU響應(yīng)中斷將下個(gè)字節(jié)放到外設(shè)寄存器,直到整個(gè)字符串發(fā)完
          只有在中斷時(shí)占用CPU資源

串口發(fā)送中斷我只用過(guò)一次:
只要將第一個(gè)字節(jié)送進(jìn)串口發(fā)送數(shù)據(jù)寄存器,就可以在串口發(fā)送中斷里依次把剩余的字節(jié)都發(fā)送完,省去了等待每一個(gè)字節(jié)發(fā)送完的時(shí)間。
不過(guò)這是在AVR中用的。STM32的DMA就可以實(shí)現(xiàn)自動(dòng)發(fā)送。
回復(fù)

使用道具 舉報(bào)

板凳
ID:104126 發(fā)表于 2016-1-23 00:48 | 只看該作者

SECTION 2

先說(shuō)TC。即Transmission Complete。發(fā)送一個(gè)字節(jié)后才進(jìn)入中斷,這里稱為“發(fā)送后中斷”。和原來(lái)8051的TI方式一樣,都是發(fā)送后才進(jìn)中斷,需要在發(fā)送函數(shù)中先發(fā)送一個(gè)字節(jié)觸發(fā)中斷。發(fā)送函數(shù)如下


void USART_SendDataString( u8 *pData )
{
    pDataByte = pData;
  
    USART_ClearFlag(USART1, USART_FLAG_TC);//清除傳輸完成標(biāo)志位,否則可能會(huì)丟失第1個(gè)字節(jié)的數(shù)據(jù).網(wǎng)友提供.
   
    USART_SendData(USART1, *(pDataByte++) ); //必須要++,不然會(huì)把第一個(gè)字符t發(fā)送兩次
}


中斷處理函數(shù)如下

void USART1_IRQHandler(void)
{
    if( USART_GetITStatus(USART1, USART_IT_TC) == SET  )
    {
        if( *pDataByte == '\0' )//TC需要 讀SR+寫DR 方可清0,當(dāng)發(fā)送到最后,到'\0'的時(shí)候用個(gè)if判斷關(guān)掉
            USART_ClearFlag(USART1, USART_FLAG_TC);//不然TC一直是set, TCIE也是打開(kāi)的,導(dǎo)致會(huì)不停進(jìn)入中斷. clear掉即可,不用關(guān)掉TCIE
        else
            USART_SendData(USART1, *pDataByte++ );
    }

}

其中u8 *pDataByte;是一個(gè)外部指針變量

在中斷處理程序中,發(fā)送完該字符串后,不用關(guān)閉TC的中斷使能TCIE,只需要清掉標(biāo)志位TC;這樣就能避免TC == SET 導(dǎo)致反復(fù)進(jìn)入中斷了。

串口初始化函數(shù)如下


void USART_Config()
{
  USART_InitTypeDef USART_InitStructure;//定義一個(gè)包含串口參數(shù)的結(jié)構(gòu)體
  
  USART_InitStructure.USART_BaudRate = 9600; //波特率9600
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位數(shù)據(jù)位
  USART_InitStructure.USART_StopBits = USART_StopBits_1;//1位停止位
  USART_InitStructure.USART_Parity = USART_Parity_No;//無(wú)校驗(yàn)
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無(wú)硬件流控制
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//輸入加輸出模式
  USART_InitStructure.USART_Clock = USART_Clock_Disable;//時(shí)鐘關(guān)閉
  USART_InitStructure.USART_CPOL = USART_CPOL_Low;
  USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
  USART_InitStructure.USART_LastBit = USART_LastBit_Disable;
  USART_Init(USART1, &USART_InitStructure);//設(shè)置到USART1
  
  USART_ITConfig(USART1, USART_IT_TC, ENABLE);//Tramsimssion Complete后,才產(chǎn)生中斷. 開(kāi)TC中斷必須放在這里,否則還是會(huì)丟失第一字節(jié)

  USART_Cmd(USART1, ENABLE); //使能USART1
}
這里請(qǐng)問(wèn)一個(gè)問(wèn)題:開(kāi)TC中斷USART_ITConfig()如果放在我的USART_SendDataString()中再開(kāi),會(huì)丟失字符串的第一字節(jié)。必須放在串口初始化函數(shù)中才不會(huì)丟。不知道為什么??

這里筆者可以給出解釋,你看下SECTION1 就可以知道為什么呢,你這樣做的原理和SECTION1講解的差不多,就相當(dāng)于延時(shí),而你后面沒(méi)有丟失數(shù)據(jù)的主要原因就是你代碼中有這么一句 USART_ClearFlag(USART1, USART_FLAG_TC);//清除傳輸完成標(biāo)志位,否則可能會(huì)丟失第1個(gè)字節(jié)的數(shù)據(jù).網(wǎng)友提供.


再說(shuō)判斷TXE。即Tx DR Empty,發(fā)送寄存器空。當(dāng)使能TXEIE后,只要Tx DR空了,就會(huì)產(chǎn)生中斷。所以,發(fā)送完字符串后必須關(guān)掉,否則會(huì)導(dǎo)致重復(fù)進(jìn)入中斷。這也是和TC不同之處。

發(fā)送函數(shù)如下:

void USART_SendDataString( u8 *pData )
{
    pDataByte = pData;
    USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//只要發(fā)送寄存器為空,就會(huì)一直有中斷,因此,要是不發(fā)送數(shù)據(jù)時(shí),把發(fā)送中斷關(guān)閉,只在開(kāi)始發(fā)送時(shí),才打開(kāi)。
   
}

中斷處理函數(shù)如下:


void USART1_IRQHandler(void)
{
    if( USART_GetITStatus(USART1, USART_IT_TXE) == SET  )
    {
        if( *pDataByte == '\0' )//待發(fā)送的字節(jié)發(fā)到末尾NULL了
            USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//因?yàn)槭?發(fā)送寄存器空 的中斷,所以發(fā)完字符串后必須關(guān)掉,否則只要空了,就會(huì)進(jìn)中斷
        else
            USART_SendData(USART1, *pDataByte++ );
    }

}

在串口初始化函數(shù)中就不用打開(kāi)TXE的中斷了(是在發(fā)送函數(shù)中打開(kāi)的)如下:

void USART_Config()
{
  USART_InitTypeDef USART_InitStructure;//定義一個(gè)包含串口參數(shù)的結(jié)構(gòu)體
  
  USART_InitStructure.USART_BaudRate = 9600; //波特率9600
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位數(shù)據(jù)位
  USART_InitStructure.USART_StopBits = USART_StopBits_1;//1位停止位
  USART_InitStructure.USART_Parity = USART_Parity_No;//無(wú)校驗(yàn)
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無(wú)硬件流控制
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//輸入加輸出模式
  USART_InitStructure.USART_Clock = USART_Clock_Disable;//時(shí)鐘關(guān)閉
  USART_InitStructure.USART_CPOL = USART_CPOL_Low;
  USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
  USART_InitStructure.USART_LastBit = USART_LastBit_Disable;

  USART_Init(USART1, &USART_InitStructure);//設(shè)置到USART1
  
  USART_Cmd(USART1, ENABLE); //使能USART1
}

SECTION 3


在USART的發(fā)送端有2個(gè)寄存器,一個(gè)是程序可以看到的USART_DR寄存器(下圖中陰影部分的TDR),另一個(gè)是程序看不到的移位寄存器(下圖中陰影部分Transmit Shift Register)。

對(duì)應(yīng)USART數(shù)據(jù)發(fā)送有兩個(gè)標(biāo)志,一個(gè)是TXE=發(fā)送數(shù)據(jù)寄存器空,另一個(gè)是TC=發(fā)送結(jié)束;對(duì)照下圖,當(dāng)TDR中的數(shù)據(jù)傳送到移位寄存器后,TXE被設(shè)置,此時(shí)移位寄存器開(kāi)始向TX信號(hào)線按位傳輸數(shù)據(jù),但因?yàn)門DR已經(jīng)變空,程序可以把下一個(gè)要發(fā)送的字節(jié)(操作USART_DR)寫入TDR中,而不必等到移位寄存器中所有位發(fā)送結(jié)束,所有位發(fā)送結(jié)束時(shí)(送出停止位后)硬件會(huì)設(shè)置TC標(biāo)志。

另一方面,在剛剛初始化好USART還沒(méi)有發(fā)送任何數(shù)據(jù)時(shí),也會(huì)有TXE標(biāo)志,因?yàn)檫@時(shí)發(fā)送數(shù)據(jù)寄存器是空的。

TXEIE和TCIE的意義很簡(jiǎn)單,TXEIE允許在TXE標(biāo)志為'1'時(shí)產(chǎn)生中斷,而TCIE允許在TC標(biāo)志為'1'時(shí)產(chǎn)生中斷。

至于什么時(shí)候使用哪個(gè)標(biāo)志,需要根據(jù)你的需要自己決定。但我認(rèn)為TXE允許程序有更充裕的時(shí)間填寫TDR寄存器,保證發(fā)送的數(shù)據(jù)流不間斷。TC可以讓程序知道發(fā)送結(jié)束的確切時(shí)間,有利于程序控制外部數(shù)據(jù)流的時(shí)序。


SECTION 4

        總的來(lái)說(shuō),STM32單片機(jī)的串口還是很好理解的,編程也不算復(fù)雜。當(dāng)然我更愿意希望其中斷系統(tǒng)和51單片機(jī)一樣的簡(jiǎn)單。
        對(duì)于接收終端,就是RXNE了,這只在接收完成后才產(chǎn)生,在執(zhí)行USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)代碼時(shí)不會(huì)進(jìn)入ISR。但麻煩的就是發(fā)送有關(guān)的中斷了:TXE或者TC,根據(jù)資料和測(cè)試的結(jié)果,TXE在復(fù)位后就是置1的,即在執(zhí)行USART_ITConfig(USART1, USART_IT_TXE,  ENABLE)后會(huì)立即產(chǎn)生中斷請(qǐng)求。因此這造成一個(gè)麻煩的問(wèn)題:如果沒(méi)有真正的發(fā)送數(shù)據(jù),TXE中斷都會(huì)發(fā)生,而且沒(méi)有休止,這將占用很大部分的CPU時(shí)間,甚至影響其他程序的運(yùn)行!
        因此建議的是在初始化時(shí)不好啟用TXE中斷,只在要發(fā)送數(shù)據(jù)(尤其是字符串、數(shù)組這樣的系列數(shù)據(jù))時(shí)才啟用TXE。在發(fā)送完成后立即將其關(guān)閉,以免引起不必要的麻煩。
        對(duì)于發(fā)送,需要注意TXE和TC的差別——這里簡(jiǎn)單描述一下,假設(shè)串口數(shù)據(jù)寄存器是DR、串口移位寄存器是SR以及TXD引腳TXDpin,其關(guān)系是DR->SR->TXDpin。當(dāng)DR中的數(shù)據(jù)轉(zhuǎn)移到SR中時(shí)TXE置1,如果有數(shù)據(jù)寫入DR時(shí)就能將TXE置0;如果SR中的數(shù)據(jù)全部通過(guò)TXDpin移出并且沒(méi)有數(shù)據(jù)進(jìn)入DR,則TC置1。并且需要注意TXE只能通過(guò)寫DR來(lái)置0,不能直接將其清零,而TC可以直接將其寫1清零。        對(duì)于發(fā)送單個(gè)字符可以考慮不用中斷,直接以查詢方式完成。
        對(duì)于發(fā)送字符串/數(shù)組類的數(shù)據(jù),唯一要考慮的是只在最后一個(gè)字符發(fā)送后關(guān)閉發(fā)送中斷,這里可以分為兩種情況:對(duì)于發(fā)送可顯示的字符串,其用0x00作為結(jié)尾的,因此在ISR中就用0x00作為關(guān)閉發(fā)送中斷(TXE或者TC)的條件;第二種情況就是發(fā)送二進(jìn)制數(shù)據(jù),那就是0x00~0xFF中間的任意數(shù)據(jù),就不能用0x00來(lái)判斷結(jié)束了,這時(shí)必須知道數(shù)據(jù)的具體長(zhǎng)度。
       這里簡(jiǎn)單分析上面代碼的執(zhí)行過(guò)程:TXE中斷產(chǎn)生于前一個(gè)字符從DR送入SR,執(zhí)行效果是后一個(gè)字符送入DR。對(duì)于第一種情況,如果是可顯示字符,就執(zhí)行USART_SendData來(lái)寫DR(也就清零了TXE),當(dāng)最后一個(gè)可顯示的字符從DR送入SR之后,產(chǎn)生的TXE中斷發(fā)現(xiàn)要送入DR的是字符是0x00——這當(dāng)然不行——此時(shí)就關(guān)閉TXE中斷,字符串發(fā)送過(guò)程就算結(jié)束了。當(dāng)然這時(shí)不能忽略一個(gè)隱含的結(jié)果:那就是最后一個(gè)可顯示字符從DR轉(zhuǎn)入SR后TXE是置1的,但關(guān)閉了TXE中斷,因此只要下次再開(kāi)啟TXE中斷就會(huì)立即進(jìn)入ISR。對(duì)于第二種情況,其結(jié)果和第一種的相同。

         對(duì)于第一種情況,其程序可以這么寫:其中TXS是保存了要發(fā)送數(shù)據(jù)的字符串,TxCounter1是索引值:
extern __IO uint8_t TxCounter1;
extern uint8_t *TXS;
extern __IO uint8_t TxLen;
void USART1_IRQHandler(void)
    {
        if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
            {                                               
                if(TXS[TxCounter1]) //如果是可顯示字符
                    { USART_SendData(USART1,TXS[TxCounter1++]);}
                else   //發(fā)送完成后關(guān)閉TXE中斷,
                    { USART_ITConfig(USART1,USART_IT_TXE,DISABLE);}                                                        
            }                  
    }
        對(duì)于第二種情況,和上面的大同小異,其中TXLen表示要發(fā)送的二進(jìn)制數(shù)據(jù)長(zhǎng)度:
void USART1_IRQHandler(void)
    {
        if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //對(duì)USART_DR的寫操作,將該位清零。
            {                                             
                if(TxCounter1
                    { USART_SendData(USART1,TXS[TxCounter1++]);}
                else   //發(fā)送完成后關(guān)閉TXE中斷
                    { USART_ITConfig(USART1,USART_IT_TXE,DISABLE);}                                                         
            }                    
    }
        事實(shí)上第一種情況是第二種的特殊形式,就是說(shuō)可以用第二種情況去發(fā)送可顯示的字符——當(dāng)然沒(méi)人有閑心去數(shù)一句話里有多少個(gè)字母空格和標(biāo)點(diǎn)符號(hào)!
        在使用時(shí),只要將TXS指向要發(fā)送的字符串或者數(shù)組,設(shè)置TxLen為要發(fā)送的數(shù)據(jù)長(zhǎng)度,然后執(zhí)行USART_ITConfig(USART1, USART_IT_TXE,ENABLE)就立即開(kāi)始發(fā)送過(guò)程。用戶可以檢查TxCounter1來(lái)確定發(fā)送了多少字節(jié)。比如以第二種情況為例:
uint32_t *TXS;
uint8_t TxBuffer1[]="0123456789ABCDEF";
uint8_t DST2[]="ASDFGHJKL";
__IO uint8_t TxLen = 0x00;
     TxLen=8;                               //發(fā)送8個(gè)字符,最終發(fā)送的是01234567
    TXS=(uint32_t *)TxBuffer1;   //將TXS指向字符串TxBuffer1
    TxCounter1=0;                     //復(fù)位索引值
    USART_ITConfig(USART1, USART_IT_TXE,ENABLE);   //啟用TXE中斷,即開(kāi)始發(fā)送過(guò)程
    while(TxCounter1!=TxLen);   //等待發(fā)送完成

    TXS=(uint32_t *)TxBuffer2;   //同上,最終發(fā)送的是ASDFGHJK
    TxCounter1=0;
    USART_ITConfig(USART1, USART_IT_TXE,ENABLE);
    while(TxCounter1!=TxLen);
        以上就是我認(rèn)為的最佳方案,但串口中斷方式數(shù)據(jù)有多長(zhǎng)就中斷多少次,我認(rèn)為還是占用不少CPU時(shí)間,相比之下DMA方式就好多了,因?yàn)镈MA發(fā)送字符串時(shí)最多中斷兩次(半傳輸完成,全傳輸完成),并且將串口變成類似16C550的器件。



回復(fù)

使用道具 舉報(bào)

地板
ID:75321 發(fā)表于 2016-3-24 11:33 | 只看該作者
最近有個(gè)項(xiàng)目的程序用到串口中斷,看了樓主寫的東西受益匪淺,感謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲三级在线观看 | 免费午夜视频 | 日日夜夜狠狠操 | 久久激情网 | 欧美精品一区二区三区在线播放 | 激情 婷婷 | 中文字幕在线视频观看 | 日批av| 少妇久久久久 | a国产视频| 国产99视频精品免费视频7 | 黑人精品欧美一区二区蜜桃 | 精品久久久久久一区二区 | 日韩精品免费一区二区在线观看 | 亚洲精品永久免费 | а天堂中文最新一区二区三区 | 精品欧美一区二区三区久久久 | 久久久精品综合 | 久久久亚洲综合 | 国产一区欧美一区 | 香蕉久久久 | 岛国精品| 最新日韩在线视频 | 天堂一区二区三区 | 亚洲国产一区二区三区在线观看 | 亚洲国产精品自拍 | 精品国产一区二区国模嫣然 | 亚洲91视频 | 久久伊人影院 | 国产免费福利在线 | 亚洲永久入口 | 91青青草视频 | 欧美激情亚洲 | 一区二区三区四区五区在线视频 | 东京av男人的天堂 | 亚洲免费在线 | 久久久www成人免费无遮挡大片 | 成年人网站免费视频 | 色综合激情 | 99免费视频 | 欧美色视频免费 |