我手上有一个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的例程。
此帖出自
小平头技术问答
一周热门 更多>