本帖最后由 清風拂山崗~ 于 2023-4-18 14:37 編輯
1.1 USB-CDC虛擬串口概述
當單片機需要和電腦之間進行數據交換時,首選一般都是串口通訊。32位8051,STC32G12K128單片機內置USB控制器和收發器。
當用戶代碼中嵌入USB-CDC代碼后,使用USB線將單片機與電腦直接相連接,在電腦端就可識別出【USB-CDC虛擬串口】,
【USB-CDC虛擬串口】就是【串口】, 就是【zui簡單zui強大的串口】。
USB-CDC虛擬串口和傳統串口相比有如下優點:
Ø 數據傳輸更快: USB-CDC虛擬串口忽略傳統串口的波特率,傳輸速度的比特率即為全速USB的通訊速度12MBPS(即每秒12M位)
Ø 使用更簡單便捷:USB-CDC虛擬串口忽略傳統串口的起始位、停止位等冗余信息
Ø 數據傳輸更可靠:USB-CDC虛擬串口丟棄傳統串口簡單的軟件奇偶校驗機制,USB-CDC虛擬串口數據傳輸時有USB硬件CRC校驗,
以及校驗出錯重傳機制,保證數據100%正確
Ø 自動緩存數據: USB-CDC虛擬串口會自動緩存數據。單片機在沒有處理完成上位機下傳的上一筆數據時,如果此時上位機又有
新的數據下傳,虛擬串口會自動將新的數據緩存,從而保證數據100%不會丟失或被覆蓋。
USB-CDC虛擬串口和傳統串口相比有如下優點:
Ø 數據傳輸更快: USB-CDC虛擬串口忽略傳統串口的波特率,傳輸速度的比特率即為全速USB的通訊速度12MBPS(即每秒12M位)
Ø 使用更簡單便捷:USB-CDC虛擬串口忽略傳統串口的起始位、停止位等冗余信息
Ø 數據傳輸更可靠:USB-CDC虛擬串口丟棄傳統串口簡單的軟件奇偶校驗機制,USB-CDC虛擬串口數據傳輸時有USB硬件CRC校驗,
以及校驗出錯重傳機制,保證數據100%正確
Ø 自動緩存數據: USB-CDC虛擬串口會自動緩存數據。單片機在沒有處理完成上位機下傳的上一筆數據時,如果此時上位機又有新的數據下傳,
虛擬串口會自動將新的數據緩存,從而保證數據100%不會丟失或被覆蓋。
1.2 新建Keil項目并加入CDC模塊
2、下載完成后,從壓縮包中將“stc_usb_cdc_32g.lib”和“stc32_stc8_usb.h”解壓到項目目錄中
3、打開Keil軟件,并新建項目
Database請選擇“STC MCU Database”
單片機型號選擇“STC32G12K128 Series”
4、項目建立完成后,將下面的代碼命名為main.c文件并保存到項目目錄中 //測試工作頻率為24MHz #include "stc32g.h" #include "stc32_stc8_usb.h" #define FOSC 24000000UL//ISP下載時需將工作頻率設置為24MHz char *USER_DEVICEDESC = NULL; char *USER_PRODUCTDESC = NULL; char *USER_STCISPCMD = "@STCISP#"; //不停電自動ISP下載命令 void main() { WTST= 0; CKCON= 0; EAXFR= 1; P0M1= 0x00; P0M0 = 0x00; P1M1= 0x00; P1M0 = 0x00; P2M1= 0x00; P2M0 = 0x00; P3M1= 0x00; P3M0 = 0x00; P4M1= 0x00; P4M0 = 0x00; P5M1= 0x00; P5M0 = 0x00; P6M1= 0x00; P6M0 = 0x00; P7M1= 0x00; P7M0 = 0x00; P3M0&= ~0x03; //P3.0/P3.1和USB的D-/D+共用PIN腳, P3M1|= 0x03; //需要將P3.0/P3.1設置為高阻輸入模式 IRC48MCR= 0x80; //使能內部48M的USB專用IRC while(!(IRC48MCR & 0x01)); USBCLK= 0x00; //設置USB時鐘源為內部48M的USB專用IRC USBCON= 0x90; //使能USB功能 usb_init(); //調用USB CDC初始化庫函數 EUSB= 1; //使能USB中斷 EA= 1; while(DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置 while(1) { if(bUsbOutReady) //當硬件接收完成上位機通過串口助手發送數據后 //會自動將bUsbOutReady置1 //接收的數據字節數保存在OutNumber變量中 //接收的數據保存在UsbOutBuffer緩沖區 { USB_SendData(UsbOutBuffer,OutNumber); //使用USB_SendData庫函數可向上位機發送數據 //這里的測試代碼為將接收數據原樣返回 usb_OUT_done(); //處理完成接收的數據后 //調用usb_OUT_done準備接收下一筆數據 } } }
5、將項目目錄下的“main.c”和“stc_usb_cdc_32g.lib”加入到項目中
6、進行項目設置
設置完成后,編譯通過即可生產目標HEX文件
7、使用最新的STC-ISP下載軟件將HEX下載到目標芯片
8、下載完成后,系統中就會出現一個STC USB-CDC串口
1.3 USB-CDC虛擬串口與電腦進行數據傳輸
用STC-ISP軟件中的串口助手打開CDC串口,即可進行數據收發測試
1.4 STC USB-CDC虛擬串口實現不停電自動ISP下載
由于我們在代碼中已經定義了不停電自動ISP下載命令
我們只需要在下載軟件的“收到用戶命令后復位到ISP監控程序區”中的進行如下設置,
即可實現不停電自動ISP下載功能了。
|