9.1實(shí)驗(yàn)內(nèi)容
通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容:
串口簡介
GD32H757串口工作原理
使用printf打印信息
9.2實(shí)驗(yàn)原理
9.2.1串口簡介
串口,從廣義上看,指所有串行通信接口,比如RS232、RS422、RS485、SPI、IIC等。串行通訊是指僅用一根接收線和一根發(fā)送線就能將數(shù)據(jù)以位進(jìn)行傳輸?shù)耐ㄓ嵎绞健:痛型ㄓ嵪鄬?yīng)的是并行通訊,并行通信指一個(gè)傳輸接口可以傳輸8個(gè)bit即一個(gè)byte(有時(shí)甚至更多),雖然串行通信比并行通信慢,但是串口可以在僅僅使用兩根線的情況下就能實(shí)現(xiàn)數(shù)據(jù)的傳輸。
對于GD32H757來說,串口一般特指USART(通用同步異步收發(fā)器 )和UART(通用異步收發(fā)器 )。USART/UART提供了一個(gè)靈活方便的串行數(shù)據(jù)交換接口,數(shù)據(jù)幀可以通過全雙工或半雙工,同步或異步的方式進(jìn)行傳輸。海棠派開發(fā)板搭載的GD32H757最多有8個(gè)串口(USART+UART), 對于一般應(yīng)用來說足夠使用了。
9.2.2串口通信幀介紹
GD32H757的串口通信只需要3條線組成,分別為TX(發(fā)送線)、RX(接收線)和GND,對于兩個(gè)通信結(jié)點(diǎn),TX和RX需要交叉連接,如下示例:
下面來介紹下串口數(shù)據(jù)幀組成。
以下為一個(gè)標(biāo)準(zhǔn)的串口通信幀:
一個(gè)串口幀由空閑、起始位、數(shù)據(jù)位、校驗(yàn)位以及停止位組成,傳輸?shù)臄?shù)據(jù)地位在前,高位再后。
空閑:串口TX或RX數(shù)據(jù)線上沒有傳輸任何數(shù)據(jù)時(shí),則該線處于為空閑狀態(tài)。空閑是TX和RX都是處于高電平。
起始位:占一個(gè)bit時(shí)間,標(biāo)志數(shù)據(jù)起始,由一個(gè)邏輯0(低電平)的數(shù)據(jù)位表示。當(dāng)發(fā)送方開始發(fā)送一幀數(shù)據(jù)時(shí),起始位會最先發(fā)送,而對于接收方來說,檢測到起始位后,即使自己的接收時(shí)鐘與發(fā)送方的數(shù)據(jù)同步。
數(shù)據(jù)位:數(shù)據(jù)位緊跟在起始位之后,是通信中的真正有效信息。數(shù)據(jù)位的位數(shù)可以由通信雙方共同約定,對于GD32H757來說,數(shù)據(jù)位一般只有8位。
校驗(yàn)位:校驗(yàn)位占一bit時(shí)間,GD32H757可以設(shè)置校驗(yàn)位為:奇校驗(yàn)、偶校驗(yàn)或無校驗(yàn)。校驗(yàn)位是為了保證通信的可靠性,如果是奇校驗(yàn),需要保證傳輸?shù)臄?shù)據(jù)總共有奇數(shù)個(gè)邏輯高位,如果是偶校驗(yàn),需要保證傳輸?shù)臄?shù)據(jù)總共有偶數(shù)個(gè)邏輯高位。以傳輸傳輸數(shù)據(jù)A:0x01000001為例,如果設(shè)置了奇校驗(yàn),則需要在校驗(yàn)位傳輸“1”,如果是偶檢驗(yàn),則傳輸“0”。奇偶校驗(yàn)是由硬件處理的,當(dāng)設(shè)置好校驗(yàn)位后,硬件會自動根據(jù)需要傳輸?shù)臄?shù)據(jù)自動插入校驗(yàn)位。
注意:GD32H757的數(shù)據(jù)位可設(shè)置為8bit和9bit兩種方式,當(dāng)設(shè)置了奇校驗(yàn)或偶校驗(yàn),一定要將數(shù)據(jù)位設(shè)置為9bit;而設(shè)置了無校驗(yàn)時(shí),需要將數(shù)據(jù)位設(shè)置為8bit。 |
停止位:它是一幀數(shù)據(jù)的結(jié)束標(biāo)志,可以是1bit、1.5bit、2bit個(gè)邏輯“1”。
9.2.3串口波特率
波特率是串口通信中一個(gè)非常重要的參數(shù),串口通信傳輸雙方必須要設(shè)置一樣的串口波特率,否則通訊就會出錯(cuò)。波特率可以認(rèn)為是比特率,即每秒傳輸?shù)奈粩?shù)。一般波特率可以是9600、19200、115200等等,如果設(shè)置波特率為9600,設(shè)置通信幀為1bit起始位+8bit數(shù)據(jù)幀+無校驗(yàn)+1bit停止位,那么每秒鐘最多可以傳輸9600bit/10bit = 960個(gè)字節(jié)。
現(xiàn)在重點(diǎn)介紹下GD32H757串口接收器的工作原理。GD32H757串口接收器支持16倍(默認(rèn))過采樣和8倍過采樣,16位過采樣即發(fā)送方發(fā)送數(shù)據(jù)后,GD32470串口接受器會將每個(gè)bit采樣16次,如果是8倍過采樣,則采用8次。下圖為16位過采樣的示意圖:
在默認(rèn)情況下,接收器通過獲取三個(gè)采樣點(diǎn)的值來估計(jì)該位的值,其中16倍過采樣選取采樣點(diǎn)為第7、8、9點(diǎn),而8倍過采樣為第3、4、5采樣點(diǎn)。如果在3個(gè)采樣點(diǎn)中有2個(gè)或3個(gè)為0,該數(shù)據(jù)位被視為0,否則為1。如果3個(gè)采樣點(diǎn)中有一個(gè)采樣點(diǎn)的值與其他兩個(gè)不同,不管是起始位,數(shù)據(jù)位,奇偶校驗(yàn)位或者停止位,都將產(chǎn)生噪聲錯(cuò)誤(NERR)。
9.2.4GD32H757串口設(shè)置步驟
串口設(shè)置的一般步驟為:
GPIO時(shí)鐘開啟、串口時(shí)鐘開啟
GPIO設(shè)置,發(fā)送和接受都要設(shè)置為AF模式,且需要設(shè)置為正確的AF號
串口復(fù)位
串口參數(shù)配置,主要為波特率、數(shù)據(jù)位長度、校驗(yàn)位設(shè)置、停止位長度
依據(jù)是否需要使用中斷或DMA進(jìn)行中斷配置或DMA配置
使能串口
編寫中斷處理函數(shù)
9.3硬件設(shè)計(jì)
海棠派開發(fā)板的P1接口將USART0——PA9、PA10引出,讀者可以通過P1口使用USART0:
9.4代碼解析
9.4.1在driver_uart.c中定義了串口初始化函數(shù)driver_uart_init。
C void driver_uart_init(typdef_uart_struct *uartx) { rcu_periph_clock_enable(uartx->rcu_uart_x); /* USART configure */ usart_deinit(uartx->uart_x); driver_gpio_general_init(uartx->uart_rx_gpio); driver_gpio_general_init(uartx->uart_tx_gpio); if(uartx->uart_mode_rx==MODE_DMA) { if(uartx->uart_rx_dma!=NULL) { driver_dma_com_init(uartx->uart_rx_dma,(uint32_t)&USART_RDATA(uartx->uart_x),NULL,DMA_Width_8BIT,DMA_PERIPH_TO_MEMORY); usart_interrupt_enable(uartx->uart_x,USART_INT_IDLE); } } if(uartx->uart_mode_tx==MODE_DMA) { if(uartx->uart_tx_dma!=NULL) { driver_dma_com_init(uartx->uart_tx_dma,(uint32_t)&USART_TDATA(uartx->uart_x),NULL,DMA_Width_8BIT,DMA_MEMORY_TO_PERIPH); // usart_interrupt_enable(uartx->uart_x,USART_INT_TC); } } usart_baudrate_set(uartx->uart_x, uartx->baudrate); usart_receive_config(uartx->uart_x, USART_RECEIVE_ENABLE); usart_transmit_config(uartx->uart_x, USART_TRANSMIT_ENABLE); usart_word_length_set(uartx->uart_x, uartx->data_length); usart_parity_config(uartx->uart_x, uartx->parity); usart_enable(uartx->uart_x); } |
9.4.2重定向函數(shù)int fputc(int ch, FILE *f)
要使用Printf,重定向函數(shù)fputc是必須的。在C 語言標(biāo)準(zhǔn)庫中,fputc函數(shù)是printf 函數(shù)內(nèi)部的一個(gè)函數(shù),功能是將字符ch寫入到文件指針file所指向文件的當(dāng)前寫指針位置,簡單理解就是把字符寫入到特定文件中。我們使用USART函數(shù)重新修改fputc函數(shù)內(nèi)容,達(dá)到類似“寫入”的功能。
fputc定義在bsp_uart.c中
C int fputc(int ch, FILE *f) { driver_uart_transmit_byte(&BOARD_UART,(uint8_t)ch); return ch; } |
這個(gè)函數(shù)比較簡單,就是調(diào)用了接口driver_uart_transmit_byte,該接口定義在driver_uart.c中:
C Drv_Err driver_uart_transmit_byte(typdef_uart_struct *uartx,uint8_t data) { __IO uint64_t timeout = driver_tick; while(uartx->uart_control.Com_Flag.Bits.SendState==1){ if((timeout+UART_TIMEOUT_MS) <= driver_tick) { uartx->uart_control.Com_Flag.Bits.SendState=0; return DRV_ERROR; } } Drv_Err uart_state=DRV_SUCCESS; uartx->uart_control.Com_Flag.Bits.SendSuccess=0; uartx->uart_control.Com_Flag.Bits.SendState=1; uart_state=driver_uart_flag_wait_timeout(uartx,USART_FLAG_TBE,SET); usart_data_transmit(uartx->uart_x,data); uartx->uart_control.Com_Flag.Bits.SendSuccess=1; uartx->uart_control.Com_Flag.Bits.SendState=0; return uart_state; } |
這段代碼作用是,循環(huán)去讀串口的TBE標(biāo)志位,并且將待發(fā)送的數(shù)據(jù)寫到串口寄存器中。
9.4.3main函數(shù)實(shí)現(xiàn)
串口初始化完成并定義好fputc重定向函數(shù)后,就可以通過printf函數(shù)往電腦上打印數(shù)據(jù)了。以下main函數(shù):
C int main(void) { //延時(shí)和公共驅(qū)動部分初始化 driver_init(); //串口初始化,DMA模式開啟 BOARD_UART.uart_mode_tx=MODE_DMA; bsp_uart_init(&BOARD_UART); bsp_led_init(&LED2); //打開對應(yīng)串口的中斷 nvic_irq_enable(USART0_IRQn,2,0); while(1) { //printg標(biāo)準(zhǔn)打印(輪訓(xùn)) printf_log('rndelay 1s rn'); delay_ms(1000); bsp_led_toggle(&LED2); printf_log('printf:system driver_tick is %lld rn',driver_tick); //輪訓(xùn)方式打印 memset(uart_poll_buff,0,50);//清零buff sprintf((char*)uart_poll_buff,'poll transmit:system driver_tick is %lld rn',driver_tick);//格式化字符串 driver_uart_poll_transmit(&BOARD_UART,uart_poll_buff,strlen((const char*)uart_poll_buff)); printf_log('%s',uart_poll_buff); //中斷方式打印 memset(uart_int_buff,0,50); sprintf((char*)uart_int_buff,'int transmit:system driver_tick is %lld rn',driver_tick); driver_uart_int_transmit(&BOARD_UART,uart_int_buff,strlen((const char*)uart_int_buff)); printf_log('%s',uart_int_buff); //DMA方式打印 memset(uart_dma_buff,0,50); sprintf((char*)uart_dma_buff,'dma transmit:system driver_tick is %lld rn',driver_tick); driver_uart_dma_transmit(&BOARD_UART,uart_dma_buff,strlen((const char*)uart_dma_buff)); printf_log('%s',uart_dma_buff); } } |
本例程main函數(shù)首先進(jìn)行了延時(shí)函數(shù)初始化,并設(shè)置了一個(gè)LED燈用來提示代碼運(yùn)行。while(1)循環(huán)中先延時(shí)1s,再翻轉(zhuǎn)一次LED狀態(tài),接著使用printf函數(shù)打印系統(tǒng)運(yùn)行tick時(shí)間。
本例程也同步做了printf打印在LCD屏幕的功能,將LCD屏接在海棠派開發(fā)板上后,打印信息將同步在顯示屏上顯示。
9.5實(shí)驗(yàn)結(jié)果
使用USB轉(zhuǎn)TTL串口的連接線后,配置好串口調(diào)試助手,即可看到每秒鐘串口打印的數(shù)據(jù)了。
上一篇:【GD32H757Z海棠派開發(fā)板使用手冊】第十三講 SDIO-SD卡讀寫實(shí)驗(yàn)
下一篇:關(guān)于采用GD32E230系列MCU設(shè)計(jì)TWS耳機(jī)充電盒方案的介紹和應(yīng)用
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 英飛凌微控制器:以全新實(shí)惠套件和強(qiáng)大開發(fā)環(huán)境為開發(fā)者提供支持
- iTOP-i.MX6開發(fā)板設(shè)備數(shù)驅(qū)動Menuconfig的用法
- 迅為IMX6ULL開發(fā)板Qt for Android搭建開發(fā)環(huán)境
- 迅為i.MX8M mini開發(fā)板Windots QT系統(tǒng)開發(fā)環(huán)境搭建
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開發(fā)板Linix系統(tǒng)修改默認(rèn)屏幕
- iTOP-4412開發(fā)板支持4G以上文件系統(tǒng)擴(kuò)展
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)設(shè)置開機(jī)自啟動
- 迅為IMX6Q開發(fā)板 Buildroot文件系統(tǒng)mqtt測試
- LTC3526BEDC 2 節(jié)電池至 3.3V 升壓轉(zhuǎn)換器的典型應(yīng)用電路
- 使用 ON Semiconductor 的 LV4900HR 的參考設(shè)計(jì)
- 具有可調(diào)軟啟動功能的 LT1956IGN-5 降壓轉(zhuǎn)換器的典型應(yīng)用電路
- LT3750 微型控制器可輕松以最佳方式為大型電容器充電
- 【物聯(lián)網(wǎng)】基于鴻蒙系統(tǒng)的WIFI智能開關(guān)+4212688A
- RSL10-SOLARSENS-GEVK:RSL10 太陽能電池多傳感器平臺
- 使用 ON Semiconductor 的 CS-8181 的參考設(shè)計(jì)
- 900MHz全雙工無線發(fā)射器參考設(shè)計(jì)
- LTC2946MPMS 6V 至 300V 高端電源、電荷和能量監(jiān)視器的典型應(yīng)用
- NU-LB-MINI51, 基于 NuMicro Mini51 系列的開發(fā)板
- 博世2025上海車展展品亮點(diǎn)
- 安富利:融入中國發(fā)展浪潮,與時(shí)代同頻共振30年
- 結(jié)合濾波器的工作原理是什么?結(jié)合濾波器的作用是什么
- 數(shù)據(jù)采集在工業(yè)自動化與智能制造中的應(yīng)用案例
- 伺服電機(jī)按運(yùn)行功率如何劃分?直流伺服電機(jī)、交流伺服電機(jī)有何不同
- 伺服電機(jī)工作流程是怎樣的?伺服電機(jī)常見故障如何維修
- 如何計(jì)算伺服電機(jī)功率?直流/交流伺服電機(jī)在特點(diǎn)、應(yīng)用上有什么區(qū)別
- 如何使用伺服電機(jī)?選擇伺服電機(jī)需要考慮哪些因素
- 伺服電機(jī)有哪些主要作用?伺服電機(jī)如何接線
- 伺服電機(jī)剛性過大存在哪些危害?伺服電機(jī)控制方式有哪些
- 應(yīng)用指南下載|是德科技《快速查找和識別隱藏的信號誤差》
- TI“無線”風(fēng)光可穿戴現(xiàn)場培訓(xùn)直播,誠邀參與,預(yù)注冊贏好禮
- 硬核拆解|看看千元智能電表內(nèi)部如何連接
- 夏末秋初,玩轉(zhuǎn)EE芯積分,邊賺邊花+禮品兌換劇透
- 年終大沖關(guān)!第二期光榮榜活動震撼登場!
- #最能打國產(chǎn)芯#能打入汽車電子這片地的國產(chǎn)芯,有多少啦?
- 瑞薩電子最新觸控微控制器R7F0C208入門套件免費(fèi)申請,參與申請還能贏好禮!
- Quartus Prime設(shè)計(jì)軟件15.1版 帶你體驗(yàn)革命性的設(shè)計(jì)生涯
- 瑞薩電子100套開發(fā)套件等你來搶
- 填問卷,解鎖贏好禮!看泰克MDO4000C如何進(jìn)行電源分析!
- 宗申動力戰(zhàn)略轉(zhuǎn)型升級,擬增資5000萬元人民幣到氫能源
- 把5G引入交通運(yùn)輸以及智能汽車,高通為行業(yè)樹立標(biāo)桿
- 乍見之歡不如久處不厭,拜騰內(nèi)部又亂了?
- 蔚來汽車銷量低迷,未來還有轉(zhuǎn)機(jī)嗎?
- 新能源車市場留給造車新勢力的時(shí)間不多了
- 中華映管宣布破產(chǎn)后,強(qiáng)制協(xié)商資遣員工
- 粵芯與廣東省牽手合作,“一日集成電路產(chǎn)業(yè)圈” 雛形已現(xiàn)
- 大族激光前三季度凈利潤下降超六成,懟記者成“黑歷史”
- 中國科技第一展——高交會將于11月隆重開幕
- 美團(tuán)憑借什么從BAT到ATM,市值突破5000億港元?