娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

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

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

概述

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

在這里插入圖片描述

樣品申請

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

硬件準(zhǔn)備

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

在這里插入圖片描述

keil配置

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

在這里插入圖片描述

串口初始化

對串口進(jìn)行配置。 使用串口時候,需要對GPIO進(jìn)行復(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進(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);

        }

測試結(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);    //開啟后會進(jìn)入中斷進(jìn)行發(fā)送,故需要進(jìn)行一個延遲

定義發(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);    //開啟后會進(jìn)入中斷進(jìn)行發(fā)送,故需要進(jìn)行一個延遲            


    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é)果

在這里插入圖片描述


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

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

推薦閱讀最新更新時間:2025-05-24 23:30

《STM32庫開發(fā)實戰(zhàn)指南 》USART
補(bǔ)充幾個當(dāng)時還不會的知識點。 發(fā)送寄存器 寄存器 功能 TE 發(fā)送使能 TXE 發(fā)送單個字節(jié)的時候使用,檢查發(fā)送寄存器為空? TC 發(fā)送字符串的時候使用,實質(zhì)上時多次調(diào)用發(fā)送單字符的函數(shù),但是最后一次退出前要檢查TC,發(fā)送完成寄存器 TXIE 發(fā)送完成中斷使能 printf的多態(tài) 我們可以在Keil5中的工程選項中,勾選Use MicroLIB,這樣我們就可以在工程中使用stdio.h頭文件了。 當(dāng)然了,單片機(jī)又沒有屏幕和鍵盤,所以原來printf、scanf的實現(xiàn)方法當(dāng)然不能用了,不過我們可以通過串口的方式來實現(xiàn)其。按照串口的方法,將要顯示的內(nèi)容輸出到串口,將要獲得的字符從串口中讀取,那么無論是printf
[單片機(jī)]
L2-2 Keil5-MDK軟件STM32工程仿真(USART篇)
前置條件 已創(chuàng)建STM32工程(本文以STM32F103ZE系列芯片為例) 已完成USART1的驅(qū)動程序編寫(包括printf的硬件重定向) 代碼示例 usart.h #ifndef _USART_H_ #define _USART_H_ #include stm32f10x.h #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif void Usart_Init(void); // 對外提供的
[單片機(jī)]
STM32的USART發(fā)送數(shù)據(jù)時如何使用TXE和TC標(biāo)志呢?
USART 是 STM32 中非常重要的外設(shè)之一,用于串行通信,其中包括串口通信(RS232、RS485)、SPI 和 I2C 等多種串行通信協(xié)議。USART 在 STM32 中有多個實例,包括 USART1、USART2 等,其特性和功能也不完全相同。 在發(fā)送數(shù)據(jù)時,USART 需要使用 TXE 和 TC 標(biāo)志位。TXE 表示數(shù)據(jù)寄存器空,表示 USART 數(shù)據(jù)發(fā)送寄存器中的數(shù)據(jù)已被全部發(fā)送出去,可以直接寫入新的數(shù)據(jù)。TC 標(biāo)志表示傳輸完成,表示 USART 發(fā)送完全部數(shù)據(jù),且寄存器都為空。 下面我們來看一下 STM32 的 USART 發(fā)送數(shù)據(jù)時如何使用 TXE 和 TC 標(biāo)志位。 1.USART 數(shù)據(jù)寄存器有兩種模式:8 位
[單片機(jī)]
直接使用單片機(jī)的USART發(fā)送數(shù)據(jù)
一、使用USART發(fā)送數(shù)據(jù) ??我們在寫單片機(jī)程序的時候,在Debug時,往往要用到串口輸出信息,這是會使用printf打印出我們想要的信息來,但是printf有一個弊端,就是輸出打印時間較長。這樣在一些對時間精度要求非常高的場合,使用printf將會帶來一系列問題,這時,如果使用單片機(jī)的USART自定義一個協(xié)議,直接發(fā)送數(shù)據(jù)到上位機(jī),將會得到我們想要的效果。下面對怎樣使用USART發(fā)送數(shù)據(jù)做一個整理。 1、發(fā)送單個字符 void USART1_PutChar(u8 ch) { USART_SendData8(USART1,(u8)ch); while(USART_GetFlagStatus(USART1,USART_
[單片機(jī)]
PIC18F45K80 USART
初期參考了三篇文章 1、 PIC18F45K80單片機(jī)串口調(diào)試總結(jié) http://blog.csdn.net/sandyde123/article/details/48091535 2、 用示波器 查看波特率是多少? http://blog.csdn.net/androidolblog/article/details/47659149 3、 關(guān)于示波器測485串口波特率的使用方法總結(jié) http://blog.csdn.net/lianxue1986/article/details/50385384 根據(jù)手冊 /* * File: Main.c * Author: Alex * 單片機(jī)型號:
[單片機(jī)]
PIC18F45K80 <font color='red'>USART</font>
STM32F4CubeMX學(xué)習(xí)筆記之USART1
開發(fā)板:普中PZ6808L-F4 開發(fā)環(huán)境:keil5+CnbeMx 硬件資源:2個LED 1個串口 功能說明:LED2閃爍表示系統(tǒng)在運行 LED1通過串口控制 CnbeMx配置為 int fputc(int ch,FILE *f)//重新定義串口輸出使用printf功能 { uint8_t temp ={ch}; HAL_UART_Transmit(&huart1,temp,1,2); return(ch); } // 函數(shù)功能: 重定向c庫函數(shù)getchar,scanf到DEBUG_USARTx int fgetc(FILE * f) { uint8_t ch = 0; HAL_UAR
[單片機(jī)]
STM32F4CubeMX學(xué)習(xí)筆記之<font color='red'>USART</font>1
STM8L051 同時使用RTC和USART通信
在STM8L051中,管腳定義如下: 其中RTC時鐘管腳與USART通信管腳復(fù)用了 故需要重映射管腳,將USART的TX RX的管腳映射到別的腳上去,使用下面的代碼將TX RX映射到PA2 PA3去, SYSCFG_RMPCR1 &= (uint8_t)((uint8_t)((uint8_t)0x011C 4) | (uint8_t)0x0F); SYSCFG_RMPCR1 |= (uint8_t)((uint16_t)0x011C & (uint16_t)0x00F0); 之后只需正常配置PA2、PA3的模式,USART的參數(shù)即可實現(xiàn)USART通信。
[單片機(jī)]
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

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

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 湛江市| 阿图什市| 福州市| 松阳县| 华亭县| 札达县| 张家口市| 任丘市| 美姑县| 衡阳市| 南华县| 海南省| 桑日县| 会宁县| 屏东县| 阿勒泰市| 松溪县| 双峰县| 达拉特旗| 天门市| 个旧市| 凉城县| 阿勒泰市| 丁青县| 满洲里市| 门源| 高台县| 台山市| 武鸣县| 固安县| 石柱| 阿尔山市| 清新县| 准格尔旗| 永顺县| 长阳| 梁河县| 昆山市| 原阳县| 炎陵县| 徐汇区|