概述
本章主要配置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é)果
上一篇:GD32F303固件庫開發(fā)(6)----GPIO輸入函數(shù)說明
下一篇:【GD32F470紫藤派開發(fā)板使用手冊】第十三講 USB_虛擬鍵盤實驗
推薦閱讀最新更新時間:2025-05-24 23:30


設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計
- 小型傾轉(zhuǎn)旋翼機(jī)的無刷直流電機(jī)驅(qū)動器設(shè)計
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計
- 基于GPS自動授時的無線智能控制器的設(shè)計
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺控制系統(tǒng)的設(shè)計
- 匠芯創(chuàng)推出面向具身智能高性能實時處理器M7000
- ADP166CB-EVALZ,ADP166 LFCSP LDO 線性穩(wěn)壓器評估板
- LT1024 的典型應(yīng)用 - 雙通道、匹配皮安、微伏輸入、低噪聲運算放大器
- 使用 Analog Devices 的 LTC5800IWR-IPRB 的參考設(shè)計
- ESP32C3墨水屏擺件
- 語音報警
- 使用 Analog Devices 的 LTC1258CMS8-4.1 的參考設(shè)計
- MD1822DB1,基于 MD1822 + TC7920 的演示板:三級高速 100V 2.0A 脈沖發(fā)生器
- OM40003: LPCXpresso54018開發(fā)板
- REF193 精密微功耗、低壓差電壓基準(zhǔn)的典型應(yīng)用
- TAR5S43 點穩(wěn)壓器(低壓差穩(wěn)壓器)的典型應(yīng)用
- 自動駕駛L2與L3有什么區(qū)別?為什么車企不提L3?
- 為什么城市NOA離不開激光雷達(dá)?
- 吉利的“神盾金磚電池”有什么技術(shù)亮點?
- 讓靈感掙脫技術(shù)枷鎖,英特爾攜手D5打造高效AI創(chuàng)作體驗
- 中科曙光與海光信息宣布戰(zhàn)略重組
- 317.95億元!海外占比28%!4月電池新能源投資擴(kuò)產(chǎn)項目大盤點
- 現(xiàn)代汽車啟動AI充電機(jī)器人ACR測試,仁川機(jī)場先行
- 從BEV感知到端到端自動駕駛
- 高效價值被關(guān)注,大圓柱電池又風(fēng)生水起
- 吉利電池安全標(biāo)準(zhǔn)升級,“神盾金磚電池”有什么技術(shù)亮點?