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

📄 main.c

📁 ATMEL AT91SAM9260的中段控制程序!
💻 C
字号:
/*-----------------------------------------------------------------------------
 *           ATMEL Microcontroller Software Support  -  ROUSSET  -
 *-----------------------------------------------------------------------------
 * DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *----------------------------------------------------------------------------
 * File Name           : main.c
 * Object              :
 *
 * 1.0 06/Sep/06 JPP   : Creation
 *----------------------------------------------------------------------------
*/

#include "project.h"
#include "led.h"
#include "dbgu.h"

#define PIO_INTERRUPT_LEVEL	6
#define IRQ0_INTERRUPT_LEVEL    2
#define SOFT_INTERRUPT_LEVEL    5
#define FIQ_INTERRUPT_LEVEL     0

//* External Interrupt Handler
extern void at91_IRQ0_handler(void);
extern void FIQ_init_handler(void);

extern void timer_init(void);
extern void Usart_init (void);

char message[80];
unsigned int software_interrupt=0;

//*----------------------------------------------------------------------------
//* Function Name       : aic_software_interrupt
//* Object              : Software interrupt function
//*----------------------------------------------------------------------------
void aic_software_interrupt(void)
{
  software_interrupt++;
}

//*----------------------------------------------------------------------------
//* Function Name       : pio_c_irq_handler
//* Object              : Irq Handler called by the irq_pio.s
//*----------------------------------------------------------------------------
void pio_c_irq_handler ( void )
{
    //* Read the output state
    AT91F_PIO_InvertLed(AT91B_LED1);
    //* enable the next PIO IRQ
    AT91D_BASE_PIO_SW->PIO_ISR;
    //* while SW2 is push wait
    AT91F_PIO_Wait_input(AT91B_SW1);
}

//*----------------------------------------------------------------------------
//* Function Name       : main
//* Object              : Main function
//*----------------------------------------------------------------------------*/
int main(void)
{
    unsigned int value;
    unsigned int loop_count =0;

    // Init DBGU
       AT91F_DBGU_Init();
    // Print to consol
       AT91F_DBGU_Printk("\n\r==============================\n\r");
       AT91F_DBGU_Printk("AT91SAM9260 Interrupt example\n\r");
       AT91F_DBGU_Printk("==============================\n\r");

    // Init Led AND Switch
       AT91F_PIO_Init();
       value = AT91F_PMC_GetProcessorClock(AT91C_BASE_PMC,AT91C_BASE_CKGR,AT91B_SLOW_OSC);
       sprintf (message,"Processor clock: %d\n\r",value); AT91F_DBGU_Printk(message);
    // Interrupt

    //* open external PIO interrupt

	AT91F_PIO_CfgInput(AT91D_BASE_PIO_SW, AT91B_SW2 | AT91B_SW1);

	AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91D_ID_PIO_SW, PIO_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED, pio_c_irq_handler);
	AT91F_PIO_InterruptEnable(AT91D_BASE_PIO_SW,(unsigned int)AT91B_SW2);
	//* set the interrupt by software
	AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91D_ID_PIO_SW);


    //* Open the software interrupt on the AIC
       AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_SYS, SOFT_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED,  aic_software_interrupt);
       AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);

   	//* open external IRQ0 interrupt
       AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_IRQ0, IRQ0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE, at91_IRQ0_handler);
       AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ0);
    //* generate FIQ interrupt by software
       AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_IRQ0) ;

    //* Open the FIQ interrupt on the AIC
       AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_FIQ, FIQ_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE, FIQ_init_handler);
       AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_FIQ);
    //* generate FIQ interrupt by software
       AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_FIQ) ;

    //* Init timer interrupt
        timer_init();

    //* Init Usart
        Usart_init();

    for (;;)
    {
        AT91F_PIO_Wait_input(AT91B_SW1);
        AT91F_PIO_InvertLed(AT91B_POWERLED);
        AT91F_PIO_Wait(AT91B_MASTER_CLOCK/1000);

        loop_count ++ ;
        //* Send software interrupt
        if (loop_count == 10)
        {
             loop_count=0;
         //* Software interrupt
             AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_SYS) ;
        }

    }

}


⌨️ 快捷键说明

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