在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!)    创芯人才网--重磅上线啦!
查看: 4760|回复: 13

我理解的44B0初始化程序

[复制链接]
发表于 2005-4-2 11:09:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
44B0的初始化程序就是初始化各个关键的寄存器,建立中断向量,然后转移到主函数去执行程序。
不过44B0不支持地址映射,所以程序不COPY到RAM种执行。44B0初始化对我们广大
初学者来说,比较难理解的是中断的处理和一些少见的操作符号,44b0的中断子程序地址存放在初始化程序最后就是HandleADC#4
HandleRTC#4
HandleUTXD1#  4
HandleUTXD0#4
HandleSIO#4
HandleIIC#4
HandleURXD1#4
HandleURXD0#4
这一段,它的其实地址是ISR_STARTADDRESS,个人写中断程序的时候,子程序地址被编译器连放在相应的位置。初始化完成后,程序转通过BLMain 转到用户定义的主程序上执行。以下是我个人的一些理解,有错误的地方
希望大家指出来。

    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
           ldrr9,[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
别的方面我觉得比较容易理解了,就不多讲了。
发表于 2005-4-2 13:44:31 | 显示全部楼层

我理解的44B0初始化程序

感谢共享!
发表于 2005-4-4 12:49:30 | 显示全部楼层

我理解的44B0初始化程序

希望看到更多这样的详细地分析文章。
谢谢!
发表于 2005-4-4 23:12:36 | 显示全部楼层

我理解的44B0初始化程序

好!太好了,大家以后都有什么理解和体会,多发表一下,让大家一块学习,一块讨论
发表于 2005-4-6 10:13:05 | 显示全部楼层

我理解的44B0初始化程序

好文章啊 这样的文章应该发点银子做奖励啊!
发表于 2005-5-9 13:15:25 | 显示全部楼层

我理解的44B0初始化程序

好东西!
发表于 2005-6-15 01:16:33 | 显示全部楼层

我理解的44B0初始化程序

值得奖励……可惜偶不是斑竹
发表于 2005-7-27 15:49:00 | 显示全部楼层

我理解的44B0初始化程序

很好的文章,支持一个
发表于 2005-7-27 16:16:30 | 显示全部楼层

我理解的44B0初始化程序

没有人给纠正错误么?
发表于 2005-9-21 10:26:41 | 显示全部楼层

我理解的44B0初始化程序

奖励一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-27 13:11 , Processed in 0.029569 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表