共2条
1/1 1 跳转至页
axd,interrupt,vectors,data,is,not,correct 如何解决axd的错误提示:interrupt vectors data is
问
请师兄帮忙处理一个问题:这个问题使得我不能正常地用lpc2104板子在axd中进行仿真,弹出提示:
“Warnning! interrupt vectors data is not correct!
Program you downloaded CAN not run freely!”
我在我的程序target.c 中用定时器1来进行计时,并按需要输出匹配。
我不打算使用中断方式,而采用T1中断标志位查询来控制。程序编译通过,只是在axd仿真时当LOAD IMAGE 时,弹出提示:“Warnning! interrupt vectors data is not correct!
Program you downloaded CAN not run freely!”而且不能正常到达我设置的断点,甚至不能进入主程序__main。 我估计是中断的设置出了问题,但是无从下手,所以还请师兄帮忙看看:多谢了!!!target.c 程序如下,使用的是周立功开发板试验程序中定时器试验部分的TIMEOUT.MCP中的target.c 文件。略作修改,关闭了中断,添加了Init_bus()子程序:
/****************************************Copyright (c)**************************************************
** 广州周立功单片机发展有限公司
** 研 究 所
** 产品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: target.c
**创 建 人: 陈明计
**最后修改日期: 2003年7月1日
**描 述: lpc210x(飞利浦的ARM)目标板特殊的代码,包括异常处理程序和目标板初始化程序
** 每个工程应当具有这个文件的拷贝,用户根据程序的需要修改本文件。
**注 意:本文件必须以ARM(32位代码)方式编译,否则,必须更改init.s和vector.s文件
** 别的C代码不必使用ARM(32位代码)方式编译
** 定时的精确性还有待提高,主要是没有考虑指令的执行时间
** //T0TCR = 0x03; // 启动并复位T0TC
** //T0TCR = 0x01; 这个命令是否多余?0x03已经包括0x01了
** 注意p0.2 p0.12 作为io口,作为mat,cap的不同设置,需要随时调整!
**--------------历史版本信息----------------------------------------------------------------------------
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_TARGET
#include "config.h"
#define LEDCON 0x00002000 /* P0.13引脚控制LED,低电平点亮*/
#define TX_CON 0X000001000 /*p0.12 MAT1.0 _OUTPUT*或者IO口*/
#define RX_CON 0x000000400 /*p0.10 IO _INPUT*/
#define BEEP 0X000000080 /*P0.7 BEEP 作为提示信号*/
/*********************************************************************************************************
** 函数名称: IRQ_Exception
** 功能描述: 中断异常处理程序,用户根据需要自己改变程序
**
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2003年7月1日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void __irq IRQ_Exception(void)
{
while(1); // 通知VIC中断处理结束
}
/*********************************************************************************************************
** 函数名称: FIQ_Exception
** 功能描述: 快速中断异常处理程序,用户根据需要自己改变程序
**
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2003年7月1日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void FIQ_Exception(void)
{
while(1); // 这一句替换为自己的代码
}
/*********************************************************************************************************
** 函数名称: TargetInit
** 功能描述: 目标板初始化代码,在需要的地方调用,根据需要改变
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2003年7月1日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TargetInit(void)
{
/* 初始化定时器0;定时器1实现微秒级定时。
Fcclk=Fosc*4=11.0592MHz*4=44.2368MHz
Fpclk=Fcclk/4=44.2368MHz/4=11.0592MHz
*/
T0PR = 0; // 设置定时器分频为1分频,得11.0592MHz
T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC
T0MR0 = 5530; // 比较值
//T0TCR = 0x03; // 启动并复位T0TC
//T0TCR = 0x01;
T1PR = 0; // 设置定时器分频为1分频,得11.0592MHz
T1MCR = 0x03; // 匹配通道0匹配复位TC1,触发中断
T1MR0 = 0XD8000; // 比较值80ms * 11.0592=0xd8000 个计数值
T1EMR = 0x30; // 设置定时器1的T1MR0匹配输出,输出方式为翻转
//T1TCR = 0x03; // 启动并复位T1TC
//T1TCR = 0x01;
/* 设置定时器1中断IRQ */
//VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断
//VICVectCntl0 = 0x24; // 定时器0中断通道分配最高优先级(向量控制器0)
//VICVectAddr0 = (uint32)IRQ_Exception; // 设置中断服务程序地址向量
//VICIntEnable = 0x00000000; // 关闭中断
}
/*********************************************************************************************************
** 函数名称: TargetResetInit
** 功能描述: 调用main函数前目标板初始化代码,根据需要改变,不能删除
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TargetResetInit(void)
{
/* 设置系统各部分时钟 */
PLLCON = 1;
#if ((Fcclk / 4) / Fpclk) == 1
VPBDIV = 0;
#endif
#if ((Fcclk / 4) / Fpclk) == 2
VPBDIV = 2;
#endif
#if ((Fcclk / 4) / Fpclk) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
/* 设置存储器加速模块 */
MAMCR = 2;
#if Fcclk < 20000000
MAMTIM = 1;
#else
#if Fcclk < 40000000
MAMTIM = 2;
#else
MAMTIM = 3;
#endif
#endif
/* 初始化VIC */
VICIntEnClr = 0xffffffff;
VICVectAddr = 0;
VICIntSelect = 0;
/* 添加自己的代码 */
}
void Init_bus(void)
{
IOCLR = TX_CON ;//初始值使得总线为高(注意反向)并保持80ms用来给PIC供电
IOCLR = TX_CON ;
PINSEL0 = 0x02000000; // 设置MAT1.0连接到P0.12;
T1IR = 0X01; //复位标志位
T1IR = 0X00; //在复位中断后,需要置零寄存器
T1TCR = 0x03; // 启动并复位T1TC 预定定时80ms将产生匹配反向跳变
T1TCR = 0x01;
//--------------------------------------------
while ((T1IR&0X01) ==0) // 等待是否到了80ms
T1IR = 0X01; //复位标志位
T1IR = 0X00; //在复位中断后,需要置零寄存器
T1MR0 = 5530; // 比较值500us * 11.0592=5530 个计数值
while ((T1IR&0X01) ==0);
T1IR = 0X01;
T1IR = 0X00; //在复位中断后,需要置零寄存器
//--------------------------------------------
T1MR0 = 664; // 重新输入60us计数值
T1EMR = 0x00; // 设置定时器1的T1MR0匹配输出,输出方式不变
while ((T1IR&0X01) ==0);
T1IR = 0X01; //此时总线电平应该已经为高电平60us
T1IR = 0X00; //在复位中断后,需要置零寄存器
T1TCR = 0x00; //关闭定时器1
//--------------------------------------------
while ((IOPIN & RX_CON)!=0);//等待p0.1低电平到来
while ((IOPIN & RX_CON) ==0);//等待高电平到来,其间应该经历了200us的延时
PINSEL0 = 0x00000000; // 设置 GPIO 连接到P0.12
IOSET = TX_CON ;// 拉低总线送去“读”信号
PINSEL0 = 0x02000000; // 设置MAT1.0连接到P0.12; GPIO 连接到P0.10
T1MR0 = 166; // 输入数值定时15us
T1EMR = 0x30; // 设置定时器1的T1MR0匹配输出,输出方式为翻转
T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
while ((T1IR&0X01) ==0); //检测是否15us计时结束,电平翻转
T1IR = 0X01;
T1IR = 0X00; //在复位中断后,需要置零寄存器
T1TCR = 0x00; //关闭定时器1
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
答 1: 可能是中断向量不对我也出现过这种情况,
AREA vectors,CODE,READONLY
ENTRY
;中断向量表
Reset
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 ResetInit
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
这些初始化代码可能没有下载到0x00000000地址处。 答 2: 我也出现过这样的情况我也出现过这样的情况,后来问了周公司的人,说用ISP方式把Flash察掉,我试了时行时不行。
答 3: 该错误表示中断向量累加和错误,可以使用我们的工程模板建立工程2100模板(内带使用说明):
http://www.zlgmcu.com/download/downs.asp?ID=1074 答 4: tks!!
“Warnning! interrupt vectors data is not correct!
Program you downloaded CAN not run freely!”
我在我的程序target.c 中用定时器1来进行计时,并按需要输出匹配。
我不打算使用中断方式,而采用T1中断标志位查询来控制。程序编译通过,只是在axd仿真时当LOAD IMAGE 时,弹出提示:“Warnning! interrupt vectors data is not correct!
Program you downloaded CAN not run freely!”而且不能正常到达我设置的断点,甚至不能进入主程序__main。 我估计是中断的设置出了问题,但是无从下手,所以还请师兄帮忙看看:多谢了!!!target.c 程序如下,使用的是周立功开发板试验程序中定时器试验部分的TIMEOUT.MCP中的target.c 文件。略作修改,关闭了中断,添加了Init_bus()子程序:
/****************************************Copyright (c)**************************************************
** 广州周立功单片机发展有限公司
** 研 究 所
** 产品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: target.c
**创 建 人: 陈明计
**最后修改日期: 2003年7月1日
**描 述: lpc210x(飞利浦的ARM)目标板特殊的代码,包括异常处理程序和目标板初始化程序
** 每个工程应当具有这个文件的拷贝,用户根据程序的需要修改本文件。
**注 意:本文件必须以ARM(32位代码)方式编译,否则,必须更改init.s和vector.s文件
** 别的C代码不必使用ARM(32位代码)方式编译
** 定时的精确性还有待提高,主要是没有考虑指令的执行时间
** //T0TCR = 0x03; // 启动并复位T0TC
** //T0TCR = 0x01; 这个命令是否多余?0x03已经包括0x01了
** 注意p0.2 p0.12 作为io口,作为mat,cap的不同设置,需要随时调整!
**--------------历史版本信息----------------------------------------------------------------------------
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_TARGET
#include "config.h"
#define LEDCON 0x00002000 /* P0.13引脚控制LED,低电平点亮*/
#define TX_CON 0X000001000 /*p0.12 MAT1.0 _OUTPUT*或者IO口*/
#define RX_CON 0x000000400 /*p0.10 IO _INPUT*/
#define BEEP 0X000000080 /*P0.7 BEEP 作为提示信号*/
/*********************************************************************************************************
** 函数名称: IRQ_Exception
** 功能描述: 中断异常处理程序,用户根据需要自己改变程序
**
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2003年7月1日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void __irq IRQ_Exception(void)
{
while(1); // 通知VIC中断处理结束
}
/*********************************************************************************************************
** 函数名称: FIQ_Exception
** 功能描述: 快速中断异常处理程序,用户根据需要自己改变程序
**
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2003年7月1日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void FIQ_Exception(void)
{
while(1); // 这一句替换为自己的代码
}
/*********************************************************************************************************
** 函数名称: TargetInit
** 功能描述: 目标板初始化代码,在需要的地方调用,根据需要改变
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2003年7月1日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TargetInit(void)
{
/* 初始化定时器0;定时器1实现微秒级定时。
Fcclk=Fosc*4=11.0592MHz*4=44.2368MHz
Fpclk=Fcclk/4=44.2368MHz/4=11.0592MHz
*/
T0PR = 0; // 设置定时器分频为1分频,得11.0592MHz
T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC
T0MR0 = 5530; // 比较值
//T0TCR = 0x03; // 启动并复位T0TC
//T0TCR = 0x01;
T1PR = 0; // 设置定时器分频为1分频,得11.0592MHz
T1MCR = 0x03; // 匹配通道0匹配复位TC1,触发中断
T1MR0 = 0XD8000; // 比较值80ms * 11.0592=0xd8000 个计数值
T1EMR = 0x30; // 设置定时器1的T1MR0匹配输出,输出方式为翻转
//T1TCR = 0x03; // 启动并复位T1TC
//T1TCR = 0x01;
/* 设置定时器1中断IRQ */
//VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断
//VICVectCntl0 = 0x24; // 定时器0中断通道分配最高优先级(向量控制器0)
//VICVectAddr0 = (uint32)IRQ_Exception; // 设置中断服务程序地址向量
//VICIntEnable = 0x00000000; // 关闭中断
}
/*********************************************************************************************************
** 函数名称: TargetResetInit
** 功能描述: 调用main函数前目标板初始化代码,根据需要改变,不能删除
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2003年6月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TargetResetInit(void)
{
/* 设置系统各部分时钟 */
PLLCON = 1;
#if ((Fcclk / 4) / Fpclk) == 1
VPBDIV = 0;
#endif
#if ((Fcclk / 4) / Fpclk) == 2
VPBDIV = 2;
#endif
#if ((Fcclk / 4) / Fpclk) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
/* 设置存储器加速模块 */
MAMCR = 2;
#if Fcclk < 20000000
MAMTIM = 1;
#else
#if Fcclk < 40000000
MAMTIM = 2;
#else
MAMTIM = 3;
#endif
#endif
/* 初始化VIC */
VICIntEnClr = 0xffffffff;
VICVectAddr = 0;
VICIntSelect = 0;
/* 添加自己的代码 */
}
void Init_bus(void)
{
IOCLR = TX_CON ;//初始值使得总线为高(注意反向)并保持80ms用来给PIC供电
IOCLR = TX_CON ;
PINSEL0 = 0x02000000; // 设置MAT1.0连接到P0.12;
T1IR = 0X01; //复位标志位
T1IR = 0X00; //在复位中断后,需要置零寄存器
T1TCR = 0x03; // 启动并复位T1TC 预定定时80ms将产生匹配反向跳变
T1TCR = 0x01;
//--------------------------------------------
while ((T1IR&0X01) ==0) // 等待是否到了80ms
T1IR = 0X01; //复位标志位
T1IR = 0X00; //在复位中断后,需要置零寄存器
T1MR0 = 5530; // 比较值500us * 11.0592=5530 个计数值
while ((T1IR&0X01) ==0);
T1IR = 0X01;
T1IR = 0X00; //在复位中断后,需要置零寄存器
//--------------------------------------------
T1MR0 = 664; // 重新输入60us计数值
T1EMR = 0x00; // 设置定时器1的T1MR0匹配输出,输出方式不变
while ((T1IR&0X01) ==0);
T1IR = 0X01; //此时总线电平应该已经为高电平60us
T1IR = 0X00; //在复位中断后,需要置零寄存器
T1TCR = 0x00; //关闭定时器1
//--------------------------------------------
while ((IOPIN & RX_CON)!=0);//等待p0.1低电平到来
while ((IOPIN & RX_CON) ==0);//等待高电平到来,其间应该经历了200us的延时
PINSEL0 = 0x00000000; // 设置 GPIO 连接到P0.12
IOSET = TX_CON ;// 拉低总线送去“读”信号
PINSEL0 = 0x02000000; // 设置MAT1.0连接到P0.12; GPIO 连接到P0.10
T1MR0 = 166; // 输入数值定时15us
T1EMR = 0x30; // 设置定时器1的T1MR0匹配输出,输出方式为翻转
T0TCR = 0x03; // 启动并复位T0TC
T0TCR = 0x01;
while ((T1IR&0X01) ==0); //检测是否15us计时结束,电平翻转
T1IR = 0X01;
T1IR = 0X00; //在复位中断后,需要置零寄存器
T1TCR = 0x00; //关闭定时器1
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
答 1: 可能是中断向量不对我也出现过这种情况,
AREA vectors,CODE,READONLY
ENTRY
;中断向量表
Reset
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 ResetInit
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
这些初始化代码可能没有下载到0x00000000地址处。 答 2: 我也出现过这样的情况我也出现过这样的情况,后来问了周公司的人,说用ISP方式把Flash察掉,我试了时行时不行。
答 3: 该错误表示中断向量累加和错误,可以使用我们的工程模板建立工程2100模板(内带使用说明):
http://www.zlgmcu.com/download/downs.asp?ID=1074 答 4: tks!!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |