|
用stm32的时候,习惯在sram上调试程序,省去flash下载的麻烦
现在用lpc1788后,也打算在sdram上调试程序了,结果好几天了 还是没有搞定如何在sdram调试程序
flash上运行时,sdram可以正常运行,但是现在用sdram调试,第一条指令初始化是正常的,但是运行就跑飞,出现错误:
**JLink Warning: T-bit of XPSR is 0 but should be 1. Changed to 1
我用的调试配置文件如下,是从程序上的时钟和sdram配置改的,也参考了网上的意见,但是网上也没有看到有人在sdram上调试成功的
lpc1788_debug_sdram.ini
- /******************************************************************
- * File: LPC43XX_E_SDRAM_KEIL_DEBUG.ini
- *
- * Date: October 2012 Author: NXP
- *
- * KEIL µVision INI file for initialisation of LPC43xx when debugging code
- * running from external SDRAM @ 0x28000000. The SDRAM must be initialized
- * before the debugger can load the image to it.
- * This use case is just for debugging, in a real application the code
- * which goes into SDRAM will come from an external flash and the startup
- * code needs to initialize the SDRAM and relocate the image.
- *
- * This script initializes the SDRAM on the KEIL MCB4300 board.
- *
- ******************************************************************/
- FUNC void Setup (unsigned int region) {
- region &= 0xFF000000;
- // _WDWORD(0x40043100, 0); // Set the shadow pointer to zero (can't map SDRAM to 0)
- SP = _RDWORD(region); // Setup Stack Pointer
- PC = _RDWORD(region + 4); // Setup Program Counter
- _WDWORD(0xE000ED08, region); // Set the vector table offset
- }
- FUNC void Clock_Setup (void) {
- _WDWORD(0x400FC1A0, 0x00000021); // Enable the crystal oscillator
- while((_RDWORD(0x400FC1A0) & (1<<6)) == 0); // delay wait for oscillator to start
- _WDWORD(0x400FC10C, 0x00000001); // select crystal oscillator
- _WDWORD(0x400FC084, 0x00000009); // Configure PLL0 to multiply x 10 for 120 MHz operation from 12 MHz crystal
- _WDWORD(0x400FC080, 0x00000001); // PLL0 Enable
- _WDWORD(0x400FC08C, 0x000000AA); //
- _WDWORD(0x400FC08C, 0x00000055); //
-
- while((_RDWORD(0x400FC088) & (1<<10)) == 0); // Wait for PLOCK0
-
- _WDWORD(0x400FC104, 0x00000101); //PLL0 not divide as the cpuclock
- _WDWORD(0x400FC100, 0x00000001); //cpuclock / 2 as the emcclock
- _WDWORD(0x400FC0C4, 0x00000800); //emcclock enable
- _WDWORD(0x400FC1B0, 0x00000003); //120M support
- }
- FUNC void LPC1788_setupEmc (void)
- {
- // Setup pins for external data/address bus
- _WDWORD(0x4002C180, (1 << 9)|1); // D0, P3.0
- _WDWORD(0x4002C184, (1 << 9)|1); // D1, P3.1
- _WDWORD(0x4002C188, (1 << 9)|1); // D2, P3.2
- _WDWORD(0x4002C18C, (1 << 9)|1); // D3, P3.3
- _WDWORD(0x4002C190, (1 << 9)|1); // D4, P3.4
- _WDWORD(0x4002C194, (1 << 9)|1); // D5, P3.5
- _WDWORD(0x4002C198, (1 << 9)|1); // D6, P3.6
- _WDWORD(0x4002C19C, (1 << 9)|1); // D7, P3.7
- _WDWORD(0x4002C1A0, (1 << 9)|1); // D8, P3.8
- _WDWORD(0x4002C1A4, (1 << 9)|1); // D9, P3.9
- _WDWORD(0x4002C1A8, (1 << 9)|1); // D10, P3.10
- _WDWORD(0x4002C1AC, (1 << 9)|1); // D11, P3.11
- _WDWORD(0x4002C1B0, (1 << 9)|1); // D12, P3.12
- _WDWORD(0x4002C1B4, (1 << 9)|1); // D13, P3.13
- _WDWORD(0x4002C1B8, (1 << 9)|1); // D14, P3.14
- _WDWORD(0x4002C1BC, (1 << 9)|1); // D15, P3.15
- _WDWORD(0x4002C200, (1 << 9)|1); // A0, P4.0
- _WDWORD(0x4002C204, (1 << 9)|1); // A1, P4.1
- _WDWORD(0x4002C208, (1 << 9)|1); // A2, P4.2
- _WDWORD(0x4002C20C, (1 << 9)|1); // A3, P4.3
- _WDWORD(0x4002C210, (1 << 9)|1); // A4, P4.4
- _WDWORD(0x4002C214, (1 << 9)|1); // A5, P4.5
- _WDWORD(0x4002C218, (1 << 9)|1); // A6, P4.6
- _WDWORD(0x4002C21C, (1 << 9)|1); // A7, P4.7
- _WDWORD(0x4002C220, (1 << 9)|1); // A8, P4.8
- _WDWORD(0x4002C224, (1 << 9)|1); // A9, P4.9
- _WDWORD(0x4002C228, (1 << 9)|1); // A10, P4.10
- _WDWORD(0x4002C22C, (1 << 9)|1); // A11, P4.11
- _WDWORD(0x4002C230, (1 << 9)|1); // A12, P4.12
- _WDWORD(0x4002C234, (1 << 9)|1); // A13, P4.13
- _WDWORD(0x4002C238, (1 << 9)|1); // A14, P4.14
- _WDWORD(0x4002C264, (1 << 9)|1); // WEN, P4.25
- _WDWORD(0x4002C140, (1 << 9)|1); // CAS, P2.16
- _WDWORD(0x4002C144, (1 << 9)|1); // RAS, P2.17
- _WDWORD(0x4002C148, (1 << 9)|1); // CLK, P2.18
- _WDWORD(0x4002C150, (1 << 9)|1); // DYCS,P2.20
- _WDWORD(0x4002C160, (1 << 9)|1); // CKE, P2.24
- _WDWORD(0x4002C170, (1 << 9)|1); // DMQ0,P2.28
- _WDWORD(0x4002C174, (1 << 9)|1); // DMQ1,P2.29
- _WDWORD(0x400FC1DC, 0x00001010); // (0x1010+1)* 250ps
- // Initialize EMC
- _WDWORD(0x2009C000, 0x00000001); // CONTROL=1 = Enable EMC
- _WDWORD(0x2009C008, 0x00000000); // CONFIG=0
- _WDWORD(0x2009C100, 0x00000680); // DYNAMICCONFIG0
- _WDWORD(0x2009C104, 0x00000202); // DYNAMICRASCAS0
- _WDWORD(0x2009C028, 0x00000001); // DYNAMICREADCONFIG
- _WDWORD(0x2009C030, 0x00000001); // DYNAMICRP
- _WDWORD(0x2009C034, 0x00000003); // DYNAMICRAS
- _WDWORD(0x2009C038, 0x00000000); // DYNAMICREX
- _WDWORD(0x2009C03C, 0x00000001); // DYNAMICAPR
- _WDWORD(0x2009C040, 0x00000005); // DYNAMICDAL
- _WDWORD(0x2009C044, 0x00000001); // DYNAMICWR
- _WDWORD(0x2009C048, 0x00000004); // DYNAMICRC
- _WDWORD(0x2009C04C, 0x00000004); // DYNAMICRFC
- _WDWORD(0x2009C050, 0x00000005); // DYNAMICXSR
- _WDWORD(0x2009C054, 0x00000001); // DYNAMICRRD
- _WDWORD(0x2009C058, 0x00000001); // DYNAMICMRD
- _WDWORD(0x2000C020, 0x00000183); // DYNAMICCONTROL - NOP
- _WDWORD(0x2000C020, 0x00000103); // DYNAMICCONTROL - PRECHARGE_ALL
- _WDWORD(0x2000C024, 0x0000001D); // DYNAMICREFRESH = 1D
- _WDWORD(0x2009C020, 0x00000083); // DYNAMICCONTROL - MODE
- _RDWORD(0xA0000000 | (0x23<<12));// Write 16-bit SDRAM Mode register burst 8- this is a read as requested by the SDRAM spec
- _WDWORD(0x2009C020, 0x00000000); // DYNAMICCONTROL - NORMAL
- _WDWORD(0x2009C100, 0x00080680); // DYNAMICCONFIG0
- }
- FUNC void mpu_region_setup(unsigned int a_addr,
- unsigned int a_region,
- unsigned int a_size,
- unsigned int a_ap,
- unsigned int a_mem_attrib,
- unsigned int a_srd,
- unsigned int a_XN,
- unsigned int a_enable)
- {
- // Setup procedure for each region
- unsigned int temp;
- temp = (a_addr & 0xFFFFFFE0) | (a_region & 0xF) | 0x10 ;
- _WDWORD(0xE000ED9C, temp); // RBAR
- temp = ((a_XN & 0x1)<<28) | ((a_ap & 0x7)<<24) | ((a_mem_attrib & 0x3F)<<16) | ((a_srd&0xFF)<<8) | ((a_size & 0x1F)<<1)| (a_enable & 0x1) ;
- // temp = ((a_ap & 0x7)<<24) | ((a_size & 0x1F)<<1)| (a_enable & 0x1) ;
- _WDWORD(0xE000EDA0, temp); // RASR
- _WDWORD(0xE000ED94, 1); // MPU enable
- }
- Clock_Setup();
- //# Initialize the external memory interface. If booting in EMC mode,
- //# the bootloader initializes the EMC, but enables only A[13:0].
- LPC1788_setupEmc();
- //# The LOAD command downloads the image to the memory region specified by the linker script as load region.
- LOAD %L INCREMENTAL
- //mpu_region_setup( 0xA0000000,
- // 7, // always reprogramming MPU region 7
- // 0x18,//32MB
- // 3, // full access
- // 0, // strongly ordered, shareable
- // 0, // subregion disabled
- // 0, // allow instruction execution
- // 1) ; // region enabled
- mpu_region_setup( 0xA0000000,0,0x18,3,7,0,0,1);
- //# Get ready to execute image in the given memory region
- Setup(0xA0000000);
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|