天嵌 ARM开发社区

 找回密码
 注册
查看: 2285|回复: 6

中断控制LED实验

[复制链接]
yuyukaka789 发表于 2010-8-21 16:44:11 | 显示全部楼层 |阅读模式
各位朋友大家好,我自己写了个外部中断控制程序,目的是K1--K4分别控制LED1--LED4,按一下亮,再按一下熄,但K1,K3,K4都没问题,K2却按一下就亮,但再按一下却不会熄,然后再按K1,K3,K4都不会产生中断,令我很费解啊,我只列出核心代码,启动代码没有!
#define _ISR_STARTADDRESS 0x33ffff00
#define U32 unsigned int
#define pISR_EINT0            (*(unsigned *)(_ISR_STARTADDRESS+0x20))
#define pISR_EINT1            (*(unsigned *)(_ISR_STARTADDRESS+0x24))
#define pISR_EINT2            (*(unsigned *)(_ISR_STARTADDRESS+0x28))
#define pISR_EINT4_7  (*(unsigned *)(_ISR_STARTADDRESS+0x30))
#define rSRCPND     (*(volatile unsigned *)0x4a000000)      //Interrupt request status
#define rINTMSK     (*(volatile unsigned *)0x4a000008)       //Interrupt mask control
#define rINTPND     (*(volatile unsigned *)0x4a000010)       //Interrupt request status
#define rGPBCON    (*(volatile unsigned *)0x56000010) //Port B control
#define rGPBDAT    (*(volatile unsigned *)0x56000014) //Port B data
#define rGPBUP     (*(volatile unsigned *)0x56000018)  //Pull-up control B
#define rGPFCON    (*(volatile unsigned *)0x56000050) //Port F control
#define rEXTINT0   (*(volatile unsigned *)0x56000088)  
#define rEINTMASK  (*(volatile unsigned *)0x560000a4) //External interrupt mask
#define rEINTPEND  (*(volatile unsigned *)0x560000a8) //External interrupt pending
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
static U32 cpu_freq;
static U32 UPLL;
static void __irq key1_interrupt(void);
static void __irq key2_interrupt(void);
static void __irq key3_interrupt(void);
static void __irq key4_interrupt(void);
int x=1;
int y=1;
int z=1;
int w=1;
static void cal_cpu_bus_clk(void)
{
        U32 val;
        U8 m, p, s;
       
        val = rMPLLCON;
        m = (val>>12)&0xff;
        p = (val>>4)&0x3f;
        s = val&3;

        //(m+8)*FIN*2 不要超出32位数!
        FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;
       
        val = rCLKDIVN;
        m = (val>>1)&3;
        p = val&1;       
        val = rCAMDIVN;
        s = val>>8;
       
        switch (m) {
        case 0:
                HCLK = FCLK;
                break;
        case 1:
                HCLK = FCLK>>1;
                break;
        case 2:
                if(s&2)
                        HCLK = FCLK>>3;
                else
                        HCLK = FCLK>>2;
                break;
        case 3:
                if(s&1)
                        HCLK = FCLK/6;
                else
                        HCLK = FCLK/3;
                break;
        }
       
        if(p)
                PCLK = HCLK>>1;
        else
                PCLK = HCLK;
       
        if(s&0x10)
                cpu_freq = HCLK;
        else
                cpu_freq = FCLK;
               
        val = rUPLLCON;
        m = (val>>12)&0xff;
        p = (val>>4)&0x3f;
        s = val&3;
        UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
        UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
}
static void __irq key1_interrupt(void)
{ int led;
  rSRCPND=rSRCPND | 0x01<<1;
  rINTPND=rINTPND | 0x01<<1;
  led =0x01c0;
  if(x!=0)
  {
  rGPBDAT=led;
   x=0;
   }
  else  {
  rGPBDAT=0x0ff0;
  x=1;       };
  
}
static void __irq key2_interrupt(void)
{ int led;
  rSRCPND=rSRCPND | 0x01<<4;
  rINTPND=rINTPND | 0x01<<4;
  led=0x01a0;
  if(y!=0)
  {
  rGPBDAT=led;
   y=0;
   }
  else  
  {
  rGPBDAT=0x0ff0;
  y=1;       };
}
static void __irq key3_interrupt(void)
{ int led;
  rSRCPND=rSRCPND | 0x01<<2;
  rINTPND=rINTPND | 0x01<<2;
  led=0x0160;
  if(z!=0)
  {
  rGPBDAT=led;
   z=0;
   }
  else  {
  rGPBDAT=0x0ff0;
  z=1;       };
}
static void __irq key4_interrupt(void)
{
  int led;
  rSRCPND=rSRCPND | 0x01;
  rINTPND=rINTPND | 0x01;
  led=0x0e0;
  if(w!=0)
  {
  rGPBDAT=led;
   w=0;
   }
  else  {
  rGPBDAT=0x0ff0;
  w=1;       };
  }
void Main(void)
{
        U8 key;
        int i;
        U32 mpll_val = 0;
       
        Port_Init();
       
        i = 2 ;        //don't use 100M!
        switch ( i ) {
        case 0:        //200
                key = 12;
                mpll_val = (92<<12)|(4<<4)|(1);
                break;
        case 1:        //300
                key = 13;
                mpll_val = (67<<12)|(1<<4)|(1);
                break;
        case 2:        //400
                key = 14;
                mpll_val = (92<<12)|(1<<4)|(1);
                break;
        case 3:        //440!!!
                key = 14;
                mpll_val = (102<<12)|(1<<4)|(1);
                break;
        default:
                key = 14;
                mpll_val = (92<<12)|(1<<4)|(1);
                break;
        }
       
        ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
        ChangeClockDivider(key, 12);
        cal_cpu_bus_clk();
        rSRCPND = 0x17;
        rINTMSK = ~0x17;
    rINTPND =0x17;
    rEINTPEND = (1<<4);
    rEINTMASK = ~(1<<4);
    rEXTINT0 = 0x20222;
    rGPBDAT=0x1ff;
     while(1)
   {
    pISR_EINT0  = (U32)key4_interrupt;
    pISR_EINT1  = (U32)key1_interrupt;
    pISR_EINT2  = (U32)key3_interrupt;
    pISR_EINT4_7= (U32)key2_interrupt;
    }
   
        }
关键看哈K2的中断,它是由EINT4控制的。
 楼主| yuyukaka789 发表于 2010-8-21 16:58:11 | 显示全部楼层
那个清楚知道外部中断EINT4在rEINTPEND是怎么控制的
 楼主| yuyukaka789 发表于 2010-8-21 22:32:27 | 显示全部楼层
问题都已解决,谢谢大哥大姐们的关心。
fjq 发表于 2010-9-18 14:31:03 | 显示全部楼层
解决后的完整代码是怎样的呢?
麻烦楼主贴上来学习下啊!!!
cd4514 发表于 2010-10-14 18:05:11 | 显示全部楼层
是啊  打包咯  麻烦下
ljw20060802 发表于 2010-11-3 21:05:14 | 显示全部楼层
贴出来 让大家参考参考
学海无涯 发表于 2010-11-4 20:15:32 | 显示全部楼层
:(能贴贴那是最好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-6-3 14:50 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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