您的位置 首页 模拟

用中止的方法都操控LED

#include2410lib.h#includeOption.h#include2410slib.h#includedef.h#include2410addr.h#includestdlib.h#i

  1. #include”2410lib.h”
  2. #include”Option.h”
  3. #include”2410slib.h”
  4. #include”def.h”
  5. #include”2410addr.h”
  6. #include”stdlib.h”
  7. #include”string.h”
  8. #include”mmu.h”
  9. #include”timer.h”
  10. #defineLED_OPEN1~(1<<5)
  11. #defineLED_OPEN2~(1<<6)
  12. #defineLED_OPEN3~(1<<7)
  13. #defineLED_CLOSE1(1<<5)
  14. #defineLED_CLOSE2(1<<6)
  15. #defineLED_CLOSE3(1<<7)
  16. intflag=1;
  17. staticvoid__irqkey_handler(void);
  18. //初始化led的端口
  19. voidled_port_init(void)
  20. {
  21. rGPGCON&=0xffff03ff;
  22. rGPGCON|=0x00005400;
  23. }
  24. //初始化按键
  25. voidkey_init(void)
  26. {
  27. //initGPIO(F)
  28. rGPFCON&=0xfffffffC;
  29. rGPFCON|=0x00000002;
  30. //initEINT0register初始化操控EINT0这个中止的外部中止操控器
  31. rEXTINT0&=~(0x7);
  32. //rEINTPEND用来记载有没有发生中止,假如要清楚就置1即可
  33. //rEINTMASK用来指示要不要屏蔽这个中止
  34. //设置ISR
  35. pISR_EINT0=(U32)key_handler;
  36. EnableIrq(BIT_EINT0);//设置INTMASk寄存器
  37. }
  38. voiddely(inttt)
  39. {
  40. inti=0;
  41. intj=0;
  42. for(;i
  43. {
  44. for(;j<100000000;j++);
  45. }
  46. }
  47. voidled_run(void)
  48. {
  49. if(flag)
  50. {
  51. rGPGDAT|=LED_CLOSE1|LED_CLOSE2|LED_CLOSE3;
  52. dely(100);
  53. flag=0;
  54. }
  55. else
  56. {
  57. rGPGDAT&=LED_OPEN1&LED_OPEN2&LED_OPEN3;
  58. dely(100);
  59. flag=1;
  60. }
  61. }
  62. //按键中止函数
  63. staticvoid__irqkey_handler(void)
  64. {
  65. if(rINTPND==BIT_EINT0)//去判别srcpnd这寄存器
  66. {
  67. ClearPending(BIT_EINT0);
  68. led_run();
  69. }
  70. }
  71. intMain()
  72. {
  73. MMU_Init();
  74. led_port_init();
  75. key_init();
  76. while(1);
  77. }

在这儿讲中止首要是为了让自己能搭起一个结构,今后关于中止的程序能有一个的模板.

这个程序的首要效果很简单,便是经过按键来发生中止,然后操控led的亮与灭…

第一步:对中止引脚的初始化

我的开发板EINT0这个中止是有GPF0触发的,所以先对这个引脚进行初始化,初始化的作业便是作业GPFCON操控器让引脚为中止的引脚。经过装备不同的值能够让引脚有不同的功用,这儿的功用便是发生 中止的功用。

第二步:关于该中止内部的设置

中止内部的设置包含了:按键怎么样的情况下算触发中止,内部的pnd要铲除(pnd寄存器是用来记载这个中止是否发生),还有便是内部mask(不能屏蔽该中止)

当然有的中止不必全部都设置,就像EINT0~3如同就不必,由于这几位都是保存的。

第三步:便是设置中止处理函数

这一步应该是比较要害的一步,中止函数是你自己设定的,不过你要把你写的中止处理函数赋值给相对应的当地,这个讲深了便是高档编程与底层之间的联络,关于这个便是arm自身的中止处理进程了。

最好在之前能先调用一下clearpending函数,铲除一下srcpnd与intpnd两个寄存器,设置完处理函数今后就用enableirq这个函数去初始化intmsk这个寄存器,让他不会被屏蔽。

这便是关于中止的一个流程,把握这个的话今后就能够以不变应万变了。

可是关于这个程序还有一点便是关于MMU_Init这个函数是有必要的,原因如同是关于中止向量表的搬运,我查阅了网上的一些材料,而关于详细还不是清楚,可是微观上是这样的。

中止向量表自身是在0地址处,可是咱们在运行程序的时分是在0x30000000处,所以程序发生的中止其实是不能找到想对应的中止处理程序,而MMU_Init如同有一部分的效果便是讲中止向量表也搬运到0x30000000地址处,那样就能够运行了。不过真实的原因还在想的进程中,不过这样是能够解决问题的。下次会对这个问题进行回答的….

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/274711.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部