打印
[STM8]

STM8S105K6使用串口中断发送,如何清发送完成中断TXE?

[复制链接]
670|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2021-1-5 09:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8S105K6使用串口中断发送,如何清发送完成中断TXE?找了一个例程
INTERRUPT_HANDLER(UART2_TX_IRQHandler, 20){        // 写操作自动清中断,因此可以不用显式清中断      
       UART2_ClearITPendingBit(UART2_IT_TXE);                 
       // 从写缓冲中写出1字节        UART2_SendData8(writ_buffer[writ_idx++]);        
     // 全部写完、关写中断、置写完成标志(同步化处理)      
      if( writ_idx == writ_len ) {                UART2_ITConfig(UART2_IT_TXE, DISABLE);                writ_ok = 1;        }
}
----------------------------------------------------------------------------------------------------------------------------------
这个例程使用UART2_ClearITPendingBit(UART2_IT_TXE); 来清发送完成中断,会导致进入断言while(1)循环void assert_failed(u8* file, u32 line)
查看UART2_ClearITPendingBit函数说明,发现该函数不能请TXE和TC中断,给出的解决方案是UART2_SendData8() or UART2_SendData9(),写数据的方式。单带来的问题是,实际发送数据时,我的最后一个字节发送完了怎么办,没发清中断标志,又无数可发??
----------------------------------------------------------------------------------------------------------------------------------

/**
  * @brief  Clears the UART2 pending flags.
  * @param  UART2_IT specifies the pending bit to clear
  *         This parameter can be one of the following values:
  *         - UART2_IT_LBDF:  LIN Break detection interrupt
  *         - UART2_IT_LHDF:  LIN Header detection interrupt
  *         - UART2_IT_RXNE: Receive Data register not empty interrupt.
  * @note
  *         - PE (Parity error), FE (Framing error), NE (Noise error),
  *           OR (OverRun error) and IDLE (Idle line detected) pending bits are
  *           cleared by software sequence: a read operation to UART2_SR register
  *           (UART2_GetITStatus()) followed by a read operation to UART2_DR register
  *           (UART2_ReceiveData8() or UART2_ReceiveData9()).
  *            
  *         - RXNE pending bit can be also cleared by a read to the UART2_DR
  *           register (UART2_ReceiveData8() or UART2_ReceiveData9()).
  *              
  *         - TC (Transmit complete) pending bit can be cleared by software
  *           sequence: a read operation to UART2_SR register
  *           (UART2_GetITStatus()) followed by a write operation to UART2_DR
  *           register (UART2_SendData8()or UART2_SendData9()).
  *               
  *         - TXE pending bit is cleared only by a write to the UART2_DR register
  *           (UART2_SendData8() or UART2_SendData9()).
  * @retval None
  */
void UART2_ClearITPendingBit(UART2_IT_TypeDef UART2_IT)

使用特权

评论回复
沙发
flycamelaaa| | 2021-1-5 11:46 | 只看该作者
给一段stm32的发送中断程序,供参考:
                if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
                {   
                        /* Write one byte to the transmit data register */
                        USART_SendData(USART1, usart_user_1.send_buff[TxCounter1++]);

                        if(TxCounter1 == usart_user_1.send_num )
                        {
                                /* Disable the USART2 Transmit interrupt */
                                USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
                                TxCounter1 = 0;
                        }
                }               

使用特权

评论回复
板凳
stormwind123| | 2021-1-5 11:46 | 只看该作者

TC中断可以操作寄存器直接清,我使用TC中断发送,不用TXE,效果也很好

使用特权

评论回复
地板
probedog| | 2021-1-5 11:46 | 只看该作者

TC中断是等上一个数据发送完成后才产生,理论上稍稍慢一点,但是不影响串口发送速度,那么用起来也很顺手的

使用特权

评论回复
5
heimaojingzhang| | 2021-2-1 23:37 | 只看该作者
难道不是自动清除的吗

使用特权

评论回复
6
keaibukelian| | 2021-2-1 23:41 | 只看该作者
不需要手动吧

使用特权

评论回复
7
labasi| | 2021-2-1 23:43 | 只看该作者
发送完之后自己就清除了啊

使用特权

评论回复
8
paotangsan| | 2021-2-1 23:47 | 只看该作者
不能手动清零啊

使用特权

评论回复
9
renzheshengui| | 2021-2-1 23:50 | 只看该作者
难道发送完之后还一直进入中断吗

使用特权

评论回复
10
duo点| | 2021-2-2 09:35 | 只看该作者

给一段stm32的发送中断程序,供参考:
                if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
                {   
                        /* Write one byte to the transmit data register */
                        USART_SendData(USART1, usart_user_1.send_buff[TxCounter1++]);

                        if(TxCounter1 == usart_user_1.send_num )
                        {
                                /* Disable the USART2 Transmit interrupt */
                                USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
                                TxCounter1 = 0;
                        }
                }               

使用特权

评论回复
11
一刀一级| | 2021-2-2 09:37 | 只看该作者

TC中断是等上一个数据发送完成后才产生,理论上稍稍慢一点,但是不影响串口发送速度,那么用起来也很顺手的

使用特权

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

本版积分规则

1339

主题

3897

帖子

0

粉丝