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

📄 top_init.c

📁 hi everybody enjoy hi everybody enjoy hi everybody enjoy hi everybody enjoy hi everybody enjoy hi ev
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************
 file ID                    	:Top_init.c
 Version Number           	:
 Project Code                	:
 Project Name               	:
 Architect    			:ProjectLeader
 Designer     			:
 Author                     	:  
 Date of last updation     	:10-02-2009
 Description             	: 

************************************************************************/
#include "uart_tr.h" 
#define BAUD_RATE 115200
#define BSP_RAM_REMAP_TEST_BYTE             (*(CPU_INT08U  *)0x00000030L)

  #define  BSP_GPIOA_RXD0                     DEF_BIT_00          /* UART0 (A): COM PORT 0 */
  #define  BSP_GPIOA_TXD0                     DEF_BIT_01          /* UART0 (A): COM PORT 0 */
  #define  BSP_GPIOA_RTS0                     DEF_BIT_03          /* UART0 (A): COM PORT 0 */
  #define  BSP_GPIOA_CTS0                     DEF_BIT_04          /* UART0 (A): COM PORT 0 */

  #define  BSP_GPIOA_DRXD                     DEF_BIT_27          /* DBGU  (A): Debug Port  */
  #define  BSP_GPIOA_DTXD                     DEF_BIT_28          /* DBGU  (A): Debug Port  */
  #define  BSP_GPIOA_RXD0                     DEF_BIT_00          /* UART0 (A): Debug Port  */
  #define  BSP_GPIOA_TXD0                     DEF_BIT_01          /* UART0 (A): Debug Port   */  
  
  #define  BSP_GPIOA_DBG                     (BSP_GPIOA_DRXD      |\
                                            BSP_GPIOA_DTXD)
  #define  BSP_GPIOA_UART0                   (BSP_GPIOA_RXD0      |\
                                            BSP_GPIOA_TXD0)


void  IntDisAll(void);             //defined 

static  void  PLL_Init(void);      //defined
static  void  IntCtrlInit(void);   //defined
static void joystic_handler( void );
static void UART0_handler( void );
static void UART_DBGU_handler( void );
static  void  DummyISR_Handler(void);   //defined
void  UART_Init(CPU_INT32U baud_rate);  //defined 
CPU_INT32U  GET_CPU_ClkFreq (void);     //defined
void     ADC_init(void);
void     LED_Init(void);
void     SPI_Init();
extern void Str_Printf(char*);


int test_array_size = 0 ;
char test_string[4];


extern unsigned int ISR_flag ;//Flag is set  by ISR of joystic


/*----------------------------------------------------------------------------*/
void  IntDisAll (void)
{
    AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;                      /* Disable all interrupts */
}
/*----------------------------------------------------------------------------*/
void  init_all(void)
{
    unsigned  int br = BAUD_RATE;                                               /* The selected baud rate*/
    
    AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;                              /* Disable the Watchdog Timer*/
    AT91C_BASE_RSTC->RSTC_RMR |= (CPU_INT32U)(0xA5 << 24) | AT91C_RSTC_URSTEN;  /* Enable the hardware reset button*/    
    
    PLL_Init();
    IntCtrlInit();
    UART_Init(br);
    CPU_SR_INT_En();
    ADC_init();
    LED_Init(); 
    SPI_Init();
}


void LED_Init()
{
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOB;              /* Enable peripheral clock              */
    AT91C_BASE_PIOB->PIO_PER = BSP_GPIOB_LEDS;                  /* Enable register                      */
    AT91C_BASE_PIOB->PIO_OER = BSP_GPIOB_LEDS;                  /* Output enable                        */
    AT91C_BASE_PIOB->PIO_IDR = BSP_GPIOB_LEDS;                  /* Disable LED pin interrupt            */
  
}

static  void ADC_init()
{    
    Str_Printf("\n\rInitializing ADC module...");
    AT91C_BASE_ADC->ADC_MR   |= 0x0F1D0B10 ;/*
                                          Selected ADC_CLOCK = 8Mhz=maximum clock possible for 8 bit resolution.
                                          *OF ==> SHTIM --> 2us.( needed <= 10*1/8Mhz  =1.25us )
                                          *1D ==> STARTUP -->30us.
                                          *0B ==> PRESCAL --> 11.
                                          *10 ==> SLEEP = Disabled ,LOWRES = 8Bit Resolution , TRGEN =  Software Trigger.  */    
    AT91C_BASE_ADC->ADC_CHER |= 0X00000010 ;          //Channel 4 enabled .
    AT91C_BASE_ADC->ADC_IDR  |= 0X00000010 ;          //disable ch4 interrupt.
    Str_Printf("\t\t\t[  OK  ]"); 
}


void  SPI_Init()
{
  
    CPU_INT16U  i;  
    AT91C_BASE_PMC->PMC_PCER  |= (1 << AT91C_ID_PIOA);
    AT91C_BASE_PIOA->PIO_PDR  |= ASP_GPIOA_SPI;                 /* Set GPIOA pins 49,50,55 and 56 as SPI pins */
    AT91C_BASE_PIOA->PIO_ASR  |= ASP_GPIOA_SPI;                 /* Select GPIOA attached peripheral (SPI)   */
    
        
    AT91C_BASE_PMC->PMC_PCER   = (1 << AT91C_ID_SPI1);           /* Enable the SPI1 peripheral clock */
    
    AT91C_BASE_SPI1->SPI_CR  = AT91C_SPI_SWRST;
    AT91C_BASE_SPI1->SPI_CR  = AT91C_SPI_SPIDIS;
    
   AT91C_BASE_SPI1->SPI_IDR   = 0x03FF;
    
    AT91C_BASE_SPI1->SPI_MR  = AT91C_SPI_MSTR                  /* Master mode selected */
                               | AT91C_SPI_PS_FIXED            /* Fixed Peripheral Selected */
                               | AT91C_SPI_PCS  ;              /*NPCS0*/
                                                                

     AT91C_BASE_SPI1->SPI_CSR[0] =  AT91C_SPI_CPOL       /*   Clock Polarity is active high & Clock Phase is set as 0*/
                                   | AT91C_SPI_CSAAT                  /*Chip Select Active After Transfer*/
                                   | AT91C_SPI_BITS_8                  /*8 Bits Per Transfer*/
                                   | AT91C_SPI_SCBR          // Serial clock Baud Rate = 200000
                                   | AT91C_SPI_DLYBS         // Delay before SPCK = 5us
                                   | AT91C_SPI_DLYBCT;       // Delay between consecutive transfers = 0.1ms
     
 
     AT91C_BASE_SPI1->SPI_CR  = AT91C_SPI_SPIEN;  /* Enabled the SPI */
    for(i=0;i<5000;i++);     
         
}




/*----------------------------------------------------------------------------*/
static  void  PLL_Init(void)
{
                                                                 /* ----------------- SET FLASH WAIT STATES ---------------- */
                                                             /* Set the number of flash wait states to 2                 */
    AT91C_BASE_MC->MC_FMR      |= (1 << 8);                     /* Since we are running > 30mhz out of flash                */

                                                                /* -------------------- SETUP CPU CLOCK ------------------- */
                                                                /* Enable the Main Oscillator                               */
    AT91C_BASE_PMC->PMC_MOR   = AT91C_CKGR_OSCOUNT | AT91C_CKGR_MOSCEN;

                                                                /* Wait for the Main Oscillator to start up                 */
    while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS) == 0) {
        ;
    }

    AT91C_BASE_PMC->PMC_PLLR  = 0x207C3F0C;                     /* Enable and set PLL                                       */
                                                                /* [07:00]  Divider     = 12                                */
                                                                /* [13:08]  PLL Count   = 63 slow clocks                    */
                                                                /* [26:16]  Multiplier  = (124 + 1) = 125                   */
                                                                /* [29:28]  USB Divider = 2                                 */
                                                                /* ===> MCLK   = 18432000 * 125 / 12 = 192 MHz               */
                                                                /* ===> USBCLK = MCLK / 4           =  48 MHz               */

                                                                /* Wait for the PLL to start up                             */
    while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK) == 0) {
        ;                     
    }

    while((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) == 0) {
        ;
    }
                                                                /* Main Clock will be equal to 1/4 of the PLL Clock         */
    AT91C_BASE_PMC->PMC_MCKR  =  AT91C_PMC_PRES_CLK_4;

    while((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) == 0) {
        ;
    }
                                                                /* Specify the PLL Clock as the source of the Main Clock    */
    AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;

    while((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) == 0) {
        ;
    }  
}
/*---------------------------------------------------------------------------------------------------*/
static  void  IntCtrlInit (void)
{
    CPU_INT16U  i;

    BSP_RAM_REMAP_TEST_BYTE = 0xAA;                             /* Write a byte to RAM                                      */

    #ifndef  RAM_REMAPPED
        if (BSP_RAM_REMAP_TEST_BYTE == 0xAA) {                      // Check if the write to RAM worked       
            AT91C_BASE_MC->MC_RCR =  1;                             // If so, toggle REMAP register  
    #else                                                           //--------------BEGIN CODE RUNNING OUT OF RAM
        OS_CPU_InitExceptVect();
    #endif                                                          //---------------END CODE RUNNING OUT OF RAM
    
    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] = (CPU_INT32U)DummyISR_Handler;
        AT91C_BASE_AIC->AIC_SMR[i] = 0;
    }
}
/*------------------------------------------------------------------------------*/
static  void  DummyISR_Handler (void)
{
    CPU_INT32U  irq_id;
    irq_id                   = AT91C_BASE_AIC->AIC_ISR & 0x1F;  /* Retrieve the ID of the interrupting source           */
    AT91C_BASE_AIC->AIC_ICCR =  (1 << irq_id);                  /* Clear the current interrupt                          */
    AT91C_BASE_AIC->AIC_IVR  = 0;                               /* Debug variant of vector read (protect mode is used)  */
}
/*----------------------------------------------------------------------*/
void joystick_init(void )         
{
    //----------------PIOA initialition.
    AT91C_BASE_PMC->PMC_PCER  |=   0x1 << AT91C_ID_PIOA;  //Enable peripheral clock              
    AT91C_BASE_PIOA->PIO_PER  |=   0x03E00000;            //Pioa Enable Register ;Enable PIOA TO CONTROL  PINs                      
    AT91C_BASE_PIOA->PIO_ODR  |=   0x03E00000;            //Output Disale Register ;Output Disabled ,made input pins   
    AT91C_BASE_PIOA->PIO_PPUER|=   0x03E00000;            //pull up P25,p21,p22,p23,p24 .
    AT91C_BASE_PIOA->PIO_IER  |=   0x03E00000;            //Enable Joystick PUSH pins interrupt  
      //-------------AIC initialition.
      AT91C_BASE_AIC->AIC_IDCR              |= 0X00000004 ;                     //disabling interrupts .
      AT91C_BASE_AIC->AIC_SVR[(CPU_INT32U)2] = (CPU_INT32U)joystic_handler;     //passing the handler address.
      AT91C_BASE_AIC->AIC_SMR[(CPU_INT32U)2] = 0X00000027;                      // +VE EDGE TRIGGER AND PRIORITY 7 (ITS given highets priority).
      AT91C_BASE_AIC->AIC_IECR              |= 0X00000004;                      //Enable interrupts .  02
}

static void joystic_handler( void )
{             
   CPU_INT32U irq_id,temp;
       
   AT91C_BASE_AIC->AIC_IVR = 0  ;                    //Write the IVR, as required TO CLEAR IT .
   irq_id  = AT91C_BASE_AIC->AIC_ISR & 0x1F;         // Retrieve the ID of the interrupting source   ( PIOA ) 
   AT91C_BASE_AIC->AIC_ICCR |=  (0x1 << irq_id);     // Clear the current interrupt ( PIOA )   
   
   ISR_flag = JOYSTIC_FLAG ; //setting flag for joystic interrupt
   temp = AT91C_BASE_PIOA->PIO_ISR ;      //reading PIO_ISR value,ISR register indicate a change since last read or reset For the joy stic
   temp++;

   AT91C_BASE_AIC->AIC_ICCR |= 0X00000004;         //Clear all interrupts from PIOA.
  
}//end of ISR.

/*--------------------------------------------------------------------------------*/
void  UART_Init(CPU_INT32U baud_rate)
{
   
    CPU_INT32U  pclk_freq;

⌨️ 快捷键说明

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