⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at91irq_c_handler.c

📁 ARM入门的好帮手.包含了从简单到相对较复杂的程序.
💻 C
字号:
//*----------------------------------------------------------------------------
//* File Name           : irq_handlers.c
//*
//* Description         : IRQ handler functions for AT91.
//*
//* George Zhang 	: 08/25/2000
//*----------------------------------------------------------------------------

#include    "drivers\terminal\terminal.h"
#include    "tx_api.h"

extern TX_QUEUE			queue_0;
extern TX_EVENT_FLAGS_GROUP    	event_flags_0;

//*----------------------------------------------------------------------------
//* Function Name       : irq0_c_handler
//* Object              :
//* Input Parameters    : None
//* Output Parameters   : None
//* Functions called    :
//*----------------------------------------------------------------------------
void irq0_c_handler (void)
{
    u_int   		status;
    static ULONG	messages_0;

    /* Send message to queue 0.  */
    status =  tx_queue_send(&queue_0, &messages_0, TX_NO_WAIT);

    /* Increment the message sent.  */
   messages_0++;
}


//*----------------------------------------------------------------------------
//* Function Name       : terminal_c_handler
//* Object              :
//* Input Parameters    : terminal descriptor
//* Output Parameters   : None
//* Functions called    :
//*----------------------------------------------------------------------------
void terminal_c_handler ( TerminalDesc *term_desc )
{
    u_int   status ;
    u_int   x ;
    StructUSART         *usart = term_desc->usart_desc->usart_base ;
    TerminalDataDesc    *data = term_desc->term_data ;

    /* Set event flag 0 */
    status =  tx_event_flags_set(&event_flags_0, 0x1, TX_OR);

    while (( status = ( usart->US_CSR & usart->US_IMR )) != 0 )
    {
        //* If a reception error occured
        if (( status & US_MASK_IRQ_ERROR ) != 0 )
        {
            status &= ~US_RXRDY ;
            usart->US_CR = US_RSTSTA ;
            x = usart->US_RHR ;
        }

        //* RXRDY interrupt
        if (( status & US_RXRDY ) != 0 )
        {
            if ((u_int)data->rx_cnt == TERMINAL_SIZE_BUFFER)
            {
                data->error |= TERMINAL_ERROR_RX_OVF ;
            }
            else
            {
                data->rx_cnt++;

                //* reception
                *(data->rx_in_pt) = usart->US_RHR ;

                //* transmission
                usart->US_THR = *(data->rx_in_pt);

		data->rx_in_pt++;
                if ((u_int)data->rx_in_pt >= (u_int)data->rx_buf + TERMINAL_SIZE_BUFFER)
                {
                    data->rx_in_pt = data->rx_buf ;
                }
            }
        }

        //* TXRDY interrupt
        if (( status & US_TXRDY ) != 0 )
        {
            if ((u_int)data->tx_cnt > 0)
            {
                data->tx_cnt--;

                //* transmission
                usart->US_THR = *(data->tx_out_pt)++ ;

                if ((u_int)data->tx_out_pt >= (u_int)data->tx_buf + TERMINAL_SIZE_BUFFER)
                {
                    data->tx_out_pt = data->tx_buf ;
                    data->tx_cnt = 0;
                }
            }
            else
            {

        //* reset tx pointer
        data->tx_in_pt = data->tx_buf;
        data->tx_out_pt = data->tx_buf;

            //* Disable the TXRDY interrupt
                usart->US_IDR = 0x02;
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -