共2条
1/1 1 跳转至页
TKS 新手求教中断问题, 请指点啊,TKS!
问
我在用LPC2104学习板做中断实验时,利用timer 0做匹配中断的时候总是不能发生中断,不知道是什么原因,请大虾们指点一下啊.下面是我做实验的原程序.
1.这是ZLG提供的代码,我改了那个控制中断的地方( MSR CPSR_c, #0xDf--->0xdf改成了0x5f)
;/**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: vectors.s
;**创 建 人: 陈明计
;**最后修改日期: 2003年7月1日
;**描 述: lpc210x异常向量入口及异常向量与c语言代码的接口,包括初始化堆栈的代码
;** 每个工程应当有独立的这个文件的拷贝,并进行相应的修改
;**--------------历史版本信息----------------------------------------------------------------------------
;** 创建人: 陈明计
;** 版 本: v1.0
;** 日 期: 2003年5月30日
;** 描 述: 原始版本
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: v1.1
;** 日 期: 2003年6月5日
;** 描 述: 精简代码
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: v1.2
;** 日 期: 2003年7月1日
;** 描 述: 精简代码
;**
;**--------------当前版本修订------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;定义堆栈的大小
USR_STACK_LEGTH EQU 64
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 16
IRQ_STACK_LEGTH EQU 64
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
MEMMAP EQU 0xE01FC040 ; REMAP控制寄存器
;引入的外部标号在这声明
IMPORT FIQ_Exception ;快速中断异常处理程序
IMPORT Reset
; IMPORT IRQ_Exception
;给外部使用的标号在这声明
EXPORT InitStack
EXPORT Vectors
CODE32
AREA Startup,CODE,READONLY
;中断向量表
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
;未定义指令
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
;/*********************************************************************************************************
;** 函数名称: InitStack
;** 功能描述: 初始化堆栈
;** 输 入: 无
;** 输 出 : 无
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 陈明计
;** 日 期: 2003年6月5日
;**-------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
InitStack
MOV R0, LR
;设置管理模式堆栈
MSR CPSR_c, #0xd3
LDR SP, StackSvc
;设置中断模式堆栈
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;设置快速中断模式堆栈
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;设置中止模式堆栈
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;设置未定义模式堆栈
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;设置系统模式堆栈
MSR CPSR_c, #0x5f
LDR SP, StackUsr
; 实现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]
MSR CPSR_c, #0x1f
MOV PC, R0
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
;/* 分配堆栈空间 */
AREA MyStacks, DATA, NOINIT, ALIGN=2
UsrStackSpace SPACE USR_STACK_LEGTH * 4 ;用户(系统)模式堆栈空间
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆栈空间
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中断模式堆栈空间
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中断模式堆栈空间
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止义模式堆栈空间
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定义模式堆栈
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
2.这是我作实验自己的程序.
/***************************************************************
* Timer Test
* 文件名:main.c
* 功能描述:.熟悉PHILIPS ARM21xx 的Timer特性,每过1s LED显示
+1(0~9循环显示)。
****************************************************************/
#include "LPC2106.H"
#include "config.h"
/* P0.14.P0.15,P0.16,P0.22,P0.23,P0.24 连接独立按键
P0.10,P0.11,P0.12,P0.13 连接LED
P0.7 连接Buzzer */
#define LED1CON 0x00000400 /* P0.10引脚控制LED0,低电平点亮*/
#define LED2CON 0x00000800 /* P0.11引脚控制LED1,低电平点亮*/
#define LED3CON 0x00001000 /* P0.12引脚控制LED2,低电平点亮*/
#define LED4CON 0x00002000 /* P0.13引脚控制LED3,低电平点亮*/
#define BUCON 0x00000080 /* P0.7 引脚控制BUZZER,低电平点鸣叫*/
#define KEY1 0x00008000 /* P0.15为按键控制输入*/
#define PRESS 0x00000000
#define RELASE 0x00008000
#define HC595_CS 0x00000100 /*HC595显示片选,低有效*/
unsigned char chCnt;
unsigned char LEDCnt;
const LEDSeg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//0~9
void __irq Timer0_ISR(void);
/*******************************************************************
* 函数名:void InitVIC(void)
* 功能:初始化Vectored interrupt controller 模块
* 输入:无
* 输出:无
*******************************************************************/
void InitVIC(void)
{
VICIntSelect = 0x00;//
VICSoftIntClear = 0xffffffff; //初始化所有中断
VICDefVectAddr = (unsigned int)Timer0_ISR;
VICVectAddr = 0x00; //初始化中断地址
VICIntEnable = 0x10; //允许timer0中断
}/*****************************************************************
* 函数名:void _irq Timer0_ISR(void)
* 功能:每中断一次LEDCnt+1
* 输入:
* 输出:
******************************************************************/
void __irq Timer0_ISR(void)
{
if(LEDCnt<9)
LEDCnt++;
else
LEDCnt = 0;
T0IR= 0x01;
VICVectAddr = 0;
}
/*******************************************************************
* 函数名称:void SPI_Disp(unsigned char bTemp)
* 功能:通过SPI接口向HC595写要显示的数据
* 输入:
* 输出:
*******************************************************************/
void SPI_Disp(unsigned char bTemp)
{
IOCLR = HC595_CS;
SPI_SPDR =bTemp;
while((SPI_SPSR&0x80) ==0);
IOSET = HC595_CS;
}
/*******************************************************************
* 函数名称: void Key(void)
* 功能:检测按键是否有按下
* 输入:
* 输出:
*******************************************************************/
void Key(void)
{
if(((IOPIN&KEY1)==PRESS)&&(chCnt<250))
{
chCnt++;
}
else if((IOPIN&KEY1)==RELASE)
{
chCnt = 0;
}
if( chCnt == 200)
{
if(LEDCnt<9)
LEDCnt++;
else
LEDCnt = 0;
}
}
/******************************************************************/
int main(void)
{
LEDCnt = 0;
PINSEL0 = 0x00005500|0x80; // 设置SPI0
PINSEL1 = 0x00000000;
IODIR = HC595_CS; // 设置HC595_CS控制口为输出
IODIR |= BUCON; //设置Buzzer为输出口
IODIR &= ~KEY1; //设置KEY为输入
IOSET = LED1CON|LED2CON|LED3CON|LED4CON;
SPI_SPCCR = 200;
SPI_SPCR = 0x30;
InitVIC();
T0TC = 0x00;
T0PR = 0x00;
T0MCR = 0x03;
T0MR0 = Fpclk/10;
T0TCR = 0x01;
while(1)
{
Key();
SPI_Disp(LEDSeg[LEDCnt]);
}
return 0;
}
哪位大哥大姐指点我啊,TKS!! 答 1: !!!看一下你的代码,你好像还应该设置自己的中断向量表! 答 2: 那怎么来设置啊?能详细教下我吗?
1.这是ZLG提供的代码,我改了那个控制中断的地方( MSR CPSR_c, #0xDf--->0xdf改成了0x5f)
;/**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: vectors.s
;**创 建 人: 陈明计
;**最后修改日期: 2003年7月1日
;**描 述: lpc210x异常向量入口及异常向量与c语言代码的接口,包括初始化堆栈的代码
;** 每个工程应当有独立的这个文件的拷贝,并进行相应的修改
;**--------------历史版本信息----------------------------------------------------------------------------
;** 创建人: 陈明计
;** 版 本: v1.0
;** 日 期: 2003年5月30日
;** 描 述: 原始版本
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: v1.1
;** 日 期: 2003年6月5日
;** 描 述: 精简代码
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: v1.2
;** 日 期: 2003年7月1日
;** 描 述: 精简代码
;**
;**--------------当前版本修订------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;定义堆栈的大小
USR_STACK_LEGTH EQU 64
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 16
IRQ_STACK_LEGTH EQU 64
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
MEMMAP EQU 0xE01FC040 ; REMAP控制寄存器
;引入的外部标号在这声明
IMPORT FIQ_Exception ;快速中断异常处理程序
IMPORT Reset
; IMPORT IRQ_Exception
;给外部使用的标号在这声明
EXPORT InitStack
EXPORT Vectors
CODE32
AREA Startup,CODE,READONLY
;中断向量表
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
;未定义指令
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
;/*********************************************************************************************************
;** 函数名称: InitStack
;** 功能描述: 初始化堆栈
;** 输 入: 无
;** 输 出 : 无
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 陈明计
;** 日 期: 2003年6月5日
;**-------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
InitStack
MOV R0, LR
;设置管理模式堆栈
MSR CPSR_c, #0xd3
LDR SP, StackSvc
;设置中断模式堆栈
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;设置快速中断模式堆栈
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;设置中止模式堆栈
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;设置未定义模式堆栈
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;设置系统模式堆栈
MSR CPSR_c, #0x5f
LDR SP, StackUsr
; 实现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]
MSR CPSR_c, #0x1f
MOV PC, R0
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
;/* 分配堆栈空间 */
AREA MyStacks, DATA, NOINIT, ALIGN=2
UsrStackSpace SPACE USR_STACK_LEGTH * 4 ;用户(系统)模式堆栈空间
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆栈空间
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中断模式堆栈空间
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中断模式堆栈空间
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止义模式堆栈空间
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定义模式堆栈
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
2.这是我作实验自己的程序.
/***************************************************************
* Timer Test
* 文件名:main.c
* 功能描述:.熟悉PHILIPS ARM21xx 的Timer特性,每过1s LED显示
+1(0~9循环显示)。
****************************************************************/
#include "LPC2106.H"
#include "config.h"
/* P0.14.P0.15,P0.16,P0.22,P0.23,P0.24 连接独立按键
P0.10,P0.11,P0.12,P0.13 连接LED
P0.7 连接Buzzer */
#define LED1CON 0x00000400 /* P0.10引脚控制LED0,低电平点亮*/
#define LED2CON 0x00000800 /* P0.11引脚控制LED1,低电平点亮*/
#define LED3CON 0x00001000 /* P0.12引脚控制LED2,低电平点亮*/
#define LED4CON 0x00002000 /* P0.13引脚控制LED3,低电平点亮*/
#define BUCON 0x00000080 /* P0.7 引脚控制BUZZER,低电平点鸣叫*/
#define KEY1 0x00008000 /* P0.15为按键控制输入*/
#define PRESS 0x00000000
#define RELASE 0x00008000
#define HC595_CS 0x00000100 /*HC595显示片选,低有效*/
unsigned char chCnt;
unsigned char LEDCnt;
const LEDSeg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//0~9
void __irq Timer0_ISR(void);
/*******************************************************************
* 函数名:void InitVIC(void)
* 功能:初始化Vectored interrupt controller 模块
* 输入:无
* 输出:无
*******************************************************************/
void InitVIC(void)
{
VICIntSelect = 0x00;//
VICSoftIntClear = 0xffffffff; //初始化所有中断
VICDefVectAddr = (unsigned int)Timer0_ISR;
VICVectAddr = 0x00; //初始化中断地址
VICIntEnable = 0x10; //允许timer0中断
}/*****************************************************************
* 函数名:void _irq Timer0_ISR(void)
* 功能:每中断一次LEDCnt+1
* 输入:
* 输出:
******************************************************************/
void __irq Timer0_ISR(void)
{
if(LEDCnt<9)
LEDCnt++;
else
LEDCnt = 0;
T0IR= 0x01;
VICVectAddr = 0;
}
/*******************************************************************
* 函数名称:void SPI_Disp(unsigned char bTemp)
* 功能:通过SPI接口向HC595写要显示的数据
* 输入:
* 输出:
*******************************************************************/
void SPI_Disp(unsigned char bTemp)
{
IOCLR = HC595_CS;
SPI_SPDR =bTemp;
while((SPI_SPSR&0x80) ==0);
IOSET = HC595_CS;
}
/*******************************************************************
* 函数名称: void Key(void)
* 功能:检测按键是否有按下
* 输入:
* 输出:
*******************************************************************/
void Key(void)
{
if(((IOPIN&KEY1)==PRESS)&&(chCnt<250))
{
chCnt++;
}
else if((IOPIN&KEY1)==RELASE)
{
chCnt = 0;
}
if( chCnt == 200)
{
if(LEDCnt<9)
LEDCnt++;
else
LEDCnt = 0;
}
}
/******************************************************************/
int main(void)
{
LEDCnt = 0;
PINSEL0 = 0x00005500|0x80; // 设置SPI0
PINSEL1 = 0x00000000;
IODIR = HC595_CS; // 设置HC595_CS控制口为输出
IODIR |= BUCON; //设置Buzzer为输出口
IODIR &= ~KEY1; //设置KEY为输入
IOSET = LED1CON|LED2CON|LED3CON|LED4CON;
SPI_SPCCR = 200;
SPI_SPCR = 0x30;
InitVIC();
T0TC = 0x00;
T0PR = 0x00;
T0MCR = 0x03;
T0MR0 = Fpclk/10;
T0TCR = 0x01;
while(1)
{
Key();
SPI_Disp(LEDSeg[LEDCnt]);
}
return 0;
}
哪位大哥大姐指点我啊,TKS!! 答 1: !!!看一下你的代码,你好像还应该设置自己的中断向量表! 答 2: 那怎么来设置啊?能详细教下我吗?
共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分 |