UART | 您所在的位置:网站首页 › usart波特率最大 › UART |
UART非常见波特率调试 应用笔记 串口通信中的波特率选择,对于确保可靠的数据传输至关重要。波特率是衡量单位时间内传输的比特数,常见的波特率包括300、1200、2400、9600、115200等。不同波特率适用于不同的应用场景和通信要求。较低的波特率适用于较长的通信距离或对传输速度要求不高的应用,较高的波特率适用于较短的通信距离或对实时性要求较高的应用。 在选择波特率时,需要考虑通信设备的支持能力、噪声干扰、传输距离和所需的传输速度等因素。同时,通信双方必须使用相同的波特率设置,以确保通信的正确进行。在项目的开发中,有时需要使用一些非常见波特率,比如使用20M晶振,获得准确的2.5M波特率。此时诸如 CH340、343 就无法在此类波特率下完成通信。 此时,我们可以选用 CH347 芯片,其最大支持9M波特率,支持非常见波特率配置,用于辅助调试 CH32V 系列非常见波特率串口通信功能。这里选用 CH32V203C8T6 芯片进行测试,外部8M晶振,系统时钟选择120MHz,APB1&2 总线1分频. 1. GPIO_InitTypeDef GPIO_InitStructure = {0}; 2. USART_InitTypeDef USART_InitStructure = {0}; 3. 4. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); 5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 6. 7. /* USART2 TX-->A.2 RX-->A.3 */ 8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 11. GPIO_Init(GPIOA, &GPIO_InitStructure); 12. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; 13. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 14. GPIO_Init(GPIOA, &GPIO_InitStructure); 15. 16. USART_InitStructure.USART_BaudRate = 2500000; 17. USART_InitStructure.USART_WordLength = USART_WordLength_8b; 18. USART_InitStructure.USART_StopBits = USART_StopBits_1; 19. USART_InitStructure.USART_Parity = USART_Parity_No; 20. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 21. USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; 22. 23. USART_Init(USART2, &USART_InitStructure); 24. 25. DMA_Cmd(DMA1_Channel7, ENABLE); /* USART2 Tx */ 26. DMA_Cmd(DMA1_Channel6, ENABLE); /* USART2 Rx */ 27. 28. USART_Cmd(USART2, ENABLE); 29. 30. DMA_InitTypeDef DMA_InitStructure = {0}; 31. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); 32. 33. DMA_DeInit(DMA1_Channel7); 34. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DATAR); 35. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)RxBuffer1; 36. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; 37. DMA_InitStructure.DMA_BufferSize = TxSize1; 38. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 39. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 40. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; 41. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; 42. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; 43. DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; 44. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; 45. DMA_Init(DMA1_Channel7, &DMA_InitStructure); 46. 47. DMA_DeInit(DMA1_Channel6); 48. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DATAR); 49. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)RxBuffer1; 50. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; 51. DMA_InitStructure.DMA_BufferSize = TxSize1; 52. DMA_Init(DMA1_Channel6, &DMA_InitStructure); 串口2使用非常见波特率2.5M、8位数据位、1位停止位、无校验位、无硬件流控,DMA 发送与接收使用相同数组,目的是将接收后数据再次发送出来,使用 DMA 可有效避免串口数据的丢失,在一定程度上也能够提高单片机的工作效率。 1. USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); 2. while(DMA_GetFlagStatus(DMA1_FLAG_TC6) == RESET); 3. 4. USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE); 5. while(DMA_GetFlagStatus(DMA1_FLAG_TC7) == RESET); 主函数中首先使能了 DMA 接收通道,等待接收完成后,再使能发送通道,将接收的数据再次发送出去。执行完成后,由于 DMA 计数未复位,如果再次向串口发送数据,单片机也不会将数据转发出来。 我们可以通过示波器的解码功能,观察串口转发后的数据是否与发送的数据一致,也可通过 CH347 评估板以及提供的上位机 Demo 接收串口转发数据。通过将 CH347 串口2收发引脚与 CH32V203C8T6 串口2收发引脚交叉连接,并在上位机中配置 2.5M 串口波特率后,即可接收到经由芯片转发后的串口数据。 |
CopyRight 2018-2019 实验室设备网 版权所有 |