打印

LPC问题解答

[复制链接]
1802|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huzixian|  楼主 | 2010-11-28 12:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
LPC ARM 问题解答1>>  ARM 的数据类型
ARM 处理器支持6种数据类型; 8位有符号和无符号字节。 (char, unsigned char)
16位有符号和无符号半字,它们以2字节的边界对准。(short int, unsigned short int)
32位有符号和无符号字,它们以4字节的边界对准。(int, unsigned int)
typedef unsigned char  uint8;                   /* 无符号8位整型变量                        */
typedef signed   char  int8;                    /* 有符号8位整型变量                        */
typedef unsigned short uint16;                  /* 无符号16位整型变量                       */
typedef signed   short int16;                   /* 有符号16位整型变量                       */
typedef unsigned int   uint32;                  /* 无符号32位整型变量                       */
typedef signed   int   int32;

2>> 关于存储器重映射我不太理解,为什么要有重映射什么时候用得到重映射?一开始向量表到底是在boot block里还是在0x00000000处啊。
答:CPU一启动,总是要从0地址处取指令来执行。那么,假设我想让CPU一启动就从地址a处执行指令,怎么办?
我刚刚已经说了,无论如何,一启动,CPU都是从0地址处执行指令的。那么,有办法了:令这个地址a处的存储器,地址为0就可以了。这就好像把门的号码牌0贴到了a号房间。服务员并不管号码牌0贴的房是什么,而只根据房间号来进行服务就可以了。
于是,虽然CPU还是从地址0处执行,可是地址0指着的对象改变了。所以CPU一启动,就可以从地址a存储器里取指令了。因此,存储器重映射,就是改变了地址0指着的对象,改变了号牌贴着的房间。

3>>  如果,我在JP1接通即p0.14为低的时候按了reset键怎么办,岂不是进入isp模式了,我的JTAG仿真器就不能用了是吗?
答:在ISP模式中仍然能使用JTAG调试。
4>>  关于外部中断的INT0电平中断,《基础教程》上也有这么一段例程,PINSEL1=(PINSEL1—0XFFFFFFFC)|0X01;EXTMODE=EXTMODE &0X0E;我不明白的是,为什么设了电平中断却不用EXTPOLAR说明是低电平中断还是高电平中断呢。如果不设的话是否高低电平都会触发中断还是怎么样。
答:有一个外部中断极性寄存器EXTPOLAR,里面有选择低电平还是高电平触发的位。这个位默认值是0,也就是选择低电平触发。上电复位后,还没有运行用户程序时寄存器里的值就是复位值。
5>>  《基础教程》上讲:如果存储器组配置成32位宽度,地址线A0,A1无用,16为则A0无用,8位则需要使用A0。可是《基础教程》下面配的图上32位宽存储器组连接32位的存储器芯片的A[a_b:0]都用了啊?这是怎么回事?其二:为什么外部存储器写访问时的addr信号要早出一个时钟周期阿?
答:一:配图有错。即是说:CPU的地址线A2接到存储器芯片的地址线A0。
二:您的第二个问题,只说说我的个人理解,仅供您参考。
实际上,在读访问时,有效地址也比有效数据先出现至少一个周期。假设有效地址和一出现,有效数据同时出现,那么这是不可能的。您应该清楚世界上没有这么快的存储器,也不合常理。所以,有效地址必然比有效数据先出现,必然要经过一段过渡期,才能认为出现的数据是有效数据。再考虑到存储器读写周期计算的最小单位是cclk,那么从设计者的角度考虑,拟定一个时序图,预期有效地址比有效数据先出现一个或2个等整数个cclk是完全可以理解的。
6>>  关于__irq 的使用
答: __irq为一个标识,用来表示一个函数是否为中断函数。对于不同的编译器,__irq在函数名中的位置不一样,例如: ADS编译器中 : void __irq IRQ_Eint0(void); Keil编译器中 : void IRQ_Eint0(void) __irq;
但是其意义一样,它所完成的任务是标识该函数为中断函数,在编译器编译是调用此函数时,先保护函数入口现场,然后执行中断函数,函数执行完毕,恢复中断现场,这整个过程不需要用户重新编写代码来完成,由编译器自动完成。因而这也给不具备中断嵌套功能的ARM系统带来了问题,若使用 __irq 时有中断嵌套产生,这现场保护就会混乱。在前一篇日志“LPC2000系列中断嵌套处理”中,自己编写中断入口现场保护代码,并不使用 __irq 标识符号,就是这个原因。
总结如下: 1、若不想自己编写中断入口现场保护代码,而且使用中无中断嵌套,在中断函数中用 __irq 来标识我们的中断函数,否则出错; 2、若程序中要使用中断嵌套,对于无中断嵌套功能的ARM来说,一定要自己编写中断入口现场保护代码,而且不能用 __irq 标识我们的中断函数,否则出错。

7>>   FIQ中断和IRQ中断的区别之处
答:FIQ中断和IRQ中断都属于可屏蔽中断,他们分别受CPSR的F和I位的控制。
前者不需对VIC-VectAddrs和VIC-VectCntls进行设置,但要想正确地
中断要做几步工作:
1. VIC-IntSelect   = (1  VICIntSel_EINT0); 设置EINT0为FIQ中断
2. VIC-IntEnable  = (1  VICIntSel_EINT0); 使能EINT0中断
3. 建立FIQ中断函数FIQ_EINT0().
   注意要声明为外部的即extern void FIQ_EINT0 (void) __irq
4. 改写Startup.S的内容。(改写后的注解见Startup.S)
后者需对VIC-VectAddrs和VIC-VectCntls进行设置。方法:
1. VIC-IntSelect  &= ~(1  VICIntSel_EINT1); 设置EINT1为IRQ中断
2. VIC-VectCntls[0] = VICIntSel_Enable  VICIntSel_EINT1;设置外部中断1分配VIC最高优先级
   VIC-VectAddrs[0] = (unsigned int)IRQ_EINT1;设置中断服务程序地址
   VIC-IntEnable  = (1  VICIntSel_EINT1); 使能EINT1中断
3. 建立IRQ中断函数IRQ_EINT1().
   注意要声明为内部的即void IRQ_EINT1 (void) __irq
4. 不必改写Startup.S的内容。(当然非典就不同了~~~)

相关帖子

沙发
huzixian|  楼主 | 2010-11-28 12:50 | 只看该作者
8>>  #define GetAddr(addr) (volatile uint16 *)(FLASH_ADDR|(addr<<1))这一句中volatile 是指什么意思?(volatile uint16 *)为什么要用括号括起来,是代表强制转换吗?
答:1。首先明确带参数的宏定义的概念,如#define s(a,b) a*b,如果函数中出现t=s(2,3),则等价于t=2*3。
    2。volatile 用来定义一些没有软件干预即可改变的值,我们称之为易失的。例,某些I/O 设备寄存器的值会因为外部事件发生改变。C的关键字volatile可用于提醒编译器注意指向这种寄存器的指针,以确保每次使用数据所读取的都是实际值。另一个作用是防止变量被优化掉。
    3。用括号括起来就是将该地址强制进行指针变换,因为间接访问操作只能用于指针类型表达式,所以“*常数=某常数”是错的。将常数强制转换为指针,然后操作即可对该地址赋值。#define GetAddr(addr) (volatile uint16 *)(FLASH_ADDR|(addr<<1))指将FLASH_ADDR|(addr<<1)强制转换为一个存放16位整数的地址,将指针修饰为volatile,是告诉编译器,该指针指向的内容有可能会被改变(如被外部设备),不能优化。******可查阅《c和指针》一书******

9>>  volatile uint16 *ip;ip定义为无符号16位整形指针变量,可是赋值的时候,如ip[0]=0xaaaa怎么出现数组元素ip[0]了?
答:ip[0]等价于*(ip+0)。因为ip为地址,ip[0]即以ip为起始地址的第一个数即*(ip+0)

10>> 外部存储器试验中,temp1 = *ip;temp2 = *ip;然后比较temp1,temp2是什么意思?
uint8  ChipErase(void)
{  volatile uint16  *ip;
   uint16  temp1,temp2;

   ip = GetAddr(0x5555);
   ip[0] = 0xaaaa;   // 第一个写周期,地址0x5555,数据0xAA
   ……
   ip = GetAddr(0x5555);
   ip[0] = 0x1010;   // 第六个写周期,地址0x5555,数据0x10

   while (1)    // 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变)
   {  temp1 = *ip;
      temp2 = *ip;
      if (temp1 == temp2)
      {  if (temp1 != 0xffff)
         {  return(FALSE);}
         else
         {  return(TRUE); }
}
   }
   return(TRUE);}
答:查阅《SST39vf160手册》可知道,芯片在编程或擦除过程中触发位DQ6时在不断变化的。然后当我们用temp1 = *ip语句读取ip==GetAddr(0x5555)出的数据时,数据同过DQ0~DQ15传送给ARM处理器,由于若擦除操作没有完成,每次读操作DQ6会跳变,所以可以用此作为判断。对于return的处理,凡是子函数执行到return处便跳出子函数并返回其值:)

11>> 基础实验教程  中的UART实验二中的设置波特率除数是下面这样设置的:
bak = (Fpclk>>4)/baud;U0DLM = bak>>8;U0DLL = bak&0xff;最后一句任何作用都起不到阿!!我觉得这儿是错的。
可以这样:U0DLL = bak;U0DLM = bak>>8;或者UODLL = bak%256;U0DLL = bak/256;是吗?
答: U0DLL = bak&0xff; // U0DLL放bak的低8位数值。没错。因为U0DLL = bak&0xff跟U0DLL = bak是一样的,只不过更严谨一些。
     注:U0DLM = bak>>8;这一句在前在后都无所谓,因为这种移位赋值操作不会影响bak的值。

12>> Uart0的查询发送和查询接受的方式怎么不同?“UOTHR = DATA; WHILE(TEMT = 1);”“WHILE(RDR = 1); DATA = UORBR;”
答: U0THR用来缓冲发送字符。线状态寄存器的第5位用来判断发送保持寄存器中是否有字节。当值为‘1’时,表示发送保持寄存器为空,此时,如果输出FIFO中有数据,那么字符(不止一个)可以被写入发送保持寄存器。另外,如果发送FIFO已满,则发送保持寄存器中还可以再写入一个字符。注:写THR由人完成,发送功能有机器完成;所以可以先向THR中写入数据,然后查询是否发送完毕。
    RBR存放接收FIFO中将要被读的字节,对应FIFO的最高字节。每次读取RBR的动作完成后,fifo的数据会出栈一个,一个新的数据对应U0RBR,同时fifo的深度会减一,如果有新的数据来到,fifo深度加1。线状态寄存器中的bit0用来标示接收FIFO中是否有数据可被传送给RBR。之前的判断是为了避免接收无效的数据.


13>>I2C书上说的是,通过软件置位STA后才进入I2C模式,立即发送一个起始条件。在这个实验的主函数里只是启动了i2c( I2CONSET = 0x40;),可是没有将STA置1发送起始信号啊。所以,我认为这样的话,i2c的中断标志位SI是不会置一的,无法进入中断啊。
答:是我傻,是我笨,遇事不自己先思考,到处瞎找人问。在主函数里那是初始化I2C,所以没有置位STA。可是你仔细看看I2CINT.c文件,四个分函数都是怎么写的,都是( I2CONSET = 0x60;)

使用特权

评论回复
板凳
6019赵文| | 2010-12-12 17:02 | 只看该作者
这个是arm方面的吧,不是lpc独自具有的吧!

使用特权

评论回复
地板
我爸是李刚| | 2011-1-31 14:22 | 只看该作者
让我这种菜鸟有了一个总体的认识,不错

使用特权

评论回复
5
米其林r| | 2011-1-31 14:44 | 只看该作者
>> 关于存储器重映射我不太理解,为什么要有重映射什么时候用得到重映射?一开始向量表到底是在boot block里还是在0x00000000处啊。
答:CPU一启动,总是要从0地址处取指令来执行。那么,假设我想让CPU一启动就从地址a处执行指令,怎么办?
我刚刚已经说了,无论如何,一启动,CPU都是从0地址处执行指令的。那么,有办法了:令这个地址a处的存储器,地址为0就可以了。这就好像把门的号码牌0贴到了a号房间。服务员并不管号码牌0贴的房是什么,而只根据房间号来进行服务就可以了。
于是,虽然CPU还是从地址0处执行,可是地址0指着的对象改变了。所以CPU一启动,就可以从地址a存储器里取指令了。因此,存储器重映射,就是改变了地址0指着的对象,改变了号牌贴着的房间。



说的真是太棒了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

262

主题

1534

帖子

2

粉丝