DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 162|回复: 0
打印 上一主题 下一主题

S3C44B0的初始化程序的理解

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-17 23:45:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
S3C44B0的初始化程序就是初始化各个关键的寄存器,建立中断向量,然后转移到主函数去执行程序。不过S3C44B0不支持地址映射,所以程序不COPY到RAM种执行。S3C44B0初始化对我们广大初学者来说,比较难理解的是中断的处理和一些少见的操作符号,S3C44B0的中断子程序地址存放在初始化程序最后就是
  HandleADC # 4
  HandleRTC # 4
  HandleUTXD1 # 4
  HandleUTXD0 # 4
  HandleSIO # 4
  HandleIIC # 4
  HandleURXD1 # 4
  HandleURXD0 # 4
  这一段,它的其实地址是ISR_STARTADDRESS,个人写中断程序的时候,子程序地址被编译器连放在相应的位置。初始化完成后,程序转通过BL Main 转到用户定义的主程序上执行。以下是我个人的一些理解,有错误的地方希望大家指出来。
  GBLL THUMBCODE
  [ {CONFIG} = 16
  THUMBCODE SETL {TRUE}
  CODE32
  |
  THUMBCODE SETL {FALSE}
  ]
  [ THUMBCODE
  CODE32 ;for start-up code for Thumb mode
  ]
  ×××××××××××××××××××××××
  其中[=IF ,|=ELSE ,]= ENDIF, CODE32 表明一下操作都在ARM状态。这些都是伪操作
  这段我理解为设定THUMCODE的值,然后确定,用户的程序是在ARM状态还是THUM状态。不过不管THUMCODE是何值,下面代码都是ARM状态
  这段没有什么很复杂的,就是这三个[,|,]操作符让我迷惑了半天,翻了半天书才找到解释
  MACRO 宏 伪操作
  $HandlerLabel HANDLER(宏的名称) $HandleLabel(宏的参数)
  $HandlerLabel
  sub sp,sp,#4 ;decrement sp(to store jump address)
  stmfd sp!,{r0} USH the work register to stack(lr does't push because it return to original address)
  ldr r0,=$HandleLabel;load the address of HandleXXX to r0
  ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
  str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
  ldmfd sp!,{r0,pc} OP the work register and pc(jump to ISR)
  MEND
  *******************************
  这段当初我觉得比较难理解,不过通过看各种程序,对这段有了一个基本的理解。这个宏的作用是把各个中断程序的地址装入当前的PC,44B0有两种装断模式 一种是没有中断向量表,一种是使用中断向量表的
  使用中断向量表只能是IRQ方式,当使用中断向量表的时候,中断发生时由44B0的中断控制器自动跳转到
  相应的位置。比如在中断向量表的模式下,一个外部中断0发生程序自动跳转到 地址0X20处,0X20地址单元的指令时ldr pc,=HandlerEINT0
  因而程序PC跳到HandlerEINT0处,执行这个宏操作,把外部中断的函数的地址赋给PC。 44B0里面定义了一个
  #define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x84)) ,_ISR_STARTADDRES是中断程序地址的起始地址,_ISR_STARTADDRESS+0X84是HandleEINT0的地址
  例如一个外部中断函数名void EXINT(),程序里执行 pISR_EINT0=(unsigned)EXIT,就把自己的函数地址赋给了标号为HandleEINT0处的内存单元
  IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
  IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
  IMPORT |Image$$ZI$$Base| ; Base and limit of area
  IMPORT |Image$$ZI$$Limit| ; to zero initialise
  ××××××××××××××××××××××××××××××××××
  这段我个人的理解为这些是连接器生成的于输出段相关的符号,是在没有使用SCATTER文件的情况可以调用。这段指出了在ROM和RAM种的数据的地址,这些地址应该是连接器生成的,不过为什么能调用
  连接器生产的符号,我不大明白其中的原因,还希望各位说说自己的理解
  IsrIRQ ;using I_ISPR register.
  sub sp,sp,#4 ;reserved for PC
  stmfd sp!,{r8-r9}
  ;IMPORTANT CAUTION
  ;if I_ISPC isn't used properly, I_ISPR can be 0 in this routine.
  ldr r9,=I_ISPR
  ldr r9,[r9]
  mov r8,#0x0
  0
  movs r9,r9,lsr #1
  bcs %F1
  add r8,r8,#4
  b %B0
  1
  ldr r9,=HandleADC
  add r9,r9,r8
  ldr r9,[r9]
  str r9,[sp,#8]
  ldmfd sp!,{r8-r9,pc}
  ×××××××××××××××××××××××
  这段是没有使用装断向量模式下如何装载中断子程序,因为44B0有30个中断源,所以需要程序处理以确定调用那个中断程序
  0,1是局部标号,%B是向后搜索局部标号, %F是向前搜索局部标号 。都是伪操作
  I_ISPR寄存器各位表明发生了应该调用那个中断子程序。只能1位置位,其它位为0,比如说串口1发送中断发生,这时I_ISPR的
  值为0X04,ldr r9,=I_ISPR
  ldr r9,[r9] 两条指令后,r9的内容为0X4 ,
  movs r9,r9,lsr #1 r9内容右移一位
  bcs %F1 判断是否把置位是否转移到C位,
  add r8,r8,#4 如果没有的R8加4
  如果r9内容为0x04 需要右移3次 ,之后r8的内容为8 然后HandleADC的地址 加上r8的值 就是串口1发送中断的地址,这个地址的内容是中断子程序的地址
  再说明几个伪操作:^=MAP. #=field
  别的方面我觉得比较容易理解了,就不多讲了。

                          
                       
                          
                               
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-9-28 00:29 , 耗时 0.122771 秒, 19 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表