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