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

ARTICLE DETAIL

資訊詳情

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

迪文串口屏通用驅(qū)動(dòng):三層架構(gòu)與狀態(tài)機(jī)協(xié)議解析

迪文串口屏通用驅(qū)動(dòng):三層架構(gòu)與狀態(tài)機(jī)協(xié)議解析 簡(jiǎn)介面向AVR平臺(tái)的迪文DWIN串口TFT屏通用驅(qū)動(dòng)程序以標(biāo)準(zhǔn)C語(yǔ)言實(shí)現(xiàn)具備良好的可讀性與可移植性配套兩個(gè)文件dwin-display.c負(fù)責(zé)屏幕初始化、點(diǎn)線矩形圓繪制及文本顯示等核心功能dwin-display.h則定義屏幕尺寸、顏色深度等配置結(jié)構(gòu)并開(kāi)放簡(jiǎn)潔API開(kāi)發(fā)者只需調(diào)用dwin_init、dwin_draw_pixel、dwin_print_string等接口即可完成顯示控制無(wú)需糾結(jié)底層時(shí)序。壓縮包采用rar格式共2個(gè)文件1個(gè)h、1個(gè)c整體僅3KB體量極小、便于直接嵌入AVR工程。該驅(qū)動(dòng)兼容多種迪文屏型號(hào)與分辨率能適配工業(yè)控制、智能家居、物聯(lián)網(wǎng)等場(chǎng)景同時(shí)通過(guò)閱讀源碼還可掌握迪文屏SPI/UART串口通信的參數(shù)配置及GPIO連接方法為后續(xù)性能優(yōu)化和低功耗設(shè)計(jì)提供參考。目前已有831人學(xué)習(xí)下載適合嵌入式開(kāi)發(fā)者快速上手。1. 迪文串口TFT屏通用驅(qū)動(dòng)從改三次串口解析到一套代碼通吃前兩年做一個(gè)產(chǎn)線設(shè)備儀表項(xiàng)目主控從某51單片機(jī)換到STM32又因?yàn)樾酒?yīng)問(wèn)題換到國(guó)產(chǎn)GD32每次換主控顯示部分的串口解析都要從頭改一遍。屏幕始終沒(méi)換都是迪文DWIN的串口TFT但每版代碼里拼幀、拆幀、等返回的邏輯都和業(yè)務(wù)混在一起越改越不敢動(dòng)。后來(lái)我把這塊屏的通信單獨(dú)抽成一套通用驅(qū)動(dòng)傳輸層只收發(fā)字節(jié)協(xié)議層只解析幀應(yīng)用層只寫(xiě)業(yè)務(wù)。換主控時(shí)只改兩個(gè)端口函數(shù)頁(yè)面和變量地址一行不用動(dòng)。如果你正在做工業(yè)HMI、儀器儀表、設(shè)備面板被迪文屏的DGUS協(xié)議、變量字節(jié)序和返回幀解析折磨過(guò)這套驅(qū)動(dòng)和它的拆分思路可以直接抄走。2. 架構(gòu)與目錄設(shè)計(jì)把驅(qū)動(dòng)拆成傳輸、協(xié)議、應(yīng)用三層2.1 為什么必須分三層迪文屏本質(zhì)上是帶DGUS操作系統(tǒng)的顯示終端。屏幕內(nèi)部的串口接收、幀校驗(yàn)、字庫(kù)和FLASH存儲(chǔ)全部封裝在屏里主控能控制的只有串口上的一幀一幀字節(jié)。所以驅(qū)動(dòng)能不能復(fù)用取決于“發(fā)字節(jié)”“幀長(zhǎng)什么樣”“收到幀之后干什么”這三件事有沒(méi)有被拆開(kāi)。我見(jiàn)過(guò)比較多反例是直接把屏幕通信寫(xiě)在業(yè)務(wù)里測(cè)溫函數(shù)里拼一個(gè)數(shù)組塞給串口按鍵回調(diào)里再寫(xiě)一段解析。頁(yè)面一多全局?jǐn)?shù)組和臨時(shí)標(biāo)志位纏在一起排查一個(gè)亂碼要打好幾個(gè)斷點(diǎn)。分層之后驅(qū)動(dòng)和MCU外設(shè)解耦也和應(yīng)用業(yè)務(wù)解耦這是整個(gè)驅(qū)動(dòng)設(shè)計(jì)的底線。順帶說(shuō)一句回調(diào)不能放到串口中斷里直接執(zhí)行。因?yàn)榛卣{(diào)里一旦出現(xiàn)耗時(shí)操作比如寫(xiě)日志、翻轉(zhuǎn)繼電器中斷響應(yīng)時(shí)間就會(huì)被拖長(zhǎng)后續(xù)字節(jié)跟著丟。所以整個(gè)驅(qū)動(dòng)的原則是中斷只入FIFO業(yè)務(wù)回調(diào)全部放到 dwin_poll 里執(zhí)行。這么做還有個(gè)衍生好處將來(lái)接RTOS時(shí)可以把 dwin_poll 單獨(dú)放一個(gè)任務(wù)用戶不用關(guān)心臨界區(qū)。2.2 目錄結(jié)構(gòu)與模塊定位驅(qū)動(dòng)源碼內(nèi)部是這樣組織的dwin_drv/ ├── dwin_config.h // 幀格式、波特率、校驗(yàn)開(kāi)關(guān)、超時(shí)參數(shù) ├── dwin_port.h // 移植層接口聲明 ├── dwin_port.c // 串口收發(fā)、毫秒時(shí)間戳換平臺(tái)只改這里 ├── dwin_fifo.c // 環(huán)形緩沖區(qū)串口中斷到解析器的中轉(zhuǎn) ├── dwin_proto.c // 幀組裝、幀解析狀態(tài)機(jī)、校驗(yàn) ├── dwin_core.c // 對(duì)外API、回調(diào)表、事件分發(fā) └── demo/ ├── demo_stm32_uart.c └── demo_rtos_thread.cdwin_config.h 是整個(gè)驅(qū)動(dòng)的參數(shù)總閘。幀模式舊版AA幀還是新版5A A5幀、是否啟用校驗(yàn)、波特率、接收空閑超時(shí)時(shí)間都放在這里調(diào)屏幕型號(hào)時(shí)第一件事就是改這個(gè)頭文件。dwin_fifo.c 是典型的環(huán)形緩沖區(qū)串口中斷只做一步操作把字節(jié)壓進(jìn)FIFO主循環(huán)里的 dwin_poll() 再?gòu)腇IFO取字節(jié)喂給狀態(tài)機(jī)。這個(gè)設(shè)計(jì)保證中斷里沒(méi)有耗時(shí)邏輯也不丟字節(jié)。dwin_proto.c 是這個(gè)驅(qū)動(dòng)最核心的文件。它負(fù)責(zé)把“寫(xiě)變量、讀變量、寫(xiě)文本、跳頁(yè)”請(qǐng)求拼成符合屏幕協(xié)議的一幀同時(shí)把屏幕返回的原始字節(jié)流還原成帶指令號(hào)、地址、數(shù)據(jù)的數(shù)據(jù)包。dwin_core.c 站在更上層對(duì)外暴露簡(jiǎn)潔的API比如 dwin_write_uint16(0x1000, val, 1)內(nèi)部先查配置再調(diào)協(xié)議層拼幀最后經(jīng)端口層發(fā)出去。這樣換屏幕型號(hào)時(shí)應(yīng)用層調(diào)用的接口可以完全不變。2.3 對(duì)外接口設(shè)計(jì)6個(gè)函數(shù)覆蓋90%場(chǎng)景dwin_core 對(duì)外提供的核心API如下表函數(shù)作用關(guān)鍵參數(shù)說(shuō)明dwin_init初始化協(xié)議棧、清空回調(diào)表和FIFO無(wú)dwin_poll主循環(huán)周期調(diào)用處理FIFO中的字節(jié)無(wú)dwin_write_uint16向變量地址寫(xiě)1到N個(gè)字起始地址、數(shù)據(jù)指針、字?jǐn)?shù)dwin_read_uint16向屏幕發(fā)出讀變量請(qǐng)求起始地址、字?jǐn)?shù)dwin_set_text給文本控件寫(xiě)入字符串地址、字符串、長(zhǎng)度dwin_register_callback注冊(cè)返回幀與按鍵上報(bào)回調(diào)事件類型、回調(diào)函數(shù)指針dwin_write_uint16 是使用頻率最高的函數(shù)。溫度、速度、計(jì)數(shù)值這類數(shù)據(jù)在DGUS工程里綁定到一個(gè)整數(shù)數(shù)據(jù)變量顯示控件驅(qū)動(dòng)往對(duì)應(yīng)的變量地址寫(xiě)一個(gè)字屏幕自動(dòng)刷新。dwin_set_text 適合給標(biāo)簽控件寫(xiě)單位或狀態(tài)文字它內(nèi)部會(huì)把字符串放到幀數(shù)據(jù)區(qū)。這里要多留一個(gè)心眼中文字符串必須按屏幕燒錄時(shí)的編碼一般是GB2312發(fā)送否則顯示亂碼。dwin_read_uint16 是異步的發(fā)出請(qǐng)求之后不能立刻拿到結(jié)果數(shù)據(jù)要等屏幕返回幀到了、回調(diào)被觸發(fā)后才能拿到。這個(gè)異步語(yǔ)義很多第一次接觸的人會(huì)踩坑所以驅(qū)動(dòng)里專門做了回調(diào)注冊(cè)機(jī)制。2.4 數(shù)據(jù)流向一次dwin_write_uint16調(diào)用經(jīng)歷了什么以寫(xiě)一個(gè)變量為例完整鏈路是應(yīng)用層拿到數(shù)值 val125調(diào)用 dwin_write_uint16(0x1000, val, 1)dwin_core 把 125 拆成兩個(gè)字節(jié)高位 0x00 在前、低位 0x7D 在后dwin_proto 的幀組裝函數(shù)把這個(gè)數(shù)據(jù)連同指令碼 0x82、地址 0x1000 拼成一幀最后 dwin_port_send 把整幀發(fā)給屏幕。由于串口是流式的所以高位先發(fā)。接收方向是異步的。屏幕收到讀變量請(qǐng)求后返回一幀包含變量值的數(shù)據(jù)串口中斷把字節(jié)塞進(jìn)FIFO主循環(huán)調(diào)用 dwin_poll 時(shí)逐字節(jié)解析完整幀解析出來(lái)之后按指令號(hào)匹配回調(diào)。所以 dwin_poll 必須被周期性調(diào)用這一點(diǎn)恰恰是移植時(shí)最容易被忽略的只在初始化時(shí)調(diào)一次接收永遠(yuǎn)不會(huì)觸發(fā)。在RTOS環(huán)境下dwin_poll 適合放在一個(gè)獨(dú)立線程里循環(huán)調(diào)用用戶回調(diào)也在該線程執(zhí)行不會(huì)阻塞中斷也不會(huì)和業(yè)務(wù)線程搶串口。3. 核心模塊拆解幀組裝、狀態(tài)機(jī)解析與回調(diào)分發(fā)3.1 幀格式新舊兩套協(xié)議并存迪文屏協(xié)議在不同固件版本間差異不小驅(qū)動(dòng)里遇到最多的是兩種舊版以 0xAA 開(kāi)頭的幀和新版以 5A A5 開(kāi)頭的幀。兩者都是“幀頭長(zhǎng)度指令變量地址數(shù)據(jù)校驗(yàn)”的結(jié)構(gòu)但長(zhǎng)度字段包含的范圍不同校驗(yàn)方式也可能不同。驅(qū)動(dòng)通過(guò)編譯期宏選擇幀模式/* dwin_config.h */ #define DWIN_FRAME_MODE_NEW 1 /* 1: 5A A5幀; 0: 舊版AA幀 */ #define DWIN_FRAME_LEN_INCLUDE_CMD 1 /* 長(zhǎng)度字段是否包含指令本身 */ #define DWIN_FRAME_TAIL_SUM 1 /* 幀尾是否附帶求和校驗(yàn) */先看 5A A5 模式的幀結(jié)構(gòu)一個(gè)完整的寫(xiě)變量幀是這樣字段字節(jié)數(shù)說(shuō)明0x5A 0xA52幀頭長(zhǎng)度2從指令字節(jié)到數(shù)據(jù)末尾的字節(jié)數(shù)小端指令10x82寫(xiě)變量、0x83讀變量、0x84寫(xiě)文本地址2DGUS變量地址高字節(jié)在前數(shù)據(jù)N實(shí)際數(shù)據(jù)校驗(yàn)1對(duì)指令、地址、數(shù)據(jù)求和取低字節(jié)需要提醒的是具體型號(hào)的固件對(duì)長(zhǎng)度字段的含法、校驗(yàn)形式可能有差異。拿到屏之后要先看它隨附的DGUS協(xié)議手冊(cè)再?zèng)Q定 DWIN_FRAME_LEN_INCLUDE_CMD 置1還是置0。這個(gè)配置對(duì)不上時(shí)通常就是手冊(cè)和代碼沒(méi)統(tǒng)一。3.2 發(fā)送端可變長(zhǎng)幀組裝函數(shù)幀組裝函數(shù)是發(fā)送側(cè)的核心。它把指令、地址、數(shù)據(jù)三個(gè)部分拼成完整幀并自動(dòng)處理長(zhǎng)度字段和校驗(yàn)。uint16_t dwin_build_frame(uint8_t *buf, uint8_t cmd, uint16_t addr, const uint8_t *data, uint16_t data_len) { uint16_t i 0; #if DWIN_FRAME_MODE_NEW buf[i] 0x5A; /* 幀頭 */ buf[i] 0xA5; #else buf[i] 0xAA; #endif uint16_t len 0; len 1; /* 指令占1字節(jié) */ len 2; /* 地址占2字節(jié) */ len data_len; /* 數(shù)據(jù)區(qū) */ if (DWIN_FRAME_LEN_INCLUDE_CMD) { /* 長(zhǎng)度從指令開(kāi)始算上面len已經(jīng)包含指令 */ } else { len - 1; /* 長(zhǎng)度不包含指令 */ } len DWIN_FRAME_TAIL_SUM ? 1 : 0; /* 校驗(yàn)字節(jié)計(jì)入長(zhǎng)度 */ #if DWIN_FRAME_MODE_NEW buf[i] len 0xFF; /* 長(zhǎng)度低字節(jié)在前 */ buf[i] (len 8) 0xFF; #else buf[i] len 0xFF; /* 舊版按單字節(jié)長(zhǎng)度處理 */ #endif buf[i] cmd; /* 指令 */ buf[i] addr 8; /* 地址高字節(jié) */ buf[i] addr 0xFF; /* 地址低字節(jié) */ uint8_t sum cmd (uint8_t)(addr 8) (uint8_t)(addr 0xFF); for (uint16_t j 0; j data_len; j) { sum data[j]; buf[i] data[j]; } if (DWIN_FRAME_TAIL_SUM) { buf[i] sum; /* 求和校驗(yàn) */ } return i; /* 返回整幀長(zhǎng)度 */ }這段代碼最需要注意的地方是長(zhǎng)度字段的計(jì)算。它把指令、地址、數(shù)據(jù)三部分相加再根據(jù)宏決定是否去掉指令字節(jié)、是否加上校驗(yàn)字節(jié)。如果你在實(shí)測(cè)中發(fā)現(xiàn)屏幕對(duì)長(zhǎng)度字段理解不一致問(wèn)題幾乎都出在這三個(gè)宏的組合上。數(shù)據(jù)區(qū)按順序拷貝后校驗(yàn)字節(jié)使用最樸素的求和取低字節(jié)如果屏幕手冊(cè)要求CRC只需把這一段替換成CRC函數(shù)。3.3 接收端狀態(tài)機(jī)拆幀而不是等完整中斷接收側(cè)我習(xí)慣用一個(gè)輕量狀態(tài)機(jī)而不是在串口中斷里攢數(shù)組。狀態(tài)機(jī)的優(yōu)勢(shì)是隨時(shí)可以從噪聲中重新同步到幀頭不需要額外空閑定時(shí)器去判斷“一幀結(jié)束了”。typedef enum { ST_WAIT_5A 0, ST_WAIT_A5, ST_WAIT_LEN_L, ST_WAIT_LEN_H, ST_WAIT_CMD, ST_WAIT_DATA } dwin_parse_state_t; typedef struct { dwin_parse_state_t state; uint16_t len; /* 幀體總長(zhǎng)度含指令與數(shù)據(jù) */ uint16_t idx; /* 已接收字節(jié)數(shù) */ uint8_t buf[64]; /* 幀體緩沖 */ uint8_t cmd; uint32_t last_byte_tick; /* 上次收到字節(jié)的時(shí)間戳 */ } dwin_parser_t;解析函數(shù)逐字節(jié)輸入每收到一個(gè)字節(jié)驅(qū)動(dòng)狀態(tài)機(jī)往前步進(jìn)uint8_t dwin_parse_fsm(dwin_parser_t *p, uint8_t ch) { switch (p-state) { case ST_WAIT_5A: if (ch 0x5A) p-state ST_WAIT_A5; break; case ST_WAIT_A5: p-state (ch 0xA5) ? ST_WAIT_LEN_L : ST_WAIT_5A; break; case ST_WAIT_LEN_L: p-len ch; p-state ST_WAIT_LEN_H; break; case ST_WAIT_LEN_H: p-len | (uint16_t)ch 8; p-idx 0; p-state ST_WAIT_CMD; break; case ST_WAIT_CMD: p-cmd ch; p-buf[p-idx] ch; p-state ST_WAIT_DATA; break; case ST_WAIT_DATA: p-buf[p-idx] ch; if (p-idx p-len) { /* 收滿整個(gè)幀體 */ p-state ST_WAIT_5A; return 1; } break; default: p-state ST_WAIT_5A; break; } return 0; }這里需要特別說(shuō)明 ST_WAIT_CMD 和 ST_WAIT_DATA 的區(qū)別。ST_WAIT_CMD 只收一個(gè)字節(jié)也就是指令碼ST_WAIT_DATA 則繼續(xù)收剩余的幀體字節(jié)包括地址和數(shù)據(jù)。當(dāng) idx 累加到等于 len 時(shí)說(shuō)明一幀完整到達(dá)此時(shí)返回1dwin_poll 會(huì)把幀體交給回調(diào)分發(fā)函數(shù)。如果中途插入噪聲字節(jié)狀態(tài)機(jī)會(huì)回到 ST_WAIT_5A 重新找?guī)^不會(huì)把錯(cuò)位數(shù)據(jù)當(dāng)成有效幀。注意幀體緩沖 buf 默認(rèn)64字節(jié)如果屏幕有超過(guò)60字節(jié)數(shù)據(jù)的返回幀記得把數(shù)組加大否則會(huì)越界覆蓋。3.4 超時(shí)復(fù)位給狀態(tài)機(jī)一條后悔藥狀態(tài)機(jī)雖然能自動(dòng)找回幀頭但有一種情況很讓人抓狂屏幕回幀還沒(méi)收完線纜抖了一下從此后續(xù)所有字節(jié)都錯(cuò)位。所以我加了一個(gè)接收超時(shí)機(jī)制。dwin_poll 每次被調(diào)用時(shí)會(huì)順便檢查當(dāng)前幀是否太久沒(méi)有新字節(jié)到達(dá)超時(shí)就強(qiáng)制復(fù)位。void dwin_poll(void) { dwin_parser_t *p g_parser; uint32_t now dwin_port_get_tick_ms(); if (now - p-last_byte_tick DWIN_RX_TIMEOUT_MS) { p-state ST_WAIT_5A; /* 超時(shí)狀態(tài)機(jī)回到等幀頭 */ p-idx 0; } while (!dwin_fifo_is_empty(g_fifo)) { uint8_t ch dwin_fifo_pop(g_fifo); p-last_byte_tick dwin_port_get_tick_ms(); if (dwin_parse_fsm(p, ch)) { dwin_dispatch(p); } } }超時(shí)時(shí)間我一般設(shè)5ms因?yàn)槠聊辉?15200波特率下發(fā)送幾十字節(jié)的返回幀耗時(shí)都在1ms以內(nèi)5ms足夠?qū)捲S植粫?huì)讓噪聲長(zhǎng)時(shí)間影響狀態(tài)機(jī)。移植到不同平臺(tái)時(shí)dwin_port_get_tick_ms 是唯一需要新增的時(shí)間函數(shù)很多MCU的SysTick就能提供。這個(gè)“超時(shí)復(fù)位”解決的是串口屏項(xiàng)目里非常典型的玄學(xué)問(wèn)題線纜質(zhì)量不好時(shí)明明引腳沒(méi)接錯(cuò)程序卻間歇性收不到回調(diào)。3.5 回調(diào)分發(fā)把幀體翻譯成業(yè)務(wù)語(yǔ)義完整幀進(jìn)入 dispatch 后還需要從協(xié)議層視角翻譯成業(yè)務(wù)事件。驅(qū)動(dòng)維護(hù)一張回調(diào)表調(diào)用方可以針對(duì)不同事件注冊(cè)處理函數(shù)typedef struct { uint8_t cmd; uint16_t addr; uint8_t *data; uint16_t len; } dwin_pkt_t; typedef void (*dwin_callback_t)(const dwin_pkt_t *pkt); static dwin_callback_t s_cb_table[8]; void dwin_register_callback(dwin_evt_id_t evt, dwin_callback_t cb) { if (evt 8) s_cb_table[evt] cb; } static void dwin_dispatch(dwin_parser_t *p) { dwin_pkt_t pkt; pkt.cmd p-buf[0]; pkt.addr (uint16_t)((p-buf[1] 8) | p-buf[2]); pkt.data p-buf[3]; pkt.len p-len - 3; /* 從總長(zhǎng)度中去掉指令和地址 */ if (pkt.cmd DWIN_CMD_READ_ANSWER s_cb_table[DWIN_EVT_READ]) { s_cb_table[DWIN_EVT_READ](pkt); } }調(diào)用方使用時(shí)只需要關(guān)心“某個(gè)事件到了我該做什么”而不用關(guān)心幀是怎么收上來(lái)的。比如屏幕上的按鍵控件在DGUS工程里配置好上報(bào)功能后按下時(shí)屏幕會(huì)主動(dòng)回一幀驅(qū)動(dòng)解析出地址和值觸發(fā) DWIN_EVT_KEY 回調(diào)應(yīng)用層在回調(diào)里判斷地址屬于哪個(gè)按鍵再執(zhí)行對(duì)應(yīng)邏輯。4. 運(yùn)行指南從移植到點(diǎn)亮第一塊屏4.1 移植層只改兩個(gè)半函數(shù)驅(qū)動(dòng)把和硬件相關(guān)的部分收攏在 dwin_port.c 里換平臺(tái)時(shí)只需要實(shí)現(xiàn)四個(gè)簡(jiǎn)單函數(shù)初始化、發(fā)送字節(jié)數(shù)組、接收一個(gè)字節(jié)、獲取tick。/* dwin_port.h */ void dwin_port_init(uint32_t baud); void dwin_port_send(uint8_t *buf, uint16_t len); uint8_t dwin_port_get_char(void); /* 從FIFO取一個(gè)字節(jié)無(wú)數(shù)據(jù)返回0 */ uint32_t dwin_port_get_tick_ms(void); /* 毫秒時(shí)間戳 */以STM32為例串口初始化用USART1115200波特率8位數(shù)據(jù)、無(wú)校驗(yàn)、一位停止位。發(fā)送函數(shù)就是循環(huán)寫(xiě)發(fā)送寄存器void dwin_port_send(uint8_t *buf, uint16_t len) { for (uint16_t i 0; i len; i) { while (!LL_USART_IsActiveFlag_TXE(USART1)); LL_USART_TransmitData8(USART1, buf[i]); } }接收方向不是輪詢要走中斷。串口中斷里只做一件事把收到的字節(jié)壓進(jìn)FIFOvoid USART1_IRQHandler(void) { if (LL_USART_IsActiveFlag_RXNE(USART1)) { uint8_t ch LL_USART_ReceiveData8(USART1); dwin_port_on_rx_byte(ch); /* 內(nèi)部就是 fifo_push */ } }dwin_port_get_char 則從同一個(gè)FIFO取字節(jié)。連接屏幕時(shí)三根線必須共地屏幕TXD接MCU的RXRXD接MCU的TX如果屏幕是5V邏輯而MCU是3.3V需要電平轉(zhuǎn)換否則長(zhǎng)時(shí)間運(yùn)行可能出現(xiàn)隨機(jī)錯(cuò)誤幀。這個(gè)細(xì)節(jié)在項(xiàng)目現(xiàn)場(chǎng)踩了不止一次。注意屏幕供電別和主控共用帶強(qiáng)干擾的電源電機(jī)啟停時(shí)屏幕容易重啟串口也會(huì)跟著丟數(shù)據(jù)。4.2 最小跑通讓屏幕顯示一個(gè)每秒變化的數(shù)驅(qū)動(dòng)移植完成后最小可運(yùn)行工程非常短。前提是你在DGUS軟件里建好工程把某個(gè)數(shù)據(jù)變量顯示控件綁定到變量地址 0x1000并把工程下載到屏幕。然后主循環(huán)里這樣寫(xiě)#include dwin_drv.h int main(void) { dwin_port_init(115200); dwin_init(); uint16_t counter 0; while (1) { counter; dwin_write_uint16(0x1000, counter, 1); dwin_poll(); hal_delay_ms(1000); } }這段代碼干的活就是每秒把 counter 的值通過(guò)串口寫(xiě)到0x1000地址屏幕上的數(shù)據(jù)變量顯示控件讀到新值后刷新顯示。如果0x1000被當(dāng)成字節(jié)地址而不是字地址顯示就會(huì)錯(cuò)亂因?yàn)镈GUS的變量地址是字地址一個(gè)地址對(duì)應(yīng)兩個(gè)字節(jié)。跑通這一步證明通信鏈路沒(méi)問(wèn)題。接下來(lái)再試讀變量、寫(xiě)文本、處理按鍵上報(bào)就水到渠成。注意主循環(huán)里不能沒(méi)有 dwin_poll()否則接收方向的按鍵上報(bào)和讀變量返回永遠(yuǎn)不處理。4.3 先離線驗(yàn)證再上驅(qū)動(dòng)代碼每次拿到一塊新屏我建議先別直接燒驅(qū)動(dòng)先用USB轉(zhuǎn)TTL加串口助手在PC上把屏幕的協(xié)議摸清楚。操作步驟是USB轉(zhuǎn)TTL的TXD接屏幕RXDRXD接屏幕TXD共地串口助手選HEX發(fā)送波特率先設(shè)115200手動(dòng)發(fā)一條讀版本號(hào)指令觀察返回幀內(nèi)容。讀版本號(hào)指令一般是 0x80 或 0x81不同固件定義不同。完全可以在串口助手先輸入5A A5 04 80 00 00 00 01如果這條指令格式正確屏幕會(huì)回一幀包含固件版本的報(bào)文。這里的幀長(zhǎng)度和校驗(yàn)要和屏幕手冊(cè)逐字節(jié)核對(duì)核對(duì)通過(guò)后再把這套格式用到驅(qū)動(dòng)配置里。很多人跳過(guò)了這個(gè)驗(yàn)證步驟直接拿驅(qū)動(dòng)代碼燒進(jìn)去然后花兩小時(shí)懷疑是波特率還是電平問(wèn)題其實(shí)問(wèn)題只是長(zhǎng)度字段差了一個(gè)字節(jié)。4.4 運(yùn)行配置參數(shù)一覽配置項(xiàng)推薦值說(shuō)明波特率115200或屏幕實(shí)際設(shè)置屏幕上的OS參數(shù)也要一致DWIN_FRAME_MODE_NEW按屏固件選新版固件用1DWIN_RX_TIMEOUT_MS5空閑超時(shí)狀態(tài)機(jī)復(fù)位用FIFO大小128字節(jié)大于最長(zhǎng)返回幀校驗(yàn)方式求和或按手冊(cè)改不匹配時(shí)幀會(huì)被解析成噪聲還有一個(gè)常見(jiàn)的誤解是波特率越高越好。其實(shí)屏幕DGUS在處理某些長(zhǎng)數(shù)據(jù)時(shí)發(fā)送間隔比波特率更影響穩(wěn)定性。波特率拉到921600看上去很酷但批量寫(xiě)變量時(shí)丟幀概率明顯上升因?yàn)槠聊欢私馕鏊俣雀簧稀9た貓?chǎng)景我一般穩(wěn)定在115200幀間隔留夠比硬上高頻更可靠。5. 避坑指南串口屏調(diào)試中的高頻踩坑記錄5.1 屏幕上電白屏串口收發(fā)毫無(wú)反應(yīng)現(xiàn)象程序燒進(jìn)去屏幕白屏或停在開(kāi)機(jī)頁(yè)串口助手發(fā)任何指令都不回顯。原因最常見(jiàn)的是波特率不一致。屏幕內(nèi)部OS和DGUS配置里的波特率與主控串口初始化不一致有的固件默認(rèn)9600有的默認(rèn)115200還有一部分屏在上電時(shí)必須先收到正確的幀頭才開(kāi)放通信。解決先用串口助手從9600到921600逐個(gè)波特率發(fā)送讀版本指令看哪個(gè)波特率能收到返回幀。確認(rèn)后再改 dwin_config.h 里的波特率配置并把屏幕端配置一并改到一致。如果是新屏可以在DGUS軟件里檢查工程和OS的波特率設(shè)置。5.2 顯示正常但批量寫(xiě)變量時(shí)偶爾丟數(shù)現(xiàn)象單獨(dú)寫(xiě)一個(gè)變量沒(méi)問(wèn)題一次性寫(xiě)十幾個(gè)變量總有一兩個(gè)變量沒(méi)有被刷新。原因連續(xù)的幀間隔太短屏幕DGUS解析來(lái)不及處理。串口發(fā)送雖然是流式的但屏幕端需要時(shí)間把收到的幀解析、寫(xiě)變量、刷新顯示尤其圖庫(kù)較大的頁(yè)面處理耗時(shí)更長(zhǎng)。解決驅(qū)動(dòng)里在每幀發(fā)送之間加2到5ms延時(shí)并且把相鄰地址的寫(xiě)入合并成一次寫(xiě)多個(gè)字。迪文屏的變量地址是連續(xù)的0x1000到0x1007這8個(gè)地址可以一次幀寫(xiě)8個(gè)16位字網(wǎng)絡(luò)開(kāi)銷小很多也比分幀發(fā)送穩(wěn)定。我在驅(qū)動(dòng)里封裝了按地址段批量寫(xiě)的接口遇到需要整塊刷新的儀表盤(pán)數(shù)據(jù)時(shí)切到批量寫(xiě)。5.3 讀回來(lái)的變量值和屏上看到的不一致現(xiàn)象屏幕上顯示125驅(qū)動(dòng)讀回來(lái)的數(shù)值卻是32000或者錯(cuò)開(kāi)2個(gè)字節(jié)。原因DGUS變量地址是16位字地址讀一個(gè)變量返回一個(gè)字兩字節(jié)高字節(jié)在前。如果驅(qū)動(dòng)按字節(jié)去解析比如把返回的兩個(gè)字節(jié)當(dāng)成兩個(gè)8位數(shù)據(jù)就會(huì)錯(cuò)位。另一個(gè)常見(jiàn)原因是地址計(jì)算錯(cuò)誤0x1000到0x1002差兩個(gè)地址實(shí)際上是兩個(gè)字中間隔4個(gè)字節(jié)。解決讀變量時(shí)明確按字來(lái)申請(qǐng)數(shù)據(jù)解析統(tǒng)一用 uint16_t 數(shù)組高位在前。我在驅(qū)動(dòng)里讀變量回調(diào)用的是 uint16_t 指針不提供按字節(jié)解析的接口從源頭避免這個(gè)錯(cuò)誤。另外DGUS工程里變量地址通常從0x1000往上分配建議在項(xiàng)目文檔里建一張變量地址分配表不然過(guò)兩周就忘了0x1000是哪一路溫度。5.4 狀態(tài)機(jī)被干擾幀卡住回調(diào)忽然不再觸發(fā)現(xiàn)象系統(tǒng)運(yùn)行幾小時(shí)后按鍵回調(diào)徹底不響應(yīng)重新上電又好了。原因串口線或電源質(zhì)量差導(dǎo)致某個(gè)噪聲字節(jié)破壞了正在解析的半幀。狀態(tài)機(jī)沒(méi)有超時(shí)復(fù)位就一直卡在等數(shù)據(jù)的錯(cuò)誤狀態(tài)后續(xù)任何幀都跟不上。解決驅(qū)動(dòng)里增加接收超時(shí)復(fù)位就是前面 dwin_poll 里那段邏輯超過(guò)5ms沒(méi)有新字節(jié)強(qiáng)制回到等幀頭狀態(tài)。這個(gè)功能一定要在量產(chǎn)版本里保留否則現(xiàn)場(chǎng)電源波動(dòng)一次機(jī)器就得斷電重啟這是工業(yè)環(huán)境里最典型的玄學(xué)故障之一。5.5 用DMA接收數(shù)據(jù)錯(cuò)亂中斷逐字節(jié)模式卻正?,F(xiàn)象把串口接收改成DMA加空閑中斷后返回幀偶爾順序錯(cuò)亂甚至出現(xiàn)幀頭被誤判成數(shù)據(jù)。原因最常見(jiàn)的是調(diào)試時(shí)自發(fā)自收。USB轉(zhuǎn)TTL的TXD和RXD接反或者把主控的TX接到了調(diào)試串口上導(dǎo)致主控自己發(fā)送的字節(jié)被DMA收進(jìn)來(lái)。DMA方式和中斷方式的區(qū)別在于中斷模式會(huì)過(guò)濾掉一部分自發(fā)字節(jié)而DMA會(huì)把所有字節(jié)都收進(jìn)緩沖區(qū)問(wèn)題暴露得更明顯。解決先確認(rèn)物理接線三線共地DMA調(diào)試階段在接收路徑上加一個(gè)環(huán)回抑制發(fā)送期間關(guān)閉接收方向發(fā)送完成后恢復(fù)。如果屏幕和主控電平不匹配也會(huì)出現(xiàn)類似現(xiàn)象這時(shí)需要加電平轉(zhuǎn)換電路而不是調(diào)大波特率。6. 二次開(kāi)發(fā)從通用驅(qū)動(dòng)長(zhǎng)出自己的業(yè)務(wù)專屬驅(qū)動(dòng)6.1 擴(kuò)展指令映射表驅(qū)動(dòng)把指令號(hào)和業(yè)務(wù)語(yǔ)義解耦之后新增屏幕功能只需要擴(kuò)展一張指令映射表和一個(gè)分發(fā)分支。我習(xí)慣把屏幕所有可用指令集中定義在一張表里typedef struct { uint8_t cmd; const char *name; } dwin_cmd_map_t; static const dwin_cmd_map_t s_cmd_map[] { { 0x82, write_var }, { 0x83, read_var }, { 0x84, write_text }, { 0x90, jump_page }, { 0x00, NULL } };增加新功能時(shí)比如要支持屏幕固件里的曲線數(shù)據(jù)上傳只需要在表里加一條{ 0x91, upload_curve }然后在 dispatch 里加一個(gè)路由分支。好處是新人接手時(shí)掃一眼這張表就能知道驅(qū)動(dòng)支持哪些操作不用翻代碼。6.2 把驅(qū)動(dòng)搬進(jìn)RTOS線程如果項(xiàng)目里用FreeRTOSdwin_poll 可以放進(jìn)一個(gè)獨(dú)立線程接收中斷仍然只負(fù)責(zé)字節(jié)進(jìn)FIFOvoid dwin_task(void *arg) { for (;;) { dwin_poll(); osDelay(1); } }發(fā)送路徑需要保護(hù)。驅(qū)動(dòng)內(nèi)部組裝幀用的是靜態(tài)緩沖跨線程調(diào)用時(shí)兩個(gè)線程可能同時(shí)往緩沖區(qū)里寫(xiě)導(dǎo)致幀頭和數(shù)據(jù)錯(cuò)開(kāi)。我的做法是對(duì) dwin_send 加一個(gè)互斥鎖把“組裝加發(fā)送”作為一個(gè)臨界區(qū)。接收側(cè)不受影響因?yàn)镕IFO是單生產(chǎn)者單消費(fèi)者模型中斷是唯一生產(chǎn)者dwin_poll 是唯一消費(fèi)者。6.3 驗(yàn)證方法先回環(huán)后聯(lián)調(diào)二次開(kāi)發(fā)每次改完協(xié)議層我都先做回環(huán)測(cè)試不接屏幕把主控的TXD直接接到自己的RXD自發(fā)自收一幀驗(yàn)證組裝和解析能對(duì)上。這一步能分辨問(wèn)題是出在驅(qū)動(dòng)還是屏幕上?;丨h(huán)通過(guò)后再接屏幕跑一遍變量讀寫(xiě)和全部回調(diào)。從那以后我每換一個(gè)屏型號(hào)第一件事永遠(yuǎn)是串口助手手動(dòng)發(fā)讀版本指令確認(rèn)幀格式再動(dòng)驅(qū)動(dòng)代碼這套流程幫我省掉的調(diào)試時(shí)間遠(yuǎn)比想象中多。希望這些拆分和調(diào)試習(xí)慣能幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 男人天堂欧美| 九一综合网| 欧美,日韩,亚洲视频| 一本色道久久综合精品婷婷| 麻豆国产成人精品| 97天天搞在线| 丁香婷婷色五月| 亚洲AV秘 精品久久老牛影视| 人人妻人人色| 久久久久久午夜男人的天堂| 99这里有精品视频| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 男男H黄动漫啪啪无遮挡网站| 大香蕉一人| 热久久99999| 情侣开房子拍 日韩无码 女的很漂亮| 日韩福利综合一区| 免费一级a毛片久久久久久鸭绿欲 国产精品亚洲天堂网址 | 午夜福利合集| 超碰色97| 精品久久久久久久| 九久9精品| 日韩人人精品| 91超碰人人| 日韩中文字幕视频在线观看| 亚洲高清综合网| 熟妇无码视频三区| 国产suv精品一区二六| 久久综合女优| 欧美久久九九| 蜜臀久久一区二区| 久久精品视频在线观看| 97激情97激情| 欧美黑人与女人91~| 一区,二区,三区网站| 欧美极品女人的天堂| 亚洲性爱高潮影院| 乱伦图av| 久久久久成人亚洲国产| 91国产丝袜美女| 91大神精品长腿在线观看网站| 九九热超碰| 国产熟女精品一区二区| 99热99re6国产在线播放| 日本网色| 亚洲无线码欧洲精品区别| 91丝袜美腿片| 色欧美天天| 亚洲天堂精品日韩电影| 少妇人妻无码| 天综合网| 曰韩成人免费视频| www.亚洲成人一区| 国产农村妇女毛片精品久久| 午夜呻吟欧美| 中文字幕日韩电影人妻 | 亚洲一欧洲中文字幕在线| 91欧美www| 日韩pv中文| 手机在线视频国内精品| 嗯嗯啊啊啊好爽| 丁香婷婷激情五月天无毒不卡| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 自拍啪啪视频| 国产极品久久久| 99re免费视频精品全部| 91岛国动作片| av网站免费看| 亚洲精品尤物yw在线影院| 精品欧美А∨无码黑人大荫蒂| 精品v日韩欧美国产| 国产51色综合久久免费| 五月丁香综合网| 熟妇人妻一区二区三区| 丝袜狠狠草尤物 91| 98超碰日本| 亚洲无码一区成人免费午夜| 亚洲婷婷丁香在线| 老熟妇乱轮| 97人人操人人摸| 国产亚洲综合欧美一区| 欧美亚洲尤物久久| 激情丁香五月| 丰满人妻一区| 国产成人在线观看网址| 日韩三级天堂在线观看| 日韩二三区| 国产热av| 日韩性爱啪啪视频| 曰韩少妇无码| 婷婷涩嫩草鲁丝久久午夜精品| 96国产精品| 17c嫩草51久久91嫩草| 国产精品无码av嫩草| 久草视频分类在线| 伊人久久大香线综合无码| 91激情国产| 国产精品白丝在线播放 | 国产亚洲精品无码三区| 五月丁香六月| 俺也射| 97在线青| 国产91啪| 久久超碰大香蕉| 97国产精品在线观看| 一个色导综合| 久久99国产综合精品女同| 婷婷人妻激情| 欧美日韩午夜精品一区二区三区| 欧美岛国精品在线观看| 俺去俺来也在线www| 欧美欲色| 欧美激情专区| 欧美日韩丝袜| 欧美性色网| 五月丁香激情综合网| 国产精品一区二区后入| 亚洲 小说 欧美 激情 另类| 日本在线一二 | 日夜久久久九九九久| 一区二区无码视频| 婷婷色导航| 久久人妻一区二区三区高清| 国产精品不卡高清在线观看| 人人干人人操人人..com| 精品色色| 97chaopengongkai| 欧洲天天在线| 天欧美在线| 色色色欧美| 丝袜无码a片| 91亚.色| 亚洲αv一区二区三区| 狠狠亚洲| 毛片久久| 日韩欧美丝袜诱惑| 一牛影视成人片免费| 成人天天看站长推荐| 久久大黄片| 国产AV无码AV| 91丰满| 97国产高清视频在线观看| 国产亚洲精品美女| 亚洲av成人精品一区| 偷拍欧美激情| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 秋霞久久亚洲精品成人| 有码人妻系列| 美国精品国产精品| 五毛骚逼极品美女怕怕| 国产日韩精品人妻久久久久色欲网站| 超碰人人妻| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 欧美日韩色图片| 男人天堂网址| 国产小炒后入式| 欧美日韩国产成人高清| 国内一区二区三区| 一区二区日韩欧美久久| 国内外毛片在线观看| 五月天我淫我色av| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 黑人性暴力毛片| 99精品在线| 欧美在线啊啊| 综合97久久| 日本岛国黄色网址| 在线视频资源| 欧美色图私拍91| 欧美视频一区二区在线| 天天色怡春院| 激情文学网伊人| 欧美色图20P| 日韩伦理视频| 亚洲囯产精品女人久久久| 果冻传媒一区二区三区| 精品国产嫩穴视频| 亚洲欧洲国产综合av| 亚洲天在线| 99re8超碰| 天天干天天中出av| 人人天天欧洲| 国产操操日韩三级黄| 亚洲综合首页| 色色九区| 大干人妻| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 操逼操逼逼操操逼91| 日韩少妇无码| 少妇熟女视频一二三区| 第二页中文字幕| 在线v中文字幕一区二区三区| 夜色97| 欧美综合自拍成人自拍第二十页| A一区片| 哈哈操 大香蕉| 情色五月天久久久| 欧美日韩国产传媒在线精品| 睡产熟女乱伦| 日韩激情中文字幕有码| 国产乱伦性爱区| 91精品国产91久久青草| 免看60秒涩涩视频| 熟女高潮合集-永久久久-成人AV | 97中文字幕一区| 国产熟妇一区二区| 久久久熟妇熟女国产| 久久日韩毛| 亚洲天堂,男人| 91超级碰| 成人资源中文字幕在线观看天天| 吊色| 久久综合精品一区二区三区| 天天看,天天做| 国产精品呦一区二区三区| 中文字幕日韩专区精品系列| 乱伦熟妇一区二区| 亚洲97成人在线观看| 竹菊一区二区三区AV线| 青青草在线视频美女| 好湿好紧好爽 视频| 肏逼福利网站| 日韩欧美午夜一区二区| 香港澳门日本三级网站| 精品人妻免费观看| 国产无码久久高清| 中文字幕一区二区三区字幕| 国产AV色黄看到爽| 国产99久久99热这里只有精品15| 黄页av| 91伊人| 91黄站| 男人的天堂免费| 久久久久久久久久9| 岛国视频一二三区| 欧美日韩亚洲天堂| 亚洲一区二区在线观看91| 91白嫩| 欧美加勒比| 亚州熟女乱伦| 欧美一区二区三区日韩| 国产极品粉嫩馒头一线天av| 四虎在线免费视频| 日本人妻天堂网站在线播放| 日韩无码第3页| 干超碰碰熟女| 日韩综合成人免费视频| 97亚洲欧美日韩| 国产精品天干天干综合网麻豆| 五月婷婷基地| 色婷婷基地| 91丨国产丨白浆| 日日黄色三级网站| 91综合天天看| 97人人色| 99国产精品| 日本性爱欧美性爱| 色色色综合网| 青娱乐手机日韩在线视频| 97在线观看视频| 日日爱99| 怡红院一区二区熟女人妻| 久久东京热久久| 久久九九精品一区二区 | 色婷婷丁香五月| 影音综合网| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 91美女在线观看| 北约熟女超碰| 欧美九9 9 9| 干B| 亚洲资源网| 亚洲有码视频二区| 俺去俺来也在线www| 最新日韩黄片| baiduhicn.com。| 日韩无码第3页| 超碰碰97资源站| 韩日性爱av| 粉嫩国产精品久久粉嫩| 91国产丝袜白虎| 日韩人妻一二三区视频| 久视频在线观看| 骚货 中文字幕 av| 欧美日韩大黄片| 亚洲老熟妇xxx| 女人香蕉久久毛毛片精品| 国产亚洲性生活视频播放| www.激情| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 欧美熟妇人体| 东北女人操逼| 亚洲丝袜色| 欧美色九九| 无码聚合| 日日狠狠久久偷偷色综合免费| 中文字暮97| 综合色久欲| 一本一道vs波多野结衣| 熟女网站最新| 人妻天堂网| 国产一区二区三区白丝| 成人老鸭窝人人在线视频| 丰满人妻一区二区三区免费 | 午夜性| yiqicaoav| 美国黄片aaa| 欧美久久久15P| 久久精品一区二区一8| 久久久久久亚洲精品不卡人乳| 欧美 亚洲 大香| 思思久热在线精品66| 野狼激情网| 青青国产在线拍揄自揄拍| 午夜人人操| www亚洲欧美| 久久人妻精品| 99精品国产户外露出| 97色在线观看| 欧美的性爱网站免费| 婷婷在线视频| 91久久久亚洲| 婷婷国产精品九区| 亚洲美女AV无码| 自拍欧美| 一区三区啪啪| 亚州性色| 五十路熟女工口| 蜜臀99999| 香蕉人人操tv| 在线一区| 97天天爽| 99热99在线播放激情| 伊人久久亚洲色欲综合网站 | 日日操天天操| 9国产超碰| 91少妇香蕉久久精品| 夫妻日逼| 性色国产东北露脸精品视频| 久久久97| 国产午夜在线观看视频| 97超碰这里只有精品| 日本一区二区中文字幕久久| 极品久久久久久久久久久久久久| 国产多人在线观看视频| 后入日本1234| 亚洲影院小综合| 粉嫩av在线一区二区| 四虎精品一区二区| 国内精品久9| 性色avv| 中文字幕后石码四区五区| 久草婷婷| 毛片视频白嫩| 久久久久国产无av| 啪啪AV导航| 97这里有精品| 久久宗合97| 精品人妻1237| 色婷婷五月天| 插欧洲美女欧美精品| 久久久无码视频| 丝袜综合| 视频二区美腿丝袜制服人妻欧美| w w w.久久精品| 操我啊啊啊啊啊| 操逼逼无码| 蜜臀亚洲综合一二三四区| www.久久爱| 国产精品一级毛片不卡视| 97干在线视频| 老司机福利社视频在线观看| 伊人精品视频| 国产一区二区三区,在线观看观看| 日韩人妻一二三区视频| 中文字幕av一区二区三区人妻少妇 | 亚州一区二区| 上特色A在线| 欧美精品系列| 亚洲色天堂九9| 超碰97最新人妻| 澳门成人网站久国产日韩| 日韩黄色成人性爱| 国产色呦呦| 无码高清少妇久久| 日韩欧美福利视频看看| 91色拍| 久草免费在线视频| 好爽视频在线观看| 精品一区二区三区麻豆| JuliaAnn丝袜熟女系列| 欧美激情高清性猛交| 亚洲 欧美 另类 日韩 人妻一区| 人人摸人人干人人拍97| 97任你吞精| 国产午夜精品理论片a大结局| 亚洲视频一二区| 韩国轻伦国内自拍一区| 91人妻尻屄视频| 老司机深夜影院18未满| 日本肏逼视频在线观看| 蜜桃无码AV一区二区| 91强热人妻| 亚州AV无码国产精品| 色哟哟511老熟女| 久久鲁干| 亚洲阿v天堂在线| 久久97| 欧美骚少妇| 四虎884| 免看60秒涩涩视频| 精品午夜福利| 天天欧美| 91n免费处女| 老熟女天天操| 亚洲中文字幕熟女少妇一区二区| 校园春色家庭伦理欧美激情| 国产丁香精品露脸视频| 欧美人人天天网| 我想要啊 啊 啊| 五十路三区在线| 黄色片A级一区二区三区| 97美日韩视频| 99亚洲精品| 户外裸露刺激视频第一区| 丰满岳乱妇一区二区三区| 精品性爱一二三区| 国产精品乱人伊人网| 久久天天躁日日躁狠狠躁| 日韩人妻大香蕉| 亚洲综合影视| 婷婷性网| 美女天天干| 黄色工厂这里只有精品| 私人尤物在线精品不卡| 婷婷丁香五月综合| 国产高清不卡视频| 久久视网78| 久久久久久99999国产精品| 9丨久久九九九| 成人精品久久| 91精品微拍福利| 日本国产亚洲一区在线观看| 欧美在线永久天堂| 九九热在线视频| 中文字幕十五区| 干B网| 99久久精品无码一区二区毛片免费 | 中日韩欧美精品无码AⅤ一区二区| 亚洲伊人a线观看视频| 你懂得91| 色网综合网| 91狠狠综| av天堂手机版追回| 国产精品久久久久久久久久久久久久久久久久 | 色欲日韩欧美在线一区| 九九热免费国产视频婷婷伊人五月 | 97频视在线| 91狠狠综| 91蜜臀熟女| 宅男91视频在线播放| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 91日韩网站| 日本免费一级AAA大片器| 91成人无码| 69av一区二区三区| 欧美色偷拍 | 一区 欧美 日韩 麻豆| 亚洲少妇视频| 欧美成人性爱视频大全| 天天爱综合网| 午夜偷拍久久熟女| 无码操逼天堂| 无码高清专| 风月影院男女十八禁| 国产精品无码成人精品| 一区中文字幕二区日韩| 欧美性生活男人的天堂| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 激情欧美日韩女同久久| 翔田千里爆乳巨臀无码| 久九九九九九九热| 国产三级资源在线观看| 欧美日韩亚洲天堂网| 欧美人与动性人交a| 综合一区中亚洲国产成人综合精品 | 一区二区三区免费岛国片| 亚洲永久AV无码精品秋霞| 日B操| 天天干美少妇一区| 91艹| 日韩噜噜69| 欧美经典一区二区三区| 精品二区三四区五电影| www久久99| 97鸡把在线视频| 大香蕉人妻| 中文乱码字幕观看视频| 国产夜夜操| 国产精品久久久久久久电影渣男| 永久免费发布性爱网| 五月丁香| 中文字幕视频二区| 首页亚洲国产高跟丝袜诱惑视频| 欲色啪| 九九色逼| 密臀在线视频| 欧美色图亚州激情| 色呦呦呦在线观看视频| 歐美性天天| 亚洲国产婷婷在线播放| 丰满搜索结果 -第18页- 久久高清无码| 91女优在线观看| 另类专区在线观看| 日本操逼无码| 久久大香蕉手机高清视频| se吧提供国产乱老熟视频胖女人| 熟女一区二区| 国产高清成人传媒影视| 777超碰| 9久精品视频在线观看| 天天看,天天做| 亚州性色| 蜜臀无码一区二区| 精品免费一区二区三区在线亚洲人成| 9Ⅰ老熟女| 操死我了嗯嗯嗯| 亚洲国产成人福利在线观看| 日韩大香蕉AV影片| 国产精品久久久久久久久久久久久久久| 日本韩高清无砖码22o| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 日日插夜夜| 天天综合站| 偷拍亚洲高清图片| 色九九九九久| 日本一区二区三区四区免费观看| 亚洲清纯唯美| 激情五月天视频| 国产探花日韩援交| 综合97| 自拍啪啪视频| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 亚洲 自拍偷拍 欧美| 久草新在线| 劲爆欧美人妖三区91| 欧美另类色| www.色综合| 日韩精品人妻一| 国产农村妇女毛片精品久久| 婷婷亚洲天堂| 欧美系列在线一区二区| 噜噜噜亚洲精| 日韩综合97P| 欧美综合第一| 无码免费精品高清| 亚洲精品官网在线观看| 日本丝袜人妻内射| 不卡在线观看视频| 久久久久久91香蕉国产| 日产国产精品中文久久婷婷| 91 刺激在线| 熟女视频久久| 在线啊v一区| 约操熟妇| 囯产操逼片| 久久岛国| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 色汉综合| 欧美精品三区| 翔田千里爆乳巨臀无码| 国产精品又黄又猛又粗| 国产成人在线观看网址| 熟女91网| 欧美综合综合| 婷婷五月天激情四射| 东京热大香蕉| 国产内射爽爽大片| 98人妻精品一区二区色欲| V A在线| 人人干黄色| 日本成人在线不卡一区二区三区| 亚洲吊色| 综合网,亚洲,欧美| 国产有码一区| 久久久∴| 骚妻少妇精品性色无码四色A V| 亚洲天堂另类小说男人| 欧美aⅴ99久久黑人专区| 啊啊啊啊啊啊啊国| 夜夜人妻爽| 97超色| 国产丝袜啪啪| 欧美色图电影| 93人人操人人| 99热最新网址| 天天看天天综合成人网| 亚洲欧美另类少妇精品| 婷婷香蕉欧美在线一区二区三区 | 欧美暴力猛交| 国产三级中文字幕粉嫩 | 欧美人妻精品一区二区| 欧美99热| 日韩乱码Av| 欧美 青青草| 91网站在线播放| 国产400孕妇孕交群| 欧美色图片| 亚洲成人福利电影免费| 亚洲精品视频二区| 欧洲精品久久| 色综合加勒比| 污污汅18禁网站在线永久免费观看| 亚洲一卡二卡在线免费| 黄色片,com| 五月丁香婷婷综合| 亚洲少妇激情视频| 超碰人妻97| 人人摸人人添人人操| www.久久最新地址| 激情五月天色播| 亚洲限制级| 午夜福利在线合集| 997色在线| 高清有码一区二区| 99亚洲天堂| 金典av| 九九九国产精品| 伊人一级免费黄片| 99热久| 偷拍片久久| 亚洲一区操| 欧美熟女少妇| 无码精品久久久天天影视| 色婷婷久久| 中文字幕黑人大片| 九久久精品| 日本熟女免费視颖| 欧美在线色| 国产精品视频内谢女人| 四虎在线免费视频| 丁香五月婷婷色| A 天堂| 久久久久久久久久久久九| 热热色综合网| 有码免费观看| 国产精品内射婷婷一级二| 啊啊啊啊视频免费| 国产精品探花视频| 五月婷丁香| 手机在线A片| 亚洲小说视频| 亚洲黑丝在线| 免费看日产一区二区三区| 欧美精品97| 日本新免费二区三区| 亚州熟女乱伦| 蜜臀久久久99久久久久 | 国产精品夜夜夜| 丝袜夫妻自拍| 五月天色综合| 懂色AV中文| 亚欧Av| 伊人网青青| 69精品| 日韩图色| 精品国产乱码久久久久久免费| 国产 无码 一区二区| 久96热在线观看视频| 精品人妻一区二区三区四区不卡在| 五月天婷精品激情| 欧美日韩国产成人高清| 91麻豆天美| 国产精品无码成人精品| 亚洲巨爆乳一区二区三区四季网| 久久精品视| 天天综合欧美黑人| 美女爽到高潮91| 性感美女啊啊啊在线| 久久女人视频| 91久久国产综合精品| 丁香五月天激情网站| 小视频玖玖| 全免费a敌肛交毛片免费| 久久精品国产亚洲AV无码电影| 欧美偷偷网| 啊啊啊好大好深| 精品免费一区| 亚洲黄色a级片| 亚洲精品精品一区二区| 久久发布国产伦子伦精品| 日日夜夜草草草| 色97国产69香蕉| 麻豆AV一区二区| 另类专区加勒比| 蜜桃狠狠色伊人亚洲综合网站| 夜夜人妻爽| 亚洲高清在线se| 久久国产在线一区二区| 无码精品蜜桃一区二区三区ww| 91美女视频。| AA级电影三区| 9色在线| 日本精品免费一区二区三区四区| 久久婷婷色| 婷婷五月天网| 久久久禁| 日日夜夜骑| 操逼视频亚洲| 国产又粗又长又爽又色| 上床不卡网站| www男人天堂| 国产一区二区三区导航| 久久久久久91香蕉国产| 亚洲欧美日产国产91毛片| 欧美在线电影| 巨爆乳肉感一区二区三区竹菊影视| 日韩人妻无码专区| 一区二区三区 丝袜高跟| 成人性爱电影一区二区| 久久双插| 狠狠穞A片一區二區三區| 97视频900| 芊芊操逼视频无码| 欧美在线55555| 午夜.DJ高清在线观看免费7| 午夜天天碰综合视频| 97久久精品| 国产不卡片| 岛国A V在线免费看| 牛牛久久国产精品视频一二三| 大香蕉男人的天堂| 丁香六月激情| 久久夜精品一区二区三区| 中日韩欧美精品无码AⅤ一区二区| 色色五月婷| 亚洲天堂资源网| 久久男人网| 久久久久国产精品片区无码直播| 黄色AV影视| 九九热av| 蜜臀一二三区| 人妻熟女午夜精品在线| 亚洲中文电影| 精品超碰中文在线| 99999亚洲| 加勒比日本在线| 操人91| 中文字幕高清精品一区| 久久一二三四五六七八九区| 欧美国产精品久久九九| 极品美女福利在线观看| 中文字幕丰满人妻日本| 精品一区二区三区18| 小草av不卡亚洲二区| 玖玖97综合| 亚洲成?V人片在线观看福利| 国产在线观看91精品一区| 欧美综合 站| 欧美性爱五月天| a v网站在线播放| 午夜视频好爽啊| 97aiaiai| 爱爱啊啊啊| 96精品久久| 爱射综合| 色色五月天婷婷| 色情五月综合婷婷| 国精精品无码一二三区水多多| 941超碰| 久久人妻精品| 91n美女视频| 免费看毛片操穴| 99啪| 三级网站超变态精品| 偷窥自拍亚洲色图| 人妻在线中出视频| 亚洲啪啪视频一区二区| 黑丝少妇| 黄色二级片网站| 91超碰碰在线| 青久久| 91色人| 亚洲中文字幕熟女少妇一区二区| 欧美专区在线| 精品一国2| 久久久久熟女| 日韩三级伊人| 操逼视频亚洲| 成人性爱av| 久草精品在线| 亚洲欧洲自拍图片专区满春格| 日韩欧美麻豆 | 久久精彩视频| 欧美亚洲20p| 97色色色综合网站| 大香蕉人妻| 欧美一级专区免费大片| 久久少妇| 欧美日韩性爱操大逼| 艳美熟妇先锋一二三区| 亚洲精品a人片在线观看视| 好吊妞转入那个网| 国产精品第二页| 人妻插插人妻人| 精品人妻高清麻豆av| 欧美性生活免费网| 日韩无码嘿咻黑热久| 超碰到97情色| 看黄片视频免费| 国产精品午夜福利亚洲综合网| 精品久| 熟女熟妇一区二区三区视频| 狠狠色五月亚洲91| 性爱乱伦网址| 五十路人妻在线| 欧美高清在线| 亚欧成人中文字幕一区| 激情四射五月天| 高清无码一区二区三区| 97人亚洲综合字幕| 欧美大香蕉久| 亚洲精品无码成人久久久99| 又黄又爽在线观看视频 | 精品人妻一区二区乱码一区二区| 91亚州日韩高清| 操逼日韩无码| 91欧美网| 91精品网站| 欧美亚洲综合色| 少妇厨房愉情理伦片bd在线观看| 玖玖玖玖精品国产剧情| 午夜福利成人免费视频| 秋霞午夜视频一区二区| 翔田千里无码中出中文字幕| 天天干天天中出av| 亚洲精品无码成人久久久99| 国产精品天干天干综合网麻豆| 97精品视频在线| 欧美一级A片不卡视频。| 精品免费一区二区三区在线亚洲人成| www被窝色com| AV天天在线观看| 婷婷色色五月天福利| 婷婷久久综合| 亚洲制服aⅴ中文字幕| 国产99999久久精品| 五月天丁香| 91国产操逼视频| 久久久爆乳翘臀一线天伦理视频| 日本免费一区二区不卡| 天天香香欲综合| av中文在线| 中文字幕精品免费一区二区| 91在线一起| 久久久久ab| 色天使亚洲综合在线观看| 欧美亚洲清纯| 亚洲丝袜B诱惑| 欧亚洲精品有视频| 国产无码一二三区| 欧美日韩黄片精品在线| 九九毛片这里只有精品| 午夜亚洲国产理论秋霞| 999精品久久久久久久| 久久精品中文字幕女同| 国产精品午夜成人福利| 一级日本牲交大片好爽在线看| 日韩在线观看字幕精品| 国产三级多多影院2022国产AA一级毛片无码 | 色偷偷色偷偷欧美日韩| 亚洲欧美国产成人综合不卡| Aa东京男人的天堂| 天堂综合| 久久久久久久久久精| 啊啊啊啊啊啊啊啊啊啊在线观看| 熟妇的味道HD中文字幕| 国产精品视频91久久| 国产精品视频91久久| 夜夜草天天| 色哟哟av| 粉嫩AV一区夜夜嗨| 亚洲男人天堂视频 | 欧美极品| 青草精品视频-日本久久久久网站| 久久嫩草国产成人一区| 另类在线| 亚州成人a∨| 91熟女熟妇视频网站| 青青草日逼视频| 97视频www| 色图综合| 熟女色综合久久| 欧美日韩性爱无码| 大胆91| 夜夜国自区| 黄色免费网| 超碰在线99| 久久久草草精品| 97超碰久久| 美女自卫慰黄网站免费| 久久精品国产精品亚洲艾通辽熟妇 | 国产精品一区人妻精品阁在线| 97五月天| 久久久一区二区三区四区五区| 久久有码视频| 亚洲免费成人精品电影| 大香蕉手机在线视频| 天天天堂影视日韩亚洲91| 夜夜爽妓女| 啪啪视频mP4| 欧美色干| 屌逼传媒| av影片在线观看不卡| 永久免费观看的毛片的网站| 天天夜躁日日躁狠狠2002| 中文字幕第页| 9丨久久九九九| 青草视频在线看看看看看看看看看| 九九热九九| 精品少妇一区二区| 国产高清在线观看欧美| 青草视频人妻在线观看| 欧美在线播放| 精品人妻一区二区三区-国产| 日han少妇无码| 97在线观| 在线观看综合精品亚洲| 一区二区三区四区在线不卡| 国产区91柔拿会所技师| 久久色一区| 亚洲黄色视频在线观看视频| 国产欧美日韩臀| 欧美成人免费在线观看| 超碰1024久久| 国产精品白领在线观看| 日韩乱伦影音先锋| 深爱伊人影院| 日韩精品9999| 中文操逼字幕| 美女黄色一级A视频| 99久久亚洲精品无码毛片潘甜甜 | 婷婷丁香六月天| 欧美激情性爱视频网站| 亚洲中文制服诱惑| 免费簧片在线观看| 青青草手机在线免费观看| 小日子操bb在线看| 欧美色图校园春色| 天天摸夜夜操视频| 九九在线精品| 26uuu性| 亚洲情色一区二区三区| 大香樵伊人网| 黄色高清无码无码破解免费暗网| 色网综合网| 99999精品成人| 99青草| 精品久久久久9999| 人人操av| 96久久科窝| 人妻少妇精品一区二区三区| 桃色五月天| 中文字幕亚韩| 国产视频一区二区免费| 日韩人妻一区二区精品| 欧美亚洲色图另类国产| 澳门黄片一香蕉视频| 91 欧美| 日韩欧美性爱电影在线观看| 91综合熟女| 无码人妻精品一区二区三区99不卡| 日日A∨| 蜜屁Av| 五月天激情综合网| 欧洲免费一区二| 熟妇女人妻呻吟久久AV| 97视频网站在线观看| 超碰在线人妻不卡| 75大香蕉| 熟妇视频一区二区三区在线观看| 在线中文字幕| 日本Xx性爱| 99热在线播放| 超碰色中文| 欧美日韩亚洲少妇寂寞影院正在播放 | 国模少妇一区二区三区| 久久精品黄色| 福利在线观看一区二区| 久久性视频| 日韩影片中文字幕一区二区三区| www色色com| 色一射色一射| 噜噜噜亚洲精| 伊人操你| 97超碰色五月| 成人性交午夜免费片| 国产精品久久久久久久AV大片| 97国产精品一区| 欧美一区二区三区日韩| 欧美在线伊人色| 亚洲中文字幕一区| 国产欧美在线观看免费观看| 9久久精品| 综合激情五月天| 制服诱惑亚洲一区二区三区在线观看| 日韩中文字幕宗合在线| 国产精品人妻免费精品| 伊人久久综合影院精品久久久| 被操高清无码视频| 综精品久久久aaaa| 久久久91| 日本性爰一道本| 国产精品久久久久久久AV大片| 97在线视频观看网站| 天天影视色香色欲| 老司机午夜精品福利视频一区二区 | 91老熟妇| 日韩亚洲美州欧洲综三区一品在线| 99精品在线播放| 东京热,男人的天堂| 亚洲日韩精品在线播放| 精品无码一区二区| 亚洲日韩天堂| 青青草日本无码| 无遮挡一级毛片视频免费的| 国产精品久久久久久片| 国内精品99999| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 日日不卡av| 中文字幕 国产 精品| 91操熟女视频| 亚洲欧洲小说图片视频| 18禁在线视频| 欧美丝袜美女电影一二三四区| 91亚洲综合| 亚州色图片在线色| 啊啊啊啊一区| 日本操大逼| 久久黄色网址| 淫荡少妇免费| 国产99999| 欧美亚洲图片| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 国产60区。| 久久九九99| 新久久AV| 欧洲黄色网| 熟妇人妻精品一区二区| 国产精品懂色tv影视免费观看| 九九九九九九九精品视频| 在线亚洲 欧美 日本专区| 操熟女91| 日韩人人精品| 九九成人视频| 成人免费在线网站| 超清福利精品视频在线| 国产自制av蜜乳| 97干在线视频| 天天影视91看看| 玖玖大干人妻| 日本中文字幕熟妇| 丝袜天堂| 东京成人一区| 欧美日韩电影一区二区| 日韩乱码Av| 亚洲精品国产熟女| 一类无码操逼视频| 国产无码精品高清| 无码精品人妻一区二区三区妖精| 蜜臀无码一区二区| 中国一级操逼视频| 国产精品毛片?v一区二区三区| 中文字幕精品久久久久人妻红杏ⅰ| 操逼操网| 99re久久| 青青青操| 日韩精品怡红院| 日韩欧美字幕亚洲一区二区| 久久黄色性爱视频| 色九久| 欧美日韩国产色五月综合在线| 99热伊人| 欧美狠狠弄| 亚洲文学偷乱拍啪啪啪啪| 99re视频在线播放青草| 女人久久久| 性爱免费视频成人| 色色国产| 极品粉嫩一区二区| 久9视频| 综合久欧洲| 人人操人人操人妻人| 欧美呦呦性爱| 99视频只有精品| 97人人模人人爽人人| 欧美色九九九| 欧美加勒比| 久久受www免费人成| 中文字幕国产精品1区| 成人在线视频一区| 一起草三级AV电影在线观看| 欧美性爱十八禁| 国产精品久久久久久久久久久久久久久久久久 | 日韩欧美aⅴ综合网站发布| www.婷婷六月天| 91 国产丝袜在线播放-百度| 高清无码一区二区三区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 天天天天天天天天综合| www.高清无码诱惑一区.com | 人妻爽爽啪视频| 五月婷婷激情网| 91丝袜人妻| 99精品在线播放| 安微少妇操BBB| 国产精品探花视频| 免费97视频| 91熟女少妇| 欧亚性爱啪啪| 九九九九一区| 中文字幕欧美丝袜07资源| 精品国产无码中文| 26uuu欧美日韩| 日韩成人人妻网站| 牛黄色久午久| 久久超碰97| 亚州国产精品乱| 一区二区三区黄色片a| 欧美精品欧美精品系列| 国产高清无码一区二区三区四区皇冠| 亚洲精品丝袜-不卡成人免费……| 狼天天狼天天大香蕉| 99re视频在线播放青草| 在线观看AV不卡| 大香蕉一线视频| 五十路三区在线| 97精品久久久久中文字幕| 综合一区中亚洲国产成人综合精品| 亚洲色图美腿丝袜| 欧美精品99久久久| 舔舔啊| 色黄色美女大长腿午夜视频| 999日韩中文精品观看视频。| av橘色网站| 欧美亚洲国产自久久| 综合激情五月丁香| 精品毛片av一区二区| 欧美亚洲手机在线| 久久精品女同亚洲女同13| 伦伦成年午夜免费视频| 人妻精品视频一区二区三区 | 亚洲男人天堂网久久| 成人片在线播放| 99999国产精品| 97欧美色综合| 色臀aV| 日韩中文字幕宗合在线| 国产夫妻一区二区|