usart文件夹中USART1_IRQHandler函数
/*******************************************************/
void USART1_IRQHandler(void)函数是串口 1的中断响应函数,当串口1发生了相应 的中断后,就会跳到该函数执行。中断相应函数的名字是不能随便定义的,一般我们都遵循 MDK定义的函数名。这些函数名字在启动文件 startup_stm32f40_41xxx.s中可以找到。
函数体里面通过函数:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
判断是否接受中断,如果是串口接受中断,则读取串口接受到的数据:
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
读到数据后接下来就对数据进行分析。
void USART1_IRQHandler(void)函数是串口 1 的中断响应函数,当串口 1 发生了相应的中断后,就会跳到该函数执行。这里我们设计了一个小小的接收协议:通过这个函数,配合一个数组USART_RX_BUF[],一个接收状态寄存器USART_RX_STA(此寄存器其实就是一个全局变量,由作者自行添加。由于它起到类似寄存器的功能,这里暂且称之为寄存器)实现对串口数据的接收管理。USART_RX_BUF的大小由 USART_REC_LEN定义,也就是一次接收的数据最大不能超过USART_REC_LEN 个字节。 USART_RX_STA 是一个接收状态寄存器其各的定义:
USART_RX_STA
Bit15 bit14 bit13~0
接收完成标志 接收到0X0D标志 接收到的有效数据个数
设计思路如下:
当接收到从电脑发过来的数据,把接收到的数据保存在USART_RX_BUF中,同时在接收状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车(回车的表示由2个字节组成: 0X0D和0X0A)的第一个字节 0X0D时,计数器将不再增加,等待0X0A的到来,而如果 0X0A 没有来到,则认为这次接收失败,重新开始下一次接收。如果顺利接收到0X0A,则标记 USART_RX_STA的第 15位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到0X0D,那么在接收数据超过USART_REC_LEN的时候,则会丢弃前面的数据,重新接收。函数代码如下:
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);//(USART1->DR); //读取接收到的数据
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(Res==0x0d)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;
//接收数据错误,重新开始接收
}
}
}
}
#if SYSTEM_SUPPORT_OS //如果 SYSTEM_SUPPORT_OS 为真,则需要支持OS.
OSIntExit();
#endif
}
#endif
EN_USART1_RX和 USART_REC_LEN 都是在usart.h文件里面定义的, 当需要使用串口接收的时候,我们只要在usart.h里面设置EN_USART1_RX 为1 就可以了。不使用的时候,设置,EN_USART1_RX为0即可, 这样可以省出部分 sram和 flash,我们默认是设置EN_USART1_RX为 1,也就是开启串口接收的。
SYSTEM_SUPPORT_OS,则是用来判断是否使用OS,如果使用了OS,则调用OSIntEnter和 OSIntExit 函数,如果没有使用 ucos,则不调用这两个函数(这两个函数用于实现中断嵌套处理,这里我们先不理会)。
/*******************************************************/
【立创商城】STM32F103CBT6 托盘 https://item.szlcsc.com/8796.html |