单片机/MCU论坛
直播中

张虎豹

7年用户 1586经验值
私信 关注
[问答]

用keil进行aduc7020编程,一直进不了中断是哪里出了问题?

正在用keil进行aduc7020编程,一直进不了中断。根据一些书上7026的timer1实例改了试并不行。有大神表示可能是预定义那里没有填,但并没有搜到该如何填写。
求帮忙,不知道到底问题出在哪了。
相关代码资料如下:
timer1中断代码
#include
void IRQ_Handler(void) __irq;  // IRQ Function Prototype
void delay(int lengh);
   
void SysClkInit(void) //clock   
{   
  PLLKEY1 = 0xAA;
  PLLCON = 0x01;
  PLLKEY2 = 0x55;
  POWKEY1 = 0x01;
  POWCON = 0x00;
  POWKEY2 = 0xF4;
}
int main (void)  
{
  SysClkInit();
  T1LD = 0x500000;  
  T1CON = 0xC4;   // Enable Timer, Periodic and Core CLK
  IRQEN = 0x08;
  DAC3CON = 0x33; // DAC configuration
  while(1){}
}
void IRQ_Handler() __irq
{
    if ((IRQSTA   GP_TIMER_BIT) != 0)
    {
  DAC3DAT=0x08080000;
   delay(10000);
   DAC3DAT=0x00080000;
   }
  return;
}
void delay(int lengh)
{
  while(lengh>0)
  lengh--;
}
仅仅在project里加载此代码和头文件时候,会报以下错误:
.123.axf: Error: L6218E: Undefined symbol DAbt_Handler (referred from aduc702x.o).
.123.axf: Error: L6218E: Undefined symbol FIQ_Handler (referred from aduc702x.o).
.123.axf: Error: L6218E: Undefined symbol PAbt_Handler (referred from aduc702x.o).
.123.axf: Error: L6218E: Undefined symbol SWI_Handler (referred from aduc702x.o).
.123.axf: Error: L6218E: Undefined symbol Undef_Handler (referred from aduc702x.o).
在另外加了以下c文件后,不再报错。(求问这些没有用到的寄存器可不可以不定义?如果不定义的话是否要更改头文件?)
/*    Function Pointers for Interrupts  */
typedef void (* tyVctHndlr) (void);
tyVctHndlr    IRQ     = (tyVctHndlr)0x0;
tyVctHndlr    SWI     = (tyVctHndlr)0x0;
tyVctHndlr    FIQ     = (tyVctHndlr)0x0;
tyVctHndlr    UNDEF   = (tyVctHndlr)0x0;
tyVctHndlr    PABORT  = (tyVctHndlr)0x0;
tyVctHndlr    DABORT  = (tyVctHndlr)0x0;
//void IRQ_Handler   (void) __irq;
void SWI_Handler   (void) __irq;
void FIQ_Handler   (void) __irq;
void Undef_Handler (void) __irq;
void PAbt_Handler  (void) __irq;
void DAbt_Handler  (void) __irq;
//void IRQ_Handler(void) __irq
//{
// if ( *IRQ !=0x00)
// {
// IRQ();
// }
//}
void FIQ_Handler(void) __irq
{
  if ( *FIQ !=0x00)
  {
  FIQ();
  }
}
void SWI_Handler(void) __irq
{
  if ( *SWI !=0x00)
  {
  SWI();
  }
}
void Undef_Handler(void)__irq
{
  if ( *UNDEF !=0x00)
  {
  UNDEF();
  }
}
void PAbt_Handler(void) __irq
{
  if ( *PABORT !=0x00)
  {
  PABORT();
  }
}
void DAbt_Handler(void) __irq
{
  if ( *DABORT !=0x00)
  {
  DABORT();
  }
}
然后咨询了常做嵌入式开发的人,表示可能问题出在预定义没有填

回帖(1)

李斌

2024-1-12 16:38:36
看起来您的问题出在IRQ_Handler函数中。

首先,请确保您已在中断向量表中正确地配置了IRQ_Handler函数的地址。这是通过修改NVIC表(NVIC_VT_BASE)中相应中断的地址来完成的。

另外,请确保您在IRQ_Handler函数前加上了__irq修饰符,以确保该函数可以正确地用作中断服务函数。

关于预定义,您可能需要检查是否正确地配置了相关的标志位。根据您提供的代码,没有足够的信息来确定哪些预定义可能需要进行设置。请参考ADuC7020的数据手册和相关资料,以了解更多关于中断控制器和中断优先级的信息。

最后,关于进一步调试异常处理的建议是,您可以在IRQ_Handler函数中添加一些调试语句,例如通过串口输出一些信息,以确定是否实际进入了中断函数。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分