1 ; -*- coding: utf-8 -*-
3 ; ----------------------------------------------------------------------
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
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)
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 ; ======================================================================
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
31 ; 8x blue LEDs in a row. (portpinX->---resistor---LED---GND)
102 ; ======================================================================
103 ; MSP-EXP430FR5739 LAUNCHPAD <--> OUTPUT WORLD
104 ; ======================================================================
106 ; P4.0 - Switch S1 <--- LCD contrast + (finger :-)
107 ; P4.1 - Switch S2 <--- LCD contrast - (finger :-)
109 ; GND <-------+---0V0----------> 1 LCD_Vss
110 ; VCC >------ | --3V6-----+----> 2 LCD_Vdd
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
126 ; PJ.4 - LFXI 32768Hz quartz
127 ; PJ.5 - LFXO 32768Hz quartz
130 ; +--4k7-< DeepRST <-- GND
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)
137 ; ---------------------------------------------------------------------------
138 ; SD_CardAdapter not compatible with HARDWARE flow control for FORTH TERMINAL
139 ; ---------------------------------------------------------------------------
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)
148 ; P2.7 - RF.9 <---- OUT IR_Receiver (1 TSOP32236)
150 ; P1.6 - UCB0 SDA/SIMO SV2.2 <---> SDA I2C MASTER/SLAVE
151 ; P1.7 - UCB0 SCL/SOMI SV2.1 <---> SCL I2C MASTER/SLAVE
159 ; ----------------------------------------------------------------------
160 ; POWER ON RESET AND INITIALIZATION : LOCK I/O as high impedance state
161 ; ----------------------------------------------------------------------
163 BIS #LOCKLPM5,&PM5CTL0 ; unlocked by WARM
165 ; ----------------------------------------------------------------------
166 ; POWER ON RESET AND INITIALIZATION PAIN=PORT2:PORT1
167 ; ----------------------------------------------------------------------
169 ; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
172 ; P1.4 is used as analog input from NTC voltage divider
178 SDA .equ 40h ; P1.6 = SDA
179 SCL .equ 80h ; P1.7 = SCL
187 TXD .equ 1 ; P2.0 = TXD
188 RXD .equ 2 ; P2.1 = RXD
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
204 HANDSHAKOUT .equ P2OUT
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
212 ; P2.7 is used to power the accelerometer and NTC voltage divider ==> output low = power OFF
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
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
228 ; ----------------------------------------------------------------------
229 ; POWER ON RESET AND INITIALIZATION : PORT3/4
230 ; ----------------------------------------------------------------------
233 ; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
236 ; P3.0 to P3.2 are accelerometer analog outputs
238 ; P3.4 to P3.7 are blues LEDs : set output low = OFF
245 SW1 .equ 1 ; P4.0 = S1
248 SW2 .equ 2 ; P4.1 = S2
251 ; PORTx default wanted state : pins as input with pullup resistor
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
256 ; ----------------------------------------------------------------------
257 ; POWER ON RESET AND INITIALIZATION : PORTJ
258 ; ----------------------------------------------------------------------
260 ; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
264 ; PJ.0 to PJ.3 are blues LEDs : set as output low = OFF
268 LED1 .equ 1 ; PJ.0 LED1 blue
272 LED2 .equ 2 ; PJ.1 LED2 blue
274 ; PORTx default wanted state : pins as input with pullup resistor else leds output low
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
280 ; ----------------------------------------------------------------------
281 ; POWER ON RESET AND INITIALIZATION : CLOCK SYSTEM
282 ; ----------------------------------------------------------------------
284 ; DCOCLK: Internal digitally controlled oscillator (DCO).
286 MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers
289 ; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
290 MOV #DIVA_0 + DIVS_32 + DIVM_32,&CSCTL3
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
296 .ELSEIF FREQUENCY = 1
297 ; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
298 MOV #DIVA_0 + DIVS_8 + DIVM_8,&CSCTL3
300 .ELSEIF FREQUENCY = 2
301 ; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
302 MOV #DIVA_0 + DIVS_4 + DIVM_4,&CSCTL3
304 .ELSEIF FREQUENCY = 4
305 ; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
306 MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3
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
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
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
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
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
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
334 .error "bad frequency setting, only 0.25,0.5,1,2,4,8,12,16,20,24 MHz"
338 MOV #SELA_LFXCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
340 MOV #SELA_VLOCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
342 MOV.B #01h, &CSCTL0_H ; Lock CS Registers
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
351 ; ----------------------------------------------------------------------
352 ; POWER ON RESET AND INITIALIZATION : REF
353 ; ----------------------------------------------------------------------
354 BIS.W #REFTCOFF, &REFCTL ; Turn off temp.
355 BIC.W #REFON, &REFCTL
357 ; ----------------------------------------------------------------------
358 ; POWER ON RESET AND INITIALIZATION : RTC REGISTERS
359 ; ----------------------------------------------------------------------
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