usart串口配置(与中断函数)

本文介绍了如何在GD32F30x微控制器中使用USART0进行串口通信,包括发送和接收字节函数,以及使用中断处理接收数据并将数据存入DataBuffer。同时展示了中断触发时如何处理接收到的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "gd32f30x.h" 
#include "stdio.h"


void UsartSendByte(uint32_t usart,unsigned char dat){
    while( !usart_flag_get(usart,USART_FLAG_TBE));
    usart_data_transmit(usart,dat);
    while( !usart_flag_get(usart,USART_FLAG_TC));
}

unsigned char UsartRecvByte(uint32_t usart){
    while( !usart_flag_get(usart,USART_FLAG_RBNE) );
    return usart_data_receive(usart);
}

int fputc(int c, FILE * stream){
    UsartSendByte(USART0,c);
    return c;
}

static unsigned char DataBuffer[128] ={0};
#define DATA_BUFFER_LEN sizeof(DataBuffer)
volatile int DB_WPos = 0;
volatile int DB_RPos = 0;

char DataBufferHasData(){ return DB_WPos!=DB_RPos; }

void DataBufferWrite(unsigned char data){
    int pos = DB_WPos;
    DataBuffer[pos] = data;
    if( pos+1 < DATA_BUFFER_LEN ){ ++DB_WPos; }
    else{ DB_WPos=0; }
}

unsigned char DataBufferRead(){
    int pos = DB_RPos;
    if( pos+1 < DATA_BUFFER_LEN ){ ++DB_RPos; }
    else{ DB_RPos=0; }
    return DataBuffer[pos];
}

void USART0_IRQHandler(){
    if( usart_interrupt_flag_get(USART0,USART_INT_FLAG_RBNE)){
        usart_interrupt_flag_clear(USART0,USART_INT_FLAG_RBNE);
        unsigned data = usart_data_receive(USART0);
        DataBufferWrite(data);
    }
}

int fgetc(FILE *stream){
    while( !DataBufferHasData() );
    return DataBufferRead();
    //return UsartRecvByte(USART0);
}

int main(){
    rcu_periph_clock_enable(RCU_AF);
    
//    rcu_periph_clock_enable(RCU_GPIOA);
//    gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_2MHZ,GPIO_PIN_9);
//    gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_2MHZ,GPIO_PIN_10);
    
    rcu_periph_clock_enable(RCU_GPIOB);
    gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_2MHZ,GPIO_PIN_6);
    gpio_init(GPIOB,GPIO_MODE_IPU,GPIO_OSPEED_2MHZ,GPIO_PIN_7);
    gpio_pin_remap_config(GPIO_USART0_REMAP,ENABLE);
    
    rcu_periph_clock_enable(RCU_USART0);
    usart_deinit(USART0);
    usart_baudrate_set(USART0,115200);
    usart_parity_config(USART0,USART_PM_NONE);
    usart_word_length_set(USART0,USART_WL_8BIT);
    usart_stop_bit_set(USART0,USART_STB_1BIT);
    
    usart_transmit_config(USART0,USART_TRANSMIT_ENABLE);
    usart_receive_config(USART0,USART_RECEIVE_ENABLE);
    usart_interrupt_enable(USART0,USART_INT_RBNE);
    usart_enable(USART0);
    
    nvic_irq_enable(USART0_IRQn,0,0);
    
    int a=0,b=0;
    while(1){
//        unsigned dat = UsartRecvByte(USART0);
//        UsartSendByte(USART0,dat);
        printf("intput two number A,B\r\n",12334);
        int ret = scanf("%d%d",&a,&b);
        if( 2 == ret){
            printf("you input %d + %d = %d\r\n",a,b,a+b);            
        }else{
            printf("input error\r\n");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值