<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32 CAN學(xué)習

STM32 CAN學(xué)習

作者: 時(shí)間:2016-11-13 來(lái)源:網(wǎng)絡(luò ) 收藏
最近在搞stm32實(shí)驗板的can現場(chǎng)總線(xiàn)實(shí)驗,之前只是搞過(guò)STC51的串口通信,相比之下,發(fā)覺(jué)can總線(xiàn)都挺復雜的。開(kāi)始時(shí),知道自己是新手,只知道can總線(xiàn)跟串行通信,485通信,I2C通信一樣都是用來(lái)傳輸數據通信的,對其工作原理一竅不通,還是從基礎開(kāi)始看書(shū)看資料,先了解它的基本原理吧。
原來(lái)can總線(xiàn)有以下特點(diǎn):
主要特點(diǎn)
?支持CAN協(xié)議2.0A和2.0B主動(dòng)模式
?波特率最高可達1兆位/秒
?支持時(shí)間觸發(fā)通信功能
發(fā)送
?3個(gè)發(fā)送郵箱
?發(fā)送報文的優(yōu)先級特性可軟件配置
?記錄發(fā)送SOF時(shí)刻的時(shí)間戳
接收
?3級深度的2個(gè)接收FIFO
?14個(gè)位寬可變的過(guò)濾器組-由整個(gè)CAN共享
?標識符列表
?FIFO溢出處理方式可配置
?記錄接收SOF時(shí)刻的時(shí)間戳
可支持時(shí)間觸發(fā)通信模式
?禁止自動(dòng)重傳模式
?16位自由運行定時(shí)器
?定時(shí)器分辨率可配置
?可在最后2個(gè)數據字節發(fā)送時(shí)間戳
管理
?中斷可屏蔽
?郵箱占用單獨1塊地址空間,便于提高軟件效率
看完這些特點(diǎn)后,疑問(wèn)一個(gè)一個(gè)地出現,
1. 什么是時(shí)間觸發(fā)功能?
2. 發(fā)送郵箱是什么來(lái)的?
3. 報文是什么來(lái)的?
4. 什么叫時(shí)間戳?
5. 什么叫接收FIFO?
6. 什么叫過(guò)濾器?
好了,帶著(zhù)疑問(wèn)往下看,看完一遍后,
報文:
報文包含了將要發(fā)送的完整的數據信息
發(fā)送郵箱:
共有3個(gè)發(fā)送郵箱供軟件來(lái)發(fā)送報文。發(fā)送調度器根據優(yōu)先級決定哪個(gè)郵箱的報文先被發(fā)送。
接收過(guò)濾器:
共有14個(gè)位寬可變/可配置的標識符過(guò)濾器組,軟件通過(guò)對它們編程,從而在引腳收到的報文中選擇它需要的報文,而把其它報文丟棄掉。
接收FIFO
共有2個(gè)接收FIFO,每個(gè)FIFO都可以存放3個(gè)完整的報文。它們完全由硬件來(lái)管理
工作模式
bxCAN有3個(gè)主要的工作模式:初始化、正常和睡眠模式。
初始化模式
*軟件通過(guò)對CAN_MCR寄存器的INRQ位置1,來(lái)請求bxCAN進(jìn)入初始化模式,然后等待硬件對CAN_MSR寄存器的INAK位置1來(lái)進(jìn)行確認
*軟件通過(guò)對CAN_MCR寄存器的INRQ位清0,來(lái)請求bxCAN退出初始化模式,當硬件對CAN_MSR寄存器的INAK位清0就確認了初始化模式的退出。
*當bxCAN處于初始化模式時(shí),報文的接收和發(fā)送都被禁止,并且CANTX引腳輸出隱性位(高電平)
正常模式
在初始化完成后,軟件應該讓硬件進(jìn)入正常模式,以便正常接收和發(fā)送報文。軟件可以通過(guò)對CAN_MCR寄存器的INRQ位清0,來(lái)請求從初始化模式進(jìn)入正常模式,然后要等待硬件對CAN_MSR寄存器的INAK位置1的確認。在跟CAN總線(xiàn)取得同步,即在CANRX引腳上監測到11個(gè)連續的隱性位(等效于總線(xiàn)空閑)后,bxCAN才能正常接收和發(fā)送報文。
過(guò)濾器初值的設置不需要在初始化模式下進(jìn)行,但必須在它處在非激活狀態(tài)下完成(相應的FACT位為0)。而過(guò)濾器的位寬和模式的設置,則必須在初始化模式下,進(jìn)入正常模式前完成。
睡眠模式(低功耗
*軟件通過(guò)對CAN_MCR寄存器的SLEEP位置1,來(lái)請求進(jìn)入這一模式。在該模式下,bxCAN的時(shí)鐘停止了,但軟件仍然可以訪(fǎng)問(wèn)郵箱寄存器。
*當bxCAN處于睡眠模式,軟件想通過(guò)對CAN_MCR寄存器的INRQ位置1,來(lái)進(jìn)入初始化式,那么軟件必須同時(shí)對SLEEP位清0才行
*有2種方式可以喚醒(退出睡眠模式)bxCAN:通過(guò)軟件對SLEEP位清0,或硬件檢測CAN總線(xiàn)的活動(dòng)。
工作流程
那么究竟can是怎樣發(fā)送報文的呢?
發(fā)送報文的流程為:
應用程序選擇1個(gè)空發(fā)送郵箱;設置標識符,數據長(cháng)度和待發(fā)送數據;
然后對CAN_TIxR寄存器的TXRQ位置1,來(lái)請求發(fā)送。TXRQ位置1后,郵箱就不再是空郵箱;而一旦郵箱不再為空,軟件對郵箱寄存器就不再有寫(xiě)的權限。TXRQ位置1后,郵箱馬上進(jìn)入掛號狀態(tài),并等待成為最高優(yōu)先級的郵箱,參見(jiàn)發(fā)送優(yōu)先級。一旦郵箱成為最高優(yōu)先級的郵箱,其狀態(tài)就變?yōu)轭A定發(fā)送狀態(tài)。一旦CAN總線(xiàn)進(jìn)入空閑狀態(tài),預定發(fā)送郵箱中的報文就馬上被發(fā)送(進(jìn)入發(fā)送狀態(tài))。一旦郵箱中的報文被成功發(fā)送后,它馬上變?yōu)榭锗]箱;硬件相應地對CAN_TSR寄存器的RQCP和TXOK位置1,來(lái)表明一次成功發(fā)送。
如果發(fā)送失敗,由于仲裁引起的就對CAN_TSR寄存器的ALST位置1,由于發(fā)送錯誤引起的
就對TERR位置1。
原來(lái)發(fā)送的優(yōu)先級可以由標識符和發(fā)送請求次序決定:
由標識符決定
當有超過(guò)1個(gè)發(fā)送郵箱在掛號時(shí),發(fā)送順序由郵箱中報文的標識符決定。根據CAN協(xié)議,標識符數值最低的報文具有最高的優(yōu)先級。如果標識符的值相等,那么郵箱號小的報文先被發(fā)送。
由發(fā)送請求次序決定
通過(guò)對CAN_MCR寄存器的TXFP位置1,可以把發(fā)送郵箱配置為發(fā)送FIFO。在該模式下,發(fā)送的優(yōu)先級由發(fā)送請求次序決定。
該模式對分段發(fā)送很有用。
時(shí)間觸發(fā)通信模式
在該模式下,CAN硬件的內部定時(shí)器被激活,并且被用于產(chǎn)生時(shí)間戳,分別存儲在
CAN_RDTxR/CAN_TDTxR寄存器中。內部定時(shí)器在接收和發(fā)送的幀起始位的采樣點(diǎn)位置被采樣,并生成時(shí)間戳(標有時(shí)間的數據)。
接著(zhù)又是怎樣接收報文的呢?
接收管理
接收到的報文,被存儲在3級郵箱深度的FIFO中。FIFO完全由硬件來(lái)管理,從而節省了CPU
的處理負荷,簡(jiǎn)化了軟件并保證了數據的一致性。應用程序只能通過(guò)讀取FIFO輸出郵箱,來(lái)讀取FIFO中最先收到的報文。
有效報文
根據CAN協(xié)議,當報文被正確接收(直到EOF域的最后1位都沒(méi)有錯誤),且通過(guò)了標識符
過(guò)濾,那么該報文被認為是有效報文。
接收相關(guān)的中斷條件
*一旦往FIFO存入1個(gè)報文,硬件就會(huì )更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位為1,那么就會(huì )產(chǎn)生一個(gè)中斷請求。
*當FIFO變滿(mǎn)時(shí)(即第3個(gè)報文被存入),CAN_RFxR寄存器的FULL位就被置1,并且如果CAN_IER寄存器的FFIE位為1,那么就會(huì )產(chǎn)生一個(gè)滿(mǎn)中斷請求。
*在溢出的情況下,FOVR位被置1,并且如果CAN_IER寄存器的FOVIE位為1,那么就會(huì )產(chǎn)生一個(gè)溢出中斷請求
標識符過(guò)濾
在CAN協(xié)議里,報文的標識符不代表節點(diǎn)的地址,而是跟報文的內容相關(guān)的。因此,發(fā)送者以廣播的形式把報文發(fā)送給所有的接收者。(注:不是一對一通信,而是多機通信)節點(diǎn)在接收報文時(shí)-根據標識符的值-決定軟件是否需要該報文;如果需要,就拷貝到SRAM里;如果不需要,報文就被丟棄且無(wú)需軟件的干預。
為滿(mǎn)足這一需求,bxCAN為應用程序提供了14個(gè)位寬可變的、可配置的過(guò)濾器組(13~0),以便只接收那些軟件需要的報文。硬件過(guò)濾的做法節省了CPU開(kāi)銷(xiāo),否則就必須由軟件過(guò)濾從而占用一定的CPU開(kāi)銷(xiāo)。每個(gè)過(guò)濾器組x由2個(gè)32位寄存器,CAN_FxR0和CAN_FxR1組成。
過(guò)濾器的模式的設置
通過(guò)設置CAN_FM0R的FBMx位,可以配置過(guò)濾器組為標識符列表模式或屏蔽位模式。
為了過(guò)濾出一組標識符,應該設置過(guò)濾器組工作在屏蔽位模式。
為了過(guò)濾出一個(gè)標識符,應該設置過(guò)濾器組工作在標識符列表模式。
應用程序不用的過(guò)濾器組,應該保持在禁用狀態(tài)。
過(guò)濾器優(yōu)先級規則
?1位寬為32位的過(guò)濾器,優(yōu)先級高于位寬為16位的過(guò)濾器
?2對于位寬相同的過(guò)濾器,標識符列表模式的優(yōu)先級高于屏蔽位模式
?3位寬和模式都相同的過(guò)濾器,優(yōu)先級由過(guò)濾器號決定,過(guò)濾器號小的優(yōu)先級高
圖128過(guò)濾器機制的例子

(原文件名:無(wú)標題.jpg)43081#" rel="nofollow">引用圖片
上面的例子說(shuō)明了bxCAN的過(guò)濾器規則:在接收一個(gè)報文時(shí),其標識符首先與配置在標識符列表模式下的過(guò)濾器相比較;如果匹配上,報文就被存放到相關(guān)聯(lián)的FIFO中,并且所匹配的過(guò)濾器的序號被存入過(guò)濾器匹配序號中。如同例子中所顯示,報文標識符跟#4標識符匹配,
因此報文內容和FMI4被存入FIFO。
如果沒(méi)有匹配,報文標識符接著(zhù)與配置在屏蔽位模式下的過(guò)濾器進(jìn)行比較。
如果報文標識符沒(méi)有跟過(guò)濾器中的任何標識符相匹配,那么硬件就丟棄該報文,且不會(huì )對軟件有任何打擾。
接收郵箱(FIFO)
在接收到一個(gè)報文后,軟件就可以訪(fǎng)問(wèn)接收FIFO的輸出郵箱來(lái)讀取它。一旦軟件處理了報文(如把它讀出來(lái)),軟件就應該對CAN_RFxR寄存器的RFOM位進(jìn)行置1,來(lái)釋放該報文,以便為后面收到的報文留出存儲空間。
中斷
bxCAN占用4個(gè)專(zhuān)用的中斷向量。通過(guò)設置CAN中斷允許寄存器(CAN_IER),每個(gè)中斷源都可以單獨允許和禁用。
?發(fā)送中斷可由下列事件產(chǎn)生:
─發(fā)送郵箱0變?yōu)榭?,CAN_TSR寄存器的RQCP0位被置1。
─發(fā)送郵箱1變?yōu)榭?,CAN_TSR寄存器的RQCP1位被置1。
─發(fā)送郵箱2變?yōu)榭?,CAN_TSR寄存器的RQCP2位被置1。
?FIFO0中斷可由下列事件產(chǎn)生:
─FIFO0接收到一個(gè)新報文,CAN_RF0R寄存器的FMP0位不再是‘00’。
─FIFO0變?yōu)闈M(mǎn)的情況,CAN_RF0R寄存器的FULL0位被置1。
─FIFO0發(fā)生溢出的情況,CAN_RF0R寄存器的FOVR0位被置1。
?FIFO1中斷可由下列事件產(chǎn)生:
─FIFO1接收到一個(gè)新報文,CAN_RF1R寄存器的FMP1位不再是‘00’。
─FIFO1變?yōu)闈M(mǎn)的情況,CAN_RF1R寄存器的FULL1位被置1。
─FIFO1發(fā)生溢出的情況,CAN_RF1R寄存器的FOVR1位被置1。
?錯誤和狀態(tài)變化中斷可由下列事件產(chǎn)生:
─出錯情況,關(guān)于出錯情況的詳細信息請參考CAN錯誤狀態(tài)寄存器(CAN_ESR)。
─喚醒情況,在CAN接收引腳上監視到幀起始位(SOF)。
─CAN進(jìn)入睡眠模式。
工作流程大概就是這個(gè)樣子,接著(zhù)就是一大堆煩人的can寄存器,看了一遍總算有了大概的了解,況且這么多的寄存器要一下子把他們都記住是不可能的。根據以往的經(jīng)驗,只要用多幾次,對寄存器的功能就能記住。
好了,到讀具體實(shí)驗程序的時(shí)候了,這時(shí)候就要打開(kāi)“STM32庫函數”的資料因為它里面有STM32打包好的庫函數的解釋?zhuān)瑢ψx程序很有幫助。
下面是主程序:
intmain(void)
{
//intpress_count=0;
chardata=0;
intsent=FALSE;
#ifdefDEBUG
debug();
#endif
/*SystemClocksConfiguration*/
RCC_Configuration();
/*NVICConfiguration*/
NVIC_Configuration();

/*GPIOportspinsConfiguration*/
GPIO_Configuration();
USART_Configuration();
CAN_Configuration();
Serial_PutString("rnXX科技http://www.gzweiyan.comrn");
Serial_PutString("CANtestrn");
while(1){
if(GPIO_Keypress(GPIO_KEY,BUT_RIGHT)){
GPIO_SetBits(GPIO_LED,GPIO_LD1); //檢測到按鍵按下
if(sent==TRUE)
continue;
sent=TRUE;
data++;
if(data>z)
data=0;
CAN_TxData(data);
}
else{ //按鍵放開(kāi)
GPIO_ResetBits(GPIO_LED,GPIO_LD1);
sent=FALSE;
}
}
}
前面的RCC、NVIC、GPIO、USART配置和之前的實(shí)驗大同小異,關(guān)鍵是分析CAN_Configuration()
函數如下:
voidCAN_Configuration(void)//CAN配置函數
{
CAN_InitTypeDefCAN_InitStructure;
CAN_FilterInitTypeDefCAN_FilterInitStructure;
/*CANregisterinit*/
CAN_DeInit();
//CAN_StructInit(&CAN_InitStructure);
/*CANcellinit*/
CAN_InitStructure.CAN_TTCM=DISABLE;//禁止時(shí)間觸發(fā)通信模式
CAN_InitStructure.CAN_ABOM=DISABLE;//,軟件對CAN_MCR寄存器的INRQ位進(jìn)行置1隨后清0后,一旦硬件檢測
//到128次11位連續的隱性位,就退出離線(xiàn)狀態(tài)。
CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通過(guò)清除CAN_MCR寄存器的SLEEP位,由軟件喚醒
CAN_InitStructure.CAN_NART=ENABLE;//DISABLE;CAN報文只被發(fā)送1次,不管發(fā)送的結果如何(成功、出錯或仲裁丟失)
CAN_InitStructure.CAN_RFLM=DISABLE;//在接收溢出時(shí)FIFO未被鎖定,當接收FIFO的報文未被讀出,下一個(gè)收到的報文會(huì )覆蓋原有
//的報文
CAN_InitStructure.CAN_TXFP=DISABLE;//發(fā)送FIFO優(yōu)先級由報文的標識符來(lái)決定
//CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN硬件工作在正常模式
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳躍寬度1個(gè)時(shí)間單位
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;//時(shí)間段1為8個(gè)時(shí)間單位
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;//時(shí)間段2為7個(gè)時(shí)間單位
CAN_InitStructure.CAN_Prescaler=9;//(pclk1/((1+8+7)*9))=36Mhz/16/9=250Kbits設定了一個(gè)時(shí)間單位的長(cháng)度9
CAN_Init(&CAN_InitStructure);
/*CANfilterinit過(guò)濾器初始化*/
CAN_FilterInitStructure.CAN_FilterNumber=0;//指定了待初始化的過(guò)濾器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定了過(guò)濾器將被初始化到的模式為標識符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//給出了過(guò)濾器位寬1個(gè)32位過(guò)濾器
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//用來(lái)設定過(guò)濾器標識符(32位位寬時(shí)為其高段位,16位位寬時(shí)為第一個(gè))
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//用來(lái)設定過(guò)濾器標識符(32位位寬時(shí)為其低段位,16位位寬時(shí)為第二個(gè)
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//用來(lái)設定過(guò)濾器屏蔽標識符或者過(guò)濾器標識符(32位位寬時(shí)為其高段位,16位位寬時(shí)為第一個(gè)
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//用來(lái)設定過(guò)濾器屏蔽標識符或者過(guò)濾器標識符(32位位寬時(shí)為其低段位,16位位寬時(shí)為第二個(gè)
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;//設定了指向過(guò)濾器的FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//使能過(guò)濾器
CAN_FilterInit(&CAN_FilterInitStructure);
/*CANFIFO0messagependinginterruptenable*/
CAN_ITConfig(CAN_IT_FMP0,ENABLE);//使能指定的CAN中斷
}
再看看發(fā)送程序:
TestStatusCAN_TxData(chardata)
{
CanTxMsgTxMessage;
u32i=0;
u8TransmitMailbox=0;
/*
u32dataLen;
dataLen=strlen(data);
if(dataLen>8)
dataLen=8;
*/
/*transmit1message生成一個(gè)信息*/
TxMessage.StdId=0x00;//設定標準標識符
TxMessage.ExtId=0x1234;//設定擴展標識符
TxMessage.IDE=CAN_ID_EXT;//設定消息標識符的類(lèi)型
TxMessage.RTR=CAN_RTR_DATA;//設定待傳輸消息的幀類(lèi)型
/*TxMessage.DLC=dataLen;
for(i=0;iTxMessage.Data[i]=data[i];
*/
TxMessage.DLC=1;//設定待傳輸消息的幀長(cháng)度
TxMessage.Data[0]=data;//包含了待傳輸數據
TransmitMailbox=CAN_Transmit(&TxMessage);//開(kāi)始一個(gè)消息的傳輸
i=0;
while((CAN_TransmitStatus(TransmitMailbox)!=CANTXOK)&&(i!=0xFF))//通過(guò)檢查CANTXOK位來(lái)確認發(fā)送是否成功
{
i++;
}

return(TestStatus)ret;
}
CAN_Transmit()函數的操作包括:
1. [選擇一個(gè)空的發(fā)送郵箱]
2. [設置Id]*
3. [設置DLC待傳輸消息的幀長(cháng)度]
4. [請求發(fā)送]
請求發(fā)送語(yǔ)句:
CAN->sTxMailBox[TransmitMailbox].TIR|=TMIDxR_TXRQ;//對CAN_TIxR寄存器的TXRQ位置1,來(lái)請求發(fā)送
發(fā)送方面搞定了,但接收方面呢?好像在主程序里看不到有接收的語(yǔ)句。
原來(lái)是用來(lái)中斷方式來(lái)接收數據,原來(lái)它和串口一樣可以有兩種方式接收數據,一種是中斷方式一種是輪詢(xún)方式,若采用輪詢(xún)方式則要調用主函數的CAN_Polling(void)函數。
接著(zhù)又遇到一個(gè)問(wèn)題,為什么中斷函數CAN_Interrupt(void)的最后要關(guān)中斷呢?
因為一旦往FIFO存入1個(gè)報文,硬件就會(huì )更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位為1,那么就會(huì )產(chǎn)生一個(gè)中斷請求。所以中斷函數執行完后就要清除FMPIE標志位。這時(shí)我才回想起來(lái),原來(lái)我對CAN的理解還不夠,對程序設計的初衷不夠明確,于是我重新看了一遍CAN的工作原理,這時(shí)后我發(fā)現比以前容易理解了,可能是因為看了程序以后知道了大概的流程,然后看資料就有了針對性。
發(fā)送者以廣播的形式把報文發(fā)送給所有的接收者(注:不是一對一通信,而是多機通信)節點(diǎn)在接收報文時(shí)-根據標識符的值-決定軟件是否需要該報文;如果需要,就拷貝到SRAM里;如果不需要,報文就被丟棄且無(wú)需軟件的干預。一旦往FIFO存入1個(gè)報文,硬件就會(huì )更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位為1,那么就會(huì )產(chǎn)生一個(gè)中斷請求。所以中斷函數執行完后就要清除FMPIE標志位。


關(guān)鍵詞: STM32CAN學(xué)

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>