Blame view

RIOT/boards/wsn430-common/board_init.c 3.02 KB
a752c7ab   elopes   add first test an...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  /*
   * board_init.c - Implementation of functions to init board.
   * Copyright (C) 2013 Milan Babel <babel@inf.fu-berlin.de>
   *
   * This file is subject to the terms and conditions of the GNU Lesser
   * General Public License v2.1. See the file LICENSE in the top level
   * directory for more details.
   */
  
  #include "cpu.h"
  #include "irq.h"
  #include "board.h"
  #include "msp430.h"
  #include "debug.h"
  #include "uart_stdio.h"
  
  volatile static uint32_t __msp430_cpu_speed = MSP430_INITIAL_CPU_SPEED;
  
  void msp430_init_dco(void);
  
  typedef enum {
      MCLK_2MHZ_SCLK_1MHZ = 1000002uL,
      MCLK_4MHZ_SCLK_1MHZ = 1000004uL,
      MCLK_8MHZ_SCLK_1MHZ = 1000008uL,
      MCLK_8MHZ_SCLK_8MHZ = 8000000uL
  }speed_t;
  
  static void msb_ports_init(void)
  {
      // Port 1: GDO, Flash, BSL TX
      P1SEL = 0x02;    // Port1 Select: 00000010 = 0x02
      P1OUT = 0x00;    // Port1 Output: 00000000 = 0x00
      P1DIR = 0x87;    // Port1 Direction: 10000111 = 0x87
  
      // Port 2: GPIO, BSL RX, 1wire
      P2SEL = 0x04;    // Port2 Select: 00000100 = 0x04
      P2OUT = 0x00;    // Port2 Output: 00000000 = 0x00
      P2DIR = 0xFF;    // Port2 Direction: 11111111 = 0xFF
  
  
      // Port 3: UART
      P3SEL = 0xFE;    // Port3 Select: 11111110 = 0xFE
      P3OUT = 0x00;    // Port3 Output: 00000000 = 0x00
      P3DIR = 0xFF;    // Port3 Direction: 11111111 = 0xFF
  
  
      // Port 4: CS
      P4SEL = 0x00;    // Port4 Select: 00000000 = 0x00
      P4OUT = 0x14;    // Port4 Output: 00010100 = 0x14
      P4DIR = 0xFF;    // Port4 Direction: 11111111 = 0xFF
  
      // Port 5: SPI, LED
      P5SEL = 0x0E;    // Port5 Select: 00001110 = 0x0E
      P5OUT = 0x70;    // Port5 Output: 01110000 = 0x70
      P5DIR = 0x70;    // Port5 Direction: 01110000 = 0x70
  
  
      P6SEL = 0xFF;    // Port6 Select: 11111111 = 0xFF
      P6OUT = 0x00;    // Port6 Output: 00000000 = 0x00
      P6DIR = 0xFF;    // Port6 Direction: 11111000 = 0xF8
  
  }
  
  void msp430_set_cpu_speed(uint32_t speed)
  {
      irq_disable();
      __msp430_cpu_speed = speed;
      msp430_init_dco();
      irq_enable();
  }
  
  /*---------------------------------------------------------------------------*/
  void msp430_init_dco(void)
  {
    /*----------------------- use external oszillator -------------------------*/
    uint16_t i;
  
    // Stop watchdog
    WDTCTL = WDTPW + WDTHOLD;
  
    BCSCTL1 = RSEL2;
  
    // Wait for xtal to stabilize
    do {
      IFG1 &= ~OFIFG;                // Clear oscillator fault flag
      for (i = 0xFF; i > 0; i--);    // Time for flag to set
    }
    while ((IFG1 & OFIFG) != 0);     // Oscillator fault flag still set?
    switch (__msp430_cpu_speed) {
    case MCLK_2MHZ_SCLK_1MHZ:
        BCSCTL2  = (SELM_2 | DIVM_2) | (SELS | DIVS_3);
        break;
    case MCLK_4MHZ_SCLK_1MHZ:
        BCSCTL2  = (SELM_2 | DIVM_1) | (SELS | DIVS_3);
        break;
    case MCLK_8MHZ_SCLK_1MHZ:
        BCSCTL2 = SELM_2 | (SELS | DIVS_3);
        break;
    default:
        BCSCTL2 = SELM_2 + SELS;     // MCLK and SMCLK = XT2 (safe)
        break;
    }
  }
  
  void board_init(void)
  {
      msp430_cpu_init();
      msb_ports_init();
  
      msp430_set_cpu_speed(MCLK_8MHZ_SCLK_8MHZ);
  
      /* initialize STDIO over UART */
      uart_stdio_init();
  }