色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【GD32F303紅楓派開發板使用手冊】第二十講 SPI-SPI NAND FLASH讀寫實驗

聚沃科技 ? 2024-06-20 09:50 ? 次閱讀
wKgaomZVdiiAfR9BAB3mDFhHnZc972.png

20.1實驗內容

通過本實驗主要學習以下內容:

  • SPI通信協議,參考19.2.1東方紅開發板使用手冊
  • GD32F303 SPI操作方式,參考19.2.2東方紅開發板使用手冊
  • NAND FLASH基本原理
  • SPI NAND介紹
  • 使用GD32F303 SPI接口實現對GD5F1GQ5UEYIGY的讀寫操作

20.2實驗原理

20.2.1NAND FLASH基本原理

NAND Flash和NOR Flash都是兩種非易失性存儲器,其讀寫速度、讀寫方式,存儲區結構、成本、容量、擦寫壽命都有很大區別。NAND在壽命、速度、讀寫方式上都不如NOR,但在成本和容量上有很大區別,故而決定了大容量數據存儲是NAND的主要應用領域,而快速啟動、快速數據讀取等場景是NOR的主要應用領域。而SPI是目前NAND和NOR的主要通信接口形式,降低了器件體積,標準化了器件接口。

  • NAND Flash結構示例
wKgaomZzie-ASHMCAACpYmz1joQ526.png

如上圖所示,以GD5F1GQ5UEYIGY為例,一個1Gb的存儲結構下是由1024個block組成,每個block又64page組成,每個page是2K Main Area+Spare Area(ECC ON:64B;ECC OFF:128B)組成。

NAND的擦除單位是blocks,寫入單位是page,所以尋址的方式上和nor是有本質區別的,需要按blocks、page、page字節偏移地址進行一個數據的尋址。

20.2.2SPI NAND介紹

SPI NAND簡化了NAND的接口設計和尺寸,SPI接口更是降低了主控對接口的要求,同時內置ECC。下圖是GD5F1GQ5UEYIGY的命令表,常用的命令為擦除、編程、讀取命令。

wKgZomZzifqAdlMUAAKpHZv_HdQ326.png
  • block擦除命令
wKgZomZzigeAKIIUAAES6EvOPGw289.png
  • 編程
  • 編程流程
  1. 先用數據緩存寫入指令將數據寫入緩沖區
  2. 然后發送寫使能命令,并確認寫使能成功
  3. 然后發送數據載入命令執行緩沖區數據到FLASH的寫
  4. 最后查詢讀寄存器確認P_FAIL是否有錯,OIP是否完成

注意(84h/C4h/34h) 和(FFh)指令是不會清除緩存中的內容的,所以下次編程時要注意是否緩存區都是需要更新的數據,所以必須是一次更新整個緩沖區,不要部分更新。

編程page地址按照塊的順序

  • 數據緩存寫入命令
wKgZomZzihqAQqKoAADV6NvTRjk583.png
  • 數據載入命令
wKgZomZzij2AZf6eAAEgT0-fPeU146.png
  • 讀取
  • 讀取流程
  1. 讀需要先通過讀cache命令從FLASH中讀出數據到緩存中
  2. 然后通過讀cache指令從緩沖區中開始讀出數據

讀到2048+128后繞回從0開始繼續。

20.3硬件設計

紅楓派開發板SPI——NAND FLASH的硬件設計如下:

wKgZomZzikyAAxbIAADuwlzsORg877.pngwKgZomZyPjeALX0BAADP0lLHKYs115.png

從圖中可以看出,本實驗使用的是普通單線SPI,GD5F1GQ5UEYIGY的片選由GD32F303ZET6的PG13控制(因PG14不是SPI的NSS管腳,所以本實驗用主機NSS軟件模式,,通過普通IO控制片選),GD25Q32ESIGR的SO、SI和SCLK分別和GD32F303ZET6的PB4(SPI2_MISO)、PB5(SPI2_MOSI)以及PB3(SPI2_CLK)相連。

20.4代碼解析

20.4.1SPI初始化和讀寫BYTE函數實現

SPI初始化配置流程可參考19.4.1東方紅開發板使用手冊

SPI讀寫BYTE函數實現可參考19.4.2東方紅開發板使用手冊

20.4.2SPI NAND FLASH BSP驅動層實現

操作NAND FLASH的函數都定義在bsp層文件bsp_spi_nand.c中,這個文件中定義的函數都是針對NAND FLASH命令來實現的,我們選取幾個函數進行介紹。

  • NOR FLASH按block擦除函數bsp_nandflash_block_erase,輸入block號即可擦除;該函數流程是:使能NAND FLASH的寫功能->向NOR FLASH發送block擦除指令0xD8->發送左移6位的Block NO->查詢OIP標志等待完成
C
/*!
\brief erase the nandflash blcok
\param[in] block_No:the serial number of erase block
\param[out] none
\retval SPI_NAND_FAIL: erase the nandflash block fail
\retval SPI_NAND_SUCCESS: erase the nandflash block success
*/
uint8_t bsp_spi_nandflash_block_erase(uint32_t block_No)
{
uint8_t result = SPI_NAND_SUCCESS;

block_No<<=6; ?????? //block_No=block_No*64
bsp_spi_nandflash_write_enable();
/* select the flash: chip select low */
bsp_spi_nand_cs_low();
/* send "ERASE BLOCK" command */
driver_spi_master_transmit_receive_byte(&BOARD_SPI,SPI_NAND_BLOCK_ERASE);
/* send the address of memory */
driver_spi_master_transmit_receive_byte(&BOARD_SPI,(block_No>>16)&0xFF);
driver_spi_master_transmit_receive_byte(&BOARD_SPI,(block_No>>8)&0xFF);
driver_spi_master_transmit_receive_byte(&BOARD_SPI,block_No&0xFF);
/* deselect the flash: chip select high */
bsp_spi_nand_cs_high();
while(bsp_spi_nandflash_get_status_flag(OIP)==SPI_NAND_BUSY);
/* check program result */

return result;
}
  • NOR FLASH按page寫入函數bsp_nandflash_page_program,輸入待寫入數據指針、block號、page號;該函數流程是:
  • 寫緩沖區,實現流程:向NOR FLASH發送寫緩沖區指令0x02->發送寫入的page偏移地址->發送待寫入數據
  • 載入數據到page,實現流程:使能NAND FLASH的寫功能->發送載入命令0x10->發送寫入的page號
  • 查詢OIP標志等待完成
C
/*!
\brief send the program load command,write data to cache
\param[in] buffer: the data of array
\param[in] address_in_page: the address in nandflash page
\param[in] byte_cnt: the number of data
\param[out] none
\retval none
*/
void bsp_spi_nandflash_program_load(uint8_t *buffer,uint16_t address_in_page,uint32_t byte_cnt)
{
uint32_t i=0;

/* select the flash: chip select low */
bsp_spi_nand_cs_low();
#ifdef SPI_NANDFLASH
/* send "PAGE READ" command */
driver_spi_master_transmit_receive_byte(&BOARD_SPI,SPI_NAND_PAGE_LOAD);
/* send the serial number of page */
driver_spi_master_transmit_receive_byte(&BOARD_SPI,(address_in_page>>8)&0xFF);
driver_spi_master_transmit_receive_byte(&BOARD_SPI,address_in_page&0xFF);
#endif


/* deselect the flash: chip select high */


for(i=0;i driver_spi_master_transmit_receive_byte(&BOARD_SPI,*buffer++);
}
//printf("cache program %x %x\n\r",m32record[0],m32record[1]);

bsp_spi_nand_cs_high();
qspi_disable(BOARD_SPI.spi_x);
}

/*!
\brief send the program excute command
\param[in] page_No: the serial number of nandflash page
\param[out] none
\retval none
*/
void bsp_spi_nandflash_program_execute(uint32_t page_No)
{
/* enable the write access to the flash */
bsp_spi_nandflash_write_enable();
/* select the flash: chip select low */
bsp_spi_nand_cs_low();
/* send "PAGE READ" command */
driver_spi_master_transmit_receive_byte(&BOARD_SPI,SPI_NAND_PROGRAM_EXEC);
/* send the serial number of page */
driver_spi_master_transmit_receive_byte(&BOARD_SPI,(page_No>>16)&0xFF);
driver_spi_master_transmit_receive_byte(&BOARD_SPI,(page_No>>8)&0xFF);
driver_spi_master_transmit_receive_byte(&BOARD_SPI,page_No&0xFF);
/* deselect the flash: chip select high */
bsp_spi_nand_cs_high();
}

/*!
\brief write the data to nandflash
\param[in] *buffer:the data of array
\param[in] page_No: the serial number of nandflash page
\param[in] address_in_page: the address of nandflash page
\param[in] byte_cnt:the number of data
\param[out] none
\retval SPI_NAND_FAIL,SPI_NAND_SUCCESS
*/
uint8_t spi_nandflash_write_data(uint8_t *buffer,uint32_t page_No,uint16_t address_page,uint32_t byte_cnt)
{


/*sned the program load command,write data to cache*/
bsp_spi_nandflash_program_load(buffer, address_page, byte_cnt);
/*sned the program excute command*/
bsp_spi_nandflash_program_execute(page_No);
/* Check program result */
while(bsp_spi_nandflash_get_status_flag(OIP)==SPI_NAND_BUSY);


#ifdef WRITE_PAGE_VERIFY_EN
spi_nandflash_read_data (tem_buffer,page_No, address_page, byte_cnt);
if (memcmp(tem_buffer, buffer, byte_cnt) != 0){
return SUCCESS;
}
#endif
return 1;

}
  • NOR FLASH按page讀取函數spi_nandflash_read_data,輸入讀取數據指針、page號、page內地址偏移、讀取長度;該函數流程是:
  • 讀page到緩沖區,實現流程:向NOR FLASH發送寫緩沖區指令0x13->送要讀取的page號
  • 等待OIP標志(NAND讀取page到緩沖區完成)
  • 從緩沖區讀取數據,實現流程:發送讀cache命令0x03->發送要讀取的page地址偏移->讀取所需長度的數據
  • 查詢是否有ecc錯誤
C
/*!
\brief send the read page command
\param[in] page_No: the serial number of nandflash page
\param[out] none
\retval none
*/
void bsp_spi_nandflash_page_read(uint32_t page_No)
{
/* select the flash: chip select low */
bsp_spi_nand_cs_low();
/* send "PAGE READ" command */
driver_spi_master_transmit_receive_byte(&BOARD_SPI,SPI_NAND_PAGE_READ);
/* send the serial number of page */
driver_spi_master_transmit_receive_byte(&BOARD_SPI,(page_No>>16)&0xFF);
driver_spi_master_transmit_receive_byte(&BOARD_SPI,(page_No>>8)&0xFF);
driver_spi_master_transmit_receive_byte(&BOARD_SPI,page_No&0xFF);
/* deselect the flash: chip select high */
bsp_spi_nand_cs_high();
}

/*!
\brief send the read cache command
\param[in] buffer: a pointer to the array
\param[in] address_in_page: the address in nandflash page
\param[in] byte_cnt: the number of data
\param[out] none
\retval none
*/
void bsp_spi_nandflash_read_cache(uint8_t *buffer,uint16_t address_in_page,uint32_t byte_cnt)
{
uint32_t i=0;

/* select the flash: chip select low */
bsp_spi_nand_cs_low();
#ifdef SPI_NANDFLASH
/* send "PAGE READ" command */
driver_spi_master_transmit_receive_byte(&BOARD_SPI,SPI_NAND_READ_CACHE);
//driver_spi_master_transmit_receive_byte(&BOARD_SPI,DUMMY_BYTE);//Q4UC ++ Q5 --
/* send the address of page */
driver_spi_master_transmit_receive_byte(&BOARD_SPI,(address_in_page>>8)&0xFF);
driver_spi_master_transmit_receive_byte(&BOARD_SPI,address_in_page&0xFF);
driver_spi_master_transmit_receive_byte(&BOARD_SPI,DUMMY_BYTE);//Q4UC -- Q5 ++

#endif



for(i=0;i *buffer++=driver_spi_master_transmit_receive_byte(&BOARD_SPI,DUMMY_BYTE);
}

/* deselect the flash: chip select high */
bsp_spi_nand_cs_high();
qspi_disable(BOARD_SPI.spi_x);
}

/*!
\brief read the data from nandflash
\param[in] *buffer:the data of array
\param[in] page_No: the serial number of nandflash page
\param[in] address_in_page: the address in nandflash page
\param[in] byte_cnt:the number of data
\param[out] none
\retval SPI_NAND_FAIL,SPI_NAND_SUCCESS
*/
uint8_t spi_nandflash_read_data(uint8_t *buffer,uint32_t page_No,uint32_t address_in_page,uint32_t byte_cnt)
{
uint8_t result = SPI_NAND_SUCCESS;
uint8_t status = 0;
uint8_t retrycnt = 0;

/* the capacity of page must be equal or greater than the taotal of address_in_page and byte_cnt */
if((address_in_page+byte_cnt)>SPI_NAND_PAGE_TOTAL_SIZE){
return SPI_NAND_FAIL;
}
ReadRetry:
/* send the read page command */
bsp_spi_nandflash_page_read(page_No);
/* wait for NANDFLASH is ready */
while(bsp_spi_nandflash_get_status_flag(OIP)==SPI_NAND_BUSY);
/* read data from cache */
bsp_spi_nandflash_read_cache(buffer, address_in_page, byte_cnt);

bsp_spi_nandflash_get_feature( STATUS, &status );
if(( (status & ECCS0) == 0 )&&( (status & ECCS1) == ECCS1 )){ //UECC
if(retrycnt < 3)
{
retrycnt++;

printf("\rReadretry:%x %x\n",retrycnt,page_No);

goto ReadRetry;
}
else
{
printf("\rRead Fail %x\n",page_No);
}
}
return result;
}

20.4.3main函數實現

main函數中實現了擦除一個block,并對該block中的page進行寫入操作,然后讀取后進行數據對比校驗的功能。

C
/*!
* 說明 main函數
* 輸入 無
* 輸出 無
* 返回值 無
*/
int main(void)
{

//延時、共用驅動部分初始化
driver_init();

//初始化LED組和默認狀態
bsp_led_group_init();
bsp_led_on(&LED0);
bsp_led_off(&LED1);

//初始化UART打印
bsp_uart_init(&BOARD_UART);

//初始化SPI
bsp_spi_init(&BOARD_SPI);

//初始化SPI NAND
bsp_spi_nand_init();

printf("\n\rSPI NAND:GD5F1G configured...\n\r");

//讀取flash id
flash_id=bsp_spi_nandflash_read_id();
printf("\n\rThe NAND_ID:0x%X\n\r",flash_id);

//比對flash id是否一致
if(NAND_ID != flash_id)
{
printf("\n\r\n\rWrite to tx_buffer:\n\r\n\r");

//準備數據
for(uint16_t i = 0; i < BUFFER_SIZE; i ++){
tx_buffer[i] = i;
printf("0x%02X ",tx_buffer[i]);

if(15 == i%16)
printf("\n\r");
}

printf("\n\r\n\rRead from rx_buffer:\n\r");

//擦除要寫入的block
bsp_nandflash_block_erase(0);
//寫入數據
bsp_nandflash_page_program((uint8_t*)tx_buffer,0,0,0);

//回讀寫入數據
bsp_nandflash_page_read(rx_buffer,0,0);

/* printf rx_buffer value */
for(uint16_t i = 0; i <= 255; i ++){
printf("0x%02X ", rx_buffer[i]);
if(15 == i%16)
printf("\n\r");
}

//比較回讀和寫入數據
if(ERROR == memory_compare(tx_buffer,rx_buffer,BUFFER_SIZE)){
printf("Err:Data Read and Write aren't Matching.\n\r");
/* spi flash read id fail */
printf("\n\rSPI nand: Read ID Fail!\n\r");

//寫入錯誤
/* turn off all leds */
bsp_led_on(&LED0);
/* turn off all leds */
bsp_led_on(&LED1);
while(1);
}else{
printf("\n\rSPI-GD5F1G Test Passed!\n\r");
}
}else{ //ID讀取錯誤
/* spi flash read id fail */
printf("\n\rSPI Nand:Read ID Fail!\n\r");
/* turn off all leds */
bsp_led_on(&LED0);
/* turn off all leds */
bsp_led_on(&LED1);
while(1);
}

while(1){
/* turn off all leds */
bsp_led_toggle(&LED0);
/* turn off all leds */
bsp_led_toggle(&LED1);
delay_ms(200);
}
}

20.5實驗結果

nand讀取到正確ID后開始擦寫讀流程,如果ID讀取錯誤或者數據比對不通過點亮LED0,熄滅LED1,如果比對通過則交替閃爍LED0和LED1,通過USB轉串口可以看到打印結果。

wKgaomZzim6ARlMMAAG4cbJ1vl0550.png

教程GD32 MCU方案商聚沃科技原創發布,了解更多GD32 MCU教程,關注聚沃科技官網

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6035

    文章

    44554

    瀏覽量

    634634
  • NAND
    +關注

    關注

    16

    文章

    1681

    瀏覽量

    136118
  • FlaSh
    +關注

    關注

    10

    文章

    1633

    瀏覽量

    147939
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1706

    瀏覽量

    91502
  • 開發板
    +關注

    關注

    25

    文章

    5032

    瀏覽量

    97371
收藏 人收藏

    評論

    相關推薦

    GD32F470紫藤開發板使用手冊】第十一講 SPI-SPI NOR FLASH讀寫實驗

    通過本實驗主要學習以下內容: ?SPI簡介 ?GD32F470 SPI簡介 ?SPI NOR FLASH
    的頭像 發表于 05-17 09:57 ?1771次閱讀
    【<b class='flag-5'>GD32F</b>470紫藤<b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】第十一講 <b class='flag-5'>SPI-SPI</b> NOR <b class='flag-5'>FLASH</b><b class='flag-5'>讀寫實驗</b>

    GD32F303】星空介紹

    一、開發板介紹星空GD開發板是由旗點科技推出的一款GD32開發板,板載
    發表于 09-11 17:55

    【星空GD32F303開發板試用體驗】開箱+環境搭建

    https://bbs.elecfans.com/jishu_2179209_1_1.html感謝 發燒友學院以及廣州旗點智能科技有限公司為我和孩子提供此產品星空gd32F303開發板。收到了星空
    發表于 11-02 15:36

    【星空GD32F303開發板試用體驗】+板卡概覽

    本帖最后由 cooldog123pp 于 2021-11-6 21:07 編輯 星空GD開發板是由旗點科技推出的一款GD32開發板
    發表于 11-06 21:05

    【星空GD32F303開發板試用體驗】文件讀寫與數碼相框的實現 (兼結題報告)

    本帖最后由 jinglixixi 于 2021-11-27 01:23 編輯 星空開發板是旗點科技推出的一款以GD32F303ZET6為核心的開發板,該
    發表于 11-26 12:05

    星空GD32F303開發板的相關資料下載

    一、開發板介紹星空GD開發板是由旗點科技推出的一款GD32開發板,板載
    發表于 12-10 08:27

    GD32-Colibri-F207實驗SPI_FLASH

    GD32-Colibri-F207實驗SPI_FLASH,很好的GD32資料,快來學習吧。
    發表于 04-21 16:35 ?10次下載

    GD32F303固件庫開發

    /qq_24312945/article/details/124325797] GD32F303固件庫開發(2)----讀保護與寫保護 芯片讀保護以后,flash將不可以從外部讀取,這樣可以防止別人讀取或者盜取芯片代碼,如果想再
    的頭像 發表于 07-27 09:27 ?1162次閱讀
    <b class='flag-5'>GD32F303</b>固件庫<b class='flag-5'>開發</b>

    STM32CUBEMX開發GD32F303(17)----內部Flash讀寫

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中進行開發,同時通過開發板內進行驗證。 本例程主要講解如何對芯片自帶Fla
    的頭像 發表于 07-27 09:35 ?1799次閱讀
    STM32CUBEMX<b class='flag-5'>開發</b><b class='flag-5'>GD32F303</b>(17)----內部<b class='flag-5'>Flash</b><b class='flag-5'>讀寫</b>

    GD32F303紅楓開發板使用手冊第二 GPIO-流水燈實驗

    GD32F303系列MCU最多可支持?112?個通用I/O?引腳(GPIO),分別為?PA0 ~ PA15,?PB0 ~ PB15,?PC0 ~ PC15,PD0 ~ PD15,?PE0
    的頭像 發表于 05-29 10:02 ?1631次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】<b class='flag-5'>第二</b><b class='flag-5'>講</b> GPIO-流水燈<b class='flag-5'>實驗</b>

    GD32F303紅楓開發板使用手冊】第五 FMC-片內Flash擦寫讀實驗

    MC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字節空間內,?CPU執行指令零等待,具有相同主頻下最快的代碼執行
    的頭像 發表于 06-02 10:05 ?765次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】第五<b class='flag-5'>講</b> FMC-片內<b class='flag-5'>Flash</b>擦寫讀<b class='flag-5'>實驗</b>

    GD32H757Z海棠開發板使用手冊】第十一講 SPI-SPI NOR FLASH讀寫實驗

    通過本實驗主要學習以下內容: ?SPI簡介 ?GD32H7 SPI簡介 ?SPI NOR FLASH
    的頭像 發表于 06-04 11:42 ?981次閱讀
    【<b class='flag-5'>GD</b>32H757Z海棠<b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】第十一講 <b class='flag-5'>SPI-SPI</b> NOR <b class='flag-5'>FLASH</b><b class='flag-5'>讀寫實驗</b>

    GD32F303紅楓開發板使用手冊】第十九 SPI-SPI NOR FLASH讀寫實驗

    SPI(Serial Peripheral interface),顧名思義是串行外設接口,和UART不同的是,SPI是同步通訊接口,所以帶有時鐘線,而UART是異步通訊接口,不需要時鐘線。 SPI通常使用4根線,分別為SCK、M
    的頭像 發表于 06-19 10:12 ?1223次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】第十九<b class='flag-5'>講</b> <b class='flag-5'>SPI-SPI</b> NOR <b class='flag-5'>FLASH</b><b class='flag-5'>讀寫實驗</b>

    GD32F303紅楓開發板使用手冊第二十三講 SDIO-SD卡讀寫實驗

    通過本實驗主要學習以下內容: ?SDIO操作原理 ?SD卡讀寫實
    的頭像 發表于 06-23 10:49 ?619次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】<b class='flag-5'>第二十</b>三講 SDIO-SD卡<b class='flag-5'>讀寫實驗</b>

    GD32F303紅楓開發板使用手冊第二十 USB-虛擬鍵盤實驗

    ,傳輸速度也很快,這些特性使支持USB接口的電子設備更易用、更大眾化。GD32F303系列MCU集成了USB2.0全速設備USBD模塊,可以滿足作為USB設備與主機
    的頭像 發表于 06-27 09:42 ?826次閱讀
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>紅楓</b><b class='flag-5'>派</b><b class='flag-5'>開發板</b><b class='flag-5'>使用手冊</b>】<b class='flag-5'>第二十</b>七<b class='flag-5'>講</b>  USB-虛擬鍵盤<b class='flag-5'>實驗</b>
    主站蜘蛛池模板: yellow片高清视频免费看| 中文字幕乱码一区AV久久| 性按摩AAAAAAA片| 亚洲精品成人a在线观看| 亚洲午夜福利未满十八勿进| 一个人免费观看HD完整版| 在线视频a| 把腿张开再深点好爽宝贝| 国产91综合| 教室里的激情电影| 免费啪视频观试看视频| 日韩人妻无码精品-专区| 亚州日韩精品AV片无码中文| 亚洲中文字幕无码一久久区| 在线自拍综合亚洲欧美| 扒开女人下面使劲桶视频| 国产毛片AV久久久久精品| 久久久无码精品亚洲欧美| 女仆翻身大作战| 午夜欧洲亚洲AV永久无码精品| 亚洲日本欧美日韩高观看| av56788成 人影院| 国产毛片AV久久久久精品| 麻豆精品传媒一二三区| 色欲久久精品AV无码| 亚洲国产系列一区二区三区| 最好看中文字幕国语| 丰满饥渴老太性hd| 精品亚洲欧美中文字幕在线看| 欧美AAAA片免费播放观看| 学校捏奶揉下面污文h| 69丰满少妇AV无码区| 灌饱娇嫩H将军公主最新章节| 久草在线在线精品观看99| 日韩欧美群交P内射捆绑| 亚洲一区免费观看| 粉嫩国产14xxxxx0000| 久久全国免费观看视频| 十分钟免费观看高清视频大全 | 野花日本韩国视频免费高清观看| 18国产精品白浆在线观看免费|