历史上的今天
返回首页

历史上的今天

今天是:2024年12月06日(星期五)

正在发生

2020年12月06日 | TQ210——按键(中断查询法)

2020-12-06 来源:eefocus

底板上有8个独立按键,可分别使用查询法和中断法控制按键。通过原理图可知:按键按下,GPIO检测到低电平,松开时高电平。


直接查询法程序的实现简单,但是效率很低,CPU一直在查询,啥事也干不了。中断查询法程序的实现较为复杂,但是效率高。


GPIO寄存器(GPH0CON,GPH0DAT),外部中断寄存器(EXT_INT_0_CON,EXT_INT_0_MASK),中断通道选择(VIC0INTSELECT),中断使能(VIC0INTENABLE),中断向量地址(VIC0VECTADDR0,VIC0VECTADDR1),清除中断向量(EXT_INT_0_PEND)


.global _start                                   /*声明一个全局的标号 */

.global key_isr

_start:

       /* 设置栈,以调用c函数 */

       ldr   sp, =0x40000000       

 

       /* 开总中断       */

       mrs r0,cpsr

       bic r0,r0, #0x00000080           /* 清楚第7位,IRQ中断禁止位,写0使能IRQ */

       msr cpsr,r0

 

       bl main                                     /* 跳转到C函数去执行 */

 

halt:

       b halt

 

key_isr:

       /* 计算返回地址:PC的值等于当前执行的地址+8,

       ** 当CPU正要执行某条指令时(还未执行),被中断,

       ** 这是这条刚要执行的指令的地址刚好=PC-4 */

       sub lr,lr, #4

       stmfd sp!,{r0-r12, lr}      /* 保护现场 */

       bl key_handle

       /* 恢复现场 */

       ldmfd sp!,{r0-r12, pc}^         /* ^表示把spsr恢复到cpsr */

#define GPC0CON               *((volatileunsigned int *)0xE0200060)

#define GPC0DAT               *((volatileunsigned int *)0xE0200064)

 

#define GPH0CON               *((volatileunsigned int *)0xE0200C00)

#define GPH0DAT               *((volatileunsigned int *)0xE0200C04)

 

#define EXT_INT_0_CON         *((volatileunsigned int *)0xE0200E00)

#define EXT_INT_0_MASK        *((volatileunsigned int *)0xE0200F00)

 

#define VIC0INTSELECT         *((volatileunsigned int *)0xF200000C)

#define VIC0INTENABLE         *((volatileunsigned int *)0xF2000010)

 

#define VIC0VECTADDR0         *((volatileunsigned int *)0xF2000100)

#define VIC0VECTADDR1         *((volatileunsigned int *)0xF2000104)

 

#define VIC0ADDRESS          *((volatile unsigned int*)0xF2000F00)

 

#define EXT_INT_0_PEND       *((volatileunsigned int *)0xE0200F40)

 

extern void key_isr(void);

 

void key_handle()

{     

       volatileunsigned char key_code = EXT_INT_0_PEND & 0x03;

      

       VIC0ADDRESS= 0;                    /* 清中断向量寄存器 */

       EXT_INT_0_PEND&= ~0x03;   /* 清中断挂起寄存器 */

      

       if(key_code == 1)             /* key1 */

       {

              GPC0DAT&= ~(0x01 << 3);      /* toggleLED1 */

              GPC0DAT|= 1 << 3;   /* toggle LED1 */

       }     

       else if(key_code == 2)      /* key2 */

       {

              GPC0DAT&= ~(0x01 << 4);      /* toggleLED1 */

              GPC0DAT|= 1 << 4;   /* toggle LED1 */

       }

             

}

 

int main()

{

       GPC0CON&= ~(0xFF << 12);

       GPC0CON |=0x11 << 12;                             /*配置GPC0_3和GPC0_4为输出:LED1和LED2 */

       GPH0CON |=0xFF << 0;                              /*配置GPH0_0和GPH0_1为外部中断:key1和key2 */

      

       EXT_INT_0_CON&= ~(0xFF << 0);

       EXT_INT_0_CON|= 2 | (2 << 4);                    /*配置EXT_INT[0]和EXT_INT[1]为下降沿触发 */

       EXT_INT_0_MASK&= ~3;                             /* 取消屏蔽外部中断EXT_INT[0]和EXT_INT[1] */

      

       VIC0INTSELECT&= ~3;                              /*选择外部中断EXT_INT[0]和外部中断EXT_INT[1]为IRQ类型的中断 */

      

       VIC0INTENABLE|= 3;                               /*使能外部中断EXT_INT[0]和EXT_INT[1] */

      

       /* 当EXT_INT[0]触发中断,即用户按下key1时,

       ** CPU就会自动的将VIC0VECTADDR0的值赋给VIC0ADDRESS并跳转到这个地址去执 */

       VIC0VECTADDR0= (unsigned int)key_isr;

       VIC0VECTADDR1= (unsigned int)key_isr;

      

       while (1);

      

       return 0;

}


裸机编程编译的时候一定要加16字节的头信息,编译生成的bin文件通过SD卡或者TFTP的方法下载到开发板。


推荐阅读

史海拾趣

天钰(FITIPOWER)公司的发展小趣事

台湾富晶(FORTUNE)公司的发展故事

故事一:初创与先驱之路

富晶电子股份有限公司(Fortune Semiconductor Corp.),中文简称富晶,成立于1995年,总部位于台湾新北市淡水区。作为亚洲最早切入模拟IC设计的先驱之一,富晶自创立之初便专注于电路设计与整合技术。在那个数字科技刚刚起步的时代,富晶凭借其前瞻性的视野和深厚的技术积累,迅速在模拟IC设计领域崭露头角。公司不仅精通电路设计,还擅长将先进的SOC/SIP技术应用于实际产品中,为消费电子、电源管理、家用电器等多个领域提供了高性能的IC解决方案。

故事二:性价比优势与市场拓展

随着消费性电子产品的价格逐渐亲民,富晶的产品因其优良的电路设计和品质,在电源管理IC和电池管理IC等模拟IC领域展现出了强大的性价比竞争力。在过去十年中,富晶成功帮助众多制造商提升了消费性电子产品的价值,推动了手机、笔记本电脑、数码相机等产品的普及。制造商们选择富晶的IC产品,不仅因为其稳定的质量和卓越的性价比,还因为富晶能够持续稳定地供货,满足了市场对高效、可靠电子元件的迫切需求。

故事三:技术创新与产品升级

富晶始终将技术创新视为企业发展的核心动力。公司不断投入研发资源,致力于开发更加先进、高效的IC产品。通过不断优化电路设计、提升制造工艺,富晶成功推出了一系列具有行业领先水平的产品,如FS98O24、FS8855等电源管理IC和电池管理IC。这些产品不仅性能卓越,而且功耗更低、体积更小,满足了市场对电子产品轻薄化、绿色化的需求。

故事四:贴近市场与客户需求

自成立以来,富晶始终秉持着贴近市场、满足客户需求的服务理念。公司密切关注市场动态和客户需求变化,及时调整产品策略和服务模式。通过与客户建立紧密的合作关系,富晶能够深入了解客户的实际需求,为客户提供定制化的解决方案。这种贴近市场的服务模式不仅赢得了客户的信赖和支持,也为富晶在激烈的市场竞争中赢得了宝贵的市场份额。

故事五:全球化布局与未来发展

随着全球化进程的加速推进,富晶也加快了其全球化布局的步伐。公司不仅在国内市场取得了显著的成绩,还积极拓展海外市场,与众多国际知名企业建立了长期稳定的合作关系。同时,富晶还注重与国际先进技术的交流与合作,不断提升自身的技术水平和创新能力。展望未来,富晶将继续秉承“创新、卓越、共赢”的发展理念,致力于成为全球领先的模拟IC设计企业,为电子行业的繁荣发展贡献更多的力量。

Cornerstone Sensors公司的发展小趣事

Cornerstone Sensors一直致力于技术创新和产品升级。公司不断投入研发资源,探索传感器技术的新应用和新领域。例如,公司率先推出了具有自校准功能的智能传感器,大大提高了产品的使用便捷性和准确性。此外,Cornerstone Sensors还积极探索物联网、人工智能等新兴技术与传感器的结合点,为行业发展注入了新的活力。

Ememory Technology Inc公司的发展小趣事

除了自主研发外,eMemory还积极寻求与外部合作伙伴的联合研发。在2016年,eMemory与马来西亚的半导体晶圆代工厂Silterra联合宣布,基于Silterra 0.18微米CMOS制程技术的一次性可编程(OTP)存储器已经通过了验证。这一合作不仅证明了eMemory技术的先进性和可靠性,还为双方带来了新的市场机遇。

American Power Management Inc公司的发展小趣事

随着电子行业的快速发展,新技术不断涌现,市场竞争也日趋激烈。面对这一变革,APMI及时调整战略,加大研发投入,紧跟技术潮流。公司不仅推出了多款具有竞争力的新产品,还积极拓展新的应用领域,如新能源汽车、物联网等。通过不断创新和拓展,APMI成功应对了行业变革带来的挑战,保持了持续稳健的发展态势。

ANSHAN [Anshan Suly Electronics]公司的发展小趣事

ANSHAN公司成立于上世纪末,当时正值电子行业的蓬勃发展期。创始人李先生凭借对电子技术的深厚理解和敏锐的市场洞察力,决定投身于这个充满机遇的领域。初创时期的ANSHAN面临资金短缺、人才匮乏和技术壁垒等多重挑战。然而,李先生带领团队日夜兼程,不断研发新产品,拓展市场渠道。他们坚持自主创新,不断攻克技术难题,逐渐在电子行业中崭露头角。

Eurofarad公司的发展小趣事

Eurofarad始终将品质管理作为公司发展的重要保障。公司建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,Eurofarad还注重持续改进,不断优化生产流程和提高生产效率,确保产品的品质和性能始终保持在行业领先水平。

问答坊 | AI 解惑

嵌入式系统的基本知识

入门知识,为深入学习打下扎实的基础!…

查看全部问答>

中国视频教程基地

好的资源 大家一起共享吧  呵呵  觉得好顶一下中国视频教程基地 …

查看全部问答>

《数字信号处理(全美经典学习指导系列)》

简介: 内容简介:   本书主要介绍数字信号处理的基础理论,并给出300多道解答步骤完整的习题。因而,本书是相关教材的有益补充,是自学有效问题求解方法的理想读物。   全书共9章,涵盖了数字信号处理导论教程的核心内容,包括数字信号处 ...…

查看全部问答>

非常经典的三极管的开关电路的分析

很简单很详细很实用 经典的三极管的开关电路的分析…

查看全部问答>

FPGA逻辑设计注意事项列表

这是一个在逻辑设计中注意事项列表,由此引起的错误常使得设计不可靠或速度较慢,为了提高设计性能和提高速度的可靠性,必须确定设计通过所有的这些检查。专业FPGA设计论坛3 [2 I5 \\/ {3 N* X  可靠性3 k6 ]1 b( D3 R4 p! r/ \\1 k1 v! f) S! ?& ...…

查看全部问答>

请问高手:关于优龙FS2410开发板串口问题

请问高手:         怎么释放优龙FS2410开发板的调试串口一UART1,使得可以将UART1用作普通通讯端口跟GPRS模块通讯?     板子串口1是用作控制台的调试串口的,所以如果要用他跟其他模块通讯,应该要将其释放作 ...…

查看全部问答>

createfile()创建文件失败的问题

   我想以系统时间为名创建文件,下面是我的代码,有个问题一直过不去,运行环境是wince5.0,用VS2005开发;请明白人指教一下:问题见批注   一,类Client中用到的相关代码    public:      &nbs ...…

查看全部问答>

请教串口程序问题

请教串口程序问题 代码如下: #include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar flag,i;uchar a[4];uchar code table[]=\"I get \" ;void main(){ TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; ...…

查看全部问答>

依旧是I2C的问题

上次烧了块EK的板子.这次换了块新的,该慎重了. 在这里向大虾们确认个问题.我的从设备,在没有跟我主机连接前,上电后,SDA和SCL的电压全是3.0V左右.我查遍了从设备的datasheet,没有找到对高低电平的值的定义,只是有一个关于I2C的通信中高低 ...…

查看全部问答>