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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6375|回復: 1
打印 上一主題 下一主題
收起左側

MSP430定時器筆記

[復制鏈接]
跳轉到指定樓層
樓主
1.定時器參數
1.1 基本定時器
typedef enum
{
  TIMER_A0              ,
  TIMER_A1              ,
  TIMER_A2              ,
  TIMER_B0              ,
  TIMER_NUM             ,
}TIMERn;             //定時器模塊



1.2 定時器通道引腳、時鐘選擇
const GPIO_PIN TIMER_CHANEL_PIN[TIMER_NUM][TIMER_CH_NUM]=
{// CH0    CH1    CH2    CH3    CH4    CH5    CH6
  {{P1,1},{P1,2},{P1,3},{P1,4},{P1,5}},                  //TIMER_A0
  {{P1,7},{P2,0},{P2,1}},                                //TIMER_A1
  {{P2,3},{P2,4},{P2,5}},                                //TIMER_A2
  {{P5,6},{P5,7},{P7,4},{P7,5},{P7,6},{P3,5},{P3,6}}     //TIMER_B0
};//通道引腳
const GPIO_PIN TIMER_CLK_PIN[TIMER_NUM] =
{
  {P1,0},//TIMER_A0----ACLK----
  {P1,6},//TIMER_A1----ACLK----
  {P2,2},//TIMER_A2----SMCLK----
  {P7,7} //TIMER_B0----MCLK----
};//外部時鐘輸入引腳



2.定時器功能
2.1 實現基本定時
extern STATUS   TIMER_Interval_Us   (TIMERn, uint32_t us);  //初始化一個us級的定時中斷
#define         TIMER_Interval_Ms(timer,ms)  TIMER_Interval_Us(timer,(uint32_t)ms*1000)



2.1.1 中斷向量設置傳參
/*******************************************************************************
*  函數名稱:Set_Vector_Handler(VECTORn vector,__interrupt void pfunc_handler(void))
*  功能說明:設置中斷向量地址
*  參數說明:
            VECTORn vector  :中斷向量(枚舉變量,見.h文件)
            __interrupt void pfunc_handler(void)  : 中斷服務函數
*  函數返回:無
*  使用示例:Set_Vector_Handler(VECTOR_PORT1,GPIO_IRQ_Handler);    //設置PPORT1中斷服務函數為GPIO_IRQ_Handler,需要先定義中斷服務函數,另外最好先設置中斷向量,再開啟中斷
********************************************************************************/
void Set_Vector_Handler(VECTORn vector, __interrupt void pfunc_handler(void))
{
  if(SYSX->RIVECT == DISABLE)        //如果沒有設置中斷向量表到RAM,則設置
  {
    Set_VectorTable_To_RAM();                       //設置中斷向量表到RAM
  }
  //此處若有警告可忽略
  __VECTOR_RAM[vector] = (ISR_TYPE)pfunc_handler;     //設置該中斷向量地址
}



2.1.2 定時中斷
/*******************************************************************************
*  函數名稱:TIMER_Interval_Us(TIMERn timer,uint32_t us)
*  功能說明:定時器定時初始化(單位:us)
*  參數說明:TIMERn timer       :定時器模塊
             uint32_t us          : 定時時間
*  函數返回:不成功則返回ERROR,成功則返回SUCCESS
*  使用例程:TIMER_Interval_Us(TIMER_B0,2500);  //TB定時間隔2.5ms中斷
********************************************************************************/
STATUS  TIMER_Interval_Us(TIMERn timer,uint32_t us)
{
#ifdef DELAY_TIMER
  ASSERT((timer != DELAY_TIMER),
         "TIMER_Interval_Us",
         "定時器已經設置為默認延時功能,不能再作為其他功能使用");       //不允許這種情況下還宏定義該定時器作為延時所用的定時器,請在system.h里修改DELAY_TIMER宏定義
#endif
  TIMERX[timer]->CLR = BIT_SET;//置位
  TIMERX[timer]->SSEL = TIMER_SSEL_SMCLK;
  TIMERX[timer]->ID = 0u;//分頻系數清零
  //計數值
  uint32_t Counter_Value = (uint32_t)(us * g_sClock.SMCLK.fMHZ);
  while(Counter_Value > 65536)
  {
     TIMERX[timer]->ID ++;
     Counter_Value >>= 1;  
     if((TIMERX[timer]->ID == 3u) && (Counter_Value > 65536))   //這個時候意味得選擇更低頻率的時鐘了
     {
      if(TIMERX[timer]->SSEL == TIMER_SSEL_ACLK) //如果時鐘已經是最低的ACLK了,那么意味著設置的頻率太低了,失敗返回ERROR
      {
        return ERROR;
      }
      //更換為更低的ACLK,從新配置
      TIMERX[timer]->SSEL = TIMER_SSEL_ACLK;
      TIMERX[timer]->ID = 0u;  
      Counter_Value = (uint32_t)(us * g_sClock.ACLK.fMHZ);
      continue;  
     }
  }
  if(Counter_Value <= 1)//出現這種情況,說明頻率不合適
  {
    return ERROR;
  }
  
  TIMERX[timer]->CCR[0] = (uint16_t)(Counter_Value - 1u);//為什么要減一??因為TAR/TBR計數器從CCR0變化到0還有一個計數周期
  TIMERX[timer]->CCTL[0].CAPMODE = RESET;//比較模式
  TIMERX[timer]->IE = RESET;             //關閉溢出中斷
  TIMERX[timer]->CCTL[0].IE = RESET;     //關閉通道中斷
  TIMERX[timer]->MC = TIMER_MC_UP;      //增計數模式
  
  return SUCCESS;
}



2.1.3 初始化實例
DisableInterrupts();          //禁止總中斷


Set_Vector_Handler(VECTOR_TIMER0_A0,TIMER_TA0_IRQ_Handler);    //設置中斷向量,最好先設置中斷向量,在開啟中斷
  TIMER_Interval_Ms(TIMER_A0,200);//初始化一個200ms的定時中斷
  //TIMER_Interval_Us(TIMER_A0,1000000);                    //初始化一個1000ms的定時中斷,不要寫為1000*1000,否則會提示超出范圍
  TIMER_ITConfig (TIMER_A0,TIMER_CCR0_IRQn,ENABLE);


EnableInterrupts();


__interrupt void TIMER_TA0_IRQ_Handler()
{
  LED_Turn(LED2); //黃燈
  //FLAG_10MS=1;
}



2.2 PWM輸出
2.2.1 PWM計數模式
#define TIMER_MC_STOP         (0)  /* Timer A mode control: 0 - Stop */
#define TIMER_MC_UP           (1)  /* Timer A mode control: 1 - Up to CCR0 */
#define TIMER_MC_CONTINUOUS   (2)  /* Timer A mode control: 2 - Continuous up */
#define TIMER_MC_CONTINOUS    (2)  /* Legacy define */
#define TIMER_MC_UPDOWN       (3)  /* Timer A mode control: 3 - Up/Down */



2.2.2 PWM輸出模式
typedef enum
{
  TIMER_PWM_OUTMOD0     ,
  TIMER_PWM_OUTMOD1     ,
  TIMER_PWM_OUTMOD2     ,
  TIMER_PWM_OUTMOD3     ,
  TIMER_PWM_OUTMOD4     ,
  TIMER_PWM_OUTMOD5     ,
  TIMER_PWM_OUTMOD6     ,
  TIMER_PWM_OUTMOD7     ,
}TIMER_PWM_OUTMODn;       //PWM波輸出波形



各種計數情況下pwm輸出模式




2.3 pwm輸出
2.3.1 pwm初始化
/*******************************************************************************
*  函數名稱:TIMER_PWM_MultiChannel_Init(TIMERn timer, uint32_t fre, uint8_t ChannelNum,...)
*  功能說明:定時器PWM輸出初始化(可以多個通道同時初始化)
*  參數說明:TIMERn timer       :定時器模塊
             uint32_t fre         :頻率
             uint8_t ChannelNum   :要初始化的通道數
             ...                :初始化的通道
*  函數返回:不成功則返回ERROR,成功則返回SUCCESS
********************************************************************************/
STATUS TIMER_PWM_MultiChannel_Init(TIMERn timer, uint32_t fre, uint8_t ChannelNum,...)
{
#ifdef DELAY_TIMER
  ASSERT((timer != DELAY_TIMER),
         "TIMER_PWM_MultiChannel_Init",
         "定時器已經設置為默認延時功能,不能再作為其他功能使用");       //不允許這種情況下還宏定義該定時器作為延時所用的定時器,請在system.h里修改DELAY_TIMER宏定義
#endif
  ASSERT((timer==TIMER_A0&&ChannelNum<=TIMER_CH4)
       ||(timer==TIMER_A1&&ChannelNum<=TIMER_CH2)
       ||(timer==TIMER_A2&&ChannelNum<=TIMER_CH2)
       ||(timer==TIMER_B0&&ChannelNum<=TIMER_CH6),
       "TIMER_PWM_MultiChannel_Init",
       "定時器通道參數超出范圍!"); //斷言檢測輸入參數*/
  
  va_list ap;
  va_start(ap,ChanelNum);
  for(int i=0;i < ChannelNum;i++)           //根據初始化的通道數,逐一初始化通道
  {
    TIMER_CHn ch = va_arg(ap, TIMER_CHn);  //讀取要初始化的通道
    if((ch == TIMER_CH0) || (ch >= TIMER_CH_NUM))   //判斷通道值是否合理
    {
      return ERROR;                                 //不合理返回ERROR
    }
    //初始化端口
    GPIO_Init(TIMER_CHANEL_PIN[timer][ch].Port,TIMER_CHANEL_PIN[timer][ch].Pin,GPO|SEL);
    //初始化占空比及輸出波形
    TIMERX[timer]->CCR[ch] = 0u;
    TIMERX[timer]->CCTL[ch].IE = RESET;               //關閉通道中斷
    TIMERX[timer]->CCTL[ch].OUTMOD = DEFAULT_PWM_OUTMOD;      //輸出波形設置
    TIMERX[timer]->CCTL[ch].CAPMODE = RESET;          //比較模式
  }
  va_end(ap);
  
  return TIMER_PWM_SetFrequency(timer,fre);
}



設置頻率函數
/*******************************************************************************
*  函數名稱:TIMER_PWM_SetFrequency(TIMERn timer,uint32_t fre)
*  功能說明:定時器PWM頻率設置(注意這里沒有更改各個通道的占空比,所以修改頻率后占空比變了,需要從新設置占空比)
*  參數說明:TIMERn timer       :定時器模塊
             uint32_t fre         :頻率
*  函數返回:不成功則返回ERROR,成功則返回SUCCESS
*  使用例程:TIMER_PWM_SetFrequency(TIMER_B0,1000);       //將定時器B輸出頻率修改為1000Hz
********************************************************************************/
STATUS  TIMER_PWM_SetFrequency(TIMERn timer,uint32_t fre)
{
  if(fre == 0u)
  {
    TIMERX[timer]->MC = TIMER_MC_STOP;              //暫停輸出PWM波
    return SUCCESS;
  }
  
  TIMERX[timer]->CLR = BIT_SET;
  TIMERX[timer]->SSEL = TIMER_SSEL_SMCLK;           //先選擇時鐘源為SMCLK
  TIMERX[timer]->ID = 0u;                           //分頻系數清零
  //時鐘大小
  uint32_t Counter_Value = g_sClock.SMCLK.nHZ/fre;                 //計算計數值
  while(Counter_Value > 65536u)        //這里不是0xffff,因為后面會-1,所以是(0xffff+1)=65536
  {  //分頻一次
     TIMERX[timer]->ID ++;         
     Counter_Value >>= 1;         
     
     if((TIMERX[timer]->ID == 3u) && (Counter_Value > 65536))   //這個時候意味得選擇更低頻率的時鐘了
     {
       if(TIMERX[timer]->SSEL == TIMER_SSEL_ACLK)   //如果時鐘已經是最低的ACLK了,那么意味著設置的頻率太低了,失敗返回ERROR
       {
         return ERROR;
       }
       //更換為更低的ACLK,從新配置
       TIMERX[timer]->SSEL = TIMER_SSEL_ACLK;
       TIMERX[timer]->ID = 0u;  
       Counter_Value = g_sClock.ACLK.nHZ/fre;
       continue;  
     }
  }
  if(Counter_Value <= 1)//出現這種情況,說明頻率不合適
  {
    return ERROR;
  }


  TIMERX[timer]->CCR[0] = (uint16_t)(Counter_Value - 1u);
//為什么要減一??因為TAR/TBR計數器從CCR0變化到0還有一個計數周期
  TIMERX[timer]->IE = RESET;                      //關閉中斷
  //TIMERX[timer]->MC = TIMER_MC_UP;                //增計數模式
  TIMERX[timer]->MC = TIMER_MC_UPDOWN;      //增減計數模式
  
  return SUCCESS;
}



2.3.2 使用例程:
實例一:(使用函數初始化時需要輸入初始化通道數,初始化通道數可以為0,如:

TIMER_PWM_MultiChannel_Init(TIMER_A0, 1000, 0);)
TIMER_PWM_MultiChannel_Init(TIMER_A0, 1000, 3, TIMER_CH1, TIMER_CH2, TIMER_CH4);
//定時器TIMER_A0初始化輸出PWM波,頻率為1000Hz,初始化3個通道,分別是:TIMER_CH1,TIMER_CH2,TIMER_CH4

實例二:(使用宏定義初始化時不需要輸入初始化通道數)

TIMER_PWM_Init(TIMER_B0,1000,TIMER_CH1,TIMER_CH2,TIMER_CH3,TIMER_CH4,TIMER_CH5,TIMER_CH6);
//定時器TIMER_B0初始化輸出PWM波,頻率為1000Hz,初始化6個通道:TIMER_CH1,TIMER_CH2,TIMER_CH3,TIMER_CH4,TIMER_CH5,TIMER_CH6



2.3.3 初始化實例
TIMER_PWM_Init(TIMER_A0,66000, TIMER_CH1, TIMER_CH2, TIMER_CH3, TIMER_CH4);


TIMER_PWM_SetChannelDuty(TIMER_A0,TIMER_CH1,200);//設置某一個定時器某一個通道的占空比
TIMER_PWM_SetChannelDuty(TIMER_A0,TIMER_CH2,400);//設置某一個定時器某一個通道的占空比
TIMER_PWM_SetChannelDuty(TIMER_A0,TIMER_CH3,600);//設置某一個定時器某一個通道的占空比
TIMER_PWM_SetChannelDuty  (TIMER_A0,TIMER_CH4,800);//設置某一個定時器某一個通道的占空比


TIMER_PWM_MultiChannel_Init(TIMER_B0, 33000, 1, TIMER_CH5);  
//TIMER_PWM_Init(TIMER_B0, 1, TIMER_CH5);
  
TIMER_PWM_SetChannelDuty  (TIMER_B0,TIMER_CH5,500);     //設置某一個定時器某一個通道的占空比
GPIO_PinRemapConfig(P4,7,GPIO_Remap_TB0CCR5A);        //GPIO端口重映射



2.4 互補pwm波形
//定時器A0,頻率1K,占空比為0,初始化4個通道,分別是:TIMER_CH1(P1.2), TIMER_CH2(P1.3), TIMER_CH3(P1.4), TIMER_CH4(P1.5)
//TIMER_PWM_MultiChannel_Init(TIMER_A0,1000, 4, TIMER_CH1, TIMER_CH2, TIMER_CH3, TIMER_CH4);  
TIMER_PWM_Init(TIMER_A0,66000, TIMER_CH1, TIMER_CH2, TIMER_CH3, TIMER_CH4);     


TIMERX[TIMER_A0]->CCTL[2].OUTMOD = TIMER_PWM_OUTMOD2;
TIMERX[TIMER_A0]->CCTL[3].OUTMOD = TIMER_PWM_OUTMOD6;
TIMERX[TIMER_A0]->MC = TIMER_MC_UP;//增計數模式


TIMER_PWM_SetChannelDuty(TIMER_A0,TIMER_CH1,200);//設置某一個定時器某一個通道的占空比
TIMER_PWM_SetChannelDuty(TIMER_A0,TIMER_CH2,400);//設置某一個定時器某一個通道的占空比
TIMER_PWM_SetChannelDuty(TIMER_A0,TIMER_CH3,600);//設置某一個定時器某一個通道的占空比
TIMER_PWM_SetChannelDuty(TIMER_A0,TIMER_CH4,800);//設置某一個定時器某一個通道的占空比



2.5 帶死區的pwm輸出
//定時器A0,頻率1K,占空比為0,初始化4個通道,分別是:TIMER_CH1(P1.2), TIMER_CH2(P1.3), TIMER_CH3(P1.4), TIMER_CH4(P1.5)
//TIMER_PWM_MultiChannel_Init(TIMER_A0,1000, 4, TIMER_CH1, TIMER_CH2, TIMER_CH3, TIMER_CH4);  
TIMER_PWM_Init(TIMER_A0,66000, TIMER_CH1, TIMER_CH2, TIMER_CH3, TIMER_CH4);     
TIMERX[TIMER_A0]->CCTL[2].OUTMOD = TIMER_PWM_OUTMOD2;
TIMERX[TIMER_A0]->CCTL[3].OUTMOD = TIMER_PWM_OUTMOD6;
TIMERX[TIMER_A0]->MC = TIMER_MC_UPDOWN;      //增減計數模式


TIMER_PWM_SetChannelDuty  (TIMER_A0,TIMER_CH1,200);//設置某一個定時器某一個通道的占空比
TIMER_PWM_SetChannelDuty  (TIMER_A0,TIMER_CH2,400);//設置某一個定時器某一個通道的占空比
TIMER_PWM_SetChannelDuty  (TIMER_A0,TIMER_CH3,600);//設置某一個定時器某一個通道的占空比
TIMER_PWM_SetChannelDuty  (TIMER_A0,TIMER_CH4,800);//設置某一個定時器某一個通道的占空比



3.定時捕獲
3.1 捕獲過程




3.2 計數初始化
/*******************************************************************************
*  函數名稱:TIMER_Pluse_Init    (TIMERn timer)
*  功能說明:定時器脈沖計數初始化
*  參數說明:TIMERn timer       :定時器模塊
*  函數返回:不成功則返回ERROR,成功則返回SUCCESS
*  使用例程:TIMER_Pluse_Init    (TIMER_A1);    //定時器TA1初始化為脈沖計數功能
********************************************************************************/
STATUS  TIMER_Pluse_Init    (TIMERn timer)
{
#ifdef DELAY_TIMER
  ASSERT((timer != DELAY_TIMER),
         "TIMER_Pluse_Init",
         "定時器已經設置為默認延時功能,不能再作為其他功能使用");       //不允許這種情況下還宏定義該定時器作為延時所用的定時器,請在system.h里修改DELAY_TIMER宏定義
#endif
  //端口設置為輸入方向//選擇第二功能
  GPIO_Init(TIMER_CLK_PIN[timer].Port,TIMER_CLK_PIN[timer].Pin,GPI|SEL);
  
  TIMERX[timer]->CLR = BIT_SET;                       
  TIMERX[timer]->SSEL = TIMER_SSEL_INCLK;             //時鐘源選擇為外部輸入
  TIMERX[timer]->ID = 0u;                             //不分頻
  TIMERX[timer]->MC = TIMER_MC_CONTINOUS;             //連續計數模式
  TIMERX[timer]->IE = RESET;                          //禁止溢出中斷
  
  return SUCCESS;
}



3.3 中斷處理函數
/*******************************************************************************
*  函數名稱:TIMER_ITConfig (TIMERn timer,TIMER_IRQn irqn,STATUS ITState)
*  功能說明:設置是否使能TIMER的某一個中斷
*  參數說明:TIMERn timer       :定時器模塊
             TIMER_IRQn irqn    :中斷事件
             STATUS ITState     :是否使能中斷
*  函數返回:無
*  使用例程:TIMER_ITConfig (TIMAER_A1,TIMER_CCR0_IRQn,ENABLE); //使能定時器1通道0中斷,即定時中斷
********************************************************************************/
void  TIMER_ITConfig (TIMERn timer,TIMER_IRQn irqn,STATUS ITState)
{
  if(irqn == TIMER_OverFlow_IRQn)
  {
    TIMERX[timer]->IE = ITState;
  }
  else
  {
    TIMERX[timer]->CCTL[irqn].IE = ITState;
  }
}



3.4 計數值獲取
/*******************************************************************************
*  函數名稱:TIMER_Pluse_GetValue(TIMERn timer,uint16_t overflowTime)
*  功能說明:定時器脈沖計數值獲取
*  參數說明:TIMERn timer       :定時器模塊
             uint16_t overflowTime :計數器溢出次數
*  函數返回:定時器脈沖計數值
*  使用例程:
             int32 pulse = TIMER_Pluse_GetValue(TIMER_A1,0);    //在沒有發生溢出的情況下讀取脈沖個數
             TIMER_Pluse_Clear   (TIMER_A1);                    //讀取后應該要清零
********************************************************************************/
float TIMER_Pluse_GetValue(TIMERn timer,uint16_t overflowTime)
{
  return (TIMERX[timer]->R + (overflowTime*65536u));
}



3.5 初始化實例
//設置中斷向量,最好先設置中斷向量,在開啟中斷

Set_Vector_Handler(VECTOR_TIMER0_A0,TIMER_TA0_IRQ_Handler);
TIMER_Interval_Ms(TIMER_A0,1000); //初始化一個1000ms的定時中斷  1s定時
TIMER_ITConfig (TIMER_A0,TIMER_CCR0_IRQn,ENABLE); //使能TIMER的某一個中斷
__interrupt void TIMER_TA0_IRQ_Handler()
{
   //讀取脈沖數
   PulseValue = TIMER_Pluse_GetValue(TIMER_A1,overflowTime);
   overflowTime=0;              //清除溢出次數
   TIMER_Pluse_Clear   (TIMER_A1);
}


//設置中斷向量,最好先設置中斷向量,在開啟中斷
Set_Vector_Handler(VECTOR_TIMER1_A1,TIMER_TA1_IRQ_Handler);   
TIMER_Pluse_Init    (TIMER_A1);  //定時器A1用作脈沖計數,P1.6,默認以開啟溢出中斷
TIMER_ITConfig (TIMER_A1,TIMER_OverFlow_IRQn,ENABLE); //使能TIMER的某一個中斷
__interrupt void TIMER_TA1_IRQ_Handler()
{
   overflowTime++;
}





4.計時功能
    Set_Vector_Handler(VECTOR_TIMER0_B1,TIMER_TB0_IRQ_Handler);    //設置中斷向量,最好先設置中斷向量,在開啟中斷
    TIMER_Timer_Init (TIMER_B0);//計時功能初始化
    TIMER_ITConfig (TIMER_B0,TIMER_OverFlow_IRQn,TRUE);


    TIMER_Timer_Start   (TIMER_B0);//計時功能啟動
    TIMER_Delay_Ms       (TIMER_A0,50);  //延時500MS
    TIMER_Timer_Stop    (TIMER_B0); //計時功能停止,返回計數值
    time = TIMER_Timer_GetTime_Us(TIMER_B0, overflowTime); //讀取計時時間(單位:US)


__interrupt voidTIMER_TB0_IRQ_Handler()
{
   LED_Turn(LED1);               //指示燈閃爍
   if(TIMER_GetITStatus(TIMER_B0,TIMER_OverFlow_IRQn) == TRUE)//如果溢出
   {
     overflowTime++;          //溢出值加1
     TIMER_ClearITPendingBit(TIMER_B0,TIMER_OverFlow_IRQn);     //清除TIMER的某一個中斷標志
   }
}






3.png (150.84 KB, 下載次數: 143)

3.png

評分

參與人數 2黑幣 +62 收起 理由
bjergsent + 12 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:104472 發表于 2020-4-8 16:23 | 只看該作者
看起來很高大上,其實不然,只有自己看的懂,沒有開發要求,開發的環境,只是從大程序里面截取了子函數,華而不實。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色花av| 国产精品久久久久久吹潮 | 91久久精品国产91久久 | 国精产品一区二区三区 | 日韩综合在线播放 | 中文字幕伊人 | 一级一级一级毛片 | 中国美女一级黄色片 | 日本成人片在线观看 | 久草视频观看 | 国产日韩欧美一区二区 | 久久久久亚洲 | 中文字幕一区在线 | 久久一级 | 三级黄色片在线观看 | 婷婷狠狠| 中文字幕亚洲国产 | 欧美11一13sex性hd | 亚洲日日夜夜 | 国产精品国色综合久久 | 国产精品永久免费视频 | 欧美网址在线观看 | 91精品久久久久久久久中文字幕 | av中文字幕网 | 91精品中文字幕一区二区三区 | 欧美精品一区二区在线观看 | 欧美激情欧美激情在线五月 | 中文字幕视频在线观看 | 欧美在线天堂 | 黄色大片在线免费观看 | 国产99久久久国产精品下药 | 国产免费一区 | 一级毛片,一级毛片 | 国产成人久久精品一区二区三区 | 久久久观看| 亚洲国产成人精品女人久久久 | 精品日韩| 亚洲国产网址 | 国产视频一区二区 | 91视频久久| 亚洲精品一区二区三区中文字幕 |