历史上的今天
返回首页

历史上的今天

今天是:2024年12月25日(星期三)

正在发生

2020年12月25日 | TQ210_裸机编程(二)——按键控制LED灯

2020-12-25 来源:eefocus

首先我们可以在开发板配套材料中找到按键的电路图,E:TQ210_CD开发板配套电路图Bottompdf格式TQ210_BOARD_V4_20121023。

可以看到按键key1~key6对应的地址线为XEINT0~XEINT5,我们暂时就只用前面几个按键。


然后我们再找地址线在板子中相应的引脚号。

 

可以看到 按键地址线XEINT0~XEINT5对应的管脚号为GPH0_1~GPH0_5。

现在在S5PV210_UM_REV1.1文档中就能找到GPH0的控制寄存器,对应的控制6个按键。

 

将按键控制寄存器都设置为外部中断处理。然后去设定外部中断的处理相应参数。

外部中断要设置2个中断寄存器,EXT_INT_CON,EXT_INT_MASK。

由于按键按下时为低电平,所以全部设置为Falling edge triggered。

设置完EXT_INT_CON,还要设置EXT_INT_MASK,(外部中断控制寄存器)。

将需要使用的按键对应的外部中断处理 设置为允许中断。

再设置中断选择寄存器VIC0INTSELECT,选择中断模式(一般为IRQ模式)。

 

之后再设置VICINTENABLE寄存器,中断使能寄存器。

 

当中断发生时,需要一个存放中断处理的寄存器VICVECTADDR,中断发生后,就跳转到该寄存器里的函数开始执行。

例如:

VIC0VECTADDR0 = (unsigned int)key_isr;

中断发生后就跳转到key_isr处去执行了。

但是涉及到跳转执行的时候,就需要考虑保护现场的操作了。

例如:在key_isr中

key_isr:
 /* 计算返回地址:PC的值等于当前执行的地址+8,
 ** 当CPU正要执行某条指令时(还未执行),被中断,
 ** 这是这条刚要执行的指令的地址刚好=PC-4(可查三级流水线工作原理) */
 sub lr, lr, #4
 stmfd sp!, {r0-r12, lr}   /* 保护现场 ,由于不知道使用的具体哪个通用寄存器,所以讲0~12全部压栈*/
 bl key_handle
 /* 恢复现场 */
 ldmfd sp!, {r0-r12, pc}^   /* ^表示把spsr恢复到cpsr */

 

由于用到中断处理,所以对cpsr(当前程序状态寄存器)要进行参数设置,

要使用IRQ中断,就要使i位为0,

/* 开总中断 */
 mrs r0, cpsr  /*传送cpsr的内容到r0*/
 bic r0, r0, #0x00000080  /* 清楚第7位,IRQ中断禁止位,写0使能IRQ */
 msr cpsr, r0  /*传送r0的内容到cpsr*/

BIC―――――位清除指令

指令格式:

BIC{cond}{S} Rd,Rn,operand2 

BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。


在上面保护现场的时,程序跳转到key_handle执行。

void key_handle()

 volatile unsigned char key_code = EXT_INT_0_PEND & 0x3;
 
 VIC0ADDRESS = 0;  
 EXT_INT_0_PEND |= 3;
 
 if (key_code == 1)  
 /* GPC0DAT ^= 1 << 3;*/
  GPC0DAT |= 0x00000008;
 else if (key_code == 2) 
 /* GPC0DAT ^= 1 << 4;*/ 
  GPC0DAT |= 0x00000010;
}

 


程序中EXT_INT_0_PEND寄存器为发生中断后的数据变化。1就是发生了中断。

 

整体源代码如下:

/*key.c*/

#define GPC0CON *((volatile unsigned int *)0xE0200060)
#define GPC0DAT *((volatile unsigned int *)0xE0200064)

#define GPH0CON *((volatile unsigned int *)0xE0200C00)
#define GPH0DAT *((volatile unsigned int *)0xE0200C04)

#define EXT_INT_0_CON   *((volatile unsigned int *)0xE0200E00)
#define EXT_INT_0_MASK  *((volatile unsigned int *)0xE0200F00)

#define VIC0INTSELECT  *((volatile unsigned int *)0xF200000C)
#define VIC0INTENABLE   *((volatile unsigned int *)0xF2000010)

#define VIC0VECTADDR0  *((volatile unsigned int *)0xF2000100)
#define VIC0VECTADDR1  *((volatile unsigned int *)0xF2000104)

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

#define EXT_INT_0_PEND  *((volatile unsigned int *)0xE0200F40)

extern void key_isr(void);
void key_handle()

 volatile unsigned char key_code = EXT_INT_0_PEND & 0x3;
 
 VIC0ADDRESS = 0;  
 EXT_INT_0_PEND |= 3;
 
 if (key_code == 1)  
 /* GPC0DAT ^= 1 << 3;*/
  GPC0DAT |= 0x00000008;
 else if (key_code == 2) 
 /* GPC0DAT ^= 1 << 4;*/ 
  GPC0DAT |= 0x00000010;
}

int main()
{
 GPC0CON &= ~(0xFF << 12);
 GPC0CON |= 0x11 << 12;     
 GPH0CON |= 0xFF << 0;     
 
 EXT_INT_0_CON &= ~(0xFF << 0);
 EXT_INT_0_CON |= 2 | (2 << 4);   
 EXT_INT_0_MASK &= ~3;     
 
 VIC0INTSELECT &= ~3;     
 
 VIC0INTENABLE |=3;       
 
 
 VIC0VECTADDR0 = (unsigned int)key_isr;
 VIC0VECTADDR1 = (unsigned int)key_isr;
 
 while (1);
 
 return 0;
}

/*start.S*/

.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 */



推荐阅读

史海拾趣

Altech公司的发展小趣事

为了适应市场的快速变化和公司业务的不断扩张,Altech公司决定将深圳工厂整体搬迁至广州南沙。这一搬迁不仅优化了公司的生产布局,还为公司提供了更加广阔的市场发展空间。搬迁后的工厂引进了先进的生产设备和技术,进一步提升了公司的生产效率和产品质量。

EICHHOFF公司的发展小趣事

EICHHOFF公司成立于XX世纪XX年代,当时由创始人XXX在德国的一个小镇上开设了一个小型的电子元件加工厂。由于XXX对电子技术的热爱和对市场需求的敏锐洞察,他专注于生产高质量的连接器和其他电子组件。在初创阶段,EICHHOFF的产品主要供应给当地的电子制造商和维修店。随着口碑的逐渐传播和产品质量的不断提升,公司开始接到来自更广泛地区的订单。

为了应对不断增长的市场需求,EICHHOFF公司逐步扩大了生产规模,并引入了先进的生产设备和技术。同时,公司也注重人才培养和团队建设,吸引了一批有才华的工程师和技术人员加入。这些努力使得EICHHOFF在电子行业中逐渐崭露头角。

安纳森(AnaSem)公司的发展小趣事

随着公司知名度的提升,安纳森也不可避免地遭遇了一些侵权问题。面对不法公司或机关声称其为安纳森半导体本身或正式授权单位的情况,安纳森迅速采取行动,通过法律手段维护自身的合法权益。同时,公司还加强了与用户的沟通和交流,及时澄清误会,确保用户能够购买到真正的安纳森产品。这一系列的应对措施不仅有效地维护了安纳森的品牌形象,也为其在市场中树立了良好的口碑。

康龙(CONCRAFT)公司的发展小趣事

面对电子行业的快速变化和发展趋势,康龙公司积极拥抱数字化转型。公司引入了先进的ERP系统和数字化工具,实现了从供应链、生产管理到财务管理的全面信息化。这不仅提高了公司的运营效率和管理水平,还为公司的产业升级和未来发展奠定了坚实基础。

Goldstar Electron Co Ltd公司的发展小趣事

康龙(CONCRAFT)公司成立于XXXX年,创始人XXX凭借其敏锐的商业眼光和对电子行业的深入理解,决定专注于电子连接器的研发和生产。公司初始阶段面临资金、技术和市场的重重挑战,但创始人带领团队夜以继日地工作,成功开发出了具有竞争力的连接器产品。随着产品的不断完善和市场推广的加强,康龙逐渐在电子连接器领域崭露头角。

Herga公司的发展小趣事

在竞争激烈的电子行业中,Herga公司始终将客户服务和技术创新放在同等重要的位置。公司建立了完善的客户服务体系,提供从售前咨询、方案设计到售后服务的全方位支持。同时,Herga公司不断加大研发投入,与国内外知名高校和研究机构建立合作关系,共同探索电子行业的前沿技术。这种客户服务与技术创新并重的战略使得Herga公司能够持续满足市场需求,保持竞争优势。

请注意,以上故事均为基于电子行业一般发展趋势和可能的公司发展路径构建的假设性案例,并非直接来源于Herga公司的官方记录。

问答坊 | AI 解惑

发两个常在我U盘中的小软件

第一个是电阻衰减网络计算器,射频工程师调试电路时用起来很方便。 第二个是我自己编的计算反射参数S11与驻波比关系的小软件…

查看全部问答>

555如何组成556

有谁知道如何用两个555组成556的吗?引脚是怎么连线的?下面的电路中556周围的元器件是做什么用的,556怎么工作,希望有人尽快能给我回复,麻烦大家了…

查看全部问答>

ADTIDE在编译后提示警告信息:没有新的一行。是什么原因。谢谢。

ADTIDE在编译后提示警告信息:没有新的一行。是什么原因。谢谢。…

查看全部问答>

关于一个程序的问题请教大家,谢谢!

我在keil软件里编了一个程序,通过此软件编译连接是好的,无错误,无警告。但当我把它放到仿真器软件里时编译的时候就有错误了,这是怎么一回事?应该如何解决它。以下是那个软件以及仿真软件提示的错误,请大家给我指点一下了,谢谢! //======= ...…

查看全部问答>

我的工程是基于WCE嵌入式系统,生成的nk.nb0用串口烧写

我的工程是基于WCE嵌入式系统,生成的nk.nb0用串口烧写进去,有两种不同的情况 ,一种是直接进入我在EVC中生成的.exe界面,一种是进入WCE的界面,这两种不同的情况是由哪个来决定的了,请问各位大侠了,小女子先谢谢了哈 …

查看全部问答>

请大家推荐89s5X系列在线编程连接器,及相应软件

请大家推荐89s5X系列在线编程连接器,及相应软件…

查看全部问答>

【100分求助】计算机组成原理课程设计

大家好。 小弟今年大三,做java开发,对汇编,单片机这样的东西是一点不懂,偏偏老师是一个非常严的人,课程设计一点一点查,抄是没的希望了,只能来这里求助了,望高手不吝赐教,先谢谢了。 一:课程设计目的: 1.在掌握“EL-JY-II计算机组成原 ...…

查看全部问答>

呼叫denis22380978

呼叫denis22380978,希望能现个身,有紧急的问题想要咨询denis22380978。…

查看全部问答>

请教CMD文件中MMR是什么意思呢

本帖最后由 dontium 于 2015-1-23 11:24 编辑 PAGE 0 :   VECS   : origin =   0h , length =   040h   /* VECTORS */                 & ...…

查看全部问答>

单片机板上的晶振工作时是否有辐射?

 请教单片机板上的晶振工作时是否有辐射?…

查看全部问答>