OSDN Git Service

V2.0
[fast-forth/master.git] / MSP_EXP430FR5739.asm
1 ; -*- coding: utf-8 -*-
2
3 ; Fast Forth For Texas Instrument MSP430FR5739
4 ; Tested on MSP-EXP430FR5739 launchpad
5 ;
6 ; Copyright (C) <2014>  <J.M. THOORENS>
7 ;
8 ; This program is free software: you can redistribute it and/or modify
9 ; it under the terms of the GNU General Public License as published by
10 ; the Free Software Foundation, either version 3 of the License, or
11 ; (at your option) any later version.
12
13 ; This program is distributed in the hope that it will be useful,
14 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 ; GNU General Public License for more details.
17
18 ; You should have received a copy of the GNU General Public License
19 ; along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
21 ; ----------------------------------------------------------------------
22 ; MSP_EXP430FR739.inc 
23 ; ----------------------------------------------------------------------
24 ; ----------------------------------------------------------------------
25 ; MSP430FR57xx BOOTSTRAP
26 ; ----------------------------------------------------------------------
27 ; BSL for MSP430FR573x devices
28 ; BSL Version 00.04.31.71
29 ; RAM erased 0x1C00-0x1FFF
30 ; Buffer size for Core Commands : 260 bytes
31 ; Notable Information
32 ; 1. TX and RX pins are noted in the device data sheet
33 ; 2. A mass erase command or incorrect password triggers a BSL reset. 
34 ;    This resets the BSL state to the default settings (9600 baud, password locked)
35 ; Known Bugs
36 ; 1. The baud rate of 115k cannot be ensured across all clock, voltage, and temperature variations
37 ; ----------------------------------------------------------------------
38 ; ======================================================================
39 ; INIT MSP-EXP430FR5739 board
40 ; ======================================================================
41
42 ; J3 (5xjumper), silkscreen printing:
43 ; "TEST" - FR5739 pin19 = TEST
44 ; "RST"  - FR5739 pin20 = RST
45 ; "RXD"  - FR5739 pin22 = P2.1 == UCA0RXD --> UCA0RXDBUF
46 ; "TXD"  - FR5739 pin21 = P2.0 == UCA0TXD <-- UCA0TXDBUf
47 ; "VCC"  - + upper side
48
49 ; 8x blue LEDs in a row.   (portpinX->---resistor---LED---GND)
50 ; PJ.0 - LED1
51 ; PJ.1 - LED2
52 ; PJ.2 - LED3
53 ; PJ.3 - LED4
54 ; P3.4 - LED5
55 ; P3.5 - LED6
56 ; P3.6 - LED7
57 ; P3.7 - LED8
58
59 ; I/O pins on SV1:
60 ; P1.0 - SV1.1
61 ; P1.1 - SV1.2
62 ; P1.2 - SV1.3
63 ; P3.0 - SV1.4
64 ; P3.1 - SV1.5
65 ; P3.2 - SV1.6
66 ; P3.3 - SV1.7
67 ; P1.3 - SV1.8
68 ; P1.4 - SV1.9
69 ; P1.5 - SV1.10
70 ; P4.0 - SV1.11
71 ; GND  - SV1.12
72
73 ; I/O pins on SV2:
74 ; P1.7 - SV2.1
75 ; P1.6 - SV2.2
76 ; P3.7 - SV2.3
77 ; P3.6 - SV2.4
78 ; P3.5 - SV2.5
79 ; P3.4 - SV2.6
80 ; P2.2 - SV2.7
81 ; P2.1 - SV2.8
82 ; P2.6 - SV2.9
83 ; P2.5 - SV2.10
84 ; P2.0 - SV2.11
85 ; VCC  - SV2.12
86
87 ; I/O pins on RF:
88 ; GND  - RF.1
89 ; VCC  - RF.2
90 ; P2.0 - RF.3
91 ; P1.0 - RF.4
92 ; P2.6 - RF.5
93 ; P1.1 - RF.6
94 ; P2.5 - RF.7
95 ; P1.2 - RF.8
96 ; P2.7 - RF.9
97 ; P2.3 - RF.10
98 ; P4.0 - RF.11
99 ; GND  - RF.12
100 ; P4.1 - RF.13
101 ; P2.4 - RF.14
102 ; P1.7 - RF.15
103 ; P2.2 - RF.16
104 ; P1.3 - RF.17
105 ; P1.6 - RF.18
106
107 ; Accelerometer:
108 ; P2.7 - VS
109 ; P3.0 - XOUT
110 ; P3.1 - YOUT
111 ; P3.2 - ZOUT
112
113 ; LDR and NTC:
114 ; P2.7 - VS
115 ; P3.3 - LDR
116 ; P1.4 - NTC
117
118 ; RST - reset
119
120 ; ======================================================================
121 ; MSP-EXP430FR5739 LAUNCHPAD    <--> OUTPUT WORLD
122 ; ======================================================================
123 ;
124 ; P4.0 - Switch S1              <--- LCD contrast + (finger :-)
125 ; P4.1 - Switch S2              <--- LCD contrast - (finger :-)
126 ;                                   
127 ;  GND                          <-------+---0V0---------->  1 LCD_Vss
128 ;  VCC                          >------ | --3V6-----+---->  2 LCD_Vdd
129 ;                                       |           |
130 ;                                     |___    470n ---
131 ;                                       ^ |        ---
132 ;                                      / \ BAT54    |
133 ;                                      ---          |
134 ;                                  100n |    2k2    |
135 ; P1.5 - UCB0 CLK  TB0.2 SV1.10 >---||--+--^/\/\/v--+---->  3 LCD_Vo (=0V6 without modulation)
136 ; P3.4 -                 SV2.6  ------------------------->  4 LCD_RS
137 ; P3.5 -                 SV2.5  ------------------------->  5 LCD_R/W
138 ; P3.6 -                 SV2.4  ------------------------->  6 LCD_EN
139 ; P1.0 -                 SV1.1  <------------------------> 11 LCD_DB4
140 ; P1.1 -                 SV1.2  <------------------------> 12 LCD_DB5
141 ; P1.2 -                 SV1.3  <------------------------> 13 LCD_DB5
142 ; P1.3 -                 SV1.8  <------------------------> 14 LCD_DB7
143 ;
144 ; PJ.4 - LFXI 32768Hz quartz  
145 ; PJ.5 - LFXO 32768Hz quartz  
146 ; PJ.6 - HFXI 
147 ; PJ.7 - HFXO 
148 ;                                 +--4k7-< DeepRST <-- GND 
149 ;                                 |
150 ; P2.0 -  UCA0 TXD       SV2.11 --+-> RX  UARTtoUSB bridge
151 ; P2.1 -  UCA0 RXD       SV2.8  <---- TX  UARTtoUSB bridge
152 ;  VCC -                        <---- VCC (optional supply from UARTtoUSB bridge - WARNING ! 3.3V !)
153 ;  GND -                        <---> GND (optional supply from UARTtoUSB bridge)
154 ;        
155 ; SD_CardAdapter not compatible with HARDWARE flow control for FORTH TERMINAL
156 ; ---------------------------------------------------------------------------
157 ; VCC  -                 RF.2 
158 ; VSS  -                 RF.1 
159 ; P2.2 -                 RF.16  <---- CD  SD_CardAdapter (Card Detect) / RTS
160 ; P2.3 -                 RF.10  ----> CS  SD_CardAdapter (Card Select) / CTS
161 ; P2.4 - UCA1 CLK        RF.14  ----> CLK SD_CardAdapter (SCK)  
162 ; P2.5 - UCA1 TXD/SIMO   RF.7   ----> SDI SD_CardAdapter (MOSI)
163 ; P2.6 - UCA1 RXD/SOMI   RF.5   <---- SDO SD_CardAdapter (MISO)
164 ;
165 ; P2.7 -                 RF.9   <---- OUT IR_Receiver (1 TSOP32236)
166 ;
167 ; P1.7 - UCB0 SCL/SOMI   SV2.1  <---> SCL I2C MASTER/SLAVE
168 ; P1.6 - UCB0 SDA/SIMO   SV2.2  <---> SDA I2C MASTER/SLAVE
169
170
171 ; Clocks:
172 ; 8 MHz DCO intern
173
174
175
176 ; ----------------------------------------------------------------------
177 ; POWER ON RESET AND INITIALIZATION : LOCK I/O as high impedance state
178 ; ----------------------------------------------------------------------
179
180     BIS #LOCKLPM5,&PM5CTL0 ; unlocked by WARM
181
182 ; ----------------------------------------------------------------------
183 ; POWER ON RESET AND INITIALIZATION : WATCHDOG TIMER A
184 ; ----------------------------------------------------------------------
185
186 ; WDT code
187     MOV #WDTPW+WDTHOLD+WDTCNTCL,&WDTCTL    ; stop WDT
188
189 ; ----------------------------------------------------------------------
190 ; POWER ON RESET AND INITIALIZATION PAIN=PORT2:PORT1
191 ; ----------------------------------------------------------------------
192
193 ; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
194
195 ; PORT 1  usage
196 ; P1.4 is used as analog input from NTC voltage divider ==> switch to ADC to disable digital input
197     BIS.B #10h,&P1SELC
198
199
200 Deep_RST_IN .equ P2IN  ; TERMINAL TX  pin as FORTH Deep_RST 
201 Deep_RST    .equ 1     ; P2.0
202 TERM_TXRX   .equ 003h
203 TERM_SEL    .equ P2SEL1
204 TERM_REN    .equ P2REN
205
206 ; RTS output is wired to the CTS input of UART2USB bridge 
207 ; CTS is not used by FORTH terminal
208 ; configure RTS as output high to disable RX TERM during start FORTH
209
210 ; P2.7 is used to power the accelerometer and NTC voltage divider ==> output low = OFF
211
212     .IFDEF TERMINALCTSRTS
213
214 RTS         .equ  4 ; P2.2
215 ;CTS         .equ  8 ; P2.3
216 HANDSHAKOUT .equ  P2OUT
217 HANDSHAKIN  .equ  P2IN
218     BIS #08400h,&PADIR  ; all pins as input else RTS P2.2 and P2.7
219     BIS #07FFFh,&PAREN  ; all input pins with resistor
220     MOV #07FFFh,&PAOUT  ; that acts as pull up, and P2.7 as output LOW
221
222     .ELSEIF
223
224 ; PORTx default wanted state : pins as input with pullup resistor
225     BIS #08000h,&PADIR  ; all pins as input else P2.7
226     BIS #07FFFh,&PAREN  ; all input pins with resistor
227     MOV #07FFFh,&PAOUT  ; that acts as pull up, and P2.7 as output LOW
228
229
230     .ENDIF
231
232 ; ----------------------------------------------------------------------
233 ; POWER ON RESET AND INITIALIZATION : PORT3/4
234 ; ----------------------------------------------------------------------
235 ; PB = P4:P3
236
237 ; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
238
239 ; P3 FastForth usage
240 ; P3.0 to P3.2 are accelerometer analog outputs ==> switch to ADC to disable digital input
241     BIS.B   #07h,&P3SELC
242
243 ; P3.4 to P3.7 are blues LEDs : set output low = OFF
244
245 ; P4 FastForth usage
246 ; P4.0 Switch S1  used for hard reset (WIPE+COLD)
247 ; P4.1 switch S2
248
249 SWITCHIN    .equ P4IN
250 S1          .equ 1
251
252 ; PORTx default wanted state : pins as input with pullup resistor
253
254     BIS #000F0h,&PADIR      ; all pins as input else blues LEDs
255     MOV #0FF0Fh,&PAOUT      ; all pins high else blues LEDs
256     BIS #0FF0Fh,&PAREN      ; all pins 1 with pull resistors else blues LEDs
257
258 ; ----------------------------------------------------------------------
259 ; POWER ON RESET AND INITIALIZATION : PORTJ
260 ; ----------------------------------------------------------------------
261
262 ; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
263
264
265 ; PJ FastForth usage
266 ; PJ.0 to PJ.3 are  blues LEDs : set as output low = OFF
267
268 ; PORTx default wanted state : pins as input with pullup resistor else leds output low
269
270     BIS.B #00Fh,&PJDIR      ; all pins as input else blues LEDs
271     MOV.B #0F0h,&PJOUT      ; all pins high else blues LEDs
272     BIS.B #0F0h,&PJREN      ; all pins 1 with pull resistors else blues LEDs
273
274
275 ; ----------------------------------------------------------------------
276 ; POWER ON RESET AND INITIALIZATION : CLOCK SYSTEM
277 ; ----------------------------------------------------------------------
278
279 ; DCOCLK: Internal digitally controlled oscillator (DCO).
280
281 ; CS code for MSP430fr5739
282             MOV.B   #CSKEY,&CSCTL0_H ;  Unlock CS registers
283
284     .IF FREQUENCY = 0.25
285 ;            MOV     #DCOFSEL1+DCOFSEL0,&CSCTL1      ; Set 8MHZ DCO setting (default value)
286             MOV     #DIVA_0 + DIVS_32 + DIVM_32,&CSCTL3
287             MOV     #2,X
288
289     .ELSEIF FREQUENCY = 0.5
290 ;            MOV     #DCOFSEL1+DCOFSEL0,&CSCTL1      ; Set 8MHZ DCO setting (default value)
291             MOV     #DIVA_0 + DIVS_16 + DIVM_16,&CSCTL3
292             MOV     #4,X
293
294     .ELSEIF FREQUENCY = 1
295 ;            MOV     #DCOFSEL1+DCOFSEL0,&CSCTL1      ; Set 8MHZ DCO setting (default value)
296             MOV     #DIVA_0 + DIVS_8 + DIVM_8,&CSCTL3
297             MOV     #8,X
298
299     .ELSEIF FREQUENCY = 2
300 ;            MOV     #DCOFSEL1+DCOFSEL0,&CSCTL1      ; Set 8MHZ DCO setting (default value)
301             MOV     #DIVA_0 + DIVS_4 + DIVM_4,&CSCTL3
302             MOV     #16,X
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             MOV     #32,X
308
309     .ELSEIF FREQUENCY = 8
310 ;            MOV     #DCOFSEL1+DCOFSEL0,&CSCTL1          ; Set 8MHZ DCO setting (default value)
311             MOV     #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3   ; set all dividers as 0
312             MOV     #64,X
313 SMCLK .equ 8
314
315     .ELSEIF FREQUENCY = 16
316             MOV     #DCORSEL,&CSCTL1                    ; Set 16MHZ DCO setting
317             MOV     #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3   ; set all dividers as 0
318             MOV     #128,X
319 SMCLK .equ 16
320
321     .ELSEIF FREQUENCY = 24
322             MOV     #DCORSEL+DCOFSEL1+DCOFSEL0,&CSCTL1  ; Set 24 MHZ DCO setting
323             MOV     #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3   ; set all dividers as 0
324             MOV     #192,X
325 SMCLK .equ 24
326
327     .ELSEIF
328     .error "bad frequency setting, only 0.5,1,2,4,8,16,24 MHz"
329     .ENDIF
330
331     .IFDEF LF_XTAL
332             MOV     #SELA_LFXCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
333     .ELSE
334             MOV     #SELA_VLOCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
335     .ENDIF
336             MOV.B   #01h, &CSCTL0_H                     ; Lock CS Registers
337
338             BIS &SYSRSTIV,&SAVE_SYSRSTIV; store volatile SYSRSTIV preserving a pending request for DEEP_RST
339             CMP #2,&SAVE_SYSRSTIV   ; POWER ON ?
340             JZ      ClockWaitX      ; yes
341             .word   0759h           ; no  RRUM #2,X --> wait only 125 ms
342 ClockWaitX  MOV     #41666,Y        ; wait 0.5s before starting after POWER ON
343 ClockWaitY  SUB     #1,Y            ;
344             JNZ     ClockWaitY      ; 41666x3 = 125000 cycles delay = 125ms @ 1MHz
345             SUB     #1,X            ; x 4 @ 1 MHZ
346             JNZ     ClockWaitX      ; time to stabilize power source ( 1s )
347
348 ; ----------------------------------------------------------------------
349 ; POWER ON RESET AND INITIALIZATION : REF
350 ; ----------------------------------------------------------------------
351
352             BIS.W   #REFTCOFF, &REFCTL  ; Turn off temp.
353             BIC.W   #REFON, &REFCTL
354
355
356 ; ----------------------------------------------------------------------
357 ; POWER ON RESET AND INITIALIZATION : RTC REGISTERS
358 ; ----------------------------------------------------------------------
359     .IFDEF LF_XTAL
360 ; LFXIN : PJ.4, LFXOUT : PJ.5
361     BIS.B   #010h,&PJSEL0   ; SEL0 for only LFXIN
362     BIC.B   #RTCHOLD,&RTCCTL1 ; Clear RTCHOLD = start RTC_B
363     .ENDIF
364