TQ2440 在Keil V5 MDK下创建工程 并 使用Jlink 在RAM调试 方法

来源:互联网 发布:酷狗软件 编辑:程序博客网 时间:2024/05/13 15:55

下面以点亮LED的裸机实验为例,讲述Tq2440开发板,使用Keil软件编写程序创建工程,并使用Jlink v8在RAM调试程序的流程。

一、准备工作:

1.软件:Keil mdk511a ,Jlink相关驱动程序

2.硬件:TQ2440开发板(S3C2440A芯片 ARM920T),Jlink V8以及相关转接线

二、创建Keil工程:

1.先在磁盘创建工程目录例如LED。打开keil,选择菜单Project->New uVision Project...在对话框选择刚刚创建的led目录,并取工程名为led,单击保存。如图1.

图1

2.选择芯片型号为S3C2440A,单击ok进入下一步,见图2。

图2

3.在弹出的“Copy ‘S3C2440.s’to Project Folder and Add File to Project?”对话框中选择“是”(这个很重要,见图3)。

图3

4.复制编写好的源码文件例如“Main.c”到工程目录”LED“;将文件添加到工程:如图4在工程资源管理器下选中Target-SourceGroup1(可更名)右键选择Add Existing File to Group‘Source Group1’...在弹出的对话框中将刚刚复制到LED目录下的Main.c加入。在图5中选择Main.c后单击add后单击close。

图4

图5

三、配置Keil工程:

1.单击图6所示魔术棒图标或在图4所示工程资源管理器下选中target1右键选择Options for Target‘Target1’...,进入工程配置页。

图6

2.Target标签的配置如图7所示:

图7

3.Output及Listing标签的配置如图8。先需在工程目录led下创建DEBUG目录。

图8

4.Linker标签设置如下图9:注意:Scatter File中是没有内容的 否则出错!

图9

5.Debug标签配置如图10。

1)”Run to main()“选项貌似是这样子的:不勾选它时,调试时程序会等候在main函数开始;勾选它调试时,程序会直接跑起来,根本停不下来啊(当然在main函数开始处添加断点可以让程序停在那里)

2)Ext_RAM.ini用于初始化RAM,它与工程无关,但这是在RAM调试程序必须的。在工程目录LED下创建文本文件,命名为Ext_RAM.ini,复制如下代码到该文件:注意PC = 0x30000000和 LOAD .\LED.axf INCREMENTAL这两句的作用,前者与图7配置有何关系?(这似乎和main入口并无关系,它是启动文件s3c2440.s编译链接后的首地址似乎也是TQ2440开发板RAM首地址)后者是编译完成后用于debug的文件。

FUNC void SetupForStart (void) {// <o> Program Entry Point  PC = 0x30000000;}FUNC void Init (void) {  _WDWORD(0x4A000008, 0xFFFFFFFF);      // Disable All Interrupts  _WDWORD(0x53000000, 0x00000000);      // Disable Watchdog Timer                                         // Clock Setup                                        // FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz  _WDWORD(0x4C000000, 0x0FFF0FFF);      // LOCKTIME  _WDWORD(0x4C000014, 0x0000000F);      // CLKDIVN  _WDWORD(0x4C000004, 0x00043011);      // MPLLCON  _WDWORD(0x4C000008, 0x00038021);      // UPLLCON  _WDWORD(0x4C00000C, 0x001FFFF0);      // CLKCON                                        // Memory Controller Setup for SDRAM  _WDWORD(0x48000000, 0x22000000);      // BWSCON  _WDWORD(0x4800001C, 0x00018005);      // BANKCON6  _WDWORD(0x48000020, 0x00018005);      // BANKCON7  _WDWORD(0x48000024, 0x008404F3);      // REFRESH  _WDWORD(0x48000028, 0x00000032);      // BANKSIZE  _WDWORD(0x4800002C, 0x00000020);      // MRSRB6  _WDWORD(0x48000030, 0x00000020);      // MRSRB7  _WDWORD(0x56000000, 0x000003FF);      // GPACON: Enable Address lines for SDRAM}// Reset chip with watchdog, because nRST line is routed on hardware in a way// that it can not be pulled low with ULINK_WDWORD(0x40000000, 0xEAFFFFFE);        // Load RAM addr 0 with branch to itselfCPSR = 0x000000D3;                      // Disable interruptsPC   = 0x40000000;                      // Position PC to start of RAM_WDWORD(0x53000000, 0x00000021);        // Enable Watchdogg, 0                                    // Wait for Watchdog to reset chipInit();                                 // Initialize memoryLOAD .\LED.axf INCREMENTAL         // Download programSetupForStart();                        // Setup for Runningg, main 

  一些发现: 上面的init();函数前面5行注释掉后并不会对后面的调试产生影响。g ,main 语句可有可无。如果他被注释调试时从s3c2440.s文件开始,然后才跳到main(),如果没被注释,调试时从main开始(如果按照图10配置的话),但并不意味着s3c2440.s文件的代码没有执行。程序只是停在了main入口处。

图10

6.Utilities标签的配置。

图11

7.所有标签页配置完后单击ok保存配置。

三、编译与调试

1.连接好硬件电路:如图12。jlink一端连好PC的usb口,另一端通过转接板连接到开发板JTAG口。将开发板nand/nor选择开关置于nor,打开开发板电源。(PS:没有开始调试时,如果jlink指示灯在闪烁,说明jlink驱动不正确,,呵呵。。。)

图12

2.编译并进入调试如图13,14

图13

图14

3.至此,可以像调试51单片机一样调试ARM裸机程序啦。(单步,断点......)

                                                                                               一些效果



附、点亮LED工程 Main.c源码

#include<s3c2440.h>void Led_port_init(void);#define LED1_ON   ~(1<<5)#define LED2_ON   ~(1<<6)#define LED3_ON   ~(1<<7)#define LED4_ON   ~(1<<8)#define LED1_OFF   (1<<5)#define LED2_OFF   (1<<6)#define LED3_OFF   (1<<7)#define LED4_OFF   (1<<8)/*************************************************Function name: delayParameter    : timesDescription : 延时函数Return : voidArgument     : voidAutor & date :**************************************************/void delay(int times){    int i;    for(;times>0;times--)      for(i=0;i<400;i++);}/*************************************************Function name: MainParameter    : voidDescription : 主功能函数Return : voidArgument     : voidAutor & date :**************************************************/int  main(void){    int i;        Led_port_init();        for(i=0;i<100;i++)    {    /* 全亮 */    GPBDAT = GPBDAT&(LED1_ON)&(LED2_ON)&(LED3_ON)&(LED4_ON);    delay(10000);        /* 全灭 */    GPBDAT = GPBDAT|(LED1_OFF)|(LED2_OFF)|(LED3_OFF)|(LED4_OFF);        delay(10000);    }}/*************************************************Function name: Led_port_initParameter    : voidDescription : TQ2440开发板有4个引脚连接了LED发光               二极管,分别是GPB5--LED1,GPB6—LED2               GPB7--LED3,GPB8--LED4,该函数的作用               是对其个引脚进行初始化。Return : voidArgument     : voidAutor & date : Daniel**************************************************/   void Led_port_init(void){   /*设置GPB5-GPB8为输出端口*/   GPBCON &= ~((3<<10)|(3<<12)|(3<<14)|(3<<16));   GPBCON |= (1<<10)|(1<<12)|(1<<14)|(1<<16);}

参考googlemi的文章 在此表示感谢

http://blog.csdn.net/googlemi/article/details/8743331









0 0