#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");
}
}
}