本帖最后由 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 );
- }
- }
|