日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

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

發(fā)布者:RadiantSerenity最新更新時(shí)間:2024-11-19 來(lái)源: elecfans關(guān)鍵字:GD32F303  固件庫(kù)開發(fā)  USART  收發(fā)配置 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

概述

本章主要配置printf進(jìn)行打印。 查閱手冊(cè)可以得知,PA9、PA10為串口0的輸出和輸入口。

在這里插入圖片描述

樣品申請(qǐng)

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

硬件準(zhǔn)備

這里準(zhǔn)備了1塊開發(fā)板進(jìn)行驗(yàn)證,分別是GD32303C_START開發(fā)板。

在這里插入圖片描述

keil配置

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

在這里插入圖片描述

串口初始化

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


/* 使能GPI0A,用PA9、PA10為串口 */

    rcu_periph_clock_enable(RCU_GPIOA);


    /*使能串口0的時(shí)鐘 */

    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ù)字長(zhǎng)

    usart_stop_bit_set(USART0, USART_STB_1BIT);               // 停止位1位

    usart_parity_config(USART0, USART_PM_NONE);           // 無(wú)奇偶校驗(yàn)位

    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進(jìn)行打印。


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);

        }

測(cè)試結(jié)果

在這里插入圖片描述

中斷發(fā)送

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

在這里插入圖片描述

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


/*開啟USART0中斷 */

    nvic_irq_enable(USART0_IRQn, 0, 0);

    /* 使能串口發(fā)送中斷 */  

    usart_interrupt_enable(USART0, USART_INT_TBE);

    delay_1ms(1000);    //開啟后會(huì)進(jìn)入中斷進(jìn)行發(fā)送,故需要進(jìn)行一個(gè)延遲

定義發(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ù)長(zhǎng)度

__IO uint8_t txcount = 0; //發(fā)送數(shù)據(jù)長(zhǎng)度

串口中斷定義。


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ā)送一個(gè)八位數(shù)據(jù)

        if(txcount == tx_size)//發(fā)送完畢

                {

            usart_interrupt_disable(USART0, USART_INT_TBE);//關(guān)閉發(fā)送中斷

        }

    }

}


測(cè)試結(jié)果

在這里插入圖片描述

中斷接收

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

在這里插入圖片描述

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


/*開啟USART0中斷 */

    nvic_irq_enable(USART0_IRQn, 0, 0);

    /* 使能串口發(fā)送中斷 */  

    usart_interrupt_enable(USART0, USART_INT_TBE);

        delay_1ms(1000);    //開啟后會(huì)進(jìn)入中斷進(jìn)行發(fā)送,故需要進(jìn)行一個(gè)延遲            


    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;//需要接收長(zhǎng)度

__IO uint16_t rxcount = 0; //實(shí)際接收長(zhǎng)度

串口中斷定義。


/*!

    \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ā)送一個(gè)八位數(shù)據(jù)

        if(txcount == tx_size)//發(fā)送完畢

                {

            usart_interrupt_disable(USART0, USART_INT_TBE);//關(guān)閉發(fā)送中斷

        }

    }

}

測(cè)試結(jié)果

在這里插入圖片描述


關(guān)鍵字:GD32F303  固件庫(kù)開發(fā)  USART  收發(fā)配置 引用地址:GD32F303固件庫(kù)開發(fā)(8)----USART收發(fā)配置

上一篇:GD32F303固件庫(kù)開發(fā)(6)----GPIO輸入函數(shù)說(shuō)明
下一篇:【GD32F470紫藤派開發(fā)板使用手冊(cè)】第十三講 USB_虛擬鍵盤實(shí)驗(yàn)

小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved