• 3c2410裸板程序入门单按键(二)


    key.c 

    1#include"key.h"
    2#include"uart.h"
    3#include"s3c2410.h"
    17
    __irq
    void
    key_handler()
    18
    {
    19
    sendstring(
    "key1 down!!!\n"
    );
    20
    21
    EINTPEND |=
    0x1
    <<
    19
    ;
    22
    SRCPND |=
    0x1
    <<
    5
    ;
    23
    INTPND = INTPND;
    24
    }
    25
    26void
    key_init()
    27
    {
    28
    INTMOD =
    0x0
    ;
    29
    INTMSK &= ~(
    0x1
    <<
    5);
    31
    GPECON = (GPECON & ~(
    0x3
    <<
    22
    )) |
    0x1
    <<
    22
    ;
    32
    GPEDAT &= ~(
    0x1
    <<
    11);
    34
    GPGCON = (GPGCON & ~(
    0x3
    <<
    22
    )) |
    0x2
    <<
    22;
    36
    EXTINT2 = (EXTINT2 & ~(
    0x7
    <<
    12
    )) |
    0x2
    <<
    12;
    38
    EINTMASK &= ~(
    0x1
    <<
    19);
    40
    *(
    unsigned
    int
    *)(
    0x33ffff20
    +
    5
    *
    4
    ) = (
    unsigned
    int
    )key_handler;
    41
    }

    注意__irq 修士的key_handler 就是二级中断处理函数,这里没有查二级中断号,也没有做消除抖动处理,所以不完善,只是为了演示中断过程,用串口向pc发送了一个字符串。注意处理完成后要清除中断,否则会一直中断。还要注意中断的返回,__irq是armcc的关键字,gcc是不能用的,使用它以后,调试时看对应的汇编代码:

     STMDB     R13!,{R0-R3,R12,R14} ...

     LDMIA     R13!,{R0-R3,R12,R14}

    SUBS      PC,R14,#0x00000004 可知自动做了pc指针的调整,适应流水线机构。

    key_init函数中的这一句

     *(unsigned int *)(0x33ffff20+5*4) = (unsigned int)key_handler;

    正是把二级中断处理函数的地址安装到中断向量表中。中断控制的寄存器包括pnd, mask等,专门讲中断的文章中有讲到,芯片资料说明也很详细。

    main.c

     1 #include "key.h"
     2 #include "led.h"
     3 #include "uart.h"
     4 #include "s3c2410.h"
     5 
     6 
     7 
     8 int main(void)
     9 {
    10     key_init();
    11     uart_init();
    12     sendstring("hello world!\n");
    13     myblink();
    14     return 0;
    15 }
  • 相关阅读:
    Cg:访问OpenGL的状态
    C++ Exception Handling
    C语言的调用规约(Calling Convension)之参数传递和返回值
    Why is FBX readonly in animation editor when imported?
    如何在Visual Studio中编译wxWidgets
    ICU字符集编码转换一例
    VisTools
    关于数值分析和LCP问题的一些开源项目
    C++: The Case Against Global Variables
    老男孩筷子兄弟
  • 原文地址:https://www.cnblogs.com/liujiahi/p/2196352.html
Copyright © 2020-2023  润新知