Q:VPB 是什么意思 英文全称是什么 A:VPB (VLSI Peripheral Bus)
第 232 问:
Q:请问大侠们,2104 怎样与 5V 的外设连接,多谢!!
下一个产品想用 2104,可是用惯了 51,不知怎样与 5V 外设连接,多谢!!
A:可以考虑使用 3.3V 至 5V 的缓冲器件如 4245,最简单的方法就串上个小电阻.
第 233 问:
Q:请教大家:LPC2104 芯片中的 PWM 有中断功能,请问输出置 PWM 匹配通道的中断标志有什么意义,有什么作用
A:举个例子,如果使用 PWM 滤波 生成正弦波,有中断,就方便很多!
第 5 章 GPIO
第 234 问:
Q:我是在 LPC2119 与光隔相连时遇到的这个问题,以前用的片子 IO 口都是 5V 电压,由于2119 是3.3V 所以和以前系统中采用的高速光耦相连时就涉及到两个问题: 接受光耦送来的信号 2119 可否承受还有 2119 输出的信号能否驱动光耦
搞 CAN 的朋友可否同样遇到此问题,我觉得可以解决这个问题,但不敢肯定,我想通过分析光耦内部结构可以解决这个问题,有经验的朋友谈谈吧
A:可以将 CAN 引脚当成普通 IO 口对待,就不会存在疑惑了.
第 235 问:
Q:LPC2119 的 IO 口输出电压是多少,我在数据手册上没有找到还有它的 IO 口带不带上拉电阻
A:GPIO 输出可输出高电平电压约为 3.3V,手册上的 Voh. GPIO 作输入时没有内部上拉.
第 236 问:
Q:请教:LPC2214 的 P2,P3 作为普通 IO 时,怎么设置输入输出方向 没有找到它们的 IODIR! A:与 P0 一样,请下载工程模板,内有头文件.
第 237 问:
Q:请问:LPC2214 的 GPIO 的管脚在输入时没有上拉,在输出时有没有上拉好像在资料里说的都没有上拉. A:P0.2,P0.3是I2C 接口,是开漏输出,所以要外接上拉电阻,其它GPIO不用接.
第 238 问:
Q:LPC2104 实验板接上 JTAG 线时,P0.22 变为 0 我在测试键盘时发现的,一拿下 JTAG 插头,一切正常.
A:使用主 JTAG 调试时,P0.22 为 ETM 跟踪调试口,不能作 GPIO 用.
第 239 问:
Q:请教 LPC2214 的 P2/P3 口做 I/O 口扩展而不是 EMC 怎样访问 手册上没有找到,只有 P0/P1 的访问方法.
A:同 P0 口一样.请下载"EasyARM2100 开发套件快速入门和 L...",里面的头文件有其地址的定义.
第 240 问:
Q:GPIO 哪些内部有上拉,哪些没有
A:《ARM 微控制器基础与实战》中说的明白,都没有上拉电阻的,不过是推挽输出的,输入0,1 都没问题,放心!
第 241 问:
Q:因为看到 LPC2114 外围电源用的是 3.3V 供电,而我想用它的 I2C 接口去控制后面用 5V 供电的芯片,因此想问一下是否可以直接接上拉电阻和 5V 相连 如果不能是不是只能加电平转换了谢谢! A:可以.
第 242 问:
Q:当外部有数据送到 IO 口时,是不是通过读寄存器 IOPIN 就可以得到其 IO 的当前状态呢
A:你说的对,但是要将你要用的 IO 口设为 GPIO(PINSEL0\PINSEL1)方式,并将其设为输入方式(IODIR),就可以了.不过要是你用的 IO 口不连续的话,要将输入的管脚状态处理一下才是你要的字节或是字数据.我就是用这种方式扩展外部 CAN 总线器件的.
第 243 问:
Q:当用用 GPIO 时,输出电流是多大呢急用! A:数据手册上有,Ioh = 4mA.
第 244 问:
Q:请教:2104 的 IOPIN 这个寄存器为什么老是一个值.
我的 IO 不断变化,他就是不变,不知为什么
A:我认为可能是 IODIR(管脚方向寄存器)和 PINSEL0,PINSEL1(管脚功能寄存器)中的一个寄存器没设置好吧.
第 245 问:
Q:可以直接把+5V RAM/FIFO 的数据线和 2104 连接吗(模拟总线时)
A:我做过外接 RAM 的实验,RAM 输入的直接连,输出到 ARM 的串电阻.
第 246 问:
Q:我用 2104 的时候,怎么设置 IO 口,比如例子上有一个:#define LEDCON 0x00002000. 为什么设置 P0.13 的时候要定义为 0x00002000,是怎么计算的.谢了
A:右移 13 位(1 <> 6)/a_mode->ubps;
U0DLM = tmp >> 8;
U0DLL = tmp & 0xff;
tc = a_mode->data_bit;
tc |= a_mode->stop_bit;
tc |= a_mode->parity_bit;
U0LCR = tc;
VICIntSelect = 0x00000000; // 设置所有通道为 IRQ 中断
VICVectCntl0 = 0x26; // UART0 中断通道分配到 IRQ slot 0,即优先级
最高
VICVectAddr0 = (int)IRQ_UART0; // 设置 UART0 向量地址
VICIntEnable = 0x00000040; // 使能 UART0 中断
A:要在 VECTOR.S 文件中打开 IRQ 中断.如"MSR CPSR_c, #0x5F"
第 271 问:
Q:我用开发板自带的一个程序 Debug 调试,然后 AXD 提示:
Warnning! interrupt vectors data is not correct!
Program you downloaded can not run freely!
我不知道其中中断向量的地址是如何算出来的,也就是说程序中的异常向量所指向的位置我不清楚.我买的《ARM 微控制器基础与实战》中提到这儿有一句话解释了下面的程序:在保留的异常向量位置填数据 0xb9205f80,是为了使向量表中所有的数据 32 位累加和为 0.(没明白,0xb9205f80 是如何计算出来的!)
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
ResetAddr DCD Reset
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
A:从 mem 窗口看这些地址是什么数(32 位方式),然后加起来.
第 272 问:
Q:我将光盘里的 EINT1 中的:
config,init.s,
LPC2106.h
target.c
target.h
vectors.s
eint1_led.c
加入项目中,设置的编译环境为:debug, Release DebugRel 中的 R0 base 为 0x40000100; Rw base 为: 0x40003000;Image entry point 为 0x40000100.编译通过,调试,f5 出现第一个默认断点,在全速执行,程序在 while(1) ;循环,按 k1 键 led4 不闪烁,我想是没有进入中断,但我不知道这是为什么,另外我将 r0base 设为 0x40000100 是认为0x40000000 到 0x40000100 之间要放置 remanp 后的中断向量表,不知道这样做对否.
A:如果设置 robase 设为 0x40000100,那么你要把向量表的代码复制到 0x40000000,然后再 REMAP 操作.另处用我们的 EasyJTAG 暂时不能单步调试中断,否则会破坏 VIC 的状态.请用先设置断点,然后全速执行的方式调试.特别注意不能在 0x18 处设置断点(别的仿真器也不能在这设置断点,否则破坏 VIC 的状态).
第 273 问:
Q:贵公司网站上提供的可固化的中断程序中,是将中断向量表先拷贝到 0X40000000,再REMAP 到 FLASH 的底部(我的理解).我认为既然是固化到 FLASH 里,把完成上述功能的程序去掉不是也可以吗
即下面的程序段:
; 实现 REMAP 操作
REMAPS MOV R2,#0x40000000 ; 复制中断向量代码,设置目标地址
LDR R1,=Vectors ; 设置源地址
LDMIA R1!,{R3-R10} ; 共复制 16 个字(64 字节)
STMIA R2!,{R3-R10}
LDMIA R1!,{R3-R10}
STMIA R2!,{R3-R10}
LDR R2,=MEMMAP ; REMAP 操作
MOV R1,#0x02
STR R1,[R2]
A:可以去掉,只是这样做可以动态改变向量表.
第 274 问:
Q:在《ARM 微控制器基础与实践》中的 157 页,在 0X0000018 处加 LDR PC,[PC,#-0XFF0] 指令,为什么就会将 VICVectAddr 寄存器中保存的地址装入 PC
A:like this:
VICVectAddr = 0xFFFFF030
0x00000018+0x08-0xFF0 = 0xFFFFF030
therefore PC = [FFFFF030]
A:为什么不能进入中断,init.s,target.c 都是贵公司的提供的启动代码!!!
向量的初始化为:
Vectors
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xB8A06F58
LDR PC, [PC,#-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD Reset
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
Undefined
B Undefined
SoftwareInterrupt
B SoftwareInterrupt
PrefetchAbort
B PrefetchAbort
DataAbort
B DataAbort
FIQ_Handler
STMFD SP!, {R0-R3, LR}
BL FIQ_Exception
LDMFD SP!, {R0-R3, LR}
SUBS PC, LR, #4
主程序如下:
void __irq IRQ_Handler(void)
{
}
void __irq Time1_Handler(void)
{
}
int main(void)
{
...
T0PR = 99;
T0MCR = 0x03;
T0MR0 = 110592/2;
T0TCR = 0x03;
T1PR = 99;
T1MCR = 0x03;
T1MR0 = 70000;
T1TCR = 0x03;
T0TCR = 0x01;
T1TCR = 0x01;
VICIntSelect = 0x00000000;
VICIntEnable = 0x00000030;
VICVectCntl0 = 0x00000022;
VICVectAddr0 = (int)IRQ_Handler;
VICVectCntl1 = 0x0000002f;
VICVectAddr1 = (int)Time1_Handler;
while(1);
}
A:the Problem may be the channel selection
VICVectCntl0 = 0x00000022; may be VICVectCntl0 = 0x00000024;
VICVectCntl1 = 0x0000002f; may be VICVectCntl1 = 0x00000025;
第 275 问:
Q:断点如果设置在启动时钟节拍之后,在断点处停顿后在继续运行,程序运行就异常了, 这是什么原因
A:不是不中断,而是时钟走过头,还需很长时间才中断.target.c 如下修改即可避免: T0MCR = 0x01; 改为 T0MCR = 0x03;
函数 Timer0 改为
void Timer0(void)
{
T0IR = 0x01;
// T0MR0 += (Fpclk / OS_TICKS_PER_SEC); // 删除此句
VICVectAddr = 0; // 通知中断控制器中断结束
OSTimeTick();
}
第 276 问:
Q:请教寄存器 VICVectAddr 和 VICVectAddr0~15 的使用区别,看文档没有明白,谢谢!
A:VICVectAddr 在发生中断时,存放有服务程序的地址(来自 VICDefVectAddr 或VICVectAddr0~15);而 VICVectAddr0~15 是存放各个向量中断服务程序地址的寄存器, 当发生向量中断时,相应的地址会自动装载到 VICVectAddr 中.
第 277 问:
Q:在一个程序中同时编入两个中断时,不知道如何将一个中断的优先级设定高于另一个中断. 例如:外部中断和定时器的中断.
A:VICVectCntl0~15 优先级递减,参看实验程序 IRQ2_test.
第 278 问:
Q:还有在 AXD 环境下,单步执行怎么起不了作用,会跳到 void IRQ_Exception(void)里面呢 A:有中断时不能单步调试,否则 VIC 工作异常.
第 279 问:
Q:我想问向量表累加和是如何计算的 A:前 8 个字的 32 位机器码相加.
第 280 问:
Q:我把程序下载到 FLASH 中发现 MEMMAP 的值是 01,可是我把程序下载到 RAM 时发现 MEMMAP 的值是 0;不过程序都能运行.我这个程序没有中断,是不是如果我的程序中有中断而且在 RAM 中运行时就必须修改 MEMMAP 同时拷贝向量表到 0x40000000 呢 如果程序中没有中断并在 RAM 中运行时就可以不管 MEMMAP 的值了阿 A:是的.
第 281 问:
Q:为什么在 EINT1 中断实验程序中,中断函数里没有 VICVectAddr="0x00";是因为它是非向量中断吗
A:因为它根本没有使用 VIC 的 VICVectAddr 来判断中断服务程序入口.
第 282 问:
Q:当我作向量 IRQ 中断实验时,将 EINT0 设为最高优先级,EINT1 次之.我在 IRQ_Eint1(void)函数中加入一条 while(1)指令,想作一下优先级差别的实验.我先让 EINT1 中断,这时进入 IRQ_Eint1(void)函数中,并产生死循环,然后我按下 KEY3 想产生 EINT0 中断,结果却没反应,我已经将 EINT0 的优先级设成了最高,为什么不进入 EINT0 中断函数
A:有没有允许中断 进入中断后处理器自动设置 cpsr 中的中断允许位,禁止中断.
文章评论(0条评论)
登录后参与讨论