历史上的今天
返回首页

历史上的今天

今天是:2024年11月04日(星期一)

正在发生

2021年11月04日 | 一起学mini2440裸机开发(十一)--mini2440定时器0中断实验

2021-11-04 来源:eefocus

在前边讲解系统时钟和定时器时,曾给出一个实验,实现的功能是:使用定时器0的功能,使LED每秒钟闪烁一次,当时是使用查询方式实现的,现在使用中断方式实现上述功能。


下图为我的工程文件布局:

下面贴出我的代码,你也可以去这里下载,


http://download.csdn.net/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();             //初始化LED

 Timer0_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


/****************************************************

* 函数名称: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

#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);


#endif

    timer.c文件



#include   //s3c2440.h对S3C2440芯片的一些地址的宏定义

#include"timer.h"


/***************************************************************

* 函数名称:void Timer0_Init(void)

* 参数说明:无

* 全局变量:无

* 返 回 值:无

* 功    能:对于50MHz的PCLK,经过分频获得62.5KHz的定时器0

*     的输入时钟。

***************************************************************/

void Timer0_Init(void)

{

 TCFG0&=~(0xff);    //设置第1级分频系数,分频系数为99

 TCFG0|=99;


 TCFG1&=~(0xf);      //设置第2级分频系数,分频系数为8

 TCFG1|=0x02;  //62.5KHz=50MHz/(99+1)/8


 TCNTB0=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);


#endif


 


    interrupt.c文件


#include

#include"interrupt.h"



/****************************************************

* 函数名称:void Timer0_Interrupt_Init(void)

* 全局变量:无

* 参数说明:无

* 返 回 值;无

* 功    能:将定时器0中断屏蔽位设为无效

*****************************************************/

void Timer0_Interrupt_Init(void)

 INTMSK&=~(1<<10);   //将定时器0中断屏蔽位设为无效,这样当

                                     //定时器0发生中断时,中断请求信号可以

}                                    //顺利到达CPU


    interrupt.h文件


#ifndef __INTERRUPT_H__

#define __INTERRUPT_H__



/****************************************************

* 函数名称:void Timer0_Interrupt_Init(void)

* 全局变量:无

* 参数说明:无

* 返 回 值;无

* 功    能:将定时器0中断屏蔽位设为无效

*****************************************************/

void Timer0_Interrupt_Init(void);


#endif


 


     isrservice.c文件


#include

#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中啊,如果不会,请看博客:


http://blog.csdn.net/mybelief321/article/details/8954788


推荐阅读

史海拾趣

FEMA Electronics Corporation公司的发展小趣事

随着科技的不断发展,FEMA意识到只有不断创新才能在竞争激烈的市场中立于不败之地。因此,公司加大了研发投入,不断推出具有自主知识产权的新产品。其中,一款高性能的集成电路芯片在市场上引起了广泛关注。这款芯片不仅性能卓越,而且具有极高的性价比,迅速赢得了客户的青睐。FEMA凭借这一产品,成功打开了新的市场领域,实现了业务的快速增长。

CEVA, Inc公司的发展小趣事

CEVA公司在超低功耗技术方面取得了显著突破。公司开发的超低功耗IP包括由专用DSP与AI和其他类型的加速器组成的综合平台。这些加速器针对低功耗工作负载进行了优化,包括5G基带处理、智能视觉、语音识别、物理层处理和传感器融合等。这些技术的突破使得CEVA的产品在保持高性能的同时,能够大幅度降低功耗,满足了市场对节能设备的需求。

Aimtec公司的发展小趣事

作为一家注重品质的企业,Aimtec公司深知质量管理体系的重要性。因此,公司投入大量资源,建立了完善的质量管理体系,并通过了ISO 9001:2015等国际质量管理体系认证。这些认证不仅证明了Aimtec公司在质量管理方面的实力,也为公司的业务拓展提供了有力的保障。通过持续的质量改进和创新,Aimtec的产品在行业中赢得了良好的口碑。

Connection One公司的发展小趣事

面对日益激烈的市场竞争,Connection One公司不断推陈出新,研发出一系列创新产品。这些产品不仅性能卓越,而且设计新颖,深受消费者喜爱。公司因此赢得了大量忠实客户,业绩持续攀升。

Chip Technologies Inc公司的发展小趣事

在追求经济效益的同时,Chip Technologies Inc也积极履行社会责任,致力于实现可持续发展。公司严格遵守环保法规,采用环保材料和工艺,降低生产过程中的能耗和排放。此外,公司还积极参与公益事业,为社会做出贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展注入了正能量。


请注意,这五个故事只是基于电子行业的一般情况而构思的,并未涉及Chip Technologies Inc公司的具体细节。您可以根据公司的实际情况和市场环境,对这些故事进行适当修改和补充,以满足您的具体需求。

Coleman Cable Inc公司的发展小趣事

品质一直是Coleman Cable的生命线。公司建立了严格的质量控制体系,从原材料采购、生产过程到成品检验,每一个环节都严格把关。这种对品质的执着追求,使得Coleman Cable的产品在市场上享有良好的声誉。同时,公司还积极听取客户反馈,不断改进产品和服务,赢得了客户的信赖和忠诚。

问答坊 | AI 解惑

基于FPGA的直接数字频率合成器的设计和实现

概述   直接数字频率合成技术(Direct Digital Frequency Synthesis,即DDFS,一般简称DDS),是从相 位概念出发直接合成所需要波形的一种新的频率合成技术。目前各大芯片制造厂商都相继推出采用先进 CMOS工艺生产的高性能、多功能的DDS芯 ...…

查看全部问答>

一种偏僻野外的设备供电想法~~

请教下,用风力发电做动力给超级电容充电,然后再用超级电容来供电给很多偏僻野外的设备供电,大家觉得这个方式可靠吗?…

查看全部问答>

基于PID算法的有刷直流电机PWM调速

请问各位:基于PID算法的有刷直流电机PWM调速系统中对有刷直流电机调速用到的算法是模拟 PID控制原理还是增量式PID控制或者别的PID控制原理?能否将PID算法式子告诉我?谢谢各位了!!QQ:286410824…

查看全部问答>

请教VxWorks 下的声卡驱动

谁知道哪个地方可以买到带有Vxworks驱动的声卡?或者哪里可以下载到Vxworks声卡的驱动?…

查看全部问答>

WinCE驱动开发

我刚开始学习WinCE驱动开发,请各位大侠推荐些学习的资料,入门级别的,谢谢。…

查看全部问答>

IAR汇编程序中多次使用RSEG伪指令是什么意思?

如题!IAR汇编程序中多次使用RSEG伪指令是什么意思?IAR汇编程序中多次使用RSEG伪指令是什么意思?IAR汇编程序中多次使用RSEG伪指令是什么意思?IAR汇编程序中多次使用RSEG伪指令是什么意思?…

查看全部问答>

救命啊:EVC中致命的应用程序错误

PC系统为2000,所用工具是EVC3.0 PDA为操作系统为WINCE,PPC2002,所用连接软件是ActiveSync,编译一个没有错误的程序时,在PDA上显示 Application *.EXE has performed an illegal operation and will be shut down .If the problem persists,con ...…

查看全部问答>

关于USB升级的问题

听说STM32F103VCT6的Load是采用串口升级的,那我们设备与外通讯仅仅有USB接口,如果我们用IAP方式进行升级,万一出现意外擦除了,那岂不是很麻烦! 有人碰到这个问题吗?怎么解决呢? 谢谢了!…

查看全部问答>

电压调节问题

请教一个问题,pwm波输出,要实现电压数字可调,电压范围为0~5V ,调节步进为10mv,有什么可行性方案?…

查看全部问答>