?? main.c
字號:
//*----------------------------------------------------------------------------
//* 文件名 : main.c
//* 創建人 :張正鋒 2006/3/2 zhangzf@baite-group.com
//*----------------------------------------------------------------------------
// 包含標準的頭文件
#include "project.h"
#include "dbgu.h"
//全局變量
#define SPEED ( AT91B_MAIN_OSC /1000)
unsigned int LedSpeed = SPEED *20 ;
const int led_mask[AT91B_NB_LEB]= {AT91B_LED1, AT91B_LED2, AT91B_LED3, AT91B_LED4};
//*Waiting time between LED1 and LED2
#define WAIT_TIME AT91B_MCK
//定義各中斷的優先級
#define PIO_INTERRUPT_LEVEL 6
#define IRQ0_INTERRUPT_LEVEL 2
#define SOFT_INTERRUPT_LEVEL 5
#define FIQ_INTERRUPT_LEVEL 7
//外部函數申明
//快中斷處理程序
extern void FIQ_init_handler(void);
//IRQ2中斷處理程序
extern void at91_IRQ0_handler(void);
//定時器初始化
extern void timer_init (void );
//*----------------------------------------------------------------------------
//* 函數名 : aic_software_interrupt
//* 功能 : 軟中斷執行程序
//* 輸入參數 : 無
//* 返回值 : 改變LED3的狀態
//* 創建人 :張正鋒 2006/2/21 zhangzf@baite-group.com
//*----------------------------------------------------------------------------
void aic_software_interrupt(void)
{
//產生軟中斷后改變LED3的狀態
if ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & AT91B_LED3 ) == AT91B_LED3 )
{
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, AT91B_LED3 );
}
else
{
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, AT91B_LED3 );
}
}
//*----------------------------------------------------------------------------
//* 函數名 : pio_c_irq_handler
//* 功能 : Irq Handler called by the irq_pio.s
//* 輸入參數 : none
//* 返回值 : none
//* 調用函數 : at91_pio_read, at91_pio_write
//* 創建人 :張正鋒 2006/2/21 zhangzf@baite-group.com
//*----------------------------------------------------------------------------
void pio_c_irq_handler ( void )
{
int dummy;
//改變LED2的狀態
if ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & AT91B_LED1 ) == AT91B_LED1 )
{
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, AT91B_LED1);
}
else
{
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, AT91B_LED1);
}
//讀取中斷狀態寄存器,清除中斷
dummy =AT91C_BASE_PIOA->PIO_ISR;
//避免編譯時產生警
dummy =dummy;
//* 等待SW3釋放
while ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & AT91A_SW1 ) != AT91A_SW1);
}
//*----------------------------------------------------------------------------
//* 函數名 : delay
//* 功能 : 軟件延時
//* 輸入參數 : none
//* 返回值 : none
//* 調用函數 : none
//* 創建人 :張正鋒 2006/2/21 zhangzf@baite-group.com
//*----------------------------------------------------------------------------
void delay ( void )
{
volatile unsigned int i;
for ( i = 0 ;(i < WAIT_TIME/100 );i++ );
}
//*--------------------------------------------------------------------------------------
//* 函數名 : wait
//* 功能 : 軟件延時
//* 輸入參數 : 全局變量 LedSpeed.
//* 輸出參數 : 無
//* 創建人 : 張正鋒 2006/3/2 zhangzf@baite-group.com
//*--------------------------------------------------------------------------------------
void wait ( void )
{//* Begin
unsigned int waiting_time ;
//軟件延時
for(waiting_time = 0; waiting_time < LedSpeed; waiting_time++);
}//* End
//*--------------------------------------------------------------------------------------
//* 函數名 : Main
//* 功能 : 主程序入口
//* 輸入參數 : 無
//* 輸出參數 : 無
//* 創建人 : 張正鋒 2006/3/3 zhangzf@baite-group.com
//*--------------------------------------------------------------------------------------
int main()
{//* Begin
unsigned int loop_count ;
AT91PS_AIC pAic;
//* 加載AIC基地址
pAic = AT91C_BASE_AIC;
//設置用戶按鍵復位功能 (復位時間大約 512*(1/32k)=16ms)
AT91F_RSTSetMode(AT91C_BASE_RSTC,(8<<8)|(1<<0)); //函數原形 in lib_AT91SAM7X256.h
//* 變量初始化
loop_count = 0 ;
// 使能PIOA的時鐘
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
// 使能PIOB的時鐘
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOB ) ;
//配置PB19 ,PB20 , PB21 ,PB22 作為輸出I/O
AT91F_PIO_CfgOutput( AT91D_BASE_PIO_LED, AT91B_LED_MASK ) ;
//關閉LED1,LED2,LDE3,LED4--結合開發板硬件考慮
AT91F_PIO_SetOutput( AT91D_BASE_PIO_LED, AT91B_LED_MASK ) ;
////////////////////////////////////////////////////////////////////////////////////////////
// 開始中斷測試
////////////////////////////////////////////////////////////////////////////////////////////
//#######################################################################################
//1.PIO 中斷測試程序 --改變LED1的狀態
//#######################################################################################
//設置SW1為輸入模式
AT91F_PIO_CfgInput(AT91C_BASE_PIOA, AT91A_SW1 );
//配置PIO中斷
AT91F_AIC_ConfigureIt ( pAic,
AT91C_ID_PIOA,
PIO_INTERRUPT_LEVEL,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
pio_c_irq_handler);
AT91F_AIC_EnableIt (pAic, AT91C_ID_PIOA);
//開PIOA中斷
AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,AT91A_SW1 );
//#######################################################################################
//2.IRQ0 中斷測試程序 --改變LED1的狀態
//#######################################################################################
//open external IRQ interrupt
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,AT91A_SW2,0);
//open external IRQ0 interrupt
AT91F_AIC_ConfigureIt ( pAic,
AT91C_ID_IRQ0,
IRQ0_INTERRUPT_LEVEL,
AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE,
at91_IRQ0_handler);
//打開IRQ2中斷
AT91F_AIC_EnableIt (pAic, AT91C_ID_IRQ0);
//#######################################################################################
//3.FIQ 中斷測試程序 --改變LED2的狀態
//#######################################################################################
//open FIQ interrupt
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,AT91C_PA29_FIQ,0);
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_FIQ,
FIQ_INTERRUPT_LEVEL,
AT91C_AIC_SRCTYPE_EXT_NEGATIVE_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) ;
//#######################################################################################
//4.software 中斷測試程序 --改變LED3的狀態
//#######################################################################################
//Open the software interrupt on the AIC
AT91F_AIC_ConfigureIt ( pAic,
AT91C_ID_SYS,
SOFT_INTERRUPT_LEVEL,
AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE,
aic_software_interrupt);
AT91F_AIC_EnableIt (pAic, AT91C_ID_SYS);
// generate software interrupt
AT91F_AIC_Trig (pAic,AT91C_ID_SYS) ;
//#######################################################################################
//5.TC中斷測試程序 --改變LED4的狀態
//#######################################################################################
timer_init();
//#######################################################################################
//6.其他中斷見相應功能測試程序
//#######################################################################################
for (;;)
{
delay () ;
loop_count ++ ;
if (loop_count == 5)
{
loop_count=0;
//產生一個軟中斷-----改變LED3的狀態
AT91F_AIC_Trig (pAic,AT91C_ID_SYS) ;
}
} //* End FOR
} //END MAIN
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -