4874|10

1412

帖子

15

TA的资源

版主

楼主
 

从0开始学M4 (第二集 中断控制) [复制链接]

中断是一个非常重要的概念,每一个单片机都会有中断。不同的单片机处理中断的方式不同。 Cortex-M4M3一样,在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。本文不会具体讲中断的概念,只是讲述如何在 LM4F232上应用中断。

 

 

 

 

采用库函数使用中断。

 

 

#include "inc/hw_ints.h"

#include "inc/hw_types.h"

#include "inc/hw_nvic.h"

#include "inc/hw_memmap.h"

#include "driverlib/fpu.h"

#include "driverlib/debug.h"

#include "driverlib/gpio.h"

#include "driverlib/sysctl.h"

#include "driverlib/interrupt.h"

  

//**********************************

//*  定义一个变量指示LED的开关

//**********************************

 

static unsigned char ucFlag = true;

 

//**********************************

//*  保存中断状态

//**********************************

static unsigned long ulIntStatus;

 

 

 

//**********************************

//*  主函数

//**********************************

int main(void)

{

//使能FPU及栈

    FPUEnable();

    FPULazyStackingEnable();

    //

    //使用PLL。频率80MHz

    //

    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);   

    //

    // 使能PORTAPORTG端口

    //

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);

 

    //

    // 设置PA口和PG口的状态,PA7为输入,PG5为输出

    // 上电点亮LED,并配置PA7口带弱上拉电阻

    //

    GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE,GPIO_PIN_5);

    GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_7);

    GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_5,0x20);

    GPIOPadConfigSet(GPIO_PORTA_BASE,GPIO_PIN_7,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);

 

    //

    // 设置PA7口的中断,高电平触发

    //

    GPIOIntTypeSet(GPIO_PORTA_BASE, GPIO_PIN_7, GPIO_HIGH_LEVEL);

 

    //

    // 设置中断优先级

    //

    IntPrioritySet(INT_GPIOA, 0x00);

 

    //

    // 使能PA口中断

    //

    IntEnable(INT_GPIOA);

 

    //

    // 使能PA7中断

    //

    GPIOPinIntEnable(GPIO_PORTA_BASE, GPIO_PIN_7); 

 

    //

    // 总中断使能

    //

    IntMasterEnable();

 

    //

    // 循环等待中断

    //

    while(1);

}

//**********************************

//* 中断处理函数

//**********************************

void IntGPIOa(void)

{

  //

  // 获取PA口的中断状态

  //

  ulIntStatus = GPIOPinIntStatus(GPIO_PORTA_BASE,true);

  //

  // 清除PA口的中断

  //

  GPIOPinIntClear(GPIO_PORTA_BASE,ulIntStatus);

 

  ucFlag ? (

    GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_5, GPIO_PIN_5),

    ucFlag = false

  ):(

    GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_5, !GPIO_PIN_5),

    ucFlag = true

  );

}

 

    程序看起来比较长,但是其实很简单。程序中大部分语句都给出了说明。主程序一开始就通过锁相环将时钟频率设置在80MHz,其实不设置也行。因为要使用 PA PG口,所有先要使能两个端口,给两个端口接通时钟信号。然后就是配置 PA7PG5 口的方向和状态了。首先将PG5 口设置为输出,然后将 PG5设置为高电平,点亮LED。接下来将 PA7 口设置为输入,但是一定要加上拉电阻,这样给PA7一个确定的状态。以上做好之后就可以设置 PA7 的中断了。首先将 PA7设置为高电平触发,设置中断优先级,然后开中断。开中断的时候要将 PA 口的中断和 PA7的中断都打开,然后开总中断。至此主函数算是写完了。

本例程中,进入中断处理函数后要先将 PA 口的中断清除,然后判断并翻转LED的状态。当然中断处理函数这么做是不妥的,要加入软件或硬件的消抖。软件消抖的做法一般是进入中断后循环等待一段时间然后检测中断源是否还有中断,如果有则确认产生中断,没有则认为是干扰。在程序中加入了一个获取当前中断状态的函数,以便读者理解如何消除抖动。

程序只这么做是不行的。因为要在中断向量表中加入中断处理函数的入口地址,当中断产生时才会跳到中断处理函数中区。在IAR中,打开工程中的startup.C文件,然后做如图7修改

上图中加EXTERN表示外部的程序,后面加程序的名称,也就是入口地址,一定要和终端处理函数的名称相同。然后,将中断向量表中的GPIO PORT A的中断函数入口地址按下图修改:

    如上图中IntGPIOa,将原来的中断地址注释掉,添加上自己写的中断处理函数地址。至此该中断表修改完毕,毕竟工程完成了。

[ 本帖最后由 youki12345 于 2012-2-3 22:41 编辑 ]

最新回复

赞一个  详情 回复 发表于 2014-7-15 19:11
 
点赞 关注(1)
个人签名https://bbs.eeworld.com.cn/thread-471646-1-1.html
欢迎加入我的团队

回复
举报

1万

帖子

16

TA的资源

版主

沙发
 

顶一下

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

回复

2453

帖子

19

TA的资源

五彩晶圆(中级)

板凳
 
首页留名
 
 
 

回复

419

帖子

0

TA的资源

一粒金砂(高级)

4
 
//
    // 总中断使能
    //
    IntMasterEnable();

可以不要吗?我在用M3的时候都没加这句。
 
 
 

回复

1412

帖子

15

TA的资源

版主

5
 

原帖由 woody_chen 于 2012-2-9 11:01 发表 // // 总中断使能 // IntMasterEnable(); 可以不要吗?我在用M3的时候都没加这句。

 

 

那是因为上电的时候中断就是打开的,所以你加不加都可以,但是最好加上,编程的好习惯

 
个人签名https://bbs.eeworld.com.cn/thread-471646-1-1.html
欢迎加入我的团队
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

6
 

这里错了哟,这样设置,system clock就是原始外部晶振的16MHz

//使用PLL。频率80MHz

    //

    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 6楼 Roycallus 的帖子

看的真仔细,呵呵...
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

8
 
学习了
 
 
 

回复

1

帖子

1

TA的资源

一粒金砂(初级)

9
 
大大。。我不懂。。为什么是高电平触发。。。。?弱上拉之后io口的电位是高还是低
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

10
 
这个里面中断注册函数都没有...
 
 
 

回复

45

帖子

0

TA的资源

一粒金砂(中级)

11
 
赞一个
 
 
 

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

随便看看
查找数据手册?

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