历史上的今天
返回首页

历史上的今天

今天是: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 */


上一篇:STM32 Flash详解

下一篇:STM32 IIC详解

推荐阅读

史海拾趣

CHONGQING PINGYANG ELECTRONICS CO.,LTD.公司的发展小趣事

2005年,重庆平洋电子有限公司迎来了一个重要的合作机会。经过严格的筛选和谈判,公司与海尔集团达成了先期采购协议,成为海尔集团在重庆市唯一一家免第三方认证的企业。这一合作不仅为公司带来了稳定的订单和收益,还进一步提升了公司的品牌影响力和市场竞争力。

Future Designs, Inc. (FDI)公司的发展小趣事

在快速发展的同时,FDI也注重可持续发展。他们致力于环境保护和社会责任,积极采用环保材料和节能技术,减少生产过程中的资源消耗和污染排放。同时,FDI还关注员工的发展和福利,为员工提供良好的工作环境和培训机会,激发员工的创造力和创新精神。展望未来,FDI将继续秉承“创新、服务、质量、诚信”的核心理念,不断推动技术进步和产品升级,为电子行业的发展贡献更多的力量。

富瀚(Fullhan)公司的发展小趣事
检查保护器的各项设置参数是否正确,如过载保护阈值、逆相保护设置等。
Hisetec Electronic Co Ltd公司的发展小趣事

背景:在21世纪初,电子产品市场迅速增长,智能手机和平板电脑等移动设备成为新宠。Hisetec Electronic Co Ltd公司凭借其在微电子封装技术的深厚积累,成功研发出一种高密度、低功耗的封装解决方案,大幅提升了手机芯片的能效比。

发展:该技术迅速被市场认可,多家知名手机制造商如三星、苹果等纷纷采用,Hisetec公司因此订单激增,市场份额大幅提升。公司不仅扩大了生产规模,还进一步加大了研发投入,不断推出新的封装技术,巩固了其在电子封装领域的领先地位。

ELINA INDEK公司的发展小趣事

在电子行业中,技术变革日新月异,市场竞争异常激烈。面对这些挑战,因美纳始终保持着敏锐的洞察力和灵活的反应能力。公司不断调整产品策略和市场布局,积极应对行业变革。同时,因美纳还注重培养员工的创新能力和团队协作精神,为公司的发展提供源源不断的动力。

Herley New York公司的发展小趣事

因美纳(Illumina)公司成立于2000年,起初是一家专注于基因测序技术的小型企业。在创始人Jay Flatley的领导下,公司成功研发出了一系列高性能、低成本的基因测序仪器,使得基因测序技术从昂贵的实验室研究工具转变为广泛应用的医疗诊断工具。这一技术突破不仅为因美纳赢得了市场份额,也为整个医疗行业带来了革命性的变化。

问答坊 | AI 解惑

新的FT2232C型USB UART/FIFO电路的特征及应用

摘要:FT2232C是一款USB到UART/FIFO转换电路。文中介绍FT2232C的特性、工作原理及应用领域,给出该电路在各种不同场合的典型应用电路。     关键词:通用串行总线;通用异步收发模式/先进先出;FT2232C 引言 在进行室外信息采集时, ...…

查看全部问答>

实用的各种电源电路

本帖最后由 paulhyde 于 2014-9-15 03:54 编辑 好的电源电路  …

查看全部问答>

能否用open打开打开usb节点?

本信息来自合作QQ群:arm linux fpga 嵌入0群  49900581(超级群)  群主在坛子里ID:wangkj 我问一下各位大虾, 我把U盘插入linux系统的电脑时有一个设备U盘节点/dev/sdb1 当我用open函数打开时打不开 open(\"/dev/sdb1\" ...…

查看全部问答>

和弱智的一个问题 大侠们忍住不要笑

在WINCE流驱动实验中 DWORD XXXXXXXXXXX, DWORD的在这是不是就是定义了一个双字节16位的变量…

查看全部问答>

evc 录音除噪声

   如题,在evc下编写了录音程序,但它把所有的声音都录下来了。 现考虑只要录下人说话的声音即可。有没有把噪声滤掉的程序???…

查看全部问答>

请教:使用Identify RTL Debugger出现的问题

我用的是V5 XC5VLX50的FPGA,我建了一个Synplify的工程,然后新建了一个identify instrument  ,然后就调用Launch identify instrument ,就在打开它的过程中,出现了一个db_assert的错误提示,点确定 然后就什么都没了     ...…

查看全部问答>

STM32中断学习

CM3可以实现256个异常和中断,其中异常占用16个向量位置,中断占用占用240个向量位置.STM32作为一种具体的芯片,实现了16个异常(其中6个保留),实现了60个中断,所以就有两个中断设置使能寄存器ISER0和ISER1,每个可以控制32个中断的使能,也有两个中 ...…

查看全部问答>

急需请教Raisonancec和COSMICC哪个的编译效果好?

编程环境:STVD +COSIC C,使用STM8S103F2 (4K flash +1K ram)编译从瑞萨单片机(4K flash + 1K RAM)移植过来的程序,编译提示错误信息如下 #error clnk Debug\\vma.lkf:1 segment .text size overflow (3146) The command: "clnk -l"C ...…

查看全部问答>

vxworks 更改后IP,如何重新建立UDP连接

例如通过telnet修改了IP,此时之前的UDP通信就不能工作,非要重启设备才行,有什么好方法…

查看全部问答>