历史上的今天
今天是: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的模式设置寄存器 控制
下一篇:s3c2440中断控制器操作
史海拾趣
|
我现在用一个GPS芯片接收卫星传下来的数据,用万用表测量,发现电压为2.45V,提供的电压是3.3V,应该是接收到了数据,但是用MiniCDU就是无法现实接收到的数据,用系统的超级终端还是无法检测到是否接收到数据了,请问高手,这是什么原因啊?… 查看全部问答> |
|
在注册表中偶然看到这个一段: \"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自己建立一STM32工程,编译提示找不到*.h文件。自己觉得可能是c/c++ compiler下Proprocess处设置的原因,目前是参考万利的设置: $PROJ_DIR$.. $PROJ_DIR$....Libraryinc 不成功,烦请高手指点下。 工程在此: ...… 查看全部问答> |
|
我现在的板子,JTAG可以烧写程序,可以调试。复位芯片用的MAX708R,用JTAG仿真,F5运行, / RESET 引脚上常为高,DSP2812正常工作,但是拔掉仿真器,断电后,用示波器检测/RESET(MAX708R) 检测到有200HZ的复位信号,。XCLKOUT 输出为3.75M,奇怪了 ...… 查看全部问答> |
|
TI发布MSP430下一代微处理器平台wolverine(金刚狼),功耗降低50%。wolverine 的超低功耗得益于三个方面:一、超低漏电 (ULL) 工艺技术。独特的混合信号超低漏电流工艺技术可实现众多的新型低功耗外设,在任何温度下均始终如一地保持低功耗特 ...… 查看全部问答> |
|
先上传试用计划吧,之前一直很忙还好soso一直给我留着名额。 说实在的平时基本上都是用一些LDO就对付了,DCDC的接触的不多。印象最深刻的就是这些DCDC的芯片不管是升压的还是降压的都需要外围的电感啊、快速二极管什么的。一般选取上都不是很容易 ...… 查看全部问答> |




