前言
本文来分享串口的收发测试,以及串口的最大工作速率。
过程
使用me32g030_sdk_v1\example\uart0_interrupt\MDK\demo.uvprojx进行测试
PA和PA3对应UART1,板载通过CH340N接到USB转串口
初始化代码
//init UART pin
PA2_INIT(PA2_UART1_TX);
PA3_INIT(PA3_UART1_RX);
//initial UART1
// UART_Open(UART1,256000,UART_NO_PARITY,UART_TRIGGER_LEVEL_1_BYTE);
// UART_Open(UART1,115200,UART_NO_PARITY,UART_TRIGGER_LEVEL_1_BYTE);
// UART_Open(UART1,128000,UART_NO_PARITY,UART_TRIGGER_LEVEL_1_BYTE);
// UART_Open(UART1,57600,UART_NO_PARITY,UART_TRIGGER_LEVEL_1_BYTE);
UART_Open(UART1,115200,UART_NO_PARITY,UART_TRIGGER_LEVEL_4_BYTES);
// UART_Open(UART1,38400,UART_NO_PARITY,UART_TRIGGER_LEVEL_1_BYTE);
// UART_Open(UART1,19200,UART_NO_PARITY,UART_TRIGGER_LEVEL_1_BYTE);
// UART_Open(UART1,14400,UART_NO_PARITY,UART_TRIGGER_LEVEL_1_BYTE);
// UART_Open(UART1,9600,UART_NO_PARITY,UART_TRIGGER_LEVEL_1_BYTE);
UART_EnableInt(UART1, UART_RX_INT);
NVIC_EnableIRQ(UART1_IRQn);
接收中断收到数据原样返回
void UART1_IRQHandler(void)
{
uint8_t byte_data;
if (UART1->LSR_b.RDR)
{
if((UART1->LSR_b.THRE))
{
byte_data = UART1->RBR;
UART1->THR= byte_data;
}
}
}
上位机发送开发板原样返回
115200波特率实测为(9bit 78uS)
1/(78/9)
115385Hz
1.5M
UART_Open(UART1,1500000,UART_NO_PARITY,UART_TRIGGER_LEVEL_4_BYTES);
实测9个bit6us
1.5M
实测最大只能到1.5MHz
temp=SystemCoreClock/(baudrate);
uart->DLR=temp>>4;
uart->FRAC=temp&0xF;
应为要保证DLR至少要为1
所以temp至少要为16,即baudrate最大为24000000/16=1.5MHz
如果还要加大速率则需要提高SystemCoreClock到48MHz。
AHB默认分频是2,系统时钟是48.2=24MHz
这里将其分频改为1,则系统时钟是48/1=48MHz
SYS_SetAHBClkDivider(1);
此时设置系统时钟时要设置FLASH周期为2,该接口会自动判断设置
此时UART最大可以3MHz
UART_Open(UART1,3000000,UART_NO_PARITY,UART_TRIGGER_LEVEL_4_BYTES);
实测9个bit3us
3M
总结
从以上测试可以看出,系统跑48MHz的时候,串口最大可以跑3MHz,时钟准确。