概述
本章主要配置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é)果
上一篇:GD32F303固件庫(kù)開發(fā)(6)----GPIO輸入函數(shù)說(shuō)明
下一篇:【GD32F470紫藤派開發(fā)板使用手冊(cè)】第十三講 USB_虛擬鍵盤實(shí)驗(yàn)
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 如何計(jì)算單片機(jī)的波特率
- STM32單片機(jī)優(yōu)先級(jí)的定義
- 如何采用STM32單片機(jī)實(shí)現(xiàn)IAP功能
- STM32單片機(jī)對(duì)NAND Flash的讀寫以及在ASF中的使用
- STM32單片機(jī)SysTick系統(tǒng)滴答功能解析
- STM32單片機(jī)定時(shí)器的時(shí)鐘源設(shè)置
- STM32單片機(jī)PID算法的原則及應(yīng)用方法
- 如何采用STM32單片機(jī)中斷向量控制器NVIC來(lái)分配優(yōu)先級(jí)的數(shù)量
- STM32單片機(jī)固件庫(kù)建立工程的方法及步驟
- LTC3621HMS8E-3.3 1.2V 輸出、同步至 600kHz、強(qiáng)制連續(xù)模式同步降壓型穩(wěn)壓器的典型應(yīng)用
- 基于磁性旋轉(zhuǎn)編碼器的 AS5145B-EK-AB-STM1.0、AS5145B Eval-Kit 步進(jìn)電機(jī)
- AKD4621-B,AK4621 24 位音頻編解碼器評(píng)估板
- DC2716A,基于 LT8364 低 IQ 升壓/SEPIC/反相穩(wěn)壓器的演示板,4.5V 至 20VIN 低 EMI 升壓,VOUT = 24V @ 高達(dá) 1.6A,2MHz 開關(guān)
- 用于 SMPS 的 L6566B 多模式控制器的典型(全功能、QR 操作)應(yīng)用
- LTC4229 理想二極管和熱插拔控制器的典型應(yīng)用
- LT1634BCS8-2.5 超準(zhǔn)確 ±4.096V 輸出電壓基準(zhǔn)的典型應(yīng)用
- 面向模擬可編程邏輯控制器模塊的超小型 1W、12V-36V 隔離式電源參考設(shè)計(jì)
- ADR366A 3.3V 輸出低功耗、低噪聲電壓基準(zhǔn)的典型應(yīng)用,具有灌/拉能力
- 使用 Infineon Technologies AG 的 BTS 610 L1 的參考設(shè)計(jì)
- 馬來(lái)西亞重要封測(cè)廠 Unisem Bhd. 停工
- 德企建芯片廠追求技術(shù)自主
- 半導(dǎo)體需求續(xù)旺 封測(cè)業(yè)績(jī)迎來(lái)歷年最高峰
- 淺析電池?zé)崾Э氐臋z測(cè)與BMS的發(fā)展方向
- 負(fù)離子測(cè)試儀的應(yīng)用/原理/特點(diǎn)/參數(shù)
- RSA5000B實(shí)時(shí)頻譜分析儀的性能特點(diǎn)及應(yīng)用范圍
- 使用示波器進(jìn)行開關(guān)電源測(cè)量
- 磁翻板液位計(jì)批量用于DMF的液位測(cè)量
- 我國(guó)自主研發(fā)量子計(jì)算機(jī)核心器件成功交付
- 汽車交流發(fā)電機(jī)的構(gòu)造
- 汽車電源系統(tǒng)常見故障檢修
- 汽車電源系統(tǒng)的工作過(guò)程
- 影響國(guó)內(nèi)電動(dòng)汽車市場(chǎng)發(fā)展的因素有哪些
- 對(duì)于純電動(dòng)汽車來(lái)說(shuō)需要換機(jī)油嗎
- 電動(dòng)汽車對(duì)于懸架的要求會(huì)不會(huì)比較高
- 是德科技探討AI數(shù)據(jù)中心:下一代AI網(wǎng)絡(luò)需要更高階的驗(yàn)證
- 你會(huì)在車上找到哪一些物聯(lián)網(wǎng)技術(shù)
- 區(qū)塊鏈?zhǔn)侨绾螛?gòu)建車聯(lián)網(wǎng)的安全性的
- Microchip推出Adaptec? SmartRAID 4300 系列加速器
- 曠視研究院院長(zhǎng)孫劍:看好自動(dòng)機(jī)器學(xué)習(xí)
- 2019年上半年工業(yè)機(jī)器人數(shù)據(jù)收集整理分析
- 3C行業(yè)對(duì)工業(yè)機(jī)器人的市場(chǎng)需求潛力分析
- stm32實(shí)現(xiàn)1588協(xié)議
- STM32 IO寄存器操作
- STM32 上電后的啟動(dòng)過(guò)程
- 關(guān)于STM32 NVIC配置的解釋
- STM32 FOC SDK 上電電機(jī)自動(dòng)旋轉(zhuǎn)
- STM32系統(tǒng)學(xué)習(xí)——EXTI(外部中斷)
- STM32學(xué)習(xí)14:EXTI(外部中斷事件控制器)
- 在wince下(解決馬上給分):如何自畫對(duì)話框上的標(biāo)題欄?如何讓話框上有標(biāo)題欄而沒有邊框?
- dsp論文系列
- ise14.2 ise14.3 ise14.4 license 支持全系列xilinx 7系列
- 鋰電充電管理IC的工作模式有那幾種?
- 有關(guān)和諧的問題
- STM32F030F4P6多通道ADC DMA采樣數(shù)值為4095問題總結(jié)
- 模擬技術(shù)簡(jiǎn)化移動(dòng)設(shè)備中的LED亮度調(diào)節(jié)
- 對(duì)于員工上班遲到你是如何管理的?
- 匯編程序除法問題
- 驅(qū)動(dòng)程序如何讀取端點(diǎn)0的緩沖?