今天下文主要在学习串口通信这一块,自己尝试写了串口通信的实验,将步骤记录如下:1,串口时钟使能;2,串口复位(非必要);3,GPIO端口模式设置;4,串口参数初始化;5,开启中断并初始化NVIC(中断优先级分组);6,使能串口;7,编写中断处理函数;8,串口数据收发;9,串口传输状态获取。
然后就是看见视频里面用了管脚复用但没有在程序里面说明(CSDN搜STM32发103:什么时候用到IO复位(AFIO))
而后碰到了复杂的中断服务函数,一个小的协议如下:
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1); //读取接收到的数据
if((USART_RX_STA&0x8000)0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(Res0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
同时结合PPT中的图片,
可以知道把电脑发过来的数据保存在USART_RX_BUF里面,然后在接收状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车(0x0D)后,计数器不在增加,等着0x0A到来,如果 0X0A 没有来到,则认为接收失败,重新开始下一次接收。如果顺利接收到 0X0A,则标记 USART_RX_STA 的第 15 位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到 0X0D,那么在接收数据超过 USART_REC_LEN 的时候,则会丢弃前面的数据,重新接收。
|