|
假设stm32F103跑到72Mhz,使用串口1的参数115200,8,N,1
串口每发送一位,中间的频率数=72M/115200=625, 手册上说1.25Dmips/Mhz,也就是说在625个晶振期间最多可执行625*1.25条指令,保守一些,假设执行200条指令吧。
则在串口的中断程序是这样的:
void USART1_IRQHandler(void)
{
uint16_t temp;
temp=USART1->SR & 0x20;
if(temp != 0) //使用寄存器方式查询是否有接收事件,相当于 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
c=USART1->DR; //接收串口来的数据
USART1->DR=c; //将字符通过串口返回去
}
}
主程序只有while(1),且没有其他中断。
以上假设完毕
理论: 这样一个中断程序(算上进入中断的时间)在625个晶振期间可以执行完毕。当往单片机串口发送 “ab”的时候,单片机接收到a,立刻将a通过串口返回,单片机再接受b,将b返回,最后上位机也应该收到“ab”,也就是上位机无论发送字符,还是字符串,下位机都应该返回相同的数据。
实践的结果:
Request: 2012-12-12 17:36:34.12864 (+0.3907 seconds)
61 62 ab
Answer: 2012-12-12 17:36:34.12864 (+0.0000 seconds)
7C EC |ì
Request: 2012-12-12 17:36:35.50364 (+0.3750 seconds)
61 62 ab
Answer: 2012-12-12 17:36:35.51964 (+0.0156 seconds)
5A EC Zì
这个返回结果是错误的。
但是也有正确的时候:
Request: 2012-12-12 17:38:15.06064 (+2.6878 seconds)
72 79 74 ryt
Answer: 2012-12-12 17:38:15.06064 (+0.0000 seconds)
72 79 74 ryt
发送ryt,返回ryt
请问这是为什么呢? ^_^
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|