历史上的今天
返回首页

历史上的今天

今天是:2024年09月03日(星期二)

正在发生

2021年09月03日 | 一起学mini2440裸机开发(二)--MDK自带的S3C2440.s分析

2021-09-03 来源:eefocus

上一节,咱们在建立工程的时候,默认的是使用MDK自带的启动代码,这些启动代码到底做了什么工作呢?在这里我想探究一下,探究不全没什么事,能看懂个大概就行了。


我先申明一下,其实我并不是头一次学ARM裸机,我先前已经按照韦东山的使用arm-linux-gcc在linux下编译裸机程序的方法走了一遍了,用那个方法的话对以后的uboot移植非常有帮助,但是有一个不方便的就是,使用Linux系统下编译裸机程序,很多自带的库函数不能用,比如print()函数我都不能用,主要是我的水平不行,不会用,其实可以用的。所以现在想认真的再用编译器学一下ARM裸机,裸机学好了,对驱动开发很有帮助的。


所以,很可能我讲的可能细节上照顾不到没接触过ARM裸机的,在此深感抱歉。我也只是想把自己的学习弄成笔记而已。


言归正传,下面进行S3C2440.s的分析,初学者这一节可以略过。


1、首先,了解一下这个文件都要完成那些功能。


     ①看门狗初始化(可以选择是否初始化)


     ②时钟初始化(可以选择是否初始化)


     ③存储控制器初始化(可以选择是否初始化)


     ④GPIO口初始化(可以选择是否初始化)


     ⑤堆栈初始化(没有选择性,必须初始化)


     ⑥跳转到C文件的main函数执行


2、其实知道上面文件做了哪些工作就行了,下面具体分析一下


    


;/*****************************************************************************/

;/* S3C2440.S: Startup file for Samsung S3C2440                                */

;/*****************************************************************************/

;/*


;*启动代码S3C2440.S是在CPU复位后执行的。这个文件会根据以下的


;*SET标志来进行翻译执行。


;*NO_CLOCK_SETUP:启动代码不初始化时钟(这种情况大多出现在时钟已经在script.ini文件中初始化时)


;*NO_MC_SETUP:启动代码不初始化寄存器控制器。


;*NO_GP_SETUP:启动代码不初始化GPIO口


;* RAM_INTVEC:启动代码将异常向量表从执行地址处复制到RAM中去


CPSR中的低8位。I:IRQ中断禁止位,置位禁止。F:FIQ中断禁止位,置位禁止。 T:CPU状态位(ARM或者THUMB)。M4-M0:工作模式选择位


7 6 5 4 3 2 1 0

I F T M4 M3 M2 M1 M0


程序状态寄存器的格式

M[4:0] 工作模式

10000 用户模式

10001 快中断模式

10010 中断模式

10011 管理模式

10111 数据访问中止模式

11011 未定义指令中止模式

11111 系统模式

;状态寄存器CPSR中的标准的模式位和中断位的宏定义


Mode_USR        EQU     0x10   ;用户模式

Mode_FIQ        EQU     0x11     ;快中断模式

Mode_IRQ        EQU     0x12    ;中断模式

Mode_SVC        EQU     0x13   ;管理模式

Mode_ABT        EQU     0x17   ;数据访问中止模式

Mode_UND        EQU     0x1B  ;未定义指令中止模式

Mode_SYS        EQU     0x1F   ;系统模式


I_Bit           EQU     0x80            ; when I bit is set, IRQ is disabled

F_Bit           EQU     0x40            ; when F bit is set, FIQ is disabled


;栈(Stack)设置。不同工作模式的堆栈寄存器sp不一样。


;设置栈空间

UND_Stack_Size  EQU     0x00000000  ;未定义模式

SVC_Stack_Size  EQU     0x00000008  ;管理模式栈长度

ABT_Stack_Size  EQU     0x00000000  ;数据访问中止模式栈长度

FIQ_Stack_Size  EQU     0x00000000   ;快中断模式栈长度

IRQ_Stack_Size  EQU     0x00000080  ;中断模式栈长度

USR_Stack_Size  EQU     0x00000400 ;用户模式栈长度


ISR_Stack_Size  EQU     (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size +

                         FIQ_Stack_Size + IRQ_Stack_Size)      ;所有的堆栈大小进行相加,得到总堆栈大小


;/*******************************************************************************************************


;arm的汇编程序由段组成,段是相对独立的指令或数据单位,每个段由AREA伪指令定义,并定义段的属性


;READWRITE(读写)READONLY(只读)NOINIT(不初始化内存单元或将内存写0) 


;*********************************************************************************************************/


                AREA    STACK, NOINIT, READWRITE, ALIGN=3  ;定义栈段,段名为STACK,字节对齐方式


Stack_Mem       SPACE   USR_Stack_Size   ;SPACE指令用于分配一块内存单元。这里分别为这两个栈分配对应

__initial_sp    SPACE   ISR_Stack_Size        ;长度的内存空间

Stack_Top    EQU  Stack_Mem + ISR_Stack_Size ;//定义栈开始地址(最大地址,堆栈向下访问)



;堆(heap)配置


;堆大小(单位:字节)


Heap_Size       EQU     0x00000000  ;系统的堆空间设定//定义堆空间大小(配合最后的动态内存申请使用)


                AREA    HEAP, NOINIT, READWRITE, ALIGN=3  ;定义堆段,段名:HEAP,不初始化内存,可读写,字节对齐

__heap_base

Heap_Mem        SPACE   Heap_Size     ;申请堆的内存空间

__heap_limit



;-----------------------存储器设定 ------------------------------------

IRAM_BASE       EQU     0x40000000   ;内存基地址



;-----------------------看门狗定义 ----------------------------


WT_BASE         EQU     0x53000000      ; 看门狗寄存器基地址

WTCON_OFS       EQU     0x00            ; 看门狗控制寄存器 对应基地址的偏移值

WTDAT_OFS       EQU     0x04            ; 看门狗数据寄存器  对应基地址的偏移值

WTCNT_OFS       EQU     0x08            ; 看门狗计数寄存器 对应基地址的偏移值


;看门狗时钟设置

WT_SETUP        EQU     1           ;看门狗设置

WTCON_Val       EQU     0x00000000   ;看门狗控制寄存器相关

WTDAT_Val       EQU     0x00008000    ;看门狗数据寄存器相关



;----------------------- 时钟管理定义 ----------------


CLOCK_BASE      EQU     0x4C000000      ; 时钟寄存器基地址

LOCKTIME_OFS    EQU     0x00            ;PLL锁定时间计数器对应基地址的偏移值

MPLLCON_OFS     EQU     0x04            ; MPLL配置寄存器对应基地址的偏移值

UPLLCON_OFS     EQU     0x08            ; UPLL配置寄存器对应基地址的偏移值

CLKCON_OFS      EQU     0x0C            ; 时钟控制器对应基地址的偏移值

CLKSLOW_OFS     EQU     0x10            ; 慢时钟控制寄存器对应基地址的偏移值

CLKDIVN_OFS     EQU     0x14            ; 时钟分频控制器对应基地址的偏移值

CAMDIVN_OFS     EQU     0x18            ; 摄像时钟分频控制器对应基地址的偏移值


;时钟相关寄存器设置值的宏定义

CLOCK_SETUP     EQU     0                   ;时钟设置   ;在以后的实验里,我会将它设置为1,这样做是为了让系统在运行时就对时钟进行初始化

LOCKTIME_Val    EQU     0x0FFF0FFF  ;PLL锁定时间计数器 值

MPLLCON_Val     EQU     0x00043011   ;MPLL控制寄存器  值    ;设置FCLK=300MHz

UPLLCON_Val     EQU     0x00038021   ;UPLL控制寄存器   值

CLKCON_Val      EQU     0x001FFFF0    ;时钟控制器    值

CLKSLOW_Val     EQU     0x00000004    ;慢时钟控制器    值

CLKDIVN_Val     EQU     0x0000000F     ; 时钟分频控制器   值    ;设置分频比为1:3:6,UCLK=48MHz

CAMDIVN_Val     EQU     0x00000000    ;摄像时钟分频器   值



;----------------------- 存储器控制设定 -------------------------


MC_BASE         EQU     0x48000000      ; 存储器控制器基地址

BWSCON_OFS      EQU     0x00            ; 位宽和等待控制寄存器    偏移值

BANKCON0_OFS    EQU     0x04            ;BANK0控制寄存器   偏移值

BANKCON1_OFS    EQU     0x08            ; BANK1控制寄存器   偏移值

BANKCON2_OFS    EQU     0x0C            ; BANK2控制寄存器   偏移值

BANKCON3_OFS    EQU     0x10            ; BANK3控制寄存器   偏移值

BANKCON4_OFS    EQU     0x14            ; BANK4控制寄存器   偏移值

BANKCON5_OFS    EQU     0x18            ; BANK5控制寄存器   偏移值

BANKCON6_OFS    EQU     0x1C            ; BANK6控制寄存器   偏移值

BANKCON7_OFS    EQU     0x20            ;BANK7控制寄存器   偏移值

REFRESH_OFS     EQU     0x24            ; SDRAM刷新控制寄存器   偏移值

BANKSIZE_OFS    EQU     0x28            ; BANKSIZE寄存器    偏移值

MRSRB6_OFS      EQU     0x2C            ; SDRAM控制寄存器  偏移值

MRSRB7_OFS      EQU     0x30            ; SDRAM控制寄存器   偏移值



;存储控制器的相应的设置值

MC_SETUP        EQU     0          ;存储控制器设定

BWSCON_Val      EQU     0x22000000   ;总线宽度和等待控制器   值

BANKCON0_Val    EQU     0x00000700  ;Boor  ROM控制器  值

BANKCON1_Val    EQU     0x00000700  ;BANK1控制  值

BANKCON2_Val    EQU     0x00000700  ;BANK2控制  值

BANKCON3_Val    EQU     0x00000700  ;BANK3控制  值

BANKCON4_Val    EQU     0x00000700  ;BANK4控制  值

BANKCON5_Val    EQU     0x00000700  ;BANK5控制  值

BANKCON6_Val    EQU     0x00018005  ;BANK6控制  值

BANKCON7_Val    EQU     0x00018005  ;BANK7控制  值

REFRESH_Val     EQU     0x008404F3   ;DRAM/SDRAM刷新控制

BANKSIZE_Val    EQU     0x00000032    ;存储器大小控制

MRSRB6_Val      EQU     0x00000020     ;SDRAM的模式设置寄存器  控制

推荐阅读

史海拾趣

HP(Keysight)公司的发展小趣事

HP(Keysight)公司发展故事

故事一:初创时期的艰辛与突破

HP(惠普)的起源可以追溯到1939年,由威廉·惠普(William Hewlett)和戴维·欧文(David Packard)在美国加州的一个小车库内创立。最初,他们专注于生产音频振荡器,这是一种用于测试音频设备的设备。尽管条件简陋,但凭借过人的技术和敏锐的市场洞察力,他们的产品很快获得了市场的认可。这一成功为公司奠定了坚实的基础,也为后续进入电子仪器和计算机领域铺平了道路。

故事二:半导体技术的先驱

1940年,HP公司开发出了第一台采用半导体技术的电子计算机,这在当时是一项革命性的成就。这台计算机不仅能够执行复杂的计算任务,还标志着HP在半导体技术领域的领先地位。这一突破不仅为公司赢得了业界的尊重,也为后续的微型计算机和个人计算机的发展奠定了基础。

故事三:微型计算机市场的开拓者

1960年,HP公司再次引领行业潮流,开发出了世界上第一台商用微型计算机。这台计算机采用了更小的集成电路,比之前的计算机更加小巧、便宜且易于使用。这一创新不仅降低了计算机的门槛,使得更多人能够接触到计算机,也推动了计算机技术的普及和应用。HP在微型计算机市场的成功,进一步巩固了其在电子行业的领导地位。

故事四:个人电脑市场的崛起

进入70年代,HP公司开始涉足个人电脑市场。1970年,HP发布了第一台商业个人计算机(PC),这一举措标志着公司正式进入了一个全新的业务领域。随着个人电脑市场的迅速发展,HP不断推出新产品,满足消费者的多样化需求。从早期的台式机到后来的笔记本电脑,HP始终保持着技术领先优势,为用户带来更加便捷、高效的计算体验。

故事五:并购与多元化发展的战略

在发展过程中,HP公司也通过并购等方式不断拓展业务领域。2002年,HP以250亿美元收购了康柏(Compaq),这是当时科技行业最大的一笔收购。这次并购不仅增强了HP在个人电脑市场的竞争力,也推动了公司在服务器、存储设备等多个领域的发展。此外,HP还涉足软件及服务等多个领域,成为一个多元化的科技巨头。通过不断并购和业务拓展,HP在全球科技行业的地位日益稳固。

请注意,虽然问题中提到了Keysight,但Keysight实际上是惠普在2014年从惠普科技公司(HP Inc.)分拆出来的一家独立公司,专注于电子测量和测试解决方案。因此,上述故事主要围绕HP(惠普)公司的发展历史进行描述,并未直接涉及Keysight公司。

Excellence Optoelectronics Inc公司的发展小趣事

EOI始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到生产流程,再到产品检测,每一个环节都严格把控。同时,EOI还注重员工的培训和教育,提高员工的质量意识和技能水平。这些努力使得EOI的产品质量得到了客户的广泛认可,公司也因此树立了良好的品牌形象。

Accetek公司的发展小趣事

随着电子技术的飞速发展,Accetek公司意识到只有不断创新才能在市场中立于不败之地。因此,公司加大了对技术研发的投入,建立了一支高素质的研发团队。经过无数次的试验和失败,团队终于取得了重大突破,成功开发出了一种新型的数控雕刻机,具有更高的精度和更稳定的性能。这一创新成果不仅为公司赢得了更多的客户和市场份额,也为公司的长远发展奠定了坚实的基础。

Cornerstone Sensors公司的发展小趣事

随着技术的成熟和产品的完善,Cornerstone Sensors开始积极拓展市场。公司参加了多个国际电子展会和技术研讨会,与全球各地的潜在客户和合作伙伴建立了联系。凭借卓越的产品性能和专业的技术支持,Cornerstone Sensors赢得了众多客户的信任,并成功打入了国际市场。同时,公司还积极寻求与上下游企业的合作,共同推动传感器技术的发展和应用。

中移物联网(Chinamobile)公司的发展小趣事

2024年2月,中移物联网携自主打造的专业通信模组品牌——中移物联OneMO亮相巴塞罗那世界移动通信大会。这一品牌展示了公司在物联网模组领域的创新能力和技术实力。通过与国际知名企业的交流与合作,中移物联网进一步拓宽了国际视野,为公司的国际化发展提供了有力支持。

Abundance Enterprise Company公司的发展小趣事

随着国内市场的逐渐饱和,Abundance Enterprise Company开始积极拓展国际市场。公司积极参与国际电子展览和交流活动,与全球知名电子企业建立了广泛的合作关系。同时,公司还在海外设立了多个分支机构,进一步拓展国际业务。这些举措不仅提升了公司的国际影响力,也为公司的长期发展奠定了坚实基础。

问答坊 | AI 解惑

一个免费液晶样品的机会

附件是申请方法和选型表。 该液晶被网友选为09年电子技术应用最佳产品 …

查看全部问答>

如何检测串口接收到什么数据?

我现在用一个GPS芯片接收卫星传下来的数据,用万用表测量,发现电压为2.45V,提供的电压是3.3V,应该是接收到了数据,但是用MiniCDU就是无法现实接收到的数据,用系统的超级终端还是无法检测到是否接收到数据了,请问高手,这是什么原因啊?…

查看全部问答>

有什么方法可以判断某仪器的空间位置.

比如一个仪器,在一个房间里移动,需要什么技术得对这个仪器对房间的空间坐标.…

查看全部问答>

wince注册表设置的疑问:

在注册表中偶然看到这个一段:   \"DevConfig\"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00请问这个设置 是根据什么来设的呀?作用是什么呀?…

查看全部问答>

用IAR建立工程不成功,请大家帮助。

用IAR自己建立一STM32工程,编译提示找不到*.h文件。自己觉得可能是c/c++ compiler下Proprocess处设置的原因,目前是参考万利的设置: $PROJ_DIR$.. $PROJ_DIR$....Libraryinc 不成功,烦请高手指点下。 工程在此: ...…

查看全部问答>

DSP不停复位,求助!

我现在的板子,JTAG可以烧写程序,可以调试。复位芯片用的MAX708R,用JTAG仿真,F5运行, / RESET 引脚上常为高,DSP2812正常工作,但是拔掉仿真器,断电后,用示波器检测/RESET(MAX708R) 检测到有200HZ的复位信号,。XCLKOUT 输出为3.75M,奇怪了 ...…

查看全部问答>

设计一个定时中断程序

急急急,帮忙设计一个10ms定时中断程序!!!跪谢!!!…

查看全部问答>

MSP430下一代产品wolverine

TI发布MSP430下一代微处理器平台wolverine(金刚狼),功耗降低50%。wolverine 的超低功耗得益于三个方面:一、超低漏电 (ULL) 工艺技术。独特的混合信号超低漏电流工艺技术可实现众多的新型低功耗外设,在任何温度下均始终如一地保持低功耗特 ...…

查看全部问答>

易电源试用贴_lyzhangxiang

先上传试用计划吧,之前一直很忙还好soso一直给我留着名额。 说实在的平时基本上都是用一些LDO就对付了,DCDC的接触的不多。印象最深刻的就是这些DCDC的芯片不管是升压的还是降压的都需要外围的电感啊、快速二极管什么的。一般选取上都不是很容易 ...…

查看全部问答>