1. Updated the BSP for i.MX RT1050
2. Added the Keil Workspace 3. Changed the hello_world.c for RT1050 Signed-off-by: Howard Liu <howardliu7874@hotmail.com>
This commit is contained in:
@@ -25,11 +25,11 @@
|
||||
/*******************************************************************************
|
||||
* Code
|
||||
******************************************************************************/
|
||||
#define TASK1_STK_SIZE 1024
|
||||
#define TASK1_STK_SIZE 512
|
||||
void task1(void *arg);
|
||||
osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);
|
||||
|
||||
#define TASK2_STK_SIZE 1024
|
||||
#define TASK2_STK_SIZE 512
|
||||
void task2(void *arg);
|
||||
osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);
|
||||
|
||||
|
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
** ###################################################################
|
||||
** Processors: MIMXRT1062CVJ5A
|
||||
** MIMXRT1062CVL5A
|
||||
** MIMXRT1062DVJ6A
|
||||
** MIMXRT1062DVL6A
|
||||
**
|
||||
** Compiler: IAR ANSI C/C++ Compiler for ARM
|
||||
** Reference manual: IMXRT1060RM Rev.1, 12/2018 | IMXRT1060SRM Rev.3
|
||||
** Version: rev. 0.1, 2017-01-10
|
||||
** Build: b191015
|
||||
**
|
||||
** Abstract:
|
||||
** Linker file for the IAR ANSI C/C++ Compiler for ARM
|
||||
**
|
||||
** Copyright 2016 Freescale Semiconductor, Inc.
|
||||
** Copyright 2016-2019 NXP
|
||||
** All rights reserved.
|
||||
**
|
||||
** SPDX-License-Identifier: BSD-3-Clause
|
||||
**
|
||||
** http: www.nxp.com
|
||||
** mail: support@nxp.com
|
||||
**
|
||||
** ###################################################################
|
||||
*/
|
||||
|
||||
define symbol m_interrupts_start = 0x00000000;
|
||||
define symbol m_interrupts_end = 0x000003FF;
|
||||
|
||||
define symbol m_text_start = 0x00000400;
|
||||
define symbol m_text_end = 0x0001FFFF;
|
||||
|
||||
define symbol m_data_start = 0x20000000;
|
||||
define symbol m_data_end = 0x2001FFFF;
|
||||
|
||||
define symbol m_data2_start = 0x20200000;
|
||||
define symbol m_data2_end = 0x202BFFFF;
|
||||
|
||||
define symbol m_data3_start = 0x80000000;
|
||||
define symbol m_data3_end = 0x81DFFFFF;
|
||||
|
||||
define symbol m_ncache_start = 0x81E00000;
|
||||
define symbol m_ncache_end = 0x81FFFFFF;
|
||||
|
||||
/* Sizes */
|
||||
if (isdefinedsymbol(__stack_size__)) {
|
||||
define symbol __size_cstack__ = __stack_size__;
|
||||
} else {
|
||||
define symbol __size_cstack__ = 0x0400;
|
||||
}
|
||||
|
||||
if (isdefinedsymbol(__heap_size__)) {
|
||||
define symbol __size_heap__ = __heap_size__;
|
||||
} else {
|
||||
define symbol __size_heap__ = 0x0400;
|
||||
}
|
||||
|
||||
define exported symbol __NCACHE_REGION_START = m_ncache_start;
|
||||
define exported symbol __NCACHE_REGION_SIZE = m_ncache_end - m_ncache_start + 1;
|
||||
|
||||
define exported symbol __VECTOR_TABLE = m_interrupts_start;
|
||||
define exported symbol __VECTOR_RAM = m_interrupts_start;
|
||||
define exported symbol __RAM_VECTOR_TABLE_SIZE = 0x0;
|
||||
|
||||
define memory mem with size = 4G;
|
||||
define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end]
|
||||
| mem:[from m_text_start to m_text_end];
|
||||
define region DATA_region = mem:[from m_data_start to m_data_end];
|
||||
define region DATA2_region = mem:[from m_data2_start to m_data2_end];
|
||||
define region DATA3_region = mem:[from m_data3_start to m_data3_end-__size_cstack__];
|
||||
define region CSTACK_region = mem:[from m_data3_end-__size_cstack__+1 to m_data3_end];
|
||||
define region NCACHE_region = mem:[from m_ncache_start to m_ncache_end];
|
||||
|
||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||
define block RW { first readwrite, section m_usb_dma_init_data };
|
||||
define block ZI with alignment = 32 { first zi, section m_usb_dma_noninit_data };
|
||||
define block NCACHE_VAR { section NonCacheable , section NonCacheable.init };
|
||||
|
||||
initialize by copy { readwrite, section .textrw };
|
||||
do not initialize { section .noinit };
|
||||
|
||||
place at address mem: m_interrupts_start { readonly section .intvec };
|
||||
|
||||
place in TEXT_region { readonly };
|
||||
place in DATA3_region { block RW };
|
||||
place in DATA3_region { block ZI };
|
||||
if (isdefinedsymbol(__heap_noncacheable__)) {
|
||||
place in NCACHE_region { last block HEAP };
|
||||
} else {
|
||||
place in DATA3_region { last block HEAP };
|
||||
}
|
||||
place in CSTACK_region { block CSTACK };
|
||||
place in NCACHE_region { block NCACHE_VAR };
|
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
** ###################################################################
|
||||
** Processors: MIMXRT1062CVJ5A
|
||||
** MIMXRT1062CVL5A
|
||||
** MIMXRT1062DVJ6A
|
||||
** MIMXRT1062DVL6A
|
||||
**
|
||||
** Compiler: IAR ANSI C/C++ Compiler for ARM
|
||||
** Reference manual: IMXRT1060RM Rev.1, 12/2018 | IMXRT1060SRM Rev.3
|
||||
** Version: rev. 0.1, 2017-01-10
|
||||
** Build: b191030
|
||||
**
|
||||
** Abstract:
|
||||
** Linker file for the IAR ANSI C/C++ Compiler for ARM
|
||||
**
|
||||
** Copyright 2016 Freescale Semiconductor, Inc.
|
||||
** Copyright 2016-2019 NXP
|
||||
** All rights reserved.
|
||||
**
|
||||
** SPDX-License-Identifier: BSD-3-Clause
|
||||
**
|
||||
** http: www.nxp.com
|
||||
** mail: support@nxp.com
|
||||
**
|
||||
** ###################################################################
|
||||
*/
|
||||
|
||||
define symbol m_interrupts_start = 0x80000000;
|
||||
define symbol m_interrupts_end = 0x800003FF;
|
||||
|
||||
define symbol m_text_start = 0x80000400;
|
||||
define symbol m_text_end = 0x801FFFFF;
|
||||
|
||||
define symbol m_data_start = 0x20000000;
|
||||
define symbol m_data_end = 0x2001FFFF;
|
||||
|
||||
define symbol m_data2_start = 0x20200000;
|
||||
define symbol m_data2_end = 0x202BFFFF;
|
||||
|
||||
define symbol m_data3_start = 0x80200000;
|
||||
define symbol m_data3_end = 0x81DFFFFF;
|
||||
|
||||
define symbol m_ncache_start = 0x81E00000;
|
||||
define symbol m_ncache_end = 0x81FFFFFF;
|
||||
|
||||
/* Sizes */
|
||||
if (isdefinedsymbol(__stack_size__)) {
|
||||
define symbol __size_cstack__ = __stack_size__;
|
||||
} else {
|
||||
define symbol __size_cstack__ = 0x0400;
|
||||
}
|
||||
|
||||
if (isdefinedsymbol(__heap_size__)) {
|
||||
define symbol __size_heap__ = __heap_size__;
|
||||
} else {
|
||||
define symbol __size_heap__ = 0x0400;
|
||||
}
|
||||
|
||||
define exported symbol __NCACHE_REGION_START = m_ncache_start;
|
||||
define exported symbol __NCACHE_REGION_SIZE = m_ncache_end - m_ncache_start + 1;
|
||||
|
||||
define exported symbol __VECTOR_TABLE = m_interrupts_start;
|
||||
define exported symbol __VECTOR_RAM = m_interrupts_start;
|
||||
define exported symbol __RAM_VECTOR_TABLE_SIZE = 0x0;
|
||||
|
||||
define memory mem with size = 4G;
|
||||
define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end]
|
||||
| mem:[from m_text_start to m_text_end];
|
||||
define region DATA_region = mem:[from m_data_start to m_data_end];
|
||||
define region DATA2_region = mem:[from m_data2_start to m_data2_end-__size_cstack__];
|
||||
define region DATA3_region = mem:[from m_data3_start to m_data3_end];
|
||||
define region CSTACK_region = mem:[from m_data2_end-__size_cstack__+1 to m_data2_end];
|
||||
define region NCACHE_region = mem:[from m_ncache_start to m_ncache_end];
|
||||
|
||||
define block CSTACK with alignment = 8, size = __size_cstack__ { };
|
||||
define block HEAP with alignment = 8, size = __size_heap__ { };
|
||||
define block RW { first readwrite, section m_usb_dma_init_data };
|
||||
define block ZI with alignment = 32 { first zi, section m_usb_dma_noninit_data };
|
||||
define block NCACHE_VAR { section NonCacheable , section NonCacheable.init };
|
||||
|
||||
initialize by copy { readwrite, section .textrw };
|
||||
do not initialize { section .noinit };
|
||||
|
||||
place at address mem: m_interrupts_start { readonly section .intvec };
|
||||
|
||||
place in TEXT_region { readonly };
|
||||
place in DATA2_region { block RW };
|
||||
place in DATA2_region { block ZI };
|
||||
if (isdefinedsymbol(__heap_noncacheable__)) {
|
||||
place in NCACHE_region { last block HEAP };
|
||||
} else {
|
||||
place in DATA2_region { last block HEAP };
|
||||
}
|
||||
place in CSTACK_region { block CSTACK };
|
||||
place in NCACHE_region { block NCACHE_VAR };
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
69
board/NXP_EVK_IMXRT1060/iar/hello_world/readme.txt
Normal file
69
board/NXP_EVK_IMXRT1060/iar/hello_world/readme.txt
Normal file
@@ -0,0 +1,69 @@
|
||||
Overview
|
||||
========
|
||||
The Hello World demo application provides a sanity check for the TencentOS-tiny porting on i.MXRT1050. The Hello
|
||||
World demo creates two tasks. Two tasks print the information with task number and the count of being run by OS.
|
||||
The task 1 also turns to shine the LED.
|
||||
|
||||
Toolchain supported
|
||||
===================
|
||||
- IAR embedded Workbench 8.40.2
|
||||
- Keil MDK 5.29 (ARM Compiler 5 only)
|
||||
|
||||
Hardware requirements
|
||||
=====================
|
||||
- Mini/micro USB cable
|
||||
- EVKB-IMXRT1050 board
|
||||
- Personal Computer
|
||||
|
||||
Board settings
|
||||
==============
|
||||
No special settings are required.
|
||||
|
||||
Prepare the Demo
|
||||
================
|
||||
1. Connect a USB cable between the host PC and the OpenSDA USB port on the target board.
|
||||
2. Open a serial terminal with the following settings:
|
||||
- 115200 baud rate
|
||||
- 8 data bits
|
||||
- No parity
|
||||
- One stop bit
|
||||
- No flow control
|
||||
3. Download the program to the target board.
|
||||
4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo.
|
||||
|
||||
Running the demo
|
||||
================
|
||||
The log below shows the output of the hello world demo in the terminal window:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Hello world from i.MX RT1060.
|
||||
Welcome to TencentOS tiny
|
||||
++++++++This is Task 1, count is 0
|
||||
********This is Task 2, count is 0
|
||||
++++++++This is Task 1, count is 1
|
||||
++++++++This is Task 1, count is 2
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Note:
|
||||
To download binary into hyper flash and boot from hyperflash directly, following steps are needed:
|
||||
1. Select the target flexspi_nor_debug or flexspi_nor_release.
|
||||
2. Compile the project, and get the binaray file "hello_world.bin"
|
||||
3. Set the SW7: 1 off 2 off 3 off 4 on, then power on the board and connect USB cable to J28
|
||||
4. Drop the binaray into disk "EVK-MIMXRT"
|
||||
5. Wait for the disk disappear and appear again which will take around ~10s, then power off the board
|
||||
6. Set the SW7: 1 off 2 on 3 on 4 off, then power on the board
|
||||
7. After power on the baord, program has already started to run, reset SW4 is recommended.
|
||||
|
||||
Note:
|
||||
To debug in hyper flash in MDK, following steps are needed:
|
||||
1. Select the target flexspi_nor_debug or flexspi_nor_release.
|
||||
2. Compile the project.
|
||||
3. Press F8 or click the download button, to program the application into hyper flash.
|
||||
4. Set the SW7: 1 off 2 on 3 on 4 off, then power on the board
|
||||
5. Push SW4 to reset.
|
||||
6. Start to debug.
|
||||
|
||||
|
||||
Customization options
|
||||
=====================
|
||||
|
@@ -0,0 +1,94 @@
|
||||
#! armcc -E
|
||||
/*
|
||||
** ###################################################################
|
||||
** Processors: MIMXRT1062CVJ5A
|
||||
** MIMXRT1062CVL5A
|
||||
** MIMXRT1062DVJ6A
|
||||
** MIMXRT1062DVL6A
|
||||
**
|
||||
** Compiler: Keil ARM C/C++ Compiler
|
||||
** Reference manual: IMXRT1060RM Rev.1, 12/2018 | IMXRT1060SRM Rev.3
|
||||
** Version: rev. 0.1, 2017-01-10
|
||||
** Build: b191015
|
||||
**
|
||||
** Abstract:
|
||||
** Linker file for the Keil ARM C/C++ Compiler
|
||||
**
|
||||
** Copyright 2016 Freescale Semiconductor, Inc.
|
||||
** Copyright 2016-2019 NXP
|
||||
** All rights reserved.
|
||||
**
|
||||
** SPDX-License-Identifier: BSD-3-Clause
|
||||
**
|
||||
** http: www.nxp.com
|
||||
** mail: support@nxp.com
|
||||
**
|
||||
** ###################################################################
|
||||
*/
|
||||
|
||||
#define m_flash_config_start 0x60000000
|
||||
#define m_flash_config_size 0x00001000
|
||||
|
||||
#define m_ivt_start 0x60001000
|
||||
#define m_ivt_size 0x00001000
|
||||
|
||||
#define m_interrupts_start 0x60002000
|
||||
#define m_interrupts_size 0x00000400
|
||||
|
||||
#define m_text_start 0x60002400
|
||||
#define m_text_size 0x007FDC00
|
||||
|
||||
#define m_data_start 0x20000000
|
||||
#define m_data_size 0x00020000
|
||||
|
||||
#define m_data2_start 0x20200000
|
||||
#define m_data2_size 0x000C0000
|
||||
|
||||
/* Sizes */
|
||||
#if (defined(__stack_size__))
|
||||
#define Stack_Size __stack_size__
|
||||
#else
|
||||
#define Stack_Size 0x0400
|
||||
#endif
|
||||
|
||||
#if (defined(__heap_size__))
|
||||
#define Heap_Size __heap_size__
|
||||
#else
|
||||
#define Heap_Size 0x0400
|
||||
#endif
|
||||
|
||||
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
||||
LR_m_text m_flash_config_start m_text_start+m_text_size-m_flash_config_start { ; load region size_region
|
||||
RW_m_config_text m_flash_config_start FIXED m_flash_config_size { ; load address = execution address
|
||||
* (.boot_hdr.conf, +FIRST)
|
||||
}
|
||||
|
||||
RW_m_ivt_text m_ivt_start FIXED m_ivt_size { ; load address = execution address
|
||||
* (.boot_hdr.ivt, +FIRST)
|
||||
* (.boot_hdr.boot_data)
|
||||
* (.boot_hdr.dcd_data)
|
||||
}
|
||||
#else
|
||||
LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_start { ; load region size_region
|
||||
#endif
|
||||
VECTOR_ROM m_interrupts_start FIXED m_interrupts_size { ; load address = execution address
|
||||
* (RESET,+FIRST)
|
||||
}
|
||||
ER_m_text m_text_start FIXED m_text_size { ; load address = execution address
|
||||
* (InRoot$$Sections)
|
||||
.ANY (+RO)
|
||||
}
|
||||
RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
|
||||
.ANY (+RW +ZI)
|
||||
* (NonCacheable.init)
|
||||
* (NonCacheable)
|
||||
}
|
||||
ARM_LIB_HEAP +0 EMPTY Heap_Size { ; Heap region growing up
|
||||
}
|
||||
ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
|
||||
}
|
||||
RW_m_ncache m_data2_start EMPTY 0 {
|
||||
}
|
||||
RW_m_ncache_unused +0 EMPTY m_data2_size-ImageLength(RW_m_ncache) { ; Empty region added for MPU configuration
|
||||
}
|
||||
}
|
@@ -0,0 +1,102 @@
|
||||
#! armcc -E
|
||||
/*
|
||||
** ###################################################################
|
||||
** Processors: MIMXRT1062CVJ5A
|
||||
** MIMXRT1062CVL5A
|
||||
** MIMXRT1062DVJ6A
|
||||
** MIMXRT1062DVL6A
|
||||
**
|
||||
** Compiler: Keil ARM C/C++ Compiler
|
||||
** Reference manual: IMXRT1060RM Rev.1, 12/2018 | IMXRT1060SRM Rev.3
|
||||
** Version: rev. 0.1, 2017-01-10
|
||||
** Build: b191015
|
||||
**
|
||||
** Abstract:
|
||||
** Linker file for the Keil ARM C/C++ Compiler
|
||||
**
|
||||
** Copyright 2016 Freescale Semiconductor, Inc.
|
||||
** Copyright 2016-2019 NXP
|
||||
** All rights reserved.
|
||||
**
|
||||
** SPDX-License-Identifier: BSD-3-Clause
|
||||
**
|
||||
** http: www.nxp.com
|
||||
** mail: support@nxp.com
|
||||
**
|
||||
** ###################################################################
|
||||
*/
|
||||
|
||||
#define m_flash_config_start 0x60000000
|
||||
#define m_flash_config_size 0x00001000
|
||||
|
||||
#define m_ivt_start 0x60001000
|
||||
#define m_ivt_size 0x00001000
|
||||
|
||||
#define m_interrupts_start 0x60002000
|
||||
#define m_interrupts_size 0x00000400
|
||||
|
||||
#define m_text_start 0x60002400
|
||||
#define m_text_size 0x007FDC00
|
||||
|
||||
#define m_data_start 0x80000000
|
||||
#define m_data_size 0x01E00000
|
||||
|
||||
#define m_ncache_start 0x81E00000
|
||||
#define m_ncache_size 0x00200000
|
||||
|
||||
#define m_data2_start 0x20000000
|
||||
#define m_data2_size 0x00020000
|
||||
|
||||
#define m_data3_start 0x20200000
|
||||
#define m_data3_size 0x000C0000
|
||||
|
||||
/* Sizes */
|
||||
#if (defined(__stack_size__))
|
||||
#define Stack_Size __stack_size__
|
||||
#else
|
||||
#define Stack_Size 0x0400
|
||||
#endif
|
||||
|
||||
#if (defined(__heap_size__))
|
||||
#define Heap_Size __heap_size__
|
||||
#else
|
||||
#define Heap_Size 0x0400
|
||||
#endif
|
||||
|
||||
#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
|
||||
LR_m_text m_flash_config_start m_text_start+m_text_size-m_flash_config_start { ; load region size_region
|
||||
RW_m_config_text m_flash_config_start FIXED m_flash_config_size { ; load address = execution address
|
||||
* (.boot_hdr.conf, +FIRST)
|
||||
}
|
||||
|
||||
RW_m_ivt_text m_ivt_start FIXED m_ivt_size { ; load address = execution address
|
||||
* (.boot_hdr.ivt, +FIRST)
|
||||
* (.boot_hdr.boot_data)
|
||||
* (.boot_hdr.dcd_data)
|
||||
}
|
||||
#else
|
||||
LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_start { ; load region size_region
|
||||
#endif
|
||||
VECTOR_ROM m_interrupts_start FIXED m_interrupts_size { ; load address = execution address
|
||||
* (RESET,+FIRST)
|
||||
}
|
||||
ER_m_text m_text_start FIXED m_text_size { ; load address = execution address
|
||||
* (InRoot$$Sections)
|
||||
.ANY (+RO)
|
||||
}
|
||||
RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
|
||||
.ANY (+RW +ZI)
|
||||
*(m_usb_dma_init_data)
|
||||
*(m_usb_dma_noninit_data)
|
||||
}
|
||||
ARM_LIB_HEAP +0 EMPTY Heap_Size { ; Heap region growing up
|
||||
}
|
||||
ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
|
||||
}
|
||||
RW_m_ncache m_ncache_start m_ncache_size { ; ncache RW data
|
||||
* (NonCacheable.init)
|
||||
* (NonCacheable)
|
||||
}
|
||||
RW_m_ncache_unused +0 EMPTY m_ncache_size-ImageLength(RW_m_ncache) { ; Empty region added for MPU configuration
|
||||
}
|
||||
}
|
@@ -0,0 +1,75 @@
|
||||
#! armcc -E
|
||||
/*
|
||||
** ###################################################################
|
||||
** Processors: MIMXRT1062CVJ5A
|
||||
** MIMXRT1062CVL5A
|
||||
** MIMXRT1062DVJ6A
|
||||
** MIMXRT1062DVL6A
|
||||
**
|
||||
** Compiler: Keil ARM C/C++ Compiler
|
||||
** Reference manual: IMXRT1060RM Rev.1, 12/2018 | IMXRT1060SRM Rev.3
|
||||
** Version: rev. 0.1, 2017-01-10
|
||||
** Build: b191015
|
||||
**
|
||||
** Abstract:
|
||||
** Linker file for the Keil ARM C/C++ Compiler
|
||||
**
|
||||
** Copyright 2016 Freescale Semiconductor, Inc.
|
||||
** Copyright 2016-2019 NXP
|
||||
** All rights reserved.
|
||||
**
|
||||
** SPDX-License-Identifier: BSD-3-Clause
|
||||
**
|
||||
** http: www.nxp.com
|
||||
** mail: support@nxp.com
|
||||
**
|
||||
** ###################################################################
|
||||
*/
|
||||
|
||||
#define m_interrupts_start 0x00000000
|
||||
#define m_interrupts_size 0x00000400
|
||||
|
||||
#define m_text_start 0x00000400
|
||||
#define m_text_size 0x0001FC00
|
||||
|
||||
#define m_data_start 0x20000000
|
||||
#define m_data_size 0x00020000
|
||||
|
||||
#define m_data2_start 0x20200000
|
||||
#define m_data2_size 0x000C0000
|
||||
|
||||
/* Sizes */
|
||||
#if (defined(__stack_size__))
|
||||
#define Stack_Size __stack_size__
|
||||
#else
|
||||
#define Stack_Size 0x0400
|
||||
#endif
|
||||
|
||||
#if (defined(__heap_size__))
|
||||
#define Heap_Size __heap_size__
|
||||
#else
|
||||
#define Heap_Size 0x0400
|
||||
#endif
|
||||
|
||||
LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_start { ; load region size_region
|
||||
VECTOR_ROM m_interrupts_start FIXED m_interrupts_size { ; load address = execution address
|
||||
* (RESET,+FIRST)
|
||||
}
|
||||
ER_m_text m_text_start FIXED m_text_size { ; load address = execution address
|
||||
* (InRoot$$Sections)
|
||||
.ANY (+RO)
|
||||
}
|
||||
RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
|
||||
.ANY (+RW +ZI)
|
||||
* (NonCacheable.init)
|
||||
* (NonCacheable)
|
||||
}
|
||||
ARM_LIB_HEAP +0 EMPTY Heap_Size { ; Heap region growing up
|
||||
}
|
||||
ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
|
||||
}
|
||||
RW_m_ncache m_data2_start EMPTY 0 {
|
||||
}
|
||||
RW_m_ncache_unused +0 EMPTY m_data2_size-ImageLength(RW_m_ncache) { ; Empty region added for MPU configuration
|
||||
}
|
||||
}
|
@@ -0,0 +1,75 @@
|
||||
#! armcc -E
|
||||
/*
|
||||
** ###################################################################
|
||||
** Processors: MIMXRT1062CVJ5A
|
||||
** MIMXRT1062CVL5A
|
||||
** MIMXRT1062DVJ6A
|
||||
** MIMXRT1062DVL6A
|
||||
**
|
||||
** Compiler: Keil ARM C/C++ Compiler
|
||||
** Reference manual: IMXRT1060RM Rev.1, 12/2018 | IMXRT1060SRM Rev.3
|
||||
** Version: rev. 0.1, 2017-01-10
|
||||
** Build: b190730
|
||||
**
|
||||
** Abstract:
|
||||
** Linker file for the Keil ARM C/C++ Compiler
|
||||
**
|
||||
** Copyright 2016 Freescale Semiconductor, Inc.
|
||||
** Copyright 2016-2019 NXP
|
||||
** All rights reserved.
|
||||
**
|
||||
** SPDX-License-Identifier: BSD-3-Clause
|
||||
**
|
||||
** http: www.nxp.com
|
||||
** mail: support@nxp.com
|
||||
**
|
||||
** ###################################################################
|
||||
*/
|
||||
|
||||
#define m_interrupts_start 0x00001400
|
||||
#define m_interrupts_size 0x00000400
|
||||
|
||||
#define m_text_start 0x00001800
|
||||
#define m_text_size 0x0001E800
|
||||
|
||||
#define m_data_start 0x20000000
|
||||
#define m_data_size 0x00020000
|
||||
|
||||
#define m_data2_start 0x20200000
|
||||
#define m_data2_size 0x000C0000
|
||||
|
||||
/* Sizes */
|
||||
#if (defined(__stack_size__))
|
||||
#define Stack_Size __stack_size__
|
||||
#else
|
||||
#define Stack_Size 0x0400
|
||||
#endif
|
||||
|
||||
#if (defined(__heap_size__))
|
||||
#define Heap_Size __heap_size__
|
||||
#else
|
||||
#define Heap_Size 0x0400
|
||||
#endif
|
||||
|
||||
LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_start { ; load region size_region
|
||||
VECTOR_ROM m_interrupts_start FIXED m_interrupts_size { ; load address = execution address
|
||||
* (RESET,+FIRST)
|
||||
}
|
||||
ER_m_text m_text_start FIXED m_text_size { ; load address = execution address
|
||||
* (InRoot$$Sections)
|
||||
.ANY (+RO)
|
||||
}
|
||||
RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
|
||||
.ANY (+RW +ZI)
|
||||
* (NonCacheable.init)
|
||||
* (NonCacheable)
|
||||
}
|
||||
ARM_LIB_HEAP +0 EMPTY Heap_Size { ; Heap region growing up
|
||||
}
|
||||
ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
|
||||
}
|
||||
RW_m_ncache m_data2_start EMPTY 0 {
|
||||
}
|
||||
RW_m_ncache_unused +0 EMPTY m_data2_size-ImageLength(RW_m_ncache) { ; Empty region added for MPU configuration
|
||||
}
|
||||
}
|
@@ -0,0 +1,83 @@
|
||||
#! armcc -E
|
||||
/*
|
||||
** ###################################################################
|
||||
** Processors: MIMXRT1062CVJ5A
|
||||
** MIMXRT1062CVL5A
|
||||
** MIMXRT1062DVJ6A
|
||||
** MIMXRT1062DVL6A
|
||||
**
|
||||
** Compiler: Keil ARM C/C++ Compiler
|
||||
** Reference manual: IMXRT1060RM Rev.1, 12/2018 | IMXRT1060SRM Rev.3
|
||||
** Version: rev. 0.1, 2017-01-10
|
||||
** Build: b191015
|
||||
**
|
||||
** Abstract:
|
||||
** Linker file for the Keil ARM C/C++ Compiler
|
||||
**
|
||||
** Copyright 2016 Freescale Semiconductor, Inc.
|
||||
** Copyright 2016-2019 NXP
|
||||
** All rights reserved.
|
||||
**
|
||||
** SPDX-License-Identifier: BSD-3-Clause
|
||||
**
|
||||
** http: www.nxp.com
|
||||
** mail: support@nxp.com
|
||||
**
|
||||
** ###################################################################
|
||||
*/
|
||||
|
||||
#define m_interrupts_start 0x00000000
|
||||
#define m_interrupts_size 0x00000400
|
||||
|
||||
#define m_text_start 0x00000400
|
||||
#define m_text_size 0x0001FC00
|
||||
|
||||
#define m_data_start 0x80000000
|
||||
#define m_data_size 0x01E00000
|
||||
|
||||
#define m_ncache_start 0x81E00000
|
||||
#define m_ncache_size 0x00200000
|
||||
|
||||
#define m_data2_start 0x20000000
|
||||
#define m_data2_size 0x00020000
|
||||
|
||||
#define m_data3_start 0x20200000
|
||||
#define m_data3_size 0x000C0000
|
||||
|
||||
/* Sizes */
|
||||
#if (defined(__stack_size__))
|
||||
#define Stack_Size __stack_size__
|
||||
#else
|
||||
#define Stack_Size 0x0400
|
||||
#endif
|
||||
|
||||
#if (defined(__heap_size__))
|
||||
#define Heap_Size __heap_size__
|
||||
#else
|
||||
#define Heap_Size 0x0400
|
||||
#endif
|
||||
|
||||
LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_start { ; load region size_region
|
||||
VECTOR_ROM m_interrupts_start FIXED m_interrupts_size { ; load address = execution address
|
||||
* (RESET,+FIRST)
|
||||
}
|
||||
ER_m_text m_text_start FIXED m_text_size { ; load address = execution address
|
||||
* (InRoot$$Sections)
|
||||
.ANY (+RO)
|
||||
}
|
||||
RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
|
||||
.ANY (+RW +ZI)
|
||||
*(m_usb_dma_init_data)
|
||||
*(m_usb_dma_noninit_data)
|
||||
}
|
||||
ARM_LIB_HEAP +0 EMPTY Heap_Size { ; Heap region growing up
|
||||
}
|
||||
ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
|
||||
}
|
||||
RW_m_ncache m_ncache_start m_ncache_size { ; ncache RW data
|
||||
* (NonCacheable.init)
|
||||
* (NonCacheable)
|
||||
}
|
||||
RW_m_ncache_unused +0 EMPTY m_ncache_size-ImageLength(RW_m_ncache) { ; Empty region added for MPU configuration
|
||||
}
|
||||
}
|
@@ -0,0 +1,83 @@
|
||||
#! armcc -E
|
||||
/*
|
||||
** ###################################################################
|
||||
** Processors: MIMXRT1062CVJ5A
|
||||
** MIMXRT1062CVL5A
|
||||
** MIMXRT1062DVJ6A
|
||||
** MIMXRT1062DVL6A
|
||||
**
|
||||
** Compiler: Keil ARM C/C++ Compiler
|
||||
** Reference manual: IMXRT1060RM Rev.1, 12/2018 | IMXRT1060SRM Rev.3
|
||||
** Version: rev. 0.1, 2017-01-10
|
||||
** Build: b191015
|
||||
**
|
||||
** Abstract:
|
||||
** Linker file for the Keil ARM C/C++ Compiler
|
||||
**
|
||||
** Copyright 2016 Freescale Semiconductor, Inc.
|
||||
** Copyright 2016-2019 NXP
|
||||
** All rights reserved.
|
||||
**
|
||||
** SPDX-License-Identifier: BSD-3-Clause
|
||||
**
|
||||
** http: www.nxp.com
|
||||
** mail: support@nxp.com
|
||||
**
|
||||
** ###################################################################
|
||||
*/
|
||||
|
||||
#define m_interrupts_start 0x80000000
|
||||
#define m_interrupts_size 0x00000400
|
||||
|
||||
#define m_text_start 0x80000400
|
||||
#define m_text_size 0x001FFC00
|
||||
|
||||
#define m_data_start 0x20200000
|
||||
#define m_data_size 0x000C0000
|
||||
|
||||
#define m_data2_start 0x20000000
|
||||
#define m_data2_size 0x00020000
|
||||
|
||||
#define m_data3_start 0x80200000
|
||||
#define m_data3_size 0x01C00000
|
||||
|
||||
#define m_ncache_start 0x81E00000
|
||||
#define m_ncache_size 0x00200000
|
||||
|
||||
/* Sizes */
|
||||
#if (defined(__stack_size__))
|
||||
#define Stack_Size __stack_size__
|
||||
#else
|
||||
#define Stack_Size 0x0400
|
||||
#endif
|
||||
|
||||
#if (defined(__heap_size__))
|
||||
#define Heap_Size __heap_size__
|
||||
#else
|
||||
#define Heap_Size 0x0400
|
||||
#endif
|
||||
|
||||
LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_start { ; load region size_region
|
||||
VECTOR_ROM m_interrupts_start FIXED m_interrupts_size { ; load address = execution address
|
||||
* (RESET,+FIRST)
|
||||
}
|
||||
ER_m_text m_text_start FIXED m_text_size { ; load address = execution address
|
||||
* (InRoot$$Sections)
|
||||
.ANY (+RO)
|
||||
}
|
||||
RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
|
||||
.ANY (+RW +ZI)
|
||||
*(m_usb_dma_init_data)
|
||||
*(m_usb_dma_noninit_data)
|
||||
}
|
||||
ARM_LIB_HEAP +0 EMPTY Heap_Size { ; Heap region growing up
|
||||
}
|
||||
ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
|
||||
}
|
||||
RW_m_ncache m_ncache_start m_ncache_size { ; ncache RW data
|
||||
* (NonCacheable.init)
|
||||
* (NonCacheable)
|
||||
}
|
||||
RW_m_ncache_unused +0 EMPTY m_ncache_size-ImageLength(RW_m_ncache) { ; Empty region added for MPU configuration
|
||||
}
|
||||
}
|
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright 2018 NXP
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* o Redistributions of source code must retain the above copyright notice, this list
|
||||
* of conditions and the following disclaimer.
|
||||
*
|
||||
* o Redistributions in binary form must reproduce the above copyright notice, this
|
||||
* list of conditions and the following disclaimer in the documentation and/or
|
||||
* other materials provided with the distribution.
|
||||
*
|
||||
* o Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
FUNC void _loadDcdcTrim(void)
|
||||
{
|
||||
unsigned int dcdc_trim_loaded;
|
||||
unsigned long ocotp_base;
|
||||
unsigned long ocotp_fuse_bank0_base;
|
||||
unsigned long dcdc_base;
|
||||
unsigned long reg;
|
||||
unsigned long trim_value;
|
||||
unsigned int index;
|
||||
|
||||
ocotp_base = 0x401F4000;
|
||||
ocotp_fuse_bank0_base = ocotp_base + 0x400;
|
||||
dcdc_base = 0x40080000;
|
||||
|
||||
dcdc_trim_loaded = 0;
|
||||
|
||||
reg = _RDWORD(ocotp_fuse_bank0_base + 0x90);
|
||||
if (reg & (1<<10))
|
||||
{
|
||||
// DCDC: REG0->VBG_TRM
|
||||
trim_value = (reg & (0x1F << 11)) >> 11;
|
||||
reg = (_RDWORD(dcdc_base + 0x4) & ~(0x1F << 24)) | (trim_value << 24);
|
||||
_WDWORD(dcdc_base + 0x4, reg);
|
||||
dcdc_trim_loaded = 1;
|
||||
}
|
||||
|
||||
reg = _RDWORD(ocotp_fuse_bank0_base + 0x80);
|
||||
if (reg & (1<<30))
|
||||
{
|
||||
index = (reg & (3 << 28)) >> 28;
|
||||
if (index < 4)
|
||||
{
|
||||
// DCDC: REG3->TRG
|
||||
reg = (_RDWORD(dcdc_base + 0xC) & ~(0x1F)) | ((0xF + index));
|
||||
_WDWORD(dcdc_base + 0xC, reg);
|
||||
dcdc_trim_loaded = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (dcdc_trim_loaded)
|
||||
{
|
||||
// delay about 400us till dcdc is stable.
|
||||
_Sleep_(1);
|
||||
}
|
||||
}
|
||||
FUNC void Setup (void) {
|
||||
_loadDcdcTrim();
|
||||
SP = _RDWORD(0x60002000); // Setup Stack Pointer
|
||||
PC = _RDWORD(0x60002004); // Setup Program Counter
|
||||
_WDWORD(0xE000ED08, 0x60002000); // Setup Vector Table Offset Register
|
||||
}
|
||||
|
||||
FUNC void OnResetExec (void) { // executes upon software RESET
|
||||
Setup(); // Setup for Running
|
||||
}
|
||||
|
||||
LOAD %L INCREMENTAL // Download
|
||||
|
||||
Setup(); // Setup for Running
|
||||
|
||||
// g, main
|
@@ -0,0 +1,260 @@
|
||||
/*
|
||||
* Copyright 2018 NXP
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* o Redistributions of source code must retain the above copyright notice, this list
|
||||
* of conditions and the following disclaimer.
|
||||
*
|
||||
* o Redistributions in binary form must reproduce the above copyright notice, this
|
||||
* list of conditions and the following disclaimer in the documentation and/or
|
||||
* other materials provided with the distribution.
|
||||
*
|
||||
* o Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
FUNC void _loadDcdcTrim(void)
|
||||
{
|
||||
unsigned int dcdc_trim_loaded;
|
||||
unsigned long ocotp_base;
|
||||
unsigned long ocotp_fuse_bank0_base;
|
||||
unsigned long dcdc_base;
|
||||
unsigned long reg;
|
||||
unsigned long trim_value;
|
||||
unsigned int index;
|
||||
|
||||
ocotp_base = 0x401F4000;
|
||||
ocotp_fuse_bank0_base = ocotp_base + 0x400;
|
||||
dcdc_base = 0x40080000;
|
||||
|
||||
dcdc_trim_loaded = 0;
|
||||
|
||||
reg = _RDWORD(ocotp_fuse_bank0_base + 0x90);
|
||||
if (reg & (1<<10))
|
||||
{
|
||||
// DCDC: REG0->VBG_TRM
|
||||
trim_value = (reg & (0x1F << 11)) >> 11;
|
||||
reg = (_RDWORD(dcdc_base + 0x4) & ~(0x1F << 24)) | (trim_value << 24);
|
||||
_WDWORD(dcdc_base + 0x4, reg);
|
||||
dcdc_trim_loaded = 1;
|
||||
}
|
||||
|
||||
reg = _RDWORD(ocotp_fuse_bank0_base + 0x80);
|
||||
if (reg & (1<<30))
|
||||
{
|
||||
index = (reg & (3 << 28)) >> 28;
|
||||
if (index < 4)
|
||||
{
|
||||
// DCDC: REG3->TRG
|
||||
reg = (_RDWORD(dcdc_base + 0xC) & ~(0x1F)) | ((0xF + index));
|
||||
_WDWORD(dcdc_base + 0xC, reg);
|
||||
dcdc_trim_loaded = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (dcdc_trim_loaded)
|
||||
{
|
||||
// delay about 400us till dcdc is stable.
|
||||
_Sleep_(1);
|
||||
}
|
||||
}
|
||||
|
||||
FUNC void SDRAM_WaitIpCmdDone(void)
|
||||
{
|
||||
unsigned long reg;
|
||||
do
|
||||
{
|
||||
reg = _RDWORD(0x402F003C);
|
||||
}while((reg & 0x3) == 0);
|
||||
|
||||
_WDWORD(0x402F003C,0x00000003); // clear IPCMDERR and IPCMDDONE bits
|
||||
}
|
||||
|
||||
FUNC void _clock_init(void)
|
||||
{
|
||||
unsigned int reg;
|
||||
// Enable all clocks
|
||||
_WDWORD(0x400FC068,0xffffffff);
|
||||
_WDWORD(0x400FC06C,0xffffffff);
|
||||
_WDWORD(0x400FC070,0xffffffff);
|
||||
_WDWORD(0x400FC074,0xffffffff);
|
||||
_WDWORD(0x400FC078,0xffffffff);
|
||||
_WDWORD(0x400FC07C,0xffffffff);
|
||||
_WDWORD(0x400FC080,0xffffffff);
|
||||
|
||||
// PERCLK_PODF: 1 divide by 2
|
||||
_WDWORD(0x400FC01C, 0x04900001);
|
||||
// Enable SYS PLL but keep it bypassed.
|
||||
_WDWORD(0x400D8030, 0x00012001);
|
||||
do
|
||||
{
|
||||
reg = _RDWORD(0x400D8030);
|
||||
}while((reg & 0x80000000) == 0);
|
||||
// Disable bypass of SYS PLL
|
||||
_WDWORD(0x400D8030, 0x00002001);
|
||||
|
||||
// PFD2_FRAC: 29, PLL2 PFD2=528*18/PFD2_FRAC=327
|
||||
// Ungate SYS PLL PFD2
|
||||
_WDWORD(0x400D8100, 0x001d0000);
|
||||
|
||||
// SEMC_PODF: 001, AHB_PODF: 011, IPG_PODF: 01
|
||||
// SEMC_ALT_CLK_SEL: 0 PLL2 (SYS PLL) PFD2
|
||||
// SEMC_CLK_SEL: 1 SEMC_ALT_CLK
|
||||
_WDWORD(0x400FC014, 0x00010D40);
|
||||
}
|
||||
|
||||
FUNC void _sdr_Init(void)
|
||||
{
|
||||
// Config IOMUX
|
||||
_WDWORD(0x401F8014, 0x00000000);
|
||||
_WDWORD(0x401F8018, 0x00000000);
|
||||
_WDWORD(0x401F801C, 0x00000000);
|
||||
_WDWORD(0x401F8020, 0x00000000);
|
||||
_WDWORD(0x401F8024, 0x00000000);
|
||||
_WDWORD(0x401F8028, 0x00000000);
|
||||
_WDWORD(0x401F802C, 0x00000000);
|
||||
_WDWORD(0x401F8030, 0x00000000);
|
||||
_WDWORD(0x401F8034, 0x00000000);
|
||||
_WDWORD(0x401F8038, 0x00000000);
|
||||
_WDWORD(0x401F803C, 0x00000000);
|
||||
_WDWORD(0x401F8040, 0x00000000);
|
||||
_WDWORD(0x401F8044, 0x00000000);
|
||||
_WDWORD(0x401F8048, 0x00000000);
|
||||
_WDWORD(0x401F804C, 0x00000000);
|
||||
_WDWORD(0x401F8050, 0x00000000);
|
||||
_WDWORD(0x401F8054, 0x00000000);
|
||||
_WDWORD(0x401F8058, 0x00000000);
|
||||
_WDWORD(0x401F805C, 0x00000000);
|
||||
_WDWORD(0x401F8060, 0x00000000);
|
||||
_WDWORD(0x401F8064, 0x00000000);
|
||||
_WDWORD(0x401F8068, 0x00000000);
|
||||
_WDWORD(0x401F806C, 0x00000000);
|
||||
_WDWORD(0x401F8070, 0x00000000);
|
||||
_WDWORD(0x401F8074, 0x00000000);
|
||||
_WDWORD(0x401F8078, 0x00000000);
|
||||
_WDWORD(0x401F807C, 0x00000000);
|
||||
_WDWORD(0x401F8080, 0x00000000);
|
||||
_WDWORD(0x401F8084, 0x00000000);
|
||||
_WDWORD(0x401F8088, 0x00000000);
|
||||
_WDWORD(0x401F808C, 0x00000000);
|
||||
_WDWORD(0x401F8090, 0x00000000);
|
||||
_WDWORD(0x401F8094, 0x00000000);
|
||||
_WDWORD(0x401F8098, 0x00000000);
|
||||
_WDWORD(0x401F809C, 0x00000000);
|
||||
_WDWORD(0x401F80A0, 0x00000000);
|
||||
_WDWORD(0x401F80A4, 0x00000000);
|
||||
_WDWORD(0x401F80A8, 0x00000000);
|
||||
_WDWORD(0x401F80AC, 0x00000000);
|
||||
_WDWORD(0x401F80B0, 0x00000010); // EMC_39, DQS PIN, enable SION
|
||||
_WDWORD(0x401F80B4, 0x00000000);
|
||||
_WDWORD(0x401F80B8, 0x00000000);
|
||||
|
||||
// PAD ctrl
|
||||
// drive strength = 0x7 to increase drive strength
|
||||
// otherwise the data7 bit may fail.
|
||||
_WDWORD(0x401F8204, 0x000110F9);
|
||||
_WDWORD(0x401F8208, 0x000110F9);
|
||||
_WDWORD(0x401F820C, 0x000110F9);
|
||||
_WDWORD(0x401F8210, 0x000110F9);
|
||||
_WDWORD(0x401F8214, 0x000110F9);
|
||||
_WDWORD(0x401F8218, 0x000110F9);
|
||||
_WDWORD(0x401F821C, 0x000110F9);
|
||||
_WDWORD(0x401F8220, 0x000110F9);
|
||||
_WDWORD(0x401F8224, 0x000110F9);
|
||||
_WDWORD(0x401F8228, 0x000110F9);
|
||||
_WDWORD(0x401F822C, 0x000110F9);
|
||||
_WDWORD(0x401F8230, 0x000110F9);
|
||||
_WDWORD(0x401F8234, 0x000110F9);
|
||||
_WDWORD(0x401F8238, 0x000110F9);
|
||||
_WDWORD(0x401F823C, 0x000110F9);
|
||||
_WDWORD(0x401F8240, 0x000110F9);
|
||||
_WDWORD(0x401F8244, 0x000110F9);
|
||||
_WDWORD(0x401F8248, 0x000110F9);
|
||||
_WDWORD(0x401F824C, 0x000110F9);
|
||||
_WDWORD(0x401F8250, 0x000110F9);
|
||||
_WDWORD(0x401F8254, 0x000110F9);
|
||||
_WDWORD(0x401F8258, 0x000110F9);
|
||||
_WDWORD(0x401F825C, 0x000110F9);
|
||||
_WDWORD(0x401F8260, 0x000110F9);
|
||||
_WDWORD(0x401F8264, 0x000110F9);
|
||||
_WDWORD(0x401F8268, 0x000110F9);
|
||||
_WDWORD(0x401F826C, 0x000110F9);
|
||||
_WDWORD(0x401F8270, 0x000110F9);
|
||||
_WDWORD(0x401F8274, 0x000110F9);
|
||||
_WDWORD(0x401F8278, 0x000110F9);
|
||||
_WDWORD(0x401F827C, 0x000110F9);
|
||||
_WDWORD(0x401F8280, 0x000110F9);
|
||||
_WDWORD(0x401F8284, 0x000110F9);
|
||||
_WDWORD(0x401F8288, 0x000110F9);
|
||||
_WDWORD(0x401F828C, 0x000110F9);
|
||||
_WDWORD(0x401F8290, 0x000110F9);
|
||||
_WDWORD(0x401F8294, 0x000110F9);
|
||||
_WDWORD(0x401F8298, 0x000110F9);
|
||||
_WDWORD(0x401F829C, 0x000110F9);
|
||||
_WDWORD(0x401F82A0, 0x000110F9);
|
||||
_WDWORD(0x401F82A4, 0x000110F9);
|
||||
_WDWORD(0x401F82A8, 0x000110F9);
|
||||
|
||||
// Config SDR Controller Registers/
|
||||
_WDWORD(0x402F0000,0x10000004); // MCR
|
||||
_WDWORD(0x402F0008,0x00030524); // BMCR0
|
||||
_WDWORD(0x402F000C,0x06030524); // BMCR1
|
||||
_WDWORD(0x402F0010,0x8000001B); // BR0, 32MB
|
||||
|
||||
_WDWORD(0x402F0040,0x00000F31); // SDRAMCR0
|
||||
_WDWORD(0x402F0044,0x00652922); // SDRAMCR1
|
||||
_WDWORD(0x402F0048,0x00010920); // SDRAMCR2
|
||||
_WDWORD(0x402F004C,0x50210A08); // SDRAMCR3
|
||||
|
||||
_WDWORD(0x402F0090,0x80000000); // IPCR0
|
||||
_WDWORD(0x402F0094,0x00000002); // IPCR1
|
||||
_WDWORD(0x402F0098,0x00000000); // IPCR2
|
||||
|
||||
|
||||
_WDWORD(0x402F009C,0xA55A000F); // IPCMD, SD_CC_IPREA
|
||||
SDRAM_WaitIpCmdDone();
|
||||
_WDWORD(0x402F009C,0xA55A000C); // SD_CC_IAF
|
||||
SDRAM_WaitIpCmdDone();
|
||||
_WDWORD(0x402F009C,0xA55A000C); // SD_CC_IAF
|
||||
SDRAM_WaitIpCmdDone();
|
||||
_WDWORD(0x402F00A0,0x00000033); // IPTXDAT
|
||||
_WDWORD(0x402F009C,0xA55A000A); // SD_CC_IMS
|
||||
SDRAM_WaitIpCmdDone();
|
||||
_WDWORD(0x402F004C,0x08080A01 ); // enable sdram self refresh again after initialization done.
|
||||
}
|
||||
|
||||
FUNC void Setup (void) {
|
||||
_loadDcdcTrim();
|
||||
SP = _RDWORD(0x60002000); // Setup Stack Pointer
|
||||
PC = _RDWORD(0x60002004); // Setup Program Counter
|
||||
_WDWORD(0xE000ED08, 0x60002000); // Setup Vector Table Offset Register
|
||||
}
|
||||
|
||||
FUNC void OnResetExec (void) { // executes upon software RESET
|
||||
_clock_init();
|
||||
_sdr_Init();
|
||||
Setup(); // Setup for Running
|
||||
}
|
||||
|
||||
_clock_init();
|
||||
_sdr_Init();
|
||||
|
||||
LOAD %L INCREMENTAL // Download
|
||||
|
||||
Setup(); // Setup for Running
|
||||
|
||||
// g, main
|
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Copyright 2018 NXP
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* o Redistributions of source code must retain the above copyright notice, this list
|
||||
* of conditions and the following disclaimer.
|
||||
*
|
||||
* o Redistributions in binary form must reproduce the above copyright notice, this
|
||||
* list of conditions and the following disclaimer in the documentation and/or
|
||||
* other materials provided with the distribution.
|
||||
*
|
||||
* o Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
FUNC void _loadDcdcTrim(void)
|
||||
{
|
||||
unsigned int dcdc_trim_loaded;
|
||||
unsigned long ocotp_base;
|
||||
unsigned long ocotp_fuse_bank0_base;
|
||||
unsigned long dcdc_base;
|
||||
unsigned long reg;
|
||||
unsigned long trim_value;
|
||||
unsigned int index;
|
||||
|
||||
ocotp_base = 0x401F4000;
|
||||
ocotp_fuse_bank0_base = ocotp_base + 0x400;
|
||||
dcdc_base = 0x40080000;
|
||||
|
||||
dcdc_trim_loaded = 0;
|
||||
|
||||
reg = _RDWORD(ocotp_fuse_bank0_base + 0x90);
|
||||
if (reg & (1<<10))
|
||||
{
|
||||
// DCDC: REG0->VBG_TRM
|
||||
trim_value = (reg & (0x1F << 11)) >> 11;
|
||||
reg = (_RDWORD(dcdc_base + 0x4) & ~(0x1F << 24)) | (trim_value << 24);
|
||||
_WDWORD(dcdc_base + 0x4, reg);
|
||||
dcdc_trim_loaded = 1;
|
||||
}
|
||||
|
||||
reg = _RDWORD(ocotp_fuse_bank0_base + 0x80);
|
||||
if (reg & (1<<30))
|
||||
{
|
||||
index = (reg & (3 << 28)) >> 28;
|
||||
if (index < 4)
|
||||
{
|
||||
// DCDC: REG3->TRG
|
||||
reg = (_RDWORD(dcdc_base + 0xC) & ~(0x1F)) | ((0xF + index));
|
||||
_WDWORD(dcdc_base + 0xC, reg);
|
||||
dcdc_trim_loaded = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (dcdc_trim_loaded)
|
||||
{
|
||||
// delay about 400us till dcdc is stable.
|
||||
_Sleep_(1);
|
||||
}
|
||||
}
|
||||
|
||||
FUNC void Setup (void) {
|
||||
_loadDcdcTrim();
|
||||
SP = _RDWORD(0x00000000); // Setup Stack Pointer
|
||||
PC = _RDWORD(0x00000004); // Setup Program Counter
|
||||
_WDWORD(0xE000ED08, 0x00000000); // Setup Vector Table Offset Register
|
||||
}
|
||||
|
||||
FUNC void OnResetExec (void) { // executes upon software RESET
|
||||
Setup(); // Setup for Running
|
||||
}
|
||||
|
||||
LOAD %L INCREMENTAL // Download
|
||||
|
||||
Setup(); // Setup for Running
|
||||
|
||||
// g, main
|
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Copyright 2018 NXP
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* o Redistributions of source code must retain the above copyright notice, this list
|
||||
* of conditions and the following disclaimer.
|
||||
*
|
||||
* o Redistributions in binary form must reproduce the above copyright notice, this
|
||||
* list of conditions and the following disclaimer in the documentation and/or
|
||||
* other materials provided with the distribution.
|
||||
*
|
||||
* o Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
FUNC void _loadDcdcTrim(void)
|
||||
{
|
||||
unsigned int dcdc_trim_loaded;
|
||||
unsigned long ocotp_base;
|
||||
unsigned long ocotp_fuse_bank0_base;
|
||||
unsigned long dcdc_base;
|
||||
unsigned long reg;
|
||||
unsigned long trim_value;
|
||||
unsigned int index;
|
||||
|
||||
ocotp_base = 0x401F4000;
|
||||
ocotp_fuse_bank0_base = ocotp_base + 0x400;
|
||||
dcdc_base = 0x40080000;
|
||||
|
||||
dcdc_trim_loaded = 0;
|
||||
|
||||
reg = _RDWORD(ocotp_fuse_bank0_base + 0x90);
|
||||
if (reg & (1<<10))
|
||||
{
|
||||
// DCDC: REG0->VBG_TRM
|
||||
trim_value = (reg & (0x1F << 11)) >> 11;
|
||||
reg = (_RDWORD(dcdc_base + 0x4) & ~(0x1F << 24)) | (trim_value << 24);
|
||||
_WDWORD(dcdc_base + 0x4, reg);
|
||||
dcdc_trim_loaded = 1;
|
||||
}
|
||||
|
||||
reg = _RDWORD(ocotp_fuse_bank0_base + 0x80);
|
||||
if (reg & (1<<30))
|
||||
{
|
||||
index = (reg & (3 << 28)) >> 28;
|
||||
if (index < 4)
|
||||
{
|
||||
// DCDC: REG3->TRG
|
||||
reg = (_RDWORD(dcdc_base + 0xC) & ~(0x1F)) | ((0xF + index));
|
||||
_WDWORD(dcdc_base + 0xC, reg);
|
||||
dcdc_trim_loaded = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (dcdc_trim_loaded)
|
||||
{
|
||||
// delay about 400us till dcdc is stable.
|
||||
_Sleep_(1);
|
||||
}
|
||||
}
|
||||
|
||||
FUNC void Setup (void) {
|
||||
_loadDcdcTrim();
|
||||
SP = _RDWORD(0x00001400); // Setup Stack Pointer
|
||||
PC = _RDWORD(0x00001404); // Setup Program Counter
|
||||
_WDWORD(0xE000ED08, 0x00001400); // Setup Vector Table Offset Register
|
||||
}
|
||||
|
||||
FUNC void OnResetExec (void) { // executes upon software RESET
|
||||
Setup(); // Setup for Running
|
||||
}
|
||||
|
||||
LOAD %L INCREMENTAL // Download
|
||||
|
||||
Setup(); // Setup for Running
|
||||
|
||||
// g, main
|
@@ -0,0 +1,260 @@
|
||||
/*
|
||||
* Copyright 2018 NXP
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* o Redistributions of source code must retain the above copyright notice, this list
|
||||
* of conditions and the following disclaimer.
|
||||
*
|
||||
* o Redistributions in binary form must reproduce the above copyright notice, this
|
||||
* list of conditions and the following disclaimer in the documentation and/or
|
||||
* other materials provided with the distribution.
|
||||
*
|
||||
* o Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
FUNC void _loadDcdcTrim(void)
|
||||
{
|
||||
unsigned int dcdc_trim_loaded;
|
||||
unsigned long ocotp_base;
|
||||
unsigned long ocotp_fuse_bank0_base;
|
||||
unsigned long dcdc_base;
|
||||
unsigned long reg;
|
||||
unsigned long trim_value;
|
||||
unsigned int index;
|
||||
|
||||
ocotp_base = 0x401F4000;
|
||||
ocotp_fuse_bank0_base = ocotp_base + 0x400;
|
||||
dcdc_base = 0x40080000;
|
||||
|
||||
dcdc_trim_loaded = 0;
|
||||
|
||||
reg = _RDWORD(ocotp_fuse_bank0_base + 0x90);
|
||||
if (reg & (1<<10))
|
||||
{
|
||||
// DCDC: REG0->VBG_TRM
|
||||
trim_value = (reg & (0x1F << 11)) >> 11;
|
||||
reg = (_RDWORD(dcdc_base + 0x4) & ~(0x1F << 24)) | (trim_value << 24);
|
||||
_WDWORD(dcdc_base + 0x4, reg);
|
||||
dcdc_trim_loaded = 1;
|
||||
}
|
||||
|
||||
reg = _RDWORD(ocotp_fuse_bank0_base + 0x80);
|
||||
if (reg & (1<<30))
|
||||
{
|
||||
index = (reg & (3 << 28)) >> 28;
|
||||
if (index < 4)
|
||||
{
|
||||
// DCDC: REG3->TRG
|
||||
reg = (_RDWORD(dcdc_base + 0xC) & ~(0x1F)) | ((0xF + index));
|
||||
_WDWORD(dcdc_base + 0xC, reg);
|
||||
dcdc_trim_loaded = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (dcdc_trim_loaded)
|
||||
{
|
||||
// delay about 400us till dcdc is stable.
|
||||
_Sleep_(1);
|
||||
}
|
||||
}
|
||||
|
||||
FUNC void SDRAM_WaitIpCmdDone(void)
|
||||
{
|
||||
unsigned long reg;
|
||||
do
|
||||
{
|
||||
reg = _RDWORD(0x402F003C);
|
||||
}while((reg & 0x3) == 0);
|
||||
|
||||
_WDWORD(0x402F003C,0x00000003); // clear IPCMDERR and IPCMDDONE bits
|
||||
}
|
||||
|
||||
FUNC void _clock_init(void)
|
||||
{
|
||||
unsigned int reg;
|
||||
// Enable all clocks
|
||||
_WDWORD(0x400FC068,0xffffffff);
|
||||
_WDWORD(0x400FC06C,0xffffffff);
|
||||
_WDWORD(0x400FC070,0xffffffff);
|
||||
_WDWORD(0x400FC074,0xffffffff);
|
||||
_WDWORD(0x400FC078,0xffffffff);
|
||||
_WDWORD(0x400FC07C,0xffffffff);
|
||||
_WDWORD(0x400FC080,0xffffffff);
|
||||
|
||||
// PERCLK_PODF: 1 divide by 2
|
||||
_WDWORD(0x400FC01C, 0x04900001);
|
||||
// Enable SYS PLL but keep it bypassed.
|
||||
_WDWORD(0x400D8030, 0x00012001);
|
||||
do
|
||||
{
|
||||
reg = _RDWORD(0x400D8030);
|
||||
}while((reg & 0x80000000) == 0);
|
||||
// Disable bypass of SYS PLL
|
||||
_WDWORD(0x400D8030, 0x00002001);
|
||||
|
||||
// PFD2_FRAC: 29, PLL2 PFD2=528*18/PFD2_FRAC=327
|
||||
// Ungate SYS PLL PFD2
|
||||
_WDWORD(0x400D8100, 0x001d0000);
|
||||
|
||||
// SEMC_PODF: 001, AHB_PODF: 011, IPG_PODF: 01
|
||||
// SEMC_ALT_CLK_SEL: 0 PLL2 (SYS PLL) PFD2
|
||||
// SEMC_CLK_SEL: 1 SEMC_ALT_CLK
|
||||
_WDWORD(0x400FC014, 0x00010D40);
|
||||
}
|
||||
|
||||
FUNC void _sdr_Init(void)
|
||||
{
|
||||
// Config IOMUX
|
||||
_WDWORD(0x401F8014, 0x00000000);
|
||||
_WDWORD(0x401F8018, 0x00000000);
|
||||
_WDWORD(0x401F801C, 0x00000000);
|
||||
_WDWORD(0x401F8020, 0x00000000);
|
||||
_WDWORD(0x401F8024, 0x00000000);
|
||||
_WDWORD(0x401F8028, 0x00000000);
|
||||
_WDWORD(0x401F802C, 0x00000000);
|
||||
_WDWORD(0x401F8030, 0x00000000);
|
||||
_WDWORD(0x401F8034, 0x00000000);
|
||||
_WDWORD(0x401F8038, 0x00000000);
|
||||
_WDWORD(0x401F803C, 0x00000000);
|
||||
_WDWORD(0x401F8040, 0x00000000);
|
||||
_WDWORD(0x401F8044, 0x00000000);
|
||||
_WDWORD(0x401F8048, 0x00000000);
|
||||
_WDWORD(0x401F804C, 0x00000000);
|
||||
_WDWORD(0x401F8050, 0x00000000);
|
||||
_WDWORD(0x401F8054, 0x00000000);
|
||||
_WDWORD(0x401F8058, 0x00000000);
|
||||
_WDWORD(0x401F805C, 0x00000000);
|
||||
_WDWORD(0x401F8060, 0x00000000);
|
||||
_WDWORD(0x401F8064, 0x00000000);
|
||||
_WDWORD(0x401F8068, 0x00000000);
|
||||
_WDWORD(0x401F806C, 0x00000000);
|
||||
_WDWORD(0x401F8070, 0x00000000);
|
||||
_WDWORD(0x401F8074, 0x00000000);
|
||||
_WDWORD(0x401F8078, 0x00000000);
|
||||
_WDWORD(0x401F807C, 0x00000000);
|
||||
_WDWORD(0x401F8080, 0x00000000);
|
||||
_WDWORD(0x401F8084, 0x00000000);
|
||||
_WDWORD(0x401F8088, 0x00000000);
|
||||
_WDWORD(0x401F808C, 0x00000000);
|
||||
_WDWORD(0x401F8090, 0x00000000);
|
||||
_WDWORD(0x401F8094, 0x00000000);
|
||||
_WDWORD(0x401F8098, 0x00000000);
|
||||
_WDWORD(0x401F809C, 0x00000000);
|
||||
_WDWORD(0x401F80A0, 0x00000000);
|
||||
_WDWORD(0x401F80A4, 0x00000000);
|
||||
_WDWORD(0x401F80A8, 0x00000000);
|
||||
_WDWORD(0x401F80AC, 0x00000000);
|
||||
_WDWORD(0x401F80B0, 0x00000010); // EMC_39, DQS PIN, enable SION
|
||||
_WDWORD(0x401F80B4, 0x00000000);
|
||||
_WDWORD(0x401F80B8, 0x00000000);
|
||||
|
||||
// PAD ctrl
|
||||
// drive strength = 0x7 to increase drive strength
|
||||
// otherwise the data7 bit may fail.
|
||||
_WDWORD(0x401F8204, 0x000110F9);
|
||||
_WDWORD(0x401F8208, 0x000110F9);
|
||||
_WDWORD(0x401F820C, 0x000110F9);
|
||||
_WDWORD(0x401F8210, 0x000110F9);
|
||||
_WDWORD(0x401F8214, 0x000110F9);
|
||||
_WDWORD(0x401F8218, 0x000110F9);
|
||||
_WDWORD(0x401F821C, 0x000110F9);
|
||||
_WDWORD(0x401F8220, 0x000110F9);
|
||||
_WDWORD(0x401F8224, 0x000110F9);
|
||||
_WDWORD(0x401F8228, 0x000110F9);
|
||||
_WDWORD(0x401F822C, 0x000110F9);
|
||||
_WDWORD(0x401F8230, 0x000110F9);
|
||||
_WDWORD(0x401F8234, 0x000110F9);
|
||||
_WDWORD(0x401F8238, 0x000110F9);
|
||||
_WDWORD(0x401F823C, 0x000110F9);
|
||||
_WDWORD(0x401F8240, 0x000110F9);
|
||||
_WDWORD(0x401F8244, 0x000110F9);
|
||||
_WDWORD(0x401F8248, 0x000110F9);
|
||||
_WDWORD(0x401F824C, 0x000110F9);
|
||||
_WDWORD(0x401F8250, 0x000110F9);
|
||||
_WDWORD(0x401F8254, 0x000110F9);
|
||||
_WDWORD(0x401F8258, 0x000110F9);
|
||||
_WDWORD(0x401F825C, 0x000110F9);
|
||||
_WDWORD(0x401F8260, 0x000110F9);
|
||||
_WDWORD(0x401F8264, 0x000110F9);
|
||||
_WDWORD(0x401F8268, 0x000110F9);
|
||||
_WDWORD(0x401F826C, 0x000110F9);
|
||||
_WDWORD(0x401F8270, 0x000110F9);
|
||||
_WDWORD(0x401F8274, 0x000110F9);
|
||||
_WDWORD(0x401F8278, 0x000110F9);
|
||||
_WDWORD(0x401F827C, 0x000110F9);
|
||||
_WDWORD(0x401F8280, 0x000110F9);
|
||||
_WDWORD(0x401F8284, 0x000110F9);
|
||||
_WDWORD(0x401F8288, 0x000110F9);
|
||||
_WDWORD(0x401F828C, 0x000110F9);
|
||||
_WDWORD(0x401F8290, 0x000110F9);
|
||||
_WDWORD(0x401F8294, 0x000110F9);
|
||||
_WDWORD(0x401F8298, 0x000110F9);
|
||||
_WDWORD(0x401F829C, 0x000110F9);
|
||||
_WDWORD(0x401F82A0, 0x000110F9);
|
||||
_WDWORD(0x401F82A4, 0x000110F9);
|
||||
_WDWORD(0x401F82A8, 0x000110F9);
|
||||
|
||||
// Config SDR Controller Registers/
|
||||
_WDWORD(0x402F0000,0x10000004); // MCR
|
||||
_WDWORD(0x402F0008,0x00030524); // BMCR0
|
||||
_WDWORD(0x402F000C,0x06030524); // BMCR1
|
||||
_WDWORD(0x402F0010,0x8000001B); // BR0, 32MB
|
||||
|
||||
_WDWORD(0x402F0040,0x00000F31); // SDRAMCR0
|
||||
_WDWORD(0x402F0044,0x00652922); // SDRAMCR1
|
||||
_WDWORD(0x402F0048,0x00010920); // SDRAMCR2
|
||||
_WDWORD(0x402F004C,0x50210A08); // SDRAMCR3
|
||||
|
||||
_WDWORD(0x402F0090,0x80000000); // IPCR0
|
||||
_WDWORD(0x402F0094,0x00000002); // IPCR1
|
||||
_WDWORD(0x402F0098,0x00000000); // IPCR2
|
||||
|
||||
|
||||
_WDWORD(0x402F009C,0xA55A000F); // IPCMD, SD_CC_IPREA
|
||||
SDRAM_WaitIpCmdDone();
|
||||
_WDWORD(0x402F009C,0xA55A000C); // SD_CC_IAF
|
||||
SDRAM_WaitIpCmdDone();
|
||||
_WDWORD(0x402F009C,0xA55A000C); // SD_CC_IAF
|
||||
SDRAM_WaitIpCmdDone();
|
||||
_WDWORD(0x402F00A0,0x00000033); // IPTXDAT
|
||||
_WDWORD(0x402F009C,0xA55A000A); // SD_CC_IMS
|
||||
SDRAM_WaitIpCmdDone();
|
||||
_WDWORD(0x402F004C,0x08080A01 ); // enable sdram self refresh again after initialization done.
|
||||
}
|
||||
|
||||
FUNC void Setup (void) {
|
||||
_loadDcdcTrim();
|
||||
SP = _RDWORD(0x00000000); // Setup Stack Pointer
|
||||
PC = _RDWORD(0x00000004); // Setup Program Counter
|
||||
_WDWORD(0xE000ED08, 0x00000000); // Setup Vector Table Offset Register
|
||||
}
|
||||
|
||||
FUNC void OnResetExec (void) { // executes upon software RESET
|
||||
_clock_init();
|
||||
_sdr_Init();
|
||||
Setup(); // Setup for Running
|
||||
}
|
||||
|
||||
_clock_init();
|
||||
_sdr_Init();
|
||||
|
||||
LOAD %L INCREMENTAL // Download
|
||||
|
||||
Setup(); // Setup for Running
|
||||
|
||||
// g, main
|
@@ -0,0 +1,260 @@
|
||||
/*
|
||||
* Copyright 2018 NXP
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* o Redistributions of source code must retain the above copyright notice, this list
|
||||
* of conditions and the following disclaimer.
|
||||
*
|
||||
* o Redistributions in binary form must reproduce the above copyright notice, this
|
||||
* list of conditions and the following disclaimer in the documentation and/or
|
||||
* other materials provided with the distribution.
|
||||
*
|
||||
* o Neither the name of the copyright holder nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
FUNC void _loadDcdcTrim(void)
|
||||
{
|
||||
unsigned int dcdc_trim_loaded;
|
||||
unsigned long ocotp_base;
|
||||
unsigned long ocotp_fuse_bank0_base;
|
||||
unsigned long dcdc_base;
|
||||
unsigned long reg;
|
||||
unsigned long trim_value;
|
||||
unsigned int index;
|
||||
|
||||
ocotp_base = 0x401F4000;
|
||||
ocotp_fuse_bank0_base = ocotp_base + 0x400;
|
||||
dcdc_base = 0x40080000;
|
||||
|
||||
dcdc_trim_loaded = 0;
|
||||
|
||||
reg = _RDWORD(ocotp_fuse_bank0_base + 0x90);
|
||||
if (reg & (1<<10))
|
||||
{
|
||||
// DCDC: REG0->VBG_TRM
|
||||
trim_value = (reg & (0x1F << 11)) >> 11;
|
||||
reg = (_RDWORD(dcdc_base + 0x4) & ~(0x1F << 24)) | (trim_value << 24);
|
||||
_WDWORD(dcdc_base + 0x4, reg);
|
||||
dcdc_trim_loaded = 1;
|
||||
}
|
||||
|
||||
reg = _RDWORD(ocotp_fuse_bank0_base + 0x80);
|
||||
if (reg & (1<<30))
|
||||
{
|
||||
index = (reg & (3 << 28)) >> 28;
|
||||
if (index < 4)
|
||||
{
|
||||
// DCDC: REG3->TRG
|
||||
reg = (_RDWORD(dcdc_base + 0xC) & ~(0x1F)) | ((0xF + index));
|
||||
_WDWORD(dcdc_base + 0xC, reg);
|
||||
dcdc_trim_loaded = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (dcdc_trim_loaded)
|
||||
{
|
||||
// delay about 400us till dcdc is stable.
|
||||
_Sleep_(1);
|
||||
}
|
||||
}
|
||||
|
||||
FUNC void SDRAM_WaitIpCmdDone(void)
|
||||
{
|
||||
unsigned long reg;
|
||||
do
|
||||
{
|
||||
reg = _RDWORD(0x402F003C);
|
||||
}while((reg & 0x3) == 0);
|
||||
|
||||
_WDWORD(0x402F003C,0x00000003); // clear IPCMDERR and IPCMDDONE bits
|
||||
}
|
||||
|
||||
FUNC void _clock_init(void)
|
||||
{
|
||||
unsigned int reg;
|
||||
// Enable all clocks
|
||||
_WDWORD(0x400FC068,0xffffffff);
|
||||
_WDWORD(0x400FC06C,0xffffffff);
|
||||
_WDWORD(0x400FC070,0xffffffff);
|
||||
_WDWORD(0x400FC074,0xffffffff);
|
||||
_WDWORD(0x400FC078,0xffffffff);
|
||||
_WDWORD(0x400FC07C,0xffffffff);
|
||||
_WDWORD(0x400FC080,0xffffffff);
|
||||
|
||||
// PERCLK_PODF: 1 divide by 2
|
||||
_WDWORD(0x400FC01C, 0x04900001);
|
||||
// Enable SYS PLL but keep it bypassed.
|
||||
_WDWORD(0x400D8030, 0x00012001);
|
||||
do
|
||||
{
|
||||
reg = _RDWORD(0x400D8030);
|
||||
}while((reg & 0x80000000) == 0);
|
||||
// Disable bypass of SYS PLL
|
||||
_WDWORD(0x400D8030, 0x00002001);
|
||||
|
||||
// PFD2_FRAC: 29, PLL2 PFD2=528*18/PFD2_FRAC=327
|
||||
// Ungate SYS PLL PFD2
|
||||
_WDWORD(0x400D8100, 0x001d0000);
|
||||
|
||||
// SEMC_PODF: 001, AHB_PODF: 011, IPG_PODF: 01
|
||||
// SEMC_ALT_CLK_SEL: 0 PLL2 (SYS PLL) PFD2
|
||||
// SEMC_CLK_SEL: 1 SEMC_ALT_CLK
|
||||
_WDWORD(0x400FC014, 0x00010D40);
|
||||
}
|
||||
|
||||
FUNC void _sdr_Init(void)
|
||||
{
|
||||
// Config IOMUX
|
||||
_WDWORD(0x401F8014, 0x00000000);
|
||||
_WDWORD(0x401F8018, 0x00000000);
|
||||
_WDWORD(0x401F801C, 0x00000000);
|
||||
_WDWORD(0x401F8020, 0x00000000);
|
||||
_WDWORD(0x401F8024, 0x00000000);
|
||||
_WDWORD(0x401F8028, 0x00000000);
|
||||
_WDWORD(0x401F802C, 0x00000000);
|
||||
_WDWORD(0x401F8030, 0x00000000);
|
||||
_WDWORD(0x401F8034, 0x00000000);
|
||||
_WDWORD(0x401F8038, 0x00000000);
|
||||
_WDWORD(0x401F803C, 0x00000000);
|
||||
_WDWORD(0x401F8040, 0x00000000);
|
||||
_WDWORD(0x401F8044, 0x00000000);
|
||||
_WDWORD(0x401F8048, 0x00000000);
|
||||
_WDWORD(0x401F804C, 0x00000000);
|
||||
_WDWORD(0x401F8050, 0x00000000);
|
||||
_WDWORD(0x401F8054, 0x00000000);
|
||||
_WDWORD(0x401F8058, 0x00000000);
|
||||
_WDWORD(0x401F805C, 0x00000000);
|
||||
_WDWORD(0x401F8060, 0x00000000);
|
||||
_WDWORD(0x401F8064, 0x00000000);
|
||||
_WDWORD(0x401F8068, 0x00000000);
|
||||
_WDWORD(0x401F806C, 0x00000000);
|
||||
_WDWORD(0x401F8070, 0x00000000);
|
||||
_WDWORD(0x401F8074, 0x00000000);
|
||||
_WDWORD(0x401F8078, 0x00000000);
|
||||
_WDWORD(0x401F807C, 0x00000000);
|
||||
_WDWORD(0x401F8080, 0x00000000);
|
||||
_WDWORD(0x401F8084, 0x00000000);
|
||||
_WDWORD(0x401F8088, 0x00000000);
|
||||
_WDWORD(0x401F808C, 0x00000000);
|
||||
_WDWORD(0x401F8090, 0x00000000);
|
||||
_WDWORD(0x401F8094, 0x00000000);
|
||||
_WDWORD(0x401F8098, 0x00000000);
|
||||
_WDWORD(0x401F809C, 0x00000000);
|
||||
_WDWORD(0x401F80A0, 0x00000000);
|
||||
_WDWORD(0x401F80A4, 0x00000000);
|
||||
_WDWORD(0x401F80A8, 0x00000000);
|
||||
_WDWORD(0x401F80AC, 0x00000000);
|
||||
_WDWORD(0x401F80B0, 0x00000010); // EMC_39, DQS PIN, enable SION
|
||||
_WDWORD(0x401F80B4, 0x00000000);
|
||||
_WDWORD(0x401F80B8, 0x00000000);
|
||||
|
||||
// PAD ctrl
|
||||
// drive strength = 0x7 to increase drive strength
|
||||
// otherwise the data7 bit may fail.
|
||||
_WDWORD(0x401F8204, 0x000110F9);
|
||||
_WDWORD(0x401F8208, 0x000110F9);
|
||||
_WDWORD(0x401F820C, 0x000110F9);
|
||||
_WDWORD(0x401F8210, 0x000110F9);
|
||||
_WDWORD(0x401F8214, 0x000110F9);
|
||||
_WDWORD(0x401F8218, 0x000110F9);
|
||||
_WDWORD(0x401F821C, 0x000110F9);
|
||||
_WDWORD(0x401F8220, 0x000110F9);
|
||||
_WDWORD(0x401F8224, 0x000110F9);
|
||||
_WDWORD(0x401F8228, 0x000110F9);
|
||||
_WDWORD(0x401F822C, 0x000110F9);
|
||||
_WDWORD(0x401F8230, 0x000110F9);
|
||||
_WDWORD(0x401F8234, 0x000110F9);
|
||||
_WDWORD(0x401F8238, 0x000110F9);
|
||||
_WDWORD(0x401F823C, 0x000110F9);
|
||||
_WDWORD(0x401F8240, 0x000110F9);
|
||||
_WDWORD(0x401F8244, 0x000110F9);
|
||||
_WDWORD(0x401F8248, 0x000110F9);
|
||||
_WDWORD(0x401F824C, 0x000110F9);
|
||||
_WDWORD(0x401F8250, 0x000110F9);
|
||||
_WDWORD(0x401F8254, 0x000110F9);
|
||||
_WDWORD(0x401F8258, 0x000110F9);
|
||||
_WDWORD(0x401F825C, 0x000110F9);
|
||||
_WDWORD(0x401F8260, 0x000110F9);
|
||||
_WDWORD(0x401F8264, 0x000110F9);
|
||||
_WDWORD(0x401F8268, 0x000110F9);
|
||||
_WDWORD(0x401F826C, 0x000110F9);
|
||||
_WDWORD(0x401F8270, 0x000110F9);
|
||||
_WDWORD(0x401F8274, 0x000110F9);
|
||||
_WDWORD(0x401F8278, 0x000110F9);
|
||||
_WDWORD(0x401F827C, 0x000110F9);
|
||||
_WDWORD(0x401F8280, 0x000110F9);
|
||||
_WDWORD(0x401F8284, 0x000110F9);
|
||||
_WDWORD(0x401F8288, 0x000110F9);
|
||||
_WDWORD(0x401F828C, 0x000110F9);
|
||||
_WDWORD(0x401F8290, 0x000110F9);
|
||||
_WDWORD(0x401F8294, 0x000110F9);
|
||||
_WDWORD(0x401F8298, 0x000110F9);
|
||||
_WDWORD(0x401F829C, 0x000110F9);
|
||||
_WDWORD(0x401F82A0, 0x000110F9);
|
||||
_WDWORD(0x401F82A4, 0x000110F9);
|
||||
_WDWORD(0x401F82A8, 0x000110F9);
|
||||
|
||||
// Config SDR Controller Registers/
|
||||
_WDWORD(0x402F0000,0x10000004); // MCR
|
||||
_WDWORD(0x402F0008,0x00030524); // BMCR0
|
||||
_WDWORD(0x402F000C,0x06030524); // BMCR1
|
||||
_WDWORD(0x402F0010,0x8000001B); // BR0, 32MB
|
||||
|
||||
_WDWORD(0x402F0040,0x00000F31); // SDRAMCR0
|
||||
_WDWORD(0x402F0044,0x00652922); // SDRAMCR1
|
||||
_WDWORD(0x402F0048,0x00010920); // SDRAMCR2
|
||||
_WDWORD(0x402F004C,0x50210A08); // SDRAMCR3
|
||||
|
||||
_WDWORD(0x402F0090,0x80000000); // IPCR0
|
||||
_WDWORD(0x402F0094,0x00000002); // IPCR1
|
||||
_WDWORD(0x402F0098,0x00000000); // IPCR2
|
||||
|
||||
|
||||
_WDWORD(0x402F009C,0xA55A000F); // IPCMD, SD_CC_IPREA
|
||||
SDRAM_WaitIpCmdDone();
|
||||
_WDWORD(0x402F009C,0xA55A000C); // SD_CC_IAF
|
||||
SDRAM_WaitIpCmdDone();
|
||||
_WDWORD(0x402F009C,0xA55A000C); // SD_CC_IAF
|
||||
SDRAM_WaitIpCmdDone();
|
||||
_WDWORD(0x402F00A0,0x00000033); // IPTXDAT
|
||||
_WDWORD(0x402F009C,0xA55A000A); // SD_CC_IMS
|
||||
SDRAM_WaitIpCmdDone();
|
||||
_WDWORD(0x402F004C,0x08080A01 ); // enable sdram self refresh again after initialization done.
|
||||
}
|
||||
|
||||
FUNC void Setup (void) {
|
||||
_loadDcdcTrim();
|
||||
SP = _RDWORD(0x80000000); // Setup Stack Pointer
|
||||
PC = _RDWORD(0x80000004); // Setup Program Counter
|
||||
_WDWORD(0xE000ED08, 0x80000000); // Setup Vector Table Offset Register
|
||||
}
|
||||
|
||||
FUNC void OnResetExec (void) { // executes upon software RESET
|
||||
_clock_init();
|
||||
_sdr_Init();
|
||||
Setup(); // Setup for Running
|
||||
}
|
||||
|
||||
_clock_init();
|
||||
_sdr_Init();
|
||||
|
||||
LOAD %L INCREMENTAL // Download
|
||||
|
||||
Setup(); // Setup for Running
|
||||
|
||||
g, main
|
3984
board/NXP_EVK_IMXRT1060/keil/hello_world/hello_world.uvoptx
Normal file
3984
board/NXP_EVK_IMXRT1060/keil/hello_world/hello_world.uvoptx
Normal file
File diff suppressed because it is too large
Load Diff
11632
board/NXP_EVK_IMXRT1060/keil/hello_world/hello_world.uvprojx
Normal file
11632
board/NXP_EVK_IMXRT1060/keil/hello_world/hello_world.uvprojx
Normal file
File diff suppressed because it is too large
Load Diff
69
board/NXP_EVK_IMXRT1060/keil/hello_world/readme.txt
Normal file
69
board/NXP_EVK_IMXRT1060/keil/hello_world/readme.txt
Normal file
@@ -0,0 +1,69 @@
|
||||
Overview
|
||||
========
|
||||
The Hello World demo application provides a sanity check for the TencentOS-tiny porting on i.MXRT1050. The Hello
|
||||
World demo creates two tasks. Two tasks print the information with task number and the count of being run by OS.
|
||||
The task 1 also turns to shine the LED.
|
||||
|
||||
Toolchain supported
|
||||
===================
|
||||
- IAR embedded Workbench 8.40.2
|
||||
- Keil MDK 5.29 (ARM Compiler 5 only)
|
||||
|
||||
Hardware requirements
|
||||
=====================
|
||||
- Mini/micro USB cable
|
||||
- EVKB-IMXRT1050 board
|
||||
- Personal Computer
|
||||
|
||||
Board settings
|
||||
==============
|
||||
No special settings are required.
|
||||
|
||||
Prepare the Demo
|
||||
================
|
||||
1. Connect a USB cable between the host PC and the OpenSDA USB port on the target board.
|
||||
2. Open a serial terminal with the following settings:
|
||||
- 115200 baud rate
|
||||
- 8 data bits
|
||||
- No parity
|
||||
- One stop bit
|
||||
- No flow control
|
||||
3. Download the program to the target board.
|
||||
4. Either press the reset button on your board or launch the debugger in your IDE to begin running the demo.
|
||||
|
||||
Running the demo
|
||||
================
|
||||
The log below shows the output of the hello world demo in the terminal window:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Hello world from i.MX RT1060.
|
||||
Welcome to TencentOS tiny
|
||||
++++++++This is Task 1, count is 0
|
||||
********This is Task 2, count is 0
|
||||
++++++++This is Task 1, count is 1
|
||||
++++++++This is Task 1, count is 2
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Note:
|
||||
To download binary into hyper flash and boot from hyperflash directly, following steps are needed:
|
||||
1. Select the target flexspi_nor_debug or flexspi_nor_release.
|
||||
2. Compile the project, and get the binaray file "hello_world.bin"
|
||||
3. Set the SW7: 1 off 2 off 3 off 4 on, then power on the board and connect USB cable to J28
|
||||
4. Drop the binaray into disk "EVK-MIMXRT"
|
||||
5. Wait for the disk disappear and appear again which will take around ~10s, then power off the board
|
||||
6. Set the SW7: 1 off 2 on 3 on 4 off, then power on the board
|
||||
7. After power on the baord, program has already started to run, reset SW4 is recommended.
|
||||
|
||||
Note:
|
||||
To debug in hyper flash in MDK, following steps are needed:
|
||||
1. Select the target flexspi_nor_debug or flexspi_nor_release.
|
||||
2. Compile the project.
|
||||
3. Press F8 or click the download button, to program the application into hyper flash.
|
||||
4. Set the SW7: 1 off 2 on 3 on 4 off, then power on the board
|
||||
5. Push SW4 to reset.
|
||||
6. Start to debug.
|
||||
|
||||
|
||||
Customization options
|
||||
=====================
|
||||
|
Reference in New Issue
Block a user