| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #include "gd32f30x_usart.h"
- #include "gd32f30x_rcu.h"
- #include "gd32f30x_gpio.h"
- #include "gd32f30x_misc.h"
- #include "gd32f30x_it.h"
- #include "usart.h"
- // PA9
- // PA10
- #if 1
- #pragma import(__use_no_semihosting)
- //标准库需要的支持函数
- struct __FILE
- {
- int handle;
- };
- FILE __stdout;
- //定义_sys_exit()以避免使用半主机模式
- _sys_exit(int x)
- {
- x = x;
- }
- #endif
- //重定义fputc函数
- int fputc(int ch, FILE *f)
- {
- usart_data_transmit(USART0, (uint8_t) ch);
- while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
- return ch;
- }
- #if EN_USART1_RX //如果使能了接收
- //串口1中断服务程序
- //注意,读取USARTx->SR能避免莫名其妙的错误
- u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
- //接收状态
- //bit15, 接收完成标志
- //bit14, 接收到0x0d
- //bit13~0, 接收到的有效字节数目
- u16 USART_RX_STA=0; //接收状态标记
- void uart_init(u32 bound)
- {
- rcu_periph_clock_enable(RCU_GPIOA);
- rcu_periph_clock_enable(RCU_USART0);
-
- //gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
- gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_9);
- gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_10);
-
- usart_deinit(USART0);
- usart_baudrate_set(USART0, bound);
- usart_stop_bit_set(USART0,USART_STB_1BIT);
- usart_word_length_set(USART0,USART_WL_8BIT);
- usart_parity_config(USART0,USART_PM_NONE);
- usart_receive_config(USART0, USART_RECEIVE_ENABLE);
- usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
-
- usart_interrupt_enable(USART0, USART_INT_TBE);
- usart_interrupt_enable(USART0, USART_INT_RBNE);
-
- usart_enable(USART0);
- nvic_irq_enable(USART0_IRQn, 0, 0);
-
- }
- void USART0_IRQHandler(void) //串口1中断服务程序
- {
- u8 Res;
- if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
- {
- usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);
- __NVIC_ClearPendingIRQ(USART0_IRQn);
- Res =usart_data_receive(USART0);//(USART0->DR); //读取接收到的数据
-
- if((USART_RX_STA&0x8000)==0)//接收未完成
- {
- if(USART_RX_STA&0x4000)//接收到了0x0d
- {
- if(Res!=0x0a)
- USART_RX_STA=0;//接收错误,重新开始
- else
- USART_RX_STA|=0x8000; //接收完成了
- }
- }else
- { //还没收到0X0D
- if(Res==0x0d)
- USART_RX_STA|=0x4000;
- else
- {
- USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
- USART_RX_STA++;
- if(USART_RX_STA>(USART_REC_LEN-1))
- USART_RX_STA=0;//接收数据错误,重新开始接收
- }
- }
- }
-
-
- }
- #endif
|