blob: ce8c37d0614eda00461179f2116751ec03e96cfd [file] [log] [blame]
/* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */
/* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */
/* ELIGIBILITY FOR ANY PURPOSES. */
/* (C) 2007,2008 Fujitsu Microelectronics Europe GmbH */
;=========================================================================================
; 1 Contents
;=========================================================================================
; 1 Contents
; 2 Disclaimer
;
; 3 History
;
; 4 Settings
; 4.1 Controller device
; 4.2 Boot / flash security
; 4.3 Stack type and stack size
; 4.4 Copy code from flash to I-RAM
; 4.5 C++ start-up
; 4.6 Low-level library interface
; 4.7 Clock Configuration
; 4.7.1 Clock selection
; 4.7.2 Select Clock Modulator
; 4.8 External bus interface
; 4.8.1 Select chipselect
; 4.8.2 Set memory addressing for chipselects
; 4.8.3 Configure chipselect area
; 4.8.4 Set wait cycles for chipselects
; 4.8.5 Configure chipselects SDRAM memory only
; 4.8.6 Referesh control register RCR
; 4.8.7 Terminal and timing control register
; 4.8.8 Enable / disable I-cache
; 4.8.9 Enable CACHE for chipselect
; 4.8.10 Select external bus mode (data lines)
; 4.8.11 Select external bus mode (address lines)
; 4.8.12 Select external bus mode (control signals)
;
; 5 Definitions of Configurations
;
; 6 Section and data declaration
; 6.1 Define stack size
; 6.2 Define sections
;
; 7. S T A R T
; 7.1 Initialise stack pointer and table base register
; 7.2 Check for CSV reset and set CSV
; 7.3 Check clock condition
; 7.4 Restore default settings after reset
; 7.4.2 Disable clock modulator
; 7.4.2 Check if running on sub clock, change to main clock
; 7.4.3 Disable sub clock
; 7.4.4 Check if running on PLL, gear down PLL
; 7.4.5 Disable PLL
; 7.4.6 Set to main clock
; 7.5 Set memory controller
; 7.6 Clock startup
; 7.6.1 Set Voltage Regulator Settings
; 7.6.2 Power on clock modulator - clock modulator part I
; 7.6.3 Set CLKR register w/o clock mode
; 7.6.4 Start PLLs
; 7.6.5 Wait for PLL oscillation stabilisation
; 7.6.6 Set clocks
; 7.6.6.1 Set CPU and peripheral clock
; 7.6.6.2 Set external bus interface clock
; 7.6.6.3 Set CAN clock prescaler
; 7.6.6.4 Switch main clock mode
; 7.6.6.5 Switch sub clock mode
; 7.6.6.6 Switch to PLL mode
; 7.6.7 Enable frequncy modulation - clock modulator part II
; 7.7 Set BusInterface
; 7.7.1 Disable all CS
; 7.7.2 Clear TCR register
; 7.7.3 Set CS0
; 7.7.4 Set CS1
; 7.7.5 Set CS2
; 7.7.6 Set CS3
; 7.7.7 Set CS4
; 7.7.8 Set CS5
; 7.7.9 Set CS6
; 7.7.10 Set CS7
; 7.7.11 Set special SDRAM config register
; 7.7.12 set Port function register
; 7.7.13 Set TCR register
; 7.7.14 Enable cache for selected CS
; 7.7.15 Set SDRAM referesh control register
; 7.7.16 Enable used CS
; 7.7.17 I-cache on/off
; 7.7.18 Set port function register to general as I/O-port
; 7.8 Copy code from flash to I-RAM
; 7.9 Fill stacks
; 7.10 Clear data
; 7.11 Copy Init section from ROM to RAM
; 7.12 C library initialization
; 7.13 Call C++ constructors
; 7.14 Call main routine
; 7.15 Return from main function
;
;=========================================================================================
; 2 Disclaimer
;=========================================================================================
; Fujitsu Microelectronics Europe GmbH
; http://emea.fujitsu.com/microelectronics
;
; The following software is for demonstration purposes only. It is not fully
; tested, nor validated in order to fullfill its task under all circumstances.
; Therefore, this software or any part of it must only be used in an evaluation
; laboratory environment.
; This software is subject to the rules of our standard DISCLAIMER, that is
; delivered with our SW-tools on the Fujitsu Microcontrollers CD/DVD (V3.4 or
; higher "\START.HTM") or on our Internet Pages:
; http://www.fme.gsdc.de/gsdc.htm
; http://emea.fujitsu.com/microelectronics
;
;=========================================================================================
; 3 History
;=========================================================================================
;
;=========================================================================================
; MB914xx (FR60 CORE ONLY) Series C Compiler's
;
; Startup file for memory and basic controller initialisation
;=========================================================================================
;History:
;
; 2005-04-18 V1.0 UMa Release first version
; 2005-06-17 V1.1 UMa Added bus interface, modified c++ startup
; 2005-06-28 V1.2 UMa minor changes
; 2005-07-27 V1.3 UMa default values changed
; 2005-10-04 V1.4 UMa changed code 'Call main Routine'
; Added secutiy section for MB91F467D
; Added Flash Access Read Timing setting section;
; 2005-10-04 V1.5 UMa Added Flash Controller Section
; 2005-10-28 V1.6 UMa Check for CSV reset
; 2005-11.16 V1.7 UMa Monitor Debugger support added: Copy of intvect Table
; Ext. Int 0 as abort function
; Changed PLL-Startup, Reset HWWD added
; 2005-11-16 V1.7 UMa Examples for MUL_G changed
; 2006-02-14 V1.8 UMa mb91464a added
; Settings for Clock Spervisor added
; Name of Section SECURITY changed to SECURITY_VECTORS
; Example values for gear-up changed
; 2006-03-17 V1.9 UMa Changed Startup for Monitor Debugger
; 2006-04-24 v2.0 UMa Added MB91465K and MB91469G
; 2006-05-03 v2.1 UMa Added MB91461R; removed MB91V460A
; Added settings for the external bus-interface
; 2006-07-28 v2.2 UMa Added I-RAM copy function (ROM -> IRAM)
; Added default settings for FLASH Access Read Timing
; Settings
; Changed default settings for FLASH cache configuration
; Register
; Changed check for clock startup
; 2006-08-16 v2.3 MVo Corrected Boot Security Sector Addresses for MB91469G
; 2006-10-06 v2.4 UMa Added new devices
; Corrected typo in I_RAM to flash copy function
; Changed default settings for flash cache configuration
; Changed comments for SDRAM bus interface configuration
; Changed comments and default setting of CAN Prescaler
; Added Stack filler
; Added Settings for REGSEL Register
; 2007-02-13 v2.5 UMa Introduction of default configurations
; Changed I_RAM to flash copy function
;
;
;=========================================================================================
; 4 Settings
;=========================================================================================
;
; CHECK ALL OPTIONS WHETHER THEY FIT TO THE APPLICATION;
;
; Configure this startup file in the "Settings" section. Search for
; comments with leading "; <<<". This points to the items to be set.
;=========================================================================================
;
#set OFF 0
#set ON 1
#set DEFAULT 2
#set LOW_PRIOR 31
;
;=========================================================================================
; 4.1 Controller Device
;=========================================================================================
#set MB91464A 2 ; MB91460 series
;
#set MB91467B 10 ; MB91460 series
;
#set MB91467C 11 ; MB91460 series
;
#set MB91467D 4 ; MB91460 series
;
#set MB91469G 6 ; MB91460 series
;
#set MB91465K 3 ; MB91460 series
;
#set MB91463N 8 ; MB91460 series
;
#set MB91461R 1 ; MB91460 series
#set MB91467R 5 ; MB91460 series
;
#set MB91465X 9 ; MB91460 series
;
#set others 7 ; MB91460 series
;
;
;
#set DEVICE MB91467D ; <<< select device
;
;=========================================================================================
; 4.2 Boot / Flash Security
;=========================================================================================
;
#set BOOT_FLASH_SEC OFF ; <<< BOOT and Flash Security Vector
;
; The flash devices have two flash and two boot security vectors. It is important to set
; the four vectors correctly. Otherwise it might be possible, that the flash device is
; not accessible any more via the bootrom. Please read carefully the hardware manual.
;
; OFF: The security feature is switch off. The section SECURITY_VECTORS is reserved and
; the vectors are set.
; ON: IMPORTANT! The security vectors are not set. But the section SECURITY_VECTORS
; is reserved.
;
; Note: This feature is not supported by every device. Please check the data sheet. This
; feature is not available on MB91461R.
;
;=========================================================================================
; 4.3 Stack Type and Stack Size
;=========================================================================================
;
#set USRSTACK 0 ; user stack: for main program
#set SYSSTACK 1 ; system stack: for main program and
; ; interrupts
;
;
#set STACKUSE SYSSTACK ; <<< set active stack
;
#set STACK_RESERVE ON ; <<< reserve stack area in
; ; this module
#set STACK_SYS_SIZE 1000 ; <<< byte size of System stack
#set STACK_USR_SIZE 4 ; <<< byte size of User stack
;
#set STACK_FILL ON ; <<< fills the stack area with pattern
#set STACK_PATTERN 0x55AA55AA ; <<< the pattern to write to stack
;
; - If the active stack is set to SYSSTACK, it is used for main program and interrupts.
; In this case, the user stack could be set to a dummy size. If the active stack is
; set to user stack, it is used for the main program but the system stack is
; automatically activated, if an interrupt is serviced. Both stack areas must have a
; reasonable size.
; - If STACK_RESERVE is ON, the sections USTACK and SSTACK are reserved in this module.
; Otherwise, they have to be reserved in other modules. If STACK_RESERVE is OFF, the
; size definitions STACK_SYS_SIZE and STACK_USR_SIZE have no meaning.
; - Even if they are reverved in other modules, they are still initialised in this
; start-up file.
;
; Note: Several library functions require quite a big stack (due to ANSI).
; Check the stack information files (*.stk) in the LIB\911 directory.
;
;=========================================================================================
; 4.4 Copy code from Flash to I-RAM
;=========================================================================================
;
#set I_RAM OFF ; <<< select if code in section IRAM
; should be copied
;
; If this option is activated code located in the section IRAM is copied during startup
; from ROM to the instruction-RAM. The code is linked for the instruction-RAM.
;
;=========================================================================================
; 4.5 Low-Level Library Interface
;=========================================================================================
;
#set CLIBINIT OFF ; <<< select ext. libray usage
;
; This option has only to be set, if stream-IO/standard-IO function of the C-libraray
; have to be used (printf(), fopen()...). This also requires low-level functions to be
; defined by the application software.
; For other library functions like (e.g. sprintf()) all this is not necessary. However,
; several functions consume a large amount of stack.
;
;=========================================================================================
; 4.6 C++ start-up
;=========================================================================================
;
#set CPLUSPLUS OFF ; <<< activate if c++ files are used
;
; In the C++ specifications, when external or static objects are used, a constructor
; must be called followed by the main function. Because four-byte pointers to the main
; function are stored in the EXT_CTOR_DTOR section, call a constructor sequentially from
; the lower address of the four addresses in that section. If using C++ sources,
; activate this function to create the section EXT_CTOR_DTOR.
;
;=========================================================================================
; 4.7 Clock Configuration
;=========================================================================================
;=========================================================================================
; 4.7.1 Clock Selection
;=========================================================================================
;
; No clock settings
#set NO_CLOCK 0x01
;
; Sub-oscillation input: 32 kHz
#set SUB_32KHZ_CPU__32KHZ_PER_32KHZ_EXT_32KHZ_CAN__2MHZ 0x11
;
; Oscillation input: 4 MHz
#set MAIN_4MHZ_CPU___2MHZ_PER__1MHZ_EXT__1MHZ_CAN__2MHZ 0x21
#set PLL_4MHZ__CPU__48MHZ_PER_16MHZ_EXT_24MHZ_CAN_16MHZ 0x22
#set PLL_4MHZ__CPU__64MHZ_PER_16MHZ_EXT_32MHZ_CAN_16MHZ 0x23
#set PLL_4MHZ__CPU__80MHZ_PER_20MHZ_EXT_27MHZ_CAN_20MHZ 0x24
#set PLL_4MHZ__CPU__80MHZ_PER_20MHZ_EXT_40MHZ_CAN_20MHZ 0x25
#set PLL_4MHZ__CPU__96MHZ_PER_16MHZ_EXT_48MHZ_CAN_16MHZ 0x26 ;not MB91V460, ...
#set PLL_4MHZ__CPU_100MHZ_PER_20MHZ_EXT_50MHZ_CAN_20MHZ 0x27 ;not MB91V460, ...
;
; MB91461R only: Oscillation input: 10 MHz
#set PLL_10MHZ_CPU__60MHZ_PER_20MHZ_EXT_30MHZ_CAN_20MHZ 0x41
;
; MB91461R only: Oscillation input: 20 MHz
#set PLL_20MHZ_CPU__60MHZ_PER_20MHZ_EXT_30MHZ_CAN_20MHZ 0x51
;
; User settings
#set CLOCK_USER 0x61
;
;
;
#set CLOCKSPEED PLL_4MHZ__CPU__64MHZ_PER_16MHZ_EXT_32MHZ_CAN_16MHZ
; ; <<< Select clock configuration
;
; There are different default configurations available, where all necessary settings for
; clocks and the related registers are made. Beside this configurations, there is the
; possibility to define a user configuration in the chapter "Definition of
; Configurations"
;
; - NO_CLOCK means:
; The clock registers are not set by the start-up file.
;
; - PLL_4MHZ__CPU__64MHZ_PER_16MHZ_EXT_32MHZ_CAN_16MHZ means:
; Main oszillation = 4 MHz, PLL is activated
; CPU clock (CLKB) = 64 MHZ
; Peripheral clock (CLKP) = 16 MHZ
; Ext. bus clock (CLKT) = 32 MHZ
; CAN clock (CLKCAN) = 16 MHz, using PLLx
;
; - CLOCK_USER:
; The user configuration definded in the chapter "Definition of Configurations" is set.
;
; Note: Not all frequencies are supported by every device. Please see the hardware
; manual.
;
;=========================================================================================
; 4.7.2 Select Clock Modulator
;=========================================================================================
;
#set CLOMO OFF ; <<< Enable /disable clock modulator
;
#set CMPR 0x026F ; <<< Ref. to the data sheet, CMPR
;
; Please refer to the data sheet of the device if you enable clock modulation. The
; register CMPR dependant on the PLL-Clock.
;
; Note: If the CLKCAN source is set either to main oscillator or to PLL output then the
; clock for the CAN is not influenced by the clock modulation. If the CLKCAN
; source is set CPU clock (CLKB) then the clock for the CAN is also modulated (if
; the clock modulator is enabled).
;
; Note: If the clock modulator is enabled, the wait states of the internal flash wait
; states must be adapted to maximum frequency. Please check the wait states
; settings.
;
; Note: This feature is not supported by every device, e.g. MB91461. Please check the
; data sheet.
;
;=========================================================================================
; 4.8 External Bus Interface
;
; The rest of the configuration is only applicable for devices with an external bus
; interface.
;
; If the device does not offer an external bus interface, the configuration can be
; stoped at this point.
;
;=========================================================================================
;
#set EXTBUS DEFAULT ; <<< Ext. Bus on/off
;
; ON - The ext. bus interface is enabled and is configured as
; set below.
;
; OFF - The ext. bus interface is diabled. The port function
; registers are set to general I/O. The registers of
; ext. bus interface will not be touched by the start-up
; file.
; Be aware, that the device might be conifgured in ext.
; bus mode by default after reset.
;
; DEFAULT - Neither the register nor the respective port function
; registers are touched by the start-up file.
; Be aware, that the device might be conifgured in ext.
; bus mode by default after reset.
;
;
; Note: This feature is not supported by every device. Please check the data sheet. The
; following devices for example do not offer an external bus interface: MB91464A,
; MB91467C, MB91465K, MB91463N, MB91465X.
;
;=========================================================================================
; 4.8.1 Select Chipselect (Only EXTBUS == ON)
;=========================================================================================
;
#set CS0 OFF ; <<< select CS (ON/OFF)
#set CS1 OFF ; <<< select CS (ON/OFF)
#set CS2 OFF ; <<< select CS (ON/OFF)
#set CS3 OFF ; <<< select CS (ON/OFF)
#set CS4 OFF ; <<< select CS (ON/OFF)
#set CS5 OFF ; <<< select CS (ON/OFF)
#set CS6 OFF ; <<< select CS (ON/OFF)
#set CS7 OFF ; <<< select CS (ON/OFF)
#set SDRAM OFF ; <<< select if a SDRAM is connected
;
;
#set ENACSX B'00000000 ; <<< set CS, ENACSX
; ||||||||
; ||||||||__ CS0 bit, enable/disable CS0 (1/0)
; |||||||___ CS1 bit, enable/disable CS1 (1/0)
; ||||||____ CS2 bit, enable/disable CS2 (1/0)
; |||||_____ CS3 bit, enable/disable CS3 (1/0)
; ||||______ CS4 bit, enable/disable CS4 (1/0)
; |||_______ CS5 bit, enable/disable CS5 (1/0)
; ||________ CS6 bit, enable/disable CS6 (1/0)
; |_________ CS7 bit, enable/disable CS7 (1/0)
;
; Note: If the SWB Monitor Debugger is used, set the CS1 (external RAM only) or CS0 and
; CS 1 (external RAM and flash) to off.
;
; Note: Not all Chipselects are supported by the different devices. Please check the
; data sheet.
;
;=========================================================================================
; 4.8.2 Set memory addressing for Chipselects (only EXTBUS == ON)
;=========================================================================================
;
#set AREASEL0 0x0000 ; <<< set start add. for CS0, ASR0
#set AREASEL1 0x0000 ; <<< set start add. for CS1, ASR1
#set AREASEL2 0x0000 ; <<< set start add. for CS2, ASR2
#set AREASEL3 0x0000 ; <<< set start add. for CS3, ASR3
#set AREASEL4 0x0000 ; <<< set start add. for CS4, ASR4
#set AREASEL5 0x0000 ; <<< set start add. for CS5, ASR5
#set AREASEL6 0x0000 ; <<< set start add. for CS6, ASR6
#set AREASEL7 0x0000 ; <<< set start add. for CS7, ASR7
;
; Configure the starting address of each used Chipselect. Chipselects which are not used
; (not set to ON in "Select Chipselect") need not be set (setting ignored).
;
; NOTE: Just the upper 16-bit of the start address must be set, e.g. when using start
; address 0x00080000 set 0x0008.
;
;=========================================================================================
; 4.8.3 Configure Chipselect Area (only EXTBUS == ON)
;=========================================================================================
;
#set CONFIGCS0 B'0000000000000000 ; <<< Config. CS0, ACR0
#set CONFIGCS1 B'0000000000000000 ; <<< Config. CS1, ACR1
#set CONFIGCS2 B'0000000000000000 ; <<< Config. CS2, ACR2
#set CONFIGCS3 B'0000000000000000 ; <<< Config. CS3, ACR3
#set CONFIGCS4 B'0000000000000000 ; <<< Config. CS4, ACR4
#set CONFIGCS5 B'0000000000000000 ; <<< Config. CS5, ACR5
#set CONFIGCS6 B'0000000000000000 ; <<< Config. CS6, ACR6
#set CONFIGCS7 B'0000000000000000 ; <<< Config. CS7, ACR7
; ||||||||||||||||
; ||||||||||||||||__ TYP0 bit, TYP0-4 bits select access type
; |||||||||||||||___ TYP1 bit
; ||||||||||||||____ TYP2 bit
; |||||||||||||_____ TYP3 bit
; ||||||||||||______ LEND bit, select little '1' or big endian '0'
; |||||||||||_______ WREN bit, en-/disable (1/0) Write access
; ||||||||||________ PFEN bit, en-/disable (1/0) pre-fetch
; |||||||||_________ SREN bit, en-/disable (1/0) share of BRQ & BGRNTX
; ||||||||__________ BST0 bit, BSTx bits select burst size
; |||||||___________ BST1 bit
; ||||||____________ DBW0 bit, DBWx select data bus width
; |||||_____________ DBW1 bit
; ||||______________ ASZ0 bit, ASZx bits select address size of CS
; |||_______________ ASZ1 bit
; ||________________ ASZ2 bit
; |_________________ ASZ3 bit
;
; Bit description:
;
; TYP3 TYP2 TYP1 TYP0 : Select access type of each CS
; 0 0 X X : Normal access (asynchronous SRAM, I/O,
; single/page/busrt-ROM/FLASH)
; 0 1 X X : Address/data multiplexed (8bit / 16bit bus width only)
; 0 X X 0 : WAIT insertion by RDY disabled
; 0 X X 1 : WAIT insertion by RDY enabled
; 0 X 0 X : The WR0X pin to the WR3X pin are used as write strobes
; (WRX is fixed at H-Level)
; 0 X 1 X : The WRX pin is used as write strobe
; 1 0 0 0 : Memory type A: SDRAM/FCRAM (Auto pre-charge used)
; 1 0 0 1 : Memory type B: FCRAM (Auto pre-charge used)
; 1 0 1 0 : setting not allowed
; 1 0 1 1 : setting not allowed
; 1 1 0 0 : setting not allowed
; 1 1 0 1 : setting not allowed
; 1 1 1 0 : setting not allowed
; 1 1 1 1 : mask area setting
;
; LEND : select BYTE ordering
; 0 : Big endian
; 1 : Little endian
;
; WREN : enable or disable write access
; 0 : disabled
; 1 : enabled,
;
; PFEN : Enable or disable the pre-fetch
; 0 : disabled
; 1 : enabled,
;
; SREN : Enable or disable the sharing of BRQ and BGRNTX
; 0 : disabled
; 1 : enabled (CSx pin High-Z)
;
; BST1 BST0 : set burst size of chip select area
; 0 0 : 1 burst (single access)
; 0 1 : 2 bursts (Address boundary 1 bit)
; 1 0 : 4 bursts (Address boundary 2 bit)
; 1 1 : 8 bursts (Address boundary 3 bit)
;
; DBW1 DBW0 : Set data bus width
; 0 0 : 8-bit (BYTE access)
; 0 1 : 16-bit (HALF-WORD access)
; 1 0 : 32-bit (WORD access)
; 1 1 : Reserved
;
; ASZ3 ASZ2 ASZ1 ASZ0 : Select memory size of each chipselect
; 0 0 0 0 : 64 Kbyte (0x01.0000 bytes; use ASR A[31:16] bits)
; 0 0 0 1 : 128 Kbyte (0x02.0000 bytes; use ASR A[31:17] bits)
; 0 0 1 0 : 256 Kbyte (0x04.0000 bytes; use ASR A[31:18] bits)
; 0 0 1 1 : 512 Kbyte (0x08.0000 bytes; use ASR A[31:19] bits)
; 0 1 0 0 : 1 Mbyte (0x10.0000 bytes; use ASR A[31:20] bits)
; 0 1 0 1 : 2 Mbyte (0x20.0000 bytes; use ASR A[31:21] bits)
; 0 1 1 0 : 4 Mbyte (0x40.0000 bytes; use ASR A[31:22] bits)
; 0 1 1 1 : 8 Mbyte (0x80.0000 bytes; use ASR A[31:23] bits)
; 1 0 0 0 : 16 Mbyte (0x100.0000 bytes; use ASR A[31:24] bits)
; 1 0 0 1 : 32 Mbyte (0x200.0000 bytes; use ASR A[31:25] bits)
; 1 0 1 0 : 64 Mbyte (0x400.0000 bytes; use ASR A[31:26] bits)
; 1 0 1 1 : 128 Mbyte (0x800.0000 bytes; use ASR A[31:27] bits)
; 1 1 0 0 : 256 Mbyte (0x1000.0000 bytes; use ASR A[31:28] bits)
; 1 1 0 1 : 512 Mbyte (0x2000.0000 bytes; use ASR A[31:29] bits)
; 1 1 1 0 : 1024 Mbyte(0x4000.0000 bytes; use ASR A[31:30] bits)
; 1 1 1 1 : 2048 Mbyte(0x8000.0000 bytes; use ASR A[31] bit)
;
;=========================================================================================
; 4.8.4 Set Wait cycles for Chipselects for ordinary businterface (only EXTBUS == ON)
;=========================================================================================
;
; Ordinary bus interface (w/o SDRAM and FRAM) (ACRx_Type = 0xxx)
;
#set WAITREG0 B'0000000000000000 ; <<< CS0 Waitstates, AWR0
#set WAITREG1 B'0000000000000000 ; <<< CS1 Waitstates, AWR1
#set WAITREG2 B'0000000000000000 ; <<< CS2 Waitstates, AWR2
#set WAITREG3 B'0000000000000000 ; <<< CS3 Waitstates, AWR3
#set WAITREG4 B'0000000000000000 ; <<< CS4 Waitstates, AWR4
#set WAITREG5 B'0000000000000000 ; <<< CS5 Waitstates, AWR5
; ||||||||||||||||
; ||||||||||||||||__ W00 bit, RDY/WRY-> CSX hold cycle
; |||||||||||||||___ W01 bit, CSX->RDX/WRX setup extension cycle
; ||||||||||||||____ W02 bit, Address -> CSX Delay selection
; |||||||||||||_____ W03 bit, WR0X to WR3X/WRX outout timing
; ||||||||||||______ W04 bit, W04/W05 Write recovery cycle
; |||||||||||_______ W05 bit
; ||||||||||________ W06 bit, W06/07 Read -> Write idle cycle
; |||||||||_________ W07 bit selection
; ||||||||__________ W08 bit, W08-W11 Intra-page access cycle
; |||||||___________ W09 bit select (0-15 cycles)
; ||||||____________ W10 bit
; |||||_____________ W11 bit
; ||||______________ W12 bit, W12-W15 First access wait cycle
; |||_______________ W13 bit select (0-15 cycles)
; ||________________ W14 bit
; |_________________ W15 bit
;
;
; SDRAM and FRAM bus interface (ACRx_Type = 100x)
;
#set WAITREG6 B'0000000000000000 ; <<< CS6 Waitstates, AWR6
#set WAITREG7 B'0000000000000000 ; <<< CS7 Waitstates, AWR7
; ||||||||||||||||
; ||||||||||||||||__ W00 bit, W0-W1 RAS precharge cycles
; |||||||||||||||___ W01 bit
; ||||||||||||||____ W02 bit, W2-W3 RAS active Time
; |||||||||||||_____ W03 bit
; ||||||||||||______ W04 bit, W4-W5 Write recovery cycle
; |||||||||||_______ W05 bit
; ||||||||||________ W06 bit, W6-W7 Read->Write idle cycle
; |||||||||_________ W07 bit
; ||||||||__________ W08 bit, W8-W10 CAS latency
; |||||||___________ W09 bit
; ||||||____________ W10 bit
; |||||_____________ W11 bit, reserved
; ||||______________ W12 bit, W12-W16 RAS-CAS delay
; |||_______________ W13 bit
; ||________________ W14 bit
; |_________________ W15 bit, reserved
;
;
; The bit meaning depends on the configured bus interface type. The bus interface can be
; configured for different memory types. Depending on the memory type, the wait register
; bits have a differnt meaning. CS0-5 should be configurable as ordinary bus interface
; (w/o SDRAM and FRAM) and CS6-7 should be configurable as SDRAM and FRAM. It is also
; possible and for some devices neccessary to configure other two chip selects as SDRAM
; or FRAM interface. In such a case be aware of the bit meanings.
;
;
; Ordinary bus interface (w/o SDRAM and FRAM) (ACRx_Type = 0xxx)
; --------------------------------------------------------------
;
; Bit description:
;
; W00 : RDY/WRX -> CSX hold extension cycle
; 0 : 0 cycle
; 1 : 1 cycle
;
; W01 : CSX -> RDX/WRX setup extention cycle
; 0 : 0 cycle
; 1 : 1 cycle
;
; W02 : Address -> CSX Delay selection
; 0 : no delay selected
; 1 : delay selected
;
; W03 : WR0X to WR3X/WRX outout timing selection
; 0 : MCLK synchronous write output enable (ASX=L)
; 1 : Asynchronous write strobe output (norma operation)
;
; W05 W04 : select Write recovery cycle
; 0 0 : 0 cycle
; 0 1 : 1 cycle
; 1 0 : 2 cycles
; 1 1 : 3 cycles
;
; W07 W06 : Read -> Write idle cycle selection
; 0 0 : 0 cycle
; 0 1 : 1 cycle
; 1 0 : 2 cycles
; 1 1 : 3 cycles
;
; W11 W10 W09 W08 : Intra-page access cycle select (0-15 cycles)
; 0 0 0 0 : 0 Wait state
; 0 0 0 1 : 1 Auto-wait cycle
; 0 0 1 0 : 2 Auto-wait cycle
; ....
; 1 1 1 1 : 15 Auto wait cycles
;
; W15 W14 W13 W12 : First access wait cycle can be set (0-15 cycles)
; 0 0 0 0 : 0 Wait state
; 0 0 0 1 : 1 Auto-wait cycle
; 0 0 1 0 : 2 Auto-wait cycle
; ....
; 1 1 1 1 : 15 Auto wait cycles
;
;
;
; SDRAM and FRAM bus interface (ACRx_Type = 100x)
; -----------------------------------------------
;
; Bit description:
;
; W01 W00 : RAS precharge cycles.
; 0 0 : 1 cycle
; 0 1 : 2 cycles
; 1 0 : 5 cycles
; 1 1 : 6 cycles
;
; W03 W02 : RAS active Time
; 0 0 : 1 cycle
; 0 1 : 2 cycles
; 1 0 : 5 cycles
; 1 1 : 6 cycles
;
; W05 W04 : set Write recovery cycle (1 - 4 cycles)
; 0 0 : Prohibited
; 0 1 : 2 cycles
; 1 0 : 3 cycles
; 1 1 : 4 cycles
;
; W07 W06 : set Read -> Write idle Cycle (1 - 4 cycles)
; 0 0 : 1 cycle
; 0 1 : 2 cycles
; 1 0 : 3 cycles
; 1 1 : 4 cycles
;
; W10 W09 W08 : set CAS latency (1 - 8 cycles)
; 0 0 0 : 1 cycle
; 0 0 1 : 2 cycle
; ...
; 1 1 1 : 8 cycle
;
; W11 : RESERVED, ALWAYS WRITE 0 !
;
; W14 W13 W12 : set RAS-CAS delay (1 - 8 cycles)
; 0 0 0 : 1 cycle
; 0 0 1 : 2 cycle
; ...
; 1 1 1 : 8 cycle
;
; W15 : RESERVED, ALWAYS WRITE 0 !
;
; The bit meaning depends on the configured bus interface type
;
;=========================================================================================
; 4.8.5 Configure Chipselects for SDRAM memory only (only EXTBUS == ON and SDRAM)
;=========================================================================================
;
#set MEMCON B'00000111 ; <<< set special SDRAM register, MCRA
; ||||||||
; ||||||||__ ABS0 bit, set max. active banks (ABS1,0)
; |||||||___ ABS1 bit
; ||||||____ BANK bit, set number of banks connected to CS
; |||||_____ WBST bit, Write burst enable/disable
; ||||______ PSZ0 bit, Set page size (PSZ2-0)
; |||_______ PSZ1 bit
; ||________ PSZ2 bit
; |_________ reserved, always write 0
;
; When connecting SDRAM/FCRAM TYP3-0=1000 in ACRx register the following register must
; be setup.
;
; Bit description:
;
; ABS1 ABS0 : Set maximum number of bank, active at same time
; 0 0 : 1 bank
; 0 1 : 2 banks
; 1 0 : 3 banks
; 1 1 : 4 banks
;
; BANK : Set number of connected SDRAM banks
; 0 : 2 banks
; 1 : 4 banks
;
; WBST : Write burst enable
; 0 : Single Write
; 1 : Busrt Write
;
; PSZ2 PSZ1 PS0 : Select page size of connected memory
; 0 0 0 : 8-bit column address = A0 to A7
; 0 0 1 : 9-bit column address = A0 to A8
; 0 1 0 : 10-bit column address = A0 to A9
; 0 1 1 : 11-bit column address = A0 to A9, A11
; 1 X X : setting disabled
;
;
;=========================================================================================
; 4.8.6 Referesh Control Register RCR (only EXTBUS == ON and SDRAM)
;=========================================================================================
;
#set REFRESH B'1110001001000111 ; <<< set Refresh Control Register, RCR
; ||||||||||||||||
; ||||||||||||||||__ TRC0 bit, set refresh cycle (TRC2-0)
; |||||||||||||||___ TRC1 bit
; ||||||||||||||____ TRC2 bit
; |||||||||||||_____ PON bit, set power-on control
; ||||||||||||______ RFC0 bit, set refresh count (RFC2-0)
; |||||||||||_______ RFC1 bit
; ||||||||||________ RFC2 bit
; |||||||||_________ BRST bit, set burst refresh control
; ||||||||__________ RFINT0 bit, set auto refresh interval
; |||||||___________ RFINT1 bit, (RFINT5-0)
; ||||||____________ RFINT2 bit
; |||||_____________ RFINT3 bit
; ||||______________ RFINT4 bit
; |||_______________ RFINT5 bit
; ||________________ RRLD bit, counter refresh strat control
; |_________________ SELF bit, self refresh control
;
;
; This register sets various SDRAM refresh controls. When SDRAM control is not set for
; any area, the setting of this register is meaningless, but do not change the register
; value at initial state. When a read is performed using a read-modify-write
; instruction, 0 always returns from the SELF, RRLD, and PON bits.
;
; Bit description:
;
;
; TRC2 TRC1 TRC0 : Refresh Cycle
; 0 0 0 : 4
; 0 0 1 : 5
; 0 1 0 : 6
; 0 1 1 : 7
; 1 0 0 : 8
; 1 0 1 : 9
; 1 1 0 : 10
; 1 1 1 : 11
;
; PON : Power-on control
; 0 : disabled
; 1 : power-on sequence started
;
; RFC2 RFC1 RFC0 : Refresh Count
; 0 0 0 : 256
; 0 0 1 : 512
; 0 1 0 : 1024
; 0 1 1 : 2048
; 1 0 0 : 4096
; 1 0 1 : 8192
; 1 1 0 : Setting disabled
; 1 1 1 : Refresh disabled
;
; BRST : Burst refresh control
; 0 : Decentralised refresh
; 1 : burst refresh
;
; RFINT[5-0] : auto refresh interval
;
; RRLD : Refresh counter Activation Control
; 0 : Disabled,
; 1 : Autorefresh performed once, then value of RFINT reloaded
;
; SELF : Self refresh control
; 0 : auto refresh or power down
; 1 : Transitions to self-refresch mode
;
; NOTE: PON bit is set after the above setting. Do not set PON bit to 1 in the
; above setting. Otherwise the settings are not correct set.
;
;=========================================================================================
; 4.8.7 Terminal and Timing Control Register (only EXTBUS == ON)
;=========================================================================================
;
#set TIMECONTR B'00000000 ; <<< set TCR register, TCR
; ||||||||
; ||||||||__ RDW0 bit, set wait cycle reduction (RDW0,1)
; |||||||___ RDW1 bit
; ||||||____ OHT0 bit, set output hold delay (OHT1,0)
; |||||_____ OHT1 bit
; ||||______ reserved, always write 0
; |||_______ PCLR bit, prefetch buffer clear
; ||________ PSUS bit, prefetch suspend
; |_________ BREN bit, BRQ input enable
;
; This register controls the general functions of the external bus interface controller
; such as the common-pin function setting and timing control.
;
; Bit description:
;
; RDW1 RDW0 : Wait cycle reduction
; 0 0 : Normal Wait (AWR0 - 7 setting)
; 0 1 : 1/2 of AWR0 - 7 setting value
; 1 0 : 1/4 of AWR0 - 7 setting value
; 1 1 : 1/8 of AWR0 - 7 setting value
;
; OHT1 OHT0 : Output hold selection bit
; 0 0 : Output performed at falling edge of SYSCLK/MCLK
; 0 1 : Output performed about 3ns after falling edge of SYSCLK/MCLK
; 1 0 : Output performed about 4ns after falling edge of SYSCLK/MCLK
; 1 1 : Output performed about 5ns after falling edge of SYSCLK/MCLK
;
; PCLR : Prefetch buffer all clear
; 0 : normal state
; 1 : Prefetch buffer cleared
;
; PSUS : prefetch suspension bit
; 0 : Prefetch enabled
; 1 : Prefetch disabled
;
; BREN : BRQ input enable
; 0 : disabled,
; 1 : enabled, Bus sharing of BRQ/BGRNTX performed
;
; Note: This function is used to prevent an excessive access cycle wait while operating
; at a low-speed clock (such as while base clock operating at low speed or
; high frequency division rate for external bus clock).
;
;=========================================================================================
; 4.8.8 Enable/Disable I-CACHE (only EXTBUS == ON)
;=========================================================================================
;
#set C1024 1 ; CACHE Size: 1024 BYTE
#set C2048 2 ; CACHE Size: 2048 BYTE
#set C4096 3 ; CACHE Size: 4096 BYTE
;
;
#set CACHE OFF ; <<< Select use of cache
#set CACHE_SIZE C4096 ; <<< Select size of cache, ISIZE
;
; It is possible to use cache functionality on the I-Bus on several devices. Please
; check the corresponidng data sheet if this feature is available on a certain device
; and for the size of the cache. This is the general cache configuration. It is possible
; to configure for each CS area, if the cache should be used.
;
; Note: This feature is not supported by every device. Please check the data sheet. The
; feature is for example supported by MB91461R, MB91469G.
;
;=========================================================================================
; 4.8.9 Enable CACHE for chipselect (only EXTBUS == ON)
;=========================================================================================
;
#set CHEENA B'11111111 ; <<< en-/disable cache, CHER
; ||||||||
; ||||||||__ CHE0 bit, CS0 area
; |||||||___ CHE1 bit, CS1 area
; ||||||____ CHE2 bit, CS2 area
; |||||_____ CHE3 bit, CS3 area
; ||||______ CHE4 bit, CS4 area
; |||_______ CHE5 bit, CS5 area
; ||________ CHE6 bit, CS6 area
; |_________ CHE7 bit, CS7 area
;
; Additional to the general cache enable setting, select which CS area should be used
; with cache functionality.
;
; Note: Not all Chipselects are supported by the different devices. Please check the
; data sheet.
;
; Note: This feature is not supported by every device. Please check the data sheet. The
; Feature is supported by MB91461R, MB91469G.
;
;=========================================================================================
; 4.8.10 Select External bus mode (Data lines) (only EXTBUS == ON)
;=========================================================================================
;
#set PFUNC0 B'11111111 ;<<< Data lines or GIO, PFR00
; ||||||||
; ||||||||__ D24 / P00_0
; |||||||___ D25 / P00_1
; ||||||____ D26 / P00_2
; |||||_____ D27 / P00_3
; ||||______ D28 / P00_4
; |||_______ D29 / P00_5
; ||________ D30 / P00_6
; |_________ D31 / P00_7
;
#set PFUNC1 B'11111111 ;<<< Data lines or GIO, PFR01
; ||||||||
; ||||||||__ D16 / P01_0
; |||||||___ D17 / P01_1
; ||||||____ D18 / P01_2
; |||||_____ D19 / P01_3
; ||||______ D20 / P01_4
; |||_______ D21 / P01_5
; ||________ D22 / P01_6
; |_________ D23 / P01_7
;
#set PFUNC2 B'11111111 ;<<< Data lines or GIO, PFR02
; ||||||||
; ||||||||__ D8 / P02_0
; |||||||___ D9 / P02_1
; ||||||____ D10 / P02_2
; |||||_____ D11 / P02_3
; ||||______ D12 / P02_4
; |||_______ D13 / P02_5
; ||________ D14 / P02_6
; |_________ D15 / P02_7
;
#set PFUNC3 B'11111111 ;<<< Data lines or GIO, PFR03
; ||||||||
; ||||||||__ D0 / P03_0
; |||||||___ D1 / P03_1
; ||||||____ D2 / P03_2
; |||||_____ D3 / P03_3
; ||||______ D4 / P03_4
; |||_______ D5 / P03_5
; ||________ D6 / P03_6
; |_________ D7 / P03_7
;
; Select if the ports are set to
; 1 : External bus mode, I/O for data lines or
; 0 : General I/O port (GIO)
;
; Note: Not all data-lines are supported by the different devices. Please check the data
; sheet.
;
;=========================================================================================
; 4.8.11 Select External bus mode (Address lines) (only EXTBUS == ON)
;=========================================================================================
;
#set PFUNC4 B'11111111 ;<<< Address lines or GIO, PFR04
; ||||||||
; ||||||||__ A24 / P04_0
; |||||||___ A25 / P04_1
; ||||||____ A26 / P04_2
; |||||_____ A27 / P04_3
; ||||______ A28 / P04_4
; |||_______ A29 / P04_5
; ||________ A30 / P04_6
; |_________ A31 / P04_7
;
#set PFUNC5 B'11111111 ;<<< Address lines or GIO, PFR05
; ||||||||
; ||||||||__ A16 / P05_0
; |||||||___ A17 / P05_1
; ||||||____ A18 / P05_2
; |||||_____ A19 / P05_3
; ||||______ A20 / P05_4
; |||_______ A21 / P05_5
; ||________ A22 / P05_6
; |_________ A23 / P05_7
;
#set PFUNC6 B'11111111 ;<<< Address lines or GIO, PFR06
; ||||||||
; ||||||||__ A8 / P06_0
; |||||||___ A9 / P06_1
; ||||||____ A10 / P06_2
; |||||_____ A11 / P06_3
; ||||______ A12 / P06_4
; |||_______ A13 / P06_5
; ||________ A14 / P06_6
; |_________ A15 / P06_7
;
#set PFUNC7 B'11111111 ;<<< Address lines or GIO, PFR07
; ||||||||
; ||||||||__ A0 / P07_0
; |||||||___ A1 / P07_1
; ||||||____ A2 / P07_2
; |||||_____ A3 / P07_3
; ||||______ A4 / P07_4
; |||_______ A5 / P07_5
; ||________ A6 / P07_6
; |_________ A7 / P07_7
;
; Select if the ports are set to
; 1 : External bus mode, I/O for address lines or
; 0 : General I/O port (GIO)
;
; Note: Not all address-lines are supported by the different devices. Please check the
; data sheet.
;
;=========================================================================================
; 4.8.12 Select External bus mode (Control signals) (only EXTBUS == ON)
;=========================================================================================
;
#set PFUNC8 B'11111111 ;<<< Control signals or GIO, PFR08
; ||||||||
; ||||||||__ WRX0 / P08_0
; |||||||___ WRX1 / P08_1
; ||||||____ WRX2 / P08_2
; |||||_____ WRX3 / P08_3
; ||||______ RDX / P08_4
; |||_______ BGRNTX / P08_5
; ||________ BRQ / P08_6
; |_________ RDY / P08_7
;
#set PFUNC9 B'11111111 ;<<< Control signals or GIO, PFR09
; ||||||||
; ||||||||__ CSX0 / P09_0
; |||||||___ CSX1 / P09_1
; ||||||____ CSX2 / P09_2
; |||||_____ CSX3 / P09_3
; ||||______ CSX4 / P09_4
; |||_______ CSX5 / P09_5
; ||________ CSX6 / P09_6
; |_________ CSX7 / P09_7
;
#set PFUNC10 B'01011111 ;<<< Control signals or GIO, PFR10
; ||||||||
; ||||||||__ SYSCLK or !SYSCLK / P10_0
; |||||||___ ASX / P10_1
; ||||||____ BAAX / P10_2
; |||||_____ WEX / P10_3
; ||||______ MCLKO or !MCLKO / P10_4
; |||_______ MCLKI or !MCLKI/ P10_5
; ||________ MCLKE / P10_6
; |_________ -
;
#set EPFUNC10 B'00000000 ;<<< Control signals or GIO, EPFR10
; ||||||||
; ||||||||__ 0:SYSCLK / 1:!SYSCLK
; |||||||___ -
; ||||||____ -
; |||||_____ -
; ||||______ 0:MCLKO / 1:!MCLKO
; |||_______ 0:MCLKI / 1:!MCLKI
; ||________ 0:MCLKI / 1:!MCLKI
; |_________ -
;
;
; Select if the ports are set to
; 1 : External bus mode, I/O for control lines or
; 0 : General I/O port (GIO)
;
; Note: Not all control-lines are supported by the different devices. Please check the
; data sheet.
;
;=========================================================================================
; 5 Definition of Configurations
;=========================================================================================
;
#set NOCLOCK 0 ; do not touch CKSCR register
#set MAINCLOCK 1 ; select main clock
; ; MB91461R : 1/4 of oscillation input
; ; Others: 1/2 of oscillation input
#set MAINPLLCLOCK 2 ; select main clock with PLL
#set SUBCLOCK 3 ; select subclock (if available)
;
#set PSCLOCK_CLKB 0x00 ; select core clock (initial)
#set PSCLOCK_PLL 0x10 ; select PLL output (x)
#set PSCLOCK_MAIN 0x30 ; select Main Oscillation
;
;=========================================================================================
; 5.1 CLOCKSPEED == CLOCK_USER <<<
;=========================================================================================
; Must be configured only in the case of CLOCKSPEED is set to CLOCK_USER. Please see the
; corresponding application note.
;
#if (CLOCKSPEED == CLOCK_USER )
#set CLOCKSOURCE MAINPLLCLOCK ; <<< Clocksource
#set ENABLE_SUBCLOCK OFF ; <<< Subclock: ON/OFF
#set PLLSPEED 0x010F ; <<< 0x48Ch, 0x48Dh: PLLDIVM/N ; 64 MHz
#set DIV_G 0x0F ; <<< 0x48Eh: PLLDIVG;
#set MUL_G 0x0F ; <<< 0x48Fh: PLLMULG;
; Clock Divider
#set CPUCLOCK 0x00 ; <<< 0x486h: DIV0R_B; => /1 ; 64 MHz
#set PERCLOCK 0x03 ; <<< 0x486h: DIV0R_P; => /4 ; 16 MHz
#set EXTBUSCLOCK 0x01 ; <<< 0x487h: DIV1R_T; => /2 ; 32 MHz
; CAN Clock
#set PSCLOCKSOURCE PSCLOCK_PLL ; <<< 0x4C0h: CANPRE; => PLLx;128 MHz
#set PSDVC 0x07 ; <<< 0x4C0h: CANPRE_DVC;=> /8 ; 16 MHz
#set CANCLOCK 0x00 ; <<< 0x4C1h: CANCKD;
; Voltage Regulator
#set REGULATORSEL 0x06 ; <<< 0x4CEh: REGSEL;
#set REGULATORCTRL 0x00 ; <<< 0x4CFh: REGCTR;
; Memory Controller
#set FLASHCONTROL 0x032 ; <<< 0x7002h: FCHCR;
#set FLASHREADT 0xC413 ; <<< 0x7004h: FMWT;
#set FLASHMWT2 0x10 ; <<< 0x7006h: FMWT2;
#endif
;
;=========================================================================================
; 5.2 CLOCKSPEED == NO_CLOCK
;=========================================================================================
;
#if (CLOCKSPEED == NO_CLOCK )
#set CLOCKSOURCE NOCLOCK
#endif
;
;=========================================================================================
; 5.2 CLOCKSPEED == SUB_32KHZ_CPU__32KHZ_PER_32KHZ_EXT_32KHZ_CAN__2MHZ
;=========================================================================================
;
#if (CLOCKSPEED == SUB_32KHZ_CPU__32KHZ_PER_32KHZ_EXT_32KHZ_CAN__2MHZ )
;
; Start restriction; Maximum frequency
#if (DEVICE == MB91463N) || (DEVICE == MB91461R)
#error: Frequency is not supported by this device.
#endif
; End restriction
;
#set CLOCKSOURCE SUBCLOCK ; Clocksource
#set ENABLE_SUBCLOCK ON ; Subclock: ON/OFF
#set PLLSPEED 0x010F ; 0x48Ch, 0x48Dh: PLLDIVM/N ; n. a.
#set DIV_G 0x0F ; 0x48Eh: PLLDIVG;
#set MUL_G 0x0F ; 0x48Fh: PLLMULG;
; Clock Divider
#set CPUCLOCK 0x00 ; 0x486h: DIV0R_B; => /1 ; 32 KHz
#set PERCLOCK 0x00 ; 0x486h: DIV0R_P; => /1 ; 32 KHz
#set EXTBUSCLOCK 0x00 ; 0x487h: DIV1R_T; => /1 ; 32 KHz
; CAN Clock
#set PSCLOCKSOURCE PSCLOCK_MAIN ; 0x4C0h: CANPRE; => MAIN ; 4 MHz
#set PSDVC 0x01 ; 0x4C0h: CANPRE_DVC; => /2 ; 2 MHz
#set CANCLOCK 0x00 ; 0x4C1h: CANCKD; all CAN Clocks enabled
; Voltage Regulator
#set REGULATORSEL 0x06 ; 0x4CEh: REGSEL;
#set REGULATORCTRL 0x00 ; 0x4CFh: REGCTR;
; Memory Controller
#set FLASHCONTROL 0x032 ; 0x7002h: FCHCR;
#set FLASHREADT 0xC100 ; 0x7004h: FMWT;
#set FLASHMWT2 0x00 ; 0x7006h: FMWT2;
#endif
;
;=========================================================================================
; 5.3 CLOCKSPEED == MAIN__4MHZ_CPU___2MHZ_PER__1MHZ_EXT__1MHZ_CAN__2MHZ
;=========================================================================================
;
#if (CLOCKSPEED == MAIN_4MHZ_CPU___2MHZ_PER__1MHZ_EXT__1MHZ_CAN__2MHZ )
;
; Start restriction; Maximum frequency
#if (DEVICE == MB91461R)
#error: Frequency is not supported by this device.
#endif
; End restriction
;
#set CLOCKSOURCE MAINCLOCK ; Clocksource
#set ENABLE_SUBCLOCK OFF ; Subclock: ON/OFF
#set PLLSPEED 0x010F ; 0x48Ch, 0x48Dh: PLLDIVM/N ; n. a.
#set DIV_G 0x0F ; 0x48Eh: PLLDIVG;
#set MUL_G 0x0F ; 0x48Fh: PLLMULG;
; Clock Divider
#set CPUCLOCK 0x00 ; 0x486h: DIV0R_B; => /1 ; 2 MHz
#set PERCLOCK 0x01 ; 0x486h: DIV0R_P; => /2 ; 1 MHz
#set EXTBUSCLOCK 0x01 ; 0x487h: DIV1R_T; => /2 ; 1 MHz
; CAN Clock
#set PSCLOCKSOURCE PSCLOCK_MAIN ; 0x4C0h: CANPRE; => PLLx ; 4 MHz
#set PSDVC 0x01 ; 0x4C0h: CANPRE_DVC; => /2 ; 2 MHz
#set CANCLOCK 0x00 ; 0x4C1h: CANCKD; all CAN Clocks enabled
; Voltage Regulator
#set REGULATORSEL 0x06 ; 0x4CEh: REGSEL;
#set REGULATORCTRL 0x00 ; 0x4CFh: REGCTR;
; Memory Controller
#set FLASHCONTROL 0x032 ; 0x7002h: FCHCR;
#set FLASHREADT 0xC100 ; 0x7004h: FMWT;
#set FLASHMWT2 0x00 ; 0x7006h: FMWT2;
#endif
;
;=========================================================================================
; 5.4 CLOCKSPEED == PLL_4MHZ__CPU__48MHZ_PER_16MHZ_EXT_24MHZ_CAN_16MHZ
;=========================================================================================
;
#if (CLOCKSPEED == PLL_4MHZ__CPU__48MHZ_PER_16MHZ_EXT_24MHZ_CAN_16MHZ )
;
; Start restriction; Maximum frequency
#if (DEVICE == MB91461R)
#error: Frequency is not supported by this device.
#endif
; End restriction
;
#set CLOCKSOURCE MAINPLLCLOCK ; Clocksource
#set ENABLE_SUBCLOCK OFF ; Subclock: ON/OFF
#set PLLSPEED 0x010B ; 0x48Ch, 0x48Dh: PLLDIVM/N ; 48 MHz
#set DIV_G 0x0F ; 0x48Eh: PLLDIVG;
#set MUL_G 0x0B ; 0x48Fh: PLLMULG;
; Clock Divider
#set CPUCLOCK 0x00 ; 0x486h: DIV0R_B; => /1 ; 48 MHz
#set PERCLOCK 0x02 ; 0x486h: DIV0R_P; => /3 ; 16 MHz
#set EXTBUSCLOCK 0x01 ; 0x487h: DIV1R_T; => /2 ; 24 MHz
; CAN Clock
#set PSCLOCKSOURCE PSCLOCK_PLL ; 0x4C0h: CANPRE; => PLLx ; 96 MHz
#set PSDVC 0x05 ; 0x4C0h: CANPRE_DVC; => /6 ; 16 MHz
#set CANCLOCK 0x00 ; 0x4C1h: CANCKD; all CAN Clocks enabled
; Voltage Regulator
#if (DEVICE == MB91469G)
#set REGULATORSEL 0x36 ; 0x4CEh: REGSEL;
#else
#set REGULATORSEL 0x06 ; 0x4CEh: REGSEL;
#endif
#set REGULATORCTRL 0x00 ; 0x4CFh: REGCTR;
; Memory Controller
#set FLASHCONTROL 0x032 ; 0x7002h: FCHCR;
#set FLASHREADT 0xC201 ; 0x7004h: FMWT;
#set FLASHMWT2 0x00 ; 0x7006h: FMWT2;
#endif
;
;=========================================================================================
; 5.5 CLOCKSPEED == PLL_4MHZ__CPU__64MHZ_PER_16MHZ_EXT_32MHZ_CAN_16MHZ
;=========================================================================================
;
#if (CLOCKSPEED == PLL_4MHZ__CPU__64MHZ_PER_16MHZ_EXT_32MHZ_CAN_16MHZ )
;
; Start restriction; Maximum frequency
#if (DEVICE == MB91461R)
#error: Frequency is not supported by this device.
#endif
; End restriction
;
#set CLOCKSOURCE MAINPLLCLOCK ; Clocksource
#set ENABLE_SUBCLOCK OFF ; Subclock: ON/OFF
#set PLLSPEED 0x010F ; 0x48Ch, 0x48Dh: PLLDIVM/N ; 64 MHz
#set DIV_G 0x0F ; 0x48Eh: PLLDIVG;
#set MUL_G 0x0F ; 0x48Fh: PLLMULG;
; Clock Divider
#set CPUCLOCK 0x00 ; 0x486h: DIV0R_B; => /1 ; 64 MHz
#set PERCLOCK 0x03 ; 0x486h: DIV0R_P; => /4 ; 16 MHz
#set EXTBUSCLOCK 0x01 ; 0x487h: DIV1R_T; => /2 ; 32 MHz
; CAN Clock
#set PSCLOCKSOURCE PSCLOCK_PLL ; 0x4C0h: CANPRE; => PLLx ; 128 MHz
#set PSDVC 0x07 ; 0x4C0h: CANPRE_DVC; => /8 ; 16 MHz
#set CANCLOCK 0x00 ; 0x4C1h: CANCKD; all CAN Clocks enabled
; Voltage Regulator
#set REGULATORSEL 0x06 ; 0x4CEh: REGSEL;
#set REGULATORCTRL 0x00 ; 0x4CFh: REGCTR;
; Memory Controller
#set FLASHCONTROL 0x032 ; 0x7002h: FCHCR;
#set FLASHREADT 0xC413 ; 0x7004h: FMWT;
#set FLASHMWT2 0x10 ; 0x7006h: FMWT2;
#endif
;
;=========================================================================================
; 5.6 CLOCKSPEED == PLL_4MHZ__CPU__80MHZ_PER_20MHZ_EXT_27MHZ_CAN_20MHZ
;=========================================================================================
;
#if (CLOCKSPEED == PLL_4MHZ__CPU__80MHZ_PER_20MHZ_EXT_27MHZ_CAN_20MHZ )
;
; Start restriction; Maximum frequency
#if (DEVICE == MB91461R)
#error: Frequency is not supported by this device.
#endif
; End restriction
;
#set CLOCKSOURCE MAINPLLCLOCK ; Clocksource
#set ENABLE_SUBCLOCK OFF ; Subclock: ON/OFF
#set PLLSPEED 0x0113 ; 0x48Ch, 0x48Dh: PLLDIVM/N ; 80 MHz
#set DIV_G 0x0F ; 0x48Eh: PLLDIVG;
#set MUL_G 0x13 ; 0x48Fh: PLLMULG;
; Clock Divider
#set CPUCLOCK 0x00 ; 0x486h: DIV0R_B; => /1 ; 80 MHz
#set PERCLOCK 0x03 ; 0x486h: DIV0R_P; => /4 ; 20 MHz
#set EXTBUSCLOCK 0x02 ; 0x487h: DIV1R_T; => /3 ; 27 MHz
; CAN Clock
#set PSCLOCKSOURCE PSCLOCK_PLL ; 0x4C0h: CANPRE; => PLLx ; 160 MHz
#set PSDVC 0x07 ; 0x4C0h: CANPRE_DVC; => /8 ; 8 MHz
#set CANCLOCK 0x00 ; 0x4C1h: CANCKD; all CAN Clocks enabled
; Voltage Regulator
#set REGULATORSEL 0x06 ; 0x4CEh: REGSEL;
#set REGULATORCTRL 0x00 ; 0x4CFh: REGCTR;
; Memory Controller
#set FLASHCONTROL 0x032 ; 0x7002h: FCHCR;
#set FLASHREADT 0xC413 ; 0x7004h: FMWT;
#set FLASHMWT2 0x10 ; 0x7006h: FMWT2;
#endif
;
;=========================================================================================
; 5.7 CLOCKSPEED == PLL_4MHZ__CPU__80MHZ_PER_20MHZ_EXT_40MHZ_CAN_20MHZ
;=========================================================================================
;
#if (CLOCKSPEED == PLL_4MHZ__CPU__80MHZ_PER_20MHZ_EXT_40MHZ_CAN_20MHZ )
;
; Start restriction; Maximum frequency
#if (DEVICE == MB91461R)
#error: Frequency is not supported by this device.
#endif
; End restriction
;
#set CLOCKSOURCE MAINPLLCLOCK ; Clocksource
#set ENABLE_SUBCLOCK OFF ; Subclock: ON/OFF
#set PLLSPEED 0x0113 ; 0x48Ch, 0x48Dh: PLLDIVM/N ; 80 MHz
#set DIV_G 0x0F ; 0x48Eh: PLLDIVG;
#set MUL_G 0x13 ; 0x48Fh: PLLMULG;
; Clock Divider
#set CPUCLOCK 0x00 ; 0x486h: DIV0R_B; => /1 ; 80 MHz
#set PERCLOCK 0x03 ; 0x486h: DIV0R_P; => /4 ; 20 MHz
#set EXTBUSCLOCK 0x01 ; 0x487h: DIV1R_T; => /2 ; 40 MHz
; CAN Clock
#set PSCLOCKSOURCE PSCLOCK_PLL ; 0x4C0h: CANPRE; => PLLx ; 160 MHz
#set PSDVC 0x07 ; 0x4C0h: CANPRE_DVC; => /8 ; 8 MHz
#set CANCLOCK 0x00 ; 0x4C1h: CANCKD; all CAN Clocks enabled
; Voltage Regulator
#set REGULATORSEL 0x06 ; 0x4CEh: REGSEL;
#set REGULATORCTRL 0x00 ; 0x4CFh: REGCTR;
; Memory Controller
#set FLASHCONTROL 0x032 ; 0x7002h: FCHCR;
#set FLASHREADT 0xC413 ; 0x7004h: FMWT;
#set FLASHMWT2 0x10 ; 0x7006h: FMWT2;
#endif
;
;=========================================================================================
; 5.8 CLOCKSPEED == PLL_4MHZ__CPU__96MHZ_PER_16MHZ_EXT_48MHZ_CAN_16MHZ
;=========================================================================================
;
#if (CLOCKSPEED == PLL_4MHZ__CPU__96MHZ_PER_16MHZ_EXT_48MHZ_CAN_16MHZ )
;
; Start restriction; Maximum frequency
#if (DEVICE == MB91464A) || (DEVICE == MB91465K) || (DEVICE == MB91463N) ||\
(DEVICE == MB91461R) || (DEVICE == MB91467R)
#error: Frequency is not supported by this device.
#endif
; End restriction
;
#set CLOCKSOURCE MAINPLLCLOCK ; Clocksource
#set ENABLE_SUBCLOCK OFF ; Subclock: ON/OFF
#set PLLSPEED 0x0117 ; 0x48Ch, 0x48Dh: PLLDIVM/N ; 96 MHz
#set DIV_G 0x0F ; 0x48Eh: PLLDIVG;
#set MUL_G 0x17 ; 0x48Fh: PLLMULG;
; Clock Divider
#set CPUCLOCK 0x00 ; 0x486h: DIV0R_B; => /1 ; 64 MHz
#set PERCLOCK 0x05 ; 0x486h: DIV0R_P; => /6 ; 16 MHz
#set EXTBUSCLOCK 0x01 ; 0x487h: DIV1R_T; => /2 ; 32 MHz
; CAN Clock
#set PSCLOCKSOURCE PSCLOCK_PLL ; 0x4C0h: CANPRE; => PLLx ; 192 MHz
#set PSDVC 0x0B ; 0x4C0h: CANPRE_DVC; => /12 ; 16 MHz
#set CANCLOCK 0x00 ; 0x4C1h: CANCKD; all CAN Clocks enabled
; Voltage Regulator
#if (DEVICE == MB91469G)
#set REGULATORSEL 0x36 ; 0x4CEh: REGSEL;
#else
#set REGULATORSEL 0x06 ; 0x4CEh: REGSEL;
#endif
#set REGULATORCTRL 0x00 ; 0x4CFh: REGCTR;
; Memory Controller
#set FLASHCONTROL 0x032 ; 0x7002h: FCHCR;
#set FLASHREADT 0xC413 ; 0x7004h: FMWT;
#set FLASHMWT2 0x10 ; 0x7006h: FMWT2;
#endif
;
;=========================================================================================
; 5.9 CLOCKSPEED == PLL_4MHZ__CPU_100MHZ_PER_20MHZ_EXT_50MHZ_CAN_20MHZ
;=========================================================================================
;
#if (CLOCKSPEED == PLL_4MHZ__CPU_100MHZ_PER_20MHZ_EXT_50MHZ_CAN_20MHZ )
;
; Start restriction; Maximum frequency
#if (DEVICE == MB91464A) || (DEVICE == MB91465K) || (DEVICE == MB91463N) ||\
(DEVICE == MB91461R) || (DEVICE == MB91467R) || (DEVICE == MB91467D)
#error: Frequency is not supported by this device.
#endif
; End restriction
;
#set CLOCKSOURCE MAINPLLCLOCK ; Clocksource
#set ENABLE_SUBCLOCK OFF ; Subclock: ON/OFF
#set PLLSPEED 0x0118 ; 0x48Ch, 0x48Dh: PLLDIVM/N ; 100 MHz
#set DIV_G 0x0F ; 0x48Eh: PLLDIVG;
#set MUL_G 0x17 ; 0x48Fh: PLLMULG;
; Clock Divider
#set CPUCLOCK 0x00 ; 0x486h: DIV0R_B; => /1 ; 100 MHz
#set PERCLOCK 0x04 ; 0x486h: DIV0R_P; => /5 ; 20 MHz
#set EXTBUSCLOCK 0x01 ; 0x487h: DIV1R_T; => /2 ; 50 MHz
; CAN Clock
#set PSCLOCKSOURCE PSCLOCK_PLL ; 0x4C0h: CANPRE; => PLLx ; 200 MHz
#set PSDVC 0x09 ; 0x4C0h: CANPRE_DVC; => /10 ; 20 MHz
#set CANCLOCK 0x00 ; 0x4C1h: CANCKD; all CAN Clocks enabled
; Voltage Regulator
#if (DEVICE == MB91469G)
#set REGULATORSEL 0x36 ; 0x4CEh: REGSEL;
#else
#set REGULATORSEL 0x06 ; 0x4CEh: REGSEL;
#endif
#set REGULATORCTRL 0x00 ; 0x4CFh: REGCTR;
; Memory Controller
#set FLASHCONTROL 0x032 ; 0x7002h: FCHCR;
#set FLASHREADT 0xC413 ; 0x7004h: FMWT;
#set FLASHMWT2 0x10 ; 0x7006h: FMWT2;
#endif
;
;=========================================================================================
; 5.10 CLOCKSPEED == PLL_10MHZ_CPU__60MHZ_PER_20MHZ_EXT_30MHZ_CAN_20MHZ
;=========================================================================================
;
#if (CLOCKSPEED == PLL_10MHZ_CPU__60MHZ_PER_20MHZ_EXT_30MHZ_CAN_20MHZ )
;
; Start restriction; Maximum frequency
#if (DEVICE == MB91464A) || (DEVICE == MB91467B) || (DEVICE == MB91467C) ||\
(DEVICE == MB91467D) || (DEVICE == MB91469G) || (DEVICE == MB91465K) ||\
(DEVICE == MB91463N) || (DEVICE == MB91467R) || (DEVICE == MB91465X)
#error: Frequency is not supported by this device.
#endif
; End restriction
;
#set CLOCKSOURCE MAINPLLCLOCK ; Clocksource
#set ENABLE_SUBCLOCK OFF ; Subclock: ON/OFF
#set PLLSPEED 0x0105 ; 0x48Ch, 0x48Dh: PLLDIVM/N ; 60 MHz
#set DIV_G 0x0B ; 0x48Eh: PLLDIVG;
#set MUL_G 0x1F ; 0x48Fh: PLLMULG;
; Clock Divider
#set CPUCLOCK 0x00 ; 0x486h: DIV0R_B; => /1 ; 60 MHz
#set PERCLOCK 0x02 ; 0x486h: DIV0R_P; => /3 ; 20 MHz
#set EXTBUSCLOCK 0x01 ; 0x487h: DIV1R_T; => /2 ; 30 MHz
; CAN Clock
#set PSCLOCKSOURCE PSCLOCK_PLL ; 0x4C0h: CANPRE; => PLLx ; 120 MHz
#set PSDVC 0x05 ; 0x4C0h: CANPRE_DVC; => /6 ; 20 MHz
#set CANCLOCK 0x00 ; 0x4C1h: CANCKD; all CAN Clocks enabled
; Voltage Regulator
; -
; Memory Controller
; -
#endif
;
;=========================================================================================
; 5.11 CLOCKSPEED == PLL_20MHZ_CPU__60MHZ_PER_20MHZ_EXT_30MHZ_CAN_20MHZ
;=========================================================================================
;
#if (CLOCKSPEED == PLL_20MHZ_CPU__60MHZ_PER_20MHZ_EXT_30MHZ_CAN_20MHZ )
;
; Start restriction; Maximum frequency
#if (DEVICE == MB91464A) || (DEVICE == MB91467B) || (DEVICE == MB91467C) ||\
(DEVICE == MB91467D) || (DEVICE == MB91469G) || (DEVICE == MB91465K) ||\
(DEVICE == MB91463N) || (DEVICE == MB91467R) || (DEVICE == MB91465X)
#error: Frequency is not supported by this device.
#endif
; End restriction
;
#set CLOCKSOURCE MAINPLLCLOCK ; Clocksource
#set ENABLE_SUBCLOCK OFF ; Subclock: ON/OFF
#set PLLSPEED 0x0102 ; 0x48Ch, 0x48Dh: PLLDIVM/N ; 60 MHz
#set DIV_G 0x0F ; 0x48Eh: PLLDIVG;
#set MUL_G 0x1F ; 0x48Fh: PLLMULG;
; Clock Divider
#set CPUCLOCK 0x00 ; 0x486h: DIV0R_B; => /1 ; 60 MHz
#set PERCLOCK 0x02 ; 0x486h: DIV0R_P; => /3 ; 20 MHz
#set EXTBUSCLOCK 0x01 ; 0x487h: DIV1R_T; => /2 ; 30 MHz
; CAN Clock
#set PSCLOCKSOURCE PSCLOCK_PLL ; 0x4C0h: CANPRE; => PLLx ; 120 MHz
#set PSDVC 0x05 ; 0x4C0h: CANPRE_DVC; => /6 ; 20 MHz
#set CANCLOCK 0x00 ; 0x4C1h: CANCKD; all CAN Clocks enabled
; Voltage Regulator
; -
; Memory Controller
; -
#endif
;
;=========================================================================================
; 6 Section and Data Declaration
;=========================================================================================
.export __start
.import _main
.import _RAM_INIT
.import _ROM_INIT
#if CLIBINIT == ON
.export __exit
.import _exit
.import __stream_init
#endif
#if CPLUSPLUS == ON
.export __abort
.import ___call_dtors
.import _atexit
#endif
;=========================================================================================
; 6.1 Define Stack Size
;=========================================================================================
.SECTION SSTACK, STACK, ALIGN=4
#if STACK_RESERVE == ON
.EXPORT __systemstack, __systemstack_top
__systemstack:
.RES.B STACK_SYS_SIZE
__systemstack_top:
#endif
.SECTION USTACK, STACK, ALIGN=4
#if STACK_RESERVE == ON
.EXPORT __userstack, __userstack_top
__userstack:
.RES.B STACK_USR_SIZE
__userstack_top:
#endif
;=========================================================================================
; 6.2 Define Sections
;=========================================================================================
.section DATA, data, align=4
.section INIT, data, align=4
.section IRAM, code, align=4
.section CONST, const, align=4
.section INTVECT, const, align=4
#if I_RAM
.import _RAM_IRAM
.import _ROM_IRAM
#endif
#if (DEVICE != MB91461R)
#if (DEVICE == MB91469G)
.section SECURITY_VECTORS, code, locate = 0x248000
#else
.section SECURITY_VECTORS, code, locate = 0x148000
#endif
#if (BOOT_FLASH_SEC == OFF)
.data.w 0xFFFFFFFF
.data.w 0xFFFFFFFF
.data.w 0xFFFFFFFF
.data.w 0xFFFFFFFF
#else
.res.w 4
#endif
#endif
#if CPLUSPLUS == ON
.section EXT_CTOR_DTOR, const, align=4 ; C++ constructors
#endif
;-----------------------------------------------------------------------------------------
; MACRO Clear RC Watchdog
;-----------------------------------------------------------------------------------------
#macro ClearRCwatchdog
LDI #0x4C7,R7 ; clear RC watchdog
BANDL #0x7,@R7
#endm
;-----------------------------------------------------------------------------------------
; MACRO WAIT_LOOP
;-----------------------------------------------------------------------------------------
#macro wait_loop loop_number
#local _wait64_loop
LDI #loop_number, R0
_wait64_loop:
ADD #-1, R0
BNE _wait64_loop
#endm
.section CODE, code, align=4
.section CODE_START, code, align=4
;=========================================================================================
; 7. S T A R T
;=========================================================================================
__start: ; start point
startnop:
NOP
;
ANDCCR #0xEF ; disable interrupts
STILM #LOW_PRIOR ; set interrupt level to low prior
ClearRCwatchdog ; clear harware watchdog
;=========================================================================================
; 7.1 Initialise Stack Pointer and Table Base Register
;=========================================================================================
#if STACKUSE == SYSSTACK
ORCCR #0x20
LDI #__userstack_top, SP ; initialize SP
ANDCCR #0xDF
LDI #__systemstack_top, SP ; initialize SP
#endif
#if STACKUSE == USRSTACK
ANDCCR #0xDF
LDI #__systemstack_top, SP ; initialize SP
ORCCR #0x20
LDI #__userstack_top, SP ; initialize SP
#endif
LDI #INTVECT, R0 ; set Table Base
smd_tbr:
MOV R0, TBR
#if (CLOCKSOURCE != NOCLOCK)
;=========================================================================================
; 7.2 Check for CSV reset and set CSV
;=========================================================================================
; Start restriction; No clock supervisor (CSV)
#if (DEVICE != MB91461R) && (DEVICE != MB91467R) && (DEVICE != MB91463N)
; End restriction
LDI:20 #0x04AD, R0 ; CSVCR
BORL #0x8, @R0 ; Enable Main Osc CSV
BTSTH #0x4, @R0 ; Check for Main Osc missing
BEQ NoMAINCSVreset ; Main osc available -> branch
; to NoCSVreset
BANDL #0x7, @R0 ; Disable Main Osc CSV
LDI #noClockStartup, R0 ; Main Clock missing -> no
JMP @R0 ; clock startup
NoMAINCSVreset:
BORL #0x4, @R0 ; Enable Sub Osc CSV
BTSTH #0x2, @R0 ; Check for Sub Osc missing
BEQ NoSUBCSVreset ; Sub osc available -> branch
; to NoCSVreset
BANDL #0xB, @R0 ; Disable Sub Osc SCSV
#if (CLOCKSOURCE == SUBCLOCK)
LDI #noClockStartup, R0 ; Sub Clock missing -> no
JMP @R0 ; clock startup
#endif
NoSUBCSVreset:
#endif
;=========================================================================================
; 7.3 Check Clock Condition
;=========================================================================================
LDI #0x484, R0 ; Check for Default Values
LDI #0x0F, R1
ANDB R1, @R0
BEQ clock_startup
;=========================================================================================
; 7.4 Restore Default Settings after Reset
;=========================================================================================
;=========================================================================================
; 7.4.2 Disable Clock Modulator
;=========================================================================================
LDI #0x04BB, R0 ; Clock Modulator Control Reg
BANDL #0xD, @R0 ; Disable Frequency modulation
FMODwait:
BTSTL #8, @R0 ; Wait until Frequency modulation
BNE FMODwait ; is disabled
BANDL #0xE, @R0 ; Power down clock modulator
;=========================================================================================
; 7.4.2 Check if running on Sub Clock, change to Main Clock
;=========================================================================================
LDI:20 #0x0484,R12 ; Check if running on sub clock
LDUB @R12,R0
LDI:8 #0x3,R1
AND R1,R0
CMP #0x3,R0
BNE notOnSubClock
LDI:20 #0x04CC,R12 ; Check if Main Clock is stopped
BTSTL #1, @R12
BEQ mainNotStopped
BANDL #0xE, @R12 ; Start Main Oscillation
LDI #0x4C8, R0 ; Main Stabilisation Wait Time
LDI #0x04, R1 ; 32.7 ms
AND R1, @R0
BORH #0x02, @R0
mainStabTime: ; Wait for stabilisation time
ClearRCwatchdog ; clear harware watchdog
BTSTH #8, @R0
BEQ mainStabTime
LDI #0x0, R1
STB R1, @R0
mainNotStopped:
LDI:20 #0x0484, R12 ; disable sub clock as source
BANDL #0xD, @R12 ; Clock source = 0x01 (Main/2)
notOnSubClock:
;=========================================================================================
; 7.4.3 Disable Sub Clock
;=========================================================================================
#if ENABLE_SUBCLOCK != ON
LDI #0x0484, R0 ; Clock source control reg CLKR
BANDL #0x7, @R0 ; Disable PLL
#endif
;=========================================================================================
; 7.4.4 Check if running on PLL, Gear Down PLL
;=========================================================================================
LDI:20 #0x0484,R12 ; Check if running on PLL
LDUB @R12,R0
LDI:8 #0x3,R1
AND R1,R0
CMP #0x2,R0
BNE notOnPll
LDI:20 #0x0490, R11 ; clear flags
LDI:8 #0x0,R1
STB R1, @R11
LDI #0x04,R1
STB R1, @R11 ; Set Flag for Simulator; no Effekt on
; Emulator
BANDL #0xC, @R12 ; disable PLL as clock source
; Clock Source = 0x00 (Main/2)
LDI:20 #0x048E,R12 ; check if DivG != 0
LDUB @R12, R0
LDI:8 #0xFF,R1
AND R1,R0
BEQ notOnPll
gearDownLoop:
ClearRCwatchdog ; clear harware watchdog
BTSTL #4, @R11 ; Gear Down
BEQ gearDownLoop ;
LDI #0x00,R1 ; Clear Flags
STB R1, @R11 ;
notOnPll:
;=========================================================================================
; 7.4.5 Disable PLL
;=========================================================================================
LDI #0x0484, R0 ; Clock source control reg CLKR
BANDL #0xB, @R0 ; Disable PLL
;=========================================================================================
; 7.4.6 Set to Main Clock
;=========================================================================================
LDI:20 #0x0484,R12 ; Check if running on PLL
BANDL #0xC, @R12 ; disable PLL as clock source
; Clock Source = 0x00 (Main/2)
clock_startup:
;=========================================================================================
; 7.5 Set Memory Controller
;=========================================================================================
; Start restriction; No embedded flash
#if DEVICE != MB91461R
; End restriction
LDI #0x7002, R1 ; FLASH Controller Reg.
LDI #FLASHCONTROL, R2 ; Flash Controller Settings
STH R2, @R1 ; set register
LDI #0x7004, R1 ; FLASH Memory Wait Timing Reg.
LDI #FLASHREADT, R2 ; wait settings
STH R2, @R1 ; set register
LDI #0x7006, R1 ; FLASH Memory Wait Timing Reg.
LDI #FLASHMWT2, R2 ; wait settings
STB R2, @R1 ; set register
#endif
ClearRCwatchdog
;=========================================================================================
; 7.6 Clock startup
;=========================================================================================
;=========================================================================================
; 7.6.1 Set Voltage Regulator Settings
;=========================================================================================
; Start restriction; No regulator settings
#if DEVICE != MB91461R
; End restriction
LDI #0x04CF, R0 ; REGCTR
LDI #REGULATORCTRL, R1
STB R1, @R0
LDI #0x04CE, R0 ; REGSEL
LDI #REGULATORSEL, R1
STB R1, @R0
#endif
;=========================================================================================
; 7.6.2 Power on Clock Modulator - Clock Modulator Part I
;=========================================================================================
#if CLOMO == ON
LDI #0x04BB, R0 ; Clock Modulator Control Reg
LDI #0x11, R1 ; Load value to Power on CM
ORB R1, @R0 ; Power on clock modulaor
#endif
;=========================================================================================
; 7.6.3 Set CLKR Register w/o Clock Mode
;=========================================================================================
; Set Clock source (Base Clock) for the three clock tree selections
; This select Base clock is used to select afterwards the 3
; Clocks for the diffenrent internal trees.
; When PLL is used, first pll multiplication ratio is set and PLL is
; enabled. After waiting the PLL stabilisation time via timebase
; timer, PLL clock is selected as clock source.
LDI #0x048C, R0 ; PLL Cntl Reg. PLLDIVM/N
LDI:20 #PLLSPEED, R1
STH R1, @R0
LDI #0x048E, R0 ; PLL Cntl Reg. PLLDIVG
LDI #DIV_G, R1
STB R1, @R0
LDI #0x048F, R0 ; PLL Cntl Reg. PLLMULG
LDI #MUL_G, R1
STB R1, @R0
;=========================================================================================
; 7.6.4 Start PLL
;=========================================================================================
#if ( ( CLOCKSOURCE == MAINPLLCLOCK ) || ( PSCLOCKSOURCE == PSCLOCK_PLL ) )
LDI #0x0484, R0 ; Clock source control reg CLKR
LDI #0x04, R1 ; Use PLL x1, enable PLL
ORB R1, @R0 ; store data to CLKR register
#endif
#if ENABLE_SUBCLOCK == ON
LDI #0x0484, R0 ; Clock source control reg CLKR
LDI #0x08, R1 ; enable subclock operation
ORB R1, @R0 ; store data to CLKR register
LDI #0x4CA, R0 ; Sub Clock oszilation
LDI #0x00, R1 ; stabilitsation time = 32 ms
AND R1, @R0
BORH #0x02, @R0
#endif
;=========================================================================================
; 7.6.5 Wait for PLL oscillation stabilisation
;=========================================================================================
#if ((CLOCKSOURCE==MAINPLLCLOCK)||(PSCLOCKSOURCE==PSCLOCK_PLL))
LDI #0x0482, R12 ; TimeBaseTimer TBCR
LDI #0x00, R1 ; set 1024 us @ 2 MHz
STB R1, @R12
BANDH #7, @R12 ; clear interrupt flag
LDI #0x0483, R0 ; clearTimeBaseTimer CTBR
LDI #0xA5, R1
STB R1, @R0
LDI #0x5A, R1
STB R1, @R0
BANDH #7, @R12 ; clear interrupt flag
BORH #8, @R12 ; set interrupt flag for simulator
PLLwait:
ClearRCwatchdog ; clear harware watchdog
BTSTH #8, @R12
BEQ PLLwait
#endif
;=========================================================================================
; 7.6.6 Set clocks
;=========================================================================================
;=========================================================================================
; 7.6.6.1 Set CPU and peripheral clock
;=========================================================================================
; CPU and peripheral clock are set in one register
LDI #0x0486, R2 ; Set DIVR0 (CPU-clock (CLKB)
LDI #((CPUCLOCK << 4) + PERCLOCK), R3 ; Load CPU clock setting
STB R3, @R2
;=========================================================================================
; 7.6.6.2 Set External Bus interface clock
;=========================================================================================
; set External Bus clock
; Be aware to do smooth clock setting, to avoid wrong clock setting
; Take care, always write 0 to the lower 4 bits of DIVR1 register
LDI #0x0487, R2 ; Set DIVR1
LDI #(EXTBUSCLOCK << 4), R3 ; Load Peripheral clock setting
STB R3, @R2
;=========================================================================================
; 7.6.6.3 Set CAN clock prescaler
;=========================================================================================
; Set CAN Prescaler, only clock relevant parameter
LDI #0x04C0, R0 ; Set CAN ClockParameter Register
LDI #(PSCLOCKSOURCE + PSDVC), R1 ; Load Divider
STB R1, @R0 ; Set Divider
; enable CAN clocks
LDI #0x04c1, R0 ; Set CAN Clock enable Register
LDI #CANCLOCK, R1 ; Load CANCLOCK
STB R1, @R0 ; set CANCLOCK
;=========================================================================================
; 7.6.6.4 Switch Main Clock Mode
;=========================================================================================
#if CLOCKSOURCE == MAINCLOCK
;=========================================================================================
; 7.6.6.5 Switch Subclock Mode
;=========================================================================================
#elif ( (CLOCKSOURCE == SUBCLOCK) )
#if ENABLE_SUBCLOCK == ON
LDI #0x4CA, R12
subStabTime:
ClearRCwatchdog ; clear harware watchdog
BTSTH #8, @R12 ; wait until sub clock stabilisation
BEQ subStabTime ; time is over
LDI #0x0, R1
STB R1, @R12
LDI #0x0484, R0 ; Clock source control reg CLKR
LDI #0x01, R1 ; load value to select main clock
ORB R1, @R0 ; enable main clock (1/2 external)
LDI #0x03, R1 ; load value to select subclock
ORB R1, @R0 ; enable subclock as clock source
#else
#error: Wrong setting! The clock source is subclock, but the subclock is disabled.
#endif
;=========================================================================================
; 7.6.7 Switch to PLL Mode
;=========================================================================================
#elif ( (CLOCKSOURCE == MAINPLLCLOCK) )
#if (DIV_G != 0x00)
LDI #0x0490, R0 ; PLL Ctrl Register
LDI #0x00,R1
STB R1, @R0 ; Clear Flag
LDI #0x01,R1
STB R1, @R0 ; Set Flag for Simulator; no Effekt on
#endif ; Emulator
LDI #0x0484, R3 ; Clock source control reg CLKR
BORL #0x2, @R3 ; enable PLL as clock source
#if (DIV_G != 0x00)
gearUpLoop:
ClearRCwatchdog ; clear harware watchdog
LDUB @R0, R2 ; LOAD PLLCTR to R2
AND R1, R2 ; GRUP, counter reach 0
BEQ gearUpLoop
LDI #0x00,R1
STB R1, @R0 ; Clear Gear-Up Flag
#endif
#endif
;=========================================================================================
; 7.6.8 Enable Frequncy Modulation - Clock Modulator Part II
;=========================================================================================
#if CLOMO == ON ; Only applicable if Modulator is on
LDI #0x04B8, R0 ; Clock Modulation Parameter Reg
LDI #CMPR, R1 ; Load CMP value
STH R1, @R0 ; Store CMP value in CMPR
LDI #0x04BB, R0 ; Clock Modulator Control Reg
LDI #0x13, R1 ; Load value to FM on CM
ORB R1, @R0 ; FM on
#endif
#endif
noClockStartup:
;=========================================================================================
; 7.7 Set BusInterface
;=========================================================================================
; Start restriction; No ext. bus interface
#if (DEVICE != MB91464A) && (DEVICE != MB91467C) && (DEVICE != MB91465K) && \
(DEVICE != MB91463N) && (DEVICE != MB91465X)
; End restriction
#if (EXTBUS == ON)
;=========================================================================================
; 7.7.1 Disable all CS
;=========================================================================================
; Start restriction; Flashless device
#if(DEVICE != MB91461R)
; End restriction
LDI #0x0680, R3 ; chip select enable register CSER
LDI #(0x00), R2 ; load disable settings
smd_cs:
ANDB R2, @R3 ; set register
#endif
;=========================================================================================
; 7.7.2 Clear TCR Register
;=========================================================================================
LDI #0x0683, R1 ; Pin/Timing Control Register TCR
BORH #0x6,@R1 ; load timing settings
;=========================================================================================
; 7.7.3 Set CS0
;=========================================================================================
#if CS0
LDI #0x0640, R1 ; area select reg ASR0, ACR0
LDI #(AREASEL0<<16)+CONFIGCS0, R0 ; load settings
ST R0, @R1 ; set registers
LDI #0x660, R1 ; area wait register awr0
LDI #WAITREG0, R2 ; wait settings
STH R2, @R1 ; set register
#endif
;=========================================================================================
; 7.7.4 Set CS1
;=========================================================================================
#if CS1
LDI #0x0644, R1 ; area select reg ASR1, ACR1
LDI #(AREASEL1<<16)+CONFIGCS1, R0 ; load settings
ST R0, @R1 ; set registers
LDI #0x662, R1 ; area wait register awr1
LDI #WAITREG1, R2 ; wait settings
STH R2, @R1 ; set register
#endif
smd_cs_mb91461r:
;=========================================================================================
; 7.7.5 Set CS2
;=========================================================================================
#if CS2
LDI #0x0648, R1 ; area select reg ASR2, ACR2
LDI #(AREASEL2<<16)+CONFIGCS2, R0 ; load settings
ST R0, @R1 ; set registers
LDI #0x664, R1 ; area wait register awr2
LDI #WAITREG2, R2 ; wait settings
STH R2, @R1 ; set register
#endif
;=========================================================================================
; 7.7.6 Set CS3
;=========================================================================================
#if CS3
LDI #0x064C, R1 ; area select reg ASR3, ACR3
LDI #(AREASEL3<<16)+CONFIGCS3, R0 ; load settings
ST R0, @R1 ; set registers
LDI #0x666, R1 ; area wait register awr3
LDI #WAITREG3, R2 ; wait settings
STH R2, @R1 ; set register
#endif
;=========================================================================================
; 7.7.7 Set CS4
;=========================================================================================
#if CS4
LDI #0x0650, R1 ; area select reg ASR4, ACR4
LDI #(AREASEL4<<16)+CONFIGCS4, R0 ; load settings
ST R0, @R1 ; set registers
LDI #0x668, R1 ; area wait register awr4
LDI #WAITREG4, R2 ; wait settings
STH R2, @R1 ; set register
#endif
;=========================================================================================
; 7.7.8 Set CS5
;=========================================================================================
#if CS5
LDI #0x0654, R1 ; area select reg ASR5, ACR5
LDI #(AREASEL5<<16)+CONFIGCS5, R0 ; load settings
ST R0, @R1 ; set registers
LDI #0x66A, R1 ; area wait register awr5
LDI #WAITREG5, R2 ; wait settings
STH R2, @R1 ; set register
#endif
;=========================================================================================
; 7.7.9 Set CS6
;=========================================================================================
#if (CS6)
LDI #0x0658, R1 ; area select reg ASR6, ACR6
LDI #(AREASEL6<<16)+CONFIGCS6, R0 ; load settings
ST R0, @R1 ; set registers
LDI #0x66C, R1 ; area wait register awr6
LDI #WAITREG6, R2 ; wait settings
STH R2, @R1 ; set register
#endif
;=========================================================================================
; 7.7.10 Set CS7
;=========================================================================================
#if CS7
LDI #0x065C, R1 ; area select reg ASR7, ACR7
LDI #(AREASEL7<<16)+CONFIGCS7, R0 ; load settings
ST R0, @R1 ; set registers
LDI #0x66E, R1 ; area wait register awr7
LDI #WAITREG7, R2 ; wait settings
STH R2, @R1 ; set register
#endif
;=========================================================================================
; 7.7.11 Set special SDRAM config register
;=========================================================================================
#if (SDRAM)
LDI #0x670, R1 ; SDRAM memory config register
LDI #MEMCON, R2 ; wait settings
STB R2, @R1 ; set register
#endif
;=========================================================================================
; 7.7.12 set Port Function Register
;=========================================================================================
;=========================================================================================
; 7.7.12.1 set PFR00 Register. External bus mode (D[24-31]) or General purpose port
;=========================================================================================
LDI #0x0D80, R1 ; Port Function Register 0, (PFR00)
LDI #PFUNC0, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.12.2 set PFR01 Register. External bus mode (D[16-23]) or General purpose port
;=========================================================================================
LDI #0x0D81, R1 ; Port Function Register 1, (PFR01)
LDI #PFUNC1, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.12.3 set PFR02 Register. External bus mode (D[8-15]) or General purpose port
;=========================================================================================
LDI #0x0D82, R1 ; Port Function Register 2, (PFR02)
LDI #PFUNC2, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.12.4 set PFR03 Register. External bus mode (D[0-7]) or General purpose port
;=========================================================================================
LDI #0x0D83, R1 ; Port Function Register 3, (PFR03)
LDI #PFUNC3, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.12.5 set PFR04 Register. External bus mode (Adr[24-31]) or General purpose port
;=========================================================================================
LDI #0x0D84, R1 ; Port Function Register 4, (PFR04)
LDI #PFUNC4, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.12.6 set PFR05 Register. External bus mode (Adr[16-23]) or General purpose port
;=========================================================================================
LDI #0x0D85, R1 ; Port Function Register 5, (PFR05)
LDI #PFUNC5, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.12.7 set PFR06 Register. External bus mode (Adr[8-15]) or General purpose port
;=========================================================================================
LDI #0x0D86, R1 ; Port Function Register 6, (PFR06)
LDI #PFUNC6, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.12.8 set PFR07 Register. External bus mode (Adr[0-7]) or General purpose port
;=========================================================================================
LDI #0x0D87, R1 ; Port Function Register 7, (PFR07)
LDI #PFUNC7, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.12.9 set PFR08 Register. External bus mode (Control Signals) or GIO port
;=========================================================================================
LDI #0x0D88, R1 ; Port Function Register 8, (PFR08)
LDI #PFUNC8, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.12.10 set PFR09 Register. External bus mode (Control Signals) or GIO port
;=========================================================================================
LDI #0x0D89, R1 ; Port Function Register 9, (PFR09)
LDI #PFUNC9, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.12.11 set PFR10 Register. External bus mode (Control Signals) or GIO port
;=========================================================================================
LDI #0x0D8A, R1 ; Port Function Register 10, (PFR10)
LDI #PFUNC10, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.12.12 set EPFR10 Register. External bus mode (Control Signals) or GIO port
;=========================================================================================
LDI #0x0DCA, R1 ; Extended PFR 10, (EPFR10)
LDI #EPFUNC10, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.13 Set TCR Register
;=========================================================================================
LDI #0x0683, R1 ; Pin/Timing Control Register TCR
LDI #TIMECONTR, R0 ; load timing settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.14 Enable CACHE for selected CS
;=========================================================================================
LDI #0x0681, R3 ; chip select enable register CSER
LDI #CHEENA, R2
ORB R2, @R3
;=========================================================================================
; 7.7.15 set SDRAM Referesh Control Register
;=========================================================================================
#if (SDRAM)
LDI #0x0684, R1 ; Refresh Control Register RCR
LDI #REFRESH, R0 ; load refresh settings
STH R0, @R1 ; set register
LDI #0x0008, R2
OR R2, R0 ; Set PON bit to 1
STH R0, @R1 ; set register
#endif
;=========================================================================================
; 7.7.16 Enable used CS
;=========================================================================================
LDI #0x0680, R3 ; chip select enable register CSER
LDI #ENACSX, R2
; Start restriction; Flashless device
#if (DEVICE == MB91461R)
; End restriction
emu_sram_cs_mb91461r:
ANDB R2, @R3 ; set register
#else
ORB R2, @R3
#endif
;=========================================================================================
; 7.7.17 I-cache on/off
;=========================================================================================
; Start restriction; No cache
#if (DEVICE == MB91461R) || (DEVICE == MB91469G) || (DEVICE == others)
; End restriction
#if CACHE
#if CACHE_SIZE == C1024
LDI #0x03C7, R1 ; Cache size register ISIZE
LDI #0x00, R2
STB R2, @R1
LDI #0x03E7, R1 ; Cache control reg ICHCR
LDI #0x07, R2 ; Release entry locks, flush and enable
STB R2, @R1 ; cache
#elif CACHE_SIZE == C2048
LDI #0x03C7, R1 ; Cache size register ISIZE
LDI #0x01, R2
STB R2, @R1
LDI #0x03E7, R1 ; Cache control reg ICHCR
LDI #0x07, R2 ; Release entry locks, flush and enable
STB R2, @R1 ; cache
#elif CACHE_SIZE == C4096
LDI #0x03C7, R1 ; Cache size register ISIZE
LDI #0x02, R2
STB R2, @R1
LDI #0x03E7, R1 ; Cache control reg ICHCR
LDI #0x07, R2 ; Release entry locks, flush and enable
STB R2, @R1 ; cache
#else
#error: Wrong Cache size selected!
#endif
#else
LDI #0x03E7, R1 ; Cache control reg ICHCR
LDI #0x06, R2 ; Release entry locks, flush and disable
STB R2, @R1 ; cache
#endif
#endif
#elif (EXTBUS == OFF)
;=========================================================================================
; 7.7.18 set Port Function Register to general as I/O-Port
;=========================================================================================
;=========================================================================================
; 7.7.18.1 set PFR00 Register. External bus mode as General purpose port
;=========================================================================================
LDI #0x0D80, R1 ; Port Function Register 0, (PFR00)
LDI #0x00, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.18.2 set PFR01 Register. External bus mode as General purpose port
;=========================================================================================
LDI #0x0D81, R1 ; Port Function Register 1, (PFR01)
LDI #0x00, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.18.3 set PFR02 Register. External bus mode as General purpose port
;=========================================================================================
LDI #0x0D82, R1 ; Port Function Register 2, (PFR02)
LDI #0x00, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.18.4 set PFR03 Register. External bus mode as General purpose port
;=========================================================================================
LDI #0x0D83, R1 ; Port Function Register 3, (PFR03)
LDI #0x00, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.18.5 set PFR04 Register. External bus mode as General purpose port
;=========================================================================================
LDI #0x0D84, R1 ; Port Function Register 4, (PFR04)
LDI #0x00, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.18.6 set PFR05 Register. External bus mode as General purpose port
;=========================================================================================
LDI #0x0D85, R1 ; Port Function Register 5, (PFR05)
LDI #0x00, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.18.7 set PFR06 Register. External bus mode as General purpose port
;=========================================================================================
LDI #0x0D86, R1 ; Port Function Register 6, (PFR06)
LDI #0x00, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.18.8 set PFR07 Register. External bus mode as General purpose port
;=========================================================================================
LDI #0x0D87, R1 ; Port Function Register 7, (PFR07)
LDI #0x00, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.18.9 set PFR08 Register. External bus mode as General purpose port
;=========================================================================================
LDI #0x0D88, R1 ; Port Function Register 8, (PFR08)
LDI #0x00, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.18.10 set PFR09 Register. External bus mode as General purpose port
;=========================================================================================
LDI #0x0D89, R1 ; Port Function Register 9, (PFR09)
LDI #0x00, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.18.11 set PFR10 Register. External bus mode as General purpose port
;=========================================================================================
LDI #0x0D8A, R1 ; Port Function Register 10, (PFR10)
LDI #0x00, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
; 7.7.18.12 set EPFR10 Register. External bus mode as General purpose port
;=========================================================================================
LDI #0x0DCA, R1 ; Extended PFR10, (EPFR10)
LDI #0x00, R0 ; load port settings
STB R0, @R1 ; set register
;=========================================================================================
#elif (EXTBUS == DEFAULT)
NOP
smd_cs_mb91461r:
emu_sram_cs_mb91461r:
smd_cs:
#endif ; #endif (EXTBUS)
#endif ; #endif (excl. devices)
ClearRCwatchdog
;=========================================================================================
; 7.8 Copy code from Flash to I-RAM
;=========================================================================================
#if I_RAM == ON
LDI #_RAM_IRAM, R0
LDI #_ROM_IRAM, R1
LDI #sizeof(IRAM), R13
CMP #0, R13
BEQ copy_iram_end
copy_iram1:
ADD #-1, R13
LDUB @(R13, R1), R12
BNE:D copy_iram1
STB R12, @(R13, R0)
copy_iram_end:
ClearRCwatchdog
#endif
;=========================================================================================
; 7.9 Fill stacks
;=========================================================================================
#if STACK_FILL == ON
LDI #STACK_PATTERN, R0
LDI #SSTACK, R1
LDI #sizeof(SSTACK), R2
CMP #0, R2
BEQ:D fill_sstack_end
MOV R2, R13
LDI #3, R12
AND R2, R12
BEQ:D fill_sstack2
MOV R2, R3
SUB R12, R3
LDI #0x3, R4
SUB R12, R4
LSL #0x3, R4
LDI #STACK_PATTERN, R5
LSR R4, R5
LDI #0x8, R4
fill_sstack1:
ADD #-1, R13
LSR R4, R5
CMP R3, R13
BHI:D fill_sstack1
STB R5, @(R13, R1)
CMP #0, R3
BEQ:D fill_sstack_end
fill_sstack2:
ADD #-4, R13
BGT:D fill_sstack2
ST R0, @(R13, R1)
fill_sstack_end:
LDI #STACK_PATTERN, R0
LDI #USTACK, R1
LDI #sizeof(USTACK), R2
CMP #0, R2
BEQ:D fill_ustack_end
MOV R2, R13
LDI #3, R12
AND R2, R12
BEQ:D fill_ustack2
MOV R2, R3
SUB R12, R3
LDI #0x3, R4
SUB R12, R4
LSL #0x3, R4
LDI #STACK_PATTERN, R5
LSR R4, R5
LDI #0x8, R4
fill_ustack1:
ADD #-1, R13
LSR R4, R5
CMP R3, R13
BHI:D fill_ustack1
STB R5, @(R13, R1)
CMP #0, R3
BEQ:D fill_ustack_end
fill_ustack2:
ADD #-4, R13
BGT:D fill_ustack2
ST R0, @(R13, R1)
fill_ustack_end:
ClearRCwatchdog
#endif
;=========================================================================================
; Standard C startup
;=========================================================================================
;=========================================================================================
; 7.10 Clear data
;=========================================================================================
; clear DATA section
; According to ANSI, the DATA section must be cleared during start-up
LDI:8 #0, R0
LDI #sizeof DATA &~0x3, R1
LDI #DATA, R13
CMP #0, R1
BEQ data_clr1
data_clr0:
ADD2 #-4, R1
BNE:D data_clr0
ST R0, @(R13, R1)
data_clr1:
LDI:8 #sizeof DATA & 0x3, R1
LDI #DATA + (sizeof DATA & ~0x3), R13
CMP #0, R1
BEQ data_clr_end
data_clr2:
ADD2 #-1, R1
BNE:D data_clr2
STB R0, @(R13, R1)
data_clr_end:
ClearRCwatchdog
;=========================================================================================
; 7.11 Copy Init section from ROM to RAM
;=========================================================================================
; copy rom
; All initialised data's (e.g. int i=1) must be stored in ROM/FLASH area.
; (start value)
; The Application must copy the Section (Init) into the RAM area.
LDI #_RAM_INIT, R0
LDI #_ROM_INIT, R1
LDI #sizeof(INIT), R2
CMP #0, R2
BEQ:D copy_rom_end
LDI #3, R12
AND R2, R12
BEQ:D copy_rom2
MOV R2, R13
MOV R2, R3
SUB R12, R3
copy_rom1:
ADD #-1, R13
LDUB @(R13, R1), R12
CMP R3, R13
BHI:D copy_rom1
STB R12, @(R13, R0)
CMP #0, R3
BEQ:D copy_rom_end
copy_rom2:
ADD #-4, R13
LD @(R13, R1), R12
BGT:D copy_rom2
ST R12, @(R13, R0)
copy_rom_end:
ClearRCwatchdog
;=========================================================================================
; 7.12 C library initialization
;=========================================================================================
#if CLIBINIT == ON
CALL32 __stream_init, r12 ; initialise library
#endif
;=========================================================================================
; 7.13 call C++ constructors
;=========================================================================================
#if CPLUSPLUS == ON
LDI #___call_dtors, r4
CALL32 _atexit, r12
LDI #EXT_CTOR_DTOR, r8
LDI #EXT_CTOR_DTOR + sizeof(EXT_CTOR_DTOR), r9
CMP r9, r8
BEQ L1
L0:
LD @r8, r10
CALL:D @r10
ADD #4, r8
CMP r9, r8
BC L0
L1:
#endif
start_main:
;=========================================================================================
; 7.14 call main routine
;=========================================================================================
ClearRCwatchdog ; clear harware watchdog
LDI:8 #0, r4 ; Set the 1st parameter for main to 0.
CALL32:d _main, r12
LDI:8 #0, r5 ; Set the 2nd parameter for main to 0.
#if CLIBINIT == ON
CALL32 _exit, r12
__exit:
#endif
#if CPLUSPLUS == ON
__abort:
#endif
;=========================================================================================
; 7.15 Return from main function
;=========================================================================================
end:
BRA end
.end __start