基于国嵌ok6410教学视频的“定时器0中断"实验
2012-06-06 23:01
274 查看
View Code
#include "def.h" #include "gpio.h" #include "library.h" #include "system.h" #include "timer.h" #include "intc.h" #include "sfr6410.h" /* 此函数的功能仅仅在于测试TIMER0的定时功能,以最简单的形式展示 “初始化定时器以及相关中断” 上述头文件在国嵌资料中有提供。 */ #define GPIO ((volatile oGPIO_REGS*)GPIO_BASE) extern void SYSC_GetClkInform(void); void LedInit(void); void LedPlay(u8 l_num); void Delay(int time); void TimerInit(void); int main(void) { //使能中断向量控制器: SYSTEM_EnableVIC(); //使能IRQ模式中断: SYSTEM_EnableIRQ(); //得到g_PCLK时钟: SYSC_GetClkInform(); //初始化中断: INTC_Init(); //定时器初始化: TimerInit(); //Led初始化: LedInit(); while(1); } //定时器服务例程 void __irq Isr_Timer(void) { // 1. 清除对应的未决位: u32 uConValue; uConValue = Inp32(rTINT_CSTAT); uConValue |= (0x1<<5); Outp32(rTINT_CSTAT,uConValue); // 2. 需要处理的东西/////////////////// LedPlay(1); Delay(100); LedPlay(2); Delay(100); LedPlay(3); // 3. 必须清除中断服务运行地址,为下次中断准备: Outp32(rVIC0ADDR,0); } //定时器初始化; void TimerInit(void) { u32 uConValue; // 1. 对中断进行配置前最好先关闭定时器: Outp32(rTCON,0); // 2. 对定时器配置定时器所采用的频率,最后得到2048的分频: //第一步:配置precaler0为127分频: uConValue = Inp32(rTCFG0); uConValue &= ~0xff; uConValue |= 0x7f; Outp32(rTCFG0, uConValue); //第二步:配置二级分频为16;共分频2048: uConValue = Inp32(rTCFG1); uConValue &= ~0xf; uConValue |= 0x4; Outp32(rTCFG1,uConValue); // 3. 设置定时器所需要的计算值: // 可以算得1微秒的 计数值 为g_PCLK/2048/1000 设为500毫秒计算值: Outp32(rTCNTB0,((g_PCLK>>11)/1000) * 500); // 4. 对状态位写1,清除当前的未决中断: uConValue = Inp32(rTINT_CSTAT); uConValue |= (0x1<<5); Outp32(rTINT_CSTAT,uConValue); // 5. 注册安装定时器0的中断函数: Outp32(rVIC0VECTADDR+4*NUM_TIMER0, (u32)Isr_Timer); // 6. 使能定时器0的中断使能位: uConValue = Inp32(rVIC0INTENABLE); uConValue |= 0x1 << NUM_TIMER0; Outp32(rVIC0INTENABLE,uConValue); // 7. 设置使得定时器0可以发生中断: uConValue = Inp32(rTINT_CSTAT); uConValue |= 0x1; Outp32(rTINT_CSTAT,uConValue); // 8. 最后使定时器开始计数, uConValue = Inp32(rTCON); uConValue &= ~0x1f; uConValue |= 0x2; //第一步:设置手动装入定时器的计算缓冲器; Outp32(rTCON,uConValue); //第二步:设置自动装入,并开启定时器: uConValue = Inp32(rTCON); uConValue &= ~0x1f; uConValue |= 0x9; Outp32(rTCON,uConValue); } //延时函数; void Delay(int time) { int i; for(; time > 0; time--) for(i=0; i < 3000; i++); } //led初始化; void LedInit(void) { u32 uConValue; uConValue = GPIO->rGPIOMCON; uConValue &= ~(0xf | (0xf<<4) | (0xf<<8) | (0xf<<12)); uConValue |= (0x1 | (0x1 << 4) | (0x1 << 8) | (0x1 << 12)); GPIO->rGPIOMCON = uConValue; } //led工作,l_num为什么值就点着对应的led灯: void LedPlay(u8 l_num) { u32 tmp; tmp = GPIO->rGPIOMDAT; tmp |= 0x1f; tmp &= (~ (1 << (l_num - 1))); GPIO->rGPIOMDAT = tmp; }
相关文章推荐
- 【黑金ZYNQ7000系列原创视频教程】04.熟悉ZYNQ内部中断——内部定时器中断实验
- 4、定时器中断实验
- 新的免费教学视频和实验 - DynamoDB, Elastic Beanstalk 和 Elastic MapReduce 介绍
- 【黑金视频连载】NIOSII视频教程(05)--电平中断实验
- 【黑金ZYNQ7000系列原创视频教程】06.ZYNQ来自FPGA的中断——按键中断实验
- stm32定时器中断实验
- 嵌入式成长轨迹44 【Zigbee项目】【CC2430基础实验】【定时器中断】
- 【黑金视频连载】NIOSII视频教程(06)--沿中断实验
- 一起学mini2440裸机开发(十一)--mini2440定时器0中断实验
- 【黑金视频连载】FPGA NIOSII视频教程(10)--定时器实验
- 实验二:外部中断与定时器/计数器中断实验
- 基于platform的ok6410按键中断实验
- ok6410实现定时器中断驱动 pwm驱动
- Zigbee之旅(四):几个重要的CC2430基础实验——定时器中断(转)
- 【黑金视频连载】FPGA NIOSII视频教程(12)--时间戳定时器实验
- TI CC2530基础实验(定时器3中断方式——自由运行模式)
- 中断和定时器实验
- STM32单片机学习(5) 定时器中断实验
- 定时器中断实验
- S02_CH08_ ZYNQ 定时器中断实验