测试所使用芯片 STM32F103RCT6 UART收发的极限频率:bytes/s
1.发送频率
主程序循环发送一字节u8整型,记录次数。
while(1)
{
t++;
if(t==255) t=0;
printf("%d",t);
Fre++;
}
设置1s的时钟中断,显示发送次数
extern u32 Fre;
extern u32 HighestFre;
u32 tempu32;
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
if(Fre>HighestFre) HighestFre=Fre;
tempu32=HighestFre;
LCD_ShowxNum(100,120,tempu32,8,16,0); //显示highest frequency
printf("\r\n\r\n HighestFre:%d \r\n\r\n",HighestFre);
LED0=!LED0;
Fre=0;
}
}
在串口和LCD屏会显示结果:
uart_init(921600); HighestFre:32515
uart_init(3000000); HighestFre:70430
921600波特率时发射速率为 32.5k bytes/s;3M波特率时发射速率为 70.4k bytes/s
2.接收频率
STM32从上位机接收数据,最高接收数据量/s
给上位机程序写一个循环发送:
private void button4_Click(object sender, EventArgs e) //button4按键事件
{
button4.Enabled = false;
Isautosend = true;
timer1.Enabled = true;
while (Isautosend)
{
if (serialPort1.IsOpen)//判断串口是否打开,如果打开执行下一步操作
{
try
{
serialPort1.WriteLine("hi22\r\n");//写数据
}
catch (Exception err)
{
MessageBox.Show("串口数据写入错误", "错误");//出错提示
serialPort1.Close();
button1.Enabled = true;//打开串口按钮可用
button2.Enabled = false;//关闭串口按钮不可用
}
}
HighFre++;
}
}
在STM32程序中中断记录
while(1)
{
if(USART_RX_STA&0x8000)
{
Fre+=6;
//printf("\r\n\r\n Fre:%d \r\n\r\n",Fre);
USART_RX_STA=0;
}
}
1S定时清给出接收到的字节数
void TIM3_IRQHandler(void) //TIM3中断
{
u32 tempu32;
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
if(Fre>HighestFre) HighestFre=Fre;
tempu32=HighestFre;
LCD_ShowxNum(100,120,tempu32,8,16,0); //显示highest frequency
printf("\r\n receive bytes:%d \r\n",Fre);
LED0=!LED0;
Fre=0;
}
}
结果:
uart_init(115200); -- 9.5kbytes/S
uart_init(921600); -- 65kbytes/S
uart_init(3000000); -- 70kbytes/S