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

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

3天內不再提示

【GD32F470紫藤派開(kāi)發(fā)板使用手冊】第九講 USART-printf打印實(shí)驗

聚沃科技 ? 2024-05-13 10:14 ? 次閱讀
wKgaomYwSqiAY_PQAAnl063z3JE116.png

9.1實(shí)驗內容

通過(guò)本實(shí)驗主要學(xué)習以下內容:

9.2實(shí)驗原理

9.2.1串口簡(jiǎn)介

串口,從廣義上看,指所有串行通信接口,比如RS232、RS422、RS485、SPI、IIC等。串行通訊是指僅用一根接收線(xiàn)和一根發(fā)送線(xiàn)就能將數據以位進(jìn)行傳輸的通訊方式。和串行通訊相對應的是并行通訊,并行通信指一個(gè)傳輸接口可以傳輸8個(gè)bit即一個(gè)byte(有時(shí)甚至更多),雖然串行通信比并行通信慢,但是串口可以在僅僅使用兩根線(xiàn)的情況下就能實(shí)現數據的傳輸。

對于GD32F470來(lái)說(shuō),串口一般特指USART(通用同步異步收發(fā)器 )和UART(通用異步收發(fā)器 )。USART/UART提供了一個(gè)靈活方便的串行數據交換接口,數據幀可以通過(guò)全雙工或半雙工,同步或異步的方式進(jìn)行傳輸。紫藤派開(kāi)發(fā)板搭載的GD32F470最多有8個(gè)串口(USART+UART), 對于一般應用來(lái)說(shuō)足夠使用了。

9.2.2串口通信幀介紹

GD32F470的串口通信只需要3條線(xiàn)組成,分別為T(mén)X(發(fā)送線(xiàn))、RX(接收線(xiàn))和GND,對于兩個(gè)通信結點(diǎn),TX和RX需要交叉連接,如下示例:

wKgZomZBdHiABIwiAAHgknaaCew303.png

下面來(lái)介紹下串口數據幀組成。

以下為一個(gè)標準的串口通信幀:

wKgZomZBdIWACJN4AAGZCDszKEQ933.png

一個(gè)串口幀由空閑、起始位、數據位、校驗位以及停止位組成,傳輸的數據地位在前,高位再后。

空閑:串口TX或RX數據線(xiàn)上沒(méi)有傳輸任何數據時(shí),則該線(xiàn)處于為空閑狀態(tài)??臻e是TX和RX都是處于高電平。

起始位:占一個(gè)bit時(shí)間,標志數據起始,由一個(gè)邏輯0(低電平)的數據位表示。當發(fā)送方開(kāi)始發(fā)送一幀數據時(shí),起始位會(huì )最先發(fā)送,而對于接收方來(lái)說(shuō),檢測到起始位后,即使自己的接收時(shí)鐘與發(fā)送方的數據同步。

數據位:數據位緊跟在起始位之后,是通信中的真正有效信息。數據位的位數可以由通信雙方共同約定,對于GD32F470來(lái)說(shuō),數據位一般只有8位。

校驗位:校驗位占一bit時(shí)間,GD32F470可以設置校驗位為:奇校驗、偶校驗或無(wú)校驗。校驗位是為了保證通信的可靠性,如果是奇校驗,需要保證傳輸的數據總共有奇數個(gè)邏輯高位,如果是偶校驗,需要保證傳輸的數據總共有偶數個(gè)邏輯高位。以傳輸傳輸數據A:0x01000001為例,如果設置了奇校驗,則需要在校驗位傳輸“1”,如果是偶檢驗,則傳輸“0”。奇偶校驗是由硬件處理的,當設置好校驗位后,硬件會(huì )自動(dòng)根據需要傳輸的數據自動(dòng)插入校驗位。

注意:GD32F470的數據位可設置為8bit和9bit兩種方式,當設置了奇校驗或偶校驗,一定要將數據位設置為9bit;而設置了無(wú)校驗時(shí),需要將數據位設置為8bit。

停止位:它是一幀數據的結束標志,可以是1bit、1.5bit、2bit個(gè)邏輯“1”。

9.2.3串口波特率

波特率是串口通信中一個(gè)非常重要的參數,串口通信傳輸雙方必須要設置一樣的串口波特率,否則通訊就會(huì )出錯。波特率可以認為是比特率,即每秒傳輸的位數。一般波特率可以是9600、19200、115200等等,如果設置波特率為9600,設置通信幀為1bit起始位+8bit數據幀+無(wú)校驗+1bit停止位,那么每秒鐘最多可以傳輸9600bit/10bit = 960個(gè)字節。

現在重點(diǎn)介紹下GD32F470串口接收器的工作原理。GD32F470串口接收器支持16倍(默認)過(guò)采樣和8倍過(guò)采樣,16位過(guò)采樣即發(fā)送方發(fā)送數據后,GD32470串口接受器會(huì )將每個(gè)bit采樣16次,如果是8倍過(guò)采樣,則采用8次。下圖為16位過(guò)采樣的示意圖:

wKgZomZBdKmABArKAACktSKe6l0039.png

在默認情況下,接收器通過(guò)獲取三個(gè)采樣點(diǎn)的值來(lái)估計該位的值,其中16倍過(guò)采樣選取采樣點(diǎn)為第7、8、9點(diǎn),而8倍過(guò)采樣為第3、4、5采樣點(diǎn)。如果在3個(gè)采樣點(diǎn)中有2個(gè)或3個(gè)為0,該數據位被視為0,否則為1。如果3個(gè)采樣點(diǎn)中有一個(gè)采樣點(diǎn)的值與其他兩個(gè)不同,不管是起始位,數據位,奇偶校驗位或者停止位,都將產(chǎn)生噪聲錯誤(NERR)。

9.2.4GD32F470串口設置步驟

串口設置的一般步驟為:

  1. GPIO時(shí)鐘開(kāi)啟、串口時(shí)鐘開(kāi)啟
  2. GPIO設置,發(fā)送和接受都要設置為AF模式,且需要設置為正確的AF號
  3. 串口復位
  4. 串口參數配置,主要為波特率、數據位長(cháng)度、校驗位設置、停止位長(cháng)度
  5. 依據是否需要使用中斷或DMA進(jìn)行中斷配置或DMA配置
  6. 使能串口
  7. 編寫(xiě)中斷處理函數

9.3硬件設計

紫藤派開(kāi)發(fā)板的P1接口將USART0——PA9、PA10引出,讀者可以通過(guò)P1口使用USART0:

wKgZomZBdSWAAhvxAADKvexuyl4120.png

9.4代碼解析

9.4.1在driver_uart.c中定義了串口初始化函數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_DATA(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_DATA(uartx->uart_x),NULL,DMA_Width_8BIT,DMA_MEMORY_TO_PERIPH);
}
}

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重定向函數int fputc(int ch, FILE *f)

要使用Printf,重定向函數fputc是必須的。在C 語(yǔ)言標準庫中,fputc函數是printf 函數內部的一個(gè)函數,功能是將字符ch寫(xiě)入到文件指針file所指向文件的當前寫(xiě)指針位置,簡(jiǎn)單理解就是把字符寫(xiě)入到特定文件中。我們使用USART函數重新修改fputc函數內容,達到類(lèi)似“寫(xiě)入”的功能。

fputc定義在bsp_uart.c中

C
int fputc(int ch, FILE *f)
{
driver_uart_transmit_byte(&BOARD_UART,(uint8_t)ch);
return ch;
}

這個(gè)函數比較簡(jiǎn)單,就是調用了接口driver_uart_transmit_byte,該接口定義在driver_uart.c中:

C
Drv_Err driver_uart_transmit_byte(typdef_uart_struct *uartx,uint8_t data)
{
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.SendSucess=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.SendSucess=1;
uartx->uart_control.Com_Flag.Bits.SendState=0;
return uart_state;
}

這段代碼作用是,循環(huán)去讀串口的TBE標志位,并且將待發(fā)送的數據寫(xiě)到串口寄存器中。

9.4.3main函數實(shí)現

串口初始化完成并定義好fputc重定向函數后,就可以通過(guò)printf函數往電腦上打印數據了。以下main函數:

C
int main(void)
{
//延時(shí)和公共驅動(dòng)部分初始化
driver_init();
//串口初始化,DMA模式開(kāi)啟
BOARD_UART.uart_mode_tx=MODE_DMA;
bsp_uart_init(&BOARD_UART);
bsp_led_init(&LED2);
//打開(kāi)對應串口的中斷
nvic_irq_enable(USART0_IRQn,2,0);
while(1)
{
//printg標準打?。ㄝ営枺?br /> printf_log("\r\ndelay 1s \r\n");
delay_ms(1000);
bsp_led_toggle(&LED2);
printf_log("printf:system driver_tick is %lld \r\n",driver_tick);

//輪訓方式打印
memset(uart_poll_buff,0,50);//清零buff
sprintf((char*)uart_poll_buff,"poll transmit:system driver_tick is %lld \r\n",driver_tick);//格式化字符串
driver_uart_poll_transmit(&BOARD_UART,uart_poll_buff,strlen((const char*)uart_poll_buff));
bsp_lcd_printf("%s",uart_poll_buff);


//中斷方式打印
memset(uart_int_buff,0,50);
sprintf((char*)uart_int_buff,"int transmit:system driver_tick is %lld \r\n",driver_tick);
driver_uart_int_transmit(&BOARD_UART,uart_int_buff,strlen((const char*)uart_int_buff));
bsp_lcd_printf("%s",uart_poll_buff);


//DMA方式打印
memset(uart_dma_buff,0,50);
sprintf((char*)uart_dma_buff,"dma transmit:system driver_tick is %lld \r\n",driver_tick);
driver_uart_dma_transmit(&BOARD_UART,uart_dma_buff,strlen((const char*)uart_dma_buff));
bsp_lcd_printf("%s",uart_poll_buff);

}
}

本例程main函數首先進(jìn)行了延時(shí)函數初始化,并設置了一個(gè)LED燈用來(lái)提示代碼運行。while(1)循環(huán)中先延時(shí)1s,再翻轉一次LED狀態(tài),接著(zhù)使用printf函數打印系統運行tick時(shí)間。

本例程也同步做了printf打印在LCD屏幕的功能,將LCD屏接在紫藤派開(kāi)發(fā)板上后,打印信息將同步在顯示屏上顯示。

9.5實(shí)驗結果

使用USB轉TTL串口的連接線(xiàn)后,配置好串口調試助手,即可看到每秒鐘串口打印的數據了。

教程GD32 MCU方案商聚沃科技原創(chuàng )發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)

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

    關(guān)注

    6008

    文章

    44105

    瀏覽量

    623588
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4579

    瀏覽量

    94984
  • USART
    +關(guān)注

    關(guān)注

    1

    文章

    193

    瀏覽量

    30512
  • GD32
    +關(guān)注

    關(guān)注

    7

    文章

    361

    瀏覽量

    23813
收藏 人收藏

    評論

    相關(guān)推薦

    GD32F470紫藤開(kāi)發(fā)板使用手冊】第十一講 SPI-SPI NOR FLASH讀寫(xiě)實(shí)驗

    通過(guò)本實(shí)驗主要學(xué)習以下內容: ?SPI簡(jiǎn)介 ?GD32F470 SPI簡(jiǎn)介 ?SPI NOR FLASH——GD25Q32ESIGR簡(jiǎn)介 ?使用GD32F470 SPI接口實(shí)現對
    的頭像 發(fā)表于 05-17 09:57 ?795次閱讀
    【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b>派<b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>使用手冊</b>】第十一講 SPI-SPI NOR FLASH讀寫(xiě)<b class='flag-5'>實(shí)驗</b>

    使用GD32F470編譯drv_adc.c時(shí)報錯怎么解決?

    使用GD32F470芯片,編譯drv_adc.c時(shí)報錯好幾個(gè)編譯錯誤,可能是適配GD32F470芯片沒(méi)有適配好。 編譯問(wèn)題如下圖:
    發(fā)表于 02-23 06:55

    這是DE2開(kāi)發(fā)板使用手冊

    DE2開(kāi)發(fā)板使用手冊,有興趣的人可以下載看一下
    發(fā)表于 06-03 17:58

    QC-CPLD開(kāi)發(fā)板快速使用手冊

    `QC-CPLD開(kāi)發(fā)板快速使用手冊.pdf`
    發(fā)表于 10-06 08:11

    FPGA開(kāi)發(fā)板快速使用手冊

    QC-FPGA-C1開(kāi)發(fā)板快速使用手冊.pdf感興趣的可以看看0
    發(fā)表于 10-07 09:24

    【星空GD32F303開(kāi)發(fā)板試用體驗】開(kāi)箱+環(huán)境搭建

    Watchpoint: 4Load "G:\\星空GD32F303開(kāi)發(fā)板\\03 例程\\Project\\04_USART_Printf\\MDK-ARM\\output
    發(fā)表于 10-18 14:15

    【星空GD32F303開(kāi)發(fā)板試用體驗】開(kāi)箱+環(huán)境搭建

    完全,APM32F0xx_SDK解包,到星空GD32F303開(kāi)發(fā)板\03 例程\Project\04_USART_printf\MDK-A
    發(fā)表于 11-02 15:36

    迅為iMX6ULL開(kāi)發(fā)板使用手冊資料下載

    的知識點(diǎn),它都有!《嵌入式Linux開(kāi)發(fā)指南》+《開(kāi)發(fā)板使用手冊》+《裸機使用手冊》鏈接:https://pan.baidu.com/s/1Xat4C-cDa2Gi1UwNckNRTw
    發(fā)表于 12-02 14:13

    現有的BSP工程可以直接在GD32F470上進(jìn)行開(kāi)發(fā)

    大家好:有關(guān)于GD32F470的BSP工程的問(wèn)題咨詢(xún),我在GD官網(wǎng)上查照資料了解470和450是很相似的,目前因為項目需要使用的470芯片,想使用rt-thread的操作系統,但是不知
    發(fā)表于 08-01 10:39

    基于GD32F310開(kāi)發(fā)板實(shí)現USART發(fā)送與串口重定向的設計

    ;#125;}測試串口打印及LED指示代碼運行狀態(tài)使用體驗總體上芯片還是很容易上手的,用戶(hù)手冊加固件庫使用手冊這兩個(gè)文檔一起看,操作外設還是很容易的。原作者:Stark_GS
    發(fā)表于 09-28 10:49

    YL-51開(kāi)發(fā)板使用手冊

    YL-51開(kāi)發(fā)板使用手冊,YL-51開(kāi)發(fā)板使用手冊YL-51開(kāi)發(fā)板使用手冊YL-51
    發(fā)表于 05-10 16:31 ?20次下載

    開(kāi)發(fā)板燒寫(xiě)測試使用手冊

    開(kāi)發(fā)板燒寫(xiě)測試使用手冊,有需要的下來(lái)看看
    發(fā)表于 06-03 14:30 ?0次下載

    GD32F470紫藤開(kāi)發(fā)板使用手冊】第八講 ADC-規則組多通道采樣實(shí)驗

    通過(guò)本實(shí)驗主要學(xué)習以下內容: ?ADC的簡(jiǎn)介 ?GD32F470 ADC工作原理 ?DMA原理 ?規則組多通道循環(huán)采樣
    的頭像 發(fā)表于 05-12 10:00 ?199次閱讀
    【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b>派<b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>使用手冊</b>】第八講 ADC-規則組多通道采樣<b class='flag-5'>實(shí)驗</b>

    GD32F470紫藤開(kāi)發(fā)板使用手冊】第十講 USART-中斷串口收發(fā)實(shí)驗

    通過(guò)本實(shí)驗主要學(xué)習以下內容: ?使用中斷進(jìn)行串口收發(fā)
    的頭像 發(fā)表于 05-14 10:39 ?232次閱讀
    【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b>派<b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>使用手冊</b>】第十講 <b class='flag-5'>USART</b>-中斷串口收發(fā)<b class='flag-5'>實(shí)驗</b>

    GD32H757Z海棠派開(kāi)發(fā)板使用手冊第九USART-printf打印實(shí)驗

    通過(guò)本實(shí)驗主要學(xué)習以下內容: ?串口簡(jiǎn)介 ?GD32H757串口工作原理 ?使用printf打印信息
    的頭像 發(fā)表于 05-15 11:39 ?207次閱讀
    【<b class='flag-5'>GD</b>32H757Z海棠派<b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>使用手冊</b>】<b class='flag-5'>第九</b>講 <b class='flag-5'>USART-printf</b><b class='flag-5'>打印</b><b class='flag-5'>實(shí)驗</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看