注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

王小二的博客

勤俭以修身,淡泊以明志

 
 
 

日志

 
 

EASY ARM LM1138驱动库的使用—Interrupt(转)  

2010-06-05 23:27:28|  分类: 专业相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

中断基本编程方法

1. 包含必要的头文件

     有2个头文件与中断处理紧密相关,在程序中必须包含,即

      #include <hw_ints.h>
      #include <interrupt.h>

2. 使能相关片内外设,并进行基本的配置

    使能的方法是调用头文件<sysctl.h>中的函数SysCtlPeripheralEnable( )

3,通过调用函数GPIOIntTypeSet( )来进行设置具体中断的类型或触发方式

4. 使能中断

z 用片内外设具体中断的使能函数  例:GPIOPinIntEnable(GPIO_PORTG_BASE , GPIO_PIN_5);
z 用函数IntEnable( ),使能片内外设的总中断  例:IntEnable(INT_GPIOG);
z 用函数IntMasterEnable( ),使能处理器总中断

5. 编写中断服务函数

6. 注册中断服务函数(没搞太懂,懂的读者请指教)

 

总结GPIO中断编程无非就是设置 

        GPIO中断配置
        中断使能(依次调用3个函数)
        中断函数编写(在进入其中断服务函数后,中断状态并不能自动清除,而必须采用软件清除

        GPIOPinIntClear())
        中断注册(修改启动文件startup_ewarm.c)

 

       掌握以下几个库函数的用法:
        GPIOIntTypeSet()      //设置所选GPIO端口指定管脚的中断触发方式
        GPIOPinIntEanble()    
        IntEnable()         
        IntMasterEnable()      
        GPIOPinIntStatus()    //获取所选GPIO端口所有管脚的中断状态
        GPIOPinIntClear()      //清除所选GPIO端口指定管脚的中断

现在能够看别人写的程序可以很顺畅的看下去,但如果让自己独立编程的话估计还是有一定难度,程序这东西还是重在多练啊。。

 

 

补充:中断优先级

      ARM Cortex-M3处理器内核可以配置的中断优先级最多可以有256级。虽然Stellaris系列ARM只实现了8个中断优先级,但对于一个实际的应用来说已经足够了。在较为复杂的控制系统中,中断优先级的设置会显得非常重要。

      在中断优先级中主要是调用几个常用的函数:

     void IntPrioritySet(unsigned long ulInterrupt , unsigned char ucPriority) // 设置一个中断的优先级;   ulInterrupt:指定的中断源;  ucPriority:要设定的优先级,应当取值(0~7) << 5,数值越小优先级越高

      long IntPriorityGet(unsigned long ulInterrupt) //  获取一个中断的优先级 ,带返回值

 说明:返回中断优先级数值,该返回值除以32后才能得到优先级数0~7。如果指定了一个无效的中断,则返回-1。

 

再次补充:那天在看中断的时候没注意中断函数注册的问题,后来看例程的时候意识到中断函数注册的重要性,只有注册了中断函数才能让在执行中断的时候找到终端服务函数入口,。注册方法有两种,一是直接利用中断注册函数,好处是操作简单、可移植性好,但缺点是由于把中断向量表重新映射到SRAM中而导致执行效率下降;另一种方法需要修改启动文件,操作也不算复杂,好处是执行效率很高,缺点是可移植性不够好。经过权衡考虑后,我们还是推荐大家采用后一种方法,因为效率优先、操作也并不复杂。由于我使用的是IAR,故在此只介绍IAR中断函数的注册。

 

在IAR开发环境下,启动文件“Startup.c”是用C语言写的,很好理解。仍以中断服务函数“void I2C_ISR(void)”为例,找到函数声明“extern int main(void);”,在其下一行插入函数声明“void I2C_ISR(void);”;在中断向量表格里,根据注释内容把相应的“IntDefaultHandler”替换为“I2C_ISR”,完成。(说明书原文)

我的理解:仍以中断服务函数“void I2C_ISR(void)”为例,只要在Startup.c中加入extern void I2C_ISR(void);就行说明书中提到的“extern int main(void);”没找到且也没看懂他所表达的意思,欢迎知道的人指正。在中断向量表格里,也就是“__root const uVectorEntry __vector_table[] @ ".intvec" =”大括号里的内从,结合着注释部分看,根据注释内容把相应的“IntDefaultHandler”替换为“I2C_ISR”,完成。

  评论这张
 
阅读(208)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017