📄 main.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 + -