主题 : 终于实现了6410的按键中断 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 39247
精华: 2
发帖: 51
金钱: 355 两
威望: 71 点
贡献值: 2 点
综合积分: 142 分
注册时间: 2011-03-07
最后登录: 2015-05-31
楼主  发表于: 2011-05-14 14:09

 终于实现了6410的按键中断

管理提醒: 本帖被 xoom 执行加亮操作(2011-05-14)
复制代码
  1. 6410的向量中断模式给我们带来很多方便,我们可以不再使用软件来安排我的中断向量表
  2. 这次试验完全试验了在内存中跑的中断程序
  3. 1、初始化代码可以很简短:
  4.   INCLUDE     s3c6410.inc
  5.     INCLUDE     image_cfg.inc
  6.     INCLUDE     MemParam_mDDR.inc
  7.     IMPORT      _main                    ; C entrypoint for Steppingstone loader.
  8.       
  9. ;------------------------------------------------------------------------------
  10. ;
  11. ;    Memory Start Entry
  12. ;
  13. ;    内存里直接启动时入口
  14. ;
  15. ;------------------------------------------------------------------------------
  16.     PRESERVE8 //因为我用的是rvds4,这句必不可少
  17.     AREA Init, CODE, READONLY
  18.     global        MemStart
  19.     ENTRY
  20. MemStart
  21.                      mrc p15,0,r0,c1,c0,0
  22.                      orr r0,r0,#(1<<24)
  23.     mcr p15,0,r0,c1,c0,0
  24.                         
  25.                      b        _main
  26.                      end
  27. 2、main.C:
  28. #include "utils.h"
  29. #include "s3c6410_addr.h"
  30. #include "interrupt.h"
  31. void key_init(void)
  32. {
  33.     rGPNCON = rGPNCON & ~(0xff << 0) | (0xaa << 0);//eint
  34.     rEINT0CON0 = rEINT0CON0 | (0x22 << 0);//both edge
  35.     rEINT0MASK = rEINT0MASK & ~(0xf);
  36. }
  37. void key_isr(void) __irq
  38. {
  39.     
  40.     if(rEINT0PEND & 0x1)
  41.         Uart_Printf("EINT0 is occurred\n");
  42.     else if(rEINT0PEND & 0x2)
  43.         Uart_Printf("EINT1 is occurred\n");
  44.     else if(rEINT0PEND & 0x4)
  45.         Uart_Printf("EINT2 is occurred\n");
  46.     else if(rEINT0PEND & 0x8)
  47.         Uart_Printf("EINT3 is occurred\n");
  48.     
  49.     //Uart_Printf("key interrupt occurred\n");
  50.     rEINT0PEND &= ~(16);//以下两句我不是很明白,但毕竟它工作了
  51.     INTC_ClearVectAddr();
  52. }
  53. void _main(void)
  54. {
  55.     Uart_Init();      
  56.     Port_Init();
  57.     key_init();
  58.     INTC_Init();
  59.     INTC_SetIntISR(0, key_isr);
  60.     INTC_Enable(0);
  61.                      while(1);
  62. }
  63. 我用的tiny6410,光盘里面用说到用jlink来调试的开发文档附带了源代码,把头文件加上去就可以了
  64. ro_base:0x50000000 //代码基址
  65. fisrt =startup.o(Init) //程序入口
  66. 继续研究用key来控制等的亮暗,童鞋们也给点力吧,我很多不明白,需要大家的指点
[ 此帖被venkee.com在2011-06-21 23:11重新编辑 ]
级别: 新手上路
UID: 38174
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2011-02-22
最后登录: 2013-10-31
1楼  发表于: 2011-06-06 19:29
你好,我最近在学习裸机程序,能不能加QQ呢?以后多交流!我的QQ:403752830