91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32如何高效接收串口數(shù)據(jù)?

GReq_mcu168 ? 來源:玩轉(zhuǎn)單片機(jī) ? 作者:玩轉(zhuǎn)單片機(jī) ? 2020-12-09 16:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

硬件:stm32f103cbt6
軟件:STM32F10x_StdPeriph_Lib_V3.5.0

DMA,直接內(nèi)存存取,可以用它的雙手釋放CPU的靈魂,所以,本文通過USART3進(jìn)行串口收發(fā),接受使用DMA的方式,無需CPU進(jìn)行干預(yù),當(dāng)接受完成之后,數(shù)據(jù)可以直接從內(nèi)存的緩沖區(qū)讀取,從而減少了CPU的壓力。

具體的代碼實(shí)現(xiàn)如下:

usart_driver.h 封裝了接口,數(shù)據(jù)接收回調(diào)函數(shù)類型,基本數(shù)據(jù)結(jié)構(gòu)等;

usart_driver.c 函數(shù)原型實(shí)現(xiàn),中斷服務(wù)函數(shù)實(shí)現(xiàn)等;

拷貝這兩個文件即可,可以根據(jù)目錄下的參考用例,進(jìn)行初始化。

頭文件usart_driver.h已經(jīng)聲明了外部函數(shù)可能用到的接口;

USART3_DR的地址

因?yàn)閁SART3接收到數(shù)據(jù)會存在DR寄存器中,而DMA控制器則負(fù)責(zé)將該寄存器中的內(nèi)容一一搬運(yùn)到內(nèi)存的緩沖區(qū)中(比如你定義的某個數(shù)組中),所以這里需要告訴DMA控制去哪里搬運(yùn),因此需要設(shè)置USART3_DR的總線地址。

USART3的基址如下圖所示;

9037015a-2e2b-11eb-a64d-12bb97331649.png

USART3的基址

DR寄存器的偏移地址如下圖所示;

9087af60-2e2b-11eb-a64d-12bb97331649.png

DR偏移地址

所以最終地址為:0x40004800 + 0x004#define USART_DR_Base 0x40004804

DMA的通道

因?yàn)橛泻芏嗤庠O(shè)都可以使用DMA,比如ADCI2C,SPI等等,所以,不同的外設(shè)就要選擇屬于自己的DMA通道,查找參考手冊;

90a75b8a-2e2b-11eb-a64d-12bb97331649.png

DMA通道

因此USART3_RX在這里會使用DMA1的通道3,這都是硬件上已經(jīng)預(yù)先分配好的,我們需要遵循這個規(guī)則。所以在代碼中我們做出相應(yīng)的定義;如下所示;

#defineUSART_Rx_DMA_ChannelDMA1_Channel3

DMA的中斷

DMA支持三種中斷:傳輸過半,傳輸完成,傳輸出錯;

90e44446-2e2b-11eb-a64d-12bb97331649.png

DMA中斷

因此在使用是相當(dāng)安全也相當(dāng)靈活,而本文只是用了傳輸完成中斷;如下定義了,傳輸完成中斷的標(biāo)志位,DMA1_FLAG_TC3也就對應(yīng)了圖中的TCIF;

#defineUSART_Rx_DMA_FLAGDMA1_FLAG_TC3

USART接收回調(diào)函數(shù)

在STM32的HAL中封裝了大量外設(shè)的回調(diào)函數(shù),使用起來十分方便,但是標(biāo)準(zhǔn)庫中則沒有這樣的做法,但是這里我們可以自己實(shí)現(xiàn),rx_cbk就是回調(diào),即串口數(shù)據(jù)接收完成就會執(zhí)行已經(jīng)注冊的回調(diào)函數(shù);

typedefvoid(*rx_cbk)(void*args);

通過使用接口usart_set_rx_cbk進(jìn)行回調(diào)函數(shù)的注冊,pargs為將傳遞的參數(shù)指針;

voidusart_set_rx_cbk(uart_mod_t*pmod,rx_cbkpfunc,void*pargs);

頭文件源碼

#ifndefUSART_DRIVER_H #defineUSART_DRIVER_H #include #include /*Privatefunctionprototypes-----------------------------------------------*/ #defineUSE_MICROLIB_USART1 #ifUSE_MICROLIB_USART #ifdef__GNUC__ /*WithGCC/RAISONANCE,smallprintf(optionLDLinker->Libraries->Smallprintf setto'Yes')calls__io_putchar()*/ #definePUTCHAR_PROTOTYPEint__io_putchar(intch) #else #definePUTCHAR_PROTOTYPEintfputc(intch,FILE*f) //#defineGETCHAR_PROTOTYPEintfgetc(FILE*f) #endif/*__GNUC__*/ externPUTCHAR_PROTOTYPE; #else #endif //default8N1 #defineCOM_PORTUSART3 #defineTX_PINGPIO_Pin_10 #defineRX_PINGPIO_Pin_11 #defineBAUDRATE115200 #defineIRQ_UART_PRE3 #defineIRQ_UART_SUB3 #defineUSART_Rx_DMA_ChannelDMA1_Channel3 #defineUSART_Rx_DMA_FLAGDMA1_FLAG_TC3 #defineUSART_DR_Base0x40004804 #defineUSART_BUF_SIZE((uint16_t)16) typedefvoid(*rx_cbk)(void*args); structuart_mod{ uint8_trx_buf[USART_BUF_SIZE]; uint8_trx_dat_len; uint8_thead; uint8_ttail; void(*init)(void); void*pargs; rx_cbkpfunc_rx_cbk; }; typedefstructuart_moduart_mod_t; externuart_mod_tuser_uart_mod; voidusart_init(void); voidusart_set_rx_cbk(uart_mod_t*pmod,rx_cbkpfunc,void*pargs); voidusart_send_char(charch); voidusart_test_echo(void); uint8_tusart_recv_char(void); intusart_printf(constchar*fmt,...); //externGETCHAR_PROTOTYPE; #endif

DMA的基本配置

串口接收DMA的配置在函數(shù)dma_init中;

staticvoiddma_init(void)

已經(jīng)定義了數(shù)據(jù)緩沖區(qū),如下:

uint8_tRxBuffer[USART_BUF_SIZE]={0};

因此需要在DMA的配置中設(shè)置USART_DR的地址,和數(shù)據(jù)緩沖區(qū)的地址,以及兩者的大??;還有就是數(shù)據(jù)流向;

寄存器流向內(nèi)存;

內(nèi)存流向寄存器;這個需要搞清楚;相關(guān)配置如下所示;

DMA_InitStructure.DMA_PeripheralBaseAddr=USART_DR_Base; DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)RxBuffer; DMA_InitStructure.DMA_BufferSize=USART_BUF_SIZE; DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;

注意:DMA_DIR_PeripheralSRC表示,外設(shè)作為源地址,數(shù)據(jù)是從外設(shè)寄存器流向內(nèi)存,即DMA會把數(shù)據(jù)從地址USART_DR_Base搬運(yùn)到RxBuffer去。如果這個地方搞錯,會導(dǎo)致RxBuffer始終沒有你想要的數(shù)據(jù)。

環(huán)形隊(duì)列接收數(shù)據(jù)

線性緩沖區(qū)會因?yàn)榫彌_器接收數(shù)據(jù)已滿導(dǎo)致無法繼續(xù)接收的問題;而環(huán)形隊(duì)列進(jìn)行接收的話,會自動進(jìn)行覆蓋,這樣一來,在讀取數(shù)據(jù)的時候,也要配置一個環(huán)形隊(duì)列進(jìn)行數(shù)據(jù)處理,下面的配置是把DMA配置為循環(huán)模式;

DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;

在結(jié)構(gòu)體user_uart_mod中,則用兩個變量分別指向隊(duì)首head和隊(duì)尾tail;具體數(shù)據(jù)的讀取在函數(shù)USART3_IRQHandler中,會把數(shù)據(jù)從內(nèi)存的RxBuffer讀取到結(jié)構(gòu)體user_uart_mod的成員變量rx_buf中;最終調(diào)用回調(diào)函數(shù)。

函數(shù)原型

usart_driver.c

#include #include #include"stm32f10x_usart.h" #include"usart_driver.h" uint8_tRxBuffer[USART_BUF_SIZE]={0}; uart_mod_tuser_uart_mod={ .rx_dat_len=0, .head=0, .tail=0, .pfunc_rx_cbk=NULL, .pargs=NULL }; staticUSART_InitTypeDefUSART_InitStructure; staticvoidrcc_init(void){ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); /*EnableGPIOclock*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); } staticvoidgpio_init(void){ GPIO_InitTypeDefGPIO_InitStructure; /*ConfigureUSARTTxasalternatefunctionpush-pull*/ GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin=TX_PIN; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); /*ConfigureUSARTRxasinputfloating*/ GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin=RX_PIN; GPIO_Init(GPIOB,&GPIO_InitStructure); } staticvoiddma_init(void){ DMA_InitTypeDefDMA_InitStructure; /*USARTy_Tx_DMA_Channel(triggeredbyUSARTyTxevent)Config*/ DMA_DeInit(USART_Rx_DMA_Channel); DMA_InitStructure.DMA_PeripheralBaseAddr=USART_DR_Base; DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)RxBuffer; //DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize=USART_BUF_SIZE; DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode=DMA_Mode_Circular; DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh; DMA_InitStructure.DMA_M2M=DMA_M2M_Disable; DMA_Init(USART_Rx_DMA_Channel,&DMA_InitStructure); } staticvoidirq_init(void){ NVIC_InitTypeDefNVIC_InitStructure; /*EnabletheUSART3_IRQnInterrupt*/ NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=IRQ_UART_PRE; NVIC_InitStructure.NVIC_IRQChannelSubPriority=IRQ_UART_SUB; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); } voidusart_send_char(charch){ /*Loopuntiltheendoftransmission*/ //while(USART_GetFlagStatus(COM_PORT,USART_FLAG_TC)==RESET){} while((COM_PORT->SR&USART_FLAG_TC)!=USART_FLAG_TC){ } USART_SendData(COM_PORT,(uint8_t)ch); } uint8_tusart_recv_char(){ /*WaitthebyteisentirelyreceivedbyUSARTy*/ //while(USART_GetFlagStatus(COM_PORT,USART_FLAG_RXNE)==RESET){} while((COM_PORT->SR&USART_FLAG_RXNE)!=USART_FLAG_RXNE){ } /*StorethereceivedbyteintheRxBuffer1*/ return(uint8_t)USART_ReceiveData(COM_PORT); } intusart_printf(constchar*fmt,...) { uint8_ti=0; uint8_tusart_tx_buf[128]={0}; va_listap; va_start(ap,fmt); vsprintf((char*)usart_tx_buf,fmt,ap); va_end(ap); while(usart_tx_buf[i]&&ipargs=pargs; pmod->pfunc_rx_cbk=pfunc; } voidDMA1_Channel3_IRQHandler(void){ if(DMA_GetITStatus(USART_Rx_DMA_FLAG)==SET){ DMA_ClearITPendingBit(USART_Rx_DMA_FLAG); } } /** *@briefThisfunctionhandlesUSART3globalinterruptrequest. *@paramNone *@retvalNone */ voidUSART3_IRQHandler(void) { uint8_tbuf[USART_BUF_SIZE]; uint16_trect_len=0; if(USART_GetITStatus(COM_PORT,USART_IT_IDLE)!=RESET) { uint8_ti=0; USART_ReceiveData(COM_PORT); user_uart_mod.head=USART_BUF_SIZE-DMA_GetCurrDataCounter(USART_Rx_DMA_Channel); //fifoisnotfull while(user_uart_mod.head%USART_BUF_SIZE!=user_uart_mod.tail%USART_BUF_SIZE){ user_uart_mod.rx_buf[i++]=RxBuffer[user_uart_mod.tail++%USART_BUF_SIZE]; } user_uart_mod.rx_dat_len=i; //DMA_Cmd(USART_Rx_DMA_Channel,ENABLE); if(user_uart_mod.pfunc_rx_cbk!=NULL){ user_uart_mod.pfunc_rx_cbk(user_uart_mod.pargs); } } USART_ClearITPendingBit(COM_PORT,USART_IT_IDLE); //USART_ClearITPendingBit(COM_PORT,USART_IT_RXNE); } #ifUSE_MICROLIB_USART /** *@briefRetargetstheClibraryprintffunctiontotheUSART. *@paramNone *@retvalNone */ PUTCHAR_PROTOTYPE { /*Placeyourimplementationoffputchere*/ /*e.g.writeacharactertotheUSART*/ USART_SendData(COM_PORT,(uint8_t)ch); /*Loopuntiltheendoftransmission*/ while(USART_GetFlagStatus(COM_PORT,USART_FLAG_TC)==RESET) {} returnch; } #else #pragmaimport(__use_no_semihosting) struct__FILE { inthandle; }; FILE__stdout; int_sys_exit(intx) { x=x; return0; } intfputc(intch,FILE*f) { /*Placeyourimplementationoffputchere*/ /*e.g.writeacharactertotheUSART*/ USART_SendData(COM_PORT,(uint8_t)ch); /*Loopuntiltheendoftransmission*/ while(USART_GetFlagStatus(COM_PORT,USART_FLAG_TC)==RESET) {} returnch; } #endif

參考用例

這里需要調(diào)用usart_init,并設(shè)置回調(diào)函數(shù),如果不設(shè)置,則不會執(zhí)行回調(diào)。

voidmotor_get_cmd_from_uart(void*pargs){ if(pargs==NULL){ return; } uart_mod_t*p=pargs; if(p->rx_dat_len>0&&p->rx_dat_len==PACKAGE_SIZE){ if(p->rx_buf[0]==PACKAGE_HEAD &&p->rx_buf[PACKAGE_SIZE-1]==PACKAGE_TAIL){ user_cmd_mod.head=p->rx_buf[0]; user_cmd_mod.cmd.value_n[0]=p->rx_buf[1]; user_cmd_mod.cmd.value_n[1]=p->rx_buf[2]; user_cmd_mod.option=p->rx_buf[3]; user_cmd_mod.data.value_n[0]=p->rx_buf[4]; user_cmd_mod.data.value_n[1]=p->rx_buf[5]; user_cmd_mod.data.value_n[2]=p->rx_buf[6]; user_cmd_mod.data.value_n[3]=p->rx_buf[7]; user_cmd_mod.tail=p->rx_buf[PACKAGE_SIZE-1]; user_cmd_mod.process_flag=1; } } p->rx_dat_len=0; } intmain(void){ usart_init(); usart_set_rx_cbk(&user_uart_mod,motor_get_cmd_from_uart,&user_uart_mod); }

總結(jié)

本文簡單介紹了基于STM32基于DMA,利用串口空閑中斷進(jìn)行串口數(shù)據(jù)接收的具體配置和實(shí)現(xiàn)方法,代碼基于標(biāo)準(zhǔn)庫3.5版本;
因?yàn)闃?biāo)準(zhǔn)庫ST目前已經(jīng)不再更新,并且ST提供了cubemx工具可以進(jìn)行基于HAL庫和LL庫的外設(shè)快速配置,從而簡化大量工作;當(dāng)然為了不掉頭發(fā)感覺擼寄存器也不錯,最終適合自己的才是最好的。


責(zé)任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11294

    瀏覽量

    225345
  • STM32
    +關(guān)注

    關(guān)注

    2310

    文章

    11171

    瀏覽量

    373775
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1622

    瀏覽量

    82977

原文標(biāo)題:STM32如何高效接收串口數(shù)據(jù)?

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32驅(qū)動串口屏,STM32F103C8T6串口發(fā)送指令控制HMI串口

    僅是一部分常用的基礎(chǔ)指令,更多更仔細(xì)的指令或者函數(shù)可以訪問陶晶馳資料官網(wǎng)。 硬件和接線 硬件需要一塊STM32F103C8T6的開發(fā)板,杜邦線諾干,2.4寸串口屏一塊 接線 串口STM32
    的頭像 發(fā)表于 02-10 17:07 ?202次閱讀
    <b class='flag-5'>STM32</b>驅(qū)動<b class='flag-5'>串口</b>屏,<b class='flag-5'>STM32</b>F103C8T6<b class='flag-5'>串口</b>發(fā)送指令控制HMI<b class='flag-5'>串口</b>屏

    為什么串口接收數(shù)據(jù)就會觸發(fā)中斷呢?

    為什么串口接收數(shù)據(jù)就會觸發(fā)中斷呢? 串口接收喚醒機(jī)制有哪些注意事項(xiàng)?
    發(fā)表于 01-08 06:45

    MCU單片機(jī)串口數(shù)據(jù)記錄儀方案

    在工業(yè)控制、環(huán)境監(jiān)測、物流追蹤等眾多領(lǐng)域,如何可靠、便捷地記錄設(shè)備串口數(shù)據(jù)成為不少工程師關(guān)注的焦點(diǎn)?;贛CU單片機(jī)的串口數(shù)據(jù)記錄儀方案,正以其高效
    的頭像 發(fā)表于 11-27 15:02 ?366次閱讀

    rt-thread 在使用串口DMA模式的時候,接收數(shù)據(jù)接收不到00,為什么?

    硬件為STM32F103ZET6: 在使用串口通訊時,在DMA接收模式下,收不到00數(shù)據(jù),遇到00數(shù)據(jù),好像DMA模式就認(rèn)為是
    發(fā)表于 10-14 06:20

    串口DMA接收數(shù)據(jù)包丟失怎么解決?

    RTT串口DMA接收數(shù)據(jù),超過緩沖區(qū)后為什么會吞掉一個數(shù)據(jù)包呢,不能每次處理完后清除緩沖區(qū)數(shù)據(jù)嗎,感覺
    發(fā)表于 09-29 07:50

    串口接收的bufferSize由1024變更為3072后數(shù)據(jù)接收出錯,為什么?

    所有功能正常的程序,為了在加快OTA下載的速度,將原來的串口接收數(shù)組的長度1024變?yōu)?072時反而接收不到數(shù)據(jù)了,后來查看了一下內(nèi)存具體如下: free total: 45708 u
    發(fā)表于 09-17 06:25

    rtt vision board openmv串口收發(fā)數(shù)據(jù)接收到的是亂碼,為什么?

    利用ttl轉(zhuǎn)Usb ,利用電腦上的串口調(diào)試助手發(fā)送或者接收數(shù)據(jù)接收到的是亂碼,將板子上的rx,tx短接,可以正常收發(fā)
    發(fā)表于 09-15 06:09

    STM32H743 UART DMA接收不到數(shù)據(jù)是為什么?

    ;find %s failed!n\", \"uart3\"); return RT_ERROR; } /* 以 DMA 接收及輪詢發(fā)送方式打開串口設(shè)備
    發(fā)表于 09-11 07:14

    【RA4M2-SENSOR】—— 12.串口接收不定長度數(shù)據(jù)

    交互中都有廣泛應(yīng)用。 但在使用串口通訊的時候,我們并不知道對方會發(fā)送多少個數(shù)據(jù),也不知道數(shù)據(jù)什么時候發(fā)送完,簡單來講就是:如何確保收到一幀完整的數(shù)據(jù)?
    發(fā)表于 09-01 11:22

    關(guān)于stm32f4zgt6和mspm0g3507串口通信問題

    本人在使用stm32f4zgt6和mspm0g3507串口通信時出現(xiàn)問題,情況如下: m0芯片使用軟件超時解析進(jìn)行數(shù)據(jù)接收,使用標(biāo)準(zhǔn)庫的transmit函數(shù)進(jìn)行
    發(fā)表于 09-01 11:11

    CYT2B7串口接收會漏接數(shù)據(jù)怎么解決?

    串口中斷方式接收會漏接數(shù)據(jù)串口工具發(fā)送 :1234567芯片接收到 :1357硬件是CYTVII-B-E-1M-SK開發(fā)板軟件是SDL v
    發(fā)表于 08-14 07:29

    STM32407使用串口閑時中斷+DMA方式接收最大接收字節(jié)是多少?

    使用串口閑時中斷+DMA方式接收數(shù)據(jù),波特率為460800,DMA接收長度為1024個字節(jié),并開啟串口閑時中斷,當(dāng)上位機(jī)一次發(fā)送520個字節(jié)
    發(fā)表于 07-22 08:16

    STM32L431偶發(fā)串口亂碼的原因?怎么解決?

    項(xiàng)目現(xiàn)場發(fā)現(xiàn)有些設(shè)備有時下發(fā)數(shù)據(jù)沒反應(yīng),該設(shè)備由STM32L431外接模塊來接收網(wǎng)絡(luò)數(shù)據(jù)。經(jīng)過排查,發(fā)現(xiàn)亂碼發(fā)生時,外接設(shè)備發(fā)出的數(shù)據(jù)無亂碼
    發(fā)表于 06-19 06:46

    STM32F407驕陽電機(jī)版用DMA雙緩存接收串口數(shù)據(jù)時,上電第一次接收區(qū)是memory1而不是memory0?為什么?

    STM32 F407驕陽電機(jī)版用DMA雙緩存接收串口數(shù)據(jù)時,上電第一次接收區(qū)是memory1而不是memory0?
    發(fā)表于 06-12 07:15

    STM32串口下載軟件(FLYMCU)

    STM32串口下載軟件(FLYMCU),經(jīng)典版本,親試可用。
    發(fā)表于 04-09 15:59 ?11次下載