[STM32]

立创商城STM32F系列——usart文件夹中USART1_IRQHandler函数

[复制链接]
994|0
手机看帖
扫描二维码
随时随地手机跟帖
小乐Tzz|  楼主 | 2018-8-29 10:46 | 显示全部楼层 |阅读模式
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

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝