每天学一点 发表于 2014-3-25 21:31:34

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
}

FSL_TICS_ZP 发表于 2014-3-26 11:27:43

楼主,你好!!
你说程序仿真时停留在void set_irq_priority (int irq, int prio),你在初始化过程中就调用此函数,建议你看看具体程序停在哪一行!

每天学一点 发表于 2014-3-26 14:08:04

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) );
    }

FSL_TICS_ZJJ 发表于 2014-3-26 14:34:07

每天学一点 发表于 2014-3-26 14:08
停在这个选择语句中:
if (err != 1)
    {


亲,请参考我这个帖子:http://www.amobbs.com/thread-5573586-1-1.html

gallle 发表于 2014-3-26 15:14:48

看看能的 飞币 不

每天学一点 发表于 2014-3-27 09:20:06

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)中,程序能走第一遍,第二遍就卡在哪里了。可以的话,能不能把你的外部中断程序我学习下。

FSL_TICS_Robin 发表于 2014-4-2 14:33:09

每天学一点 发表于 2014-3-27 09:20
你好,还是老问题,停留在void set_irq_priority (int irq, int prio)中,程序能走第一遍,第二遍就卡在 ...

楼主你好
请问根据4#楼建议,参考那个链接帖子修改后,还是会有问题吗?

每天学一点 发表于 2014-4-2 15:35:10

FSL_TICS_Robin 发表于 2014-4-2 14:33
楼主你好
请问根据4#楼建议,参考那个链接帖子修改后,还是会有问题吗? ...

没问题了,谢谢!

FSL_TICS_Robin 发表于 2014-4-2 15:44:40

每天学一点 发表于 2014-4-2 15:35
没问题了,谢谢!

{:biggrin:} 恭喜楼主问题解决了
能否与大家分享一下问题所在和解决方法呢?

jinyi7016 发表于 2015-2-8 11:00:07

程序自己写的么?还是有例程?
页: [1]
查看完整版本: KL46Z外部中断无法进入,请帮忙(已解决)