历史上的今天
今天是: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 #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
史海拾趣
|
概述 直接数字频率合成技术(Direct Digital Frequency Synthesis,即DDFS,一般简称DDS),是从相 位概念出发直接合成所需要波形的一种新的频率合成技术。目前各大芯片制造厂商都相继推出采用先进 CMOS工艺生产的高性能、多功能的DDS芯 ...… 查看全部问答> |
|
请问各位:基于PID算法的有刷直流电机PWM调速系统中对有刷直流电机调速用到的算法是模拟 PID控制原理还是增量式PID控制或者别的PID控制原理?能否将PID算法式子告诉我?谢谢各位了!!QQ:286410824… 查看全部问答> |
|
如题!IAR汇编程序中多次使用RSEG伪指令是什么意思?IAR汇编程序中多次使用RSEG伪指令是什么意思?IAR汇编程序中多次使用RSEG伪指令是什么意思?IAR汇编程序中多次使用RSEG伪指令是什么意思?… 查看全部问答> |
|
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 ...… 查看全部问答> |
|
听说STM32F103VCT6的Load是采用串口升级的,那我们设备与外通讯仅仅有USB接口,如果我们用IAP方式进行升级,万一出现意外擦除了,那岂不是很麻烦! 有人碰到这个问题吗?怎么解决呢? 谢谢了!… 查看全部问答> |




