Mini2440 裸机实验之LED程序、按键、中断

mini2440+jlink+mkd 裸机按键中断调试心得体会(2013.11.17已更新) 开发板:友善之臂mini2440,仿真器:jlink v8,开发环境:RealView mdk 需要阅读的文档:S3C2440A_UserManual,mini2440开发手册,其他 实验目标:按下开发板上的key1,触发外部中断后,开发板进入中断程序运行。 分析: 为了方便理解,我按照信号的走向,分为几个环节,逐个说明。 环节1.先说说,按下key1是如何触发外部中断信号。阅读mini 阅读详情

测试平台:Mini2440 Win7 64 ADS开发环境测试

此程序主要考虑按键、LED点亮、中断模式(IRQ)之间的联系

以下为main.c代码部分,其他请参考三星提供的2440用例代码

#define	GLOBAL_CLK		1
#include<stdlib.h>
#include<string.h>
#include"def.h"
#include"option.h"
#include"2440addr.h"
#include"2440lib.h"
#include"2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"

//led灯测试程序
void led_init(void);
void led_close(void);
void led_run(void);
void disp_num(int data);
void led_disp_num(int data);

//按键中断程序
void key_init(void);
static void __irq key_handler(void);
void beep_init(void);
void beep_run(void);

#define LED1_ON ~(1<<5)
#define LED2_ON ~(1<<6)
#define LED3_ON ~(1<<7)
#define LED4_ON ~(1<<8)

#define LED1_OFF (1<<5)
#define LED2_OFF (1<<6)
#define LED3_OFF (1<<7)
#define LED4_OFF (1<<8)


/******延时函数******/
void delay(int n_times)
{
	int i;
	for( ;n_times>0;n_times--)
		for(i=0;i<400;i++)
			;
}


/*****运行主函数*****/
void Main(void)
{
	
	int i=0;
	led_init();
	//实现led灯递增亮起
	//led_run();
	
	
	
	/*
	//实现led灯以二进制方式显示0-15
	while(i<16)
	{
		//disp_num(i++);
		led_disp_num(i++);
		delay(5000);
		if(i==16)
		{
			i = 0;
		}
	}
	*/
	
	//按键测试中断
	beep_init();
	MMU_Init();
    key_init();
	while(1)
	{
		;
		//beep_run();
	}
}


/*******对LED引脚进行初始化*******/
void led_init(void)
{
	//每一个引脚设为输出端口,初始化为01
	rGPBCON &= ~( (1<<2*5+1)|(1<<2*6+1)|(1<<2*7+1)|(1<<2*8+1) );
	//rGPBCON.....
}


/*******关闭所有的led灯*******/
void led_close(void)
{
	rGPBDAT |= (LED1_OFF)|(LED2_OFF)|(LED3_OFF)|(LED4_OFF);
	//rGPBDAT &= 0xFFFFFF0F;
}


/********mini2440开发板有4个引脚连接了LED发光二极管,该函数实现了流水灯*******/
void led_run(void)
{
	int i=0;
	//int arr_led_on[4]={LED1_ON,LED2_ON,LED2_ON,LED2_ON};
	//led_close();
	
	led_close();
	rGPBDAT &= ~(1<<5);
	delay(10000);
	/*
	while(1)
	{	
	  //第一种递增跑马灯 1000-》0100-》0010-》0001-》1000...
		led_close();
		rGPBDAT &= ~(1<<i+5);
		delay(50000);
		if( ++i == 4 )
		{
			i = 0;
		}
	
	  
	  //第二种递增亮起 1000-》1100-》1110-》1111-》0000...
		rGPBDAT &= ~(i<<5);
		delay(5000);
		if( ++i == 16)
		{
			led_close();
			i = 0;
		}	
		*/
	//}
}

/********显示0000~1111数字********/	
void disp_num(int data)
{
	if(data&0x08)
		rGPBDAT &= LED4_ON;
	else
		rGPBDAT |= LED4_OFF;
	
	if(data&0x04)
		rGPBDAT &= LED3_ON;
	else
		rGPBDAT |= LED3_OFF;
		
	if(data&0x02)
		rGPBDAT &= LED2_ON;
	else
		rGPBDAT |= LED2_OFF;
		
	if(data&0x01)
		rGPBDAT &= LED1_ON;
	else
		rGPBDAT |= LED1_OFF;
}
		

/********显示0000~1111数字********/	
void led_disp_num(int data)
{
	int i = 3;
	for(; i>=0; i++)
	{	 
		//if( data & ((int)pow(2,i)) ) //肯定非0都为真
		if( data & 0x0f)
		{
			delay(1000);
			rGPBDAT &= ~(1<<8-i);
		}
		else
		{
			rGPBDAT &= (1<<8-i);
		}
	}
}


/*******按键key1的初始化函数********/
void key_init(void)
{
	//rGPGCON &= ~(0<<2*0+1);
	rGPGCON &= (~(0x3<<0))&(~(0x3<<2*3));
	rGPGCON |= (0x2<<0)|(0x2<<2*3); //10特殊功能
	
	//rEXTINT1 &= ~(0xf<<0);//0000 EINIT8 开启低电平 过滤关闭
	rEINTPEND |= (1<<8)|(1<<11); //清除之前的中断
	rEINTMASK &= (~(1<<8))&(~(1<<11));//中断不被屏蔽
	
	pISR_EINT8_23 = (U32) key_handler;
	EnableIrq(BIT_EINT8_23);
}
	
/*******key1的中断服务程序*******/
static void __irq key_handler(void)
{
	if( rINTPND == BIT_EINT8_23)
	{
		ClearPending(BIT_EINT8_23);
		
		if( rEINTPEND&(1<<8) )
		{
			led_close();
			rEINTPEND |= 1<<8;
			beep_run();
		}
		
		
		if( rEINTPEND&(1<<11) )
		{
			rEINTPEND |= 1<<11;
			led_run();
		}
		
		//ClearPending(BIT_EINT8_23);
			
	}
}


/***********初始化蜂鸣器***********/
void beep_init(void)
{
	rGPBCON &= ~(0x3<<0);
	rGPBCON |= 0x1<<0;//初始化为输出端
}
	

/*********运行蜂鸣器*********/
void beep_run(void)
{
	rGPBDAT |= 0x1<<0;
	delay(1000);
	rGPBDAT &= ~(0x1<<0);
	delay(1000);
}

LED点亮步骤(以MIni2440为参考,其他请看手册说明)

1.初始化LED配置的引脚,如mini2440 led1-》GPB5 每一个器件都有一个或者多个管脚进行驱动控制,就是设置GPBCON引脚5(两位为一个控制单位,应该是【11:10】)

2.直接点亮,还是管脚,这里有谁驱动它发光亮起来呢??就是GPBDAT,led1引脚5,此时为1位控制,即是【5】=0(低电平有效的情况下),就能驱动发亮

对于按键来说其实是一样的,只不过连接的针脚不一样,这时候参考手册就可以知道key-》GPG,然后这些针脚对应了相应的中断,当我们不使用中断控制的情况下,这时候需要读取GPGDAT的值,然后与相应的key对应的键位值进行&即可判断哪个按键被按下了,方法同上因为都是GPIO

中断控制(IRQ,非快速中断模式FIQ)

对于如何设置堆栈sp,pc....如何调转到快速中断,怎么恢复CPSR等等,暂且不谈,先看中断顺序

1. 首先要初始化中断,清除当前要中断的位,设置当前中断的位,使能当前中断,

    如: 按键key1-》EINT8-》GPG0,仍然是GPIO,还是前面的方法,因为这个中断属于二级仲裁器1中的REQ1/EINT8_23,

 

   所以还要设置EINTPEND用以判断到底是哪一个中断,先清除如key1: rEINTPEND |= (1<<8)。还得保证不被屏蔽mask位就要设为0,才是应为EINTMASK对应的位,查手册即可;

   这里使用默认低电平触发方式,如果要设置电平方式,设置EXTINT1即可,额外设置的寄存器EXTINT0不能使用,请参看手册;

   设置中断先后顺序,这里两个中断同级,并没有设置,如需请设置PRIORITY

2. 设置中断处理函数,先将中断处理函数映射到相应的中断地址去,本例就是key_handler

3. 接下来就可以使能相应中断了,如key1 INMASK  &= (~(1<<5) )即可,本例调用三星的库函数EnableIrq(BIT_EINT8_23);使能中断

4. 处理中断,在主函数里面是一个无止境的循环,当有中断发生,即转到中断处理函数

 注:1)处理函数之前就是使用了一个循环导致不能退出,也不能相应下一个中断

       2)蜂鸣中断处理函数,屏蔽蜂鸣不能使用rGPBDAT &=(0x0<<0);此时LED会全部亮起来,因为此时我只想测试蜂鸣,最好采用rGPBDAT &= ~(0x1<<0);

尤其LED部分,我调试了走马灯,各灯分别亮起,0-15循环亮起的LED实例,注销部分注释即可测试,以及未修改成功的显示0-15测试用例

Mini2440裸机开发:GPIO控制LED实战指南 GPIO(通用输入输出)是嵌入式系统中最基础的外设接口,通过配置寄存器可直接控制硬件引脚电平状态。其工作原理是通过设置控制寄存器选择引脚功能模式(输入/输出/复用),再操作数据寄存器改变电平。在ARM架构中,S3C2440等处理器通过内存映射方式访问GPIO寄存器,这种底层控制方式具有实时性高、资源占用少的特点,特别适合裸机开发场景。以LED控制为例,开发者需要理解共阳极/共阴极电路设计,掌握GPIO初始化、电平设置等核心操作。本文以Mini2440开发板为硬件平台,详细演示如何通过汇编和C语言实现LED闪 阅读详情

相关推荐

keil下基于arm9的TX2440开发板的外部中断编写

S3c2440可以说是学习arm9最常用的芯片了,这方面有很多开发板,例如TQ2440,MINI2440,JZ2440。 当时学习了业界很火的郭天祥老师的51单片机教程,书写的很长很好。因此在学习arm上也想学习郭老师的教程,在他的天祥淘宝店铺上,花了很贵的价钱买了TX2440开发板。满心欢喜的进行学习。 然鹅,我大失所望,和五一单片机完全不一样,这个arm9的开发板看不到一点郭老师的影子...

weixin_42681235的博客 1315

六、mini2440裸机程序之中断控制器(2)外部按键中断

1.管脚介绍   2.相关知识点介绍     1)中断源相关仲裁器 :       2)异常向量表:        3)PSR格式(通过对I、F位置'0',可以开启IRQ和FIQ )         arm920t包含了一个CPSR(当前程序状态寄存器) , 5个SPSRs(保存程序状态寄存器  :  用于异常中断处理程序保存CPSR的值)  ,  其中的I

shengnan_wu的专栏 1999

基于Mini 2440的按钮控制LED闪烁系统设计与实现

回过头看,我们经历了这样一个旅程:🔧硬件认知→ ⚙️寄存器操控→ 🔄轮询交互→ 💥中断响应→ 🛡️防抖加固这不是简单的“点灯教程”,而是一套完整的嵌入式系统构建方法论。你学到的不仅是S3C2440怎么用,更是如何理解硬件行为、设计健壮逻辑、调试底层问题的能力。未来的路还很长:你可以继续深入:- 使用PWM实现呼吸灯;- 结合RTC做定时开关;- 移植FreeRTOS实现多任务调度;

weixin_36303305的博客 859

一起学mini2440裸机开发(十)--mini2440外部中断实验

我今天一整天都在试着将TQ2440的那种处理中断的方法(即安装中断向量表)移植到MDK中的mini2440,但是一直没成功,这种方法一直没成功,后来又想,还是先从最简单的开始吧,就是不利用中断向量表,直接像利用51单片机那样的中断一样使用它,但是也没成功。考虑到程序跑飞的可能性,将程序利用MDK中的Download功能下载到了Nor Flash中去,竟然行了,想了想原因,明白是怎么回事了。我原来是

王文松的博客 4301

Mini2440点亮LED

基于Mini2440板的s3c2440的c语言点亮LED例程,测试无误。本人对基本的GPIO操作进行了封装,封装头文件为ioset.h。

mini2440按键中断测试程序(烧录到NORFlash,运行在SDRAM)

该程序适用于mini2440板子。将.bin程序用J-LINK烧录到NORFlash中,从NORFlash启动以后,程序会搬移到SDRAM中运行。本程序涉及到ARM9的中断,代码搬移,SDRAM的初始化,运行地址及加载地址。文件包括:head1.S head2.S init.c interrupt.c main.c s3c24xx.h int.lds Makefile 等一些生成文件。

Mini2440裸机开发之中断控制器

一、S3C2440上的中断 1.1 中断概述 S3C2440A 中的中断控制器接受来自60 个中断源的请求。提供这些中断源的是内部外设,如DMA 控制器、 UART、IIC 等等。在这些中断源中,UARTn、AC97 和EINTn 中断对于中断控制器而言是“或”关系。 当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求ARM920T 内核的FIQ 或IRQ。 1.2 中...

Graceful_scenery的博客 158

基于深度学习的图像去雨(Opencv,Pytorch,Cnn)

最近做了一个图像去雨项目,使用的语言为Python,深度学习框架为Pytorch。去雨效果不错,具体请看效果视频!图像去雨(GAN,Opencv,Pytorch)

Czqqwer的博客 2611

mini2440裸板程序-c语言点亮led

1、开发C语言程序的时候,一般都是使用main函数作为入口,而main函数仅仅只是一个函数而已,那么他一定需要被别人来调用,同时将返回值返回给调用者。那么在我们在开发的时候LED点亮的时候,没有人来调用我们的函数,所以我么需要自己来做这些工作。 2、硬件方面的初始化:关闭看门狗 3、软件方面的初始化:设置栈 :把栈指针sp指向某块内存 4、硬件和软件的初始化被称之为启动文件,而该启动文件是一个汇编代码 启动文件crt0.S .text .global _start _start: LDR .

xiaoliu198703的专栏 514

MDK开发篇:基于立创逻辑派FPGA-G1与Cortex-M1软核的按键控制LED实战

本文详细介绍了基于立创逻辑派FPGA-G1开发板与高云Cortex-M1软核的完整开发流程。通过Gowin云源软件配置软核系统与GPIO外设,并在Keil MDK环境中编写按键控制LED的C程序,最终实现程序固化与上电自启动。教程涵盖硬件配置、软件开发、在线调试与固化部署全步骤,帮助STM32开发者快速上手FPGA软核开发。

weixin_42103128的博客 147

【ubuntu】如何搭建AFTR+B4环境

为何要使用ipv6 目前ipv4地址已经不够用了,而IPv6采用128位地址长度,几乎可以不受限制地提供地址。而且ipv6具有更高的安全性。 主流的ipv6方案 1.双栈方案 :所有设备同时支持IPv4/IPv6协议栈,核心理念在于其传送网同时支持IPv4和IPv6 2.DS-Lite方案 :IPv4‐in‐IPv6 隧道和 NAT 这两个基本技术,同时支持IPV4与IPV6,对于ipv4用户,可以通过ipv6隧道与ipv4业务平台实现通信;针对ipv6用户,可直接通过ipv6网络通信。 3.6RD方案 :

weixin_43863426的博客 2721

mini2440第一个裸机程序——点亮LED

下面这篇博文是我感觉最容易上手的了,转载推荐~ 语言:汇编(简单) 方式:裸机,操作寄存器 https://www.cnblogs.com/outs/p/9315162.html

qq_36863664的博客 386

基于深度学习YOLOv5的草莓成熟度检测系统详解(深度学习模型+UI界面+Python代码+训练数据集)

数据采集与预处理模块:负责收集草莓图像,并进行数据增强和标注。深度学习模型训练模块:使用YOLOv5模型进行草莓成熟度检测模型的训练。模型推理模块:加载训练好的模型,对输入图像或视频进行草莓成熟度检测。UI界面模块:提供用户交互界面,方便用户上传图像或视频进行成熟度检测。本文详细介绍了基于YOLOv5的草莓成熟度检测系统的构建过程,包括数据集的构建、模型的训练与推理、以及UI界面的设计。通过本文的指导,读者可以快速搭建一个高效的草莓成熟度检测系统,并应用于实际场景中。

斌擎科技 523

MICRO2440裸跑之按键点亮LED 、按键、蜂鸣器

<br />今天这个程序主要实现了通过mini2440上面的六个按键去控制那个4个LED,并且在按键的过程中蜂鸣器还会发出声音。程序的功能图:<br /><br /> <br /> <br /> <br />在此程序中并没有使用到按键的中断,而是使用了一个死循环去实现的。并且这个程序保护两个部分,一个是汇编程序编写的引导部分,因为这是一个裸机的程序,即没有操作系统的程序,因此想要在板子上运行C程序必须进行相应的初始化的工作,这个就是汇编程序的功能。汇编代码如下:<br />IMPORT Main<br />

GhostTigerMan 1106

802.11be 的“上帝视角”:深入解析 CSI 技术原理与实现

IEEE 802.11be标准下的CSI技术解析 摘要:本文深入解析了802.11be标准中的信道状态信息(CSI)技术。CSI作为无线通信的"高精度地图",通过显式反馈机制获取信道矩阵H,经SVD分解得到预编码矩阵V。802.11be在CSI反馈机制上实现重大改进:支持320MHz带宽、16空间流;引入灵活的子载波分组(Ng=4/16)、更高量化精度(最高9/7比特)、部分带宽反馈和触发式反馈。这些创新显著提升了MU-MIMO和波束成形性能,为Wi-Fi 7带来极速通信、精准感知和Me

1042484520@qq.com(邮箱) 209

复现报告:《多回路人机控制系统仿真及II型PIO分析》方法复现与代码实现

本文复现了谭文倩硕士论文《多回路人机控制系统仿真及II型PIO分析》中的关键方法,重点实现了频域驾驶员模型辨识和参数灵敏度分析。通过数字化提取论文图表数据,构建了结构驾驶员模型传递函数,并验证了参数变化对系统特性的影响。采用MATLAB实现了描述函数计算、模型参数辨识和灵敏度分析算法,为后续神经网络模型辨识和II型PIO研究奠定了基础。由于缺乏原始实验数据,部分结果通过数值模拟获得,但仍有效重现了论文的核心分析方法。~~~~~

huanghm88的专栏 175

led灯按键中断c语言,mini2440 按键中断点亮led灯裸机代码 | 勤奋的小青蛙

先把代码贴上,后续再去进行详细介绍,总共需要这么几个文件:head.S, init.c, interrupt.c, main.c, Makefile详情可以从这个地方下载:mini2440 按键中断点亮led灯裸机代码http://www.jyguagua.com/bbs/forum.php?mod=viewthread&tid=184&fromuid=1head.S内容:@***...

weixin_29067143的博客 340

ardupilot BMI088加速度陀螺仪学习

本节主要记录ardupilot 中BMI088传感器的学习过程,欢迎批评指正。BMI088是一款高性能6轴惯性传感器,由16位数字三轴±24g加速度计和16位数字三轴±2000°/ s陀螺仪组成。 BMI088允许高精度测量方向和沿三个正交轴的运动检测。BMI088具有高振动鲁棒性和3 x 4.5 x0.95mm³的小尺寸,是用于无人机和机器人应用等恶劣环境的高性能IMU中的独特产品。 BMI088专门设计用于有效抑制由于PCB上的共振或整个系统的结构而可能发生的振动。 除了高振动稳定性外,BMI088的出

陌城烟雨 2053

关于mini2440的一个裸机程序——LED与按键中断

/* *File : main.c *Description : When you press the key, * the LED will show the key_value of key by the binary * and produce the buzzer. *Author : Cong *Copyright :

草根聪的生活 3360

实战|2026美团&大众点评餐饮数据抓取:Playwright/Selenium反爬全攻略

核心结论:2026年美团&大众点评的反爬核心是“多维度风控”,需组合使用“住宅IP+设备指纹伪装+真人行为模拟+动态验证处理”,Playwright是最优工具,Selenium仅作为补充。效率优化:单机爬取速度建议控制在“每小时500-800条”,避免高频请求触发风控;分布式爬取需确保每个节点使用独立住宅IP,且行为轨迹不一致。扩展方向集成WASM解密工具,破解2026年美团的Token加密;用AI识别动态点选验证,提升验证通过率;对接大数据平台,对抓取的餐饮数据进行可视化分析。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2461

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Mini 2440 LED、按键和蜂鸣器裸机测试程序(C语言)

已有 215 次阅读  2010-07-08 01:10 出处:http://student.youkuaiyun.com/space.php?uid=4434&do=blog&id=37880       今天这个程序主要实现了通过mini2440上面的六个按键去控制那个4个LED,并且在按键的过程中蜂鸣器还会发出声音。                  实现原理:

avatar1912的专栏 1718

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

基于mini2440的按键中断控制LED(裸机代码)

#define GLOBAL_CLK //相当于定义了FCLK,HCLK,PCLK,UCLK #include "def.h" #include "option.h" #include "mmu.h" #include "2440addr.h" #define LED1_on rGPBDAT = ((0xf<<5)^(1<<5)) //GPB5=0 #define LED2_on

Mr·潘 821

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

2440裸机程序——按键中断

工程当中需要添加 S3C2440A.s ;2440lib.c;main.c;keyscan.c这段四个程序。 主程序: /********************************************************************************************* * File name: main.c * Author: ZXL  *

ZhuXiaoLong‘Blog 1408

定时器中断程序下: 下载到NAND不能运行,,只能下载到内存中运行~~

问题:      最近裸机学习mini2440,感觉每学一个外设 都 会遇到很多问题,虽然用的是光盘的源代码,但总是 会有不一样的问题!本次定时器中断程序,算成BIN文件后,设置RO BASE =0X00000000后 下载到NAND时 程序不能执行,,只能设置RO BASE=0X30000000下载到内存执行。。疑惑:     接着前面的LED流水灯、按键中断的学习,都可以很顺利的下载到NAND和内存中执行,到了定时器中断,下载到NAND却不行了???是程序本身的问题?不对啊,程序在按键中断的基础上变化不

Nobel2313的专栏 1206
上一篇: Win7 64 ADS1.2 编译弹出Error: L6218E: Undefined symbol sprintf (referred from 2440...)
下一篇: ARM9协处理器CP15、MCR/MRC指令
comwise
博客等级 码龄15年 58粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值