• stm32的串口中断


    下面有很多问题没有验证:

    在设置USART_CR1中的TE位时,会发送一个空闲帧作为第一次数据发送,

    目前我所了解的串口中断发送,有两种方式:

    一个是:TC

    一个是:TXE

    这是判断两个标志位,

    第一种方式:配置检测TC标志,来编写

    初始化如下:

    void USART_Config()
    {
      USART_InitTypeDef USART_InitStructure;//定义一个包含串口参数的结构体
      
      USART_InitStructure.USART_BaudRate = 9600; //波特率9600
      USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据位
      USART_InitStructure.USART_StopBits = USART_StopBits_1;//1位停止位
      USART_InitStructure.USART_Parity = USART_Parity_No;//无校验
      USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控制
      USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//输入加输出模式
      USART_InitStructure.USART_Clock = USART_Clock_Disable;//时钟关闭
      USART_InitStructure.USART_CPOL = USART_CPOL_Low;
      USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
      USART_InitStructure.USART_LastBit = USART_LastBit_Disable;
      USART_Init(USART1, &USART_InitStructure);//设置到USART1
      
      USART_ITConfig(USART1, USART_IT_TC, ENABLE);//Tramsimssion Complete后,才产生中断. 开TC中断必须放在这里,否则还是会丢失第一字节

      USART_Cmd(USART1, ENABLE); //使能USART1
    }

    配置好程序之后,如果想要发送数据,,就调用:

    void USART_SendDataString( u8 *pData )    //这里面传入的要发送 字符串的首地址
    {
        pDataByte = pData;
      
        USART_ClearFlag(USART1, USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据.网友提供.
        
        USART_SendData(USART1, *(pDataByte++) ); //必须要++,不然会把第一个字符t发送两次
    }

    在你调用上面的函数的时候,,程序会跳入中断(按照手册上的讲解,是每传一个字符,也就是每传8位,进入一次中断,,,,一次中断传8个位):

    void USART1_IRQHandler(void)
    {
        if( USART_GetITStatus(USART1, USART_IT_TC) == SET  )
        {
            if( *pDataByte == '' )//TC需要 读SR+写DR 方可清0,当发送到最后,到''的时候用个if判断关掉
                USART_ClearFlag(USART1, USART_FLAG_TC);//不然TC一直是set, TCIE也是打开的,导致会不停进入中断. clear掉即可,不用关掉TCIE
            else
                USART_SendData(USART1, *pDataByte++ );
        }

    }

    注:在中断处理程序中,发送完该字符串后,不用关闭TC的中断使能TCIE,只需要清掉标志位TC;这样就能避免TC == SET 导致反复进入中断了。

    至于这篇文章中讨论的,,传输数据会不会丢失,,没有去深探究

    第二种实现方法,判断TXE

    再说判断TXE。即Tx DR Empty,发送寄存器空。当使能TXEIE后,只要Tx DR空了,就会产生中断。所以,发送完字符串后必须关掉,否则会导致重复进入中断。这也是和TC不同之处。

    发送函数如下:
    /*******
    功能:中断方式发送字符串.采用判断TC的方式.即 判断 发送后中断 位.
    输入:字符串的首地址
    输出:无
    *******/
    void USART_SendDataString( u8 *pData )
    {
        pDataByte = pData;
        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//只要发送寄存器为空,就会一直有中断,因此,要是不发送数据时,把发送中断关闭,只在开始发送时,才打开。 
        
    }

    中断处理函数如下:

    /********
    * Function Name  : USART1_IRQHandler
    * Description    : This function handles USART1 global interrupt request.
    * Input          : None
    * Output         : None
    * Return         : None
    ********/
    void USART1_IRQHandler(void)
    {
        if( USART_GetITStatus(USART1, USART_IT_TXE) == SET  )
        {
            if( *pDataByte == '' )//待发送的字节发到末尾NULL了
                USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//因为是 发送寄存器空 的中断,所以发完字符串后必须关掉,否则只要空了,就会进中断
            else
                USART_SendData(USART1, *pDataByte++ );
        }

    }

    在串口初始化函数中就不用打开TXE的中断了(是在发送函数中打开的)如下:
    /************
    名称:  USART_Config
    功能:  设置串口参数
    输入:  无
    输出:  无
    返回:  无
    ************/
    void USART_Config()
    {
      USART_InitTypeDef USART_InitStructure;//定义一个包含串口参数的结构体
      
      USART_InitStructure.USART_BaudRate = 9600; //波特率9600
      USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据位
      USART_InitStructure.USART_StopBits = USART_StopBits_1;//1位停止位
      USART_InitStructure.USART_Parity = USART_Parity_No;//无校验
      USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控制
      USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//输入加输出模式
      USART_InitStructure.USART_Clock = USART_Clock_Disable;//时钟关闭
      USART_InitStructure.USART_CPOL = USART_CPOL_Low;
      USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
      USART_InitStructure.USART_LastBit = USART_LastBit_Disable;

      USART_Init(USART1, &USART_InitStructure);//设置到USART1
      
      USART_Cmd(USART1, ENABLE); //使能USART1

    }

    摘自https://blog.csdn.net/kevinhg/article/details/40085971

  • 相关阅读:
    优秀IT技术文章集(最新)(高质量)
    大型网站系统架构演化之路
    一起学Maven
    Drupal8 新建第一个模块
    理解依赖注入(Dependency Injection)
    Yii2 模块module笔记
    Drupal views 学习之筛选器
    Drupal views 学习之初识
    Drupal views 中合并显示字段
    解读python手册的例子a, b = b, a+b
  • 原文地址:https://www.cnblogs.com/chulin/p/9055361.html
Copyright © 2020-2023  润新知