欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

STM32F103C8T6串口IAP升級(jí):Bootloader分區(qū)與跳轉(zhuǎn)避坑指南

STM32F103C8T6串口IAP升級(jí):Bootloader分區(qū)與跳轉(zhuǎn)避坑指南 簡(jiǎn)介面向STM32F103C8T6開發(fā)者的串口IAP升級(jí)固件源碼包完整解決單片機(jī)通過(guò)串口實(shí)現(xiàn)在線固件升級(jí)與跳轉(zhuǎn)執(zhí)行的需求適合需要掌握Bootloader原理或正在調(diào)試在線升級(jí)方案的嵌入式工程師也適合為儀器儀表、物聯(lián)網(wǎng)節(jié)點(diǎn)等設(shè)備增加遠(yuǎn)程維護(hù)能力的項(xiàng)目參考。資源共430個(gè)文件、2.23MB以86個(gè)C源文件與86個(gè)頭文件構(gòu)成主要邏輯另有匯編啟動(dòng)文件、鏈接腳本以及uvproj、ewp等工程配置覆蓋從源碼修改、編譯鏈接到生成hex/bin固件的完整開發(fā)鏈條匯編入口與鏈接腳本便于分析啟動(dòng)過(guò)程和內(nèi)存布局說(shuō)明文檔則可幫助快速理解代碼結(jié)構(gòu)。包內(nèi)基礎(chǔ)工程直接搭建了IAP升級(jí)環(huán)境按典型流程展示Flash分區(qū)規(guī)劃、串口通信協(xié)議與固件跳轉(zhuǎn)處理且保留較多可配置參數(shù)方便根據(jù)實(shí)際硬件或協(xié)議需求進(jìn)行裁剪移植省去從零構(gòu)建引導(dǎo)程序的繁瑣環(huán)節(jié)。該資源已有5148人學(xué)習(xí)下載對(duì)初學(xué)STM32在線升級(jí)或需要快速?gòu)?fù)現(xiàn)Bootloader方案的中高級(jí)開發(fā)者是一份實(shí)用價(jià)值較高的參考源碼包。1. 串口IAP升級(jí)STM32F103C8T6最反直覺(jué)的一次開發(fā)在 STM32F103C8T6 的項(xiàng)目里做串口 IAP 固件升級(jí)最反直覺(jué)的一點(diǎn)是決定升級(jí)過(guò)程能不能可靠完成的不是那幾行“接收串口數(shù)據(jù)、寫 Flash”的代碼而是 Bootloader 里兩個(gè)看起來(lái)不起眼的瞬間——上電后等多久再跳 App以及“升級(jí)請(qǐng)求”標(biāo)志被放在哪個(gè)地址。這兩處沒(méi)想清楚設(shè)備在產(chǎn)線上燒好第一版時(shí)一切正常發(fā)到現(xiàn)場(chǎng)要通過(guò)串口升級(jí)時(shí)十次里有三次變磚。這個(gè)源碼包做的就是把 C8T6 的 64KB Flash 拆成 16KB Bootloader 和 48KB App用串口協(xié)議把新固件分包寫入 App 區(qū)校驗(yàn)通過(guò)后跳轉(zhuǎn)執(zhí)行。適合剛接觸 IAP 的人照著完整流程手搓一遍也適合正在做量產(chǎn)設(shè)備、被現(xiàn)場(chǎng)升級(jí)穩(wěn)定性反復(fù)折磨的開發(fā)者對(duì)照排查。下面按我從拿到源碼到跑通、再到改出自己一版的順序來(lái)講。2. 整體設(shè)計(jì)與 Flash 分區(qū)Bootloader 和 App 怎么在 64KB Flash 里共存拿到 C8T6 的第一件事是把“Flash 有 64KB”這個(gè)數(shù)字忘掉。實(shí)際應(yīng)用可用的只有 48KB因?yàn)榍懊?16KB 要?jiǎng)澖o Bootloader。很多人的 App 加了協(xié)議棧、日志和狀態(tài)機(jī)之后塞不進(jìn) 48KB十有八九是在選型時(shí)沒(méi)做這個(gè)心理預(yù)期。IAP 不是把兩個(gè)程序隨便丟進(jìn) Flash而是先畫好地盤再寫代碼。2.1 雙區(qū)架構(gòu)與內(nèi)存規(guī)劃16KB Bootloader 48KB App源碼包里的分區(qū)方案很直接一張表就能說(shuō)清區(qū)域起始地址大小存放內(nèi)容Bootloader 區(qū)0x0800000016KBIAP 主程序、串口驅(qū)動(dòng)、Flash 擦寫驅(qū)動(dòng)App 區(qū)0x0800400048KB業(yè)務(wù)固件、App 中斷向量表參數(shù)頁(yè)0x08003C001KB升級(jí)請(qǐng)求標(biāo)志、版本號(hào)記錄為什么要留 16KB 給 Bootloader而不是省到 8KB我用標(biāo)準(zhǔn)外設(shè)庫(kù)編譯過(guò)這個(gè)工程串口加 Flash 驅(qū)動(dòng)加上協(xié)議解析編譯出來(lái)大約 6~9KB留 16KB 是給自己留后路。后面要加 CRC 校驗(yàn)之外的加密、簽名代碼量會(huì)明顯膨脹如果把 Bootloader 壓縮到 4KB純寄存器操作確實(shí)能塞下但可讀性和可維護(hù)性都會(huì)變差。這里有個(gè)繞不開的硬件事實(shí)Cortex-M3 上電后從 Flash 起始地址取兩個(gè)字——第一個(gè)字是初始主堆棧指針 MSP第二個(gè)字是復(fù)位向量。Bootloader 的向量表必須在 0x08000000因?yàn)檫@是硬件固定的。而 App 的向量表本來(lái)也應(yīng)在 0x08000000可那個(gè)位置被 Bootloader 占著App 只能把向量表挪到 0x08004000。麻煩在于 CPU 并不知道這個(gè)偏移必須通過(guò) SCB-VTOR 告訴它。STM32F103 的 VTOR 在 0xE000ED08F1 全系列都有這個(gè)寄存器這點(diǎn)比某些 Cortex-M0 單片機(jī)要省事。2.2 啟動(dòng)流程與跳轉(zhuǎn)條件升級(jí)標(biāo)志位、串口窗口與跳轉(zhuǎn)判定整個(gè)啟動(dòng)流程如果用文字描述是這樣的鏈路上電復(fù)位 → Bootloader 初始化時(shí)鐘和串口 → 讀取參數(shù)頁(yè)的升級(jí)請(qǐng)求標(biāo)志 → 若標(biāo)志有效清標(biāo)志并直接進(jìn)入升級(jí)等待模式 → 若標(biāo)志無(wú)效等待約 300ms 的串口命令窗口 → 窗口內(nèi)收到握手幀進(jìn)入升級(jí)模式 → 窗口結(jié)束仍未收到命令跳轉(zhuǎn)到 App。為什么是“等約 300ms”而不是無(wú)限等現(xiàn)場(chǎng)升級(jí)要求上電盲操作設(shè)備一上電 Bootloader 先開一個(gè)短暫的升級(jí)窗口上位機(jī)只要能在這個(gè)窗口里發(fā)出握手幀就能搶占。窗口太短現(xiàn)場(chǎng)人員來(lái)不及窗口太長(zhǎng)設(shè)備每次開機(jī)都要慢幾秒。300ms 是我在速度和成功率之間試出來(lái)的經(jīng)驗(yàn)值源碼包里也留了宏定義可以自己調(diào)。升級(jí)請(qǐng)求標(biāo)志放在參數(shù)頁(yè)而不是放在 App 區(qū)尾部原因很實(shí)際App 運(yùn)行時(shí)不能擦寫自己正在執(zhí)行的 Flash 頁(yè)。假如把標(biāo)志寫在 App 區(qū)同一頁(yè)程序一邊從 Flash 取指令一邊擦寫那一頁(yè)輕則寫失敗重則 HardFault。所以 App 請(qǐng)求升級(jí)時(shí)是把標(biāo)志寫給 Bootloader 區(qū)里獨(dú)立的一頁(yè)。核心代碼是這樣的#define PARA_FLAG_ADDR 0x08003C00 /* Bootloader區(qū)最后一頁(yè)1KB */ #define FLAG_MAGIC 0x5A5AA5A5 void app_request_upgrade(void) { uint32_t flags FLAG_MAGIC; FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASH_ErasePage(PARA_FLAG_ADDR); /* 先整頁(yè)擦除 */ FLASH_ProgramWord(PARA_FLAG_ADDR, flags); /* 寫入魔數(shù) */ FLASH_Lock(); NVIC_SystemReset(); /* 軟復(fù)位進(jìn)Bootloader */ }這段代碼關(guān)鍵在兩點(diǎn)擦除后寫入是標(biāo)準(zhǔn)流程不能省掉 ClearFlag寫完魔數(shù)后立刻軟復(fù)位讓 Bootloader 來(lái)決定接下來(lái)是升級(jí)還是正常跳轉(zhuǎn)App 自己不做升級(jí)流程的分發(fā)?,F(xiàn)場(chǎng)人員只要觸發(fā) App 里的這個(gè)函數(shù)設(shè)備重啟后就會(huì)自動(dòng)停在升級(jí)等待狀態(tài)。Bootloader 啟動(dòng)時(shí)的判斷同樣簡(jiǎn)單if (*(volatile uint32_t *)PARA_FLAG_ADDR FLAG_MAGIC) { FLASH_ErasePage(PARA_FLAG_ADDR); /* 清掉請(qǐng)求標(biāo)志防止下次重復(fù)誤入升級(jí) */ iap_state IAP_STATE_UPGRADE; /* 進(jìn)入升級(jí)等待模式 */ }清標(biāo)志必須在跳轉(zhuǎn)升級(jí)邏輯之前完成否則升級(jí)過(guò)程中途斷電再上電會(huì)又一次進(jìn)入升級(jí)模式反而把正常 App 擋住。這個(gè)順序我一開始寫反過(guò)結(jié)果現(xiàn)場(chǎng)出現(xiàn)“設(shè)備永遠(yuǎn)停在升級(jí)等待App 起不來(lái)”的翻車原因就是標(biāo)志沒(méi)被清掉。3. 串口升級(jí)協(xié)議與 Bootloader 核心代碼拆解一幀一幀把固件搬進(jìn) FlashBootloader 的本質(zhì)是一個(gè)串口透?jìng)鲗懭肫魃衔粰C(jī)發(fā)一幀Bootloader 解析一幀、校驗(yàn)一幀、寫一次 Flash。協(xié)議設(shè)計(jì)得不好升級(jí)過(guò)程就會(huì)變成一場(chǎng)對(duì)時(shí)鐘和運(yùn)氣的賭博。這章我把協(xié)議幀、狀態(tài)機(jī)、Flash 操作和跳轉(zhuǎn)邏輯逐一拆開講。3.1 串口協(xié)議幀設(shè)計(jì)幀頭、命令字、長(zhǎng)度與 CRC16 校驗(yàn)源碼包里的協(xié)議幀格式很簡(jiǎn)單但足夠防錯(cuò)字節(jié)序字段長(zhǎng)度說(shuō)明0幀頭2 字節(jié)固定 0xAA 0x552命令字1 字節(jié)0x01 升級(jí)開始0x02 數(shù)據(jù)塊0x03 完成校驗(yàn)0x04 跳轉(zhuǎn) App3數(shù)據(jù)長(zhǎng)度2 字節(jié)小端序payload 字節(jié)數(shù)不含幀頭和 CRC5Payload變長(zhǎng)數(shù)據(jù)塊命令里是 offset(4 字節(jié)) 固件數(shù)據(jù)(最多 256 字節(jié))末尾CRC162 字節(jié)CRC16-MODBUS覆蓋數(shù)據(jù)長(zhǎng)度和 Payload命令字是升級(jí)流程的骨架。0x01 升級(jí)開始命令里上位機(jī)告訴 Bootloader 固件總長(zhǎng)度Bootloader 收到后擦除整個(gè) App 區(qū)并回復(fù) ACK0x02 數(shù)據(jù)塊命令承擔(dān)真正的搬磚工作每幀最多帶 256 字節(jié)數(shù)據(jù)0x03 完成校驗(yàn)命令用于回讀 Flash 算 CRC0x04 才是真正觸發(fā)跳轉(zhuǎn)的那一下。串口接收我建議用狀態(tài)機(jī)而不是直接等一個(gè)“完整幀中斷”因?yàn)?STM32F103 的串口一次中斷只停在一個(gè)字節(jié)上數(shù)據(jù)是碎片化到達(dá)的。狀態(tài)機(jī)在串口中斷里逐字節(jié)喂最穩(wěn)妥typedef enum { ST_WAIT_HEAD1 0, ST_WAIT_HEAD2, ST_WAIT_CMD, ST_WAIT_LEN, ST_WAIT_PAYLOAD, ST_WAIT_CRC } RX_STATE; static RX_STATE rx_state ST_WAIT_HEAD1; static uint16_t payload_len 0; static uint16_t payload_idx 0; static uint16_t crc_idx 0; void IAP_RxHandler(uint8_t byte) { switch (rx_state) { case ST_WAIT_HEAD1: if (byte 0xAA) rx_state ST_WAIT_HEAD2; break; case ST_WAIT_HEAD2: rx_state (byte 0x55) ? ST_WAIT_CMD : ST_WAIT_HEAD1; break; case ST_WAIT_CMD: rx_frame.cmd byte; payload_len 0; payload_idx 0; crc_idx 0; rx_state ST_WAIT_LEN; break; case ST_WAIT_LEN: if (payload_idx 0) { payload_len byte; /* 長(zhǎng)度低字節(jié)先到 */ payload_idx 1; } else { payload_len | (uint16_t)byte 8; /* 高字節(jié)拼出完整長(zhǎng)度 */ payload_idx 0; rx_state ST_WAIT_PAYLOAD; } break; case ST_WAIT_PAYLOAD: rx_frame.payload[payload_idx] byte; if (payload_idx payload_len) { crc_idx 0; rx_state ST_WAIT_CRC; } break; case ST_WAIT_CRC: if (crc_idx 0) { rx_frame.crc byte; /* CRC 低字節(jié) */ crc_idx 1; } else { rx_frame.crc | (uint16_t)byte 8; IAP_OnFrameComplete(rx_frame); /* 一幀收齊 */ rx_state ST_WAIT_HEAD1; /* 回到幀頭狀態(tài) */ } break; default: rx_state ST_WAIT_HEAD1; break; } }狀態(tài)機(jī)的幾個(gè)參數(shù)值得說(shuō)明payload_len 是兩字節(jié)小端所以要先收低字節(jié)再收高字節(jié)payload_idx 在這里實(shí)際是長(zhǎng)度收齊后的數(shù)據(jù)計(jì)數(shù)實(shí)現(xiàn)時(shí)也可以單獨(dú)用一個(gè)計(jì)數(shù)變量邏輯更清楚任何一幀中間字節(jié)出錯(cuò)狀態(tài)機(jī)都會(huì)回到 ST_WAIT_HEAD1下一幀能自動(dòng)恢復(fù)不用重啟設(shè)備。幀收齊后進(jìn)入分發(fā)性處理先把 CRC 校驗(yàn)做掉再按命令字分發(fā)void IAP_OnFrameComplete(IAP_Frame *frame) { uint16_t calc_crc CRC16_Modbus((uint8_t *)frame-cmd, 3 frame-len); if (calc_crc ! frame-crc) { IAP_SendAck(AK_CRC_ERR); return; } switch (frame-cmd) { case CMD_UPGRADE_START: IAP_OnStart(frame); break; case CMD_UPGRADE_DATA: IAP_OnData(frame); break; case CMD_UPGRADE_FINISH: IAP_OnFinish(frame); break; case CMD_UPGRADE_JUMP: IAP_JumpToApp(); break; default: IAP_SendAck(AK_CMD_ERR); break; } }CRC 的覆蓋范圍是命令字 長(zhǎng)度 Payload幀頭不參與計(jì)算。這是有意為之因?yàn)閹^本身有 AA 55 做同步而 CRC 要保護(hù)的是真正影響數(shù)據(jù)的字段。源碼里用的是 CRC16-MODBUS初值 0xFFFF 多項(xiàng)式 0xA001實(shí)現(xiàn)只有幾行uint16_t CRC16_Modbus(uint8_t *buf, uint16_t len) { uint16_t crc 0xFFFF; for (uint16_t i 0; i len; i) { crc ^ buf[i]; for (uint8_t j 0; j 8; j) { if (crc 0x0001) crc (crc 1) ^ 0xA001; else crc 1; } } return crc; }上位機(jī)計(jì)算 CRC 時(shí)必須用同樣的多項(xiàng)式否則聯(lián)調(diào)時(shí)會(huì)出現(xiàn)“每一幀都回 CRC_ERR”的現(xiàn)象。這種問(wèn)題排查起來(lái)特別像玄學(xué)其實(shí)是兩端 CRC 不一致。3.2 Flash 擦寫與存儲(chǔ)邏輯先整片擦除、再半字寫入、最后回讀校驗(yàn)STM32F103 的 Flash 有一個(gè)特性寫入以半字16 位為單位擦除以頁(yè)為單位每頁(yè) 1KB。寫入前目標(biāo)頁(yè)必須處于已擦除狀態(tài)否則寫入結(jié)果不確定。這直接決定了升級(jí)策略收到第一幀命令時(shí)不能邊收邊寫而是先把整個(gè) App 區(qū)擦干凈。#define APP_BASE_ADDR 0x08004000 #define FLASH_PAGE_SIZE 1024 #define APP_TOTAL_SIZE 0xC000 /* 48KB */ static uint32_t write_offset 0; static uint8_t flash_started 0; void IAP_OnStart(IAP_Frame *frame) { uint32_t total_len *(uint32_t *)frame-payload[0]; if (total_len APP_TOTAL_SIZE) { IAP_SendAck(AK_LEN_ERR); return; } FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); /* 整片擦除App區(qū)防止舊數(shù)據(jù)和殘留頁(yè)干擾 */ for (uint32_t addr APP_BASE_ADDR; addr APP_BASE_ADDR APP_TOTAL_SIZE; addr FLASH_PAGE_SIZE) { FLASH_ErasePage(addr); } write_offset 0; flash_started 1; IAP_SendAck(AK_OK); }整片擦除 48KB 共 48 頁(yè)按 HSI 8MHz 或 PLL 倍頻后的 CPU 時(shí)鐘算大約要幾百毫秒。所以上位機(jī)發(fā)完升級(jí)開始命令后不能立刻發(fā)數(shù)據(jù)必須等 Bootloader 回 ACK。這個(gè)等待關(guān)系在協(xié)議設(shè)計(jì)里要寫清楚否則上位機(jī)發(fā)得快數(shù)據(jù)幀會(huì)因?yàn)?Flash 還沒(méi)擦完而被忽略。數(shù)據(jù)塊寫入是每幀動(dòng)作核心是把 payload 里的偏移量和數(shù)據(jù)取出來(lái)逐個(gè)半字寫入void IAP_OnData(IAP_Frame *frame) { uint32_t offset; uint8_t *data; uint16_t data_len; uint32_t target_addr; if (!flash_started) { IAP_SendAck(AK_NOT_STARTED); /* 沒(méi)收到升級(jí)開始命令直接拒絕 */ return; } offset *(uint32_t *)frame-payload[0]; /* 前4字節(jié)是目標(biāo)偏移 */ data frame-payload[4]; data_len frame-len - 4; target_addr APP_BASE_ADDR offset; /* 越界檢查防住上位機(jī)發(fā)瘋 */ if ((target_addr data_len) (APP_BASE_ADDR APP_TOTAL_SIZE)) { IAP_SendAck(AK_ADDR_ERR); return; } /* 半字寫入data_len 確保是偶數(shù) */ for (uint16_t i 0; i data_len; i 2) { uint16_t half_word data[i] | (data[i 1] 8); FLASH_ProgramHalfWord(target_addr i, half_word); } write_offset offset data_len; IAP_SendAck(AK_OK); }這里有兩個(gè)必須守住的約定offset 必須按 2 字節(jié)對(duì)齊data_len 必須是偶數(shù)。上位機(jī)在發(fā)送數(shù)據(jù)幀之前要把 bin 文件按 2 字節(jié)補(bǔ)齊最后不足 2 字節(jié)補(bǔ) 0xFF。如果上位機(jī)發(fā)來(lái)奇數(shù)長(zhǎng)度的數(shù)據(jù)Bootloader 應(yīng)該直接回錯(cuò)誤而不是硬寫否則最后一次寫入會(huì)踩到未知地址。寫完后回 ACK 表示這一幀落盤上位機(jī)再發(fā)下一幀。升級(jí)完成的校驗(yàn)比“寫入成功”更可靠的是“整片回讀再算 CRC”。FLASH_ProgramHalfWord 返回狀態(tài)位在某些操作異常時(shí)不代表數(shù)據(jù)真寫對(duì)了回讀是最后防線void IAP_OnFinish(IAP_Frame *frame) { uint32_t expect_crc *(uint32_t *)frame-payload[0]; uint32_t real_crc CRC32_Flash(APP_BASE_ADDR, app_total_len); if (real_crc expect_crc) { IAP_SendAck(AK_CRC_OK); } else { IAP_SendAck(AK_CRC_ERR); /* 不跳轉(zhuǎn)保留現(xiàn)場(chǎng)等上位機(jī)重傳 */ } }CRC32_Flash 是源碼包里提供的函數(shù)遍歷 App 區(qū)已寫入的字節(jié)計(jì)算 CRC32。比較失敗時(shí)不擦除、不跳轉(zhuǎn)等上位機(jī)重新發(fā)起升級(jí)。這比直接跳進(jìn)一個(gè)損壞的 App 要安全得多。3.3 跳轉(zhuǎn)到 App 的代碼實(shí)現(xiàn)棧頂檢查、VTOR 切換與中斷屏蔽最后一步跳轉(zhuǎn)是 IAP 里最容易寫翻車的地方。跳轉(zhuǎn)的本質(zhì)不是“跳”而是“把 CPU 的執(zhí)行環(huán)境完整換掉”換中斷向量表、換棧指針、換 PC 指針。typedef void (*IAP_JumpFunc)(void); void IAP_JumpToApp(void) { uint32_t app_sp; uint32_t app_pc; IAP_JumpFunc jump_func; app_sp *(volatile uint32_t *)APP_BASE_ADDR; app_pc *(volatile uint32_t *)(APP_BASE_ADDR 4); /* 棧頂值必須在RAM地址范圍內(nèi)否則App區(qū)是空白或損壞 */ if ((app_sp 0x2FFE0000) ! 0x20000000) { return; } if ((app_pc 0xFFFFF000) 0) { return; } jump_func (IAP_JumpFunc)app_pc; /* 跳轉(zhuǎn)前徹底關(guān)中斷防止VTOR切換瞬間中斷亂入 */ __set_PRIMASK(1); SCB-VTOR APP_BASE_ADDR; /* 讓App找到自己的向量表 */ __set_MSP(app_sp); /* 換成App的初始棧指針 */ jump_func(); /* 跳到App復(fù)位向量 */ /* 如果走到這里說(shuō)明App沒(méi)起來(lái) */ __set_PRIMASK(0); }這個(gè)函數(shù)里有幾處細(xì)節(jié)決定生死。app_sp 是 App 向量表第一個(gè)字也就是 App 初始主堆棧指針跳轉(zhuǎn)前不換棧指針Bootloader 的棧調(diào)用鏈會(huì)繼續(xù)壓棧App 的 main 函數(shù)跑起來(lái)后??臻g被污染。__set_PRIMASK(1)在切換 VTOR 前關(guān)閉全部可屏蔽中斷避免串口中斷在向量表切換的瞬間來(lái)一下CPU 拿著新向量表去找舊中斷入口直接進(jìn) HardFault。跳轉(zhuǎn)前的兩次檢查能攔掉“App 區(qū)是空白 Flash”的情況空白 Flash 讀出來(lái)是 0xFFFFFFFF通不過(guò) RAM 地址范圍判斷。4. 編譯配置與燒錄避坑讓 Bootloader 和 App 各就各位代碼寫完只是第一步真正讓這個(gè)工程跑起來(lái)的是兩個(gè) Keil 工程的配置。這章講清楚怎么建兩個(gè)工程、怎么生成 bin、怎么用串口助手手搓一次升級(jí)最后給出我踩過(guò)的三個(gè)坑。4.1 兩套 Keil 工程的 IROM 配置與 bin 文件生成源碼包分了兩個(gè) Keil 工程一個(gè) Bootloader一個(gè) App。各自的關(guān)鍵配置用一張表說(shuō)清配置項(xiàng)Bootloader 工程App 工程IROM1 起始地址0x080000000x08004000IROM1 大小0x40000xC000是否設(shè)置 VTOR不需要設(shè)置偏移 0x4000燒錄方式ST-Link 寫入通過(guò) Bootloader 串口升級(jí)App 工程里設(shè)置向量表偏移有兩種方式一種是在 main 函數(shù)里手動(dòng)執(zhí)行SCB-VTOR 0x08004000;另一種是在 system_stm32f10x.c 里宏定義VECT_TAB_OFFSET 0x4000。我推薦用后一種因?yàn)?SystemInit 在 startup 文件里比 main 更早執(zhí)行向量表在 C 環(huán)境初始化之前就切好了更穩(wěn)。如果是手動(dòng)方式注意別放在 main 的后面否則啟動(dòng)早期來(lái)的中斷照樣會(huì)跑飛。生成 bin 文件是升級(jí)的前提Keil 的 After Build 命令行里加一句fromelf --bin -o $LL.bin #L$LL會(huì)自動(dòng)展開成不帶擴(kuò)展名的工程輸出路徑#L是鏈接后的映像文件。生成后把這顆 bin 交給上位機(jī)程序就能用于串口升級(jí)。注意工程路徑不要帶空格否則 fromelf 會(huì)把路徑拆成多個(gè)參數(shù)這是我實(shí)際遇到過(guò)的低級(jí)問(wèn)題。4.2 用 Python 腳本模擬上位機(jī)手搓一遍完整升級(jí)流程在沒(méi)有現(xiàn)成上位機(jī)程序時(shí)用 Python 串口腳本就能聯(lián)調(diào)起來(lái)。核心是構(gòu)造協(xié)議幀import serial import struct def crc16_modbus(data: bytes) - int: crc 0xFFFF for b in data: crc ^ b for _ in range(8): if crc 0x0001: crc (crc 1) ^ 0xA001 else: crc 1 return crc def make_frame(cmd: int, payload: bytes) - bytes: body bytes([cmd]) struct.pack(H, len(payload)) payload crc crc16_modbus(body) return b\xaa\x55 body struct.pack(H, crc)聯(lián)調(diào)時(shí) BOOT0 保持低電平先用 ST-Link 燒 Bootloader然后只接 USB 轉(zhuǎn)串口 TTL打開串口后按這個(gè)順序跑發(fā)送升級(jí)開始幀payload 里是固件總長(zhǎng)度等待 Bootloader 回 ACK分段讀取 bin 文件每段 256 字節(jié)前三字節(jié)是因?yàn)閷?duì)齊要處理發(fā)數(shù)據(jù)幀并逐幀確認(rèn) ACK發(fā)完成校驗(yàn)幀收到 CRC_OK 后發(fā)跳轉(zhuǎn)幀。第一次聯(lián)調(diào)建議用 9600 波特率雖然慢但容錯(cuò)高。波特率越高現(xiàn)場(chǎng)線材和干擾對(duì)幀錯(cuò)誤率的影響越大。源碼包里默認(rèn)配置是 115200如果發(fā)現(xiàn) CRC 錯(cuò)誤率高先把波特率降下來(lái)再排查。4.3 避坑記錄變磚、Flash 寫入 HardFault、App 跑飛的三類排查經(jīng)驗(yàn)這一節(jié)記錄的是我實(shí)際踩過(guò)的三個(gè)坑每條都按現(xiàn)象、原因、解決展開。第一個(gè)坑是“升級(jí)中途斷電再上電設(shè)備變磚”?,F(xiàn)象是升級(jí)到一半現(xiàn)場(chǎng)工人誤拔電源再上電后設(shè)備沒(méi)有任何反應(yīng)App 起不來(lái)Bootloader 也沒(méi)響應(yīng)。原因是寫 Flash 只擦除了一部分頁(yè)App 區(qū)里既有新數(shù)據(jù)又有殘留的舊數(shù)據(jù)程序還嘗試直接跳轉(zhuǎn)。解決方法是跳轉(zhuǎn)前做嚴(yán)格的棧頂檢查和 App 有效魔數(shù)檢查魔數(shù)在 App 工程編譯時(shí)固定在向量表后第 4 個(gè)字節(jié)位置Bootloader 跳轉(zhuǎn)前讀這個(gè)位置不是約定的值就絕不跳轉(zhuǎn)并且等待上位機(jī)重新升級(jí)。第二個(gè)坑是“FLASH_ProgramHalfWord 寫入時(shí)進(jìn) HardFault”?,F(xiàn)象是寫入執(zhí)行到一半卡死調(diào)試器定位到 HardFault_Handler。原因有兩個(gè)目標(biāo)頁(yè)沒(méi)擦除干凈或者寫地址不是半字對(duì)齊。我第一次寫 IAP 時(shí)邊收邊寫收到哪頁(yè)寫哪頁(yè)沒(méi)先整片擦除結(jié)果在舊數(shù)據(jù)頁(yè)上寫入直接觸發(fā)錯(cuò)誤。解決方法是升級(jí)開始命令里整片擦除并在 IAP_OnData 里校驗(yàn) offset 是否為 2 的倍數(shù)、data_len 是否為偶數(shù)兩端約定數(shù)據(jù)補(bǔ)齊策略。第三個(gè)坑是“跳轉(zhuǎn)后 App 跑飛”?,F(xiàn)象是升級(jí)流程全部返回成功設(shè)備串口就是不工作調(diào)試器顯示停在了 HardFault_Handler。原因是 App 向量表偏移沒(méi)設(shè)。跳轉(zhuǎn)成功后App 的 main 還沒(méi)跑起來(lái)一個(gè) SysTick 或串口中斷到達(dá)CPU 從 0x08000000 讀中斷向量讀到的是 Bootloader 的中斷處理函數(shù)地址入口對(duì)不上直接 HardFault。解決方式就是在 App 工程里設(shè)置 VECT_TAB_OFFSET 為 0x4000并在跳轉(zhuǎn)函數(shù)里先__set_PRIMASK(1)再切 VTOR。這類問(wèn)題表現(xiàn)很像玄學(xué)但根因基本都是向量表偏移。5. 二次開發(fā)思路給串口 IAP 加上固件加密、版本回滾和生產(chǎn)驗(yàn)證跑通基礎(chǔ)升級(jí)之后要考慮的是怎么讓這套東西更接近產(chǎn)品級(jí)。Flash 只有 64KB很多雕花功能做不了但有幾件務(wù)實(shí)的事值得做。5.1 固件加密與簽名從裸數(shù)據(jù)幀到加密幀裸 bin 文件被上位機(jī)直接抓走就能逆向出固件所以量產(chǎn)產(chǎn)品通常會(huì)做一層加密。我在二次開發(fā)時(shí)采用的思路是上位機(jī)把 bin 用 AES-128-CBC 加密密鑰硬編碼在 Bootloader 里升級(jí)時(shí)先傳加密數(shù)據(jù)Bootloader 收到一幀后先解密、再寫入 Flash。解密用軟件實(shí)現(xiàn)STM32F103 的主頻跑 AES 會(huì)慢一點(diǎn)但好在數(shù)據(jù)量不大48KB 的固件多花幾百毫秒可以接受。要注意的是密鑰放 Flash 里只能防外行不能防專業(yè)抄板。真要防篡改得上簽名校驗(yàn)上位機(jī)對(duì)固件做 SHA256 摘要再用私鑰簽個(gè)名Bootloader 里放公鑰驗(yàn)簽。驗(yàn)簽通過(guò)才擦寫。這個(gè)項(xiàng)目里我把簽名設(shè)計(jì)成可選的Bootloader 編譯宏打開才啟用節(jié)省了不必要的時(shí)間開銷。5.2 版本回滾、斷點(diǎn)續(xù)傳與 BKP 記錄Flash 小的務(wù)實(shí)方案C8T6 的 64KB 放不下 A/B 雙系統(tǒng)的大回滾方案但可以實(shí)現(xiàn)小成本回滾升級(jí)前把當(dāng)前運(yùn)行中的 App 關(guān)鍵版本號(hào)記錄在備份寄存器里。STM32F103 的 BKP 寄存器在復(fù)位后不會(huì)丟失App 啟動(dòng)時(shí)讀 BKP 里的版本號(hào)和當(dāng)前固件版本比對(duì)如果發(fā)現(xiàn)版本回退或者寫失敗就主動(dòng)請(qǐng)求重寫。斷點(diǎn)續(xù)傳比回滾更實(shí)用。因?yàn)榇谏?jí)最怕斷斷了要從頭傳。Bootloader 里記錄已經(jīng)寫入的偏移量到 BKP再次上電時(shí)上位機(jī)可以直接從斷點(diǎn)續(xù)傳省掉整包重傳的時(shí)間。這個(gè)功能實(shí)現(xiàn)不復(fù)雜但要改協(xié)議在升級(jí)開始命令里帶上“上次寫入偏移”的查詢幀。5.3 出廠驗(yàn)證的習(xí)慣比功能本身更值錢做完這些擴(kuò)展有個(gè)動(dòng)作是每次都必須做的把整個(gè)驗(yàn)證腳本固化成出廠測(cè)試用例。上電不跳 App 的空白 Flash 測(cè)試、升級(jí)到一半斷電再上電的斷電測(cè)試、下載完成后斷電重啟的驗(yàn)收測(cè)試這三條我每做一個(gè) IAP 工程都會(huì)強(qiáng)制走一遍。源碼包能幫你跑通流程但這三次測(cè)試能幫你確定它在現(xiàn)場(chǎng)不會(huì)翻車。從那以后我每次做升級(jí)功能都堅(jiān)持把這三步寫進(jìn)測(cè)試清單一次都沒(méi)漏過(guò)希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99亚洲视频| 婷婷久久伊人| 丁香五月婷婷六月| 99久久精品国产色欲| 综合五月草| 丁香婷婷午夜| 久久99精品久| 欧洲亚洲激情五月天在线| 久久综合中文字幕| 欧美啪啪网| 激情AV| 亚洲欧美丁香五月天亚洲欧美| 99色看这里只有精品| www.久久婷婷| 天花AV无码| 影音先锋日本三级资源| 欧美性生交A片免费看| 亚洲成人AV在线播放| 五月丁香婷在线| 这里有精品99| 九九人妻福利| 国产1区2区3区在线观| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 精品久久久人妻| 天天插天天操| www、色色色| 亚洲色爽| 综合逼五月激情婷婷| 五月色色色| 欧美天天搞| 五月综合激情图片| 五月天色婷伊人| 91精品久久久久久久久久久久| 狠狠色综合无线观看| 色情婷婷| 97人妻超级碰碰碰碰碰| 91热视频| 丁香五月ⅤA久久久| 99ER热精品视频| 亚洲精品99| 五月婷婷之综合激情| 亚洲色婷婷婷婷人人爽| 开心五月婷婷在线视频免费观看| 婷婷六月天亚州| 丁香五月激情婷婷激情| 狠狠狠狠狠草| 亚洲第一第二网站| 欧美性猛交99久久久99| 五月婷婷性爱| 国色天香成人网| 五月激情综合网| 久久五月婷| 色婷婷操逼| 天天干天天干天天| 九九久久网| 丁香五月天色婷婷| 蜜桃五月天| 丰满人妻一区二区三区| 亚洲人成播放网站| 久久精品系列| 五月色婷婷亚洲 | 亚洲视频国产一区| 激情六| 成人噜噜网| 91超级碰碰| 丁香六月婷婷| 五月色欧美| 人操综合| 午夜婷婷久久| 成人va在线观看视频| 久操b网| 九九视频免费| 色综合久久久久久久久五月| 五月婷婷激情| 99操视频| 五月婷九月| 九九九AAA热视频| 热九九九九| 色婷婷色综合激情91| 丁香婷婷91在线观看视频| www、丁香五月天| 丁香五月综合婷婷| 婷婷激情丁五月| 色女伊人| 日日夜夜狠狠| 黄色91在线观看| 久99热在线观看| 秋霞成人毛片一级A片| 五月婷婷黄色| 五月综合婷婷五月| 丁香五月婷婷基地| 91色碰| 久久激情五月婷婷| 欧美成人精品一区二区| 在线综合网| 伊人五月婷| 热久69| 婷婷久久综合| 丁香六月婷婷| 91聚色综合网| 婷婷五月在线免费| 婷婷五月亚洲一本在线丁香| 5月婷婷视频网站综合| 欧美天天性| 99热这里只有精品在线观看| 成人国产欧美大片一区| 色综合色五月| 99久久五月婷婷| 99re8在这里只有精品| 五月婷性爱| 久久东京热婷婷五月| 天天天天天操| 欧美激情综合| 色色狼人综合| 色五月在线播放| 99视频精品在线| 操日本99| 久久五月婷综合网| 九九视频这里只有精品| 五月天激情四射网站| 色五月婷婷、老熟女| 久色大| 日本不卡高字幕在线2019| 丁香婷婷五月人体| 婷婷涩五月天综合| 国产欧美精品AAAAAA片| 色五月丁香六月资源站| 九九碰九九爱97超| 天天综合色丁香| 激情五月婷婷在线区| 色99热| 九九热狼人| 五月天另类小说亚洲| 丁香婷婷社区| 亚洲免费电影2| 五月天伊人日日噜影片AV| 激情综合啪啪| 中文字幕AV网址| 这里只有久久精99| 另类国产欧美视频| 丁香五月a| 五月日韩中文字幕| 99热这里只有精品33| 五月叮香啪| 超碰国产在线观看| 五月婷婷在线免费观看 | 日日爱678| 大香线蕉伊人| 天天做天天爱天天高潮| 丁香五月天天| 伊人在线视频| 日本WWW九九九| 99热无码| 婷婷中文字暮| 五月天婷婷AV| 五月婷婷久久大香蕉| 五月婷婷在线综合| 九九热最新| 狠狠做六月爱婷婷综合aⅴ| www,天天干| 欧州婷婷五月天综合| 人人澡天天色天天做| av在线免费播放| 日本99视频精品免费播放| 五月丁香六月婷综合成人综合| 9色在线| 亚洲AV成人在线| 久久WW| 四射综合网| 99re视频精品| 亚洲人人操| 五月婷婷在线播放| 婷婷九月在线| 欧洲不卡视频| 婷婷五月成人色综合| 色综合激情| 久久久网站| 伊人久久婷婷| 久久99热这里| 九色在线五月婷婷网址| 激情五月天 婷婷| 国产亚洲色婷婷久久99精品9j| 久久亚洲激情五码| 七七色色综合| 91超碰在线观看| 久热黄色| 99色看这里只有精品| 久久婷婷五月天| 26uuu国产色| 五月丁香六月激情综合| 五月天激情视频网站| 精品国婬伦V无码久久久| 五月花免费视频| 97超级碰碰碰| www.色婷婷.com| 日日干干天天干| 狠狠色综合图片| 综合五月婷婷| 99精品视频免费在线播放| 色色99| 色综合久久伊伊婷婷五月| 在线观看免费观看在线9久| 人人舔天天| 日本人妻操| 123草逼网| 久久五月天婷婷视频| 婷婷91视频| 亚洲天堂aaa| 日本久久视频| 欧美黄色一级录像| 无码人妻电影| www.五月瑟| 看全色黄大色大片| 国产XXXX搡XXXXX搡麻豆| 这里只有精彩视| 九九精品热播| 亚洲中文字幕在线观看| 91日视频| 精久久色| 99热综合| 99国产视频网| 天天插天天草人人玩| 69久久久| 五月婷婷激情综合| 欧美三日本三级少妇三99| 欧美情月伍月天| av操B网站| 久久婷婷国产| 日日插日日干| 日操| 成人在线网| 538在线精品| 婷婷丁香五月婷婷| 亚洲综合色五月| 欧美综合五月丁香六月婷| 激情五月天色播| www.五月丁香| 五月婷婷丁香色播网| 91久久久久久久久18| www,黄色在线,con| 五月婷婷激情综合| 六月婷婷av| 韩国久久少妇视屏| 色五月激情五月丁香五月婷婷啪啪综合 | 99热这里只有精品10| 啪啪色激情五月天| 影音先锋 萱萱| 99久久极情精品一区| 国产成人99久久亚洲综合精品| 99re熱| 97五月综合网| 韩日AV片| 日韩久久系列| 国产又色又爽又黄又免费| 97性视频| 成人在线视频一区| 五月天久草| 最近中文字幕2019视频1| 国产九九一区二区三区| 中文在线视频久1| 五月丁香激情综合六月涩涩爱| 婷婷网影院| 五月精品99综合| 亚洲色五月| 久久人操| 九九综合| 中文字幕黄色片| 丁香婷婷六月男男| 综合网视频| 久久机热这里只有精品| 丁香五月天啪啪激情综合网| 亚洲婷婷丁香五月视频| 森林影视大全,最好看的2019年视频 | 久久宗合影| 日本三级第一页| 天天爽天天| 丁香色婷婷| 激情五月天影院| 国产乱妇乱子伦| 天天日狠狠| 99久热| 玖玖爱综合网| 丁香九月激情| 深爱五月激情网| 日韩亚洲视频| 久久草人妻| 国产操碰| 婷婷五月天伊人在线| 伊人五月天在线| 九九色欲网| www.日本91| 操操操Av| 婷婷激情性爱| 99热精品在这里| 久久久久9999| 99热这里是精品| 久久丁香五月天| 久久丁香五月| 嫩草AV久久伊人妇女超级A| 日本猛少妇色XXXXX猛叫| 99无码视频| 日本久久网| 色99在线| 人人综合色| 亚洲婷婷综合视频| 日本精品99网站| 激情五婷网| 欧美99热| 99亚洲大片精品永久在线观看 | av九九| 熟妇内谢69XXXXXA片| 99精品偷自拍| 日本三级色| 日韩无码人妻一区二区| 国产精品久久..4399| 五月天婷婷久久| 色五月丁香五月激情五月激情| 少妇丁香婷婷 | 色情五月婷| 久久99婷婷| 久久草人妻| 五月丁香激情综合六月涩涩爱| 色情五月天婷婷| 可以看的AV| 婷婷九月亚洲| 桃色激情婷婷伊人网| 99re这里有精品手机在线| 99热99干| 人妻久久久久久久| 啪啪操网| 性爱AV天堂| 婷婷五月天熟妇| 五月婷综合| 久久伊人婷婷| 日比视频91| 91凹凸在线| 色之综合网| 色久综合天天做视频| 亚洲欧美丁香五月天亚洲欧美| www.激情| 无码网| 五月丁香在线观看国产| 97人妻碰碰碰久久香蕉| 婷婷色五月久久| 天天爱天天操| 少妇水多A片太爽了| 色色九区| 亚洲色a| 色在线99| 大香蕉丁香婷婷| 久久综合性| 26uuu亚洲欧美| 欧美啪啪9| 97精品人人A片免费看| 热996精品在线观看| 毛片网站谁有| 天天干天天拍| 亚洲狠狠爱婷婷| 丁香六月色婷婷| 中文不卡一二区| 超碰在线精品| 久久婷婷大香蕉| www.av视频xx999.com| 人人爽天天爽| 色五天综合| AV五月丁香| 久久99这里只有精品视频| 久久婷婷综合基地| 婷婷五月激情五月丁香五月| 婷婷免费无视频| 97干97色| 丝袜激情网| 99热久草| 久久久天堂国产精品女人| 最新色色五月天| 玖玖资源站蜜臀| 狠狠操狠狠操| 天天色天天射天天日| 婷婷五月天亚洲丁香| 国产精品色色| 99色色热热| 日日爽夜夜爽| 伊人影院久久网| 五月色情婷婷开心五月色情| AV电影在线播放| 伊人www22综合色| 亚洲第一第二网站| 婷婷中文综合网| 婷婷五月天Av| 久久免费精彩视频| 亚州激情网| 色情综合| 另类A片| 亚洲欧美丁香五月天亚洲欧美| 2050人人操免费工开爱| 色色网站免费观看| 激情婷婷丁香| 五月丁香五月天现场视频| 婷婷91| 婷婷综合色色| 深爱激情五月婷婷| 五月色婷婷在线观看| 爽极品色| 香蕉综合在线| 丁香婷婷影院| 婷婷丁香77777| 俺去也五月天婷婷| 狠狠狠婷婷五月综合| 久久久婷| 久久久久久xxxxx| 婷婷婷婷婷婷婷五月丁香| 激情av在线| 丁香色六月| 成人做爰A片免费看视频| 激情五月色播五月| 五六月丁香激情视频| 超碰人人99| 国产毛片欧美毛片久久久| 欧美婷婷五月天| 九九综合精品| 激情综合久久| 九九综舍久久| 色级婷婷| WWW色五月| 91超级碰碰碰| 五月天淫乱视频| 99精品视频免费观看,| 伊人www22综合色| 91黄色五月天视频| 风流少妇A片一区二区蜜桃| 丁香五月AV| 婷婷五月丁香成人| 蜘蛛女免费观看完整版高清电影| 久久激情五月婷婷| 久久玖玖综合| 久久五月天 91| 狠狠操综合| 99热精品观看| 六月婷婷综合| 久久久人妻| 思思久热| 色操b| 五月色导航| 99re热精品在线视频| 色五月婷婷自拍| 伊人天堂婷婷| 九九色插| 任我肏视频精品| 五月天色小说| 国产黄色在线| 国产毛片精品一区二区色欲黄A片| 丁香五月电影| 色色亚洲视频| 婷婷五月影院| 99人人干| 国产全是老熟女太爽了| 国产一区二区三区影院| 伊人色综合网| 欧美日韩精品人妻狠狠躁免费视频| XX色综合| 国色天香成人网| 欧美色婷婷| 91日韩在线| 六月婷婷激情图片| 在线只有精品| 最新高清无码专区| 国产做爰视频免费播放| 色婷婷激情五月天丁香| 综合久久婷婷99| 大香蕉AV电影在线| 人人操碰| 天天插天天射天天干| 91操在线观看| 99亚洲天堂| 日本怕怕视频| 五月婷婷之六月丁香| 五月婷婷色男女| 婷婷区日本| 99视频精品全部免费 在线| 爱草视频在线| 久久成人人妻| 97色片| 色五月婷婷丁香五月| 色色色色综合| 亚洲无码影音| 综合激情肏逼网| 婷婷色丁香五月| 色色色777| www。五月天。com| 婷婷五月六月| 久久婷婷伊人| 婷婷五月五月丁香| 婷婷爱爱蜜臀天天操| 九九亚洲视频| 日韩av网址大全| 激情五月婷婷开心网| 天天操中文字幕| 激情五月天在线视频| 乱精品一区字幕二区| 丁香九月激情在线视频| 成人网在线视频| 五月丁香| 综合网视频| 99热老网站| 五月网站| 亚洲成人一区| 五月婷婷婷婷婷| 啪啪婷婷五月天激情| 久久婷五月天| 奇米网大香蕉| 婷婷深爱五月亚洲综合| 色婷婷超碰| 五月天开心网| 天天操加勒比| http://www.sd-xiangsu.com/| 99热亚洲精品| 人妻激情久久| 色墦五月丁香| 五月综合久久| 碰碰碰97国产| 青青草原中文字幕| 五月天婷婷成人网| 9久久狠狠的| 五月天婷婷操逼视频| 啪啪啪啪五月天| 最新va在线播放| 国产精品A成V人在线播放| 婷婷久久精品| 天天干天天爽天天操| 久久这里都是精品| www.9797国产| 99热日韩| 黄色三级毛片中字| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 丁香五月婷婷久久久| 久久这里只有精品5| AV操操操| 在线观看日韩12345区| 色婷婷影视| 国精产品一区一区三区有限公司杨 | 六月婷婷激情图片| 五月天婷婷成人网| 9色免费网| 天天天添天天操| 99无码黄色视频| 激情文学第四色婷婷丁香五月| 激情综合丁| 天天爽夜夜操| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 天天免费日日夜夜夜夜| 午夜成人片400| 看婷婷五月天网| 大天天伊人| 丁香五月激情啪啪啪| 色情五月天se| 免费观看全黄做爰的视频| 色色色综合网| 五月开心激情| 国产99美少妇| 激情av| 久久只有精| 色五月丁香网| 激情五月深爱五月| 国产亚洲精品久久久久久牛牛| 五月丁香婷婷色| 色欲丁香| 热九九在线| 五月色影院| 婷婷99| 综合激情站| 日日骑夜夜撸| 高清一区二区三区日本久| 精a品a视a频| 丁香激情五月天| 五月激情五月丁香| 三级黄色大片视频| 99热无码| caopeng97人人| 先锋资源婷婷| 婷婷色网| 欧美性生交A片免费看| 色久五月| 亚洲欧美国产A片免费观看| 激情综合色婷婷六月天| 丁香婷婷五月综合影院| 久久只有18视频| 五月天婷婷日日爱| 国产av天天插天天操天天爽| 狠狠色综合精品视频在线| 十区av| 日韩成人中文字幕| 高清激情av在线观看| 欧美日本日韩| 日韩aaa| av网址在线| 九月婷婷综合| 婷婷精品综合| 九九99精品| 中文字幕日产A片在线看| 色青五月天| 九九热91| 成人做爰A片免费看视频| 日本99视频| 色五月婷婷内射| 激情视频综合| 99久| 美臀自射自家人妻| 久久婷婷色综合| 激情AV网| 五月婷婷亚洲天堂激情在线| 婷婷操久久| 亚洲第一成人AV| 狠狠做六月爱婷婷综合aⅴ| 久久婷婷综合五月天| 亚洲乱码精品久久久久..| 99热精品观看| 停停五月丁香| 五月综合人妻| 久久久月丁香| 天天操婷婷| 99热日| 五月婷婷说| 五月婷婷综合在线| 91精品91久久久中77777| 五月花免费视频| 婷婷五月丁香亚洲| 日韩欧美四五区| 天干夜夜操| 成人AV中文字幕| 丁香婷婷色情社区成人小说| 天天日夜夜爽| 综合欧美五月婷婷| 久久婷婷五月激情综合| 日日躁夜夜躁狠狠久久AV| 成人视频在线免费播放| 99re这里只有精品在线观看| 久久婷婷的综合色丁香五月| 五月婷婷久久综合| 97人人射| wuyuedingxiang99| 伊人在线视频| 天天曰夜夜爽| 丁香五月婷婷在线| wWwCom夜操wwW| 黄网在线播放| 日日噜噜夜夜狠狠久久丁香六月| 99热99极品观看| 青青日韩| 五月婷婷影院| 99啪99| 久久视频婷婷| 久久3p| 伊久久婷婷| 九热免费视频| 青青草tp| 蜜臀AV在线成人| 五月天伊人网| 99在线观看精彩视频| 久久曰曰| 综合网天天| 婷婷涩涩五月天| 激情网五月婷婷| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 伊人激情综合| 九九色video| 婷婷影院A成人| 香蕉久久国产AV一区二区| 婷婷五月天小说| 色婷婷影视| 亚洲激情综合网| 色婷婷伊人| 久久五月激情| 激情综合网五月激情| 亚洲永久四色| 播播网色播播| 国产精品第一国产精品| 国产AV一区二区三区最新精品| 亚洲色色色| 专区无日本视频高清8| 99色视频| www.91av.com| av一区免费看| 色色婷婷色色| 97碰久久| 98毛片| 久草五月天电影网| 五月天婷网| 99久久玖玖| 99热都是精品| 91热在线| 人妻AV在线| 日韩久久系列| 色婷婷视频综合| 婷婷五月天黄色网址| 色五月婷婷五月| 婷婷夜夜夜夜| 99精品高潮| 激情五月综合婷婷| 97婷婷五月| 欧美在线看| 午夜性做爰电影| 亚洲操b| 99色在线| 欧美日韩国产一二区| 97在线刺激| 婷婷五月天无码熟女| 九九Y精品热播| 狠狠综合网| 天天操九九插| 99乱视频| 六月五月天婷婷涩播在线| 亚洲人人操| 六月婷婷之青青草| 狠狠色丁香婷婷五月| 日本狠狠色| 99精品小视频| 丁香五月婷婷少妇| 日韩三及成人AV片| 国外亚洲成AV人片在线观看| 五月狠狠| 婷婷五月色亚洲| 久久激情天堂| 激情五月婷婷中文字幕| 四虎成人精品永久免费AV九九| 超碰在线caop| 九九热精品| 欧美婷婷五月丁香| 天天综合.com| 狠狠丁香| 99在线小视频| 亚洲妇女熟BBW| AV在线大香蕉| 婷婷激情五月色综合| 激情美女五月天| 久婷婷五月综合欧美| 97超碰免费超级在线观看| 丁香六月久久| 亚洲视频色婷婷| 五月丁香六月色婷婷| 99黄色性生活| 六月婷基地| 香蕉视频性爱BB做爱| 99热欧美| 五月婷久久| 99精品热| 婷婷五月天激情丁香| 69久久99精品久久久久| 亚洲 25P| 97色色色色色| 久久hd| 婷婷丁香色五月久久88| 欧美日韩999| www.91操| 99ri视频在线播放| 狠狠色噜噜色狠狠狠综合色 | 色色五月婷婷| XX久久| 丁香六月婷婷色XXXXX| 免费黄网不卡AV| 色婷丁香五月| 五月婷婷在线视频| 婷婷色九月| 美国十月色婷婷在线观看| 超碰无码老师| 99成人免费视频| 九九热青草| 六月色婷婷欧美| 天天插天天射| 99热99成人| 五月天天天色| 婷婷和五月天| www.操.com| 免费黄色视频网址| 五月婷丁香| 色婷婷综合网站| 中文资源在线a| 在线观看996精品| 久久九九色| 九九超碰人人| 五月婷婷激情网| 天天日天天日天天搞| 亚洲情综合五月天| 天天色五月| 日本猛少妇色XXXXX猛叫| 丁香五月花婷婷开心| 亚洲激情五月天| 丁香五月,开心五月,成人婷婷| 色999五月色| 色婷婷香蕉| www.99视频| 亭亭丁香aV| 香蕉综合网| 米奇激情婷婷| 日本婷婷色| 99热综合网| 激情久久久久久久久久久| 91在线日| 凹凸7777操操操| 午夜69成人做爰视频| 俺去也在线官网| 天堂网操| 9久热在线视频精品| 激情五月天丁香| 91狠狠色丁香婷婷综合久久精品| 欧美va视频不用播放器的va视频网| 国产偷人爽久久久久久老妇APP| 深爱五月天天| 国产婷婷五月| 丁香六月啪| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 超碰狠狠色| 91精品丝袜久久久久久久久粉嫩| www.久久久久久久| 丁香香五月激情免费视频| 人妻日日日| 丁香五月综合激情久久潮喷| 亚洲人人96@| 日日爽天天| 五月天婷婷爱| 亚洲操操| 97ai婷婷| 婷婷亚洲日本| 射久久丁香五月| 久热99热| BBWCUCKOLD精品熟妇| 香蕉色色网| 操操啪| 天天天天做夜夜夜夜做| 色婷六月| 99久久五月丁香野外| 91色噜噜狠狠狠狠色综合| 人人爱天天摸摸天天爱| 久99久视频免费观看| 婷婷色综合| 极品人妻VideOssS人妻| 婷婷五月激情丁香激情| 色情婷| 欧美大片免费观看| 伊人网碰碰| 99热精国产这里只有精品| 成人欧美日韩| 大香蕉网 久久| 色色色综合色| 久久九九色| 久热这里精品免费| 色丁香五月婷婷| 欲色人妻| 国产在线aaa片一区二区99| 五夜丁香| 常久最新免费的色吊丝| 久久丁香五月| 婷婷丁香小说| 欧洲综合视频在线观看。欧洲,亚洲综合食品在线观看。 | 亚洲无AV在线中文字幕| 激情丁香社区| 丁香六月五月天| 岛国资源网| 五月婷婷色| 日本99视频精品免费播放| 亚洲深喉aV| 99精品在线观看视频| 日日日日日| 九色色| 青草视频在线蜜臀| 亚洲sesesese| 色色五月天丁香| 色五月婷婷激情基地| 青青久久五月| 中文字幕无码人妻少妇免费视频| 亚洲视频99| 激情六月丁香| 囯产精品久久欠久久久久久九大| 五月天激情综合10p| 中文字幕成人| 久久婷狠狠色| 亚洲网站999| 国产免费av网站| 成人美女网| www.夜夜| 天天狠天天叉| 伊人激情| 丁香大香蕉| www.婷婷,com| 99视频在线观看网址| 开心激情网五月| 大香蕉久久伊人婷婷五月丁香| 日本美女上人| 激情婷婷丁香五月天| 蜜乳人妻一区二区三区| 天堂久久大香蕉| 色婷婷AV久久| www.玖玖婷婷在线| 日韩美一级毛卡片| 99ri6在线视频| 日韩人人操| 91久久久久| 人人操操97| 99视频| 五月丁香六月激情综合| 丁香五月婷婷五月| www.色婷婷| 亚洲亚洲人成综合网络| 狠狠五月天| 亚洲国产精品二二三三区| 少妇高潮呻吟A片免费看软件| 激情色色色| 99精品在线观看| 欧美人与性动交CCOO| 亚洲亚洲人成综合网络| 五月婷婷综合在线亚洲视频| 综合色图婷婷| 久久全色| 97五月久久丁香婷婷| 久操大| 丁香五月婷婷五月天在线| 丁香五月激情天AV无码| 天天综合五月| 99er6热在线观看精品6| 婷婷激情综合| 婷婷五月天小说网| 久久99综合| 99re欧美精品| 国产综合A片| 九九精品综合| 五月天开心成人网| 26UUU精品一区二区Com| 激情综合网五月婷婷| 久久激情天堂| 97自拍视频在线| 91干99| 欧美性爱一区| 日本va欧美va精品发布视频| 五月天激情久色| 99激情视频| 综合久久婷婷| 狠狠爱五月婷婷综合六月| 综合色网站| wWwCom夜操wwW| 人人做天天爱| 9久热| 99年操人人爽| 桃色激情五月天| 五月丁香婷婷爱激情综合网| 伊人五月天婷婷| 色热久| 午夜69成人做爰视频| 免费超碰在线| 26uuu视频欧美| 天天操天天操天天操天天操天天操天天操 | 成人五月丁香社区| 久久深爱激情网| 97五月久久丁香婷婷| 五月开心婷婷中文字幕| 天天综合天天玩夜夜玩天天玩夜夜玩| 99热8| 精品人妻一区二区三区在| 激情婷婷视频在线| 五月激情综合婷婷| 久热中文字幕在线线观看 | 五月天丁香六月综合| 国产精品久久久丁香五月八戒视频| 99噜噜| 久久精品一区二区三区四区| 成人电影在线免费试看| www色中色综合| 久久婷婷色| 成人在线免费网址| 日日操夜夜操狠狠操| 五月综合婷婷五月| 丰满少妇猛烈A片免费看观看| 99热超碰天堂网| 激情五月天网页| 九九这里都是精品| 婷综合六月| 五月色欧美| 精品人妻一区二区三区四区不卡在| 性做久久久久久久免费看| 成年人夜夜喷水| 五月婷婷丁香色播网| 天天日夜夜爽| 色婷婷电影网| 思思热视频在线观看| 在线看的免费网站| av网址在线| 99爱视频在线观看| 天天操天天插天天射| 99热日韩这里只有精品| 日日夜夜婷婷| 99A级片| 亚洲天天操| 久久久.www| 欧美精品啪啪| 丁香激情五月| 99色视| 婷婷亚洲在线| 刘玥av在线| 五月丁香久久综合| 性视频久久| 爆乳熟女一区二区三区爆乳| 丁香五月婷婷色偷偷| 99国产在线精品视频| 九九九九九无码| 五月花激情| 亚洲欧美在线观看| 婷婷社区五月天| 色五月婷婷五月久久| 欧美久久婷婷| 五月婷婷六月丁香首页| 国产精品人成A片一区二区| 综激情网| 婷婷五月天播播| 日日干夜夜撸夜夜骑| 97碰免费视频在线| 激情五月婷婷综合网| 99这里只有精| 中文字幕综合| 色五婷婷| www.十八禁不禁AV.com| 色综合色综合网| 丁香六月婷| 婷婷中文无码| 婷婷丁香久久| XX色综合| 日韩黄黄| 狠狠色综合五月人人| 婷婷中文字幕版| 97搞在线| 色色com| 99久re热| 婷婷深爱五月天| 亚洲综合色网站| 中文字幕网伦射乱中文| 夜夜天天天天天干天天爽| 26uuu精品一区二区| 色婷婷视频| 国产首页在线| 综合五月网| 五月婷婷人人人操| 狠狠狠狠狠干| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇| 色五月婷婷777| www.99热视频| 久久婷婷五月综合色奶水99啪| 婷婷五月天奸女| 天天日夜夜拍| 欧美丁香六月在线观看视频| 日本二级毛片二级毛片| 直接看的AV| 人人97碰| 欧美成人AAA片一区国产精品| 婷婷色五月天在线| 人妻久热| 一本大道熟女人妻中文字幕在线| 青青草原99热| 五月丁香六月婷婷成人| www.色婷婷.com| 在线观看玖玖资源免费观看| 影音先锋一区二区资源站| 色婷操逼| 五月色情婷婷开心五月色情| 99在线看片| 99啪啪视频| 青青草六月丁香| 熟女啪啪视频| 无码少妇高潮喷水A片免费| 九九在线这里只有精品视频 | 人操91在线| 五月婷啪啪| 五月五丁香婷婷| 亚洲人妻Av| 狠狠干综合| 五月婷婷激情综合| 婷婷永久在线| 91xxxx九色| 高清一区二区三区日本久| 丁香五月天婷婷激情| 精a品a视a频| 狠狠久综合| 色狠狠色噜噜AV天堂五区| 五月婷婷丁香五月| 亚洲久久婷婷丁香五月天| 99热碰碰热| 婷婷丁香日韩五月| 另类视频在线| 五月丁香六月玩女人| www、丁香五月天| 伊人婷婷99热精品| 五月丁香天堂网| 五月婷婷成人w| 久久xx| 在线观看996精品| 日本久久色| 婷婷狠狠操| 国产97色在线 | 日韩| 色婷婷丁香五月色综合网| 色欲婷婷五月天| www.com.色色| 亚洲av综合在线| 激情综合五月丁香| 久久性视频| 婷婷六月色开 | 成人Av在线大片| 日本人妻伦在线中文字幕| 一区二区乱码视频| 色中色综合| 婷婷丁香激情| 激情桃色网| www超碰| 成人版视频在线观看| 日韩一级淫乱片一区二区三区| 色婷婷基地| 六月丁香五月天| 亚洲午夜一区二区| 九九视频在线观看| 色婷婷六月天在线| 91美女被操| 久久综合影院| 激情五月天的婷婷| 久久99久久久| 亚洲黄色操逼| 国内精品免费一区二区2009| 激情操逼婷婷| 日本三级韩三级99久久| 久久丁香五月天| 久热伊人| 五月天偷拍| 99视频只有精品| 天天干,天天日| 四月丁香五月婷婷久久| 色天天综合| 99热日韩| 99热精品中文字幕| 综合激情网激情五月。| 久久久久思思热| 精品A√| 天天天干夜夜夜操| 日日夜夜久| 激情网五月天| 综合激情在线| 亚洲人成色A777777在线观看| 久草热在线视频| 久久最新色| 婷婷中文在线| 亚洲成人综合在线| 伊人在线视频| 办公室少妇激情呻吟A片在线观看| 五月综合色| 国产精品第一国产精品| 黄色av网站在线免费播放| 激情综合另类| 六月婷婷AV| 99热免费精品| 華人性愛AV在線| 久久精品国产色| 欧美综合五月丁香六月婷| 操日挥操日日| 婷婷中文字幕网| 五月婷婷久久久| 桃色五月天| 亚洲成人在线电影网站| av一区免费看| 超碰97干| 天天免费成年人视频| 人人草人人爱手机视频看看 | 婷婷久久网| 国产成人精品一区二三区熟女在线| 婷婷九月亚洲| 99啪啪| 婷婷五月丁香激情图片| 日本一毛片| 婷婷六月丁香激情| 丁香五月婷婷欧美成人色图| 婷婷久月| 天天色视频| 亚洲亚洲人成综合网络| av电影在线播放| 色一情一乱一乱一区91Av| 97资源碰碰| 久久er九九| 99热这里只有免费精品| 手机免费福利视频| 超碰免费大香蕉| PORNY九色9l自拍视频成人| 五月婷婷啪啪| 91人人爽人人操| 99,色| 天天夜天天色天天| 五月天婷婷网站888| 免费做A爰片77777| 狠狠九九婷婷韩| 欧美黑人大吊| 亚洲激情免费视频观看| 丁香午夜天| 久久综合9| 丁香综合网| 丁香五月六月激情| www99精品| 久cao香蕉影院| 丁香六月婷婷色播| 黄色99网| 在线婷婷| 俺去婷婷 丁香| 天天插天天插天天操| 五月第四色| 五月婷婷六月丁香| 色婷婷综合亚洲| 六月婷婷色宗合| 99热这里有精力| 涩涩婷婷五月| 色婷五月| 九九热最新地址| 天天综合网~91| 噜噜噜精品欧美成人在线观看| 俺去也五月天婷婷| 久久久九九视频精品18| 日韩在线看AV| 99色一| 超碰97人人操| 久久女婷| 五月丁香成人| AV人人操| 久久受www免费人成| 九九人人看| a v色婷婷| 久久怕怕视频| 99噜噜| 狠狠高潮精品亚洲1| 麻豆WWWCOM内射软件| 狠狠色色| 婷婷五月亚洲综合| 亚洲精品成人片在线播| 97干婷婷五月天| 夜夜穞天天穞狠狠穞AV美女按摩| 国产精品久久..4399| 天天操婷婷| 超碰操网| 婷婷丁香六月五月天| 人人人操 超碰| 五月天播播中文字幕 | 婷婷六月五月天综合| 99热大| 亚洲成人免费在线| 婷婷五月天视频小说| 99久久色| 色色丁香婷婷| 天天爽人人爽| 停停五月色宗合| 天天日天天舔| 99热99热99热99热| 91九色中文| 99热在线播放| 一本久道综合色婷婷五月| 97久久久久| av亚洲国产小电影| 色婷婷亚洲婷婷在线观看| 色婷婷丁香网| 欧在线一区| 丁香花五月天激情| 欧美一区二区三区不卡影视| 99久在线精品99re8热| 人妻激情网| 狠狠色噜噜狠狠狠888| 在线亚洲综合网| 久久久久久久人妻| 久9免费视频| 成人短视频在线观看|