board_lowlevel.c
上传用户:jnhtjd
上传日期:2022-07-16
资源大小:403k
文件大小:7k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /* ----------------------------------------------------------------------------
  2.  *         ATMEL Microcontroller Software Support 
  3.  * ----------------------------------------------------------------------------
  4.  * Copyright (c) 2008, Atmel Corporation
  5.  *
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions are met:
  10.  *
  11.  * - Redistributions of source code must retain the above copyright notice,
  12.  * this list of conditions and the disclaimer below.
  13.  *
  14.  * Atmel's name may not be used to endorse or promote products derived from
  15.  * this software without specific prior written permission.
  16.  *
  17.  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  20.  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  22.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  23.  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  24.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  25.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  26.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * ----------------------------------------------------------------------------
  28.  */
  29. //------------------------------------------------------------------------------
  30. /// unit
  31. ///
  32. /// !Purpose
  33. ///
  34. /// Provides the low-level initialization function that gets called on chip
  35. /// startup.
  36. ///
  37. /// !Usage
  38. ///
  39. /// LowLevelInit() is called in #board_cstartup.S#.
  40. //------------------------------------------------------------------------------
  41. //------------------------------------------------------------------------------
  42. //         Headers
  43. //------------------------------------------------------------------------------
  44. #include "board.h"
  45. #include "board_memories.h"
  46. #include <pmc/pmc.h>
  47. //------------------------------------------------------------------------------
  48. //         Internal definitions
  49. //------------------------------------------------------------------------------
  50. // Startup time of main oscillator (in number of slow clock ticks).
  51. #define BOARD_OSCOUNT           (AT91C_CKGR_OSCOUNT & (0x40 << 8))
  52. // USB PLL divisor value to obtain a 48MHz clock.
  53. #define BOARD_USBDIV            AT91C_CKGR_USBDIV_1
  54. // PLL frequency range.
  55. #define BOARD_CKGR_PLL          AT91C_CKGR_OUT_0
  56. // PLL startup time (in number of slow clock ticks).
  57. #define BOARD_PLLCOUNT          (16 << 8)
  58. // PLL MUL value.
  59. #define BOARD_MUL               (AT91C_CKGR_MUL & (72 << 16))
  60. // PLL DIV value.
  61. #define BOARD_DIV               (AT91C_CKGR_DIV & 14)
  62. // Master clock prescaler value.
  63. #define BOARD_PRESCALER         AT91C_PMC_PRES_CLK_2
  64. //------------------------------------------------------------------------------
  65. //         Internal functions
  66. //------------------------------------------------------------------------------
  67. //------------------------------------------------------------------------------
  68. /// Default spurious interrupt handler. Infinite loop.
  69. //------------------------------------------------------------------------------
  70. void defaultSpuriousHandler( void )
  71. {
  72.     while (1);
  73. }
  74. //------------------------------------------------------------------------------
  75. /// Default handler for fast interrupt requests. Infinite loop.
  76. //------------------------------------------------------------------------------
  77. void defaultFiqHandler( void )
  78. {
  79.     while (1);
  80. }
  81. //------------------------------------------------------------------------------
  82. /// Default handler for standard interrupt requests. Infinite loop.
  83. //------------------------------------------------------------------------------
  84. void defaultIrqHandler( void )
  85. {
  86.     while (1);
  87. }
  88. //------------------------------------------------------------------------------
  89. //         Exported functions
  90. //------------------------------------------------------------------------------
  91. //------------------------------------------------------------------------------
  92. /// Performs the low-level initialization of the chip. This includes EFC, master
  93. /// clock, AIC & watchdog configuration, as well as memory remapping.
  94. //------------------------------------------------------------------------------
  95. void LowLevelInit( void )
  96. {
  97.     unsigned char i;
  98.     /* Set flash wait states in the EFC
  99.      **********************************/
  100.     /* 48MHz = 1 wait state */
  101. #if defined(at91sam7x512)
  102.     AT91C_BASE_EFC0->EFC_FMR = AT91C_MC_FWS_1FWS;
  103.     AT91C_BASE_EFC1->EFC_FMR = AT91C_MC_FWS_1FWS;
  104. #elif defined(at91sam7x128) || defined(at91sam7x256)
  105.     AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS;
  106. #else
  107.     #error No chip definition ?
  108. #endif
  109.     /* Initialize main oscillator
  110.      ****************************/
  111.     AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN;
  112.     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
  113.     /* Initialize PLL at 96MHz (96.109) and USB clock to 48MHz */
  114.     AT91C_BASE_PMC->PMC_PLLR = BOARD_USBDIV | BOARD_CKGR_PLL | BOARD_PLLCOUNT
  115.                                | BOARD_MUL | BOARD_DIV;
  116.     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));
  117.     /* Wait for the master clock if it was already initialized */
  118.     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
  119.     /* Switch to fast clock
  120.      **********************/
  121.     /* Switch to slow clock + prescaler */
  122.     AT91C_BASE_PMC->PMC_MCKR = BOARD_PRESCALER;
  123.     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
  124.     /* Switch to fast clock + prescaler */
  125.     AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;
  126.     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
  127.     /* Initialize AIC
  128.      ****************/
  129.     AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;
  130.     AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler;
  131.     for (i = 1; i < 31; i++) {
  132.         AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler;
  133.     }
  134.     AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler;
  135.     // Unstack nested interrupts
  136.     for (i = 0; i < 8 ; i++) {
  137.         AT91C_BASE_AIC->AIC_EOICR = 0;
  138.     }
  139.     // Enable Debug mode
  140.     AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT;
  141.     /* Watchdog initialization
  142.      *************************/
  143.     AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;
  144.     /* Remap
  145.      *******/
  146.     BOARD_RemapRam();
  147.     // Disable RTT and PIT interrupts (potential problem when program A
  148.     // configures RTT, then program B wants to use PIT only, interrupts
  149.     // from the RTT will still occur since they both use AT91C_ID_SYS)
  150.     AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN);
  151.     AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN;
  152. }