本帖最后由 nos001 于 2022-10-20 14:31 编辑
雅特力的421
/**********************************************************************************************************
* brief USART1中断服务程序
* note 串口字符接收中断、空闲中断只允许一个
* note 空闲中断需同时判断中断状态位、DMA通道允许位
**********************************************************************************************************/
void USART1_IRQHandler( void )
{
uint8_t clr, receive;
/* 串口空闲中断,可以做串口dma不定长接收 */
if( ( USART_GetITStatus( USART1, USART_INT_IDLEF ) != RESET ) && dma_ien_get( DMA1_Channel3, DMA_CHCTRL1_CHEN ) )
{
/* 空闲中断清除标志 */
clr = USART1->STS;
clr = USART1->DT;
/* 通道关闭,才能对通道寄存器赋值 */
dma_channel_enable( UART_RX_DMA_CHANNEL, DISABLE );
/* 接收的数据长度 */
Uart_dma_rxbyte = DATA_SIZE_DMA - DMA_GetCurrDataCounter( UART_RX_DMA_CHANNEL );
/* 重新赋值计数值 */
DMA_SetCurrDataCounter( UART_RX_DMA_CHANNEL, DATA_SIZE_DMA );
dma_channel_enable( UART_RX_DMA_CHANNEL, ENABLE );
rs485_rx_disable();
uart_dma_rxFull = 1;
TMR_SetCounter( TMR6, 0 );
}
/* 串口接收字符中断 */
if( USART_GetITStatus( USART1, USART_INT_RDNE ) != RESET )
{
USART_ClearFlag( USART1, USART_FLAG_RDNE );
receive = USART_ReceiveData(USART1);
Queue_In( &sQueUart, &receive );
/* 接收字符间隔超时计数器清零,超过3.5字符认为是空闲 */
TMR_SetCounter( TMR6, 0 );
TMR_SetAutoreload( TMR6, OVER_TIME_35CHAR - 1 );
TMR_Cmd( TMR6, ENABLE );
uart_rx_en_tmr = 1;
}
/* 串口发送完成中断,如果是dma发送,全部数据发送完产生中断,发送期间并不会发生中断 */
if( USART_GetITStatus( USART1, USART_INT_TRAC ) != RESET )
{
USART_ClearFlag( USART1, USART_FLAG_TRAC );
rs485_tx_disable();
rs485_rx_enable();
TMR_SetCounter( TMR6, 0 );
}
}
|