359 lines
10 KiB
Plaintext
359 lines
10 KiB
Plaintext
; --------------------------------------------------------------------------------
|
|
; @Title: Example for flash declaration of NXP LPC29xx internal flash.
|
|
;
|
|
; @Description:
|
|
; Script arguments:
|
|
;
|
|
; DO lpc29xx [PREPAREONLY]
|
|
;
|
|
; PREPAREONLY only declares flash but does not execute flash programming
|
|
;
|
|
; Example:
|
|
;
|
|
; DO ~~/demo/arm/flash/lpc29xx PREPAREONLY
|
|
;
|
|
; List of LPC29xx derivatives and their configuration:
|
|
;
|
|
; CPU-Type FlashSize EepromSize RamSize
|
|
; (KB) (KB) (KB)
|
|
; --------------------------------------------------------------------------------
|
|
; LPC2915 512. 0. 32.
|
|
; LPC2917 512. 0. 48.
|
|
; LPC2917/01 512. 16. 48.
|
|
; LPC2919 768. 0. 48.
|
|
; LPC2919/01 768. 16. 48.
|
|
; LPC2921 128. 16. 16.
|
|
; LPC2923 256. 16. 16.
|
|
; LPC2925 512. 16. 32.
|
|
; LPC2926 256. 16. 48.
|
|
; LPC2927 512. 16. 48.
|
|
; LPC2929 768. 16. 48.
|
|
; LPC2930 0. 0. 48.
|
|
; LPC2939 512. 16. 48.
|
|
;
|
|
; Internal flash is located at: 0x20000000
|
|
; Internal RAM is located at: 0x80000000
|
|
;
|
|
; Small sector size is 8kB. Large sector size is 64 kB.
|
|
;
|
|
; A Flash page is the unit in which the Flash is programmed: 512 bytes.
|
|
; Therefore an alignment of 512 Byte has to be used for flash programming.
|
|
;
|
|
; NOTE:
|
|
; This example script is based on SYS_CLK connected to 10MHz
|
|
; crystal oscillator. With &optimize flag PLL is used to setup SYS_CLK
|
|
; to 80 MHz. For different hardware configuration PLL setup may need to
|
|
; be adapted.
|
|
;
|
|
; FLASH.CLocK setup should match SYS_CLK frequency. If FLASH.CLocK AUTO
|
|
; is used instead of fix frequency the debugger is executing time
|
|
; measurent loop to detect SYS_CLK frequency and to setup FLASH.CLocK
|
|
; value automatically.
|
|
;
|
|
; Data has to be loaded to flash alignment to 512 Byte boundaries.
|
|
;
|
|
; @Author: WRD
|
|
; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only
|
|
; @Chip: LPC29*
|
|
; --------------------------------------------------------------------------------
|
|
; $Rev: 12049 $
|
|
; $Id: lpc29xx.cmm 12049 2023-04-20 12:32:16Z bschroefel $
|
|
|
|
LOCAL ¶meters
|
|
ENTRY %LINE ¶meters
|
|
|
|
LOCAL ¶m_prepareonly
|
|
¶m_prepareonly=(STRing.SCAN(STRing.UPpeR("¶meters"),"PREPAREONLY",0)!=-1)
|
|
|
|
LOCAL &FlashSize
|
|
LOCAL &EepromSize
|
|
LOCAL &RamSize
|
|
LOCAL &optimize
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Start debugging
|
|
|
|
IF SYStem.MODE()<5
|
|
(
|
|
SYStem.RESet
|
|
SYStem.CPU LPC2919/01
|
|
SYStem.JtagClock 1.5Mhz
|
|
SYStem.Option ResBreak OFF
|
|
SYStem.Up
|
|
)
|
|
|
|
; Setup flash parameter
|
|
GOSUB Setup_FlashParameter
|
|
; Optimize flash programming time by switching on PLL
|
|
&optimize=0
|
|
|
|
; Setup XTAL_OSC_CONTROL crystal oscillator control register
|
|
; XTAL-Osc = enabled
|
|
; Bypass = crystal oscillator connected
|
|
; HF = low frequency mode
|
|
Data.Set 0xFFFF8020 %Long 0x00000001
|
|
|
|
; Setup SYS_CLK_CONF register to use crystal oscillator
|
|
; CLK_SEL = crystal oscillator
|
|
; IDIV = 1
|
|
Data.Set 0xFFFF8070 %Long 0x01000000
|
|
|
|
IF &optimize!=0
|
|
(
|
|
; Set Core frequency SYS_CLK to 80Mhz based on 10MHz crystal oscillator
|
|
;
|
|
; When JTAG = 1, crystal oscillator will be the default value for
|
|
; BASE_SYS_CLK
|
|
|
|
; PLL control register, disable PLL
|
|
; P23EN = disabled
|
|
; PD = Power-down mode
|
|
Data.Set 0xFFFF8028 %Long 0x00000001
|
|
|
|
; PLL control register, enable PLL
|
|
; fclkin = 10MHz, fclkout = 160Mhz, fcco = 320Mhz
|
|
; CLK_SEL = crystal oscillator
|
|
; MSEL = 15 (M=16)
|
|
; AUTOBLOK = OFF
|
|
; PSEL = 0 (P=2)
|
|
; DIRECT = OFF, Clock output goes through post-divider
|
|
; P23EN = ON, PLL +120° and PLL +240° outputs enabled
|
|
; BYPASS = OFF
|
|
; PD = Normal mode
|
|
Data.Set 0xFFFF8028 %Long 0x010F0004
|
|
|
|
; Wait until PLL is present
|
|
LOCAL &pllstat &rdet
|
|
&pllstat=Data.Long(P:0xFFFF8024)
|
|
&rdet=Data.Long(P:0xFFFF8018)
|
|
; PLL locked?
|
|
Var.WHILE ((&pllstat&0x00000001)!=0x00000001)
|
|
(
|
|
&pllstat=Data.Long(P:0xFFFF8024)
|
|
)
|
|
; PLL present?
|
|
Var.WHILE ((&rdet&0x00000004)!=0x00000004)
|
|
(
|
|
&rdet=Data.Long(P:0xFFFF8018)
|
|
)
|
|
|
|
; Setup SYS_CLK_CONF register to use PLL
|
|
; CLK_SEL = PLL
|
|
; IDIV = 2
|
|
Data.Set 0xFFFF8070 %Long 0x02000004
|
|
|
|
; Setup JTAG clock to 80Mhz/6
|
|
SYStem.JtagClock 13Mhz
|
|
)
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Index sector programming
|
|
|
|
&ProgramIndexSector=0.
|
|
IF &ProgramIndexSector!=0
|
|
(
|
|
DIALOG.YESNO "Index sector is write only!" "Enabled features cannot be disabled again." " " "Do you really want to program the index sector?"
|
|
LOCAL &progflash
|
|
ENTRY &progflash
|
|
IF &progflash
|
|
(
|
|
GOSUB ProgramIndexSector
|
|
ENDDO
|
|
)
|
|
)
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash declaration
|
|
|
|
FLASH.RESet
|
|
|
|
IF &FlashSize!=0.
|
|
(
|
|
FLASH.Create 1. 0x20000000--0x2000ffff 0x02000 TARGET Long
|
|
FLASH.Create 1. 0x20010000--(0x20000000+&FlashSize*0x400-1) 0x10000 TARGET Long
|
|
FLASH.TARGET 0x80000000 0x80001000 0x1000 ~~/demo/arm/flash/long/lpc2900.bin
|
|
FLASH.CLocK AUTO
|
|
)
|
|
|
|
; Flash script ends here if called with parameter PREPAREONLY
|
|
IF ¶m_prepareonly
|
|
ENDDO PREPAREDONE
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Flash programming example
|
|
|
|
IF &FlashSize!=0.
|
|
(
|
|
DIALOG.YESNO "Program flash memory?"
|
|
LOCAL &progflash
|
|
ENTRY &progflash
|
|
IF &progflash
|
|
(
|
|
FLASH.ReProgram.ALL /Erase
|
|
; 1. Download file
|
|
Data.LOAD.auto *
|
|
; 2. Checksum generation
|
|
Data.Set 0x20000014 %Long 0x0 ;Zero the reserved vector's spot
|
|
Data.SUM 0x20000000--0x2000001f /Long ;Calculate checksum of all (other) vectors
|
|
Data.Set 0x20000014 %Long -Data.SUM() ;Write back the 2's complement in reserved vector's spot
|
|
; 3. Execute flash programming
|
|
FLASH.ReProgram.off
|
|
)
|
|
)
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; EEPROM programming example
|
|
;
|
|
; Preliminary USR: access memory class is used for EEPROM programming.
|
|
; Some unused RAM has to used for USR: access algorithm.
|
|
|
|
IF &EepromSize!=0.
|
|
(
|
|
DIALOG.YESNO "Program EEPROM memory?"
|
|
LOCAL &progflash
|
|
ENTRY &progflash
|
|
IF &progflash
|
|
(
|
|
; As above for flash programming example crystal oscillator has 10MHz
|
|
; and with &optimize flag PLL is setup to 80 MHz.
|
|
LOCAL &sys_clk
|
|
&sys_clk=10000000.
|
|
IF &optimize!=0
|
|
(
|
|
&sys_clk=80000000.
|
|
)
|
|
; Setup EECLKDIV (EEPROM clock divider register) to 375kHz +- 6.67%
|
|
PER.Set.simple ASD:0x20200094 %Long ((&sys_clk+375000./2)/375000.)-1
|
|
; Setup EEWSTATE (EEPROM wait state register)
|
|
PER.Set.simple ASD:0x20200090 %Long ((35./(1000000000./&sys_clk))<<16.)|((55./(1000000000./&sys_clk))<<8.)|(15./(1000000000./&sys_clk))
|
|
|
|
; Setup USR: access to read and write EEPROM memory
|
|
; A reserved space of RAM has to be used for USR: access algorithm.
|
|
; In this example is used the last 1 kByte of internal RAM.
|
|
Data.USRACCESS (0x80000000+(&RamSize-1)*0x400)++0x3ff ,, ~~/demo/arm/flash/byte/lpc2900ee_usr.bin
|
|
; Open EEPROM memory dump window
|
|
Data.dump USR:0++(&EepromSize*0x400-1) /Byte
|
|
)
|
|
)
|
|
|
|
ENDDO
|
|
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; Setup flash configuration depending on selected CPU.
|
|
Setup_FlashParameter:
|
|
|
|
&cpu=SYStem.CPU()
|
|
IF (("&cpu"=="LPC2919/01")||("&cpu"=="LPC2929")||("&cpu"=="LPC2939"))
|
|
(
|
|
&FlashSize=768.
|
|
&EepromSize=16.
|
|
&RamSize=48.
|
|
)
|
|
ELSE IF (("&cpu"=="LPC2919"))
|
|
(
|
|
&FlashSize=768.
|
|
&EepromSize=0.
|
|
&RamSize=48.
|
|
)
|
|
ELSE IF (("&cpu"=="LPC2917/01"))
|
|
(
|
|
&FlashSize=512.
|
|
&EepromSize=16.
|
|
&RamSize=48.
|
|
)
|
|
ELSE IF (("&cpu"=="LPC2925"))
|
|
(
|
|
&FlashSize=512.
|
|
&EepromSize=16.
|
|
&RamSize=32.
|
|
)
|
|
ELSE IF (("&cpu"=="LPC2917")||("&cpu"=="LPC2927"))
|
|
(
|
|
&FlashSize=512.
|
|
&EepromSize=0.
|
|
&RamSize=48.
|
|
)
|
|
ELSE IF (("&cpu"=="LPC2915"))
|
|
(
|
|
&FlashSize=512.
|
|
&EepromSize=0.
|
|
&RamSize=32.
|
|
)
|
|
ELSE IF (("&cpu"=="LPC2926"))
|
|
(
|
|
&FlashSize=256.
|
|
&EepromSize=16.
|
|
&RamSize=48.
|
|
)
|
|
ELSE IF (("&cpu"=="LPC2923"))
|
|
(
|
|
&FlashSize=256.
|
|
&EepromSize=16.
|
|
&RamSize=16.
|
|
)
|
|
ELSE IF (("&cpu"=="LPC2921"))
|
|
(
|
|
&FlashSize=128.
|
|
&EepromSize=16.
|
|
&RamSize=16.
|
|
)
|
|
ELSE IF (("&cpu"=="LPC2930"))
|
|
(
|
|
&FlashSize=0.
|
|
&EepromSize=0.
|
|
&RamSize=48.
|
|
)
|
|
ELSE
|
|
(
|
|
PRINT %ERROR "FLASH size of CPU type is unknown"
|
|
ENDDO
|
|
)
|
|
|
|
RETURN
|
|
|
|
|
|
; --------------------------------------------------------------------------------
|
|
; Index sector programming example
|
|
;
|
|
; Index sector is containing
|
|
; - sector security
|
|
; - customer information
|
|
; - JTAG access protection
|
|
;
|
|
; The index sector cannot be erased!!! As a result the sector is write-only
|
|
; and enabled features cannot be disabled again.
|
|
;
|
|
; Take care when writing locations in the index sector. The sector cannot be
|
|
; erased, and using unspecified values or locations might result in a
|
|
; corrupted or malfunctioning device which cannot be recovered.
|
|
|
|
ProgramIndexSector:
|
|
|
|
FLASH.RESet
|
|
|
|
; Set FS_ISS bit in FCTR register so that index sector becomes visible
|
|
Data.Set ASD:0x20200000 %Long Data.Long(ASD:0x20200000)|0x40
|
|
|
|
; Declare index sectors, reserved sectors are declared as NOP
|
|
FLASH.Create 1. 0x20000000--0x200007ff 0x200 NOP Long
|
|
FLASH.Create 1. 0x20000800--0x20000fff 0x200 TARGET Long
|
|
FLASH.TARGET 0x80000000 0x80001000 0x1000 ~~/demo/arm/flash/long/lpc2900iss.bin
|
|
FLASH.CLocK AUTO
|
|
FLASH.AUTO ALL
|
|
|
|
; List of index sectors
|
|
WinPOS 0% 0% 50% 45%
|
|
FLASH.List
|
|
; Index sector customer info
|
|
WinPOS 0% 45% 50% 55%
|
|
Data.dump 0x20000a40--0x20000bff
|
|
; Flash memory sector protection
|
|
WinPOS 50% 15% 50% 85%
|
|
Data.dump 0x20000c00--0x20000fff
|
|
; JTAG security
|
|
WinPOS 50% 0% 50% 15%
|
|
Data.dump 0x20000a30--0x20000a3f
|
|
|
|
RETURN
|