最近看到有不少人问USART_FLAG_TC 与 USART_FLAG_TXE的区别是什么,我今天就抽时间详谈此事。 先说串口收发过程: 对于CPU来说,只需要将数据填入发送数据寄存器中就可以启动串口发送了,因为数据寄存器中的数据会由硬件自动打入发送移位寄存器中;同理,接收移位寄存器中一旦接收到一字节的数据后,移位寄存器中的数据会被...
在while(1)循环中循环查询uart_receive_complete_flag标志位,当该标志位为“SET”时,表示IDLE中断被触发,一帧数据接受完,最后将接收到的帧数据通过中断发送方式原封不动发送到串口上。10.4.4 中断函数 在bsp_uart.c中定义了串口中断处理函数 在driver_uart.c中定义了driver_uart_int_handler函数:10.5 ...
int fputc(int ch,FILE *f) //重定向C库函数,可使用printf { USART_SendData(USART1,(u8) ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //等待发送完毕 return ch; } int fgetc(FILE *f) //重定向后可使用scan、getchar { while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)...
usart_flag_clear(uartx->uart_x,USART_FLAG_TC); usart_interrupt_enable(uartx->uart_x,USART_INT_TBE);return DRV_SUCCESS; } 10.4.2 串口中断接受函数 在driver_uart.c中定义了串口中断接受函数: C Drv_Err driver_uart_int_receive(typdef_uart_struct *uartx,uint8_t *pbuff,uint16_t length)...
USART_ClearFlag(USART1, USART_FLAG_TC); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3 ...
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. ...
unsignedintk=0; do { Usart_SendByte(pUSARTx, *(str + k)); k++; }while(*(str + k)!='\0'); /* 等待发送完成 */ while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC) == RESET); } (3)修改main.c 1 2 3 4 5 6 7 8
intfputc(intch,FILE*stream){// 每次发送数据前,确保TC位被清空,防止接收不到第一位字符USART_ClearFlag(USART1,USART_FLAG_TC);USART_SendData(USART1,(u8)ch);while(!USART_GetFlagStatus(USART1,USART_FLAG_TC));returnch;}
usart_flag_clear(uartx->uart_x,USART_FLAG_TC); usart_interrupt_enable(uartx->uart_x,USART_INT_TBE); return DRV_SUCCESS; } 10.4.2 串口中断接受函数 在driver_uart.c中定义了串口中断接受函数: CDrv_Err driver_uart_int_receive(typdef_uart_struct *uartx,uint8_t *pbuff,uint16_t length){...
int main(void) { usart_init(); printf("GD32 WELCOME"); while(txcount<tx_size) { while(RESET!=usart_flag_get(USART0,USART_FLAG_TBE)){ usart_data_transmit(USART0,txbuffer[txcount++]); } while(RESET==usart_flag_get(USART0,USART_FLAG_TC)); ...