12741|18

241

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

Helper2416-19——裸机第十弹——S3C2416中断控制器+定时器中断实践(附源码) [复制链接]

 
本帖最后由 yuanlai2010 于 2014-7-26 20:16 编辑

裸机第十弹——S3C2416中断控制器+定时器中断实践

参与Helper2416开发板助学计划心得
    看了下S3C2416的中断控制器的配置还是比较简单的,对比之前AM335X的中段控制器,感觉S3C2416的中断用起来不是很灵活,至少这个优先级机制感觉很死板,也不能实现抢占优先级,不知道怎么实现高优先级中断打断低优先级中断而执行。不过也可能是我还没能领悟其中的奥妙之处吧!参考下图,基本就知道该怎么使用该中断控制器了


实践目的:
学习怎么使用S3C2416的中断机制,练习汇编及C程序编程。

关键代码解释:
1:start.S / 异常向量表 (实现中断所必须的,位于代码最前端,链接地址为0x00,直接用YL-boot加载到SDRAM中执行(已把0x00重映射到SDRAM起始地址0x30000000))
  1. @******************************************************************************
  2. @
  3. @ The fist thing is to set exception vecter
  4. @
  5. Entry:
  6.                 LDR pc, Reset_Addr
  7.                 LDR pc, Undefined_Addr
  8.                 LDR pc, SWI_Addr
  9.                 LDR pc, Prefetch_Abor_Addr
  10.                 LDR pc, Data_Abort_Addr
  11.                 LDR pc, Nouse_Addr
  12.                 LDR pc, IRQ_Addr
  13.                 LDR pc, FIQ_Addr

  14. Reset_Addr:
  15.                 .word ResetHandler
  16.                
  17. Undefined_Addr:
  18.                 .word UndefInstHandler
  19.                
  20. SWI_Addr:
  21.                 .word SVC_Handler
  22.                
  23. Prefetch_Abor_Addr:
  24.                 .word AbortHandler
  25.                
  26. Data_Abort_Addr:
  27.                 .word AbortHandler
  28.                
  29. Nouse_Addr:
  30.                
  31. IRQ_Addr:
  32.                 .word IRQHandler
  33.                
  34. FIQ_Addr:
  35.                 .word FIQHandler
  36.                
  37. @******************************************************************************
复制代码

2:exceptionhandler.S / IRQ_Handler (完成上下文保护及恢复的工作,同时负责跳转到相应的中断服务函数)
  1. IRQHandler:
  2.         SUB      r14, r14, #4             @ Apply lr correction
  3.         STMFD    r13!, {r0-r3, r12, r14}  @ Save context
  4.         MRS      r12, spsr                @ Copy spsr
  5.         STMFD    r13!, {r12}                          @ Save spsr

  6.         LDR      r0, =INTOFFSET1          @ Get the Offset
  7.         LDR      r1, [r0, #0]
  8.                 LDR      r0, =INTOFFSET2          @ Get the Offset
  9.                 LDR      r2, [r0, #0]
  10.                 ADD      r3, r1, r2                          @ Get the IRQ Offset
  11.                
  12.                 LDR      r0, =interrupt_routine   @ Get the IRQ Bass Address
  13.                 ADD      r14, pc, #0              @ Save return address in LR
  14.         LDR      pc, [r0, r3, lsl #2]     @ Jump to the ISR
  15.                
  16.         LDMFD    r13!, {r12}                    @ Get spsr
  17.         MSR      spsr, r12                @ Restore spsr
  18.         LDMFD    r13!, {r0-r3, r12, pc}^  @ Restore the context and return
复制代码
这里通过以函数指针数组名为基址,以(INTOFFSET1 + INTOFFSET2)*4作为偏移地址寻找各中断服务函数的入口地址,我们只需要把中断服务函数的入口地址(函数名)放到函数指针数组里面就行了,方便中断服务函数的管理。


3:interruptcontrol.c / int_register (注册中断服务函数到函数指针数组里(只包含group1的所有和group2的前7个,之后的全是reserve!),同时完成相关配置)
  1. /*************************** global ****************************/
  2. void (*interrupt_routine[39])(void);

  3. char int_register(unsigned char group, unsigned char number,
  4.                                  void (*_isr)(void))
  5. {
  6.         if((group > 2) || (group < 1) ||(number > 31))
  7.         {
  8.                 return 1;                //参数错误 则返回1
  9.         }
  10.         if(1 == group)
  11.         {
  12.                 SRCPND1 = (1<<number);
  13.                 INTMSK1 &= ~(1<<number);
  14.                 interrupt_routine[number] = _isr;
  15.         }
  16.         else
  17.         {
  18.                 SRCPND2 = (1<<number);
  19.                 INTMSK2 &= ~(1<<number);
  20.                 interrupt_routine[number + 32] = _isr;
  21.         }        
  22. }
复制代码
使用这种中断服务函数注册的方式显得比较方便与高效。


运行效果:
最后,我的工程完成的工作就是在主循环中让蜂鸣器发出嘀嘀响声,在Timer0的中断服务函数中改变LED的亮灭状态,周期为1S。
主函数:
  1. void main()
  2. {
  3.         LED_init();                                                                //初始化LED
  4.         BEEP_init();                                                        //初始化蜂鸣器
  5.         int_initialize();                                                //初始化中断控制器并开启中断
  6.         int_register(1, 10, timer0_handler);        //注册Timer0中断函数
  7.         timer_init();                                                        //初始化Timer0并开始计数
  8.         while(1)
  9.         {
  10.                 BEEP(1);
  11.                 delay(40000);
  12.                 BEEP(0);
  13.                 delay(500000);
  14.         }
  15. }
复制代码


这里就只贴这么几段了,感兴趣的可以下载源码包阅读,如果对中断的处理有什么见解,希望能与大家分享,谢谢!
话说,最近论坛这个板块确实不是很活跃了啊!大家都去研究深奥的东西去了?有什么收获记得回来分享哦!

源码附上:
游客,如果您要查看本帖隐藏内容请回复

YL-boot请移步:https://bbs.eeworld.com.cn/thread-442801-1-1.html

论坛ID:yuanlai2010
发表时间:2014-07-25






最新回复

不错。   详情 回复 发表于 2015-5-23 10:21
点赞 关注

回复
举报

554

帖子

0

TA的资源

版主

沙发
 
我小顶一下!

点评

多谢BOSS支持,只是最近坛子确实不怎么活跃!  详情 回复 发表于 2014-7-25 21:57
 
个人签名My dreams will go on...
http://www.jyxtec.com
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

板凳
 

多谢BOSS支持,只是最近坛子确实不怎么活跃!
 
 
 

回复

554

帖子

0

TA的资源

版主

4
 
也许大家还在埋头学习!呵呵
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
uuuu
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 
uuuuu
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 
看看
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 
GOOD
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

9
 
点对点
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(初级)

10
 
学习下~~~~~~~~~~~~~~~~·
 
 
 

回复

1025

帖子

1

TA的资源

纯净的硅(高级)

11
 
等我的2440回来给大家分享分享USB吧

这种文章我每次想写,但是都是一开始就又写不下去了

点评

哈哈 ,期待你的大作  详情 回复 发表于 2014-9-24 16:45
 
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

12
 
lelee007 发表于 2014-9-24 14:50
等我的2440回来给大家分享分享USB吧

这种文章我每次想写,但是都是一开始就又写不下去了

哈哈 ,期待你的大作
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

13
 
回复 看看 谢谢
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
学习一下。
 
 
 

回复

144

帖子

3

TA的资源

一粒金砂(中级)

15
 
 
个人签名        
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

16
 
学习一下,感谢分享
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

17
 
谢谢。
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

18
 
谢谢分享
搜索
复制

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
不错。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表