一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

GD32F303固件庫開發(fā)(8)----USART收發(fā)配置

嵌入式單片機MCU開發(fā) ? 來源: 嵌入式單片機MCU開發(fā) ? 作者: 嵌入式單片機MC ? 2022-11-28 17:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概述

本章主要配置printf進行打印。 查閱手冊可以得知,PA9、PA10為串口0的輸出和輸入口。需要GD樣片的可以加群申請:615061293。

在這里插入圖片描述

樣品申請

https://www.wjx.top/vm/wFGhGPF.aspx#

硬件準備

這里準備了1塊開發(fā)板進行驗證,分別是GD32303C_START開發(fā)板。

在這里插入圖片描述

keil配置

microlib 進行了高度優(yōu)化以使代碼變得很小。 它的功能比缺省 C 庫少,并且根本不具備某些 ISO C 特性。 某些庫函數(shù)的運行速度也比較慢,如果要使用printf(),必須開啟。

在這里插入圖片描述

串口初始化

對串口進行配置。 使用串口時候,需要對GPIO進行復(fù)用這里把串口的 Tx 引腳配置為復(fù)用推挽輸出,Rx 引腳為浮空輸入。 設(shè)置USART0 通信參數(shù)為:波特率 115200,字長為 8,1 個停止位,沒有校驗位,收發(fā)一體工作模式,然后調(diào)用 USART 初始化函數(shù)完成配置。

/* 使能GPI0A,用PA9、PA10為串口 */
    rcu_periph_clock_enable(RCU_GPIOA);

    /*使能串口0的時鐘 */
    rcu_periph_clock_enable(RCU_USART0);

    /*配置USARTx_Tx(PA9)為復(fù)用推挽輸出*/
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);

    /*配置USARTx_RxPA9)為浮空輸入 */
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

    /* USART 配置 */
    usart_deinit(USART0);//重置串口0
    usart_baudrate_set(USART0, 115200U);//設(shè)置串口0的波特率為115200
    usart_word_length_set(USART0, USART_WL_8BIT);          // 幀數(shù)據(jù)字長
    usart_stop_bit_set(USART0, USART_STB_1BIT);               // 停止位1位
    usart_parity_config(USART0, USART_PM_NONE);           // 無奇偶校驗位
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);//使能接收器
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//使能發(fā)送器
    usart_enable(USART0);//使能USART

串口重定向

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART0, (uint8_t)ch);
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    return ch;
}

串口重定向后就可以使用printf進行打印。

usart_data_transmit()發(fā)送

usart_data_transmit()是USART發(fā)送數(shù)據(jù)函數(shù)。 定義發(fā)送函數(shù)。

void uart_data_transmit(uint8_t arr[], uint32_t length) 
{
    uint32_t i;
    for(i=0; iusart_data_transmit(USART0, arr[i]);
        while (usart_flag_get(USART0, USART_FLAG_TBE)== RESET);
    }
}

在主程序中添加代碼,打印HELLO!

while (1)
        {
            uint8_t str[] = "HELLO!\\r\\n";
            uint32_t len =  sizeof(str) / sizeof(*str);
            uart_data_transmit(str,len-1);
            delay_1ms(1000);
        }

測試結(jié)果

在這里插入圖片描述

中斷發(fā)送

若要使用串口的中斷函數(shù)USART0_IRQHandler(),需要先開啟串口中斷。

在這里插入圖片描述

對于中斷發(fā)送,需要usart_interrupt_enable()開啟發(fā)送緩沖區(qū)空中斷。 搶占優(yōu)先級,數(shù)字越小,優(yōu)先級越高。 若搶占優(yōu)先級相同,判斷子優(yōu)先級,同樣,數(shù)字越小,優(yōu)先級越高。

/*開啟USART0中斷 */
    nvic_irq_enable(USART0_IRQn, 0, 0);
    /* 使能串口發(fā)送中斷 */  
    usart_interrupt_enable(USART0, USART_INT_TBE);
    delay_1ms(1000);    //開啟后會進入中斷進行發(fā)送,故需要進行一個延遲

定義發(fā)送變量。

#define ARRAYNUM(arr_nanme)      (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme)))
#define TRANSMIT_SIZE            (ARRAYNUM(txbuffer) - 1)
uint8_t txbuffer[] = "\\n\\rUSART interrupt test\\n\\r";//發(fā)送的數(shù)據(jù)
uint8_t tx_size = TRANSMIT_SIZE;//需要發(fā)送數(shù)據(jù)長度
__IO uint8_t txcount = 0; //發(fā)送數(shù)據(jù)長度

串口中斷定義。

void USART0_IRQHandler(void)
{

    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE))//發(fā)送
        {
        /* transmit data */
        usart_data_transmit(USART0, txbuffer[txcount++]);//發(fā)送一個八位數(shù)據(jù)
        if(txcount == tx_size)//發(fā)送完畢
                {
            usart_interrupt_disable(USART0, USART_INT_TBE);//關(guān)閉發(fā)送中斷
        }
    }
}

測試結(jié)果

在這里插入圖片描述

中斷接收

若要使用串口的中斷函數(shù)USART0_IRQHandler(),需要先開啟串口中斷。

在這里插入圖片描述

對于中斷接收,需要usart_interrupt_enable()開啟接收中斷。 搶占優(yōu)先級,數(shù)字越小,優(yōu)先級越高。 若搶占優(yōu)先級相同,判斷子優(yōu)先級,同樣,數(shù)字越小,優(yōu)先級越高。

/*開啟USART0中斷 */
    nvic_irq_enable(USART0_IRQn, 0, 0);
    /* 使能串口發(fā)送中斷 */  
    usart_interrupt_enable(USART0, USART_INT_TBE);
        delay_1ms(1000);    //開啟后會進入中斷進行發(fā)送,故需要進行一個延遲            

    while(RESET == usart_flag_get(USART0, USART_FLAG_TC));//USART_FLAG_TC發(fā)送完成中斷
     /* 使能串口接收中斷*/  
    usart_interrupt_enable(USART0, USART_INT_RBNE);  

    /* 等待接收完畢 */
    while(rxcount < rx_size);
    if(rxcount == rx_size)
        printf("\\n\\r接收完畢,接收數(shù)據(jù)是:");
        uart_data_transmit(rxbuffer,rx_size);//發(fā)送接收數(shù)據(jù)
        printf("\\n\\r");

定義發(fā)送變量。

uint8_t rxbuffer[10];//接收數(shù)組
uint8_t rx_size = 10;//需要接收長度
__IO uint16_t rxcount = 0; //實際接收長度

串口中斷定義。

/*!
    \\brief      this function handles USART RBNE interrupt request and TBE interrupt request
    \\param[in]  none
    \\param[out] none
    \\retval     none
*/
void USART0_IRQHandler(void)
{
    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){
        /* receive data */
        rxbuffer[rxcount++] = usart_data_receive(USART0);
        if(rxcount == rx_size){
            usart_interrupt_disable(USART0, USART_INT_RBNE);
        }
    }
    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE))//發(fā)送
        {
        /* transmit data */
        usart_data_transmit(USART0, txbuffer[txcount++]);//發(fā)送一個八位數(shù)據(jù)
        if(txcount == tx_size)//發(fā)送完畢
                {
            usart_interrupt_disable(USART0, USART_INT_TBE);//關(guān)閉發(fā)送中斷
        }
    }
}

測試結(jié)果

在這里插入圖片描述

審核編輯 黃昊宇

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

    關(guān)注

    2

    文章

    98

    瀏覽量

    15281
  • gd32f303
    +關(guān)注

    關(guān)注

    4

    文章

    38

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    STM32/GD32開發(fā)板基本串口RS232\\RS485通信及CAN接口 usbhid升級 U盤升級 sd卡升級升級學習方案開發(fā)

    STM32F103/STM32F407/gd32F103/GD32F303開發(fā)板,例程用標準
    發(fā)表于 02-27 14:56

    GD-LINK無法在KEIL上調(diào)試怎么解決?

    :startup_stm32f10x_hd.s。 驅(qū)動:st的標準驅(qū)動,如stm32f10x_gpio.c。 KEIL配置:芯片型號GD32F30
    發(fā)表于 02-27 08:24

    GD32F1x0硬件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《GD32F1x0硬件開發(fā)指南.pdf》資料免費下載
    發(fā)表于 02-09 15:39 ?0次下載
    <b class='flag-5'>GD32F</b>1x0硬件<b class='flag-5'>開發(fā)</b>指南

    GD32F10x硬件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《GD32F10x硬件開發(fā)指南.pdf》資料免費下載
    發(fā)表于 02-07 17:30 ?0次下載
    <b class='flag-5'>GD32F</b>10x硬件<b class='flag-5'>開發(fā)</b>指南

    GD32F30x和GD32F403硬件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《GD32F30x和GD32F403硬件開發(fā)指南.pdf》資料免費下載
    發(fā)表于 02-07 17:21 ?2次下載
    <b class='flag-5'>GD32F</b>30x和<b class='flag-5'>GD32F</b>403硬件<b class='flag-5'>開發(fā)</b>指南

    GD32F4xx硬件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《GD32F4xx硬件開發(fā)指南.pdf》資料免費下載
    發(fā)表于 02-07 17:20 ?1次下載
    <b class='flag-5'>GD32F</b>4xx硬件<b class='flag-5'>開發(fā)</b>指南

    GD32F3x0硬件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《GD32F3x0硬件開發(fā)指南.pdf》資料免費下載
    發(fā)表于 02-07 17:19 ?1次下載
    <b class='flag-5'>GD32F</b>3x0硬件<b class='flag-5'>開發(fā)</b>指南

    GD32F20x硬件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《GD32F20x硬件開發(fā)指南.pdf》資料免費下載
    發(fā)表于 02-07 16:19 ?0次下載
    <b class='flag-5'>GD32F</b>20x硬件<b class='flag-5'>開發(fā)</b>指南

    AN136 基于GD32F30x系列的IEC60730 ClassB移植指南

    電子發(fā)燒友網(wǎng)站提供《AN136 基于GD32F30x系列的IEC60730 ClassB移植指南.pdf》資料免費下載
    發(fā)表于 01-17 16:22 ?1次下載
    AN136 基于<b class='flag-5'>GD32F</b>30x系列的IEC60730 ClassB<b class='flag-5'>庫</b>移植指南

    基于GD32F3x0系列的IEC60730 ClassB移植指南

    電子發(fā)燒友網(wǎng)站提供《基于GD32F3x0系列的IEC60730 ClassB移植指南.pdf》資料免費下載
    發(fā)表于 01-17 14:41 ?2次下載
    基于<b class='flag-5'>GD32F</b>3x0系列的IEC60730 ClassB<b class='flag-5'>庫</b>移植指南

    GD32 MCU 移植教程】10、從STM32F030系列移植到GD32E230系列

    GD32E230 對比 STM32F030 有著很好的兼容性和更高的性價比,內(nèi)核和外設(shè)都有所增強。本人曾做過產(chǎn)品的 MCU 替換,將基于 STM32F0xx 1.5.0 固件
    的頭像 發(fā)表于 09-07 10:24 ?1574次閱讀
    【<b class='flag-5'>GD</b>32 MCU 移植教程】10、從STM32<b class='flag-5'>F</b>030系列移植到<b class='flag-5'>GD</b>32E230系列

    GD32 MCU 移植教程】7、從 GD32F10x 移植到 GD32E103

    本應(yīng)用筆記旨在幫助您快速將基于 GD32F10x 2.0 版本及以上固件開發(fā)的應(yīng)用程序從GD32F10x 系列微控制器移植到
    的頭像 發(fā)表于 09-05 09:40 ?1146次閱讀
    【<b class='flag-5'>GD</b>32 MCU 移植教程】7、從 <b class='flag-5'>GD32F</b>10x 移植到 <b class='flag-5'>GD</b>32E103

    GD32 MCU 移植教程】2、從 GD32F303 移植到 GD32F503

    GD32E503 系列是 GD 推出的 Cortex_M33 系列產(chǎn)品,該系列資源上與 GD32F303 兼容度非常高,本應(yīng)用筆記旨在幫助您快速將應(yīng)用程序從 GD32F303 系列微控
    的頭像 發(fā)表于 08-31 09:36 ?2216次閱讀
    【<b class='flag-5'>GD</b>32 MCU 移植教程】2、從 <b class='flag-5'>GD32F303</b> 移植到 <b class='flag-5'>GD32F</b>503

    GD32E507V-START USART0收到數(shù)據(jù)是亂碼的原因?

    32E507V_START_Demo_Suites\\Projects\\04_USART_HyperTerminal_Interrupt USART0的配置: static void usa
    發(fā)表于 07-26 07:44

    GD32F303使用KEIL仿真,JLINK連不上什么原因?需要怎么設(shè)置?

    GD32F303使用KEIL仿真,JLINK連不上什么原因?需要怎么設(shè)置?
    發(fā)表于 07-26 06:34