8538|3

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ATMEL SAMR21 按键中断程序 [复制链接]

3芯积分
最近在用ATMEL的板子,但是程序写好后,中断一直产生不了,求助各位大神解决这个问题,曾经尝试过检测标志位,但是检测不到,实在查不出问题到底出在哪。

最新回复

试试ASF,比较一下代码的差异  详情 回复 发表于 2018-5-19 11:21
点赞 关注
 

回复
举报

3

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不好意思,程序在这

#include "sam.h"
#include "samR21G18A.h"
#define _BV(bit) (1 << (bit))
#define SW0 PORT_PA28



void EIC_Handler(void)
{
REG_EIC_INTFLAG &= ~_BV(8);        // clear interrupt flag
REG_PORT_OUTTGL0 |= _BV(19);        // toggle led. pp.391
}       

int main(void)
{       

REG_PORT_DIR0 |= _BV(19);        // configure PA19(LED0) as output
REG_PORT_OUT0 |= _BV(19);        // disable the LED0, set to high voltage (1)
REG_PORT_OUT0 &= ~_BV(19);        // enable the LED0, set to low voltage (0)
REG_PORT_OUT0 |= _BV(19);        // disable the LED0       

// PORT MUX configuration

REG_PORT_DIRCLR0 &= _BV(28);        // configure PA28 as input
REG_PORT_WRCONFIG0 = 0xCC471000;
//REG_PORT_WRCONFIG0 = PORT_WRCONFIG_PMUXEN |  PORT_WRCONFIG_PULLEN | PORT_WRCONFIG_INEN | PORT_WRCONFIG_PMUX(MUX_PA28A_EIC_EXTINT8) | PORT_WRCONFIG_WRPMUX | PORT_WRCONFIG_WRPINCFG | _BV(12) | PORT_WRCONFIG_HWSEL;

//PORT->Group[0].WRCONFIG.reg =( PORT_WRCONFIG_MASK & (PORT_WRCONFIG_PMUXEN |  PORT_WRCONFIG_PULLEN | PORT_WRCONFIG_INEN | PORT_WRCONFIG_PMUX(MUX_PA28A_EIC_EXTINT8) | PORT_WRCONFIG_WRPMUX | PORT_WRCONFIG_WRPINCFG | _BV(12) | PORT_WRCONFIG_HWSEL ));      
                          
REG_PORT_OUT0 |= _BV(28);        // disable the PA28, set to high voltage (1)
//PORT->Group[0].PMUX[13].reg = 0x0;
REG_PORT_PMUX0_13 = PORT_PMUX_PMUXE_A;
PORT->Group[0].PINCFG[28].reg = PORT_PINCFG_PMUXEN | PORT_PINCFG_PULLEN;


// power manager
REG_PM_APBBMASK |= _BV(3);        // enable CLK_PORT_APB, pp. 333        

// Generic Clock controller
REG_EIC_CTRL &= ~_BV(1);        // disable EIC
while( (REG_EIC_STATUS & (_BV(7))) == 1 );        // bit 7: check Synchronization Busy Status. pp.340

REG_EIC_CTRL |= _BV(0);        // software reset EIC
while( (REG_EIC_STATUS & (_BV(7))) == 1 );        // bit 7: check Synchronization Busy Status. pp.340

REG_PM_APBAMASK |= _BV(6);        // enable CLK_EIC_APB, pp. 333       

// the default GCLK0 (GCLK_MAIN) is used for IO
REG_GCLK_GENDIV = 0x100;        // bit 31-0: 0000 0000 0000 0000 0000 0001 0000 0000, do a 32-bit write with all configurations and the ID. pp.109
while( (REG_GCLK_STATUS & (_BV(7))) == 1 );        // bit 7: check Synchronization Busy Status. pp.100

// Bit 21: Enable Run in Standby, Bit 20: Disable Divide Selection, Bit 19: Disable Output, Bit 18: clear GCLK_IO to zero
// Bit 17: Improve Duty Cycle, Bit 16: Enable Generic Clock Generator, Bit 12-8: Select OSC8M, Bit 3-0: Select GCLKGEN0
REG_GCLK_GENCTRL = 0x00230600;        // bit 31-0: 0000 0000 0010 0011 0000 0110 0000 0000. do a 32-bit write with all configurations and the ID. pp.105
while( (REG_GCLK_STATUS & (_BV(7))) == 1 );        // bit 7: check Synchronization Busy Status. pp.100

// bit 15: Disable Lock Write, Bit 14: Enable Clock, Bit 11-8: Choose GCLKGEN5, Bit 5-0: Choose GCLK_EIC
REG_GCLK_CLKCTRL = 0x4005;        // bit 15-0: 0100 0000 0000 0101. do a 16-bit write with all configurations and the ID. pp.101
       
// EIC configuration registers
while (EIC->CTRL.bit.SWRST | EIC->STATUS.bit.SYNCBUSY);

//REG_EIC_CTRL |= _BV(1);        // enable EIC

REG_EIC_CONFIG2 |= EIC_CONFIG_FILTEN4 | EIC_CONFIG_SENSE4_BOTH;       
//REG_EIC_CONFIG2 |= _BV(19);        // bit 19 FILTEN28: enable filter of IO 28 pp. 348
//REG_EIC_CONFIG2 = (0x1 << 16);        // bit 16 - 18; Input Sense 28 Configuration -- Rising-edge detection pp. 348
//REG_EIC_CONFIG2 = (0x3 << 16);        // bit 16 - 18; Input Sense 4/pa28 Configuration -- both-edge detection pp. 348

// disable interrupt and clear interrupt flag
REG_EIC_INTENCLR |= _BV(8);        // disable interrupt 8 (EXTINT8)
REG_EIC_INTFLAG &= ~_BV(8);        // clear interrupt flag

REG_EIC_INTENSET |= EIC_INTENSET_EXTINT8;       
//REG_EIC_INTENSET |= _BV(8);        // enable interrupt 8 (EXTINT8)       


REG_EIC_CTRL |= EIC_CTRL_ENABLE;

NVIC_EnableIRQ(EIC_IRQn);



while( (REG_EIC_STATUS & (_BV(7))) == 1 );        // bit 7: check Synchronization Busy Status. pp.340

while(1)
{       

/*if ((REG_EIC_INTFLAG & (_BV(8))) == 1)
{
REG_EIC_INTFLAG &= ~_BV(8);        // clear interrupt flag
REG_PORT_OUTTGL0 |= _BV(19);        // toggle led. pp.391

}*/

}
}
 
 
 

回复

1万

帖子

25

TA的资源

版主

板凳
 
试试ASF,比较一下代码的差异
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

4
 
dcexpert 发表于 2018-5-19 11:21
试试ASF,比较一下代码的差异

asf基本看不出什么,几句话搞定了,底层的程序封装好了
 
 
 

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

查找数据手册?

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