共2条
1/1 1 跳转至页
2104,EINT,test 请教2104板上的EINT_test用新模板时怎么不能进入中断
问
调试有关向量中断的例程都可以通过,但这个非向量中断的例程通不过
下面是主程序的代码:
/****************************************************************
* File:EINT1_LED.C
* 功能:使用外部中断1进行LED4的控制,每当有一次中断时,即取反LED4,
* 以便指示中断输入。
* 说明:将跳线器JP8_LED4短接。
*****************************************************************/
#include "config.h"
#define LEDCON 0x00002000 /* P0.13引脚控制LED4,低电平点亮*/
/*****************************************************************
* 名称:IRQ_Eint1()
* 功能:外部中断EINT1服务函数,取反LED4。
* 入口参数:无
* 出口参数:无
****************************************************************/
void __irq IRQ_Eint1(void)
{ uint32 i;
i = VICIRQStatus; // 读出 VICIRQStatus的值
i = IOSET; // 读取当前LED4控制值
if( (i&LEDCON)==0 ) // 控制LED4输出
{
IOSET = LEDCON;
}
else
{
IOCLR = LEDCON;
}
while( (EXTINT&0x02)!=0 ) // 等待外部中断信号恢复为高电平
{ EXTINT = 0x02; // 清除EINT1中断标志
}
}
/***************************************************************
* 名称:main()
* 功能:初始化外部中断1及IO连接等。
****************************************************************/
int main(void)
{ PINSEL0 = 0x20000000; // 设置I/O口工作模式,P0.14设置为EINT1
PINSEL1 = 0x00000000;
IODIR = LEDCON; // 设置LED4控制口为输出,其它I/O为输入
/* 打开EINT1中断(不设置向量控制器,即使用非向量IRQ) */
VICIntSelect = 0x00000000;
VICIntEnable = 0x00008000;
EXTINT = 0x07; // 清除外部中断标志
while(1); // 等待中断
return(0);
}
//===================================================
此外在 startus.s 文件中,修改系统模式堆栈
MSR CPSR_c, #0xdf
LDR SP, =StackUsr
为
MSR CPSR_c, #0x5f
LDR SP, =StackUsr
并没有变化,请问问题出在哪?
答 1: 你怎么可能进的了中断VICVectDefAddr都没有定义 答 2: 之所以用了新的工程不行是因为旧的工程这个程序在启动代码中定死了中断入口地址,书上没说,我以前用了新工程不行,结果糊涂了1星期才知道原因,FT 答 3: 加了 VICVectDefAddr 还是不行啊
/****************************************************************
* File:EINT1_LED.C
* 功能:使用外部中断1进行LED4的控制,每当有一次中断时,即取反LED4,
* 以便指示中断输入。
* 说明:将跳线器JP8_LED4短接。
*****************************************************************/
#include "config.h"
#define LEDCON 0x00002000 /* P0.13引脚控制LED4,低电平点亮*/
/*****************************************************************
* 名称:IRQ_Eint1()
* 功能:外部中断EINT1服务函数,取反LED4。
* 入口参数:无
* 出口参数:无
****************************************************************/
void __irq IRQ_Eint1(void)
{ uint32 i;
i = VICIRQStatus; // 读出 VICIRQStatus的值
i = IOSET; // 读取当前LED4控制值
if( (i&LEDCON)==0 ) // 控制LED4输出
{
IOSET = LEDCON;
}
else
{
IOCLR = LEDCON;
}
while( (EXTINT&0x02)!=0 ) // 等待外部中断信号恢复为高电平
{ EXTINT = 0x02; // 清除EINT1中断标志
}
VICVectAddr = 0; // 增加
}
/***************************************************************
* 名称:main()
* 功能:初始化外部中断1及IO连接等。
****************************************************************/
int main(void)
{ PINSEL0 = 0x20000000; // 设置I/O口工作模式,P0.14设置为EINT1
PINSEL1 = 0x00000000;
IODIR = LEDCON; // 设置LED4控制口为输出,其它I/O为输入
/* 打开EINT1中断(不设置向量控制器,即使用非向量IRQ) */
VICIntSelect = 0x00000000;
VICIntEnable = 0x00008000;
VICDefVectAddr = (int)IRQ_Eint1; //增加
EXTINT = 0x07; // 清除外部中断标志
while(1); // 等待中断
return(0);
}
答 4: 补充: 旧工程也进不了这个中断 答 5: 这个程序在启动代码中定死了中断自己看这个程序的启动代码和其它的有什么不同,你用这个文件加到旧工程中,当然也不可能进中断,因为旧工程的IRQ中断也没有指定入口地址,你要看这个程序原本的启动代码,而不是建立工程时候模块里的启动代码
另外打开CPSR的IRQ中断 答 6: 我分别建立了新旧两个工程 在新模板建立的工程里,对照2132的启动代码和非向量中断的代码,应该作如下的改动:
在主程序里加入 VICDefVectAddr = (int)IRQ_Eint1;
在中断服务程序的结尾加 VICVectAddr = 0; 退出
在 startus.s 文件中,修改系统模式堆栈 MSR CPSR_c, #0xdf 改成 MSR CPSR_c, #0x5f 使能中断
按说这样就可以了,但死活没反应,不知何故
然后在旧工程里,由于中断入口是定死的,因此不需要 VICDefVectAddr = (int)IRQ_Eint1; 和 VICVectAddr = 0; 这两句,结果还是没任何反应,按说光盘上的代码都是测试通过的,完全抄过来怎么不行呢,郁闷! 难道是我的硬件有问题? 发现有关中断的调试老是发生没反应的现象,与中断无关的调试是很正常的
答 7: 用旧的啊.新模板的不行,就用旧模板啊. 答 8: 看来这个问题eleven11比较清楚但是讲的不够详细,对于新手来说难于理解
请问可否细致的讲讲,我也遇到这个问题,不知道如何解决
请教!! 答 9: 启动代码很多人都不看吗?在START.S文件中,有一个开IRQ中断的设置,是系统设置CPSR,有一个选项有的模板好象初始值是#0XDF,这样就把IRQ中断关闭了。自己改成#0X5F就可以运行中断了。。。。。。。。。。去仔细看下吧。。。。。。。。。。
下面是主程序的代码:
/****************************************************************
* File:EINT1_LED.C
* 功能:使用外部中断1进行LED4的控制,每当有一次中断时,即取反LED4,
* 以便指示中断输入。
* 说明:将跳线器JP8_LED4短接。
*****************************************************************/
#include "config.h"
#define LEDCON 0x00002000 /* P0.13引脚控制LED4,低电平点亮*/
/*****************************************************************
* 名称:IRQ_Eint1()
* 功能:外部中断EINT1服务函数,取反LED4。
* 入口参数:无
* 出口参数:无
****************************************************************/
void __irq IRQ_Eint1(void)
{ uint32 i;
i = VICIRQStatus; // 读出 VICIRQStatus的值
i = IOSET; // 读取当前LED4控制值
if( (i&LEDCON)==0 ) // 控制LED4输出
{
IOSET = LEDCON;
}
else
{
IOCLR = LEDCON;
}
while( (EXTINT&0x02)!=0 ) // 等待外部中断信号恢复为高电平
{ EXTINT = 0x02; // 清除EINT1中断标志
}
}
/***************************************************************
* 名称:main()
* 功能:初始化外部中断1及IO连接等。
****************************************************************/
int main(void)
{ PINSEL0 = 0x20000000; // 设置I/O口工作模式,P0.14设置为EINT1
PINSEL1 = 0x00000000;
IODIR = LEDCON; // 设置LED4控制口为输出,其它I/O为输入
/* 打开EINT1中断(不设置向量控制器,即使用非向量IRQ) */
VICIntSelect = 0x00000000;
VICIntEnable = 0x00008000;
EXTINT = 0x07; // 清除外部中断标志
while(1); // 等待中断
return(0);
}
//===================================================
此外在 startus.s 文件中,修改系统模式堆栈
MSR CPSR_c, #0xdf
LDR SP, =StackUsr
为
MSR CPSR_c, #0x5f
LDR SP, =StackUsr
并没有变化,请问问题出在哪?
答 1: 你怎么可能进的了中断VICVectDefAddr都没有定义 答 2: 之所以用了新的工程不行是因为旧的工程这个程序在启动代码中定死了中断入口地址,书上没说,我以前用了新工程不行,结果糊涂了1星期才知道原因,FT 答 3: 加了 VICVectDefAddr 还是不行啊
/****************************************************************
* File:EINT1_LED.C
* 功能:使用外部中断1进行LED4的控制,每当有一次中断时,即取反LED4,
* 以便指示中断输入。
* 说明:将跳线器JP8_LED4短接。
*****************************************************************/
#include "config.h"
#define LEDCON 0x00002000 /* P0.13引脚控制LED4,低电平点亮*/
/*****************************************************************
* 名称:IRQ_Eint1()
* 功能:外部中断EINT1服务函数,取反LED4。
* 入口参数:无
* 出口参数:无
****************************************************************/
void __irq IRQ_Eint1(void)
{ uint32 i;
i = VICIRQStatus; // 读出 VICIRQStatus的值
i = IOSET; // 读取当前LED4控制值
if( (i&LEDCON)==0 ) // 控制LED4输出
{
IOSET = LEDCON;
}
else
{
IOCLR = LEDCON;
}
while( (EXTINT&0x02)!=0 ) // 等待外部中断信号恢复为高电平
{ EXTINT = 0x02; // 清除EINT1中断标志
}
VICVectAddr = 0; // 增加
}
/***************************************************************
* 名称:main()
* 功能:初始化外部中断1及IO连接等。
****************************************************************/
int main(void)
{ PINSEL0 = 0x20000000; // 设置I/O口工作模式,P0.14设置为EINT1
PINSEL1 = 0x00000000;
IODIR = LEDCON; // 设置LED4控制口为输出,其它I/O为输入
/* 打开EINT1中断(不设置向量控制器,即使用非向量IRQ) */
VICIntSelect = 0x00000000;
VICIntEnable = 0x00008000;
VICDefVectAddr = (int)IRQ_Eint1; //增加
EXTINT = 0x07; // 清除外部中断标志
while(1); // 等待中断
return(0);
}
答 4: 补充: 旧工程也进不了这个中断 答 5: 这个程序在启动代码中定死了中断自己看这个程序的启动代码和其它的有什么不同,你用这个文件加到旧工程中,当然也不可能进中断,因为旧工程的IRQ中断也没有指定入口地址,你要看这个程序原本的启动代码,而不是建立工程时候模块里的启动代码
另外打开CPSR的IRQ中断 答 6: 我分别建立了新旧两个工程 在新模板建立的工程里,对照2132的启动代码和非向量中断的代码,应该作如下的改动:
在主程序里加入 VICDefVectAddr = (int)IRQ_Eint1;
在中断服务程序的结尾加 VICVectAddr = 0; 退出
在 startus.s 文件中,修改系统模式堆栈 MSR CPSR_c, #0xdf 改成 MSR CPSR_c, #0x5f 使能中断
按说这样就可以了,但死活没反应,不知何故
然后在旧工程里,由于中断入口是定死的,因此不需要 VICDefVectAddr = (int)IRQ_Eint1; 和 VICVectAddr = 0; 这两句,结果还是没任何反应,按说光盘上的代码都是测试通过的,完全抄过来怎么不行呢,郁闷! 难道是我的硬件有问题? 发现有关中断的调试老是发生没反应的现象,与中断无关的调试是很正常的
答 7: 用旧的啊.新模板的不行,就用旧模板啊. 答 8: 看来这个问题eleven11比较清楚但是讲的不够详细,对于新手来说难于理解
请问可否细致的讲讲,我也遇到这个问题,不知道如何解决
请教!! 答 9: 启动代码很多人都不看吗?在START.S文件中,有一个开IRQ中断的设置,是系统设置CPSR,有一个选项有的模板好象初始值是#0XDF,这样就把IRQ中断关闭了。自己改成#0X5F就可以运行中断了。。。。。。。。。。去仔细看下吧。。。。。。。。。。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |