KL46Z外部中断无法进入,请帮忙(已解决)
本帖最后由 FSL_TICS_ZP 于 2014-4-1 09:23 编辑正在学习M0+,进行到外部中断阶段,中断一直无法进入,仿真时发现停留在arm_cmo文件的void set_irq_priority (int irq, int prio)函数中请大家帮忙分析下。
1、硬件平台:FRDM-46Z
2、测试方式:按下开发板按键(SW1),触发PTC_3端口中断,中断服务程序促使LED2(红灯)翻转。
*程序实现方式:在飞思卡尔官方例程(KL46_SC)的gpio_led_demo工程基础上,加入野火的exti构件。变动部分的代码如下:
*****************************************
主程序部分:
int main (void)
{
/*LED init*/
gpio_init(PORTD,5,1,1);
gpio_init(PORTE,29,1,1);
/*SW init*/
exti_init(PORTC,3,zero_up);
while(1)
{
for(uint16 i=0;i<10000;i++)
{
for(uint16 k=0;k<1000;k++)
{
;;
}
}
gpio_turn(PORTD,5);
// gpio_turn(PORTE,29);
}
}
*****************************************
中断服务程序isr.c:
#include "common.h"
#include "exti.h"
#include "gpio.h"
void exti_isr(void)
{
uint8n=0; //引脚号
/*根据自己的引脚号,自己编写,这里给出 n= 0 的模版,即 PTAn 产生外部中断
*也给出 n=26 例子 ,自行修改 n 即可,添加用户任务就行
*/
//========================== n = 0 模版 ========================================
n=3;
if(PORTC_ISFR & (1<<n)) //PTA0触发中断
{
PORTC_ISFR|= (1<<n); //写1清中断标志位
/*以下为用户任务*/
gpio_turn(PORTE,29);
/*以上为用户任务*/
}
}
*****************************************
中断服务程序头文件isr.h:
#ifndef __ISR_H
#define __ISR_H 1
#undefVECTOR_47
#define VECTOR_47 exti_isr
extern void exti_isr(void);
#endif//__ISR_H
*****************************************
外部中断构件exti.c:
#include "common.h"
#include "gpio.h"
#include "exti.h"
/*************************************************************************
* 野火嵌入式开发工作室
*
*函数名称:exti_init
*功能说明:EXTI外部GPIO中断初始化
*参数说明:PORTx 端口号(PORTA,PORTB,PORTC,PORTD,PORTE)
* n 端口引脚
* exti_cfg 触发选项和上拉下拉选项
*函数返回:无
*修改时间:2012-1-20
*备 注:
*************************************************************************/
voidexti_init(PORTx portx, uint8 n,exti_cfg cfg)
{
SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK<<portx); //开启PORTx端口
PORT_PCR_REG(PORTX,n)= PORT_PCR_MUX(1)| PORT_PCR_IRQC(cfg & 0x7f ) | PORT_PCR_PE_MASK | ((cfg & 0x80 )>>7); // 复用GPIO , 确定触发模式 ,开启上拉或下拉电阻
GPIO_PDDR_REG(GPIOx)&=~(1<<n); //输入模式
set_irq_priority((INT_PORTD - 16),1);
enable_irq(INT_PORTD - 16); //使能PORT中断,PORTA的ISR中断号为87
} 楼主,你好!!
你说程序仿真时停留在void set_irq_priority (int irq, int prio),你在初始化过程中就调用此函数,建议你看看具体程序停在哪一行! FSL_TICS_ZP 发表于 2014-3-26 11:27
楼主,你好!!
你说程序仿真时停留在void set_irq_priority (int irq, int prio),你在初始化过程中就调用 ...
停在这个选择语句中:
if (err != 1)
{
/* Determine which of the NVICIPx corresponds to the irq */
div = irq / 4;
prio_reg = (uint8 *)((uint32)&NVIC_IP(div));
/* Assign priority to IRQ */
*prio_reg = ( (prio&0x3) << (8 - ARM_INTERRUPT_LEVEL_BITS) );
} 每天学一点 发表于 2014-3-26 14:08
停在这个选择语句中:
if (err != 1)
{
亲,请参考我这个帖子:http://www.amobbs.com/thread-5573586-1-1.html 看看能的 飞币 不 FSL_TICS_ZJJ 发表于 2014-3-26 14:34
亲,请参考我这个帖子:http://www.amobbs.com/thread-5573586-1-1.html
你好,还是老问题,停留在void set_irq_priority (int irq, int prio)中,程序能走第一遍,第二遍就卡在哪里了。可以的话,能不能把你的外部中断程序我学习下。 每天学一点 发表于 2014-3-27 09:20
你好,还是老问题,停留在void set_irq_priority (int irq, int prio)中,程序能走第一遍,第二遍就卡在 ...
楼主你好
请问根据4#楼建议,参考那个链接帖子修改后,还是会有问题吗? FSL_TICS_Robin 发表于 2014-4-2 14:33
楼主你好
请问根据4#楼建议,参考那个链接帖子修改后,还是会有问题吗? ...
没问题了,谢谢! 每天学一点 发表于 2014-4-2 15:35
没问题了,谢谢!
{:biggrin:} 恭喜楼主问题解决了
能否与大家分享一下问题所在和解决方法呢? 程序自己写的么?还是有例程?
页:
[1]