📄 top_init.c
字号:
/***********************************************************************
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 + -