stm32串口printf中断发送实现方法

2019-03-23 18:26发布

我手上有一个stm32的例程是关于printf中断发送的,我看里面的程序没看明白是怎么触发中断的。
例程中printf发送是需要这两个定义的
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */


/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  * @by     WWW.ARMJISHU.COM
  */
PUTCHAR_PROTOTYPE
{
  /* ARMJISHU 零等待的Printf串口打印函数将数据
            写入Buffer后立即返回(Buffer未满时) */
  USART_StoreBufferData((uint8_t) ch);

  return ch;
}

使用printf会调用上面的函数,接着调用USART_StoreBufferData((uint8_t) ch) ;

/**
  * @brief  put char to the Tx Buffer
            将来自printf的数据写入Buffer,
  * @param  None
  * @retval None
  * @by     WWW.ARMJISHU.COM
  */
void USART_StoreBufferData(uint8_t ch)
{
    while(TxCounter == USART_TX_DATA_SIZE);
    if(TxCounter < USART_TX_DATA_SIZE)
    {
        /* Write one byte to the transmit data register */
        USART_Tx_Buffer[USART_Tx_ptr_Store++] = ch;
        USART_Tx_ptr_Store = USART_Tx_ptr_Store & 0xFF;
        TxCounter++;
    }
    USART_ITConfig(EVAL_COMx, USART_IT_TXE, ENABLE);
}

在这个函数里只是把变量ch传到了USART_TX_Buffer中并在下面使能了串口发送中断并没有触发。
void USARTx_IRQHandler(void)
{
  if (USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)
  {
    /* received data */
    USART_GetInputString();
  }

  /* If overrun condition occurs, clear the ORE flag
                              and recover communication */
  if (USART_GetFlagStatus(USARTx, USART_FLAG_ORE) != RESET)
  {
    (void)USART_ReceiveData(USARTx);
  }

  if(USART_GetITStatus(USARTx, USART_IT_TXE) != RESET)
  {   
    /* Write one byte to the transmit data register */

  }

这是串口中断处理函数里面调用了一个发送函数 USART_SendBufferData();

void USART_SendBufferData(void)
{
    if(TxCounter > 0)
    {
        /* Write one byte to the transmit data register */
        USART_SendData(EVAL_COMx, USART_Tx_Buffer[USART_Tx_ptr_Out++]);
        TxCounter--;
        USART_Tx_ptr_Out = USART_Tx_ptr_Out & 0xFF;
    }
    else
    {
      /* Disable the EVAL_COM1 Transmit interrupt */
      USART_ITConfig(EVAL_COMx, USART_IT_TXE, DISABLE);
    }
}

其它与发送有关的函数就没有了,程序中并没有看到怎么触发中断的,有知道的吗能给解释一下吗,谢谢了。使用的是神舟王开发板,例程是神舟IV的例程。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。