DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1515|回复: 1
打印 上一主题 下一主题

[待整理] arm开发问题解答

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-5 11:41:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
arm开发问题解答


*****************************************************************************************************************************
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:就是说本来这个地址(0x00000018)下,应该是放中断服务程序的入口地址的,但是这个地址被装在VICVectAddr寄存器中,所以通过这条指令(LDR pc,[pc,#-0xff0])可转移到VICVectAddr寄存器中
所存放的地址出去执行。就这么简单!
2:。。。。




1. 书上P262页有说明。
ARM7TDMI是三级流水线,PC超前于当前执行的指令8字节。
2. 应该是"只有DBGSEL为低电平时,管脚p0.17--p0.31的功
能控制才有效"





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

请各位帮我看一下,谢谢!





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





*****************************************************************************************************************************
有熟悉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、仅优化等级不同,一个名称而已。以前的贴子有说明。





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

请问编译器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 ‘

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软件操作。(实验程序hexcodeLEDDISP)
设置连接地址及调试入口地址均为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管脚组只能通过硬件选择,不能通过软件选择。
**************************************************************************************************************************
U0FCR = 0x81; //使能FIFO 并设置触发点为8字节?是不是指接收到8个字节才产生中断!但是现在我发1个字节也进入了中断就。请问这是为什么?


注意还有字符超时中断。


请问我能否设置超时不产生中断呢?


我的理解是不行。
**************************************************************************************************************************
LDR R0,=PINSEL0中=是什么意思,定义一个内存中一个字节,那么现在PINSEL0前面的=号是取地址还是地址中的内容呢


这是LDR伪指令,可用来加载32位立即数或地址,LDR R0,=PINSEL0是将PINSEL0的地址加载到R0中。
**************************************************************************************************************************
请问在启动代码中target.c中,
定义了
void IRQ_Exception(void)
{
while(1); // 这一句替换为自己的代码
}

void FIQ_Exception(void)
{
while(1);
}

在例子IRQ2_TEST中也是这样用的.我不明白,既然程序中触发了IRQ中断,那怎么会在上面出现死循环的的代码?另外,还注释说"//这一句替换为自己的代码",请问IRQ要完成的功能代码都在主程序中用void __irq IRQ_Eint1(void)写明白了,而这里还可以加什么样的代码呢?




这是一个模板函数,你可以使用,也可以不使用。

使用时将你的代码写入,然后在向量表中IRQ、FIQ处理跳转到该函数(适用于非向量中断)。




你的意思是说,这个函数只适用于非向量中断,而向量中断应该在应用程序中由自己编写,对吗?




不知道这个问题你解决了没有。你说的是对的。
是非向量IRQ的入口。你设置的其他的 向量中断 的入口地址会自动装载(看 中断控制器 书)。

不过他这里的描述有点让人误解。

**************************************************************************************************************************
请问陈工一个uC/OS-II移植的问题
在文件Os_cpu_a.s 中的函数OSIntCtxSw中有如下语句:
……
(1) LDR R4, [R6]
(2) ADD SP, R4, #68
;17寄存器 CPSR,OsEnterSum,R0-R12,LR,SP
(3) LDR LR, [SP, # --8]
(4) MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式
(5) MOV SP, R4
……
(6) LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务
黄皮书378页中解释:只所以要(1)(2)是因为“OSTCBHighRdy—>OSTCBStkPtr保存的是任务栈位置,而寄存器恢复后堆栈指针并不指向这,所以要调整新任务堆栈指针。”
可是将堆栈指针调整到“新任务入栈的其它数据(见黄皮书374页图6.3)”处后,除了取出了LR以外并没有做什么,而当执行了(4)后又重新将堆栈指针指向了栈顶(即第(5)句)。
我认为可以将(2)省去,直接将(3)改为 “LDR LR, [SP, # 60]”,而当执行完(6)后,堆栈指针就自动指向了“新任务入栈的其它数据”处。这样修改后我运行了EX1_arm例子,正常。
请问陈工这利用(3)进行堆栈指针调整的原因是什么?不调整可以吗?谢谢。




注意不同模式有不同的SP指针。您这样做会造成内存泄漏,长时间运行会耗尽堆栈而使程序崩溃。
**************************************************************************************************************************
WDT复位后从地址0开始执行吗?运行程序5.40后,WDT复位后并不是从地址0开始执行,却跑去执行[0x07806808] dcd 0x07806808,并一直执行此语句。如何才能从地址0开始执行????



WDT复位后是从0开始执行程序。
请在反汇编窗口中的0地址处设置断点观察。



如果从地址0开始执行,那么程序将重新运行。LED首先将连续闪50下,但程序根本就跑不到那。


如果你要看出那样的结果,不要使用JTAG调试(因为CPU复位,JTAG已不能控制而出错)。
设置向量表累加和为0,然后脱机运行。
**************************************************************************************************************************
看到有些工程的编译设置中没有arm linker甚至其它更多的选项,不知道是在哪里设置的??
另外T0MR0 = Fpclk / OS_TICKS_PER_SEC;怎么解释??
在UCOS中函数OSTimeDlyHMSM(,,,)真的可以设定精确的定时,
比如一秒!!



1、配套书虽然没有明说,但仔细看一看设置部分应该知道
2、Fpclk:外设输入频率(包括定时器)。OS_TICKS_PER_SEC时钟节拍频率
3、关于OS延时精度问题,UCOS中文版第二版说得很清楚,太长,自己看吧。
**************************************************************************************************************************
问题1、BL LABEL 书上说是LR <= PC-4 PC<=LABEL
  为什么LR<= PC-4 ??

问题2、黄皮书P38 LDRH R6,[R2],#2 R2=R2+1
是书上错误还是因为是半字加载,我觉得应该R2=R2+2啊???

问题3、LDR R0,=NUMCOUNT 为什么加等号呢??




1、看配套书1.1节及1.6节关于PC的部分
2、看勘误表
3、看配套书的2.2.1节的9
**************************************************************************************************************************
我想问一下LPC2104使用通用I/O时访问外部设备时的速度最大是多少,象89C51的是晶振频率的1/12 ,那LPC2104的呢?我在资料上好象没找到。



看配套书3.3节,特别注意VPBDIV
**************************************************************************************************************************
既然option页中的Image entry Point填入的是调试入口地址,那么在实际的程序运行当中它是不会覆盖代码中的ENTRY入口声明的,对吗?仅仅是为了调试的方便.




Image entry Point优先。其实代码中的ENTRY是为了确保代码不被优化掉。



当程序下载到FLASH里时,Image entry Point还会起作用吗?


会。编译器并不知道FALSH的地址。
**************************************************************************************************************************
仔细看了附录二:
但我想搞清一些必须的问题才好自己设计,我不想带那么多的片子在我的MCU核心板上.

1:主从JTAG在功能上有无区别(出去启动条件)
2:学习板上的"自动选择"是如何实现的?(因为用的是标准AXD,对PCPRISEC,PCDBGSEL的控制是谁实现的)实现的时序.
3:我用仿真模式时,下载代码是主还是从在工作.仿真时是主还是从在工作.




1、除了启动条件外没有任何区别。2、学习板上的"自动选择"是由仿真器驱动程序实现的。3、均可。
**************************************************************************************************************************
__xxx的保留字在哪里可以找到那,其如__irq等




ADS_DeveloperGuide_D.pdf(开发者指南)
**************************************************************************************************************************
先谢谢斑竹,总让你这么回答问题,真是辛苦你了。
SWI ox00
问题:SWI 后面加的数字是这样定义的:处理器忽略,但出现在指令操作码中,异常处理用它来确定正在请求那种服务。
我不太明白异常处理怎么识别它,用什么指令么?麻烦斑竹举个例子。还有ADS中,_swi是不是和汇编的SWI有同样的功能?它的格式是什么样的?是调用它声明的函数就中断,还是在里边加汇编 SWI
指令了。



例子可以看我的UCOS/ii的移植的SWI异常部分
其他请看配套书6.4.3节。
**************************************************************************************************************************
1、非向量中断的优先级如何设定?
2、我设置了两个外不中断1和2,然而无论1或者是2触发,都进入同一个中断程序,请问这个如何处理。
3、那位大侠可以详细的说明ARM的中断处理,谢谢!!!



非向量中断之间没有优先级,需要看中断标志判断是哪个中断源产生的中断。
**************************************************************************************************************************
请问一下 OSIntCtxSw()的问题
在include.h中有
/* 由于不同情况中断OSIntExit()对堆栈的使用情况不同,必须加上这个宏定义 */
#define OSIntCtxSw()
{
OsEnterSum = 0;
return;
}
请问是什么用的。
/* 由于不同情况中断OSIntExit()对堆栈的使用情况不同,必须加上这个宏定义 */
#define OSIntCtxSw()
{
OsEnterSum = 0;
return;

}
这个有什么用?编译会出错

OSIntCtxSw()不是在os_cpu_a.s吗?





看配套书6.4.9节,特别注意最后几段
**************************************************************************************************************************
请问陈工:P98,程序2.44,使能/禁能IRQ中断问题?
_inline void enale_IRQ(void)

2.45:void my_strcpy(const char *src)
1:请问_inline是什么意思,我在书中没有看到关于它的解释
2:const 和* 是什么意思?
3:程序中用CMP ch,#0 做判断,ch什么时候付的值?



1、_inline 与C++的inline相同
2、复习一下C语言的基础知识
3、看一看这条指令前有ch的指令
4、ads1.2
**************************************************************************************************************************


请问陈工,执行一条ARM指令或THUMB指令所需的处理器周期。在黄皮书的指令列表里没有给出啊。

因为执行的周期与存储器强烈相关、与流水线强烈相关,所以没有固定的周期,最短的为一个时钟。
-----------------------------------------------------------------------------------------------------------------------------
请问pl2104开发板上的一个问题
使用SPI要用四个管脚,SCK,SSEL,MISO,MOSI,可是给的原理图上的SPI用了SCK,MISO,MOSI和TxD1,而SSEL用在了蜂鸣电路,是笔误还是什么原因?急!



SSEL是从机模式下的选择线。在主机模式下时,SSEL不输出片选信号,且不能为低电平,所以只能使用其它口线(P0.8)输出片选。
-----------------------------------------------------------------------------------------------------------------------------
感觉有点奇怪
我那程序在FLASH之前,在RAM中可以中断正常
写FLASH之后,不能够运行

我检查以下几点:
//********************************************************
1、使用仿真器看代码是否写入芯片。主要看向量表的代码是否正确。注意是直接看反汇编代码。

2、P0.14是否为高电平。为低电平会进入isp程序。
应该拔掉JP1跳线帽,KEY1在复位时不能被否按下。
可以测量一下P0.14的电平,看板上是否有硬件问题或自己附加的硬件有没有拉低它。

3、编译参数是否设置正确
请参考配套书图7.13、图7.24、图7.11。
其中图图7.11容易被忽略。如果这样的话,异常向量不是定位于程序开始,写入flash后代码执行肯定错误。

4、是否使用我们提供的启动代码
如果不是,特别注意保留向量的值。参考配套书的3.2.3节的1和5.1.3节的(3)。
如果没有编写异常向量而直接重0地址开始编写代码,写入flash后代码执行肯定错误。

5、寄存器MEMMAP的值是否为1。
如果为2,则需要在 MEMMAP为1时将从0开始的64个字节拷贝到地址0x40000000。注意是64个字节。
MEMMAP为其它值均错误

//****************************************************888
同时,我调用光盘里面的VIC_test的中断程序,REMAP之后能够
在FLASH中运行的!!!


我现在有点怀疑是不是“异常向量表vectors中第(6)行:DCD 0xb9205f80”的问题,这个植要不 要改动的呀?
我可没有碰她!

最后,可能要采用最后的方案了

----------->>>>>>>>>>>>>>>>>>>>
6、还查不出电话联系





如果您使用的是我们提供的启动代码,则异常向量表vectors中第(6)行:DCD 0xb9205f80不能修改。如果您改动了启动代码中异常向量表的部分,或是自己的启动代码,则需要相应的修改,原则是使异常向量表的累加和为0。
您可以通过JTAG仿真器让程序从0地址运行(此时运不运行与2、4点无关),如果程序运行正常,则下载没有问题。如果运行不正常,则重新下载。




中断向量表前8行的反汇编如下:
66 Vectors
67 LDR PC, ResetAddr
Vectors [0xe59ff018] ldr pc,ResetAddr ; = #ResetAddr
68 LDR PC, UndefinedAddr
00000004 [0xe59ff018] ldr pc,UndefinedAddr ; = #UndefinedAddr
69 LDR PC, SWI_Addr
00000008 [0xe59ff018] ldr pc,SWI_Addr ; = #SWI_Addr
70 LDR PC, PrefetchAddr
0000000c [0xe59ff018] ldr pc,PrefetchAddr ; = #PrefetchAddr
71 LDR PC, DataAbortAddr
00000010 [0xe59ff018] ldr pc,DataAbortAddr ; = #DataAbortAddr
72 DCD 0xb9205f80
00000014 [0xb9205f80] dcd 0xb9205f80 ._ .
73 LDR PC, IRQ_Addr
00000018 [0xe59ff018] ldr pc,IRQ_Addr ; = #IRQ_Addr
74 LDR PC, FIQ_Addr
0000001c [0xe59ff018] ldr pc,FIQ_Addr ; = #FIQ_Addr

是按这样累加么:七个0xe59ff018和0xb9205f80相加
0xe59ff018+0xe59ff018+0xe59ff018+0xe59ff018+0xe59ff018+0xb9205f80+0xe59ff018+0xe59ff018 = 0x7FF028 != 0呀
各位是如何算的?




对不起,有一个例子由于我们的疏忽其累加和不为0,其它正确,代码如下:
Vectors
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr



如果不用异常应该可以直接从地址0开始编写代码吧?
4、是否使用我们提供的启动代码
如果不是,特别注意保留向量的值。参考配套书的3.2.3节的1和5.1.3节的(3)。
“ 如果没有编写异常向量而直接重0地址开始编写代码,写入flash后代码执行肯定错误。”




也要保证累加和为0。


-----------------------------------------------------------------------------------------------------------------------------
在单步运行时,T0TC和T0PC寄存器的值为何不是象仿真8051的TL0值那样按指令所需要的机器周期数加1或加2



这是一个很大的问题, JTAG 不支持外围器件的仿真. 也就是说定时器等不受暂停控制.
我之前也不明白, 用了 定时器0中断但不自动清零, 结果我跑到中断服务程序中设了断点, 然后再运行, 定时器就不中断了,因为它要跑一整个循环,只到溢出后重新回来... 呵呵, 等苦了我了.

-----------------------------------------------------------------------------------------------------------------------------
请问周功技术员关于一个51与2104的问题
如何设置成像51的P1端口之类的,好比说数码管直接P1口送数据出去一组8位的数据



通过程序实现
IOSET = WrData << LCM_LSB;
IOCLR = ((~(WrData << LCM_LSB)) & LCM_DB);


IODIR &= (~LCM_DB); // 总线定义位输入线.
ReadData = IOPIN; // 读总线上的数据.

IODIR |= LCM_DB; // 总线定义为输出线.
// 输出数据.
IOSET = WrData << LCM_LSB;
IOCLR = ((~(WrData << LCM_LSB)) & LCM_DB);

这是我外接 5V 液晶模块中的 8 为并口程序, 5V与 3.3V 总线间串接 470 电阻.




GPIO是不是只能设为单向的,好像还没上拉?



不是好象,是没有上拉
-----------------------------------------------------------------------------------------------------------------------------
zlg移植的ucos在中断屏蔽的代码实现上有问题




^_^ 中断嵌套的问题, 如果必须嵌套那就要切换模式(不能在IRQ模式了).



看一下51EDA上同样的问题
我发现问题后搜索到的类试问题的答案,确实让解决了我的问题
http://www.51eda.com/bbs/dispbbs.asp?BoardID=32&ID=16157&replyID=114111&skin=1




按照我们的勘误表上的方法编写中断程序就没有问题。另外还有更好的方法将在下一个开发板上公布。

-----------------------------------------------------------------------------------------------------------------------------
请问,程序在ram中运行一切正常,但写入flash后经常出现数据访问异常中止,是什么原因?
我的一个应用程序,使用了定时器0的捕获输入产生中断来测量脉冲宽度。程序在ram中调试和仿真一切正常。然后我将Vectors.s中的Remap去掉。设置好linker,编译。下载到flash中运行,程序能运行一下,但很快死掉。按开发板上的复位键,程序跑一下又死掉。有时候干脆按复位件程序都跑不起来。
用仿真器追踪程序,发现程序进入数据访问异常死循环。晕啊~~~~~~~。
反复检查了linker设置没有问题啊!
俺想不明白,请陈工或者哪位大虾解答一下。谢谢。



为什么下载到flash中时要去掉Remap?Remap只在调试中断时需要么?



REMAP 与这个寄存器有关---MEMMAP,这取决于你的程序从哪里读取中断向量。如果你在RAM中调试程序,而你的程序又使用了中断,那么你需要将中断向量表拷贝到0X40000000(如果你的image entry point 是0x40000000)。这就是REMAP.同时需要设置MEMMAP=0X02,使存储器映射模式为用户RAM模式。这样当中断发生时,程序从 0X40000000开始的这个新的向量表中去读取中断向量。
不知道我这样解释是否正确。呵呵~~~~~~。



其它应注意的几点:
1、是否用我们提供的启动代码?
应该用我们的启动代码
2、memmap是否正确设置?
=2时需要拷贝向量表到0x40000000?)
3、是否是ucosII分开编译方案?
如果是则需要按照非分别编译的方法重新建立工程。
4、用仿真器控制程序是否可以从0地址正确运行?
不能则下载错误。



折腾了几天,程序就是不能在FLASH中正常运行
陈工救急啊。还是这个问题,搞了几天就是不行。我没有使用UC/OS-II。程序写入FLASH后能跑一下,几十秒后死掉。程序死掉后检查了MEMMAP寄存器,值是0x01.启动代码我用的是IRQ中断例程的启动代码。
不会是芯片内部的RAM有问题吧?但奇怪的是程序在RAM中跑一点问题都没有啊。
又检查了一下,LINKER的设置也没问题啊。
实在搞不出来,可以将程序发给陈工给看看可以吗?请问你的电邮是?




ucosii写入falsh的例子见连接的资料下载。
仿真器设置了允许擦除吗?
理论上isp可以下载,jtag就可以下载。
实在不行,您可以到我们的分公司让他们帮看一下。

-----------------------------------------------------------------------------------------------------------------------------
关于OSIntCtxSW
在黄皮书的376页的OSIntCtxSW_1中
LDR R4, [R6]
ADD SP, R4, #68
LDR LR, [SP, #-8]
MSR CPSR_c, #(NoInt | SVC32Mode)
MOV SP, R4

LDMFD SP!, {R4,R5}
LDR R3, =OsEnterSum
STR R4, [R3]
MSR SPSR_cxsf, R5
LDMFD SP!, {R0-R12, LR, PC }^
请问高手:LDMFD SP!, {R0-R12, LR, PC }^是不是恢复新任务工作寄存器和工作模式,LR寄存器一并得到恢复,那么ADD指令后面的 LDR LR, [SP, #-8]指令是不是可以去掉?




两者恢复的是两个不同处理器模式的LR



LR值是一样的?


看配套书1.5节1.6节。



陈工:能不能详细告诉我LDMFD SP!, {R0-R12, LR, PC }^指令恢复到什么模式,其中的堆栈的LR又是恢复到什么模式的LR,盼恢复。



看配套书2.2.1节的ldm和stm部分关于^的说明。我没不可能说得比书上说得更清楚。注意“正常”两个子。

-----------------------------------------------------------------------------------------------------------------------------
精确延时的问题?
有时候控制需要精确延时几个uS~~在210X下的精确延时是不是也要算每一条指令的周期数然后再乘记数器?~~是不是同一条指令在ARM7TDMI-S兼容内核下都一样~~~
例如:LDR R1,[R2] 需要6个时钟周期
SUB R0, R1, R2 需要1个时钟周期
是不是所有ARM7TDMI-S内核都一样~~??



指令执行时间与指令存储器有关、与流水线有关,不可能精确延时。精确延时必须使用定时器。




是不是一条指令执行的处理器时钟数(cclk)是活的~~不固定?



是,而且还与存储系统有关。



如果用定时器精确延时几个微秒~那不是很浪费系统资源吗?还有其他方法吗?



在确定的存储器中关闭中断时可以精确计算指令执行时间,不过计算比较复杂。
-----------------------------------------------------------------------------------------------------------------------------
怎么在AXD下看每个C文件编译后的汇编代码~~?



在源代码窗口点鼠标右键,stepping mode 选disassembly。再单步运行一下。
-----------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------
μCOS-II 在ARM处理器上的移植要点
μCOS-II 在ARM处理器上的移植要点
来源:internet 点击:47 添加时间:2003-12-19 18:20:20
1. 设置OS_CPU.H 中与处理器和编译器相关的代码 /******************************************************************** ** 与编译器相关的数据类型 ********************************************************************* /typedef unsigned char BOOLEAN; typedef unsigned char INT8U; //8 位无符号整数 typedef signed char INT8S; //8 位有符号整数 typedef unsigned int INT16U; //16 位无符号整数 typedef signed int INT16S; //16 位有符号整数 typedef unsigned long INT32U; //32 位无符号整数 typedef signed long INT32S; //32 位有符号整数 typedef float FP32; //单精度浮点数 typedef double FP64; //双精度浮点数 typedef unsigned int OS_STK; //堆栈入口宽度为16 位 #define BYTE INT8S //字节型 #define UBYTE INT8U //为了与uC/OS V1.xx.兼容 #define WORD INT16S // ... uC/OS-II. #define UWORD INT16U #define LONG INT32S #define ULONG INT32U /******************************************************************** * 与ARM 处理器相关的代码 ********************************************************************/ #define OS_ENTER_CRITICAL() ARMDisableInt() /*关闭中断*/ #define OS_EXIT_CRITICAL() ARMEnableInt() /*开启中断*/ /* 设施堆栈的增长方向*/ #define OS_STK_GROWTH 1 /*堆栈由高地址向低地址增长*/ 2. 用C 语言编写六个操作系统相关的函数(OS_CPU_C.C) void *OSTaskStkInit (void (*task)(void *pd),void *pdata, void *ptos, INT16U opt) {unsigned int *stk; opt = opt; /* 因为‘opt‘ 变量没有用到,防止编译器产生警告*/ stk = (unsigned int *)ptos; /*装载堆栈指针*/ /* 为新任务创建上下文*/ *--stk = (unsigned int) task; /* pc */ *--stk = (unsigned int) task; /* lr */ *--stk = 0; /* r12 */ *--stk = 0; /* r11 */ *--stk = 0; /* r10 */ *--stk = 0; /* r9 */ *--stk = 0; /* r8 */ *--stk = 0; /* r7 */ *--stk = 0; /* r6 */ *--stk = 0; /* r5 */ *--stk = 0; /* r4 */ *--stk = 0; /* r3 */ *--stk = 0; /* r2 */ *--stk = 0; /* r1 */ *--stk = (unsigned int) pdata; /* r0 */ *--stk = (SVC32MODE|0x0); /* cpsr IRQ, 关闭FIQ */ *--stk = (SVC32MODE|0x0); /* spsr IRQ, 关闭FIQ */ return ((void *)stk); } void OSTaskCreateHook (OS_TCB *ptcb) {ptcb=ptcb;//防止编译时出现警告 } void OSTaskDelHook (OS_TCB *ptcb) {ptcb=ptcb;//防止编译时出现警告 } void OSTaskSwHook (void) void OSTaskStatHook (void) void OSTimeTickHook (void) 后5 个函数为钩子函数,可以不加代码。 3.用汇编语言编写四个与处理器相关的函数(OS_CPU.ASM) (1)OSStartHighRdy();运行优先级最高的就绪任务 LDR r4, addr_OSTCBCur ; 得到当前任务的TCB 地址 LDR r5, addr_OSTCBHighRdy ; 得到高优先级任务的TCB 地址 LDR r5, [r5] ;得到堆栈指针 LDR sp, [r5] ;切换到新的堆栈 STR r5, [r4] ; 设置新的当前任务的TCB 地址 LDMFD sp!, {r4} MSR SPSR_cxsf, r4 LDMFD sp!, {r4} ; 从栈顶得到新的声明 MSR CPSR_cxsf, r4 LDMFD sp!, {r0-r12, lr, pc } ; 开始新的任务 END (2)OSCtxSw();任务级的任务切换函数 STMFD sp!, {lr} ; 保存PC 指针 STMFD sp!, {lr} ; 保存lr 指针 STMFD sp!, {r0-r12} ;保存寄存器文件和ret 地址 MRS r4, CPSR STMFD sp!, {r4} ; 保存当前PSR MRS r4, SPSR STMFD sp!, {r4} ; OSPrioCur = OSPrioHighRdy LDR r4, addr_OSPrioCur LDR r5, addr_OSPrioHighRdy LDRB r6, [r5] STRB r6, [r4] ; 得到当前任务的TCB 地址 LDR r4, addr_OSTCBCur LDR r5, [r4] STR sp, [r5] ; 保存栈指针在占先任务的TCB 上 ; 取得高优先级任务的TCB 地址 LDR r6, addr_OSTCBHighRdy LDR r6, [r6] LDR sp, [r6] ;得到新任务的堆栈指针 ; OSTCBCur = OSTCBHighRdy STR r6, [r4] ; 设置当前新任务的TCB 地址set new current task TCB address LDMFD sp!, {r4} MSR SPSR_cxsf, r4 LDMFD sp!, {r4} MSR CPSR_cxsf, r4 LDMFD sp!, {r0-r12, lr, pc} (3)OSIntCtxSw();中断级的任务切换函数 LDMIA sp!,{a1-v1, lr} SUBS pc, lr, #4 SUB lr, lr, #4 MOV r12, lr MRS lr, SPSR AND lr, lr, #0xFFFFFFE0 ORR lr, lr, #0xD3 MSR CPSR_cxsf, lr (4)OSTickISR();中断服务函数 STMDB sp!,{r0-r11,lr} ;interrupt disable(not nessary) mrs r0, CPSR orr r0, r0, #0x80 ; 设置中断禁止标 msr CPSR_cxsf, r0 ;中断结束 ; rI_ISPC= BIT_TIMER0; LDR r0, =I_ISPC LDR r1, =BIT_TIMER0 STR r1, [r0] BL IrqStart BL OSTimeTick BL IrqFinish LDR r0, =need_to_swap_context LDR r2, [r0] CMP r2, #1 LDREQ pc, =_CON_SW 完成了上述工作以后,μCOS-II 就可以正常运行在ARM 处理器上了。

-----------------------------------------------------------------------------------------------------------------------------
陈工:你的Reset函数中 STMIA SP!,{R1-R7,PC}有什么作用?
在Reset函数中的STMIA SP!,{R1-R7,PC}什么意思?
Reset
BL InitStack ;初始化堆栈
STMIA SP!,{R1-R7,PC}
BL TargetResetInit ;目标板基本初始化
;跳转到c语言入口
B __main

我怎么感觉好像是多此一举,白白浪费了8个堆栈空间。不知到底有什么精妙之处?请陈工解答!
谢谢!




您从哪里得到的代码?在哪个例子中?我们的代码应该是没有那一句的。



光盘:实验程序Gpio_TESTLEDDISPInit.s



对不起,这是笔误,仅这一个文件有。
-----------------------------------------------------------------------------------------------------------------------------
请教:我在AXD中能看到TIME0,TIME1,UART等模块的控制寄存器,为什么看不到PWM的寄存器,在哪能看到?


一些寄存器不能读,否则时序不对引起执行错误,所以不能看。


通用而保险的方法:设全局变量=寄存器,看变量值。
-----------------------------------------------------------------------------------------------------------------------------
深思大虾帮我看一下移植程序
我按照周立功提供的移植原型改写的,一运行这个程序就跑飞
在ATMEL55800上移植
OSIntCtxSw

; ADD sp,sp,#24 ;????
;
; LDR r0,=OSTCBCur ; r0 = &OSCTBCur
; LDR r0,[r0] ; r0 = OSCTBCur
; STR sp,[r0] ; OSTCBCur->OSTCBStkPtr = sp 函数原型中没有,??,ATMEL公司的移植有

BL OSTaskSwHook ; 可不要 task switch hook

LDR r0,=OSTCBCur ; r0 = &OSTCBCur
LDR r1,=OSTCBHighRdy ; r1 = &OSTCBHighRdy

LDR r2,[r1] ; r2 = OSTCBHighRdy
STR r2,[r0] ; OSTCBCur = OSTCBHighRdy

LDR r0,=OSPrioCur ; r0 = &OSPrioCur
LDR r1,=OSPrioHighRdy ; r1 = &OSPrioHighRdy

LDRB r3,[r1] ; r3 = OSPrioHighRdy
STRB r3,[r0] ; OSPrioCur = OSPrioHighRdy

LDR sp,[r2] ; sp = OSTCBHighRdy->OSTCBStkPtr
LDMFD sp!,{r0} ; restore SP...
MSR CPSR_xsf,r0
LDMFD sp!,{r0 - r12, lr , pc} ; Load task‘s context & Run task





你可以改成:
MSR SPSR_xsf,r0
后面用:
LDMFD sp!,{r0 - r12, lr , pc}^
返回.

MSR CPSR_xsf,r0
此指令执行后当前模式可能已经更改, 所以后面的 SP 值当然不对了,你查查看.
-----------------------------------------------------------------------------------------------------------------------------
可不可以这样理解~~?
当程序在RAM中调试的时候~~RAMAP是拷贝自己的代码~~因为MAMMAP=2所以中断异常向RAM区跳转~~当程序在Flash中调试的时候 ~~RAMAP是拷贝了Flash处的代码到RAM中去了~~这样RAM区的前8个字和Flash区的前8个字一样~~这时候~~不管MAMMAP=1还是MAMMAP=2~~程序最终都可以跳转到异常处理函数中去~~因为RAM区的前8个字和Flash区的前8个字一样~~都是跳转到Flash中异常处理函数去的~~
~~~痛苦中~~~~高手请指点~~~映射这个词实在难理解~~



-----------------------------------------------------------------------------------------------------------------------------
256页的
“#if(Fcco/Fcclk)==1
PLLCFG=((Fcclk/Fosc)-1)|(0<<5);
#endif ”
小弟不理解,当Fcco与Fcclk的值相等时,由137得出P是小于1的数,这怎样设置呢?谢谢!!



对于PLLCFG的设置是对pll的倍频M和分频P参数进行设置,对于M值只要保证Fcclk<=60MHZ就可以了。这样你就可以根据Fcclk= M*Fosc关系计算得到你要设置的M值;对于P值,他只要保证CCO的工作频率在满足的范围内就可以了,我记得CCO工作频率好象释150多MHZ到 300多MHZ,Fcco=2*p*Fcclk,这样你就可以计算出来P值,他的值还是比较灵活设置的,我不知道我说明白没有
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 05:53 , 耗时 0.102129 秒, 17 个查询请求 , Gzip 开启.

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

桂公网安备 45031202000115号

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

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

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

QQ:28000622;Email:libyoufer@sina.com

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

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