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

📄 bsp.c

📁 将UCOSII移植到AT91SAM7a3上
💻 C
字号:
//------------------------------------------------------------------------------------------------------
#include <includes.h>

//------------------------------------------------------------------------------------------------------

typedef  void (*BSP_PFNCT)(void);

//------------------------------------------------------------------------------------------------------

static  void  BSP_DummyISR_Handler(void);

static  void  BSP_IntCtrlInit(void);

static  void  Tmr_TickInit(void);

static  void  Tmr_TickISR_Handler(void);

//------------------------------------------------------------------------------------------------------

static  void  BSP_DummyISR_Handler (void)
{
    AT91C_BASE_AIC->AIC_IVR = 0;              /* Debug variant of vector read (protect mode is used)   */
}


//----------------------------------------------------------------------------------------------------
void  BSP_Init (void)
{
    BSP_IntCtrlInit();                               /* Initialize the Interrupt Controller            */
    Tmr_TickInit();                                  /* Initialize uC/OS-II's Tick Rate                */
    LED_Init();                                      /* Initialize the I/Os for the LEDs               */
}


//-------------------------------------------------------------------------------------------------------

void  BSP_IntDisAll (void)
{
    AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;                         /* Disable all interrupts           */
}

//--------------------------------------------------------------------------------------------------------

void  LED_Init (void)
{
    AT91C_BASE_PIOA->PIO_PER  = BSP_LED4 | BSP_LED3 | BSP_LED2 | BSP_LED1; /* Enable register          */
    AT91C_BASE_PIOA->PIO_OER  = BSP_LED4 | BSP_LED3 | BSP_LED2 | BSP_LED1; /* Output enable            */
    AT91C_BASE_PIOA->PIO_IDR  = BSP_LED4 | BSP_LED3 | BSP_LED2 | BSP_LED1;
    LED_Off(BSP_LED_ALL);                                                  /* Turn OFF all the LEDs    */
}

//--------------------------------------------------------------------------------------------------------

void  LED_Off (INT8U led)
{
    switch (led) {
        case 0:
             AT91C_BASE_PIOA->PIO_SODR = BSP_LED4 | BSP_LED3 | BSP_LED2 | BSP_LED1;
             break;

        case 1:
             AT91C_BASE_PIOA->PIO_SODR = BSP_LED1;
             break;

        case 2:
             AT91C_BASE_PIOA->PIO_SODR = BSP_LED2;
             break;

        case 3:
             AT91C_BASE_PIOA->PIO_SODR = BSP_LED3;
             break;

        case 4:
             AT91C_BASE_PIOA->PIO_SODR = BSP_LED4;
             break;
    }
}

//--------------------------------------------------------------------------------------------------------


void  LED_Toggle (INT8U led)
{
    switch (led) {
        case 0:
             if (AT91C_BASE_PIOA->PIO_ODSR & BSP_LED1) {
                 AT91C_BASE_PIOA->PIO_CODR = BSP_LED1;
             } else {
                 AT91C_BASE_PIOA->PIO_SODR = BSP_LED1;
             }
             if (AT91C_BASE_PIOA->PIO_ODSR & BSP_LED2) {
                 AT91C_BASE_PIOA->PIO_CODR = BSP_LED2;
             } else {
                 AT91C_BASE_PIOA->PIO_SODR = BSP_LED2;
             }
             if (AT91C_BASE_PIOA->PIO_ODSR & BSP_LED3) {
                 AT91C_BASE_PIOA->PIO_CODR = BSP_LED3;
             } else {
                 AT91C_BASE_PIOA->PIO_SODR = BSP_LED3;
             }
             if (AT91C_BASE_PIOA->PIO_ODSR & BSP_LED4) {
                 AT91C_BASE_PIOA->PIO_CODR = BSP_LED4;
             } else {
                 AT91C_BASE_PIOA->PIO_SODR = BSP_LED4;
             }
             break;

        case 1:
             if (AT91C_BASE_PIOA->PIO_ODSR & BSP_LED1) {
                 AT91C_BASE_PIOA->PIO_CODR = BSP_LED1;
             } else {
                 AT91C_BASE_PIOA->PIO_SODR = BSP_LED1;
             }
             break;

        case 2:
             if (AT91C_BASE_PIOA->PIO_ODSR & BSP_LED2) {
                 AT91C_BASE_PIOA->PIO_CODR = BSP_LED2;
             } else {
                 AT91C_BASE_PIOA->PIO_SODR = BSP_LED2;
             }
             break;

        case 3:
             if (AT91C_BASE_PIOA->PIO_ODSR & BSP_LED3) {
                 AT91C_BASE_PIOA->PIO_CODR = BSP_LED3;
             } else {
                 AT91C_BASE_PIOA->PIO_SODR = BSP_LED3;
             }
             break;

        case 4:
             if (AT91C_BASE_PIOA->PIO_ODSR & BSP_LED4) {
                 AT91C_BASE_PIOA->PIO_CODR = BSP_LED4;
             } else {
                 AT91C_BASE_PIOA->PIO_SODR = BSP_LED4;
             }
             break;
    }
}

//--------------------------------------------------------------------------------------------------------


void  OS_CPU_IRQ_ISR_Handler (void)
{
    BSP_PFNCT  pfnct;


#if 1
    pfnct = (BSP_PFNCT)AT91C_BASE_AIC->AIC_IVR;     /* Read the interrupt vector from the VIC          */
    if (pfnct != (BSP_PFNCT)0) {                    /* Make sure we don't have a NULL pointer          */
        (*pfnct)();                                 /* Execute the ISR for the interrupting device     */
    }
#else
    pfnct = (BSP_PFNCT)AT91C_BASE_AIC->AIC_IVR;     /* Read the interrupt vector from the VIC          */
    while (pfnct != (BSP_PFNCT)0) {                 /* Make sure we don't have a NULL pointer          */
      (*pfnct)();                                   /* Execute the ISR for the interrupting device     */
        pfnct = (BSP_PFNCT)AT91C_BASE_AIC->AIC_IVR; /* Read the interrupt vector from the VIC          */
    }
#endif
}

//--------------------------------------------------------------------------------------------------------


void  OS_CPU_FIQ_ISR_Handler (void)
{
    BSP_PFNCT  pfnct;


#if 1
    pfnct = (BSP_PFNCT)AT91C_BASE_AIC->AIC_FVR;     /* Read the interrupt vector from the VIC               */
    if (pfnct != (BSP_PFNCT)0) {                    /* Make sure we don't have a NULL pointer               */
        (*pfnct)();                                 /* Execute the ISR for the interrupting device          */
    }
#else
    pfnct = (BSP_PFNCT)AT91C_BASE_AIC->AIC_FVR;     /* Read the interrupt vector from the VIC               */
    while (pfnct != (BSP_PFNCT)0) {                 /* Make sure we don't have a NULL pointer               */
      (*pfnct)();                                   /* Execute the ISR for the interrupting device          */
        pfnct = (BSP_PFNCT)AT91C_BASE_AIC->AIC_FVR; /* Read the interrupt vector from the VIC               */
    }
#endif
}

//--------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------


static  void  Tmr_TickInit (void)
{
    INT32U  counts;

                                                /* Set the vector address for PIT                      */
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (INT32U)Tmr_TickISR_Handler;
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE | AT91C_AIC_PRIOR_LOWEST;
                                         //|AT91C_AIC_PRIOR_HIGHEST ;

    AT91C_BASE_AIC->AIC_ICCR              = 1 << AT91C_ID_SYS;
    AT91C_BASE_AIC->AIC_IECR              = 1 << AT91C_ID_SYS;

    counts                                = (48000000 / 16 / OS_TICKS_PER_SEC) - 1;
    //AT91C_BASE_PITC->PITC_PIMR            = AT91C_PITC_PITEN | AT91C_PITC_PITIEN | counts;
    AT91C_BASE_PITC->PITC_PIMR            =(1<<24 | 1<<25 | counts);
}


//--------------------------------------------------------------------------------------------------------
static  void  Tmr_TickISR_Handler (void)
{
    volatile  INT32U  status;


    status                    = AT91C_BASE_PITC->PITC_PIVR;
    AT91C_BASE_AIC->AIC_IVR   = 0;            /* Debug variant of vector read (protect mode is used)   */

    AT91C_BASE_AIC->AIC_ICCR  = AT91C_ID_SYS; /* Clear  timer #0 interrupt                             */
    AT91C_BASE_AIC->AIC_EOICR = 0;            /* Signal end of interrupt                               */
    OSTimeTick();                             /* Tell uC/OS-II about clock tick                        */
}

//---------------------------------------------------------------------------------------------------------
void  LED_On (INT8U led)
{
    switch (led) {
        case 0:
             AT91C_BASE_PIOA->PIO_CODR = BSP_LED4 | BSP_LED3 | BSP_LED2 | BSP_LED1;
             break;

        case 1:
             AT91C_BASE_PIOA->PIO_CODR = BSP_LED1;
             break;

        case 2:
             AT91C_BASE_PIOA->PIO_CODR = BSP_LED2;
             break;

        case 3:
             AT91C_BASE_PIOA->PIO_CODR = BSP_LED3;
             break;

        case 4:
             AT91C_BASE_PIOA->PIO_CODR = BSP_LED4;
             break;
    }
}
//-----------------------------------------------------------------------------------------------------

static  void  BSP_IntCtrlInit (void)
{
    INT16U  i;

    AT91C_BASE_AIC->AIC_EOICR         =  0x00000000;               /* End-of-interrupt command */

    for (i = 0; i < 32; i++) {                                     /* Disable all ISRs        */
        AT91C_BASE_AIC->AIC_SVR[i] = (INT32U)BSP_DummyISR_Handler;
        AT91C_BASE_AIC->AIC_SMR[i] = 0;
    }
}

⌨️ 快捷键说明

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