2440 按键中断

S3C2440 外部按键中断解析 学习bootloader制作的过程中,学到 “通过按键进入中断控制LED亮灭”的实验时,自己所用的开发板和视频讲解中的不同,于是琢磨了一下中断涉及到的各个寄存器,并进行编码尝试,最终完成了实验,达到了通过按键以中断方式控制LED亮灭的目的。2440属于非向量中断方式,和6410、210的向量中断方式对于中断的处理有一些不同,因此本文的讲解并不完全适合6410和210。 阅读详情

很开心,按键中断终于基本搞定了,下面将自己的心得分享下:

 

中断驱动书写流程:
   1.编写本驱动库的入口函数。DllEntry()。
   2.设置物理地址到虚拟地址映射。原因wince启动后是对虚拟地址操作。EINT_InitializeAddresses。
   3.配置中断引脚EINT_ConfigInterruptPin()。
   4.创建一个线程,指定线程函数,并获得句柄。gEINTIntread=CreateThread().
   5.根据ISR获得一个SYSINTR(逻辑中断),所用函数为:KernelIoControl().WINCE提供IO请求命令
     IOCTL_HAL_REQUSST_SYSINTR,用于请求该中断的中断逻辑号。
   6.创建一个Event,并初始化为:自给动触发,未标识,并获得该句柄gReadKeyEvent[0]=CreateEvent(NULL,FALSE,FALSE,NULL).
   7.将SYSINTR与一个Event内核时间关联起来,当中断发生时,引发该事件。InterruptInitialize().
   8.等待时间的出发WaitForSingleObject().
   9.处理中断过程。
   10.通知内核中断处理完毕InterruptDone().
   11.释放中断资源。KernelIoControl().WINCE提供IO请求命令IOCTL_HAL_RELEASE_SYSINTR,用于请求该中断的中断逻辑号。
注意:凡是程序中开发者主动申请的内存,句柄,事件等一定要记得释放。


中断之间的关系在分析:
    外部设备通过CPU的中断引脚向CPU发送中断信号(IRQ),然后通过ISR映射,把IRQ转化成逻辑中断并返回给
内核,IST处理则负责中断的逻辑处理。
    IRQ(Interrupt ReQuest ):物理中断请求。检测是否有中断产生。当中断发生的时候,ISR就会触发事件生效。
    ISR(Interrupt Service Routine):中断服务例程,运行在内核中的一段代码,通常由OEM实现,ISR一般会给
返回一个SYSINTR(逻辑中断号)。也就是说,ISR必须把IRQ转换成逻辑中断号。
    IST(Interrupt Service Thread):中断服务线程。IST也就是一个普通的用户态线程,处理大部分中断操作,
一般空闲,只有操作系统通知IST有中断发生时,IST才操作。
    IST中常用的函数介绍:
InterruptInitialize()函数负责把某个逻辑中断号与一个Event内核对象关联起来。
WaitForSingleObject()阻塞当前线程,等待事件触发生效。
InterruptDone().告诉操作系统中断已经结束。
    IST第一件事情就是使用CreateEnent()函数创建一个Event内核对象,并且使用InterruptInitialize()函数
把这个Event与一个逻辑中断相关联,这样中断发生的时候,操作系统就可以引发这一事件。

 

   下面这个函数是我修改YC里面的,它里面的那个比较乱,很多函数没用,我也不知道上面意思,我把没用的删除掉了,测试后这个程序可以正常使用,我感觉YC里面的驱动很不负责,至少在初学者来说,写的很迷糊,理解起来有点困难,因此将精简的代码写出来,如果哪里错了,还忘各位给提醒下:

 

#include <windows.h>
#include <types.h>
#include <excpt.h>
#include <tchar.h>
#include <cardserv.h>
#include <cardapi.h>
#include <tuple.h>
#include <devload.h>
#include <diskio.h>
#include <nkintr.h>
#include <windev.h>

#include "BSP.h"
#include "pwrbtn2440.h"

#define PRIVATE   static
#define PUBLIC

//以下为一个函数指针
typedef DWORD (*PFN_SetSystemPowerState)(LPCWSTR, DWORD, DWORD);
PFN_SetSystemPowerState   gpfnSetSystemPowerState;

PRIVATE HANDLE gPwrButtonIntrEvent;
PRIVATE HANDLE gPwrButtonIntrThread;


UINT32 g_PwrButtonIrq = IRQ_EINT0;
UINT32 g_PwrButtonSysIntr = SYSINTR_UNDEFINED;
UINT32 g_RebootButtonIrq = IRQ_EINT2;
UINT32 g_RebootButtonSysIntr = SYSINTR_UNDEFINED;
UINT32 g_BattFLTIrq = IRQ_BAT_FLT;
UINT32 g_BattFLTSysIntr = SYSINTR_UNDEFINED;


PRIVATE volatile   S3C2440A_IOPORT_REG   * v_pIOPregs;
volatile           S3C2440A_PWM_REG      * v_pPWMregs;
volatile           S3C2440A_INTR_REG     * v_pINTRregs;

PRIVATE VOID
PBT_EnableInterrupt(VOID)
{

 //Pwr button
 v_pIOPregs->GPFCON  &= ~(0x3 << 0);  /* Set EINT0(GPF0) as EINT0 */
 v_pIOPregs->GPFCON  |=  (0x2 << 0);

 v_pIOPregs->EXTINT0 &= ~(0x7 << 0);  /* Configure EINT0 as Falling Edge Mode */
 v_pIOPregs->EXTINT0 |=  (0x2 << 0);


 //SW_RESET button
 v_pIOPregs->GPFCON  &= ~(0x3 << 4);  /* Set EINT2(GPF2) as EINT2 */
 v_pIOPregs->GPFCON  |=  (0x2 << 4);

 v_pIOPregs->EXTINT0 &= ~(0x7 << 8);  /* Configure EINT2 as Falling Edge Mode */
 v_pIOPregs->EXTINT0 |=  (0x2 << 8);

}


PRIVATE BOOL PBT_IsPushed(VOID)   //判断案件是否按下
{
 
 return  (( v_pIOPregs->GPFDAT & (1 << 0))?  FALSE : TRUE);
}


PRIVATE BOOL PBT_InitializeAddresses(VOID)    //该函数是分配对应的虚拟的GPIO.
{
 BOOL RetValue = TRUE;
    RETAILMSG(1, (TEXT(">>> PBT_initalization address..set../r/n")));
    /* IO Register Allocation */
 v_pIOPregs = (volatile S3C2440A_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2440A_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
 if (v_pIOPregs == NULL)
 {
  ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!/r/n")));
  RetValue = FALSE;
 }
 else
 {
  if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2440A_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2440A_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
  {
   ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy failed!/r/n")));
   RetValue = FALSE;
  }
 }
 
 if (!RetValue)
 {
  RETAILMSG (1, (TEXT("::: PBT_InitializeAddresses - Fail!!/r/n") ));

  if (v_pIOPregs)
  {
   VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
  }

  v_pIOPregs = NULL;
 }

 /* INTR Register Allocation */
 v_pINTRregs = (volatile S3C2440A_INTR_REG *)VirtualAlloc(0, sizeof(S3C2440A_INTR_REG), MEM_RESERVE, PAGE_NOACCESS);
 if (v_pINTRregs == NULL)
 {
  ERRORMSG(1,(TEXT("For INTRregs : VirtualAlloc failed!/r/n")));
  RetValue = FALSE;
 }
 else
 {
  if (!VirtualCopy((PVOID)v_pINTRregs, (PVOID)(S3C2440A_BASE_REG_PA_INTR >> 8), sizeof(S3C2440A_INTR_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
  {
   ERRORMSG(1,(TEXT("For INTRregs: VirtualCopy failed!/r/n")));
   RetValue = FALSE;
  }
 }
 
 if (!RetValue)
 {
  RETAILMSG (1, (TEXT("::: PBT_InitializeAddresses - Fail!!/r/n") ));

  if (v_pINTRregs)
  {
   VirtualFree((PVOID) v_pINTRregs, 0, MEM_RELEASE);
  }

  v_pINTRregs = NULL;
 }
 /* PWM Register Allocation */

 

 return(RetValue);
}
DWORD
PBT_IntrThread(PVOID pArg)    //线程
{
    PBT_InitializeAddresses();  //分得虚拟的IO
    RETAILMSG(1, (TEXT("::: ~~~~~INto~~~PBT_IntrThread~~~~~/r/n")));
    PBT_EnableInterrupt();    //设置中断方式
    gPwrButtonIntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);  //创建事件
     // Request a SYSINTR value from the OAL.
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_PwrButtonIrq, sizeof(UINT32), &g_PwrButtonSysIntr, sizeof(UINT32), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR: PwrButton: Failed to request sysintr value for sw_reset button interrupt./r/n")));
        return(0);
    }
    RETAILMSG(1,(TEXT("INFO: PwrButton: Mapped Irq 0x%x to SysIntr 0x%x./r/n"), g_PwrButtonIrq, g_PwrButtonSysIntr));
   if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_RebootButtonIrq, sizeof(UINT32), &g_RebootButtonSysIntr, sizeof(UINT32), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR: RebootButton: Failed to request sysintr value for sw_reset button interrupt./r/n")));
        return(0);
    }
    RETAILMSG(1,(TEXT("INFO: RebootButton: Mapped Irq 0x%x to SysIntr 0x%x./r/n"), g_RebootButtonIrq, g_RebootButtonSysIntr));

  if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_BattFLTIrq, sizeof(UINT32), &g_BattFLTSysIntr, sizeof(UINT32), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR: BattFLT: Failed to request sysintr value for BattFLT interrupt./r/n")));
        return(0);
    }
    RETAILMSG(1,(TEXT("INFO: BattFLT: Mapped Irq 0x%x to SysIntr 0x%x./r/n"), g_BattFLTIrq, g_BattFLTSysIntr));

  if (!(InterruptInitialize(g_PwrButtonSysIntr, gPwrButtonIntrEvent, 0, 0)))
  {
   RETAILMSG(1, (TEXT("ERROR: PwrButton: Interrupt initialize failed./r/n")));
  }
 if (!(InterruptInitialize(g_RebootButtonSysIntr, gPwrButtonIntrEvent, 0, 0)))
  {
   RETAILMSG(1, (TEXT("ERROR: RebootButton: Interrupt initialize failed./r/n")));
  }

 if (!(InterruptInitialize(g_BattFLTSysIntr, gPwrButtonIntrEvent, 0, 0)))
  {
   RETAILMSG(1, (TEXT("ERROR: g_BattFLTSysIntr: Interrupt initialize failed./r/n")));
  }
 while (1)
 {
  WaitForSingleObject(gPwrButtonIntrEvent, INFINITE);
  //在CPU接收到中断后,对中断的处理是在 OEMInterruptHandler()中,该函数的首先屏蔽该中断
  //最后得到实际中断IRQ所对应的sysintr的值”
  if (v_pINTRregs->INTMSK & (1<<IRQ_EINT2))
  {
   
   if (!KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL))  //得到逻辑地址
    RETAILMSG(1, (TEXT("::: reset error /r/n")));
                InterruptDone(g_RebootButtonSysIntr);   //通知内核中断处理完毕
  }
  else if (v_pINTRregs->INTMSK & (1<<IRQ_EINT0))   //中断屏蔽
  {
              if (PBT_IsPushed())  
    { 
      Sleep(500);            /* To Filter Noise*/
                     RETAILMSG(1, (TEXT("has a keys in  downout /r/n")));
     if (PBT_IsPushed())
     { 
      RETAILMSG(1, (TEXT("::: Back Light On/Off /r/n")));
      
     }
     else
     {
      RETAILMSG(1, (TEXT("::: power off /r/n")));
       if(gpfnSetSystemPowerState != NULL)
       {
        gpfnSetSystemPowerState(NULL, POWER_STATE_SUSPEND, POWER_FORCE);
       }
       //GwesPowerOffSystem的使用很简单:简单调用,系统就会挂起。
       else
       {
        GwesPowerOffSystem();
       }
                 GwesPowerOffSystem();
           Sleep(0);
     }
    }

    InterruptDone(g_PwrButtonSysIntr);
  }
   
      if(v_pINTRregs->INTMSK & (1<<IRQ_BAT_FLT))
  {
   if(gpfnSetSystemPowerState != NULL)
    {
     gpfnSetSystemPowerState(NULL, POWER_STATE_SUSPEND, POWER_FORCE);
    }
    else
    {
     GwesPowerOffSystem();
    }
        GwesPowerOffSystem();
     Sleep(0);
             InterruptDone(g_BattFLTSysIntr);
   }
     else
     {
      //should not happen 
     }
    }         
}


PUBLIC DWORD
DSK_Init(DWORD dwContext)
{
 DWORD      IDThread;
    RETAILMSG(1, (TEXT("~~~~~~~DSK_Init~~~`` /r/n")));
    gPwrButtonIntrThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) PBT_IntrThread, 0, 0, &IDThread);
     RETAILMSG(1, (TEXT("::: PBT_IntrThread ID = %x/r/n"), IDThread));
       if (gPwrButtonIntrThread == 0)
  {
   RETAILMSG(1, (TEXT("::: CreateThread() Fail/r/n")));
      return 0;
  }
           RETAILMSG(1, (TEXT("::: PBT_Init Out/r/n")));
         return TRUE;
}


PUBLIC BOOL WINAPI
DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)     //动态链接库,函数的入口地址
{
    switch ( dwReason )
 {
    case DLL_PROCESS_ATTACH:
        RETAILMSG(1, (TEXT("PwrButton : DllEntry_DLL_PROCESS_ATTACH/r/n")));
  DisableThreadLibraryCalls((HMODULE) hInstDll);
        break;
 }
    return (TRUE);
}

BOOL DSK_Close(
    DWORD Handle
    )
{
    return TRUE;
} 

BOOL DSK_Deinit(
    DWORD dwContext     // future: pointer to the per disk structure
    )
{
    return TRUE;
}  

DWORD DSK_Open(
    DWORD dwData,
    DWORD dwAccess,
    DWORD dwShareMode
    )
{
    return 0;
} 


BOOL DSK_IOControl(
    DWORD Handle,
    DWORD dwIoControlCode,
    PBYTE pInBuf,
    DWORD nInBufSize,
    PBYTE pOutBuf,
    DWORD nOutBufSize,
    PDWORD pBytesReturned
    )
{
    return FALSE;
}   // DSK_IOControl


DWORD DSK_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
 return 0;
}
DWORD DSK_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{
 return 0;
}
DWORD DSK_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
 return 0;
}

void DSK_PowerUp(void)
{
 PBT_EnableInterrupt();
 return;
}

void
DSK_PowerDown(void)
{
 return;
}

   

mini2440 按键驱动(中断) mini2440 按键驱动程序 基于中断方式的实现 立即下载

相关推荐

S3C2440 按键中断程序

基础的S3C2440按键中断程序,对于初学者是个不错的选择。

Windows CE嵌入式导航系统研究(内核相关)

1.1 嵌入式车载导航系统的软件设计流程 嵌入式车载系统软件主要包括系统内核、驱动程序、应用程序三部分。设计的过程当中,我们采用瀑布模型进行设计,首先制定Windows CE5.0系统内核,再次编写相关设备驱动,最后编写或移植应用程序。 制定内核时,我们采用SunSaung2440 BSP(板级支持包)进行制定,同时提交组建保证系统支持网络通讯、文件系统、CAB包安装、汉语支持等功能。不仅如此,为方便系统应用程序开发,内核制定之后,我们发布相应的SDK。 图 5.1 软件设计流程 1.2 Win

Tech is Online(物联网技术传播) 1万+

mini2440/micor2440按键中断代码

mini2440/micor2440按键中断代码,ads工程,含可执行文件

WinCE6.0 DEVICEEMULATOR BSP在GEC2410开发板上的移植(3)-PwrButton驱动移植及分析

PwrButton驱动实现了按键关机(PowerOff)和重启(Reset)的功能.我们这里定义开发板上的K1为PowerOff,K3为Reset,对应与CPU的EINT0和EINT2中断. DEVICEEMULATOR BSP中已经基本实现了该驱动,在GEC2410.bat中使能PwrButton,即设置BSP_NOPWRBTN不为1: set BSP_NOPWRBTN=

shevsten的专栏 2753

2022年电赛E题声源定位跟踪系统

电赛声源定位

qq_53357019的博客 2万+

Silvaco TCAD | GaN HEMT器件仿真与高频功率应用实战

本文详细介绍了使用Silvaco TCAD进行GaN HEMT器件仿真的全流程,涵盖器件结构设计、极化效应建模、高频特性分析及功率损耗优化。通过实战案例展示了GaN HEMT在电动汽车电驱和快充模块等高频功率应用中的性能优势与效率提升策略,为工程师提供可靠的仿真方法与设计验证手段。

desk3的博客 182

S3C2440 I/O口与按键中断

S3C2440,仍然从最简单的IO口开始,不过加上IO中断,用于按键控制, 不再使用库函数,而是直接调用寄存器,寄存器映射见我的另外一篇文章 https://blog.youkuaiyun.com/pxy198831/article/details/86025258 S3C2440寄存器映射表 /****************************** *文件名:key.c *功能: ...

爱笑运气就不会太差 340

鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结

1、算法说明经纬度矫正法, 可以把鱼眼图想象成半个地球, 然后将地球展开成地图,经纬度矫正法主要是利用几何原理, 对图像进行展开矫正。经过P点的入射光线没有透镜的话,本应交于相机成像平面的e点。然而,经过鱼眼相机的折射,光线会交于相机成像平面的d点,就产生了畸变,因此畸变图像整体上呈现出像素朝图像中心点聚集的态势。而去畸变,就是将折射到d点的点,重新映射回到e点,因此去畸变之后的图像与原始的鱼眼图像相比,仿佛是把向心聚集的像素又重新向四周铺展开来。AVM环视系统——鱼眼相机去畸变算法 - 知乎。

大胡子大叔的专栏 2万+

s3c2440中断总结+按键中断

一、启动代码之IRQ中断分析。 二、中断申请      60中断源,其中独立的中断和含有子中断的中断共32个。它们是位或共存。 1、 配置中断控制寄存器  SUB子  SRC源  PND--PENDING 挂起   1)SRCPND---申请中断   每一位对应一个总(独立)的中断源       手动写1---自动清0---有中断产生的那位就自动置1  -----在中断函

My_way_的专栏 1889

SAP生产订单(创建-下达-发料-报工-入库)全流程及反向流程

SAP创建下达报工入库发料以及取消发料取消入库,批量下达删除关闭,生产订单出入库查询和状态更改查询记录

weixin_38974136的博客 2万+

手把手带你搭建一个语音对话机器人:5分钟定制个人AI小助手

通过本文的简单步骤,你已经掌握了如何用 Python 搭建一个语音对话机器人。我们使用了实现语音识别,利用 OpenAI API 生成对话内容,并通过gTTS将文本转换为语音。整个流程非常简洁,你可以根据自己的需求进一步扩展机器人功能,甚至将其集成到实际的应用场景中。

小蜗牛的珍贵百宝箱 4805

mini2440按键中断

ARM中断控制系统 按键驱动程序设计 一.Arm中断控制系统 1.查询方式 程序不断地查询设备的状态,并做出相应的反应。该方式实现比较简单,常用在比较单一的系统中,比如:一个温控系统中可以实用查询的方式不断检测温度变化。 特点:实现简单;但CPU利用率很低,不适合多任务的系统。 2.中断方式 当事件发生时,硬件会设置某个寄存器;CPU在每执行完一个指令时,查看这个寄存器,如果所关注的

峰升的专栏 1008

C#中的Chart控件——当数据源很多时可以显示进度条拉动观察,也可以记录到后台文本详细对照

C#中的Chart控件——当数据源很多时可以显示进度条拉动观察,也可以记录到后台文本详细对照下面进行详细步骤说明,感兴趣的同学可以看一下: 1简单示例(一条线): 2.数据源随着时间不断变化,进度条变化 。多条线: 3.看在整段时期内的数据大体图(消去或出现)进度条: 4.后台将时刻记录变化记录到一个txt文本里以供详细校验: 话不多说上码: using System; using Sys...

帅boy的博客 4308

Mini2440 裸机实验之LED程序、按键、中断

测试平台:Mini2440 Win7 64 ADS开发环境测试   此程序主要考虑按键、LED点亮、中断模式(IRQ)之间的联系 以下为main.c代码部分,其他请参考三星提供的2440用例代码 #define GLOBAL_CLK 1 #include #include #include"def.h" #include"option.h" #include"2440addr.h" #i

行者 2180

Python爬虫教程:抓取区块链交易信息及加密货币市场数据

随着区块链技术和加密货币的迅猛发展,区块链交易和加密货币市场的数据逐渐成为金融、技术、经济研究等领域的热点。对于开发者和研究者而言,实时获取区块链交易数据和加密货币市场行情,对于投资分析、市场预测、技术研究等具有重要的参考价值。本文将通过Python爬虫技术,介绍如何抓取区块链交易信息及加密货币市场数据,详细阐述数据获取的原理、技术方案、实现方法以及抓取到的数据的存储与分析。我们将依托最新的爬虫技术,如requestsSeleniumScrapy,以及相关的数据处理库(如pandasmatplotlib。

2201_76125261的博客 2777

高比例风电电力系统储能运行及配置研究(python&Matlab实现)

目录1 概述2 案例3 Matlab实现 3.1 题目及分析3.2 Matlab代码 4 七个题全部代码(值得学习) 下面我们先以第二题为例,然后给出Matlab代码:先考虑风电装机300MW直接替代机组3的发电功率曲线,观察系统功率平衡发生的变化情况。然后在此场景下,以最小发电成本为目标函数,将负荷分配给两台火电机组1、2和风电机组,绘制机组日发电计划图。再将风电装机容量作为一个决策变量,以最小发电成本为目标函数,求取最小发电成本对应的风电装机容量,绘制机组日发电计划图。1. 风电装机300MW、直接

weixin_46039719的博客 1738

S3C2440的按键中断程序

按键中断是一种外部中断,即他属于一种异常状态,可以产生中断。那么我们怎么样来分析和编写一个基于S3C2440的按键中断代码呢。 一、第一部我们要初始化号响应的参数,分为三步 1.我们肯定要设置一个中断源,让他能够发出中断信号。必须保证2440能够感受到这个外部中断, 这个时候就要通过设置中断源来实现。 2.我们还需要设置一个中断控制器,让他可以向CPU发出中断信号 3.我们还要再设置CP...

weixin_41407439的博客 1056

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

S3C2440—12.按键中断

文章目录一. 总体二. CPSR设置三. 中断源设置四. 中断控制器设置五. C中断处理函数六. 汇编IRQ异常处理程序七. 源码 一. 总体 要驱动按键中断控制LED亮灭,程序要进行如下几部分操作: 在start.S中对CPSR寄存器中清除I位,使能IRQ,这是大前提 根据原理图找出按键对应的外部中断,对外部中断对应引脚做相应配置,使能相应的外部中断:EINTMASK 开启中断使能:INTMSK要设置 编写C中断处理函数,通过INTOFFSET、EINTPEND确定哪个中断触发,并做相应处理,还要清除中

肥宅快乐博客 969

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

S3C2440之按键中断

文章目录前言一、中断过程二、关键代码 前言 本文基于S3C2440开发板所写的按键中断 一、中断过程 1、初始化。①设置中断,让它能够发出中断信号 ②设置中断控制器,让它能发出中断给CPU ③设置CPU,CPSR有I位,它是总开关 2、处理时,要分辨中断源 3、处理完,清中断 二、关键代码 代码如下(示例): #include "s3c2440_soc.h" /* SRCPND 用来显示哪个中断产生了, 需要清除对应位 * bit0-eint0 * bit2-eint2 * bit5-ein..

weixin_43772611的博客 617

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

s3c2440之按键中断驱动

文章目录前言一、代码1.按键中断驱动程序2.测试程序3.Makefile二、结果显示 前言 本文记录的是S3C2440按键中断驱动程序,在查询方式按键驱动程序基础下修改。 一、代码 1.按键中断驱动程序 key_drv.c代码如下(示例): #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include..

weixin_43772611的博客 469

2440按键中断编程

1、其底板按键原理图 将EINT1到核心板原理图去搜 可以看出它对应GPF1这个引脚, 到s3c2440的I/O引脚去找GPF这一组。 a、配置这些按键引脚,即初始化这些中断源 b、初始化中断控制器 我们的按键没有子中断,故不需要设置SUBMASK寄存器,只需要去设置MASK寄存器,对于MODE和Priority保持默认值即可。 保证EINT0、1、2、4保持可以...

weixin_30505043的博客 145

S3C2440按键驱动之中断法

上一篇博客实现了一个S3C2440的按键驱动 但是采用查询法实现,基本占尽了CPU资源,现在写一个改进型驱动,采用中断方式。 在上一篇基础上,我们要将按键对应的几个引脚设为中断引脚,多个引脚共享一个中断函数,然后利用传入的参数id来区分具体是哪个中断。整个代码基本工作流程为:当没有按键按下时,调用该驱动的应用程序处于休眠状态,当有按键按下时,进入到中断函数里去,看是哪个按键被按下。将该按键至于不

cumtgao的专栏 2900

2440裸机程序——按键中断

工程当中需要添加 S3C2440A.s ;2440lib.c;main.c;keyscan.c这段四个程序。 主程序: /********************************************************************************************* * File name: main.c * Author: ZXL  *

ZhuXiaoLong‘Blog 1408

TQ2440裸奔程序>>EINT中断按键测试程序

//========================================= // NAME: main.c // DESC: TQ2440流水灯测试程序 //       板载LED为PB //========================================= /* 头文件包含 */ #define U32 unsigned int /* 中断向量表 */

joshua_cyh的专栏 583

tq2440 按键中断 去抖 改进版 驱动

tq2440 按键中断 去抖 改进版 驱动   http://chen4013874.blog.163.com/blog/static/2042430132012610104025511/ 2012-07-10 22:40:25|  分类: ARM|字号 订阅 功能: 能实现按键中断。 实现去抖动功能,按键基本准确。 用寄存器的方式实现终端屏蔽,还有

ysh1042436059的专栏 877
上一篇: 流式驱动的几个小问题
下一篇: 触摸屏驱动学习笔记 一
EmbeddedLong
博客等级 码龄16年 79粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值