low_level_init.c
来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 204 行
C
204 行
/*************************************************************************
*
* Used with ICCARM and AARM.
*
* (c) Copyright IAR Systems 2007
*
* File name : low_level_init.c
* Description : low level init module - AITC, MUX, DBG UART
*
* History :
* 1. Date : May 14, 2007
* Author : Stanimir Bonev
* Description : Create
*
* $Revision: 1.0.0.0 $
*
**************************************************************************/
#include <limits.h>
#include "arm_comm.h"
#include "board.h"
#include <freescale/iomc9328mx21.h>
#pragma segment=".intvec"
#define INTR_TBL_BASE_ADDR 0xFFFFFF00
/*************************************************************************
* Function Name: getchar
* Parameters: none
*
* Return: int
*
* Description: Receive char by UART 1
*
*************************************************************************/
int getchar(void)
{
while(!USR1_1_bit.RRDY);
return(URXD_1_bit.RX_DATA);
}
/*************************************************************************
* Function Name: putchar
* Parameters: int c
*
* Return: int
*
* Description: Send char by UART 1
*
*************************************************************************/
int putchar(int c)
{
while(!USR1_1_bit.TRDY);
UTXD_1_bit.TX_DATA = c;
return(c);
}
/*************************************************************************
* Function Name: low_level_init
* Parameters: none
*
* Return: none
*
* Description: Low level init code
*
*************************************************************************/
__arm void low_level_init (void)
{
Int32U Num = UART1_BAUD_RATE * 16;
Int32U Denum = FCLK / PERDIV1;
// AHB-Lite IP Interface
AIPI1_PSR0 = 0x00040304;
AIPI1_PSR1 = 0xFFFBFCFB;
AIPI2_PSR0 = 0x3FFC0000;
AIPI2_PSR1 = 0xFFFFFFFF;
// Peripheral Access in supervision only
AIPI1_PAR = AIPI2_PAR = 0xFFFFFFFF;
// EIM
EIM_CNF_bit.BCM = 0;
// CS0 Initialization Burst Flash
CS0U = 0x00000701;
CS0L = 0x00000E01;
// CS1 Initialization
CS1U = 0x00002000;
CS1L = 0x11118501;
// Set PER1 clk dividers
PCDR1_bit.PCLK_DIV1 = PERDIV1-1;
#ifndef SDRAM_EXEC
// FCLK = 266MHz, HCLK = 133 MHz
CSCR_bit.PRESC = 0x0;
CSCR_bit.BCLKDIV = 0x1;
CSCR_bit.MPEN = 0x1; // MPLL Enable
CSCR_bit.SPEN = 0x1; // Serial Peripheral PLL Enable
// configure MPCTL for 266 MHz
MPCTL0 = 0x007B1C73;
// configure SPLL for 240 MHz
SPCTL0 = 0x03811C89;
// restart the MPCTL
CSCR_bit.MPLL_RESTART = 1;
// restart the SPLL
CSCR_bit.SPLL_RESTART = 1;
// SDRAM
// CSD0 Initialization (SDRAM) 16Mx16x2 IAM=0 CSD0 CL3
SDCTL0 = 0x92120300; // Set Precharge Command
// A10 - High Issue Precharge all Command
*(volatile Int32U *)(SDRAM_PRECHARGE_ALL + SDRAM_BASE_ADDRESS) = 0;
SDCTL0 = 0xA2120300; // Set AutoRefresh Command
// AutoRefresh x8
*(volatile Int32U *)(SDRAM_BASE_ADDRESS) = 0;
*(volatile Int32U *)(SDRAM_BASE_ADDRESS) = 0;
*(volatile Int32U *)(SDRAM_BASE_ADDRESS) = 0;
*(volatile Int32U *)(SDRAM_BASE_ADDRESS) = 0;
*(volatile Int32U *)(SDRAM_BASE_ADDRESS) = 0;
*(volatile Int32U *)(SDRAM_BASE_ADDRESS) = 0;
*(volatile Int32U *)(SDRAM_BASE_ADDRESS) = 0;
*(volatile Int32U *)(SDRAM_BASE_ADDRESS) = 0;
// Set mode register
SDCTL0 = 0xB2120300; // Set Mode Register
*(Int32U *)(SDRAM_BASE_ADDRESS + SDRAM_MODE_REG) = 0; // Issue Mode Register Command
// Set to Normal Mode
// From the spec of the SDRAM
// 1. tRCD = 19ns minimum -> RCD = 3 clk (SDCLK=133MHz) -> SRCD = 11b
// 2. tRP = 19ns minimum -> RP = 3 clk (SDCLK=133MHz) -> SRP = 0b
// 3. tRC = 65ns minimum -> RC = 9 clk (SDCLK=133MHz) -> SRC = 1001b
// 4. refresh rate = 8192rows/64ms -> SREFR = 11b
SDCTL0 = 0x8212F339;
#endif // SDRAM_EXEC
// MUX
PCSR = 0x00000003; // Set high priority masters (0,1)
// init Slave General Purpose Control Register
SGPCR0 = SGPCR1 = SGPCR2 = 0x00000100;
// init Master Priority Register
MPR0 = MPR1 = MPR2 = 0x00543210;
// init Master General Purpose Control Register
MGPCR0 = MGPCR1 = MGPCR2 = 2;
// AITC
INTCNTL_bit.FIDIS = \
INTCNTL_bit.NIDIS = 1; // Disable all normal and fast interrupts
INTCNTL_bit.ABFEN = 0; // ABFLAG bit is normal
INTCNTL_bit.NIAD = 0; // Disregard the normal interrupt flag
INTCNTL_bit.FIAD = 1; // Fast interrupt flag increases the
// bus arbitration priority
INTCNTL_bit.MD = 0; // Interrupt vector table located in
// high memory from 0xFFFF_FF00 to 0xFFFF_FFFF
INTENABLEH =\
INTENABLEL = 0; // all interrupts are disable
INTTYPEH =\
INTTYPEL = 0; // all interrupt lines are routed to the normal interrupt
NIMASK = 0x10; // Do not disable any normal interrupts
// Init Interrupt vector table
// IRQ
*(Int32U *)((INTR_TBL_BASE_ADDR-IRQV)+ IRQV) = (Int32U)__sfb(".intvec")+IRQV;
// FIQ
*(Int32U *)((INTR_TBL_BASE_ADDR-IRQV)+ FIQV) = (Int32U)__sfb(".intvec")+FIQV;
// Undef
*(Int32U *)((INTR_TBL_BASE_ADDR-IRQV)+ UNDEFV) = (Int32U)__sfb(".intvec")+UNDEFV;
// SWI
*(Int32U *)((INTR_TBL_BASE_ADDR-IRQV)+ SWIV) = (Int32U)__sfb(".intvec")+SWIV;
// Prefetch abort
*(Int32U *)((INTR_TBL_BASE_ADDR-IRQV)+PABORTV) = (Int32U)__sfb(".intvec")+PABORTV;
// Data abort
*(Int32U *)((INTR_TBL_BASE_ADDR-IRQV)+DABORTV) = (Int32U)__sfb(".intvec")+DABORTV;
// DBG UART Init
// Uart1 Clock enable
PCCR0_bit.UART1_EN = 1;
// Uart disable
UCR1_1 = 0x0;
// Assign pins RxD and TxD
PTE_GIUS_bit.PIN12 = 0;PTE_GPR_bit.PIN12 = 0;
PTE_GIUS_bit.PIN13 = 0;PTE_GPR_bit.PIN13 = 0;
// Set PER clk dividers
PCDR1_bit.PCLK_DIV1 = PERDIV1-1;
// Div 1
UFCR_1_bit.RFDIV = 5;
UFCR_1_bit.TXTL = 2;
// 8 bit, No Parity, 1 stop, TX Enable, RX Enable
UCR3_1 = UCR4_1 = 0;
UCR2_1 = 0x4026;
// Init Serial DBG 115200 PERCLK1 - MPLL_CLK / 16 - 16.625MHz
while ((Num > USHRT_MAX) || (Denum > USHRT_MAX))
{
Num >>=1; Denum>>=1;
}
// update of baud only when write in this order
UBIR_1 = Num - 1;
UBMR_1 = Denum - 1;
// UART Enable
UCR1_1 |= 0x1;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?