OSDN Git Service

475ea35e5da9904fc0c7d1b0f3b7bf91a156710e
[fast-forth/master.git] / inc / MSP_EXP430FR5739.asm
1 ; -*- coding: utf-8 -*-
2
3 ; ----------------------------------------------------------------------
4 ; MSP_EXP430FR739.asm
5 ; ----------------------------------------------------------------------
6 ; ----------------------------------------------------------------------
7 ; MSP430FR57xx BOOTSTRAP
8 ; ----------------------------------------------------------------------
9 ; BSL for MSP430FR573x devices
10 ; BSL Version 00.04.31.71
11 ; RAM erased 0x1C00-0x1FFF
12 ; Buffer size for Core Commands : 260 bytes
13 ; Notable Information
14 ; 1. TX and RX pins are noted in the device data sheet
15 ; 2. A mass erase command or incorrect password triggers a BSL reset.
16 ;    This resets the BSL state to the default settings (9600 baud, password locked)
17 ; Known Bugs
18 ; 1. The baud rate of 115k cannot be ensured across all clock, voltage, and temperature variations
19 ; ----------------------------------------------------------------------
20 ; ======================================================================
21 ; INIT MSP-EXP430FR5739 board
22 ; ======================================================================
23
24 ; J3 (5xjumper), silkscreen printing:
25 ; "TEST" - FR5739 pin19 = TEST
26 ; "RST"  - FR5739 pin20 = RST
27 ; "RXD"  - FR5739 pin22 = P2.1 == UCA0RXD --> UCA0RXDBUF
28 ; "TXD"  - FR5739 pin21 = P2.0 == UCA0TXD <-- UCA0TXDBUf
29 ; "VCC"  - + upper side
30
31 ; 8x blue LEDs in a row.   (portpinX->---resistor---LED---GND)
32 ; PJ.0 - LED1
33 ; PJ.1 - LED2
34 ; PJ.2 - LED3
35 ; PJ.3 - LED4
36 ; P3.4 - LED5
37 ; P3.5 - LED6
38 ; P3.6 - LED7
39 ; P3.7 - LED8
40
41 ; I/O pins on SV1:
42 ; P1.0 - SV1.1
43 ; P1.1 - SV1.2
44 ; P1.2 - SV1.3
45 ; P3.0 - SV1.4
46 ; P3.1 - SV1.5
47 ; P3.2 - SV1.6
48 ; P3.3 - SV1.7
49 ; P1.3 - SV1.8
50 ; P1.4 - SV1.9
51 ; P1.5 - SV1.10
52 ; P4.0 - SV1.11
53 ; GND  - SV1.12
54
55 ; I/O pins on SV2:
56 ; P1.7 - SV2.1
57 ; P1.6 - SV2.2
58 ; P3.7 - SV2.3
59 ; P3.6 - SV2.4
60 ; P3.5 - SV2.5
61 ; P3.4 - SV2.6
62 ; P2.2 - SV2.7
63 ; P2.1 - SV2.8
64 ; P2.6 - SV2.9
65 ; P2.5 - SV2.10
66 ; P2.0 - SV2.11
67 ; VCC  - SV2.12
68
69 ; I/O pins on RF:
70 ; GND  - RF.1
71 ; VCC  - RF.2
72 ; P2.0 - RF.3
73 ; P1.0 - RF.4
74 ; P2.6 - RF.5
75 ; P1.1 - RF.6
76 ; P2.5 - RF.7
77 ; P1.2 - RF.8
78 ; P2.7 - RF.9
79 ; P2.3 - RF.10
80 ; P4.0 - RF.11
81 ; GND  - RF.12
82 ; P4.1 - RF.13
83 ; P2.4 - RF.14
84 ; P1.7 - RF.15
85 ; P2.2 - RF.16
86 ; P1.3 - RF.17
87 ; P1.6 - RF.18
88
89 ; Accelerometer:
90 ; P2.7 - VS
91 ; P3.0 - XOUT
92 ; P3.1 - YOUT
93 ; P3.2 - ZOUT
94
95 ; LDR and NTC:
96 ; P2.7 - VS
97 ; P3.3 - LDR
98 ; P1.4 - NTC
99
100 ; RST - reset
101
102 ; ======================================================================
103 ; MSP-EXP430FR5739 LAUNCHPAD    <--> OUTPUT WORLD
104 ; ======================================================================
105 ;
106 ; P4.0 - Switch S1              <--- LCD contrast + (finger :-)
107 ; P4.1 - Switch S2              <--- LCD contrast - (finger :-)
108 ;
109 ;  GND                          <-------+---0V0---------->  1 LCD_Vss
110 ;  VCC                          >------ | --3V6-----+---->  2 LCD_Vdd
111 ;                                       |           |
112 ;                                     |___    470n ---
113 ;                                       ^ |        ---
114 ;                                      / \ BAT54    |
115 ;                                      ---          |
116 ;                                  100n |    2k2    |
117 ; P1.5 - UCB0 CLK  TB0.2 SV1.10 >---||--+--^/\/\/v--+---->  3 LCD_Vo (=0V6 without modulation)
118 ; P3.4 -                 SV2.6  ------------------------->  4 LCD_RS
119 ; P3.5 -                 SV2.5  ------------------------->  5 LCD_R/W
120 ; P3.6 -                 SV2.4  ------------------------->  6 LCD_EN
121 ; P1.0 -                 SV1.1  <------------------------> 11 LCD_DB4
122 ; P1.1 -                 SV1.2  <------------------------> 12 LCD_DB5
123 ; P1.2 -                 SV1.3  <------------------------> 13 LCD_DB5
124 ; P1.3 -                 SV1.8  <------------------------> 14 LCD_DB7
125 ;
126 ; PJ.4 - LFXI 32768Hz quartz
127 ; PJ.5 - LFXO 32768Hz quartz
128 ; PJ.6 - HFXI
129 ; PJ.7 - HFXO
130 ;                                 +--4k7-< DeepRST <-- GND
131 ;                                 |
132 ; P2.0 -  UCA0 TXD       SV2.11 --+-> RX  UARTtoUSB bridge
133 ; P2.1 -  UCA0 RXD       SV2.8  <---- TX  UARTtoUSB bridge
134 ;  VCC -                        <---- VCC (optional supply from UARTtoUSB bridge - WARNING ! 3.3V !)
135 ;  GND -                        <---> GND (optional supply from UARTtoUSB bridge)
136 ;
137 ; ---------------------------------------------------------------------------
138 ; SD_CardAdapter not compatible with HARDWARE flow control for FORTH TERMINAL
139 ; ---------------------------------------------------------------------------
140 ; VCC  -                 RF.2
141 ; VSS  -                 RF.1
142 ; P2.2 -                 RF.16  <---- CD  SD_CardAdapter (Card Detect) / RTS
143 ; P2.3 -                 RF.10  ----> CS  SD_CardAdapter (Card Select) / CTS
144 ; P2.4 - UCA1 CLK        RF.14  ----> CLK SD_CardAdapter (SCK)
145 ; P2.5 - UCA1 TXD/SIMO   RF.7   ----> SDI SD_CardAdapter (MOSI)
146 ; P2.6 - UCA1 RXD/SOMI   RF.5   <---- SDO SD_CardAdapter (MISO)
147 ;
148 ; P2.7 -                 RF.9   <---- OUT IR_Receiver (1 TSOP32236)
149 ;
150 ; P1.6 - UCB0 SDA/SIMO   SV2.2  <---> SDA I2C MASTER/SLAVE
151 ; P1.7 - UCB0 SCL/SOMI   SV2.1  <---> SCL I2C MASTER/SLAVE
152
153
154 ; Clocks:
155 ; 8 MHz DCO intern
156
157
158
159 ; ----------------------------------------------------------------------
160 ; POWER ON RESET AND INITIALIZATION : LOCK I/O as high impedance state
161 ; ----------------------------------------------------------------------
162
163     BIS #LOCKLPM5,&PM5CTL0 ; unlocked by WARM
164
165 ; ----------------------------------------------------------------------
166 ; POWER ON RESET AND INITIALIZATION PAIN=PORT2:PORT1
167 ; ----------------------------------------------------------------------
168
169 ; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
170
171 ; PORT 1  usage
172 ; P1.4 is used as analog input from NTC voltage divider
173
174     .IFDEF UCB0_TERM
175 TERM_IN     .equ    P1IN
176 TERM_SEL    .equ    P1SEL1
177 TERM_REN    .equ    P1REN
178 SDA         .equ    40h        ; P1.6 = SDA
179 SCL         .equ    80h        ; P1.7 = SCL
180 BUS_TERM    .equ    0C0h
181     .ENDIF
182
183     .IFDEF UCA0_TERM
184 TERM_IN     .equ    P2IN
185 TERM_SEL    .equ    P2SEL1
186 TERM_REN    .equ    P2REN
187 TXD         .equ    1          ; P2.0 = TXD
188 RXD         .equ    2          ; P2.1 = RXD
189 BUS_TERM    .equ    3
190     .ENDIF
191
192     .IFDEF UCA1_SD
193 SD_SEL      .equ    PASEL1     ; to configure UCB0
194 SD_REN      .equ    PAREN      ; to configure pullup resistors
195 BUS_SD      .equ    7000h      ; pins P2.4 as UCB0CLK, P2.5 as UCB0SIMO & P2.6 as UCB0SOMI
196     .ENDIF
197
198 SD_CDIN     .equ    P2IN
199 SD_CSOUT    .equ    P2OUT
200 SD_CSDIR    .equ    P2DIR
201 CD_SD       .equ    4          ; P2.2
202 CS_SD       .equ    8          ; P2.3
203
204 HANDSHAKOUT .equ    P2OUT
205 HANDSHAKIN  .equ    P2IN
206 RTS         .equ    4           ; P2.2
207 CTS         .equ    8           ; P2.3
208
209 ; RTS output is wired to the CTS input of UART2USB bridge
210 ; configure RTS as output high to disable RX TERM during start FORTH
211
212 ; P2.7 is used to power the accelerometer and NTC voltage divider ==> output low = power OFF
213
214     MOV #-1,&PAREN      ; all pins inputs with pull up/down resistor
215     MOV #07FEFh,&PAOUT  ; all input pins with pull up resistor else P2.7 and P1.4
216
217     .IFDEF TERMINAL4WIRES
218 ; RTS output is wired to the CTS input of UART2USB bridge
219 ; configure RTS as output high to disable RX TERM during start FORTH
220             BIS.B #RTS,&P2DIR   ; RTS as output high
221         .IFDEF TERMINAL5WIRES
222 ; CTS input must be wired to the RTS output of UART2USB bridge
223 ; configure CTS as input low (true) to avoid lock when CTS is not wired
224             BIC.B #CTS,&P2OUT   ; CTS input pulled down
225         .ENDIF  ; TERMINAL5WIRES
226     .ENDIF  ; TERMINAL4WIRES
227
228 ; ----------------------------------------------------------------------
229 ; POWER ON RESET AND INITIALIZATION : PORT3/4
230 ; ----------------------------------------------------------------------
231 ; PB = P4:P3
232
233 ; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
234
235 ; P3 FastForth usage
236 ; P3.0 to P3.2 are accelerometer analog outputs
237
238 ; P3.4 to P3.7 are blues LEDs : set output low = OFF
239
240 ; P4 FastForth usage
241 ; P4.0 Switch S1
242 ; P4.1 switch S2
243
244 SW1_IN      .equ P4IN
245 SW1         .equ 1          ; P4.0 = S1
246
247 SW2_IN      .equ P4IN
248 SW2         .equ 2          ; P4.1 = S2
249
250
251 ; PORTx default wanted state : pins as input with pullup resistor
252
253     MOV #-1,&PBREN      ; all pins inputs with pull up/down resistor
254     BIS #0FF08h,&PBOUT  ; all pins with pull up resistor else blues LEDs and ADC inputs
255
256 ; ----------------------------------------------------------------------
257 ; POWER ON RESET AND INITIALIZATION : PORTJ
258 ; ----------------------------------------------------------------------
259
260 ; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
261
262
263 ; PJ FastForth usage
264 ; PJ.0 to PJ.3 are  blues LEDs : set as output low = OFF
265
266 LED1_OUT    .equ    PJOUT
267 LED1_DIR    .equ    PJDIR
268 LED1        .equ    1           ;  PJ.0 LED1 blue
269
270 LED2_OUT    .equ    PJOUT
271 LED2_DIR    .equ    PJDIR
272 LED2        .equ    2           ;  PJ.1 LED2 blue
273
274 ; PORTx default wanted state : pins as input with pullup resistor else leds output low
275
276     BIS.B #-1,&PJREN    ; all pins inputs with pull up/down resistor
277     MOV.B #0F0h,&PJOUT  ; all pins with pull up resistor else blues LEDs
278
279
280 ; ----------------------------------------------------------------------
281 ; POWER ON RESET AND INITIALIZATION : CLOCK SYSTEM
282 ; ----------------------------------------------------------------------
283
284 ; DCOCLK: Internal digitally controlled oscillator (DCO).
285
286             MOV.B   #CSKEY,&CSCTL0_H ;  Unlock CS registers
287
288     .IF FREQUENCY = 0.25
289 ;            MOV     #DCOFSEL1+DCOFSEL0,&CSCTL1      ; Set 8MHZ DCO setting (default value)
290             MOV     #DIVA_0 + DIVS_32 + DIVM_32,&CSCTL3
291
292     .ELSEIF FREQUENCY = 0.5
293 ;            MOV     #DCOFSEL1+DCOFSEL0,&CSCTL1      ; Set 8MHZ DCO setting (default value)
294             MOV     #DIVA_0 + DIVS_16 + DIVM_16,&CSCTL3
295
296     .ELSEIF FREQUENCY = 1
297 ;            MOV     #DCOFSEL1+DCOFSEL0,&CSCTL1      ; Set 8MHZ DCO setting (default value)
298             MOV     #DIVA_0 + DIVS_8 + DIVM_8,&CSCTL3
299
300     .ELSEIF FREQUENCY = 2
301 ;            MOV     #DCOFSEL1+DCOFSEL0,&CSCTL1      ; Set 8MHZ DCO setting (default value)
302             MOV     #DIVA_0 + DIVS_4 + DIVM_4,&CSCTL3
303
304     .ELSEIF FREQUENCY = 4
305 ;            MOV     #DCOFSEL1+DCOFSEL0,&CSCTL1          ; Set 8MHZ DCO setting (default value)
306             MOV     #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3
307
308     .ELSEIF FREQUENCY = 8
309 ;            MOV     #DCOFSEL1+DCOFSEL0,&CSCTL1          ; Set 8MHZ DCO setting (default value)
310             MOV     #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3   ; set all dividers as 0
311
312     .ELSEIF FREQUENCY = 10
313             MOV     #DCORSEL+DCOFSEL1,&CSCTL1           ; Set 20 MHZ DCO setting
314             MOV     #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3   ; then SMCLK/2 MCLK/2
315             MOV     #160,X
316
317     .ELSEIF FREQUENCY = 12
318             MOV     #DCORSEL+DCOFSEL1+DCOFSEL0,&CSCTL1  ; Set 24 MHZ DCO setting
319             MOV     #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3   ; then SMCLK/2 MCLK/2
320
321     .ELSEIF FREQUENCY = 16
322             MOV     #DCORSEL,&CSCTL1                    ; Set 16MHZ DCO setting
323             MOV     #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3   ; set all dividers as 0
324
325     .ELSEIF FREQUENCY = 20
326             MOV     #DCORSEL+DCOFSEL1,&CSCTL1           ; Set 20 MHZ DCO setting
327             MOV     #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3   ; set all dividers as 0
328
329     .ELSEIF FREQUENCY = 24
330             MOV     #DCORSEL+DCOFSEL1+DCOFSEL0,&CSCTL1  ; Set 24 MHZ DCO setting
331             MOV     #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3   ; set all dividers as 0
332
333     .ELSEIF
334     .error "bad frequency setting, only 0.25,0.5,1,2,4,8,12,16,20,24 MHz"
335     .ENDIF
336
337     .IFDEF LF_XTAL
338             MOV     #SELA_LFXCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
339     .ELSE
340             MOV     #SELA_VLOCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
341     .ENDIF
342             MOV.B   #01h, &CSCTL0_H                     ; Lock CS Registers
343
344             MOV     #64,X           ; 64* 3 ms = 192 ms delay (by default of specification)
345 ClockWaitX  MOV     &FREQ_KHZ,Y     ;
346 ClockWaitY  SUB     #1,Y            ;1
347             JNZ     ClockWaitY      ;2 FREQ_KHZ x 3 ==> 3ms
348             SUB     #1,X            ;
349             JNZ     ClockWaitX      ;
350
351 ; ----------------------------------------------------------------------
352 ; POWER ON RESET AND INITIALIZATION : REF
353 ; ----------------------------------------------------------------------
354             BIS.W   #REFTCOFF, &REFCTL  ; Turn off temp.
355             BIC.W   #REFON, &REFCTL
356
357 ; ----------------------------------------------------------------------
358 ; POWER ON RESET AND INITIALIZATION : RTC REGISTERS
359 ; ----------------------------------------------------------------------
360     .IFDEF LF_XTAL
361 ; LFXIN : PJ.4, LFXOUT : PJ.5
362     BIS.B   #010h,&PJSEL0   ; SEL0 for only LFXIN
363     BIC.B   #RTCHOLD,&RTCCTL1 ; Clear RTCHOLD = start RTC_B
364     .ENDIF