一起学mini2440裸机开发(十一)--mini2440定时器0中断实验
- 格式:doc
- 大小:86.50 KB
- 文档页数:6
TQ2440之定时器中断0——volatile关键字的重要作用
近日,在学习《ARM 处理器裸机开发实战机制而非策略》一书,在
TQ2440 开发板上,按照书中实例以及光盘配套程序源代码进行Timer0 中断试验,编译成功后烧写到开发板上,没有任何反应,反复检查代码,一直没有找
出哪里有问题,就是到开发板上没有预期效果。
(让人纠结的很)最终参考了
TQ2440 之定时器中断0 的程序代码,编译成功后,烧写到板子上,惊喜出现了。
绝对是久旱逢甘霖的感觉,在这里对TQ2440 之定时器中断0 的原创作者
表示感谢。
后来,经过代码对比,发现两个可疑的地方:
(1)之前的Timer0 的初始化中没有rTCMPB0 = 0;这条语句。
而后来参考TQ2440 之定时器中断0 中的代码是有这条语句的。
后来经过验证,这里无关紧要。
(2)之前对于Led1 灯亮灭控制语句是放在Main 函数中的:
而后来参考的TQ2440 之定时器中断0 中是将这段代码放在了中断服务函数
当中:
不过,按道理来讲,这个地方不加修改应该是可以的。
暂且先总结这样一条经验吧:如果一些控制语句(比如控制Led 灯亮、灭)
是要通过中断来驱动执行,那么最好将这些控制语句放在中断服务程序(也叫
中断处理程序)中。
如果只是在中断服务程序中控制一个全局变量(比如flag),。
裸机定时器中断控制LED灯程序设计一、实验要求:基于mini2440开发板,设计裸机定时器中断控制LED灯闪烁的程序。
二.设计目的1,巩固学习嵌入式软件方面的基本知识,进一步熟悉基本概念。
2,熟练常用控件,文件,图形等方面的操作了解基本的流程。
3,运用所用学的嵌入式知识,编写出较为实用的小软件,增进对一些实际问题的软,硬件知识的掌握。
4,培养查阅资料,独立思考问题的能力。
三. 实验步骤:四.基本思路及关键问题的解决方法;基本思路:1. 按照步骤程序设计原理说明,使用”CodeWarrior for ARM Developer Suite”软件编写程序并进行编译,建立一个新的文件单击【File】菜单中的【New File】选项,然后出现下面的对话框,输入文件名(加上后缀“.c”),单击保存按钮,在编译过程中如果出现错误,修改程序直到没有错误为止,编译过程中出现警告一般可以不必考虑,但特殊时也要通过修改程序消除警告。
程序编写完成后,将程序所在文件保存到2440test.mcp中,如图所示:2.用开发板测试程序代码:(1)首先设置开发板的拨动开关S2 为Nor Flash 启动,连接好附带的USB 线和电源(可以不必连接串口线)。
(2)设置超级终端(3)开机进入BIOS 模式,此时开发板上的绿色LED1 会呈现闪烁状态,其启动界面,如下图:输入”d”(4)安装USB 下载驱动(5)点击DNW 程序的“USB Port” “Transmit”,选择这个2440test.mcp文件,接着点“打开”,这样就开始下载了五.流程图及电路原理图1.绘制所需的流程图,如图所示:六.课程设计心得体会此次课程设计中我们的收获:我了解到了和小组成员合作的愉快,我意识到了知识的乐趣性,并感觉到当知识运用于实践的时候是一件多么幸福的事情。
我也发现自己的知识功底还远远不够。
平时不仅要将知识点理解掌握,还得勤动手做实验。
在以后的学习中我会更努力,在掌握理论知识的基础上,提高自己的动手能力。
定时器中断程序设计实验定时器中断程序设计实验简介定时器中断是嵌入式系统中的常见应用之一,通过配置定时器的相关寄存器,可以定时产生中断信号,从而实现定时功能。
本文档将介绍定时器中断的基本概念和在实验中如何设计和实现定时器中断程序。
一、定时器中断的概念定时器中断是通过硬件定时器产生的中断信号,可以用于在嵌入式系统中实现定时功能。
定时器中断的原理是定时器内部的计数器自动递增,并在计数到一个特定值时产生中断信号。
通过配置定时器的相关寄存器,可以设置定时器的计数范围、计数速度和中断触发条件等参数。
二、定时器中断的实验设计步骤以下是一个基本的定时器中断程序设计实验的步骤:1. 确定定时器的类型和工作模式根据实际需求和硬件平台的支持情况,选择合适的定时器类型和工作模式。
常见的定时器类型包括定时器/计数器和看门狗定时器,常见的工作模式包括定时模式和计数模式。
2. 配置定时器的相关寄存器根据定时器的类型和工作模式,配置定时器的相关寄存器。
主要包括计数范围、计数速度和中断触发条件等参数的设置。
3. 初始化中断控制器如果使用的嵌入式系统具有中断控制器,需要初始化中断控制器,并使能相应的中断通道。
4. 编写中断服务程序通过注册中断处理函数,并在其中编写中断服务程序。
中断服务程序主要包括对中断标志位的清除、中断处理、中断函数返回等操作。
5. 启动定时器配置完成后,启动定时器开始计数。
定时器将根据配置的参数自动递增,并在计数到设定的特定值时产生中断信号。
6. 整合定时器中断功能到主程序在主程序中,可以使用定时器中断提供的功能来实现定时任务。
可以通过在中断服务程序中设置标志位,并在主循环中检测该标志位来执行相应的任务。
三、实验注意事项在设计和实现定时器中断程序时,需要注意以下事项:1. 根据实际需求进行定时器的配置,确保定时器的参数设置合理。
2. 在中断服务程序中应尽量减少对全局变量和共享资源的访问,以避免竞态条件和数据不一致等问题的发生。
定时器中断程序设计实验正文:1、引言本文档旨在提供一个定时器中断程序设计实验的详细指南。
通过本实验,我们将学习如何设计和实现一个基于定时器中断的程序。
本文档将详细介绍实验的目标、实验环境、实验步骤以及实验结果分析等内容。
2、实验目标本实验的目标是设计一个定时器中断程序,实现定时器中断功能。
具体来说,我们将学习如何设置定时器中断的时间间隔和中断处理程序,在每个中断周期内执行特定的操作。
3、实验环境为了完成本实验,我们需要以下环境和工具:- 开发板:x- 软件开发工具:x- 相关文档和参考资料:x4、实验步骤本节将介绍具体的实验步骤,包括硬件连接和软件编程等。
4.1 硬件连接首先,我们需要将定时器与处理器连接起来。
具体连接方式请参考开发板的相关文档。
4.2 软件编程在开始编写程序之前,我们需要了解一些关于定时器中断的基本知识。
首先,我们需要设置定时器的工作模式和中断时间间隔。
然后,我们需要编写中断处理程序,以响应定时器中断事件。
最后,我们需要在主程序中初始化定时器,并启动中断。
下面是一个示例的软件编程步骤:1、设置定时器的工作模式和中断时间间隔。
2、编写定时器中断处理程序。
3、在主程序中初始化定时器,并启动中断。
4、检测和处理定时器中断事件。
注意:以上步骤只是一个示例,具体步骤可能因实验环境和要求而有所不同。
请根据实际情况进行调整和修改。
5、实验结果分析在完成实验后,我们需要对实验结果进行分析和总结。
具体来说,我们需要评估定时器中断程序的性能和稳定性,检查是否存在任何问题或错误。
如果有需要,我们还可以对程序进行优化和改进。
6、附件本文档的附录部分包括以下附件:- 附件1:定时器中断程序源代码- 附件2:实验数据记录表请查阅附件以获取更详细的信息。
7、法律名词及注释本文档所涉及的法律名词及其注释如下:- 法律名词1:注释1- 法律名词2:注释2- :::请注意,在实际应用中,如果涉及到法律问题,请咨询专业法律顾问以获取正确的法律解释。
T1_MINI2440开发板的使用入门资料T1_MINI2440开发板是一款嵌入式开发板,基于三星ARM9微处理器S3C2440A,适用于学习嵌入式系统开发、嵌入式Linux开发和嵌入式应用开发等领域。
本文将介绍T1_MINI2440开发板的使用入门资料,让你快速上手。
T1_MINI2440开发板主要包括核心模块和扩展模块两部分。
核心模块包括三星ARM9微处理器S3C2440A、SDRAM、NAND Flash等主要芯片组成,扩展模块包括串口、以太网口、USB接口等扩展接口。
开发板还配备了丰富的外设接口,如LCD接口、摄像头接口、触摸屏接口等。
了解开发板的硬件架构是使用开发板的第一步。
为了让你更好地了解T1_MINI2440开发板的使用方法,我们提供一个简单的入门案例。
案例名:LED闪烁案例描述:使用T1_MINI2440开发板上的GPIO接口控制LED灯的闪烁。
实施步骤:1.搭建好T1_MINI2440开发板的硬件环境,并连接好LED灯。
2.配置GPIO接口为输出模式。
3.循环发送高低电平信号,控制LED的闪烁。
可以使用延时函数来控制LED闪烁的速度。
4.编译、烧写并运行程序,观察LED是否闪烁。
以上是一个简单的LED闪烁案例,通过这个案例你可以学会使用T1_MINI2440开发板的GPIO接口控制外设。
随着你对开发板的熟悉程度提高,你可以尝试更复杂的案例,如使用LCD接口显示图像、使用摄像头接口进行图像采集等。
总结:T1_MINI2440开发板是一款适用于嵌入式开发的嵌入式系统板,通过了解开发板的硬件架构和搭建相应的软件环境,你可以迅速上手使用该开发板。
通过实践案例,你能够掌握使用开发板的基本技能,为进一步深入学习嵌入式系统开发打下基础。
希望这份资料可以帮助到你。
一、实验目的1. 理解中断和定时器的基本概念及工作原理。
2. 掌握51单片机中断系统和定时器的配置方法。
3. 学会使用中断和定时器实现特定功能,如延时、计数等。
4. 培养动手实践能力和问题解决能力。
二、实验原理中断是计算机系统中的一种机制,允许CPU在执行程序过程中,暂停当前程序,转去执行另一个具有更高优先级的程序。
51单片机具有5个中断源,包括两个外部中断(INT0、INT1)、两个定时器中断(定时器0、定时器1)和一个串行口中断。
定时器是51单片机内部的一种计数器,可以用于产生定时中断或实现定时功能。
51单片机有两个定时器,即定时器0和定时器1。
定时器可以工作在模式0、模式1、模式2和模式3。
三、实验内容及步骤1. 实验内容一:外部中断实验(1)实验目的:掌握外部中断的使用方法,实现按键控制LED灯的亮灭。
(2)实验步骤:- 使用Keil for 8051编译器创建项目。
- 根据电路原理图连接电路。
- 编写程序,配置外部中断,实现按键控制LED灯的亮灭。
2. 实验内容二:定时器中断实验(1)实验目的:掌握定时器中断的使用方法,实现LED灯闪烁。
(2)实验步骤:- 使用Keil for 8051编译器创建项目。
- 根据电路原理图连接电路。
- 编写程序,配置定时器中断,实现LED灯闪烁。
3. 实验内容三:定时器与外部中断结合实验(1)实验目的:掌握定时器与外部中断结合使用的方法,实现按键控制LED灯闪烁频率。
(2)实验步骤:- 使用Keil for 8051编译器创建项目。
- 根据电路原理图连接电路。
- 编写程序,配置定时器中断和外部中断,实现按键控制LED灯闪烁频率。
四、实验结果与分析1. 外部中断实验:成功实现了按键控制LED灯的亮灭。
当按下按键时,LED灯亮;松开按键时,LED灯灭。
2. 定时器中断实验:成功实现了LED灯闪烁。
LED灯每隔一定时间闪烁一次,闪烁频率可调。
3. 定时器与外部中断结合实验:成功实现了按键控制LED灯闪烁频率。
#define GLOBAL_CLK 1#include "def.h"#include "option.h"#include "2440addr.h"#include "2440lib.h"#include "2440slib.h"#include "mmu.h"void led_port_init(void);void timer0_init(void);void __irq timer0_handle(void);int Main(void){led_port_init();MMU_Init();timer0_init();while (1);return 0;}void led_port_init(void){rGPBCON = 0x00015400; //设置LED口为输出rGPBDA T = 0xe<<5; //初始化为全暗}void timer0_init(void){/*系统时钟初始化在其它文件中已经完成*/rTCFG0 = 99; //预分频的值为(199 + 1)rTCFG1 = 0x3; //1/16的再分频50MHz/100/16 = 31250Hz rTCNTB0 = 31250;// rTCMPB0 = 0; 默认值就是0,所以没必要设置rTCON = 1<<1; //第一次需要手动更新。
把初值填入rTCNT0rTCON = 0x9; //三个功能:自动加载,清除手动更新,启动定时器pISR_TIMER0 = (unsigned int)timer0_handle; //注册中断ClearPending(BIT_TIMER0); //清除原来可能有的中断EnableIrq(BIT_TIMER0); //总掩码打开。
中断使能}void __irq timer0_handle(void){static unsigned char count;ClearPending(BIT_TIMER0);switch(++count % 4){case 0:rGPBDA T |= (1<<8);rGPBDA T &= ~(1<<5);break;case 1:rGPBDA T |= (1<<5);rGPBDA T &= ~(1<<6);break;case 2:rGPBDA T |= (1<<6);rGPBDA T &= ~(1<<7);break;case 3:rGPBDA T |= (1<<7);rGPBDA T &= ~(1<<8);break;}}。
定时器中断程序设计实验定时器中断程序设计实验1. 实验目的本实验旨在通过设计一个定时器中断程序,实现定时触发某个操作的功能。
通过此实验,可以熟悉定时器中断的使用方法,了解中断程序设计的基本原理。
2. 实验原理定时器中断是一种常用的硬件中断方式,可以根据设定的时间间隔,在每次定时器溢出时触发一个中断请求。
在中断处理程序中,可以执行一系列操作,如更新计数器、处理数据、控制外设等。
3. 实验器材单片机开发板烧录软件4. 实验步骤步骤1:引入头文件,在程序中引入相应的头文件,包括中断相关的头文件以及需要使用的外设相关的头文件。
cinclude <reg51.h> //单片机寄存器定义include <intrins.h> //特殊函数检测//其他头文件步骤2:初始化定时器在主函数中,初始化定时器,设定定时器的工作模式、计数值等参数。
cvoid InitTimer(){TMOD = 0x01; //定时器工作在模式1,16位定时器自动重装TH0 = 0xff; //定时器初值设定为0xffffTL0 = 0xff; //定时器初值设定为0xffffTR0 = 1; //启动定时器}步骤3:编写中断处理程序编写中断处理程序,即定时器中断的具体操作。
在本实验中,我们将在定时器中断发生时,通过P1口输出一个脉冲信号。
cvoid TimerInterrupt() interrupt 1{P1 ^= 0x01; //P1口取反,输出脉冲信号}步骤4:主程序在主程序中,调用初始化函数,然后进入一个无限循环,保持程序不退出。
cvoid mn(){InitTimer(); //初始化定时器while (1){//其他程序}}5. 实验结果与分析通过上述操作,定时器中断程序设计已经完成。
在本实验中,我们通过定时器中断触发P1口的脉冲信号输出,以验证中断程序的正确性。
6. 实验本实验通过设计一个定时器中断程序,实现了定时触发某个操作的功能。
一起学mini2440裸机开发(九)--ARM中断控制系统ARM处理器程序的执行流程种类●正常执行:每执行一条ARM指令,程序计数器PC的值自动加4。
这一过程描述了应用程序顺序执行的状态。
●跳转执行:通过B、BL跳转执行,实现程序在一定范围内的跳转执行。
这一过程描述了ARM处理器程序执行过程中的过程调用。
●中断处理:在应用程序执行过程中,发生中断后,ARM处理器在执行完当前指令后,跳转到上述中断对应的中断处理程序处去执行,执行完中断处理程序后,再返回到发生中断的指令的下一条执行处接着执行。
这一过程描述了ARM处理器对异常中断的响应情况。
S3C2440中断系统概述在ARM处理器运行过程中,需要与系统的各类外部设备进行通信,包括发出控制信息、读取外部设备的状态信息以及采集数据等。
完成上述功能有以下两种实现方法。
●查询方式:处理器不断地查询外部设备的状态,一般是每隔一段时间查询一次或者是始终在查询,这样做的缺点是实时性差、浪费处理器时间。
●中断方式:当外设状态发生变化时发送一个信号给处理器,处理器通过内部的控制逻辑找到具体的外部设备,然后对请求信息进行响应。
在这种情况下,处理器的利用率大大提高,同时也提高了系统的实时性。
ARM处理器对中断第处理流程基本符合下面的流程。
①中断发生后,中断控制器将中断请求发送给CPU②CPU将当前程序的运行环境(程序的运行环境包括程序执行过程中使用的寄存器以及程序的返回地址等信息)保存,调用相应的中断处理程序。
③在中断处理程序中,识别具体是哪个中断发生,并进行相应的处理④从中断处理程序返回,恢复被中断程序的运行环境,接着执行。
ARM处理器有7种工作模式,如下表所示表1 ARM处理器工作模式处理器模式说明用户模式(User) 程序正常执行的模式快速中断模式(FIQ) 用于高速数据传输外部中断模式(IRQ) 用于普通的中断处理特权模式(Supervisor) 操作系统使用的一种保护模式数据访问终止模式(Abort) 用于虚拟存储及存储保护未定义指令终止模式(Udefined) 用于支持通过软件仿真硬件的协处理器系统模式(System) 用于运行特权级的操作系统任务ARM处理器的工作模式分为用户模式和特权模式,除用户模式外的其他6种工作模式为特权模式。
一起学mini2440裸机开发(十一)--mini2440定时器0中断实验在前边讲解系统时钟和定时器时,曾给出一个实验,实现的功能是:使用定时器0的功能,使LED每秒钟闪烁一次,当时是使用查询方式实现的,现在使用中断方式实现上述功能。
下图为我的工程文件布局:下面贴出我的代码,你也可以去这里下载,/detail/mybelief321/5457371下载下来之后,直接编译,点击Flash/Download ,下载到nor flash中运行。
main.c文件#include"led.h"#include"timer.h"#include"isrservice.h"#include"interrupt.h"unsigned int flag=0;int main(){Led_Init(); //初始化LEDTimer0_Init(); //定时器0初始化Timer0_Interrupt_Init(); //定时器0中断初始化while(1) //循环,等待中断发生{if(flag){Led2_On();}else{Led2_Off();}}}led.c文件/***************************************************** 我的mini2440开发板上4个LED灯对应的GPIO口* LED1---GPB5 LED2---GPB6* LED3---GPB7 LED4---GPB8*****************************************************/#include<s3c2440.h>/***************************************************** 函数名称:void Led_Init(void)* 全局变量:无* 参数说明:无* 返回值;无* 功能:设置GPB5-8为输出功能,初始化4个LED灯灭*****************************************************/void Led_Init(void){GPBCON&=~((3<<10)|(3<<12)|(3<<14)|(3<<16));GPBCON|=((1<<10)|(1<<12)|(1<<14)|(1<<16)); //设置GPB5-8口为输出功能GPBUP&=~((1<<5)|(1<<6)|(1<<7)|(1<<8)); //上拉电阻使能GPBDAT|=(1<<5)|(1<<6)|(1<<7)|(1<<8); //令GPBDAT5-8均为高电平,即令4个led灯全灭}led.h文件#ifndef __LED_H__#define __LED_H__#include<s3c2440.h>#define Led1_On() {GPBDAT&=(~(1<<5));}#define Led1_Off() {GPBDAT|=(1<<5);}#define Led2_On() {GPBDAT&=(~(1<<6));}#define Led2_Off() {GPBDAT|=(1<<6);}#define Led3_On() {GPBDAT&=(~(1<<7));}#define Led3_Off() {GPBDAT|=(1<<7);}#define Led4_On() {GPBDAT&=(~(1<<8));}#define Led4_Off() {GPBDAT|=(1<<8);}/***************************************************** 函数名称:void Led_Init(void)* 全局变量:无* 参数说明:无* 返回值;无* 功能:设置GPN5-8为输出功能,初始化4个LED灯灭*****************************************************/void Led_Init(void);#endiftimer.c文件#include<s3c2440.h> //s3c2440.h对S3C2440芯片的一些地址的宏定义#include"timer.h"/**************************************************************** 函数名称:void Timer0_Init(void)* 参数说明:无* 全局变量:无* 返回值:无* 功能:对于50MHz的PCLK,经过分频获得62.5KHz的定时器0* 的输入时钟。
***************************************************************/void Timer0_Init(void){TCFG0&=~(0xff); //设置第1级分频系数,分频系数为99TCFG0|=99;TCFG1&=~(0xf); //设置第2级分频系数,分频系数为8TCFG1|=0x02; //62.5KHz=50MHz/(99+1)/8TCNTB0=62500; //1s中断一次。
经过上述分频器得到定时器0的输入时钟频率为62.5kHz,即定时器//每秒钟计数62500次。
因此,初始化时,定时器0计数值初始值为62500 //在这里我们可以看出TCMPBn没有设置,因为咱们用它的默认值0,所以就不需要设置TCON|=(1<<1); //开启手动更新位,即当定时器开启后,TCMPB0和TCNTB0中的值会加载到寄存器TCMP0和TCNT0中TCON=0x09; //关闭手动更新位,设置自动加载位,同时开启定时器,这样,TCNT0进行减1计数,当TCNT0中的计//数值减到0时,TCNTB0、TCMPB0中的数据分别会自动加载到TCNT0、TCMP0中并进行新一轮的减1计数}timer.h文件#ifndef __TIMER_H__#define __TIMER_H__/**************************************************************** 函数名称:void Timer0_Init(void)* 参数说明:无* 全局变量:无* 返回值:无* 功能:对于50MHz的PCLK,经过分频获得62.5KHz的定时器0* 的输入时钟。
***************************************************************/void Timer0_Init(void);#endifinterrupt.c文件#include<s3c2440.h>#include"interrupt.h"/***************************************************** 函数名称:void Timer0_Interrupt_Init(void)* 全局变量:无* 参数说明:无* 返回值;无* 功能:将定时器0中断屏蔽位设为无效*****************************************************/void Timer0_Interrupt_Init(void){INTMSK&=~(1<<10); //将定时器0中断屏蔽位设为无效,这样当//定时器0发生中断时,中断请求信号可以} //顺利到达CPUinterrupt.h文件#ifndef __INTERRUPT_H__#define __INTERRUPT_H__/***************************************************** 函数名称:void Timer0_Interrupt_Init(void)* 全局变量:无* 参数说明:无* 返回值;无* 功能:将定时器0中断屏蔽位设为无效*****************************************************/void Timer0_Interrupt_Init(void);#endifisrservice.c文件#include<s3c2440.h>#include"isrservice.h"extern unsigned int flag; //声明外部变量flag,该变量是在main.c文件中定义的//当1s到来时,中断响应函数将该变量值取反,在主//程序中通过检测该变量的值来实现不同的操作/***************************************************** 函数名称:void __irq IRQ_Handler(void)* 全局变量:无* 参数说明:无* 返回值;无* 功能:定时器0中断服务函数,必须加__irq*****************************************************/void __irq IRQ_Handler(void) //注意这个函数名字要和S3C2440.s处的跳转标号相同{flag=!flag; //1s时间到,flag值取反SRCPND|=1<<10; //清除中断标志位INTPND|=1<<10;}isrservice.h文件#ifndef __ISRSERVICE_H__#define __ISRSERVICE_H__/***************************************************** 函数名称:void __irq IRQ_Handler(void)* 全局变量:无* 参数说明:无* 返回值;无* 功能:定时器0中断服务函数,必须加__irq*****************************************************/void __irq IRQ_Handler(void);#endif千万要记得下载到nor flash中啊,如果不会,请看博客:/mybelief321/article/details/8954788。