分享

关于mini2440的一个裸机程序

 独孤琅嬛 2015-01-08
 
  1. <span style="font-size:18px;">/*      
  2.  *File              : main.c  
  3.  *Description       : When you press the key,  
  4.  *                    the LED will show the key_value of key by the binary   
  5.  *                    and produce the buzzer.  
  6.  *Author            : Cong  
  7.  *Copyright         : Cong  
  8.  *  
  9.  *  
  10.  *History  
  11.  *---------------------  
  12.  *Rev   :0.0  
  13.  *Date  :2011/11/26  
  14.  *Creat.  
  15.  *--------------------  
  16.  *  
  17.  *  
  18.  */  
  19.    
  20.  //--------------------Include Files------------------------------------//  
  21. #include "2440addr.h"  
  22. #include "2440slib.h"  
  23.   
  24.   
  25. //---------------------Define Valurable-------------------------------//  
  26.   
  27. #define GLOBAL_CLK 1  
  28.   
  29. #define LED1_ON   ~(1<<5)  
  30. #define LED2_ON   ~(1<<6)  
  31. #define LED3_ON   ~(1<<7)  
  32. #define LED4_ON   ~(1<<8)  
  33.   
  34. #define LED1_OFF (1<<5)  
  35. #define LED2_OFF (1<<6)  
  36. #define LED3_OFF (1<<7)  
  37. #define LED4_OFF (1<<8)  
  38.   
  39. #define BEEP 0  
  40.   
  41. #define LED1 10  
  42. #define LED2 12  
  43. #define LED3 14  
  44. #define LED4 16  
  45.   
  46. #define KEY1 0  
  47. #define KEY2 6  
  48. #define KEY3 10  
  49. #define KEY4 12  
  50. #define KEY5 14  
  51. #define KEY6 22  
  52.   
  53. //--------------------Function Prototype------------------------------//  
  54. static void LEDKEY_port_init(void);  
  55. static void Show_num(int num);  
  56. static void Beep_run(void);  
  57. static void delay(unsigned int times);  
  58. static void __irq key_handler(void);  
  59.   
  60. /*  
  61.  *  
  62.  *程序入口  
  63.  */  
  64.    
  65.    
  66.  void Main(void)  
  67.  {  
  68.     LEDKEY_port_init();  
  69.     while(1)  
  70.     {  
  71.           
  72.     }  
  73.  }  
  74.  /*  
  75.   *===================Function======================  
  76.   * Name            :Port_init  
  77.   * Discription     :init the GPIO  
  78.   *=================================================  
  79.   */  
  80.   static void LEDKEY_port_init(void)  
  81.  {  
  82.     //初始化LED与BEEP所要用到的IO   用到的这五个端口都配置为输出  
  83.     rGPBCON &= ~((3<<BEEP)|(3<<LED1)|(3<<LED2)|(3<<LED3)|(3<<LED4));  
  84.     rGPBCON |= (1<<BEEP)|(1<<LED1)|(1<<LED2)|(1<<LED3)|(1<<LED4);  
  85.       
  86.     //初始化KEY所用的IO     所有的KEY端口都初始化为中断方式  
  87.     rGPGCON &= ~((3<<KEY1)|(3<<KEY2)|(3<<KEY3)|(3<<KEY4)|(3<<KEY5)|(3<<KEY6));  
  88.     rGPGCON |= (2<<KEY1)|(2<<KEY2)|(2<<KEY3)|(2<<KEY4)|(2<<KEY5)|(2<<KEY6);  
  89.       
  90.     //中断初始化EINT8  
  91. //  rEXTINT1 &=~((0xf)|(0xf<<12)|(0xf<<20)|(0xf<<24)|(0xf<<28));            //设置K1的低电平中断  
  92.     rEXTINT1 &=~0xfff0f00f;  
  93.     rEXTINT2 &=~(0xf<<12);  
  94.     rEINTPEND |=(1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19);     //清除K1的中断标志  
  95.     rEINTMASK = ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19));  //打开EINT8的中断使能  
  96.       
  97.     pISR_EINT8_23 = (U32)key_handler;  
  98.     EnableIrq(BIT_EINT8_23);//外部中断8-23共用的中断位使能,与ClearPending对应    
  99.  }  
  100.    
  101.  /*  
  102.   *===================Function======================  
  103.   * Name            :Show_num  
  104.   * Discription     :init the GPIO of Key  
  105.   *=================================================  
  106.   */  
  107.  static void Show_num(int data)  
  108.  {  
  109.     if(data & 0x08)   rGPBDAT = rGPBDAT&(LED4_ON);  
  110.     else           rGPBDAT = rGPBDAT|(LED4_OFF);  
  111.     if(data & 0x04)   rGPBDAT = rGPBDAT&(LED3_ON);  
  112.     else           rGPBDAT = rGPBDAT|(LED3_OFF);  
  113.     if(data & 0x02)   rGPBDAT = rGPBDAT&(LED2_ON);  
  114.     else           rGPBDAT = rGPBDAT|(LED2_OFF);  
  115.     if(data & 0x01)   rGPBDAT = rGPBDAT&(LED1_ON);  
  116.     else           rGPBDAT = rGPBDAT|(LED1_OFF);  
  117.  }  
  118.    
  119.  /*  
  120.   *===================Function======================  
  121.   * Name            :Beep_run  
  122.   * Discription     :produce the buzzer  
  123.   *=================================================  
  124.   */  
  125.  static void Beep_run(void)  
  126. {  
  127.     rGPBDAT |= (0x1<<0);  
  128.     delay(50);  
  129.     rGPBDAT &= (0x0<<0);  
  130.     delay(50);  
  131. }  
  132.    
  133.  /*  
  134.   *===================Function======================  
  135.   * Name            :delay  
  136.   * Discription     :produce delay ,the time is times.  
  137.   *=================================================  
  138.   */  
  139. static void delay(unsigned int times)  
  140. {  
  141.     unsigned int i;  
  142.     for(;times>0;times--)  
  143.     {  
  144.         for(i=400;i>0;i--);  
  145.     }  
  146. }  
  147.  /*  
  148.   *===================Function======================  
  149.   * Name            :key_handler  
  150.   * Discription     :when the key is pressed,  
  151.   *                  the IRQ service will be run.  
  152.   *=================================================  
  153.   */   
  154.  static void __irq key_handler(void)  
  155.  {  
  156.     Beep_run();  
  157.     if(rEINTPEND & (1<<8))  
  158.     {  
  159.         rEINTPEND |=1<<8;  
  160.         Show_num(1);  
  161.     }  
  162.     else if(rEINTPEND & (1<<11))  
  163.     {  
  164.         rEINTPEND |=1<<11;  
  165.         Show_num(2);  
  166.     }  
  167.     else if(rEINTPEND & (1<<13))  
  168.     {  
  169.         rEINTPEND |=1<<13;  
  170.         Show_num(3);  
  171.     }     
  172.     else if(rEINTPEND & (1<<14))  
  173.     {  
  174.         rEINTPEND |=1<<14;  
  175.         Show_num(4);  
  176.     }  
  177.     else if(rEINTPEND & (1<<15))  
  178.     {  
  179.         rEINTPEND |=1<<15;  
  180.         Show_num(5);  
  181.     }  
  182.     else if(rEINTPEND & (1<<19))  
  183.     {  
  184.         rEINTPEND |=1<<19;  
  185.         Show_num(6);  
  186.     }  
  187.     ClearPending(BIT_EINT8_23); //用来清除中断标志位;针对全局的中断       
  188.  }  
  189.  </span>  


实现的功能:当按下mini2440下键盘下的6个按键中的一个时,蜂鸣器发出声音,并且4个发光二极管将以2进制的形式显示出按键的值。其中要比较注意的是EINTPEND的清零是通过置“1”清零的。因为在一些情况下,置一可以1+1=10,可以达到比较高效的目的。

其中以上中断程序是比较有问题的,因为在中断服务程序中还有延时,这样对实时性十分不利,但是在此只是进行ARM裸机程序的简单学习就不深入讨论了,因为我也是才开始学习,只是对一些东西知道,现在也不知道更好的解决方法。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多