打印
[牛人杂谈]

中断向量表放在片内RAM中

[复制链接]
2401|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
500days|  楼主 | 2016-2-26 22:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
总结一下,前段时间的工作学习算是取得一个阶段性的成功了。
下面分别总结一下:
1. 中断向量表不发生重映射,还是放在片内ROM中。用户代码放在片内ROM中(加了TIMER0的中断)。
2. 中断向量表不发生重映射,还是在片内ROM中。用户代码放在片外SDRAM中(加了TIMER0的中断)。
3. 中断向量表发生重映射,重映射的地址为0x20004000.用户代码放在片内ROM中(加了TIMER0的中断)。
4. 中断向量表发生重映射,重映射的地址为0x20004000.用户代码放在片外SDRAM中(加了TIMER0的中断)。

首先,先记录一下定时器0产生中断的机制和相关代码。
(1)定时器0、2、3的功能是差不多的。定时器可以分为定时器和计数器两种,由寄存器CTCR决定哪种工作模式。
a. 作为定时器的时候,输入为PCLK。有预分频和PR和定时器计数器TC,还有PC是预分频的指针。
b. 作为计数器的时候,可以选择CAP输入的上升沿,下降沿,以及上升沿和下降沿作为输入。CAP可以选择CAPn.0和CAPn.1.也就是可以选择外部时钟计数。但是外部计数的最大频率<(Fpclk/2)。
(2)匹配控制寄存器TnMCR,可以选择匹配时产生中断,匹配时将TC复位,匹配时将使TC和PC停止,TCR位0清零。外部匹配寄存器TnEMR,可以选择不执行任何动作,匹配输出设置为0,匹配输出设置为1,匹配输出电平翻转。
(3)当定时器/计数器运行时,在捕获引脚上,出现有效外部触发动作,此时定时器计数器的当前值保存到指定捕获寄存器中T(0~3)CRn。捕获控制寄存器TnCCR可以选择CAPn.0(1/2/3)上升沿捕获,下降沿捕获,事件中断。

当定时器0定时到60ms之后,产生一个中断,并且开NVIC中断嵌套,使向量表中的响应中断。


沙发
500days|  楼主 | 2016-2-26 22:38 | 只看该作者
要注意几点吧:1. 等全部设置好了,再enable TIMER0.2.要想有中断响应,必须开NVIC的中断。3.之前要先清中断。定时器差不多介绍完了。
其次,中断向量表的重映射问题。
如果要实现中断向量表的重映射问题,就要对VTOR寄存器进行设置。这里做的是重映射到0x20004000.好像设置VTOR寄存器与中断向量拷贝并没有一定的先后顺序。
Q:这里就有一个疑问:VTOR的范围为0x00000080-0x3FFFFF80的范围,但是当我将VTOR设置为0x30000000的时候,是没有问题的。问题是将中断向量表拷贝到0x30000000的时候,是无法复制的。0x30000000这个区域在内存映射中是reserved。
SCB->VTOR = 0x20004000;

TIMER0_IRQHandler

    LDR   R15, = TIMER0;这是将用户代码放置到ROM中,如果代码已经放置到SDRAM,且要在SDRAM中运行的话,必须修改如下:

        LDR  R0, =0xA0000000
        LDR  R1, =TIMER0
        ADD  R0,R0,R1
        MOV  R15, R0  
TIMER0的程序为熄灭一个LED灯。
void TIMER0()
{
  *(INT32U*) T0IR = 0x1<<0;
  *(INT32U*) P4_22_IO = 0x00000021;
}
向量表拷贝汇编代码:
five
        LDR    R0, =0x00000000
        LDR    R2, =0x20004000
        LDR    R3, =0x20004400
four
        LDM    R0!,{R4-R7}
        STM    R2!,{R4-R7}
        CMP    R2,R3
        BCC    four
        BX     R14 ;;;汇编时,如果BLX,BX过去的程序时C程序的话,则不用加返回指令,如果是汇编的

;话,就要BX R14

Q:调试的过程中,遇到的一些问题,还没有解决。
  当main函数中,不是用while(1)的时候,中断就无**常响应。

使用特权

评论回复
板凳
bitofnoone| | 2016-2-27 21:02 | 只看该作者
这个也和中断的优先级有关系吧

使用特权

评论回复
地板
wahahaheihei| | 2016-3-24 21:12 | 只看该作者
是在源代码里做的,还是在.s文件里做的。

使用特权

评论回复
5
huangcunxiake| | 2016-3-25 11:48 | 只看该作者
那个是保留位置,肯定不让你随便用的,也就是说实际上是不存在的,而是为了代码的兼容性而保留的。

使用特权

评论回复
6
ofsummer| | 2016-3-28 21:04 | 只看该作者
我记得学汇编的时候,这种表都是放在RAM中的啊

使用特权

评论回复
评论
hj007 2018-5-5 11:59 回复TA
你学的汇编应该是基于8086处理器的,但PC编程和微控制器编译是有区别的,你说的表具体来说是放在存储器中的,在为控制器中RAM和ROM都是存储器。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

120

帖子

3

粉丝