📄 cdac_init.c
字号:
/***********************************************************************
file ID :CDAC_init.c
Version Number :
Project Code :
Project Name :
Architect :ProjectLeader
Designer :
Author :
Date of last updation :02-04-2009
Description :
************************************************************************/
#include "CDAC_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 DummyISR_Handler(void); //defined
void UART_Init(CPU_INT32U baud_rate); //defined
CPU_INT32U GET_CPU_ClkFreq (void); //defined
//void UART_WrByte(CPU_INT08U tx_byte); //declared in CDAC_uart_tr.h
//void init_all(void); //declared in CDAC_uart_tr.h
//CPU_INT08U UART_RdByte(void);
/*----------------------------------------------------------------------------*/
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();
}
/*----------------------------------------------------------------------------*/
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 / 4 = 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 UART_Init(CPU_INT32U baud_rate)
{
CPU_INT32U pclk_freq;
pclk_freq = GET_CPU_ClkFreq(); /* Get the UART input clock frequency */
//#if (BSP_CFG_SER_COMM_SEL == BSP_SER_COMM_UART_DBG)
AT91C_BASE_PIOA->PIO_PDR |= BSP_GPIOA_DBG; /* Set GPIOA pins 9 and 10 as DBGU UART pins */
AT91C_BASE_PIOA->PIO_ASR |= BSP_GPIOA_DBG; /* Select GPIOA attached peripheral (DBGU) */
AT91C_BASE_DBGU->DBGU_IDR = AT91C_US_RXRDY /* Disable Rx interrupts */
| AT91C_US_TXRDY; /* Disable Tx interrupt */
AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN /* Enable the receiver */
| AT91C_US_TXEN; /* Enable the transmitter */
AT91C_BASE_DBGU->DBGU_MR = AT91C_US_USMODE_NORMAL /* Normal mode selected */
| AT91C_US_PAR_NONE; /* No parity bit selected */
/* Set the DBGU baud rate */
AT91C_BASE_DBGU->DBGU_BRGR = (CPU_INT16U)((pclk_freq) /baud_rate / 16);
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SYS); /* Enable the DBGU peripheral clock */
//#endif
//#if (BSP_CFG_SER_COMM_SEL == BSP_SER_COMM_UART_UART_00)
/* Set GPIOA pins 0 & 1 as US0 pins */
AT91C_BASE_PIOA->PIO_PDR = BSP_GPIOA_UART0;
AT91C_BASE_PIOA->PIO_PDR = BSP_GPIOA_UART0;
/* ---------------------- SETUP US0 ----------------------- */
AT91C_BASE_US0->US_IDR = AT91C_US_RXRDY /* Disable Rx interrupts */
| AT91C_US_TXRDY; /* Disable Tx interrupt */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -