亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

STM32F103 CAN Bootloader固件升級(jí)全解析:從協(xié)議設(shè)計(jì)到量產(chǎn)實(shí)踐

STM32F103 CAN Bootloader固件升級(jí)全解析:從協(xié)議設(shè)計(jì)到量產(chǎn)實(shí)踐 1. Bootloader項(xiàng)目到底解決什么問題1.1 為什么要做CAN Bootloader先交代一下背景。我這邊做的產(chǎn)品是分布式的車載電控單元主控用的STM32F103系列節(jié)點(diǎn)之間走CAN總線。早期固件升級(jí)都是人工拿著ST-Link挨個(gè)開蓋刷寫一條產(chǎn)線幾十個(gè)節(jié)點(diǎn)一遍刷下來少說一個(gè)多小時(shí)而且后裝市場(chǎng)返修更頭疼——設(shè)備已經(jīng)封在機(jī)殼里有些還打了膠壓根沒法拆。這時(shí)候遠(yuǎn)程升級(jí)就成了剛需而CAN總線恰恰是現(xiàn)成的通道。STM32F103在國(guó)產(chǎn)化替代和低成本項(xiàng)目里用得非常多芯片本身自帶CAN外設(shè)支持標(biāo)準(zhǔn)幀和擴(kuò)展幀波特率可配硬件上只要加一個(gè)CAN收發(fā)器比如TJA1050、SN65HVD230就能跑起來。所以我就把Bootloader方案定成了“CAN Bootloader”上電先跑一段IAP程序通過CAN總線接收升級(jí)包寫入內(nèi)部Flash完成后跳轉(zhuǎn)到APP執(zhí)行。整個(gè)過程不需要額外的下載器只需要一個(gè)USBCAN卡或者現(xiàn)場(chǎng)總線上的上位機(jī)節(jié)點(diǎn)就能完成。做這件事之前我踩過一個(gè)認(rèn)知誤區(qū)以為Bootloader就是寫一段“把接收到的數(shù)據(jù)往Flash里寫”的代碼結(jié)果第一版出來問題一大堆——跳轉(zhuǎn)過去就死機(jī)、寫到一半寫不進(jìn)去、升級(jí)中斷后設(shè)備變磚。后來才明白Bootloader看起來簡(jiǎn)單實(shí)際涉及Flash分區(qū)規(guī)劃、中斷向量表遷移、CAN協(xié)議設(shè)計(jì)、異?;謴?fù)機(jī)制、量產(chǎn)防呆設(shè)計(jì)一堆事。這篇文章把我在這個(gè)項(xiàng)目里的完整實(shí)踐拆開講從協(xié)議、源碼、調(diào)試到量產(chǎn)落地一條線捋清楚。1.2 方案選型為什么是CAN而不是UART很多教程講Bootloader都喜歡用UART因?yàn)楹?jiǎn)單一個(gè)串口加一個(gè)USB轉(zhuǎn)TTL就能演示。但在整車和工業(yè)現(xiàn)場(chǎng)場(chǎng)景里UART有幾個(gè)致命問題第一很多設(shè)備沒有拉出串口引腳或者串口被其他功能占用。第二RS232/TTL抗干擾能力弱線纜一長(zhǎng)誤碼率就上來而工業(yè)現(xiàn)場(chǎng)動(dòng)輒幾米甚至幾十米線束。第三整車上已經(jīng)是CAN網(wǎng)絡(luò)了單獨(dú)為升級(jí)再拉一條調(diào)試串口產(chǎn)線和售后都要多一套硬件。CAN的優(yōu)勢(shì)是物理層本身就是差分信號(hào)抗干擾強(qiáng)通信距離遠(yuǎn)而且天然支持多節(jié)點(diǎn)組網(wǎng)。同一根總線上的設(shè)備可以通過ID過濾只響應(yīng)升級(jí)指令其他節(jié)點(diǎn)正常工作不受影響。對(duì)于量產(chǎn)部署來說CAN還有一個(gè)好處產(chǎn)線測(cè)試本來就要通過CAN做EOLEnd of Line檢測(cè)升級(jí)功能可以直接復(fù)用同一套工裝和線束。另外從成本角度看F103的CAN外設(shè)幾乎是“白送”的不需要額外加芯片。唯一要注意的是CAN收發(fā)器選型我建議用帶隔離的模塊比如CTM1050產(chǎn)線上經(jīng)常有設(shè)備接地不一致的問題隔離模塊能直接把共模干擾攔在物理層外面少很多莫名其妙的通信故障。1.3 整體架構(gòu)與功能拆解這個(gè)項(xiàng)目最終落地的系統(tǒng)架構(gòu)分成三層第一層是上位機(jī)/產(chǎn)線工裝。我這邊用的是周立功USBCAN-II上位機(jī)軟件自己用C#寫了一個(gè)簡(jiǎn)單的升級(jí)工具通過CAN發(fā)送升級(jí)包。如果現(xiàn)場(chǎng)總線里已經(jīng)有主節(jié)點(diǎn)在做調(diào)度也可以讓主節(jié)點(diǎn)兼任升級(jí)發(fā)起方。第二層是Bootloader程序放在STM32F103內(nèi)部Flash的起始區(qū)域。它負(fù)責(zé)上電初始化CAN、等待升級(jí)指令、接收固件包、擦寫Flash、校驗(yàn)、跳轉(zhuǎn)。第三層是APP應(yīng)用程序放在了Flash的高地址區(qū)。APP里面也要配合做一件事把中斷向量表重映射到自己的起始地址否則中斷一進(jìn)來就跑到Bootloader里去了。整個(gè)升級(jí)流程大概是這樣設(shè)備上電先跑Bootloader如果是冷啟動(dòng)并且沒有收到升級(jí)指令就延時(shí)幾百毫秒后直接跳轉(zhuǎn)到APP如果收到了升級(jí)幀或者APP區(qū)無效就留在Bootloader等待完整升級(jí)包。升級(jí)指令體一般包括握手、開始傳輸、數(shù)據(jù)幀、結(jié)束幀、校驗(yàn)結(jié)果回讀這幾類。2. 核心原理Flash分區(qū)與程序跳轉(zhuǎn)機(jī)制2.1 STM32F103內(nèi)部Flash布局與分區(qū)STM32F103的內(nèi)部Flash從0x08000000開始大小因型號(hào)而異比如F103C8T6是64KBF103RCT6是256KBF103ZET6是512KB。Flash的擦除以頁為單位注意不同容量的頁大小不一樣小容量和中容量64KB以下是1KB一頁大容量128KB以上是2KB一頁。我在這個(gè)項(xiàng)目里用了F103CBT6Flash一共128KB頁大小1KB。分區(qū)很關(guān)鍵規(guī)劃好了后面所有邏輯都順。我的分區(qū)如下區(qū)間地址范圍大小用途Bootloader0x08000000 ~ 0x08001FFF8KBIAP升級(jí)程序參數(shù)存儲(chǔ)區(qū)0x08002000 ~ 0x08002FFF4KB升級(jí)標(biāo)志、版本號(hào)、校驗(yàn)和APP程序區(qū)0x08003000 ~ 0x0801BFFF102KB應(yīng)用程序預(yù)留0x0801C000 ~ 0x0801FFFF16KB備份區(qū)或日志區(qū)Bootloader給8KB是非常寬裕的實(shí)際上我編譯完只有4KB多。APP起始地址選0x08003000注意這里有個(gè)對(duì)齊問題雖然F103的頁是1KB但向量表要求按地址對(duì)齊到0x08000000或0x08010000這樣的大地址邊界嗎不需要向量表只要對(duì)齊到自己所在地址即可關(guān)鍵是偏移量按字對(duì)齊。0x08003000可以被4整除滿足要求。2.2 向量表偏移與APP起始地址設(shè)置APP程序編譯時(shí)必須把ROM起始地址改成0x08003000。在Keil MDK里就是打開Target選項(xiàng)卡把IROM1的Start改成0x08003000Size改成0x1B000102KB。很多人改了ROM地址后程序還是跑飛其實(shí)就是忘了初始化向量表偏移。從F103啟動(dòng)流程來說芯片上電后固定從0x08000000取棧指針和復(fù)位向量。如果APP放在0x08003000那么APP的向量表也在0x08003000但CPU并不會(huì)自動(dòng)知道它默認(rèn)還是去0x08000000找向量表。所以Bootloader跳轉(zhuǎn)前必須告訴CPU“你的向量表搬家了以后中斷從這里查”。標(biāo)準(zhǔn)做法是在APP的main函數(shù)最開始調(diào)用#define APP_VECTOR_TABLE_ADDR 0x08003000 SCB-VTOR APP_VECTOR_TABLE_ADDR;對(duì)F103來說SCB-VTOR這個(gè)寄存器是0xE000ED08。注意第一次賦值時(shí)要先確保當(dāng)前代碼本身不依賴中斷因?yàn)橐坏└牧薞TOR后面來的所有中斷都會(huì)去新向量表取地址。所以這句要放在main最前面最好在系統(tǒng)初始化之前。2.3 跳轉(zhuǎn)函數(shù)實(shí)現(xiàn)與臨界區(qū)處理Bootloader跳轉(zhuǎn)APP的方法有講究。不能簡(jiǎn)單地用函數(shù)指針因?yàn)橹苯诱{(diào)用時(shí)棧指針和復(fù)位向量沒重新初始化很可能跳過去后第一句就進(jìn)HardFault。我用的跳轉(zhuǎn)代碼是業(yè)內(nèi)標(biāo)準(zhǔn)的做法typedef void (*pFunction)(void); void JumpToApp(uint32_t app_addr) { uint32_t stack_addr *(volatile uint32_t *)app_addr; uint32_t reset_addr *(volatile uint32_t *)(app_addr 4); if ((stack_addr 0xFFF00000) ! 0x20000000) { return; // 棧指針異常不能跳轉(zhuǎn) } // 關(guān)閉全局中斷 __disable_irq(); // 恢復(fù)默認(rèn)時(shí)鐘配置避免APP初始化時(shí)鐘時(shí)沖突 RCC_DeInit(); SysTick-CTRL 0; SysTick-LOAD 0; SysTick-VAL 0; // 關(guān)閉AHB/APB外設(shè)時(shí)鐘可選但建議做 RCC-AHBENR 0; RCC-APB1ENR 0; RCC-APB2ENR 0; // 重新設(shè)置棧指針然后跳轉(zhuǎn) __set_MSP(stack_addr); ((pFunction)reset_addr)(); }有幾個(gè)容易忽略的點(diǎn)跳轉(zhuǎn)前要把SysTick關(guān)掉否則APP里初始化SysTick時(shí)會(huì)開在Bootloader殘留的中斷上。其次是中斷標(biāo)志位CAN外設(shè)如果還有掛起中斷跳過去可能馬上觸發(fā)但APP的CAN中斷向量已經(jīng)重映射了沒問題主要是EXTI、USART這些最好也清一下掛起位。另一個(gè)是硬件看門狗如果Bootloader里開了IWDG跳轉(zhuǎn)前先關(guān)掉否則APP如果初始化耗時(shí)長(zhǎng)看門狗先復(fù)位了。為什么跳轉(zhuǎn)前檢查棧指針因?yàn)槿绻鸄PP區(qū)是空的或者數(shù)據(jù)損壞第一個(gè)字不落在0x20000000開頭的SRAM范圍內(nèi)說明這個(gè)“棧指針”根本不是合法的直接跳過去必然死機(jī)。實(shí)測(cè)中最常見的就是APP沒燒錄就跳轉(zhuǎn)加了這道檢查能省很多返修。3. CAN通信協(xié)議設(shè)計(jì)3.1 協(xié)議分層與幀格式定義CAN通信和UART的升級(jí)協(xié)議有個(gè)本質(zhì)區(qū)別UART可以一字節(jié)一字節(jié)流式處理CAN一次最多傳8字節(jié)有效載荷而且?guī)蛶g沒有天然的“流”的概念。所以協(xié)議必須自己定義幀類型、幀序號(hào)、數(shù)據(jù)長(zhǎng)度、校驗(yàn)方式實(shí)現(xiàn)“CAN上的文件傳輸”。我設(shè)計(jì)的協(xié)議比較簡(jiǎn)單兩層就夠了底層是CAN數(shù)據(jù)幀上層是升級(jí)指令區(qū)。全部使用標(biāo)準(zhǔn)幀11位ID波特率500kbps。ID分配如下ID方向含義0x100上位機(jī) - 設(shè)備升級(jí)控制命令0x101上位機(jī) - 設(shè)備數(shù)據(jù)幀0x102上位機(jī) - 設(shè)備請(qǐng)求重傳0x110設(shè)備 - 上位機(jī)應(yīng)答幀0x111設(shè)備 - 上位機(jī)狀態(tài)上報(bào)注意一個(gè)細(xì)節(jié)如果總線上還有其他業(yè)務(wù)節(jié)點(diǎn)ID分配要避開業(yè)務(wù)ID的范圍防止升級(jí)幀被當(dāng)成普通業(yè)務(wù)幀解析。我們這邊業(yè)務(wù)幀ID都在0x200以上所以升級(jí)幀用0x1xx完全隔離。控制命令幀的Data[0]是命令碼Data[1]是參數(shù)。常用命令包括握手0x10、開始升級(jí)0x11、結(jié)束升級(jí)0x12、查詢狀態(tài)0x13、復(fù)位執(zhí)行0x14。數(shù)據(jù)幀里Data[0]是幀序號(hào)Data[1]~Data[7]是固件數(shù)據(jù)一次最多傳7字節(jié)。3.2 分幀傳輸與多幀重組F103的Flash頁最小1KB而CAN一幀最多7字節(jié)數(shù)據(jù)所以一頁數(shù)據(jù)要拆成147幀左右。整個(gè)固件如果有90KB大概需要13000多幀。聽起來很多但500kbps的CAN總線上每幀大約0.26ms一秒鐘能傳3000多幀實(shí)際上傳90KB的固件大概10秒內(nèi)能完成這個(gè)速度在量產(chǎn)產(chǎn)線里完全可接受。分幀傳輸?shù)暮诵膯栴}是丟幀和亂序。CAN本身有硬件仲裁和CRC校驗(yàn)正常通信丟幀率非常低但也不是萬無一失——總線繁忙、錯(cuò)誤幀、節(jié)點(diǎn)掉線都會(huì)導(dǎo)致丟幀。我采用的辦法是“滑動(dòng)確認(rèn)”上位機(jī)每發(fā)送64幀后等待設(shè)備應(yīng)答一個(gè)“接收進(jìn)度”消息設(shè)備告訴上位機(jī)“我已經(jīng)正確收到了第N幀”上位機(jī)從N1繼續(xù)發(fā)。這種方式比逐幀握手快得多又比全包發(fā)完再校驗(yàn)保險(xiǎn)得多。設(shè)備端收到數(shù)據(jù)幀后先把數(shù)據(jù)暫存在一個(gè)RAM緩沖區(qū)里。因?yàn)镕103CBT6的SRAM是20KB裝不下整個(gè)固件所以緩沖區(qū)只放一頁1KB的數(shù)據(jù)攢滿一頁后立刻寫入Flash然后清空緩沖區(qū)等下一頁。這樣RAM占用不到2KB非常節(jié)省。3.3 高可靠性的確認(rèn)與重傳機(jī)制升級(jí)過程最怕的不是“傳輸慢”而是“悄悄丟幀最后校驗(yàn)失敗”。所以協(xié)議里在結(jié)束階段做了一個(gè)雙保險(xiǎn)CRC32校驗(yàn)和回讀校驗(yàn)。發(fā)送端上位機(jī)在發(fā)送固件前先計(jì)算整個(gè)固件文件的CRC32放在結(jié)束升級(jí)命令幀里一起發(fā)過去。設(shè)備端收完所有數(shù)據(jù)后也把收到的固件數(shù)據(jù)按同樣的算法算一遍CRC32和上位機(jī)發(fā)的值比對(duì)。如果一致應(yīng)答“校驗(yàn)通過”如果不一致應(yīng)答“校驗(yàn)失敗”上位機(jī)可以重新發(fā)送整個(gè)固件或者逐幀重傳。只做CRC還不夠因?yàn)樵O(shè)備寫Flash后可能因?yàn)楣╇姴环€(wěn)、Flash疲勞等原因出現(xiàn)個(gè)別字節(jié)寫入錯(cuò)誤。我在校驗(yàn)CRC之前還有一個(gè)“回讀”步驟所有數(shù)據(jù)寫完后把Flash里的內(nèi)容和RAM緩存里的原始數(shù)據(jù)逐字節(jié)比較一遍確認(rèn)硬件寫入沒有異常。這個(gè)回讀比較看起來慢90KB數(shù)據(jù)逐個(gè)字節(jié)讀但實(shí)際上Flash讀速度很快耗時(shí)不到一秒鐘這筆賬花得很值。3.4 和DBC文件的對(duì)接問題做整車項(xiàng)目的朋友會(huì)關(guān)心CAN協(xié)議能不能用DBC文件管理。我的建議是升級(jí)專用的私有協(xié)議不建議進(jìn)DBC因?yàn)镈BC里的信號(hào)是周期或事件觸發(fā)的“業(yè)務(wù)信號(hào)”而升級(jí)協(xié)議里的數(shù)據(jù)幀是“連續(xù)字節(jié)流”用DBC來表達(dá)反而別扭。如果產(chǎn)線工具非要通過DBC來對(duì)接可以把控制命令和狀態(tài)應(yīng)答做成DBC里的兩個(gè)消息數(shù)據(jù)幀通過DBC的原始字節(jié)信號(hào)透?jìng)鳌5珜?shí)際產(chǎn)線我都是讓上位機(jī)直接走原始CAN幀。4. 工程實(shí)現(xiàn)與源碼解析4.1 工程結(jié)構(gòu)搭建工程我基于STM32CubeMX生成底層再在Keil MDK里加Bootloader邏輯。CubeMX里開了CAN1、UART1用來打日志調(diào)試期用、一個(gè)定時(shí)器TIM3作為升級(jí)超時(shí)計(jì)時(shí)GPIO里留了一個(gè)LED做狀態(tài)指示。之所以用TIM3做超時(shí)計(jì)時(shí)而不是簡(jiǎn)單用延時(shí)是因?yàn)锽ootloader的接收循環(huán)中經(jīng)常要判斷“等一個(gè)握手應(yīng)答等了多久”“等下一幀等了多久”用定時(shí)器做基準(zhǔn)可以避免阻塞式延時(shí)把CAN接收卡死。CubeMX配置要點(diǎn)CAN波特率500k采樣點(diǎn)設(shè)置在75%左右。F103的CAN外設(shè)時(shí)鐘來自APB1通常是36MHz500k波特率對(duì)應(yīng)的分頻是// APB1 36MHz // BRP 4, 則時(shí)基 4 * (1/36MHz) 111ns // tq數(shù) (1/500k) / 111ns ≈ 18 // 采樣點(diǎn) (1 13) / 18 ≈ 77.8%具體在CubeMX里就是配置CAN的Prescaler4Time Quanta18重新同步跳躍寬度選2。采樣點(diǎn)對(duì)老練的車載CAN網(wǎng)絡(luò)很重要總線線纜長(zhǎng)、節(jié)點(diǎn)多時(shí)采樣點(diǎn)稍微不對(duì)就會(huì)出現(xiàn)“對(duì)方發(fā)得出來、自己收不到”的靈異問題。4.2 Flash擦寫底層實(shí)現(xiàn)Flash驅(qū)動(dòng)是本項(xiàng)目的硬骨頭之一F103的Flash寫入有幾個(gè)硬性規(guī)則寫Flash前必須先擦除整個(gè)扇區(qū)頁擦除后數(shù)據(jù)全變成0xFF。擦除和編程操作需要在FLASH_CR寄存器配置操作完成后要檢查BSY位。編程必須按16位半字進(jìn)行操作不能按字節(jié)寫。操作期間不能有中斷嵌套訪問Flash否則會(huì)報(bào)錯(cuò)。我封裝了一個(gè)比較穩(wěn)的寫Flash函數(shù)基本原理是“先擦除目標(biāo)頁然后按半字寫入”uint8_t FLASH_WritePage(uint32_t page_addr, uint8_t *buf, uint16_t len) { uint16_t i 0; uint16_t *p (uint16_t *)buf; uint16_t num_halfwords (len 1) / 2; // 補(bǔ)到半字對(duì)齊 FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); if (FLASH_ErasePage(page_addr) ! FLASH_COMPLETE) { FLASH_Lock(); return 1; } for (i 0; i num_halfwords; i) { if (FLASH_ProgramHalfWord(page_addr i * 2, p[i]) ! FLASH_COMPLETE) { FLASH_Lock(); return 2; } } FLASH_Lock(); return 0; }注意這個(gè)函數(shù)里的FLASH_ProgramHalfWord來自標(biāo)準(zhǔn)外設(shè)庫(kù)操作時(shí)要確保全局中斷是關(guān)閉的或者至少保證沒有其他更高優(yōu)先級(jí)的中斷在Flash編程期間進(jìn)入。我在Bootloader的升級(jí)主循環(huán)里用臨界區(qū)保護(hù)了整個(gè)擦寫過程代價(jià)是CAN接收中斷在寫Flash期間大約1KB數(shù)據(jù)擦寫要幾十ms會(huì)丟幾幀。這個(gè)問題的解決方案是上位機(jī)發(fā)數(shù)據(jù)時(shí)設(shè)計(jì)了“每64幀等待應(yīng)答”的機(jī)制預(yù)留了足夠的時(shí)間余量所以丟幀不影響最終結(jié)果。4.3 主循環(huán)狀態(tài)機(jī)Bootloader不能寫成“順序執(zhí)行”的流水賬代碼因?yàn)楝F(xiàn)場(chǎng)可能出現(xiàn)在任意階段掉線、復(fù)位、中斷等異常情況。我把它設(shè)計(jì)成一個(gè)有限狀態(tài)機(jī)這樣每個(gè)狀態(tài)對(duì)應(yīng)明確的行為和超時(shí)處理。狀態(tài)有狀態(tài)說明超時(shí)動(dòng)作IDLE初始等待無WAIT_HANDSHAKE等待上位機(jī)握手超時(shí)跳APPRECEIVING接收固件數(shù)據(jù)超時(shí)報(bào)錯(cuò)返回IDLEWRITING_FLASH寫入Flash寫失敗返回IDLEWAIT_CRC_CMD等待結(jié)束/校驗(yàn)命令超時(shí)報(bào)錯(cuò)返回IDLECRC_CHECK校驗(yàn)固件校驗(yàn)失敗進(jìn)入ERRORJUMP_APP跳轉(zhuǎn)執(zhí)行APP跳轉(zhuǎn)失敗進(jìn)入ERROR主循環(huán)偽代碼如下while (1) { switch (state) { case IDLE: if (frame_received cmd CMD_HANDSHAKE) { send_response(RESP_ACK); state WAIT_HANDSHAKE; timer_start(TIMER_UPGRADE_TIMEOUT); } else if (app_valid()) { delay_ms(500); // 冷啟動(dòng)短暫等待給上位機(jī)一個(gè)握手窗口 JumpToApp(APP_START_ADDR); } break; case RECEIVING: page_buf_receive(frame); if (page_buf_full()) { FLASH_WritePage(...); send_ack(progress); } break; case CRC_CHECK: if (crc32_matched()) { send_response(RESP_CRC_OK); state JUMP_APP; } else { send_response(RESP_CRC_ERR); state ERROR; } break; case JUMP_APP: JumpToApp(APP_START_ADDR); break; case ERROR: // 停留等待重新握手或超時(shí)后自復(fù)位 break; } }狀態(tài)機(jī)的好處是邏輯可控出問題能快速定位到具體環(huán)節(jié)。調(diào)試的時(shí)候我在每個(gè)狀態(tài)切換點(diǎn)打一條串口日志配合上位機(jī)抓幀哪里斷的一目了然。4.4 APP端配合改法很多朋友只盯著Bootloader寫忘了APP也要配合。前面說了要設(shè)SCB-VTOR還有幾件事也別忽略一是中斷服務(wù)函數(shù)的地址不能寫死。比如老代碼里有時(shí)會(huì)直接給某個(gè)外設(shè)中斷回調(diào)賦函數(shù)指針從舊地址跳到新地址后這個(gè)指針如果不重新初始化就會(huì)飛掉。二是APP的啟動(dòng)文件里堆棧大小要重新評(píng)估。Bootloader跳轉(zhuǎn)到APP時(shí)用的是APP向量表第一個(gè)字作為棧指針?biāo)訟PP啟動(dòng)文件開頭的Stack_Size和Heap_Size要按APP的實(shí)際需求配別沿用Bootloader的小棧配置。三是APP里要預(yù)留一個(gè)“固件更新標(biāo)志”。我是在參數(shù)存儲(chǔ)區(qū)里放了4個(gè)字節(jié)的魔數(shù)比如0xA5A5A5A5表示“下次復(fù)位進(jìn)入Bootloader升級(jí)模式”APP收到升級(jí)指令后先在參數(shù)區(qū)寫標(biāo)志然后軟復(fù)位。這樣就不需要每次上電都要等待Bootloader的超時(shí)窗口用戶體驗(yàn)好得多。具體做法void EnterBootloader(void) { *(volatile uint32_t *)PARAM_AREA_ADDR UPGRADE_REQUEST_FLAG; NVIC_SystemReset(); }Bootloader啟動(dòng)后先檢查參數(shù)區(qū)的標(biāo)志如果是升級(jí)請(qǐng)求就直接留在Bootloader否則延時(shí)跳APP。升級(jí)流程完成后清除標(biāo)志。4.5 計(jì)時(shí)與超時(shí)處理升級(jí)過程中如果上位機(jī)掉線設(shè)備不能永遠(yuǎn)死在“接收狀態(tài)”要有一個(gè)兜底超時(shí)。我用TIM3做毫秒級(jí)計(jì)時(shí)基準(zhǔn)每次收到有效幀就清零計(jì)數(shù)值如果超過5秒沒收到任何幀就判定通信中斷自動(dòng)復(fù)位到Bootloader起始狀態(tài)等待下一次升級(jí)指令。這樣即使上位機(jī)中途崩潰設(shè)備也不會(huì)卡死。超時(shí)時(shí)間的選擇我說一下不能太短因?yàn)镃AN總線在某些瞬間可能連續(xù)幾個(gè)錯(cuò)誤幀導(dǎo)致總線阻塞幾幀收不到很正常也不能太長(zhǎng)否則產(chǎn)線上發(fā)現(xiàn)升級(jí)失敗后要干等半天。5秒是實(shí)踐下來比較合適的值。5. 量產(chǎn)部署的坑與對(duì)策5.1 產(chǎn)線燒錄流程設(shè)計(jì)實(shí)驗(yàn)室里怎么玩都可以但量產(chǎn)部署講究的是流程標(biāo)準(zhǔn)化和防呆。我這邊最終確定的產(chǎn)線流程是這樣工裝治具夾好設(shè)備給設(shè)備上電設(shè)備進(jìn)入Bootloader等待握手。上位機(jī)掃描總線上所有設(shè)備ID確認(rèn)數(shù)量與工位產(chǎn)品一致。上位機(jī)發(fā)送握手幀設(shè)備端回讀版本號(hào)、芯片ID、上次升級(jí)狀態(tài)。上位機(jī)比對(duì)目標(biāo)固件和當(dāng)前固件版本決定是否升級(jí)。升級(jí)完成后上位機(jī)發(fā)送“查詢固件CRC”命令把設(shè)備端Flash中固件的CRC32讀回來和上位機(jī)源文件比對(duì)作為出廠驗(yàn)收項(xiàng)之一。記錄升級(jí)時(shí)間、設(shè)備序列號(hào)、固件版本、CRC結(jié)果到MES系統(tǒng)。這個(gè)流程在產(chǎn)線上跑了兩個(gè)多月了最大的經(jīng)驗(yàn)是上位機(jī)不要每臺(tái)設(shè)備都重新配置參數(shù)最好是讀一個(gè)固定的配置文件。固件版本號(hào)、存放路徑、目標(biāo)節(jié)點(diǎn)ID、是否強(qiáng)制升級(jí)這些統(tǒng)統(tǒng)從配置文件讀避免操作員手動(dòng)點(diǎn)錯(cuò)。5.2 防止刷成磚的機(jī)制任何Bootloader最怕的就是升級(jí)失敗后設(shè)備變磚尤其量產(chǎn)階段一旦磚了就要拆殼燒寫損失很大。我的防磚策略有三個(gè)層次第一是雙保險(xiǎn)啟動(dòng)邏輯設(shè)備上電后先檢查APP區(qū)首字棧指針和復(fù)位向量是否合法不合法就留在Bootloader。這樣即使APP刷得稀爛只要Bootloader還在就能重新刷回來。第二是升級(jí)確認(rèn)機(jī)制寫完固件后先校驗(yàn)CRC校驗(yàn)通過才設(shè)置“APP可用”標(biāo)志。這個(gè)標(biāo)志單獨(dú)放在參數(shù)存儲(chǔ)區(qū)是最后一步才寫入的。如果固件還沒校驗(yàn)就斷電標(biāo)志不被置位下次啟動(dòng)還是會(huì)進(jìn)Bootloader。第三是Bootloader本身的自保護(hù)在擦除APP區(qū)之前先校驗(yàn)Bootloader自己的CRC如果Bootloader區(qū)損壞了才說明真沒救了但這幾乎不會(huì)發(fā)生。F103內(nèi)部Flash的壽命和穩(wěn)定性在正常供電下是有保障的真正會(huì)搞壞Bootloader的是在擦寫過程中斷電。另外我強(qiáng)烈建議給產(chǎn)線工裝加一個(gè)檢測(cè)程序升級(jí)完成后設(shè)備自動(dòng)發(fā)一條“版本CRC”消息工裝顯示綠色通過才允許裝箱。雖然看起來多了一步但能攔截掉幾乎所有潛在問題。5.3 升級(jí)認(rèn)證與防回滾如果產(chǎn)品對(duì)安全有要求光有CRC還不夠。我這邊在協(xié)議里加了簡(jiǎn)單的序列號(hào)認(rèn)證設(shè)備端在握手時(shí)把96位唯一ID芯片的Unique ID回傳給上位機(jī)上位機(jī)把升級(jí)包綁定到這個(gè)ID上防止A設(shè)備的固件被復(fù)制刷到B設(shè)備里去。這個(gè)在知識(shí)產(chǎn)權(quán)保護(hù)和產(chǎn)品管理上有實(shí)際價(jià)值。防回滾機(jī)制也做了比如當(dāng)前版本是V1.2上位機(jī)不允許下發(fā)V1.1。怎么實(shí)現(xiàn)在結(jié)束升級(jí)命令幀里帶上目標(biāo)版本號(hào)和最低允許版本號(hào)設(shè)備端判定版本號(hào)是否符合要求不符合直接拒絕。這樣能避免產(chǎn)線調(diào)試時(shí)誤刷舊固件導(dǎo)致后期兼容性問題。5.4 量產(chǎn)測(cè)試項(xiàng)與驗(yàn)收量產(chǎn)驗(yàn)證踩過坑之后我整理了一份驗(yàn)收清單推薦給同樣要做量產(chǎn)部署的朋友測(cè)試項(xiàng)操作通過標(biāo)準(zhǔn)升級(jí)功能正常下發(fā)固件CRC一致APP可正常運(yùn)行斷電恢復(fù)傳輸中隨機(jī)斷電上電后進(jìn)入Bootloader可重新升級(jí)非法固件發(fā)送損壞固件設(shè)備拒絕執(zhí)行APP不變升級(jí)后用業(yè)務(wù)測(cè)試跑一遍正常業(yè)務(wù)無異常復(fù)位、無總線錯(cuò)誤長(zhǎng)時(shí)間老化升級(jí)后連續(xù)運(yùn)行24小時(shí)無復(fù)位、無死機(jī)6. 調(diào)試經(jīng)驗(yàn)與常見問題6.1 CAN通信突然連不上這個(gè)坑我遇到太多次了現(xiàn)象是“之前明明好好的突然一發(fā)數(shù)據(jù)就發(fā)不出去或者對(duì)方收不到”。排查順序我總結(jié)如下先看波特率。CAN沒有“自動(dòng)識(shí)別波特率”的功能雙方波特率不一致時(shí)表現(xiàn)為發(fā)送方自己能看到總線報(bào)文嗎可以。但對(duì)方收不到或者收到一幀后后續(xù)全是錯(cuò)誤幀。用CAN分析儀USBCAN、PCAN都可以抓總線數(shù)據(jù)如果看到一堆Error Frame幾乎可以斷定波特率或采樣點(diǎn)不匹配。再看終端電阻。CAN總線的兩端必須各接一個(gè)120歐電阻。我的產(chǎn)線工裝里經(jīng)常出現(xiàn)只在一端接了電阻的情況短距離實(shí)驗(yàn)發(fā)現(xiàn)不了問題但線纜長(zhǎng)度超過幾米后信號(hào)反射會(huì)把波形搞崩表現(xiàn)為升級(jí)過程中偶發(fā)性丟幀。還要檢查總線占用率。如果現(xiàn)有CAN網(wǎng)絡(luò)里業(yè)務(wù)報(bào)文非常密集升級(jí)幀的優(yōu)先級(jí)低可能一直無法獲得仲裁。這種情況可以調(diào)高升級(jí)幀的ID優(yōu)先級(jí)或者暫時(shí)讓業(yè)務(wù)節(jié)點(diǎn)靜默。我調(diào)這類問題一般用USBCAN的“總線檢測(cè)”模式抓一段波形看電平是否正常再用“報(bào)文統(tǒng)計(jì)”看錯(cuò)誤幀計(jì)數(shù)基本能定位。6.2 下載中途斷開與Flash寫入失敗升級(jí)過程中最惡心的事情是“傳輸?shù)?0%后設(shè)備斷了”。原因五花八門但我排查下來最多的是供電問題。CAN升級(jí)時(shí)設(shè)備通常要連續(xù)工作一段時(shí)間如果供電用的是劣質(zhì)電源適配器電流一波動(dòng)Flash擦寫瞬間電流大直接把供電拉低到復(fù)位閾值設(shè)備就重啟了。處理方式給設(shè)備供電用穩(wěn)壓電源電流余量留足。另外在Bootloader里加“掉電保護(hù)”一旦檢測(cè)到供電異常比如用ADC采樣VDD立即停止Flash操作等待供電穩(wěn)定后再繼續(xù)。Flash寫入失敗還有一種隱蔽原因?qū)懩硞€(gè)地址區(qū)間時(shí)該地址對(duì)應(yīng)的Flash扇區(qū)正在被代碼本身占用。比如把緩沖區(qū)定義在Flash映射的地址空間雖然這不可能因?yàn)镾RAM和Flash地址分開的或者中斷向量表所在的扇區(qū)被誤擦除。真遇到了可以用CMSIS里的FLASH_GetStatus函數(shù)把錯(cuò)誤狀態(tài)打出來常見的PGERR或WRPRTERR對(duì)應(yīng)的問題不一樣。6.3 跳轉(zhuǎn)失敗死機(jī)的定位跳轉(zhuǎn)失敗的現(xiàn)象通常是“Bootloader屏幕還活著LED閃但APP不啟動(dòng)”或者是“直接進(jìn)HardFault”。定位思路第一步檢查APP區(qū)是否真的有內(nèi)容。用調(diào)試器讀0x08003000處的前8個(gè)字節(jié)正常應(yīng)該是一個(gè)SRAM地址比如0x20001234和一個(gè)Flash地址比如0x08003341。如果讀出來是0xFFFFFFFF說明壓根沒刷進(jìn)去。第二步檢查APP的VTOR是否設(shè)置。在APP的main函數(shù)里設(shè)SCB-VTOR后再查看該寄存器值是否等于0x08003000。第三步檢查跳轉(zhuǎn)時(shí)中斷是否還掛著??梢园阉袙炱鹬袛嗲逡槐樵偬D(zhuǎn)NVIC-ICER[0] 0xFFFFFFFF; NVIC-ICPR[0] 0xFFFFFFFF;另外還有一個(gè)容易忽視的點(diǎn)如果APP用了FreeRTOS跳轉(zhuǎn)時(shí)APP的任務(wù)棧和系統(tǒng)時(shí)鐘初始化都不能依賴于“從0x08000000開始的啟動(dòng)流程”FreeRTOS的啟動(dòng)文件通常會(huì)調(diào)用SystemInit這個(gè)函數(shù)里有時(shí)會(huì)寫PLL和Flash等待周期但它是用寄存器配置硬編碼的不會(huì)因?yàn)榈刂纷兞司统鲥e(cuò)。只要確保時(shí)鐘和Flash等待狀態(tài)在跳轉(zhuǎn)前被妥善處理即可。6.4 工具與資料推薦關(guān)于工具和資料我建議手頭常備這么幾樣周立功USBCAN-II或者PCAN用來抓CAN報(bào)文、模擬上位機(jī)ST-Link V2用來燒錄Bootloader和調(diào)試APPSTM32F103中文參考手冊(cè)RM0008注意要看“Flash編程”和“CAN控制器”這兩章PDF記得下原版或者靠譜翻譯版Keil MDK工程用CubeMX生成底層后千萬別手動(dòng)畫代碼能省掉大量無意義錯(cuò)誤一個(gè)示波器或者邏輯分析儀排查CAN物理層問題時(shí)必備調(diào)試期如果嫌串口日志麻煩我后來是直接把調(diào)試信息編碼成CAN私有幀發(fā)出來上位機(jī)一個(gè)窗口實(shí)時(shí)顯示Bootloader內(nèi)部狀態(tài)。這樣最貼近實(shí)際工作環(huán)境也省得在板子上額外留串口。7. 寫在后面的幾句體會(huì)這個(gè)CAN Bootloader項(xiàng)目前前后后改了五六版真正穩(wěn)定是在加了狀態(tài)機(jī)、超時(shí)處理和斷電保護(hù)之后。回頭看我踩過最大的坑反而是最基礎(chǔ)的兩件事一是Flash分區(qū)和向量表偏移二是CAN總線的物理層參數(shù)。這兩個(gè)問題如果提前吃透后面很多折騰根本不會(huì)發(fā)生。另外一個(gè)深刻的體會(huì)是Bootloader這東西不是“寫完就行”它是出廠后你唯一能遠(yuǎn)程抓住設(shè)備的手質(zhì)量要求要比普通業(yè)務(wù)代碼更高多花幾天時(shí)間把邊緣情況想全比后面出差返修劃算得多。最后再提醒一句量產(chǎn)部署前一定要用壞固件、半截固件、斷電場(chǎng)景充分折磨你的Bootloader它扛得住產(chǎn)線才能睡得著覺。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩一级欧美一级国产一级台湾| 欧美体内射精| 亚欧国产无码精品在线| 激情五月综合开心五月| 91A欧美电影网站| 激情综合av| 天天综合~91入口| 日韩精品一区二区三区色欲| 久操com| 60秒不遮不挡| 性九九九九九九| 九九Av| 精品久久久高清无码| 国产精品操| 色吊丝 日日骚 清纯唯美| 亚洲天堂情色| 熟妇一区二区三区| 亚洲丝袜色图| 欧美亚洲综合999| 成人熟女视频一区二区三区| 国产欧美一区二区| 97爱亚洲综合色| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 极品色社| 91在线视频免费中出| 丁香激情网| 欧美激情中文字幕另类小说| 久久久久久国产精品免费网站| 久久黄色性爱视频| 91艹B视频| 欧美性爱中文字幕无线码| 国产成人99久久亚洲综合| 国产日本一区二区三区蜜臀在线观看| 超碰2017| 91精品人| 国产亚洲性生活视频播放| 亚洲色图91| 啊啊啊爽爽| 中文字幕乱亚洲美女精品一区| 久区视频| 国产女人视频三四五区| 色综合av综合久久| 人妻二区| 亚洲天堂中文字幕无码男同| xxx亚洲午夜天堂| 69精品在线| 欧美日日夜夜| 96国产污污污丝袜| 啊v在线观看视频| 亚洲综合首页| 大香蕉久| 91美女视频直播| 91女色| 亚洲精品久久久久毛片A片拉屎| 性猛交| 一本色道无码DVD中文字幕| 亚洲国产成人精品久久久国产成人一区二区| 97视频在线看| 99色热国产视频精品| 91成人在线免费视频| 欧美一级A片在线看视频性色| 日本三级R| 天天爽天天爽| 久久99精品国产| 精品人妻av区天天看片| 性爱乱伦网址| 激情图片亚洲色图| 羞答答AV中文字| 干少妇视频| 免费a级毛片av无码久久精品中文字幕| 国产第12页| 欧美黄片欧美黄片xxx| 992这里有精品| 91色色综合| 操逼操逼操| 岛国网址国产 | 亚洲熟女一区二区| 呦呦影院| 黑丝91视频| 中国黄色特级精品一区二区三区片| 久9综合在线| 中字幕人妻一区二区三区| 五月激情视频| 成人一区二区三区四区| 密臀视频三区免费网站| 操逼逼无码| 嫩草伊人久久精品| 天天综合欧美| 丁香六月啪| 少妇激情AV| 999久久久免费精品国产牛牛| 韩国一级婬片A片AAAAA| 射丝袜大香蕉| 中文字幕AV乱伦| 色色色综合网| 一区二区视频在看| 大香网伊人久久综合| 在线黄色污污网站| 秋霞成人做爱| 日本东京热大香蕉a片| 天美传媒麻豆一区二区三区国产精| 一二三区操逼国产91| 色综合99| 中文字幕一区二区三区人妻不卡| 激情五月婷婷| 色与欲影视天天看综合网| 思思热久久成人| 日本天天人人狠狠在线日美女 | 毛片电影一区二区三区| 综合97亚洲| 国产强奸AV在线| 人人天天欧洲| 午夜舔阴达高潮视频免费看| 怡红院怡春院| 一级日本牲交大片好爽在线看| 粉嫩国产精品久久粉嫩| 九九热九九| 日本三级大片| 熟妇色99| 97青青操视频| 国产欧美在线观看免费观看| 亚洲涩图欧美| 综合欧美日本三级| 蜜桃香蕉久草精品在线| 免费观看欧美日韩操逼视频| 992视频一区| 久久久无码国精品无码三区三区| 国产又黄又粗又猛大片| 九九九网页| 99视频这有这里有精品| 超碰天天操| 国产高清成人mv在线观看| 国产1727欧美| 91free福利| 人妻少妇无码| 日韩国产十八禁| 在线综合 亚洲 欧美中文字幕| 国产美女激情| 国产精品久久久久无码AV会牛| 色情婷婷久久五月天| 人成午夜免费大片| 热99这里有精品综合久久 | 91free福利| 国产熟女无套内射| 粉嫩AV输入| 大香蕉黄色一区| 亚洲综合在线第一页| 亚洲精品久久久久久久久豆丁网| 成全在线观看免费观看| 日韩猛交| 偷拍片久久| 国产精品大香蕉| 国产无码成人无码| 国产97/欧美| 国产suv精品一区二区四| 日本黄色大片一级视频免费麻豆| 亚洲AV色图| 日日日啊啊啊| 国内精品伊人久久久久影院会| 欧美中文综合| 国产怡红院在线| 日韩av三四区| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 日韩性爱小视频| 精品一区二区久久| 久9久9精品| 色五月婷婷网| 天天做天天爱天天爽| 日韩三级在线观看网站| 欧美97免费| 久久欧洲| 黄页大片在线观看| 视频在线观看一二三区| 俺去久久| 亚洲成人ab| 精品九九淫乱男| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 91亚洲影院综合| 精品妇女一区二区三区| 男啪女色黄无遮挡免费观看| 国产成年精品高清在线观看91| 偷拍亚洲情色| 91 国产丝袜在线放观看 | 欧美十八禁视频| 天美麻豆精品视频99| 夜夜狼人妻| 久久久久久久久久久久久久久久9| 一区二区无码视频| 77777亚洲蜜臀精品久久综合蜜臀| 色色丁香| 国产自产91区13区| 韩国一级婬片A片无码天美| 中文字幕欧美日本乱码一线二线 | 玖玖色综合| 日韩免费高清大片在线| 亚洲 无码 偷拍| 欧亚日韩中文在线| 色欧美综合| 九九五月天| 中出20p| 手机久操欧美综合色码| 91亚洲影院综合| 少妇99成人麻豆| 日韩精品区二区三区不卡| 国产女人91精品嗷嗷嗷嗷| 国产无马视频| 免费A V在线播放| 中文字幕123| 国产精品久久久久中文字幕| 亚洲精品成人| 99热在线观看| 97色插| 男人天堂站| 你草精品在线视频| 欧美视频第二页| 欧美亚男人的天堂| 久久色AV线| 日韩精品影视| 日韩97超碰| 99操逼| 欧美翘臀视频网站一区二区三区| 九热视频| 不卡人妻少妇精品毛片一区23区视频| 精品中文日韩字幕视频| 2020中文字幕在线| 国产日韩精品suv| 亚洲av性爱电影| 国产精品亚洲色婷婷久久久| 在线岛国新天堂8| 日逼视频日本| 操操啪| 国产超碰人人操| 色一情一乱一乱一区91Av| 午夜视频好爽啊| 极品综合| 91狠狠综合久久| 中文字幕二区日韩天堂| 欧洲精品一区二区三区| 97资源站日韩| 久久久亚洲Av| 日韩AV片| 97精品在线| 久久黄黄黄| 国内毛片欧美香蕉精品| 看黄片视频免费| 激情五月婷| 久久只有精品一区二区三区| 亚州精品人妻一二三区| 国内毛片热久久思思热| 亚洲男人bt天堂| 欧美青青视频| 亚洲丝袜诱惑| 国内毛片免费h片在线| 欧美成人9797| 欧美se综合| 午夜成人福利影视| 试看60秒 爽| 精品亚洲国产成人av网站| 夂久色| 日本99一区二区| 亚洲无码一区成人免费午夜| A 在线网址| 亚洲日韩一区电影| 亚洲欧美综合网站| 国产精品日韩在线一区| 一本一道人妻久久一区二区三区 | 成人精品电影| 婷婷人妻激情| 日本污ww视频网站| 欧美日韩亚洲电影| 亚洲黄色a级片| 欧洲亚洲人妻无码中字久久三区四区 | 美女诱惑在线一区| 国产av激情无码久久天堂| 一级黄色影片| 蜜桃久久一区二区| 日韩乱码Av| 人人操超碰在线| 久久黄色性爱视频| 亚洲极品| 日本99久久| 97久久精品不卡| 在线播放免费av福利片| 在线天堂999| 天天日天天操天天射河南省| 中文伊人大香蕉视频| 夜夜春夜夜操| 国产97在线播放| 国产精品成人福利在线| 亚洲色悠悠久久88| 18禁精品网站在线看| 97se综合网| 一区AV| 暖暖精品二区三区观看| 91色色网站| 96精品在线| 97超碰超碰| 国产按摩一区二区三区| 一区二区三区美女超清| 国产农村妇女精品一二区| 91色色网站| 毛片视频白嫩| 免费av在线播放二区| 亚洲欧美综合色| 一级乱伦网站| 国产亚洲色婷婷99精品91| 精品人妻1区| 二三四区精品| 99操| 中文乱码字字幕在线第5页| 久9久| 国产不良强奸视频免费看| 丁香婷婷激情五月天无毒不卡| 性爱乱伦视频免费| 欧洲性人爱视频| 成年女人18级毛片毛片免费观看| 射久久| 日韩少妇丰满亚洲| 夜嗨影院| 91久久青青草原精品| 亚洲淫乱骚妇AV| 中国一区二区亚洲人妻| 欧美色性情| 打av高清| 婷婷综合激情| a亚洲欧美色欲| 精彩久久中文| 五月天丁香欧洲日韩| 国产91福利小视频在线观看| 91无摭挡| 啊啊啊想要| 日韩欧美被操黄免费观看| 亚洲av淫乱| 精品九区| 日韩中文9| 熟妇熟女视频一区二区三区| 嗯啊抽插大香蕉网页| 校园激情狠狠四射| 日韩精品三级片长长久久| 99热网站| 久热大香蕉| 色y情视频免费看| 婷婷人妻激情| 长久操视频| 96AV精品| 久久性视频| 亚洲色系另类精品国产| 欧美精品三区| 久久香蕉国产线看观看亚洲女人 | 亚洲成人色情五月天丁香花| 99热这里只有精品8| 超碰人人操97碰| 国产乱子伦久久精品综合一区二区三| 后入式视频国产自| 亚洲欧美天堂在线| 国产成人亚洲精品自产在线| av中文在线| 一区二区三区黄片免费观看| 网站A V在线| 久久岛国| 久久黄人人爽视频| 日韩欧美三级| 国产福利av精彩对白| jizz啪啪| 久久久新亚洲AV| 东北女人高潮视频| 亚洲综合色图欧美| 97日韩欧美亚洲| 99热18这里只有精品| 国产天天看| 国产精品久久久久久夜夜夜| 中文字幕二区日韩天堂| 一区二区日韩欧美久久| 色婷网| 国产精品久久久久久久久AV大片| 在线观看日韩av不卡| 国产偷拍自拍在线视频| 多乙久久久久久| 丁香五月综合| 日韩丝袜二区| 日本 欧美 国产一区| 可以免费观看的日韩av毛片| 亚洲欧美自拍偷拍| 人人摸人人干人人拍97| 日韩午夜精品一区二区三区电影| 国产91乱伦| 国岛片视频| 唐山老熟妇露脸啪啪叫| 欧美人人AAA| 性爱综合网| 国产欧美第五页| 综合熟女| 人妻出轨一区二区三区| 少妇三P| 99热18这里只有精品| 超碰欧美在线欧美| 老熟妇一区二区三区| 欧美亚洲韩国视频十五区| 久久久免费高清中文视频| 91四海无码日韩欧美| 亚洲男人在线观看天堂| 久久伊人最新网址视频| 中国国产精品一区视频| 国产在线精品偷| 人妻久久久| 美女露胸露尿口| 嗯嗯啊啊亚欧精品| 豆1无夜无码| 日韩无码服务区| 九九碰九九爱97超碰| 亚洲国产成人精品久久久国产成人一区二区| 亚洲欧美日韩制服另类| 性开放中文AV高清无码免费看| 激情综合婷婷| 东北女人被操| 日本不卡中文| 国产无码三级视频在线观看| WWW黄片COM| 人妻日日夜夜精品| 毛片麻豆91糖心精品毛情片| 美女啊啊啊啊啊啊| 欧美性爱在线无码| 刺激性视频黄页| 国产后入清纯| 麻豆国产97在线| 欧美,日韩,亚洲视频| 性欧美另类高清| 亚洲性少妇| 欧美色图亚洲激情| 色噜噜人妻丝袜a∨先锋影| 欧美制服另类丝袜| 久久久亚洲熟妇资源| 国产又黄又爽又刺激久久久久久| 99视频精品| 欧美色图成人网一区二区| 人人妻人人爽| 亚洲福利中文字幕在线| 日本黄色裸日本黄色裸体 | 九九九九久久久| 乱色老一区二区三区的观看方式 | 你操综合| 欧美中日韩XXXX| 日韩精品人妻一| 九九热精品在线| 91狠狠狠| 亚洲色图日韩精品| 91五月天| 被男人吃奶很爽的毛片| 天天干一区二区| 91丝袜视频在线观看| 色综合av男人天堂| 超碰地址97| 黄片视频观看| 人妻夜夜爽天天爽麻豆三区网站 | 17c嫩草51久久91嫩草| 亚欧国产无码精品在线| 久久 久久国内精品亚洲| 国产一区二区免费福利片| 久久国产精品91| 五十路三区在线| 久久久久免费少妇| 日日躁夜夜躁狠狠躁超爽| 日韩精品在线观看网站| 久湿久久| 亚洲欧美国产其他二区| 久久久久久九九九九九九| 一类无码操逼视频| 久久综合久色欧美综合狠狠 | 99re国产中文字幕| 九久久九九久视频| 色5月婷婷| 亚洲天在线| 丁香五月激情啪啪| 免费视频一二三区| 亚洲天堂东京热| 亚洲色图欧美色图另类图片| 亚91亚洲网| 69国产对白刺激| 91性生活久久久| 自拍偷拍国产欧美日韩韩| 麻豆福利视频导航| 国产操操日韩三级黄| 色偷综合| 五月丁香六月婷综合成人综合| 色悠悠伊人网五月天| 天天日天天爽| 自拍偷拍 日韩欧美| 北条麻妃性愛视频| 亚洲乱码尤物193YW| 91精品操美女| 四月丁香婷婷| 欧美成人AⅤ大片在线观看| 好爽要喷了| 涩涩五月天| AAAA级日本片免费视频| 久久这里| 99精品在线| 中文字幕97| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 99rre在线精品99re8| 校园春色之综合网| 中国乱伦一区二区| 婷婷爽人人婷婷爽视频| 成人一区二区三区四区| 人妻少妇久久久| 成人性爱av| 日日骚网站| 亚洲情色图片区| 欧美啪啪女女| 17c在线成人免费A片观看| 国产精品夜夜夜| 操我啊啊啊啊啊| 91精品啪在线观看国产城中村| 日本不卡一二区| 色九九九综合| 97操97色| 色五月婷婷在线| 手机在线播放国产福利| 国产97视频| 91丝袜在线视频| 日韩素人无码一区二区三区三州| 国产大学生口爆吞精合集| 欧美东京热青青草| 九九九九97| 97se综合网| 999久久久精品国产| 午夜福利免费精品视频| 妇女性内射冈站HDWWWCOM| 欧色网址| 色九九九九九九| 中文幕97| 伊人国产视频| 大香蕉欧美伊| 精品大久久| 九九碰九九爱97超碰| 精品欧美А∨无码黑人大荫蒂 | 欧美激情总合网| 日欧操屄视频| 国产一级作爱毛片| 日本Xx性爱| 日韩美女啪啪一区| 欧美在线永久天堂| 蜜臀无码视频在线观看| 欧美日韩欧美| 欧美综合色,www| 国产又大又粗又长视频| 亚洲中亚日激情视频| 麻豆一区在线| 欲香欲色天天天综合和网| 啊啊啊好湿国产一二| 人人人人人人少妇| 日韩三四五区| 久久草草欧美精品| 精品妇女一区二区三区| 久久婷婷国产一区二区色| 99色在线| 超碰久久性爱| 国产青一二三| 久久综合精品一区二区三区| 色天使大香蕉| 啊好爽快点-国产一区二区三区撒尿在线-成人AV| 亚洲精品久久久久久久久豆丁网| 黄页大片在线观看| 伊人大香蕉在线| 国产夜夜艹| 97自拍一区| 91路www| 大屁股国产在线视频| 99精品丰满人妻无码| 欧美97se| 天天做天天爱| 成人免费毛片| 粉嫩粉嫩一区性色AV片| 午夜男女爽爽爽在线视频| 香蕉婷婷| 夜夜爽妓女| 男人把坤坤插入女人的下体 | 婷婷五月天激情网| 婷婷色导航| 亚洲人成色9999精品久久| 丝袜性亚洲| 色五月激情AV在线| 九九九九精品精| 欧美中文字幕日韩在线| 婷婷AV一区二区三区| 久久精彩免费视频| 躁躁日曰躁2020| 久久久三区二区一区| 亚洲精品九九九| 91在线超高颜值国产| 久综合网| 欧美在线啊啊啊| 天天干夜夜| 欧美裸体美女日麻屄| 精品视频一区二区| 亚洲精品天天影视综合网| 日本国产欧美一区三区二区| 一区中文字幕二区日韩| 亚洲另类小说卡通动漫| 亚洲国产丝袜熟女av| 福利五区| 国产一区免费午夜视频| 亚洲男人电影天堂| 99re99视频在线免费观看| 久久一留热品黄| 四虎影视国产精品| 婷婷香蕉欧美在线一区二区三区| 天天爽天天爽| 男女一级A片大黄,一进一出| 婷婷91| 亚洲AV色图一区| 欧美人人AAA| 免费αV在线视频| 国内毛片欧美香蕉精品| 欧美日韩国第一区| 国产精品久久久久久久电影渣男| 国产精品无码AV网站| 欧美综合加勒比在线| 国语精品对白| 日韩不卡a级视频专区| 综合 青草 伊久久 影院 综合| 91美女视频。| 午夜福利免费精品视频| 国产熟妇一区二区| 曰韩中文人妻视频| 性吧在线视频| 婷婷丁香人妻| 秋霞欧美性爰视频| 97在线资源| a一区二区三区乱码在线| 久久9亚洲| 中文字幕在线免费观看 | 884t在线| 尹人免费观看视频在线| 97精品国产97久久久久久| www.成人无码| 日本岛国黄色网址| 亚洲精品蜜桃久久久| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 欧美第38页| 欧美亚洲天堂| 欧插网站| 成人精品无码| 欧美在线色图| 日本人妻中文字幕精品| 色欲人妻一区二区在线| 日韩偷拍一区二区三区| 欧美大香蕉97| 成 人片 黄色大片| 国产精品午夜福利视频| 午夜偷拍久久熟女| 人妻大香蕉| 3p国产欧美99热| 国产区在线| 大香蕉碰碰| 中国一级αV| 久久综合日韩亚洲欧美| 69av一区二区三区| 粉嫩小泬久久久一区二区| 国产AV久久野战精品| 欧美在线干| 国产激情综合| 国产强奸乱伦第1页| 75大香蕉| 国产精品探花在线| 精品国产乱子伦一区二区三区,精品一| 99热综合| 色黄污美女啪啪啪免费网站| 丰满人妻一区二区中文| 婷婷六月色| 五月丁香黄色网| 97精品中文字幕| 久久98| 人人爱人人乐人人操| 91精品国久久久久久无码| 欧美极度丰满熟妇hd| 大香蕉综合网| 啊啊啊啊啊啊啊啊啊在线观看| 亚洲高清无码免费观看视频| 五月亭亭六月丁香| 亚洲综合一| 黑操B| 亚洲AV无码AV吞精久久久久 | 五月婷婷丁香| 日韩黄片视频试看| 日本大香蕉综合网红本杳社区| 91 国产丝袜在线放观看 | 91精品婷婷国产综合久久| 91粉芽高清在线一区二区 | 少妇超碰在线| 日韩一级欧美一级国产一级台湾| 新视频sss国产| 久久九九网| 级做a爱无码性色永久免费| 中文字幕精品专区搜索结果91| 长长久久88视频| 欧洲欧美视频一区二区| 中文字幕视频二区| 精品人妻一区二区三区视频| 日韩三级视频一区二区三区| 2017人人操,人人摸| 久久久久女教师免费一区| 狠狠图片青青草| 2020视频1区2区3区| 亚洲第一免费视频| 久久超碰日韩精品| 亚洲成人帖图| 亚洲精品一区二区免费在线观看| 黄色污污污污污污网站| www…国产操逼| 亚洲欧洲综合成人av一区| 日本色日夜干| 欧美人妖内射| ...日韩成人一区二区三区字幕| 射丝袜高跟鞋99| 一起草AV| 一级免费啪啪片| 2019天天干天天操 | av操操不卡| 99色在线| 97精品综合| 国产67194| www色日本| 18禁超污无遮挡无码免费网| 日韩在线一区高清在线| 青青操网| 超碰在线人人射| 日韩无限资源| 天天射日日干| 97资源久久| 亚洲不雅视频1区二区| 91蜜臀人妻中文字幕在线| 人人摸人人舔一区二区| 色哟哟1区2区| 亚洲国产青青| 91女优在线观看| 亚洲欧美日韩电影网站一区 | 欧美黄色大片在线观看| 男女做爰猛烈动高潮A片免费应用| 97超碰超碰| 女沟厕偷窥piss小便| 欧洲特黄毛片免费看欧洲毛片| 五月婷亚洲精品天堂| 大色综合| 五码视频在线观看| 在线观看高清AV| 国产不卡免费在线视频| 精品一二三区久久AAA片| 亚洲 欧美 手机在线观看| 性爱精品一区| 五月丁香综合激情| 黄页大片在线观看| 好吊色一区| 足交视频老司机| 国产av色网| 易易A毛视频| 国产成人在线观看网址| 久操操AV电影| 国产精品宅男免费| 五月激情影院| 日韩精品熟妇| 在线情色电影 91大 | 天天流夜夜操| 91在线限制级| 超碰在97| 91综合熟女| 日韩乱伦AⅤ| 久久性爱免费送| 亚洲.欧美.丝袜.中文.综合| 亚洲色图加勒比| 黑人干亚洲| 中文字幕99999| 精品国产91av一区二区三区 | 亚洲中文字幕一区二区| 襙一襙| 国产男人又猛又粗又爽| 91碰碰碰| 亚州色国| 91视频在线观看18| 精品欧美А∨无码黑人大荫蒂| 日韩免费性爱视频在线观看| 色呦呦、国产精品| 九草九九九| 九九综合九九综合| 中文字幕免费看大片| 色香阁在线| 97视频在线观看网站| 2017大香蕉| 国产成人www免费人成看片| 青青草九九九九九| 51一区二区三区| 久久av无码| 超碰av在线| 久日综合网| 国产精品女aA片爽爽视频| 亚洲欧美在线观看2021| 97激情97激情| 欧色网址| 黄色欧美性爱视频| 夜夜騷av、一區二區| 中文字幕一区二区无码成人| 熟女五十路一区二区三| 青青草密桃在线播放| 天天综合网亚洲综合网| 免费观看国产小粉嫩喷水精品午| 吻戏激情性巴克| 欧美亚洲清纯| 在线国产福利网址导航| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 天天热精品| 中文字幕日韩电影人妻| 7月婷婷综合| 天天做天天爱| 五月天激情婷婷| 97中文字幕一区| 色久桃花影院在线观看| 久久一二三四五六七八九区区| 日日夜夜精品视频| 日韩AV片| 久久久久白虎| 欧美国产日韩高清在线| 屁股久久久久久久久| 国产一进一出视频网站| 黄色不卡视频| 中字幕人妻一区二区三区| 日产国产精品中文久久婷婷| 欧美资源| 不卡超碰护士AV在线免费播放| 后入国产| 天综合网| 婷婷超| 九九九久千久久激情蜜桃在线看| 97精| 动漫片子网站3黄| 国内偷拍精品一区二区| 九九久久首页| 亚洲性爱成人| 99蜜桃臀亚洲成人在线观看| 尤物黄色在线观看网站| 中文字幕视频免费| 人人插人人摸人人| 少妇蹲下买菜露大唇0| 欧美性爱系列| 精品无码少妇| 99re6久热只有精品6在线直播| 亚洲美女av无码| 嗯~啊~快点 死我视频| 日韩一级性爱无码| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 欧美一区二区三区不卡高清视频| Av色五月| 在线色导航| 天天干夜夜肏| 91狠狠综合久久| 欧美日韩传媒| 天天综合香 ld视频| 免费又黄又裸乳的视频| 国产精品电| 国产精品一二三免费网站| 精品午夜福利导航| 九草在线大香蕉| 人妻熟女av国产网站| 久操免费观看| 久久久久久久久久久久黄色 | 99热97| 国产一区二区三区视频在线看| 国模91| 99re9在线| 国产二区视频在线观看电影| julia ann久久| 欧美黑人性猛交91| 色天使亚洲综合在线观看| 五月天精品| 欧美一区二区在线资源| 丝袜熟女一区二区三区| 麻豆成人影音在线| 亚洲AV不卡在线观看尤物| 亚欧性爱在线无码| 久久亚州精品成人Av无| 91日产桃蜜| 久久精品72| 九九黄色网| 日韩在线一区高清在线| 91美女小视频| 九9热伊人| 国产suv精品一区二区四| 国产三级中文有码在线视频| 啊啊啊好多水| 久久亚州大香蕉| 亚洲网自拍| 色五月婷婷网| 国产高清精品福利| AⅤ片水多多| 啊啊啊啊免费视频| 欧美天天综合站| 91大神电影天堂| 久久综合99| 欧美日韩性爱无码| 欧美中文字幕日韩在线| 天天综合官网| 97久久久久久久久久| 日本大香蕉| 久久久久精| 大香蕉五月天婷婷| 青青操综合网| 日本人妻中文字幕精品| 91精片| 变态综合色| 欧美肥臀在线| 综合天天。| 日少妇亚洲版| 92福利社视频| 国产精品一二三在线看| 一级性爱视频免费在线| 亚洲欧美情色| 97伊人| 99AV| 欧美色蜜桃97| 精品国产乱码久久久影院| 内射中国少妇高清视频免费视频 | 久操视频在线观看| 亚洲男人天堂2017| 欲色综合| 91操熟女视频| 久操免费电影| 久久久涩| 91热| 日韩在线电影| 国产99热| 夜夜爽夜夜爽| 97超碰色| 国产精品爆乳懂色蜜乳| 中日韩免费看男女操逼大全| 九九九九热| 97亚洲精品| 天天看夜夜看日日干| 国产在线综合网| 日韩精品在线放| 无码免费在线观看黄色片| 国产精品成人久久一区二区三区| 久久久久久久伊人精品| 国产最新小视频在线播放下载 | 99RE在线视频精品,这里只有精品| 亚洲蜜臀懂色| 日韩精品资源专区二区| 一级一性爱免费视频| 日本一区二区中文字幕久久| 国内亚洲高清无码| 黄色电影在线播放综合网站| 久草国产在线视频| 欧美人人AAA| 五月天激情婷婷| 亚洲有码 视频一区| 美女在线H91| 精品美女少妇一区二区三区| 国产欧洲精品亚洲午夜拍精品| 久久久久久久久久久精| 天天拍夜夜| 92性色国产午夜福利在线661| 免费观看性欧美一级| 99性爱在线观看| 色啪网| 亚洲欧美天堂在线| 成人欧美日超碰| 97操B| 日本精品一级二级三级| 性在久久久久久| 99re在线观看| 天天爽夜夜欢视| 日韩成人人妻网站| 色欲天天综合久久久无码网中文| 日本一区二区三区免费观看| 强奸乱伦av电影| 又大又白奶子| 9999九九九久久久| 美女91AV| 99精品欧美一区二区三区桃色| 婷婷五月天激情网| 综合网久久| 久久久久成人网| 日韩精品在线放| 综合啪啪| 青青草国产盗摄一二三区| 天天碰久久入| 国产Av超碰| 狼人久草| 男人把坤坤插入女人的下体 | 蜜色网色哟哟| 亚洲色图综合网| 亚洲人妻五月丁香婷婷| 亚洲人体视频在线观看| 亚洲码专区| 欧美性区| 中文字幕视频在线观看| av日韩国产一区二区| 老女人爆菊| 亚洲中字慕不卡| 91久久免费视频互動交流| 亚洲高清无码AAA久久久精品| 天天日日日射| 天天干18禁| 国产伦乱91| 天天色怡春院| 久久国产在线一区二区| 成片免费播放| 国产精品天干天干综合网麻豆 | AV天天综合| 国产9熟妇视频网站| 国产极品99热在线播放69| 国产夜夜操| 激情小说亚洲| 热久久这里只有精品| 一区二区三区四区在线不卡| 三级精品三级在线观看| 天天摸天天插天天日| 99re久久| 久久综合九九| 亚洲日韩资源| 国产成人精品一区| 92性色国产午夜福利在线661| 日韩三级久久久| 久久久久国色αv免费观看| 精品区国产区一区二区三区| 成熟熟女国产精品一区二区 | 久久久男人的天堂| 日韩乱伦AⅤ| 97精品第3页| 国产多人在线观看视频| 99热精品青草在线| 久久在线观看免费视频| 嗯嗯嗯啊啊啊在线免费观看| 91丝袜| 大香蕉伊利av| w w w.久久精品| 夫妻四区五区六区| 91啦人妻| 日韩啪啪啪视频| 免费观看国产小粉嫩喷水精品午| 欧美精品久久96人妻无码| 白丝被操91| 日本不卡二三区| 台湾成人无码AV| 婷婷久草| 日本在线激情一区二区三区| 素人伊尹大香蕉免费下载视频| 亚洲精品中文字幕一区在线视频| 粉嫩久久久极品| 国产福利第一视频| 3P丝袜熟女 色综合| 精品国产一区二区三区av在线资源| 91bbbbbb| 久久本道| 国产精品露脸在线观看| 色娱乐色呦呦夜夜夜夜av| 亚洲欧洲精品视频发布| 东京热AV男人的天堂| 一本道综合色图| 国产区日韩区在线观看| 青青草精品| 在线无码操| 伊香蕉综合久久久久久久噜噜噜| 最新加勒比丝袜在线| 色欲久久久久综合网| 久久久久久久久久精| 欧美在线观看综合国产| 欧美天天干| 欧美精品双插| 久久欧美性爱视频| 清纯唯美亚洲| #NAME?| 青青草中文-久久青草精品一区二区三| 精品九九九| 午夜综合在线| 亚洲男人的天堂亚洲| 欧美区亚洲区偷拍区 | 日亚韩精品视频二区三| 丰满人妻一区二区三区| 嗯嗯啊啊好疼| 激情小说五月天| 国产一区二区免费福利片| 中文字幕一品色图| 色呦呦、国产精品| 蜜乳AV网址| V A在线| 后入式福利| 三上制服丝AV| 丁香婷婷色五月| 日本一区视频在线观看| 97资源亚洲| 亚精品无码毛片一区二区三区| 99精品在线观看| 国产精品久久久久亚洲av| 欧美天天干| 中文字幕欧美日本乱码一线二线| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 麻豆人妻少妇在线免费观看| 国产女性无套 免费观看| 伊人热综合| 传媒在线观看一区二区三区| 97露脸精品丝袜| 爽爽淫人网| 日本熟妇人妻中出视频| 超碰在线人妻中文字幕| 蜜桃天美传媒AV一区二区三区| 99热 按摩 日韩| 免费看美国人人爽,人人操| 日韩av一级黄片| 国内精品a| 69精品| 国产后入式在线观看| 欧美熟妇亚洲版| 日韩传媒在线| 强奸少妇AV导航网| 国产成人网| 在线观看日韩av不卡| 日韩av不卡在线看| 亲子敌伦对白在线播放| 中文字幕视频二区| 热久久无毒不卡| 99re这里| 欧美精品偷拍| 内射中出日韩在线观看视频| 亚洲麻豆精品二区三区| 色综合久久久久| 一级免费啪啪片| 1769精品一区二区三区| 秋霞久久亚洲精品成人| 日本黄色大片一级视频免费麻豆| 男女啪啪网站免费视频| 亚洲高清自拍| 天天噜| 囯产精品久久久久久久久久二区三区| 亚洲性刺激| 欧美激情 一区| 一本大道久| 欧美日综合| 日本一线产区和二线产区伦理片| 色五月AV在线| 日韩欧美蜜桃精品久久中文字幕久久 | 国产精品伦理| 色亚洲欧美| 亚洲男人天堂手机版| 99少妇| 99av| 又大又大又大又粗爽高潮观看| 午夜精品久久99蜜桃的功能章节| 亚洲人妻av| 高精欧美色| 精品视频一区二区| 午夜操一视频一区| 国产麻豆91欧美一区二区久久婷婷国产精品| 加勒比综合a∨| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 天天操熟妇| 精品久久久一本一道| 男人天堂导航| 久久久久久久97| 国产高清自拍视频| 91人精品妻入口| 操高情无码|