新闻  |   论坛  |   博客  |   在线研讨会
arm开发问题解答
arm9arm7 | 2008-05-24 14:50:21    阅读:11168   发布文章

arm开发问题解答

1.在任何IRQ请求产生之后,微控制器跳转到地址0x00000018执行代码。对于向量和非向量地址,可以在0x18放入下面指令:LDR pc,[pc,#-0xff0]该指令将VICVectAddr寄存器保存的地址装入PC但是这时候pc=0x00000018,pc-0xff0=fffff028,而VICVectAddr的地址是fffff030,这是怎么回事?

答:就是说本来这个地址(0x00000018)下,应该是放中断服务程序的入口地址的,但是这个地址被装在VICVectAddr寄存器中,所以通过这条指令(LDR pc,[pc,#-0xff0])可转移到VICVectAddr寄存器中所存放的地址出去执行。就这么简单!ARM7TDMI是三级流水线,PC超前于当前执行的指令8字节。

2. 在复位时拉低DBGSEL时,只有管脚p0.17--p0.31的功能控制有效是什么意思?

答:应该是"只有DBGSEL为低电平时,管脚p0.17--p0.31的功能控制才有效"

3. 对于保存非向量IRQ中断程序地址是用寄存器VICDefVectAddr,如果有2个或2个以上的非向量IRQ中断,则如何保存其各个地址。是保存第一个非向量IRQ中断函数的地址,还是其它的呢?如果是第一个,则是否一定要在程序中将多个非向量IRQ中断函数连续书写呢?

答:只写一个非向量中断处理函数,在函数内判断是那一个中断源产生的中断,然后分别处理。如果不想这样做,那么就要使用向量中断了。

4. 有熟悉ADS这两个问题的吗

   1、偶尔打开AXDSEC,总是提示我有.sec文件没有加载,这是个什么文件呢?在遇到这样情况下,我从新设置了CONFIGURE TARGET就没有问题了

   2、在AXD下我用FLASH LOADING 来下载HEX文件到FLASH中,为什么状态栏一直显示RUNNING IMAGES?按道理下栽是很快的事情啊

   3、每个工程项目中的debug,debugrel,release是什么意思?怎样设置和使用

答:1、这ads自身的问题,好像以前我说过。敬意不要从ide直接运行axd,应直接开始菜单运行axd然后从file菜单调入调试文件调试。

   2、重新设置并重新下载,再不行重装驱动程序

   3、仅优化等级不同,一个名称而已。以前的贴子有说明。

5. 请问编译器ADS1.2支持c语言中的printf()么?如果能,怎么看结果呢? 

答:支持,软件仿真时会在屏幕上看到显示。

**************************************************************************************************************************

我在一个文件key.h中定义了几个全局变量,在target.c和key.c文件中都要用到,main函数在key.c里,target.c里有一段时钟的中断程序,编译时出现这样的语句:Error : L6200E: Symbol key1Ct multiply defined (by Target.o and KEY.o).

Error : L6200E: Symbol keyCt multiply defined (by KEY.o and Target.o).

我又在声明全局变量keyCt前加了extern,还是不行,请问应该怎样解决?Thank you very much!

头文一般仅声明变量,变量定义一般在c文件中。

您还要温习一下C语言的基础知识。

**************************************************************************************************************************

2104在ADS1.2中是否支持位变量,如变量类型为bit 

不支持

**************************************************************************************************************************

ads设置问题

在对DEBUGREL设置中:layout设置中的关于PLace at the beginning of image 的2项设置各个是什么意思?我看我们的实验例子中要求object/symbol中写VECTOR.O

主要是设置放在ro_base的模块。

**************************************************************************************************************************

关于程序5.28,UART0的实验2

在程序5.28中我有2个问题:

1、在UART0_ini(uint32 baud,UARTMODE set)函数中有一语句为if(set.parity>4) return(0);set.parity是奇偶校验位,这里为什么是大于4,其值范围为0到3,我觉的应该是if(set.parity>3) return(0);

2、还是在这个程序中,多次出现像if(0x04 == (U0IIR & 0x0F));为什么要这样写,而不是if((U0IIR & 0x0F)== 0x04),如果说这样写是为了能读取U0IIR中的值来清除中断,那为什么在程序中还有

if((0==baud)||(baud>115200))这样写的语句。 这样写的目的是什么呢?

1. 在定义数据结构时已有说明,set.parity为0时无校验,为1时为奇校验,为2时为偶校验。其实为3时为强制为1,为4时强制为0,所以要if(set.parity>4)...

2. 这只是一个编程习惯,如果在写if(i==56)时写成了if(i=56)就逻辑错了。

**************************************************************************************************************************

陈工,请指教I2C等问题! 

我的LPC2104目标板上使用的是CAT1161作为复位芯片(带EEPROM,用与保存一些设置参数),其带硬件看门狗,通过SDA线的电平跳变来喂狗,而我又用的是从JTAG进行调试,从JTAG调试过程中不能复位啊,所以要先把“狗”服侍好!您说我该用什么样的方式喂狗呢?是用I2C的总线的启动信号?把SDA线编程GPIO模式,输出跳变电平?

我想应该定时读一下CAT1161。 

**************************************************************************************************************************

请问: 关于PWMDAC 

我没有查到它的资料,但是书上318页有语句

LDR R0,=PWMDAC

MOV R1,#0x800

STR R1,[R0]

请问哪里有它的介绍??

配套书程序清单5.35的第8行,(地址0x40002f00属于哪个模块?)。 

**************************************************************************************************************************

有熟悉ADS这两个问题的吗

1、偶尔打开AXDSEC,总是提示我有.sec文件没有加载,这是个什么文件呢?在遇到这样情况下,我从新设置了CONFIGURE TARGET就没有问题了

2、在AXD下我用FLASH LOADING 来下载HEX文件到FLASH中,为什么状态栏一直显示RUNNING IMAGES?按道理下栽是很快的事情啊

3、每个工程项目中的debug,debugrel,release是什么意思?怎样设置和使用

1、这时ads自身的问题,好像以前我说过。敬意不要从ide直接运行axd,应直接开始菜单运行axd然后从file菜单调入调试文件调试。

2、重新设置并重新下载,再不行重装驱动程序

3、仅优化等级不同,一个名称而已。以前的贴子有说明。

**************************************************************************************************************************

**************************************************************************************************************************

1. p153,在任何IRQ请求产生之后,微控制器跳转到地址

0x00000018执行代码。对于向量和非向量地址,可以在

0x18放入下面指令:

LDR pc,[pc,#-0xff0]

该指令将VICVectAddr寄存器保存的地址装入PC

但是这时候pc=0x00000018,pc-0xff0=fffff028,而VICVectAddr

的地址是fffff030,这是怎么回事?

2. p159,在复位时拉低DBGSEL时,只有管脚p0.17--p0.31的功

能控制有效是什么意思?

1. 书上P262页有说明。

ARM7TDMI是三级流水线,PC超前于当前执行的指令8字节。

2. 应该是"只有DBGSEL为低电平时,管脚p0.17--p0.31的功

能控制才有效"

**************************************************************************************************************************

关于定时器的实验 

定时器实验2中,为什么定时器0一直不发生中断。一直在main函数中的while(1)中等待中断的发生。而定时器1却能不断的中断,因为它使LED3不断的翻转电平。程序和光盘上的一模一样,却就是不行,请高手看一下,给我讲一下。

不好意思,我查出来了,我没有在vectors.s中进行memmap操作。 

**************************************************************************************************************************

在黄皮书的P132页上说EXWAKE寄存器置位将允许外部中断输入将定时器从掉电中唤醒,但不产生中断!可是在P334页中的例子程序中却是有中断服务程序的阿!而且系统从掉电中恢复出来不需要将PCON寄存器的空闲或掉电设置位清0么?清各位前辈指点!谢谢!

需要中断来唤醒CPU。

唤醒后会自动清除PCON的相关位。

**************************************************************************************************************************

堆栈管理算法 

陈版主您好。我是一名51单片机初学者,前几天下载了您编写的Small RTOS(51) V1.20.0.在仔细阅读多遍后,对任务调度时堆栈的管理算法不甚明白,如函数OSTaskStkInit。您能否抽空给解释一下算法。

用类似RTX51 Tiny的技术,可以参考RTX51 Tiny的文档。我记得以前c51bbs上有网友翻译过。另,以v1.21.1为基础的《嵌入式实时操作系统Small RTOS51原理及应用》一书即将出版,上面有详细分析。

**************************************************************************************************************************

请问陈版主ADS1.2可以使用semihosting技术么? 

需要仿真器支持(EasyJTAG暂时不支持)。 

**************************************************************************************************************************

光盘上的IAPTEST文件夹中的C语言项目例子无法实现,总是跳入中止异常.而汇编的程序正常.问题在哪里?

还有一个问题:

FLASH只能整个扇区的改写,不能只改写几个字节吗?如是我只想修改一个8位的密码也要改写整个扇区,那不是太浪费了!

程序是没有问题,项目中要有4个文件(起动文件及C源程序)。请设置断点调试,查出在哪行程序出现异常。

只能整个扇区擦除编程,用于对较大量的数据进行保存,如果数据量不大以及经常要改动少量数据,那么外扩EEPROM。

具体情形是这样

项目中要有4个文件(起动文件及C源程序)。我设置断点调试,查出在IAPTEST.C中以下行程序出现异常。

EraseSector(1,1); // 擦除扇区

跳入反汇编的:

00000048 [0xeafffffe] b 0x48

有时又可以顺利执行,而不出现异常.

而当执行到:

RamToFlash(0x00002000, 0x40000000, 512); // 写数据到扇区1 

这一行必出现异常,进入:

0000015c [0xeafffffe] b 0x15c

您应该是自己建的工程,或不是用DebugRel。

注意C的ATPCS的设置。

你可以自己试一试,我又从光盘上重新拷了一下,还是一个现象.C的ATPCS的设置也没错.

如果你们验试你们的程序完全正确的话,请把你们正确的程序发给我.

我已测试,没有问题。您已经改了ro_base,参数,不可能说没有改变工程。

关键在于ARM C Compiler的ATPCS页要选择ARM/Thumb interworking选项。

ARM C Compiler的ATPCS页ARM/Thumb interworking选项,我选了呀!但我没改ro_base,参数。 

我是把你的光盘直接拷到硬盘上,只改变了文件夹的只读属性而已

刚才我再次测试,无论在flash中还是在ram中均没有问题。

我没有跟踪到函数内部去。用我们的工程应该没有问题。自己再找一找原因。还不行我们再把这个工程发给您。另外,您可以通过JTAG烧写芯片吗?

都是光盘上一样的工程,在别人机子上能正常运行,但我在的机子上总是跳入中止.我把ADS重装了也不行.DEPRESS!! 

我实在找不到原因,

跳入中止模式说明从非法地址读写数据(数据中止)或从非法地址执行指令(指令中止)。 

这一般是编译参数设置不对引起。如果同一个板实验出现这个问题,则几乎可以肯定是编译参数设置不对。如果两个机器使用不同的板,互调板看问题在板上还是在编译上。如果问题在板上,先比较一下板有没有区别(一些人将自己2104环成2106)。如果板一样,到购买处检测一下。

谢谢您的指教.我把两个板在同一个机子上试了,是我的板有问题.请问修理时更换成2106不会带来使用上的麻烦吧? 

我们不提供将2104更换为2106的服务。 

呵呵,没有说明理由,给人感觉是周立功不会推广2106 

因为Easy2104利润已经很低,实际上并不赚钱。如果还需要维护两个产品,公司开支上吃不消。实际上2106和2104就那么一点区别,会了2104就会了2106。

************************************************************************************************************************** 

**************************************************************************************************************************

关于IRQ中断向量地址 

黄皮书P284倒数第2行:

VICVectAddr0 = (int)IRQ_Eint0;

而P283最后却定义了

void __irq IRQ_Eint0(void);

为何不定义为:

void IRQ_UART0(void)

???

__irq用于修饰IRQ中断函数,函数返回时会恢复CPSR 

中断返回与函数返回使用的指令不一样。 

**************************************************************************************************************************

可不可以把UART1,不做modem,只当成全双工串口(像UART0那样用)

可不可以把UART1,不做modem,只当成全双工串口(像UART0那样用)?

怎样设置??谢谢!!

可以,对于三线制串口通讯不管CTS、RTS等信号即可 

**************************************************************************************************************************

关于中断的问题 

如果在一个中断程序A执行的时候,中断B发生了。

但是在程序A中为了不让其他中断嵌套进来,已将其他中断屏蔽掉。那么在A执行完后,B中断程序是不是会被执行。也就是说,B中断在A中断执行的时候只是被挂起,还是根本就不会产生中断(因为中断被屏蔽)。

我想不会,请陈工详细解说指点~~~~~~ 

应该不会丢失,中断是否发生是某状态寄存器是否置位,一般要软件读才

可以清0,假如打开全局中断允许后,该状态为置位状态(关闭中断期间

发生过该状态寄存器置位),这时也会引发中断. 

假如在屏蔽中断期间B连续发生了1次以上的中断,CPU并不能区分,只

会在打开屏蔽后引发一次中断.

我的看法,请zlg专家指教

说得基本正确。但如何清中断源及多次中断时CPU的行为还与相应的外设有关。

多次中断时CPU的行为还与相应的外设有关‘这个不是很理解

能否举个例子说一下?

比如uart0,它会把不同的中断保存起来。

您是指U0IIR中吧?

UART0模块中我们看不到的地方。

**************************************************************************************************************************

ARM芯片如何与SJA1000连接啊?

SJA1000是数据/地址复用,有ALE脚,那么如何连接ARM芯片呢?

可能需要用GPIO模拟时序。

是要模仿ALE的时序吗?

模仿51总线时序。

SJA1000的AD0~AD7就不能接ARM的数据线了。

有可以直接挂接ARM的CAN总线控制器吗?

我对SJA1000不熟悉,各钟ARM的外部总线又不一样,也许有可以直接用的。

在有些朋友的设计中,ARM芯片使用模拟总线方式连接SJA1000,已经成功了。

对时序缌就不难。

**************************************************************************************************************************

请教各位高手init.s中的__user_initial_stackheap和__rt_div0这两个函数由谁来调用呢?

__user_initial_stackheap仔细看配套书的5.1.3的第7点;__rt_div0是除0错误处理函数。 

**************************************************************************************************************************

陈老师,我想问一下关于ucos时钟节拍的问题。

在EasyArm2104板上移植ucos时,用的是Timer0作ucos的时钟节拍发生器,定时器0中断服务程序如下:

/******************************************************

void Timer0(void)

{

OS_ENTER_CRITICAL();

T0IR = 0x01;

T0MR0 +=(Fpclk / OS_TICKS_PER_SEC);

VICVectAddr = 0; // 通知中断控制器中断结束

OS_EXIT_CRITICAL();

OSTimeTick();

}

***************************************************/

我想问一下,其中“T0MR0 +=(Fpclk / OS_TICKS_PER_SEC);”为什么要用“+=”,ucos原版书要求节拍率应该在10到100hz之间,请问上面这段程序的实际节拍率是多少?

(其中 Fpclk=11.0592mhz,OS_TICKS_PER_SEC=200)

我大概计算了一下,如果要50hz的话,T0MR0应该是200000左右,但是执行有误,请陈老师或者其他知道的朋友指教。

谢谢!

是否需要T0MR0 +=(Fpclk / OS_TICKS_PER_SEC);

一句与定时器0的初始化有关。

如果定时器0初始化为中断且清零,则不需要。

如果定时器0初始化为中断但不清零,则需要。

实际节拍率是OS_TICKS_PER_SEC

为什么不是直接赋值:T0MR0 =(Fpclk / OS_TICKS_PER_SEC);? 

搞清楚了。TC值匹配后没有变的。所以要+=。谢谢!

**************************************************************************************************************************

**************************************************************************************************************************

定时器实验二

我采用isp下载方式按照光盘中的方法将程序下载到flash rom中,一切正常.但是删除了remap代码后,定时器0中断不响应.为什么?按照我的理解,在ram调试时需要remap,在flash rom中运行时,程序本来就在0x0000000开始运行,可以不要remap,不知道这种理解对不对?

是的。但是不能删除:

MSR CPSR_c, #0x1f

MOV PC, R0

且在脱机运行时要保证向量表中所有数据的32位累加和为零。(书附录1)

**************************************************************************************************************************

在SRAM中程序调试很好,但按照黄皮书上设置编译后,通过JTAG下载到FLASH中显示:

“Warnning! interrupt vectors data is not correct!

Program you downloaded can not run freely!”

为什么?

我用的INIT。S,VECTORS。S,TARGET。C全部都没有改动呀?

注意图7.11 

**************************************************************************************************************************

两个中断的程序怎么写? 

我要用一个定时器中断和外部中断0,不知道vector.s文件怎么写?

看到黄皮书上那个有两个外部中断的程序中写

IRQ_Addr DCD 0

我也这样写了之后中断根本进不来,若先写IMPORT IRQ_Eint0,然后

IRQ_Addr DCD IRQ_Eint0(我把外部中断的优先权设为最高),时

钟中断发生但是进入的是外部中断服务程序。

请陈工和HSB赐教!非常感谢!

使用向量中断,参考IRQ2_test下的项目。

要正确初始化VIC,设置中断服务函数地址到VICVectAddrn寄存器,并使能中断。

**************************************************************************************************************************

请问SPI的SPSR是只读的吗?

黄皮书P192表3.96注明SPSR的访问是RO属性的,但是P313最后一行的语句

STR R1,[R0,#0x04]

是通过向SPSR写入立即数0x00来清零,这样编译运行的结果为什么是正确的?为什么不通过对SPSR的读操作来清零?

是只读的,程序应改为读操作来清零。

**************************************************************************************************************************

开发板使用中的问题

我是第一次使用这个开发板,遇到了很多问题,并且参照黄皮书无法解决。问题如下:

1。按照p253页中关于JTAG硬件方针配置,确定后出现RDI Waring 00159:Could not open specified device port。我怀疑是不是ip的问题,所有的ip都是像书上写得那样吗?

2。选择armul软件仿真进入AXD,在进行仿真时,发现系统时钟初始化无法完成,总是执行到while((PLLSTAT & (1 << 10)) == 0);无法再往下进行。

3。按照P254进行设置,在AXD中加载image文件后程序并没有下载到flash中(这里选择的是armul软件仿真) 。

1. 请连接好硬件,并上电。

2. 软件仿真是不针对任何硬件的,所以读出PLLSTAT的值不会变化。

3. 只有连接上仿真器,并使用它,才能下载。软件仿真当然不能下载程序了。

参考光盘上easyarm_drive目录下readme.txt,书附录1、2。

**************************************************************************************************************************

这么短的程序居然不通!错在何处?

#include "config.h" 

int main(void)

__asm

{

LDR R1,=0x40003F00 ;这就是第9行

return(0);

}

Error : (Serious) C2282E: expected ‘[‘ - inserted before ‘=‘

DATARET.c line 9 

Error : (Serious) C2291E: expected but found ‘=‘

DATARET.c line 9 

Error : (Serious) C2282E: expected ‘]‘ - inserted before ‘\n‘

DATARET.c line 9 

这么短的程序居然不通!错在何处?

内嵌汇编不支持LDR Rn,=expr伪指令.

**************************************************************************************************************************

请教PWM的双边调制:我由黄皮书改写:变PWMPCR=0x4040,然后在给PWMMR5赋值,就应该是双边吗?

程序有点乱了,就不贴了,描述如下:

由黄皮书改写:

1:变PWMPCR=0x4040,

2:在给PWMMR5(6)赋值,

就应该是双边吗?

还是还需要改写别的地方?

谢谢大家.

对了:黄皮书上P210页的错(PWMMR存储器位定义没有上更改通知 

**************************************************************************************************************************

请教:定时器及PWM

1、LPC2104中定时器与PWM有两套独立的“功能”寄存器,那么它 们的功能是否可同时实现而互不影响?

2、在PWM的控制寄存器PWMPCR中没有对“PWM1”的边沿控制模式选择,是否默认的是单边沿模式?

1. 不会相互影响。这只是说PWM定时器与标准定时器相似。

2. PWM1只能作单边沿控制的PWM输出。

2问问得有道理,应该是.说一只用2,4,6最好

**************************************************************************************************************************

刚看完了一遍书!想重头看第2编!刚看几页就发现了个问题!书上的P17上说溢出地址空间依赖于地址的翻转,再技术上是不可预测的,因此穿过地址 0XFFFFFFFF的前向翻转和穿过地址0X00000000的后向翻转都是不影使用的。可是再书后面的中断章节中P153页就在地址0X18放了指令:LDR PC [PC,#-0XFF0],这条指令不就是地址翻转么?清各位大侠指点!

上面是说如果穿越了就不具备可移植性,所以不要使用。 但异常向量表是与芯片密切相关的,本身不具移植性,当然可以根据芯片的特点编写。

**************************************************************************************************************************

运行EX2_arm时总是DataAbort?

需要修改任务堆栈大小以便所有变量可以装入16k中

任务堆栈改为: #define TASK_STK_SIZE 800 ,结果也不行!

我是在flash中调试:RO Base:0x0,RW Base:0x40000040

单步执行时发现是在执行TargetResetInit()函数的第一句发生的跳转

(跳到:LDR PC, DataAbortAddr这一句)

第一个例子EX1_arm运行是正常的

看一看配套书图7.22,计算一下ram是否超出。

**************************************************************************************************************************

两个中断的程序怎么写?

我要用一个定时器中断和外部中断0,不知道vector.s文件怎么写?

看到黄皮书上那个有两个外部中断的程序中写

IRQ_Addr DCD 0

我也这样写了之后中断根本进不来,若先写IMPORT IRQ_Eint0,然后

IRQ_Addr DCD IRQ_Eint0(我把外部中断的优先权设为最高),时

钟中断发生但是进入的是外部中断服务程序。

请陈工和HSB赐教!非常感谢!

仔细看一看配套书3.5节及中断例子。 

看过了,可是例子里没有涉及vector.s的写法

您再看5.1.3节。

**************************************************************************************************************************

黄皮书262页讲异常向量表时说使用LDR指令而不使用B指令的一个好处是LDR指令可以全地址范围跳转,我查了一下指令,好象应该是LDR伪指令才可以在全地址范围进行跳转,也就是使用

LDR PC,=LABEL 而不是 LDR PC,LABEL 

请各位赐教!

LDR PC,LABEL是查表的方法(取出跳转的地址),加载的数据也是32位的。(LDR PC,=LABEL只会跳转到LABEL,实际上也是使用文字池,加载取出数据)

**************************************************************************************************************************

**************************************************************************************************************************

想请教一下陈工,有没有手工激活SPI发送完成中断的方法? 

就是在没有数据发送的时候,用手工的方法,激活SPI的发送完成中断,

51里面可以直接写中断标志位激活,但是LPC2104里面的状态寄存器是

ReadOnly的,不能这样做,有没有什么其它技巧可以做到这一点?

可以用VIC的软件中断功能. 

软中断也行?怎么用法??? 举例!!! 

看一看3.5节,特别是特殊寄存器VICSoftInt 

我向VICSofoInt中写入0x000A,并不能出发SP中断啊

我先在SPI中断中的第一句代码上设置了断点

然后屏蔽了代码中的发送函数,直接在那个地方替换为代码:

VICSofoInt=0x000A;

但是,全速运行后没有进入该中断啊, 

如果直接向发送寄存器中写入数据可以触发进入中断.

我搞错了,应该写入0x0400 

**************************************************************************************************************************

黄皮P264 11行:在移植uCOS-II时使用编译器分配的空间作为堆栈而不是把堆栈分配到RAM的顶端......

但这样做可能会由于堆栈空间过小使程序工作不正常,那么应如何确定堆栈空间呢?分配多少才合适?

根据函数嵌套层数及各个函数的局部变量的多少估算。

**************************************************************************************************************************

请问程序设计者:DCD后面的表达式具体含义是什么

StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1) * 4

StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4

StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4

StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4

StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4

StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4

看配套书2.3.2节。

不要老是让我们自己看,就是看不懂才问的。再次请教 

让您自己看是教您学习的方法。学习总是要花力气的,如果什么都简单的告诉您,以后没有人教了,怎么办?再说

我叫看书的都是书上已经说的清楚的,如果不清楚,而且我也懂,我会说的。就拿这个问题来说,75页 DCD和DCDU一段说:

DCD用于分配一段字内存。。。。

伪指令格式

[lable] DCD expr{,expr}。。。。

其中:label。。。。

expr。。。。

。。。。

书上说得还不清楚吗?我还能说的更清楚吗?

多谢指点,是不是有点类似51的DB?

应该是类似dw 

**************************************************************************************************************************

我准备下载到FLASH中了,请问如何先把原板中的程序读上来保存已备今后用? 

我准备下载到FLASH中了,请问如何先把原板中的程序读上来保存已备今后用?

同时,当采用下载到FLASH中方式调试程序时,如何再看源程序?是否是再load debug lag(我现在在家,记不清楚,就是load image后,二进制下载到flash,再load 调试标号。)

请教斑竹和 HSB了。

用ISP软件操作。(实验程序\hexcode\LEDDISP)

设置连接地址及调试入口地址均为0x00000000,然后编译直接进入AXD进行调试即可。

**************************************************************************************************************************

中断的困惑 

黄皮书280页倒数第一行:LDR PC,IRQ_Addr 是否欠妥,当只有一个中断使能时,似乎还可以。但有两个以上的中断使能时,应该就不行了吧!为何不写成 LDR PC,[PC,#-0xff0] 更通用一些,请哪位大虾说明一下。

并不是所有的ARM均由VIC(向量中断控制器)。 

这个问题我也遇到了,写成 LDR PC,[PC,#-0xff0]还不如写成LDR PC,0xfffff030?

我是这么做的,挺好

**************************************************************************************************************************

在ARM的ADS中如何把数据定义在CODE中

用const定义的全局变量一般在代码段。

**************************************************************************************************************************

ucos调试时不能单步.恳请陈工指点!

ucos示范程序工程spi,程序连续运行时一切正常.

但是进入反汇编连续单步则总是跑到下面这个函数里面去了

void IRQ_Exception(void)

{

while(1); 

}

看反汇编,连续单步运行的最后,然后总是走到下面的代码中

00000018 [0xb9205f80] stmltdb r0!,{r7-r12,r14}

接着就跑到IRQ_Exception进入死循环,既使接着再全速运行

也无作用,程序已死在上面的循环中.

不知道怎么回事,请陈工指教,

Flash中写入的是RomCode,不是RomCode_ex1

目前在中断打开的情况下,EASYJtag会单步会进入中断。而VIC的硬件决定如果程序在0x00000018停下会出错。

所以不能单步调试中断。

也就是说无法在2104中单步调试ucos应用程序啦?

目前关闭中断就可以单步调试,例如已经进入中断服务程序。 

关闭中断,程序就无法进入中断程序了阿

系统也没有Tick中断了阿?

你说的是在什么时候关闭中断?设置的断点前加一个关闭中断语句?

您可以在中断服务程序中设一个断点,然后全速执行。

我不是要调试中断程序,是要调试RAM中的应用程序阿,

但是断点单步进入,一会儿就进入刚才那个中断了.

那就暂时关闭中断

再问一个中断的问题

假如我使用REMAP功能, 这样IRQ中断后虽然跳跃到0x00000018,实际

是跑到0x40000018地址,这种情况下单步会不会出错? 以前我调试的

时候都是整个程序灌到RAM中,也单步过含有IRQ的程序,但是印象中

没有碰到这个错误情况.

实际地址还是0x00000018只是内容与0x40000018一样而已。情况是一样的。

**************************************************************************************************************************

**************************************************************************************************************************

请问软件中断的区别 

在VIC中有SOFT中断VICSOFTINT,而SWI 0x32768也是软件中断,那么他们的区别是什么?VICSOFTINT的中断由谁来产生的?它只有32个中断啊。

黄皮书的P280中定义中断向量表,怎么没有用原来的0XB9205F80,而使用NOP?它们的具体计算校验和是怎么算的

VIC的软件中断是进入IRQ或FIQ模式,退出前要清零软件中断控制位。

而SWI会进入管理模式。

P280页的中断向量并没有设计向量表所有32位数据累加和为0,用于调试。

**************************************************************************************************************************

我想申请一个布尔型变量: bool x; 编译报错,是ARM不支持bool还是关键字用错了

C语言标准中并没有bool变量。如果某个编译器支持,它可以认为是用typedef定义了它。 

**************************************************************************************************************************

我是这样理解分别编译的:RAM中的应用程序每调用一次uCOS的系统函数就要产生一次软中断,通过这个软中断去掉用事先固化在flash中的uCOS系统函数.不知是否可以这样理解?

可以这样理解。

**************************************************************************************************************************

问陈工关于UART的一些问题!

1、 UART0的线状态寄存器U0LSR中第4位间隔中断BI,“在发送整个字符(起始位、数据、奇偶校验和停止位)过程中RXD如果都保持逻辑0,这产生间隔中断,当检测到中断条件时,接收器立即进入空闲状态”,这句话该如何理解?尤其是前半句以及“空闲状态”到底是什么状态?间隔检查时间取决于U0FCR0,可是U0FCR0没有关于检查时间的说明啊,只是实现正确的UART0的正常操作的啊!

2、51单片机串口发送中断发生在发送停止位前,而LPC2104是否发送中断在发送完整个字符后?

3、在书附带实例程序“DATARET”中进行了REMAP设置,是否和ADS1。2中ARM linker的设置有关?这样编译后的程序写片在哪儿运行?FLASH or RAM?如果我要在FLASH中调试,那么该如何设置ARM linker以及REMAP呢?

请陈工做答,谢谢!

1、原文如此,我们也不是特别清楚

2、根据配套书的3.8.3节的6判断可能在之后,但不可确定

3、REMAP与程序的要求有关,与ARM linker的设置没有直接的关系。以前的老贴有很多REMAP的讨论。关于各种方式的设置请看第七章。

**************************************************************************************************************************

陈工: 如何解决程序运行.暂停后再运行时定时器不能再次中断的问题?

暂停后定时器还在运行(由芯片决定)。如果您设置为中断不清0,则还需要很长时间才再次中断。您可以算一下需要多长时间,保证吓您一跳。

**************************************************************************************************************************

陈工,临界代码段怎么判断呢?

一般使用了共享资源的代码均是。

**************************************************************************************************************************

土土再问一个问题,下面的代码系统会如何执行呢?

难道不是死循环???

谢谢

__rt_div0

B __rt_div0

这个代码仅在除法除数为0时执行。此时说明您的程序已经有错误了,还跳出来干什么?

**************************************************************************************************************************

陈工:在arm c中如何定一个c语言函数的编译的地址?

陈工,你好:

在ADS1.2中如何定位一个c语言函数的编译地址,我知道在C51中是可以的,但是不知道在ARM c中如何实现?望能见告!!谢谢!!

我也不是很清楚。但我想,用“分散加载”应该可以实现。

**************************************************************************************************************************

保留位的取值

在I2CONSET的状态字的描述中,保留位的值应该是0还是1呢?

黄皮书中提P181,

当从地址和方向位已发送且接收到应答位之后SI 置位而状态寄存器将显示状态代码对于主模式可能的状态代码为18H 20H 或38H”

不知道那位大侠能够,解释一下为什么会出现18H,20H或38H呢?

1. 不用理会读出的会保留位,写操作时不要向它写1即可。

2. 这是硬件I2C根据总线状态产生的,可以参考LPC932的应用手册上的I2C接口部份。

**************************************************************************************************************************

设置release:RO Base:0x0, RW Base:0x40000040 

然后下载到了flash中。

我的问题是:系统重新上电后,RW和ZI数据立即出现在0x40000040处么?(上电前,0x40000040(RAM)应该是没有数据的)

RW和ZI数据是怎么出现在0x40000040处的呢?

初始化代码__main做的“好事”。在进入调试状态时2104实际已经执行了部分代码。

**************************************************************************************************************************

哪里能下载到ARM C的编程规范?例如黄皮书中外部中断的实验在用c语言编写中断服务程序时要加上__irq这样的规范!

ads自带的ADS_DeveloperGuide_D.pdf 

这个问题我曾经也问过,比如象例子中...... 

比如象例子中#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) 等这种类似的定义在标准C及C51中均未有,如果没有例子怎么知道啊!!

#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) 是标准c语言语法支持的,

是存储器映射外设的特殊寄存器的标准写法。

**************************************************************************************************************************

您好,请问调试程序时,一定要下载到ram中才能调试吗?如果我的程序(无uc/os)要是大于16k,是不是不能用该芯片了?flash,64k不也没有用了吗?

可以在Flash中调试,除编译参数设置及仿真器设置有一些不同外,其它一样。

仿真器要设置为允许擦初。

编译参数主要是ro_base、rw_base和entry point的设置。

**************************************************************************************************************************

关于GUI的问题.

有人告诉我,要在液晶上显示图象就要用GUI

我想,只是猜想:如果按了某个键后,只需用查表的方式调用FLASH的一些数据,趋动液晶显示这些数据以形成图象就行了嘛.

那么还要GUI做什么?

我刚入门,还请各位指点

如果只要显示简单的图象就可不用GUI.

**************************************************************************************************************************

请问SPI中的SPCR寄存器中有MSTR这个控制位,其中MSTR是控制SPI为主或从模式,这里的主从模式分别是什么意思,有什么区别。谢谢大家1

是不是SPI发送数据时,必须为主模式,而接收数据时,必须为从模主。

主模式时都可以收发数据,且只由主机发送SPI总线时钟。

**************************************************************************************************************************

Warnning! interrupt vectors data is not correct!

请问到底怎么回事呢?

同一个程序开始一直正常,后来就变这样了,运行也不稳定

您修改了异常向量表,或没有按照配套书图7.11设置

**************************************************************************************************************************

DATARET 里的串口程序为什么丢数(0x00 0x11 0x13) 

我把光盘上的DATARET编译后烧到开发板上, 在主机上发8个英文字母如"ABCDEFGH", 从开发板能接受到正确返回的8个字符. 但当主机发送的8个字符中包括0x00 或0x11或 0x13时, 该字符无法返回. 

如发送"0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17"8个字节 主机接收的是"0x10 0x12 0x14 0x15 0x16 0x17"6个字节 

除了0x00 0x11 0x13以外 其它ASCII都可正确接受到. 不知大家遇到过没有, 我实在想不明白, 请大家不吝赐教

您用哪个程序接收,有一些程序会过滤掉一些字符.例如 

vb的串口控件可以过滤0,如果设置了软xoff/xon还会过滤两个字符.

**************************************************************************************************************************

I/O口电平:可否用+5V接5K上拉来接5V外围逻辑? 一般用什么方法可以双向? 直接接5V逻辑实际情况如何(74HC)? 

I/O口电平:

1:可否用+5V接5K上拉来接5V外围逻辑? (看黄皮好像不行)

2:一般用什么方法来实现与5V的逻辑期间接口?

3:如果直接接5V逻辑芯片,实际情况会怎样?

如果3.3v的芯片声明可以接5v IO,则两者间串一个小电阻就可以了.我们就是这样把5v器件接到lpc2104上的. 

但这样的话,3.3向5V系统输出高电平逻辑会不会抗干扰能力很差啊?学习存在这问现象,到不一定是这个引起的~~

但这样的话,3.3向5V系统输出高电平逻辑会不会抗干扰能力很差啊?学习存在这问现象,到不一定是这个引起的. 进入调试停下来后,手在板上哗啦一下,8段管就跑得很欢了.

所以一般不要5与3.3v混用.

**************************************************************************************************************************

在ADS中仿真时怎么看到诸如IOPIN之类的寄存器的值?? 

在AXD的菜单System Views->Debugger Internals 

**************************************************************************************************************************

求证一个问题:2104强调其内部复位有延时,整形电路以保证复位可靠,为什么还要用708来专门完成这个工作?

不好意思,我自己出钱作项目,想省钱啊!哈哈.

而且这两74HC125放这里干嘛得啊? TRST这路信号是干什么的啊?

保证复位的可靠性(如窄脉冲、中间电平等)

74HC125是为了使板上的复位按键和JTAG仿真器均可复位系统。

************************************************************************************************************************** 

**************************************************************************************************************************

请教“初始化堆”?

黄皮书365页顶部有:

_user_initial_stackheap

LDR r0,=bottom_of_heap

MOV pc,lr

请问该子程序是在哪个文件中调用的?

__main 

**************************************************************************************************************************

我运行光盘上原始的IAP程序例子,使用它的project是正常的,但我自己重新建一个目录和project,参数设置按照原来工程的设置,编译出来的 axf文件就是会在运行到第一个 SelSector(1,1)时无法继续下去,我自己的axf文件和光盘上的一样大16KB,究竟是怎么一回事?有一处设置Language Settings里的ATPCS项有什么意义?其他工程好像没有选择这一项,请陈工和HSB赐教.

IAP是THUMB指令,如果用户程序是ARM指令,所以调用时需要使用BX指令。则C编译器的ATPCS项要设置“ARM/Thumb interwork...”

**************************************************************************************************************************

请问陈工两个问题!

LPC210X适合开发什么样的产品?最好能具体点,目前有那些成功的案例?能否介绍一二,我想在毕业论题中选用UCOS+LPC2104做一个相关课题,可是不知道做什么好,似乎没有切入点,想开发一个实际的东西,请您指点一下!谢谢!

国外好像用它作类似网关的东西(利用它的两个串口)。 

不知道贵公司有没有基于该ARM芯片的产品啊?或者有那些好的方案能否推荐一下

目前还没有。可以用它作三相电表。 

**************************************************************************************************************************

请教陈工:黄皮第120页表3.1与第158页表3.51不一致呀?...

第120页表3.1中的管脚P0.17~P0.21有“首要JTAG管脚组”的

功能(TRST,TMS,TCK,TDI,TDO);

而第158页表3.51中的管脚P0.17~P0.21却没有这一功能(“保留”)???

这是怎么回事呀?

有第120页表3.1的英文资料么?

首要JTAG管脚组只能通过硬件选择,不能通过软件选择。 

***************************************

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
qingcai [ 匿名]  2008-10-09 13:02:09 

龙人嵌入式开发中心专业提供嵌入式系统开发和嵌入式ARM解决方案服务同时提供ARM9开发板、Xscale开发平台及ARM仿真器http://www.szarm.com
推荐文章
最近访客