一、准备工作:

     将上一节搭建的工程复制一份,命名为“6.key interrupt”。这一节主要讲如何使用SAM4N的GPIO中断功能,实现按键的中断输入。

二、程序编写:

     这个程序主要是在上一个程序中进行改进,实现按键的中断输入。

上图可以看出按键一边连接在PA30上面,一边连接到GND,当按下按键时,PA30管脚的电平会被拉低,将按键管脚设置成上拉电阻方式,这样松开按键时PA30会被拉高。

所以要实现按键的输入中断可以捕获PA30的上升沿或是下降沿。

#define USER_BUTTON (0x01UL<<30)

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

*函数名: Key_GPIO_Config()

*参 数 :void

*返回值:void

*功 能 :按键GPIO的初始化函数,使用按键前必须先调用此函数进行初始化

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

void Key_GPIO_Config(void)

{

/*禁止外设管理控制寄存器(PMC)写保护*/

  PMC->PMC_WPMR = 0x504D4300;

    /*使能PIOA时钟*/

  PMC->PMC_PCER0 = (1UL << ID_PIOA); 

/*使能外设管理控制寄存器(PMC)写保护*/

  PMC->PMC_WPMR = 0x504D4301; 

  /*使能USER_BUTTON管脚,对应为PA30*/

PIOA->PIO_PER=(USER_BUTTON);

/*禁止USER_BUTTON管脚*/

PIOA->PIO_ODR=(USER_BUTTON);

/*使能USER_BUTTON管脚的上拉电阻,设置为上拉*/

PIOA->PIO_PUER=(USER_BUTTON);

/*使能USER_BUTTON管脚滤波功能*/

PIOA->PIO_IFER=USER_BUTTON;

/*使能USER_BUTTON管脚中断功能*/

PIOA->PIO_IER=USER_BUTTON;

    /*使能USER_BUTTON管脚中断为其他中断触发*/

PIOA->PIO_AIMER=USER_BUTTON;

    /*使能USER_BUTTON管脚中断为边沿触发*/

PIOA->PIO_ESR=USER_BUTTON;

/*使能USER_BUTTON管脚中断为上降沿触发*/

PIOA->PIO_REHLSR=USER_BUTTON;

PIOA->PIO_ISR;

/*配置PIOA的先占优先级为1,从优先级为1*/

   NVIC_SetPriority(PIOA_IRQn, ((0x01<<3)|0x01));

/*使能PIOA的中断通道*/

    NVIC_EnableIRQ(PIOA_IRQn);

}

   第一步,打开PIOA的时钟,接着使能PIOA30的GPIO功能,然后禁止PIOA30的输出,只作为输入功能,接着使能PIOA30的上拉电阻。第二步,打开PIOA30管脚的滤波功能,这样可以起到一个硬件消抖的作用,然后通过PIO_IER寄存器使能PIOA30的中断功能。默认情况下中断会被设置成边沿触发,这明显不是我们要的,我们需要的是下降沿触发或上升沿触发。SAM4N的GPIO中断提供边沿触发、下降沿触发、上升沿触发、低电平触发、高电平触发五种类型。除了边沿触发为默认方式外,其他方式类型需要通过配置。首先配置PIO_AIMER寄存器,使能其他中断模式,接着配置PIO_ESR寄存器,使能上升/下降沿触发方式,最后配置PIO_REHLSR寄存器,配置成上升沿触发方式,下面是结构图:

     接着需要设置PIOA向量中断优先级,最后使能PIOA的向量中断。在PIOA的中断函数中写中断处理程序:

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

* 函数名:PIOA_Handler()

* 参数  :void

* 返回值:void

* 描述  :PIOA管脚中断服务函数

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

void PIOA_Handler(void)

/*检测是否为USER_BUTTON引发的中断*/

  if((PIOA->PIO_ISR&USER_BUTTON)!=0)

{

     printf("USER_BUTTON按键被按下\r\n");

   }

}

   这里我们需要读取PIOA的PIO_ISR寄存器,判断是不是PIOA30中断,读取中断寄存器以后,中断标志位会自动清除,如果在这里不读去这个PIO_ISR,中断不清楚将会连续触发,这点需要注意。

   在PIOA30中断后,也是打印按键被按下的信息到串口。

在main函数中只要去初始化按键即可:

int main(void)

{

systick_hw_init();

led_hw_init();

UART0_Init(115200);

Key_GPIO_Config();

UART0_SendString("this is a key test demo!\r\n");

while(1){

  PIOB->PIO_CODR=(0x01<<LED0_PIN);

delay_ms(200);

  PIOB->PIO_SODR=(0x01<<LED0_PIN);

   delay_ms(200);

}

}  

  和上一个程序一样,下载运行,按下按键串口会打印出如下信息:

[SAM4N学习笔记]按键程序(中断方式)的更多相关文章

  1. [SAM4N学习笔记]按键程序(查询方式)

    一.准备工作:      将上一节搭建的工程复制一份,命名为"5.key scanf".这一节主要讲如何使用SAM4N的GPIO输入功能,实现按键的输入. 二.程序编写:      ...

  2. zigbee学习之路(四):按键控制(中断方式)

    一.前言 通过上次的学习,我们学习了如何用按键控制led,但是在实际应用中,这种查询方式占用了cpu的时间,如果通过中断控制就可以解决这个问题,我们今天就来学习按键控制的中断方式. 二.原理分析 传统 ...

  3. stm32寄存器版学习笔记03 外部中断

    stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...

  4. STM32学习笔记(九) 外部中断,待机模式和事件唤醒

    学会知识只需要不段的积累和提高,但是如何将知识系统的讲解出来就需要深入的认知和系统的了解.外部中断和事件学习难度并不高,不过涉及到STM32的电源控制部分,还是值得认真了解的,在本文中我将以实际代码为 ...

  5. [Golang学习笔记] 04 程序实体1 变量声明

    变量声明: Go语言的程序实体包含:变量.常量.函数.结构体和接口,是一门静态类型的编程语言. (在声明变量或常量的时候,需要指定类型,或者给予足够信息是的Go语言能够推导出类型) Go语言变量的类型 ...

  6. [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?

    [译]聊聊C#中的泛型的使用(新手勿入)   写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发 ...

  7. [Golang学习笔记] 06 程序实体3 类型断言和类型转换

    类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...

  8. [Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明

    作用域访问权限: 程序实体访问权限(作用域)有三种:1. 包级私有(代码包)2. 模块级私有(代码包)3. 公开(全域). 一个函数是一个代码块.一个程序实体的作用域总是会被限制在某个代码块中.好处: ...

  9. [SAM4N学习笔记]LED点灯程序

    一.准备工作:      将上一节搭建的工程模板复制一份,命名为"1.blink",这作为我们开发的第一个程序. 二.程序编写:      板子上只有一个可控制的LED,就是LED ...

随机推荐

  1. Gradle实战教程之依赖管理

    这是从我个人网站中复制过来的,原文地址:http://coolshell.info/blog/2015/05/gradle-dependency-management.html,转载请注明出处. 简要 ...

  2. MasterCard信用卡测试卡号-creditcard-1

    MasterCard信用卡测试卡号-creditcard-1 510510510510510051111111111111185454545454545454550000000000000455555 ...

  3. #添加屏蔽IP LINUX

    netfilter/iptables 的最大优点是它可以配置有状态的防火墙,这是 ipfwadm 和 ipchains 等以前的工具都无法提供的一种重要功能.有状态的防火墙能够指定并记住为发送或接收信 ...

  4. nginx 中出现nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

    有其他的程序占用的80端口.只需把相关程序关闭,fuser -k 80/tcp 然后再次 /usr/local/nginx/sbin/nginx,就能开启nginx服务了

  5. 如何判断list中是否包含某个元素

    在python中可以通过in和not in关键字来判读一个list中是否包含一个元素: str = ['s','i','m','o','n'] if 'e' in str: print("e ...

  6. PHPExcel1

    下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...

  7. BZOJ 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富

    Description 最近,奶牛们热衷于把金币包在面粉里,然后把它们烤成馅饼.第i块馅饼中含有Ni(1<=Ni<=25)块金币,并且,这个数字被醒目地标记在馅饼表面. 奶牛们把所有烤好的 ...

  8. hdu 4720

    最小覆盖圆的模板: #include<stdio.h> #include<string.h> #include<math.h> struct Point { dou ...

  9. android 对象传输及parcel机制

    在开发中不少要用到Activity直接传输对象,下面我们来看看,其实跟java里面差不多   自定义对象的传递:通过intent传递自定义对象的方法有两个  第一是实现Serialization接口: ...

  10. CTO的眼界到底有多宽?

    CTO的眼界到底有多宽?  [CSDN独家报道]在各大企业中,CTO (Chief Technology Officer,首席技术官)有着雄厚的技术实力,掌握着企业核心技术,是软件开发项目中最重要的人 ...