10846|12

545

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

LM3S8962GPIO中断操作 [复制链接]

                    GPIO中断操作:

Stellaris 系列 ARM 里,每个 GPIO 管脚都可以作为外部中断输入。中断的触发类型

为边沿触发和电平触发两大类,共 5 种,用起来非常灵活。配置 GPIO管脚的中断触发方

可以通过调用函数 GPIOIntTypeSet( )来实现。函数 GPIOPinIntEnable( ) GPIOPinIntDisable( )用来使能和禁止 GPIO管脚中断

函数 GPIOPinIntStatus( )用来获取 GPIO管脚的中断状态。在同一个 GPIO 端口上,8

IO管脚的中断向量都是共用的。如果同时配置了同一端口上的多个管脚中断,则可以先用函数 GPIOPinIntStatus( )读取中断状态, 再进一步确认具体是哪个管脚产生的中断请求。

函数GPIOPinIntClear( )用来及时清除 GPIO管脚的中断状态

1 函数 GPIOIntTypeSet( )

功能  设置所选GPIO端口指定管脚的中断触发类型

原型  void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, unsigned long ulIntType)

参数

ulPort:所选GPIO端口的基址

ucPins:指定管脚的位组合表示

ulIntType:指定中断触发机制的类型,应当取下列值之一:

  GPIO_FALLING_EDGE     //   下降沿触发中断

  GPIO_RISING_EDGE     //   上升沿触发中断

GPIO_BOTH_EDGES    //   双边沿触发中断(上升沿和下降沿都会触发中断)

  GPIO_LOW_LEVEL    //   低电平触发中断

  GPIO_HIGH_LEVEL   //    高电平触发中断

例如要设置GPIO_PORTF端口的F1为下降沿触发中断方式,可以用下面的函数:

GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_1,GPIO_BOTH_EDGES)

最新回复

中断服务子程序能包含多任务吗?比如中断发生后,AD端口开始采样,PA2开始输出PWM波,同时定时1s后,点亮LED。  详情 回复 发表于 2015-1-21 15:23
 
点赞 关注(2)

回复
举报

545

帖子

0

TA的资源

一粒金砂(高级)

推荐
 

主函数,由于按键没有接上拉电阻,所以KEY端口设置为弱上拉,这样就能检测到按键的高低电平了。

/*********************************************************************************************************
** 函数原形:int main(void)
** 功能描述:点亮LED1,并等待按键的中断。
** 参数说明:无
** 返回值:  0
*********************************************************************************************************/
int main(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);                   /*  使能GPIO PF口  */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);                   /*  使能GPIO PE口 */

    GPIODirModeSet(GPIO_PORTE_BASE, KEY, GPIO_DIR_MODE_IN);      /*设置连接KEY的PE0为输入*/
    GPIODirModeSet(GPIO_PORTF_BASE, LED1, GPIO_DIR_MODE_OUT);    /* 设置连接LED的PF0为输出 */

    GPIOPadConfigSet(GPIO_PORTE_BASE, KEY,       /* 设置KEY的驱动强度和类型 */
                     GPIO_STRENGTH_4MA,         /*4mA的输出驱动强度*/
                     GPIO_PIN_TYPE_STD_WPU);   /*  设置KEY端口为弱上拉    */
                    
    GPIOPadConfigSet(GPIO_PORTF_BASE, LED1,      /*  设置LED1的驱动强度和类型  */
                     GPIO_STRENGTH_4MA,       /*  4mA的输出驱动强度   */
                     GPIO_PIN_TYPE_STD);  /*  设置为推挽管脚        */

                                                                       
    GPIOIntTypeSet(GPIO_PORTE_BASE, KEY, GPIO_LOW_LEVEL);  /*设置KEY中断的触发方式为低电平触发 */ 
    GPIOPinIntEnable(GPIO_PORTE_BASE, KEY);      /*  使能KEY中断         */
    IntEnable(INT_GPIOE);            /*  使能GPIO PE 口中断          */
 
 
    while (1)
 {
       GPIOPinWrite(GPIO_PORTF_BASE, LED1, LED1);    //点亮LED1           
    }
   }
/*********************************************************************************************************
 END FILE
*********************************************************************************************************/
key_led.rar (47.67 KB, 下载次数: 143)

[ 本帖最后由 beyondvv 于 2010-11-8 23:52 编辑 ]
 
 

回复

545

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

2函数 GPIOPinIntEnable( )

功能  使能所选GPIO端口指定管脚的中断

原型  void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins)

参数                          

ulPort:所选GPIO端口的基址

ucPins:指定管脚的位组合表示

例如要使能设置GPIO_PORTF端口的F1中断,可以用下面的函数:

GPIOPinIntEnableGPIO_PORTF_BASE, GPIO_PIN_1

3函数GPIOPinIntDisable( )

功能  禁止所选GPIO端口指定管脚的中断

原型  void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins)

参数

ulPort:所选GPIO端口的基址

ucPins:指定管脚的位组合表示

例如要使能设置GPIO_PORTF端口的F1中断,可以用下面的函数:

GPIOPinIntDisableGPIO_PORTF_BASE, GPIO_PIN_1

4函数 GPIOPinIntStatus( )

功能  获取所选GPIO端口所有管脚的中断状态

原型  long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked)

参数

ulPort:所选GPIO端口的基址

bMasked:屏蔽标志,如果是true则返回屏蔽的中断状态,如果是false则返回原始的中断状态

返回

1个位组合字节。在该字节中置位的位用来识别一个有效的屏蔽中断或原始中断。字节的位0代表

GPIO端口管脚0、位1代表GPIO端口管脚1

例如要使能获取GPIO_PORTF端口的F1管脚的中断状态,可以用下面的函数:

GPIOPinIntStatusGPIO_PORTF_BASE, GPIO_PIN_1

 
 
 

回复

545

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

5 函数 GPIOPinIntClear( )

功能  清除所选GPIO端口指定管脚的中断

原型  void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins)

参数

ulPort:所选GPIO端口的基址

ucPins:指定管脚的位组合表示

例如要清除GPIO_PORTF端口的F1管脚的中断,可以用下面的函数:

GPIOPinIntClearGPIO_PORTF_BASE, GPIO_PIN_1

下面以开发板上的KEY中断为例来说明GPIO的中断操作。开发板总共有六个按键,一个复位按键,五个用户按键,分别对应为:SW1(Reset),SW2(Selcet),SW3(Up),SW4(Down),SW5(Left)SW6(Right),本例程我们设置SW3为外部中断输入, 程序正常运行时,点亮LED指示灯。当按键按下时,进入中断,熄灭LED指示灯。按键放开后,又点亮LED指示灯。

#define KEY   GPIO_PIN_0    //  定义SW3(Up)        

#define LED1   GPIO_PIN_0   //定义用户LED1

  /*********************************************************************************************************
** 函数原形:void GPIO_Port_E_ISR(void)
** 功能描述:首先清除中断标志,再熄灭LED1。
** 说明:    用KEIL软件时,在Startup.S中添加该中断函数名
** 参数说明:无
** 返回值:  无
*********************************************************************************************************/
void GPIO_Port_E_ISR(void)
{
    GPIOPinIntClear(GPIO_PORTE_BASE, KEY);          /*  清除中断标志   */
    GPIOPinWrite(GPIO_PORTF_BASE, LED1, ~LED1); /*  熄灭LED       */
}

注意在用KEIL软件时,在Startup.S中添加该中断函数名,添加方法如下图所示

            

 
 
 

回复

1万

帖子

16

TA的资源

版主

5
 

讲的好,顶下

:P
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

1万

帖子

16

TA的资源

版主

6
 

楼主啊,再问下哈

你的头文件为什么不加hw_gpio.h呢,?为什么?
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

545

帖子

0

TA的资源

一粒金砂(高级)

7
 

回复 6楼 ddllxxrr 的帖子

我加的是#include "gpio.h",编译也是能通过的。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 
谢谢你花了么多宝贵的时间整理这些知识,很好懂,嘻嘻,复制了。
 
 
 

回复

918

帖子

0

TA的资源

纯净的硅(中级)

9
 

回复 6楼 ddllxxrr 的帖子

hw_gpio里边定义的是关于 GPIO 外设中各寄存器相对于基址的偏移地址以及各寄存器中的位域的值。
gpio.h中主要是为 API 函数和定义的宏,在driverlib中的 gpio.c 要用到 hw_memory.h和hw_gpio.h以及gpio.h中定义的宏。
hw_memmap中是各外设的基址
hw_gpio中是寄存器的偏移地址
有上面两个头文件就可以确定一个寄存器,甚至是寄存器中的某一位。
hw_gpio包含到了driverlib中,所以不需要单独的include
gpio.h中是要写到寄存器中的值,配合 API,为包含到driverlib中,所以要单独include,否则编译不过。
 
 
 

回复

105

帖子

0

TA的资源

一粒金砂(高级)

10
 
多谢楼主说的在keil中 ,在Startup.S中添加该中断函数名,添加方法的解释是我开朗了许多
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

11
 

LM3S8962GPIO中断问题

请问,GPIO中断能处理两个管脚同时有效的状态吗?

比如:PA   GPIO配置为低电平触发中断,我现在想实现PA0和PA1同时有效

我是这样写的

void GPIO_Port_A_ISR(void)

           unsigned long ulStatus;

    ulStatus = GPIOPinIntStatus(GPIO_PORTA_BASE, true);            //  读取中断状态
    GPIOPinIntClear(GPIO_PORTA_BASE, ulStatus);                    //  清除中断状态,重要
 
    if (ulStatus & 0x03)                                    

    {
         //中断处理代码   

     }
 

 

这样写不好使

 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

12
 

回复 4楼 beyondvv 的帖子

GPIO沿触发中断能识别两个相差ms级别的触发源么?
 
 
 

回复

29

帖子

0

TA的资源

一粒金砂(中级)

13
 
中断服务子程序能包含多任务吗?比如中断发生后,AD端口开始采样,PA2开始输出PWM波,同时定时1s后,点亮LED。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表