打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
mini2440

题外话:编译环境选择推荐

对于刚刚接触ARM裸机编程的各位,我要特别的进行提醒一下,就是关于编译环境的选择问题。目前主流的有ADS+AXD,KEIL FOR ARM,IAR FOR ARM三种,我开始使用的ADS+AXD进行学习,因为光盘里面自带,而且很多资料都是他的,但是个人感觉真心调试十分的不方便,而且各种容易死机,并且现在也已经不更新了,北航一本讲嵌入式的书出了一个第二版,就是把ADS换成了KEIL,而且以后KEIL会是主流,因此我推荐选择KEIL进行学习。IAR听我一个同学说也十分好用,但是在网上找有关方面的资料不是很多。而且我想北航一群教授编书都用KEIL进行,说明KEIL自有他的优势,书上这么说了,那以后会有更多学生用,这样慢慢也会更加流行与主流。闲话就说这些。

 正题:Keil for ARM的环境搭建

提醒一下各位就是在keil for ARM进行环境搭建的时候,要注意调试时环境搭建与下载环境的搭建是不同的,因为在下载环境搭建的时候是把程序下载到nor flash里面直接进行运行,而调试环境是把程序下载到RAM里面进行执行。nor flash里面也可以进行调试环境的搭建,但是在nor flash里面只能建立两个端点,而且flash擦写次数有限对寿命有影响。所以不推荐。所以调试的时候推荐在RAM里面进行调试。

配置方法的测试环境:MDK 4.11    JLINK 4.08  开发板是mini2440 其他的环境配置类似,

首先介绍关于程序下载的方法

①建立一个project芯片选择S3C2440(在SAMSUNG里面)并且加入启动代码。

②编辑自己的测试程序。

测试程序如下

  1. #include <S3C2440.H>  
  2. void delay()  
  3. {  
  4.     int i,j;  
  5.     for(i=0;i<10000;i++)  
  6.     {  
  7.         for(j=0;j<50;j++);  
  8.     }  
  9. }  
  10. int main()  
  11. {  
  12.     GPBCON = 0x155555;  
  13.     while(1)  
  14.     {  
  15.         GPBDAT |= 0x1E0;  
  16.         GPBDAT &= 0x1C0;  
  17.         delay();  
  18.           
  19.         GPBDAT |= 0x1E0;  
  20.         GPBDAT &= 0x1A0;  
  21.         delay();  
  22.         GPBDAT |= 0x1E0;  
  23.         delay();  
  24.     }  
  25. }  


实现的两个LED循环间歇显示。

③开始进行工程的配置,配置分为以下几步(程序下载的配置

 

第一步

也是非常要注意的一点就是:打开S3C3440.S这个文件夹,点击

configuration wizard

进入这个界面,把所有选项都勾上。

第二步现在进入Target的配置

现在点击

中的魔棒,出现配置环境。

第三部配置Target这个选项栏。配置如下

后面我会进行介绍为什么需要这样去配置它。编译器回根据这个环境生成一个.sct的文件与之对应,作为程序加载,执行的一些信息。

第四步:进入output这个选项中勾选Creat HEX file,如下图所示。

第五步:进入Utilities这个选择中,选择如下

 

因为在此我使用的是JLINK,再点击setting进行设置,设置情况如下图

对于flash算法的选择可以选择一个相近的,对于我的板子,nor flash是AM29LV160DB,因此我选择了这个类型的nor flash,做完以上配置后,点击OK,不断OK就可以配置成功了。就可以编译,没有任何错误再进行下载。就可以看到LED循环点亮了。 

 

下面是关于程序调试的配置方式。我们调试是在RAM里面进行的。

第一步:同样需要对S3C2440.S进行configuration wizard进行勾选。如果开始已经做了,这步略过。

第二步:进入到配置界面的Target选项栏。进行如下配置。

第三步,进入到output选项栏勾选Creat HEX file,如果已经勾选可以略过。

第四步:进入Debug选项栏,进行如下的配置

Ext_RAM.ini(来自事例程序中)文件代码如下并且要进行修改

  1. FUNC void SetupForStart (void) {  
  2.   
  3. // <o> Program Entry Point  
  4.   PC = 0x30000000;  
  5. }  
  6.   
  7.   
  8. FUNC void Init (void) {  
  9.   
  10.   _WDWORD(0x4A000008, 0xFFFFFFFF);      // Disable All Interrupts  
  11.   
  12.   _WDWORD(0x53000000, 0x00000000);      // Disable Watchdog Timer  
  13.     
  14.                                         // Clock Setup   
  15.                                         // FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz  
  16.   _WDWORD(0x4C000000, 0x0FFF0FFF);      // LOCKTIME  
  17.   _WDWORD(0x4C000014, 0x0000000F);      // CLKDIVN  
  18.   _WDWORD(0x4C000004, 0x00043011);      // MPLLCON  
  19.   _WDWORD(0x4C000008, 0x00038021);      // UPLLCON  
  20.   _WDWORD(0x4C00000C, 0x001FFFF0);      // CLKCON  
  21.   
  22.                                         // Memory Controller Setup for SDRAM  
  23.   _WDWORD(0x48000000, 0x22000000);      // BWSCON  
  24.   _WDWORD(0x4800001C, 0x00018005);      // BANKCON6  
  25.   _WDWORD(0x48000020, 0x00018005);      // BANKCON7  
  26.   _WDWORD(0x48000024, 0x008404F3);      // REFRESH  
  27.   _WDWORD(0x48000028, 0x00000032);      // BANKSIZE  
  28.   _WDWORD(0x4800002C, 0x00000020);      // MRSRB6  
  29.   _WDWORD(0x48000030, 0x00000020);      // MRSRB7  
  30.   
  31.   _WDWORD(0x56000000, 0x000003FF);      // GPACON: Enable Address lines for SDRAM  
  32. }  
  33.   
  34.   
  35. // Reset chip with watchdog, because nRST line is routed on hardware in a way   
  36. // that it can not be pulled low with ULINK  
  37.   
  38. _WDWORD(0x40000000, 0xEAFFFFFE);        // Load RAM addr 0 with branch to itself  
  39. CPSR = 0x000000D3;                      // Disable interrupts  
  40. PC   = 0x40000000;                      // Position PC to start of RAM  
  41. _WDWORD(0x53000000, 0x00000021);        // Enable Watchdog  
  42. g, 0                                    // Wait for Watchdog to reset chip  
  43.   
  44. Init();                                 // Initialize memory  
  45. LOAD .\led.axf INCREMENTAL         // Download program  
  46. SetupForStart();                        // Setup for Running  
  47. g, main                                 // Goto Main  


 

第一个标红的地方即:第三行------PC = 0x30000000是程序的普通入口(entry point),(个人觉得:在我们这个程序中这个普通入口同时也是初始入口)

第二个标红的地方是倒数第三行------LOAD .\led.axf INCREMENTAL需要我们进行修改的地方,要改成与你生成的***.axf文件名相对应。

这里就可以看到你要生成的目标文件名。

进行以上步骤后,就可以点击Debug进行调试了。

 

 

 

 


 

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
02_寄存器模板创建
Keil开发软件使用介绍
在SRAM、FLASH中调试代码的配置方法(附详细步骤)
手把手教你升级Keil MDK的ARM编译器
怎么学用keil c51写正确能用的程序?
作为一个新人,怎样学习嵌入式Linux?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服