]> git.sur5r.net Git - freertos/blob - Demo/uIP_Demo_IAR_ARM7/SrcIAR/Cstartup_SAM7.c
UpdUpdate IAR projects to use Embedded Workbench V5.11.
[freertos] / Demo / uIP_Demo_IAR_ARM7 / SrcIAR / Cstartup_SAM7.c
1 //-----------------------------------------------------------------------------\r
2 //         ATMEL Microcontroller Software Support  -  ROUSSET  -\r
3 //-----------------------------------------------------------------------------\r
4 // DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
5 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
6 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
7 // DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
8 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
9 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
10 // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
11 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
12 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
13 // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
14 //-----------------------------------------------------------------------------\r
15 // File Name           : Cstartup_SAM7.c\r
16 // Object              : Low level initialisations written in C for Tools\r
17 //                       For AT91SAM7X256 with 2 flash plane\r
18 // Creation            : JPP  14-Sep-2006\r
19 //-----------------------------------------------------------------------------\r
20 \r
21 \r
22 #include "Board.h"\r
23 //  The following functions must be write in ARM mode this function called\r
24 // directly by exception vector\r
25 extern void AT91F_Spurious_handler(void);\r
26 extern void AT91F_Default_IRQ_handler(void);\r
27 extern void AT91F_Default_FIQ_handler(void);\r
28 \r
29 //*----------------------------------------------------------------------------\r
30 //* \fn    AT91F_LowLevelInit\r
31 //* \brief This function performs very low level HW initialization\r
32 //*        this function can use a Stack, depending the compilation\r
33 //*        optimization mode\r
34 //*----------------------------------------------------------------------------\r
35 void AT91F_LowLevelInit(void) @ "ICODE"\r
36 {\r
37     unsigned char i;\r
38     ///////////////////////////////////////////////////////////////////////////\r
39     // EFC Init\r
40     ///////////////////////////////////////////////////////////////////////////\r
41     AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS ;\r
42 \r
43     ///////////////////////////////////////////////////////////////////////////\r
44     // Init PMC Step 1. Enable Main Oscillator\r
45     // Main Oscillator startup time is board specific:\r
46     // Main Oscillator Startup Time worst case (3MHz) corresponds to 15ms\r
47     // (0x40 for AT91C_CKGR_OSCOUNT field)\r
48     ///////////////////////////////////////////////////////////////////////////\r
49     AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x40 <<8) | AT91C_CKGR_MOSCEN ));\r
50     // Wait Main Oscillator stabilization\r
51     while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));\r
52 \r
53     ///////////////////////////////////////////////////////////////////////////\r
54     // Init PMC Step 2.\r
55     // Set PLL to 96MHz (96,109MHz) and UDP Clock to 48MHz\r
56     // PLL Startup time depends on PLL RC filter: worst case is choosen\r
57     // UDP Clock (48,058MHz) is compliant with the Universal Serial Bus\r
58     // Specification (+/- 0.25% for full speed)\r
59     ///////////////////////////////////////////////////////////////////////////\r
60     AT91C_BASE_PMC->PMC_PLLR = AT91C_CKGR_USBDIV_1           |\r
61                                                    (16 << 8)                     |\r
62                                (AT91C_CKGR_MUL & (72 << 16)) |\r
63                                (AT91C_CKGR_DIV & 14);\r
64     // Wait for PLL stabilization\r
65     while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK) );\r
66     // Wait until the master clock is established for the case we already\r
67     // turn on the PLL\r
68     while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );\r
69 \r
70     ///////////////////////////////////////////////////////////////////////////\r
71     // Init PMC Step 3.\r
72     // Selection of Master Clock MCK equal to (Processor Clock PCK) PLL/2=48MHz\r
73     // The PMC_MCKR register must not be programmed in a single write operation\r
74     // (see. Product Errata Sheet)\r
75     ///////////////////////////////////////////////////////////////////////////\r
76     AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;\r
77     // Wait until the master clock is established\r
78     while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );\r
79 \r
80     AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;\r
81     // Wait until the master clock is established\r
82     while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );\r
83 \r
84     ///////////////////////////////////////////////////////////////////////////\r
85     //  Disable Watchdog (write once register)\r
86     ///////////////////////////////////////////////////////////////////////////\r
87     AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;\r
88 \r
89     ///////////////////////////////////////////////////////////////////////////\r
90     //  Init AIC: assign corresponding handler for each interrupt source\r
91     ///////////////////////////////////////////////////////////////////////////\r
92     AT91C_BASE_AIC->AIC_SVR[0] = (int) AT91F_Default_FIQ_handler ;\r
93     for (i = 1; i < 31; i++) {\r
94         AT91C_BASE_AIC->AIC_SVR[i] = (int) AT91F_Default_IRQ_handler ;\r
95     }\r
96     AT91C_BASE_AIC->AIC_SPU = (unsigned int) AT91F_Spurious_handler;\r
97 }\r