历史上的今天
返回首页

历史上的今天

今天是:2025年02月13日(星期四)

正在发生

2019年02月13日 | S3C2440 GPIO例子在ISRAM内仿真分析

2019-02-13 来源:eefocus

在mini2440(S3C2440)的板子上运行LED 的程序,使GPB5输出低电平,点亮LED.

将代码在ISRAM 内仿真


  1.Led_on.s的完整程序如下


程序代码:


  -----------------------------led_on.S----------------------------------------------------


  PRESERVE8    ;保持堆栈8字节对齐,符合新的ARM ABI标准


  AREA    LED,CODE, READONLY

       ENTRY 


START1  

           LDR     R0,=0x56000010          ;@ R0设为GPBCON寄存器。此寄存器

                                                             ;@ 用于选择端口B各引脚的功能:

                                                             ;@ 是输出、是输入、还是其他

           MOV    R1,#0x00000400        

           STR    R1,[R0]                        ;@ 设置GPB5为输出口, 位[10:9]=0b01

           LDR     R0,=0x56000014          ;@ R0设为GPBDAT寄存器。此寄存器

                                                             ;@ 用于读/写端口B各引脚的数据

           MOV     R1,#0x00000000         ;@ 此值改为0x00000020,

                                                             ;@ 可让LED1熄灭

           STR    R1,[R0]                        ;@ GPB5输出0,LED1点亮

MAIN_LOOP

           B       MAIN_LOOP

  END


 ---------------------------------------------------------------------------------------------  


 2.使用分散加载文件GPIO.sct


 ;*************************************************************

; *** Scatter-Loading Description File generated by uVision ***

; *************************************************************

      ;LR_IROM1结尾地址不能超过4KB


      ;因为S3C2440的内部Stepingstone只有4KB,如果超过了4KB ,就必须从NAND搬移代码到SDRAM


;而主程序里并没有搬移的程序,也就是保证装载的程序必须在4KB以内的nand flash里。


;其实还有个隐形的条件。LR_IROM10x00000FE0 最大也只能为0x00000FE0,因为第一条指令的反汇编是


LDR      R0,[PC,#0x0014],要保证PC+0X0014是小于0x1000,当设置为0x00000fe0,这条指令的是把


地址0x00000fe8+0x0014=0x00000FFC的内容装载到R0里,仔细看代码,果真如此。


;PC指针是指向下两条指令的位置:(执行A,取指B,译码C),当执行A指令,PC已经指向C指令位置了。


如果设置成0x00000fe4,那么地址是0x00000fec+0x0014=0x1000,已经不小于0x1000,所以不能设置成0x000000FE4。

------------------------------disassembly----------------------------------------------------


    6:            LDR     R0,=0x56000010      ;@ R0设为GPBCON寄存器。此寄存器 

    7:                                        ;@ 用于选择端口B各引脚的功能: 

    8:                                        ;@ 是输出、是输入、还是其他 

0x00000FE0  E59F0014  LDR      R0,[PC,#0x0014]

    9:             MOV    R1,#0x00000400         

0x00000FE4  E3A01B01  MOV      R1,#0x00000400

   10:            STR    R1,[R0]            ;@ 设置GPB5为输出口, 位[10:9]=0b01 

0x00000FE8  E5801000  STR       R1,[R0]

   11:            LDR     R0,=0x56000014      ;@ R0设为GPBDAT寄存器。此寄存器 

   12:                                        ;@ 用于读/写端口B各引脚的数据 

0x00000FEC  E59F000C  LDR      R0,[PC,#0x000C]

   13:            MOV     R1,#0x00000000      ;@ 此值改为0x00000020, 

   14:                                        ;@ 可让LED1熄灭 

0x00000FF0  E3A01000  MOV      R1,#0x00000000

   15:            STR    R1,[R0]            ;@ GPB5输出0,LED1点亮 

    16: MAIN_LOOP 

0x00000FF4  E5801000  STR       R1,[R0]

   17:            B       MAIN_LOOP 

0x00000FF8  EAFFFFFE B         0x00000FF8

0x00000FFC  56000010  ???PL     

0x00001000  00000000  ANDEQ     R0,R0,R0


     -------------------------------------------------------------------


---------------GPIO.sct-----------------------------------------


LR_IROM1 0x00000FE00x04000000  {    ; load region size_region

  ER_IROM1 0x00000FE0 0x04000000  {  ; load address = executionaddress

   led_on.o (LED, +First)     

   ;*(InRoot$$Sections)

   .ANY (+RO)

  }

  RW_RAM1 0x30000000 UNINIT 0x04000000  {  ; RW data

   .ANY (+RW +ZI)

  }

}


--------------------------------------------------------------------------------


3.实际操作发现进入调试,程序pc会首先跑到0x00000000,而不是我们装载的地方0x00000FE0,


所以我们必须另写一个调试的启动脚本文件,并载keil 里设置


-------------------------GPIO.ini--------------------------------------------


FUNCvoid Setup(void) {

PC = 0x00000FE0;

}


Setup();


---------------------------------------------------------------------------------


代码都准备好了,剩下的工作是在Keil里设置了


在Option for Target“Target1”,或者点击工具栏的魔法棒


推荐阅读

史海拾趣

Echelon公司的发展小趣事

在激烈的市场竞争中,Echelon始终保持对技术的热情和追求。公司不断投入研发资源,对LonWorks技术进行升级和优化,推出了一系列创新的产品和服务。这些新产品和服务不仅提升了Echelon的市场竞争力,还为客户带来了更加高效、便捷的能源管理体验。同时,Echelon还积极与其他科技公司合作,共同研发新技术、新产品,推动整个行业的发展。

台湾双羽公司的发展小趣事

富士通的故事始于1935年,当时它作为一家电信设备制造公司在日本成立。在那个通信技术刚刚起步的时代,富士通凭借其创新精神和卓越的技术实力,迅速在电信设备领域崭露头角。公司最初专注于电话交换机的生产,随着技术的不断进步,富士通逐渐扩大了业务范围,为日本的电信基础设施建设做出了重要贡献。这一阶段的成功,为富士通后续在电子行业的蓬勃发展奠定了坚实的基础。

创世(CS)公司的发展小趣事

随着产品的不断创新和技术的不断突破,创世公司的市场份额逐渐扩大。公司的SD NAND产品已经广泛应用于医疗设备、工业控制、轨道交通、安防、网络设备等多个领域。这一市场布局的成功,不仅提升了创世公司的品牌影响力,也为其在电子行业树立了良好的口碑。同时,创世公司还积极参与各种行业展会和交流活动,与国内外客户建立了广泛的合作关系,进一步拓展了市场。

三环(CCTC)公司的发展小趣事

面对全球化的市场趋势和竞争压力,三环(CCTC)公司制定了国际化战略和全球布局计划。公司将继续加大研发投入力度,提升自主创新能力;同时积极拓展国际市场,加强与国际知名企业的合作与交流;此外还将加强人才培养和引进工作,打造一支高素质、专业化的国际化团队。通过这些措施的实施,三环(CCTC)公司将不断提升自身实力和市场竞争力,为成为全球领先的电子企业而不懈努力。

EPC公司的发展小趣事

某EPC公司注重与产业链上下游企业的合作与共赢。公司与供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和成本控制。同时,公司积极与设备制造商、系统集成商等合作伙伴开展深度合作,共同研发新技术、新产品,为客户提供更加全面的解决方案。通过合作共赢的模式,公司实现了跨越式的发展,成为了电子行业的领军企业之一。

Apex [Apex Microtechnology]公司的发展小趣事

在作为Cirrus Logic分公司运营了五年后,Apex Microtechnology于2012年重新回归独立私营状态。这次变革使得Apex Microtechnology能够更加灵活地应对市场变化,加速产品创新和研发。同时,公司也扩大了其业务范围,进一步巩固了在电子行业的地位。

问答坊 | AI 解惑

基于51单片机的低频信号发生器设计

Proteus版本7.1,可以在迅雷搜狗里面搜,可以下载。 里面附源程序 [ 本帖最后由 cqzy6666 于 2009-4-10 20:39 编辑 ]…

查看全部问答>

初学者找单片机开发板,仿真器资料这里来

北京三恒星科技公司(www.sanhengxing.com)是一家专门研发DSP/EDA/ARM开发板、仿真器、实验箱,从事单片机硬件和软件应用及教育的企业,承接单片机项目、电子产品设计开发板的开发(包括DSP、ARM、EDA、51单片机编程器,仿真器等系列产品),并整理了 ...…

查看全部问答>

PCI_BUS_ROOT没有定义?

我从网上下的一个2440的CE 6.0的BSP包,基于它想构建一个CE 6.0的系统,但是编译出错: mdk2440a_ARMV4I_Debug\\postproc\\PBUserProjects.reg fmerge for Windows CE (Release) (Built on Apr  5 2006 11:32:16) Error - variable \ ...…

查看全部问答>

LPC2460 USB HOST 驱动例程哪里找

1.一定要是主机驱动 2.NXP LPC 24XX 系列以下的,我都看过,是模拟设备的,和我们的任务开发板处理设备数据不符。 留下我的联系方式 msn:lvz89871037@163.com …

查看全部问答>

在c语言中const能这样用吗?

const   main_item_dealer_arr[] = {         menu_set_time,                                  ...…

查看全部问答>

求助(为什么在vista下我的usb driver一直在IRP_MJ_PNP例程中出不来,直到超时)

在vista下我的usb driver一直在IRP_MJ_PNP例程中出不来,直到超时,但能进行读写, 只是移出设备后,设备管理器没有反应了,要强行重启计算机.我猜应该是PNP配置的时候出了问题,但不知道在vista下usb PNP块有什么特别要求,(在XP上一切正常).不知道那位高 ...…

查看全部问答>

我的U盘坏了,怎么办啊?

我今天插U盘的时候,忽然说你的磁盘未被格式化,我晕,我昨天还好好的今天为什么变成这样的,麻烦大家给想想办法,来挽回我的1GU盘的数据,我谢谢大家了,再次提醒:我的U盘上有重要东西啊…

查看全部问答>

关于PIC单片机的“休眠”和“唤醒”

关于PIC单片机的“休眠”和“唤醒”自己还是不太会用。希望各位大虾能给点指导。现在主要是用PIC12F635单片机。用其中一个引脚GP0做为按键输入,其中一个引脚GP4作为输出。要达到的效果就是:平时都是“休眠”状态,当有按键按下时,单片机立即“唤 ...…

查看全部问答>

发送固定个数脉冲的方法

需要输出500hz的方波,但是只输出20个周期。 我自己的方案,使用定时器输出500hz的方波,利用系统滴答始终计数40ms,然后关闭定时器。(此方案有个问题,经常会出现,定时器不工作的时候,一直处于高电平。) 在网上看到有用两个定时器,一 ...…

查看全部问答>