搜索
bottom↓
回复: 9

KL46Z外部中断无法进入,请帮忙(已解决)

[复制链接]

出0入0汤圆

发表于 2014-3-25 21:31:34 | 显示全部楼层 |阅读模式
本帖最后由 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)
{
    uint8  n=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

#undef  VECTOR_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
*  备    注:
*************************************************************************/
void  exti_init(PORTx portx, uint8 n,exti_cfg cfg)
{
   
    SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK<<portx);      //开启PORTx端口
   
    PORT_PCR_REG(PORTX[portx],n)= PORT_PCR_MUX(1)| PORT_PCR_IRQC(cfg & 0x7f ) | PORT_PCR_PE_MASK | ((cfg & 0x80 )>>7);   // 复用GPIO , 确定触发模式 ,开启上拉或下拉电阻
    GPIO_PDDR_REG(GPIOx[portx])&=~(1<<n);           //输入模式
    set_irq_priority((INT_PORTD - 16),1);
    enable_irq(INT_PORTD - 16);                           //使能PORT中断,PORTA的ISR中断号为87
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-3-26 11:27:43 | 显示全部楼层
楼主,你好!!
你说程序仿真时停留在void set_irq_priority (int irq, int prio),你在初始化过程中就调用此函数,建议你看看具体程序停在哪一行!

出0入0汤圆

 楼主| 发表于 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) );
    }

出0入0汤圆

发表于 2014-3-26 14:34:07 | 显示全部楼层
每天学一点 发表于 2014-3-26 14:08
停在这个选择语句中:
if (err != 1)
    {

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

出0入96汤圆

发表于 2014-3-26 15:14:48 | 显示全部楼层
看看能的 飞币 不

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

没问题了,谢谢!

出0入0汤圆

发表于 2014-4-2 15:44:40 | 显示全部楼层

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

出0入0汤圆

发表于 2015-2-8 11:00:07 | 显示全部楼层
程序自己写的么?还是有例程?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 14:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表