1.1 变(常)量声明
首先声明堆栈大小
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 0
IRQ_STACK_LEGTH EQU 256 ;IRQ中断堆栈
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
处理器模式声明
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
外部存储器配置声明
PINSEL2 EQU 0xE002C014
BCFG0 EQU 0xFFE00000
BCFG1 EQU 0xFFE00004
BCFG2 EQU 0xFFE00008
BCFG3 EQU 0xFFE0000C
IMPORT __use_no_semihosting_swi
IMPORT __use_two_region_memory
;引入的外部标号在这声明
IMPORT FIQ_Exception ;快速中断异常处理程序
IMPORT __main ; C语言主程序入口
IMPORT TargetResetInit ;目标板基本初始化
;给外部使用的标号在这声明
EXPORT bottom_of_heap ;heap的底部
EXPORT bottom_of_Stacks ;stack的底部
EXPORT top_of_heap ;heap的顶部
EXPORT StackUsr
EXPORT Reset ;复位
EXPORT __user_initial_stackheap ;用户初始化堆栈和堆
1.2 建立中断向量表(向量表所有数据32位累加和为0)
Reset
LDR PC, ResetAddr ;复位后开始的执行地址
LDR PC, UndefinedAddr ;未定义指令异常
LDR PC, SWI_Addr ;软件中断
LDR PC, PrefetchAddr ;预取中止
LDR PC, DataAbortAddr ;预取数据中止
DCD 0xb9205f80 ;保留的异常
LDR PC, [PC, #-0xff0] ;IRQ ( 该指令会读取VICVectAddr寄存器的值,然后放入PC指针 )
LDR PC, FIQ_Addr ;FIQ
;给每一个向量分配连续的字存储单元
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
;发生以下异常时程序暂停( 除了FIQ )
;未定义指令
Undefined
B Undefined
;软中断
SoftwareInterrupt
B SoftwareInterrupt
;取指令中止
PrefetchAbort
B PrefetchAbort
;取数据中止
DataAbort
B DataAbort
;快速中断
FIQ_Handler
STMFD SP!, {R0-R3, LR} ;把R0-R3,LR的值存入堆栈
BL FIQ_Exception ;跳转到FIQ中断程序
LDMFD SP!, {R0-R3, LR} ;恢复R0-R3,LR的值
SUBS PC, LR, #4 ;PC指针跳转到LR-4
1.3 复位程序
根据外部存储器控制器的引脚接法,对GPIO进行设置(外部存储器所接引脚与P1,P2,P3口的GPIO功能复用),之后对用到的四组存储器组进行设置.
ResetInit
;Initial extenal bus controller.
;初始化外部总线控制器,根据目标板决定配置
LDR R0, =PINSEL2
IF :DEF: EN_CRP
LDR R1, =0x0f814910 ;芯片加密,禁止JTAG调试
ELSE
LDR R1, =0x0f814914 ;设置总线的I/O引脚
ENDIF
STR R1, [R0]
;设置四组存储器配置
LDR R0, =BCFG0
LDR R1, =0x1000ffef
STR R1, [R0] ;设置外部第0个存储区
LDR R0, =BCFG1
LDR R1, =0x1000ffef
STR R1, [R0] ;设置外部第1个存储区
; LDR R0, =BCFG2 ;该开发板没有用到后面两组存储器接口
; LDR R1, =0x2000ffef
; STR R1, [R0] ;设置外部第2个存储区
; LDR R0, =BCFG3
; LDR R1, =0x2000ffef
; STR R1, [R0] ;设置外部第3个存储区
BL InitStack ;初始化堆栈 Initialize the stack
BL TargetResetInit ;目标板基本初始化 Initialize the target board
;跳转到c语言入口 Jump to the entry point of C program
B __main
1.4 堆栈初始化
初始化各模式堆栈
InitStack
MOV R0, LR;因芯片模式切换,故将程序返回地址保存到R0,同时在初始化堆栈完成后使用R0返回
;Build the SVC stack
;设置管理模式堆栈
MSR CPSR_c, #0xd3
LDR SP, StackSvc
;Build the IRQ stack
;设置中断模式堆栈
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;Build the FIQ stack
;设置快速中断模式堆栈
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;Build the DATAABORT stack
;设置中止模式堆栈
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;Build the UDF stack
;设置未定义模式堆栈
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;Build the SYS stack
;设置系统模式堆栈
MSR CPSR_c, #0xdf ;修改为0x5d将打开IRQ中断
LDR SP, =StackUsr
MOV PC, R0 ;子程序返回
1.5 目标板初始化
void TargetResetInit(void)
{
// 设置存储器映射方式,这必须根据硬件来设置. 这里是ADS1.2中的设置.
#ifdef __DEBUG
MEMMAP = 0x3; //remap
#endif
#ifdef __OUT_CHIP
MEMMAP = 0x3; //remap
#endif
#ifdef __IN_CHIP
MEMMAP = 0x1; //remap,根据预定义的宏,设置存储器映射方式
#endif
/* 设置系统各部分时钟 */
PLLCON = 1; ;使能PLL(锁相环),但不连接PLL
#if (Fpclk / (Fcclk / 4)) == 1
VPBDIV = 0;
#endif
#if (Fpclk / (Fcclk / 4)) == 2
上一篇:LPC2000系列学习笔记5--中断
下一篇:LPC2000系列学习笔记3--引脚连接模块
推荐阅读最新更新时间:2024-11-21 14:37
推荐帖子
- 求购一个二手开发板,最好是arm9平台下,s3c24xx系列的。。。
- RT:求购开发板。。二手。。主要是练练手。。开发板要包含触摸屏,各种外部接口。。有意者,请先发个图片让我瞅瞅。。。然后留下您的邮箱地址,具体的我会用邮箱和您联系。。谢谢合作啦!求购一个二手开发板,最好是arm9平台下,s3c24xx系列的。。。我也想知道,正在找這方面的資料~~~~~
- qiu_yinong ARM技术
- 提问+关于MSP430快闪编程方法
- 请问这些种类的接口都起什么作用的?在编程的时候,有些什么不同?提问+关于MSP430快闪编程方法答:在大规模生产期间对MSP430闪存器件进行编程时,可以使用以下选项: 1-使用编程器(随时使用,无需开发): aMSP-PRGS430 bBSL工具(例如来自GesslerElektronikSoftbaughElprotronic的工具) c群组编程器MSP-GANG430 如欲了解第三方工具,敬请访
- led2015 嵌入式系统
- wince如何显示png透明图片
- 需要在wince6.0中做一个能贴png透明图片的按钮类,用到IImageCOM组件,代码如下:IImagingFactory*pImgFactory=NULL;IImage*pImage=NULL;HBITMAPhResult=0;//MessageBox(strFileName);if(SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,
- pikky WindowsCE
- 西门子新一代过程控制系统PCS7
- aifang 移动便携
- 简单设置让KEIL5支持代码自动补全功能
- 简单设置让KEIL5支持代码自动补全功能KEIL5都出来了,这么高端,还带有代码补全诶。哈哈,回头下一个体验下。非常感谢楼主的分享啦。凯哥,你都装keil5了,发个安装包给我咯为什么我的那个选项卡左边是空白的呢?感谢一下楼主。TigerSky发表于2014-1-1715:53为什么我的那个选项卡左边是空白的呢? 不会吧。。。。重装下?keil5感觉怪怪的,还是用4你好,我这个设置之后怎么还是不能实现代码自动对齐呀?有什么原因导致的呢?谢谢快速回复!!!
- qinkaiabc 单片机
- 如何解析键盘手柄发过来的命令并控制云台动作(pelco-D/P协议)?
- 键盘(例如PelcoKBD-300,或者SamsungSPC-1010键盘)手柄通过RS485串口发送命令给主程序,主程序解析后作用于另外一台云台设备,云台设备用的是标准的Pelco-D和Pelco-P协议,网上找到的资料都是直接写云台设备的程序,我没接触过键盘手柄控制的模式,不知道键盘手柄发送过来的命令是什么格式的??读RS485出来的数据又怎么解析呢?麻烦各位多帮忙。。如何解析键盘手柄发过来的命令并控制云台动作(pelco-D/P协议)?帖子沉啦?
- xiguajing 嵌入式系统
设计资源 培训 开发板 精华推荐
- 2024年Automechanika Shanghai海量同期活动刷新历届记录,汇聚行业智慧,共谋未来发展
- 企业文化分享 如何培养稀缺的硅IP专业人员?SmartDV开启的个人成长与团队协作之旅
- 恩智浦发布首个超宽带无线电池管理系统解决方案
- 北交大本科生探秘泰克先进半导体开放实验室,亲历前沿高科技魅力
- 新帅上任:杜德森博士(Dr. Torsten Derr)将于2025年1月1日出任肖特集团首席执行官
- 边缘 AI 如何提升日常体验
- 苹果要首发!台积电宣布2nm已准备就绪
- AMD有望用上全新芯片堆叠技术:延迟大幅减少、性能显著提升
- 宁德时代发布10月战报
- 2024年10月电池行业:增长势头不减!