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

📄 main.c

📁 一、开发环境 1、开发板: AT91SAM7X256-EK 2、仿真器: SAM-ICE(ATMEL) 3、开发软件: ADS1.2 (ARM调试模式) 二、程序功能 1、程序目的:AT
💻 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 + -