ok6410的定时器0 测试程序
2012-06-15 23:20
316 查看
#include "def.h" #include "gpio.h" #include "library.h" #include "system.h" #include "timer.h" #include "intc.h" #include "sfr6410.h" /* 此函数的功能仅仅在于测试TIMER0的定时功能,以最简单的形式展示 “初始化定时器以及相关中断” 上述头文件在国嵌资料中有提供。 实现效果是:定时地在 LED1, LED2 , LED3之间轮转: */ #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(u8 t_num, int ms); int main(void) { //使能中断向量控制器: SYSTEM_EnableVIC(); //使能IRQ模式中断: SYSTEM_EnableIRQ(); //得到g_PCLK时钟: SYSC_GetClkInform(); //初始化中断: INTC_Init(); //定时器初始化: TimerInit(0 , 500); //Led初始化: LedInit(); while(1); } //定时器服务例程 void __irq Isr_Timer(void) { // 1. 清除对应的未决位: u32 uConValue; uConValue = Inp32(rTINT_CSTAT); uConValue |= (0x1<<(5 + 1)); Outp32(rTINT_CSTAT,uConValue); // 2. 需要处理的东西/////////////////// LedPlay(1); Delay(100); LedPlay(2); Delay(100); LedPlay(3); // 3. 必须清除中断服务运行地址,为下次中断准备: Outp32(rVIC0ADDR,0); } //定时器初始化; void TimerInit(u8 t_num, int ms) { 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毫秒计算值: if(t_num == 1) Outp32(rTCNTB1,((g_PCLK>>11)/1000) * ms); else if(t_num == 0) Outp32(rTCNTB0,((g_PCLK>>11)/1000) * ms ); // 4. 对状态位写1,清除当前的未决中断: uConValue = Inp32(rTINT_CSTAT); uConValue |= (0x1<<(5+ t_num)); Outp32(rTINT_CSTAT,uConValue); // 5. 注册安装定时器的中断函数: 每个寄存器存有4个字节的地址所以乘以4 if(t_num == 0) Outp32(rVIC0VECTADDR+4*NUM_TIMER0, (u32)Isr_Timer); else if(t_num == 1) Outp32(rVIC0VECTADDR+4*NUM_TIMER1, (u32)Isr_Timer); // 6. 使能定时器的中断使能位: uConValue = Inp32(rVIC0INTENABLE); uConValue |= (0x1 << NUM_TIMER0) | (0x1 << NUM_TIMER1); Outp32(rVIC0INTENABLE,uConValue); // 7. 设置使得定时器可以发生中断: uConValue = Inp32(rTINT_CSTAT); uConValue |= 0x1 << (t_num); Outp32(rTINT_CSTAT,uConValue); // 8. 最后使定时器开始计数, uConValue = Inp32(rTCON); //第一步:设置手动装入定时器的计算缓冲器; uConValue &= ~(0x1f << t_num*8); uConValue |= 0x2 << (t_num * 8); Outp32(rTCON,uConValue); //第二步:设置自动装入,并开启定时器: uConValue = Inp32(rTCON); uConValue &= ~(0x1f << t_num * 8); uConValue |= 0x9 << (t_num *8); 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; }
相关文章推荐
- ok6410的定时器0 测试程序
- ok6410LCD测试程序
- 在ok6410 Androdi开发板运行c程序,添加驱动模块,并测试android驱动
- ok6410LCD测试程序
- OK6410 uart 简单测试程序
- 飞凌ok6410的串口测试程序
- ok6410 按键测试c语言版程序
- Qtopia 2.2.0在OK6410平台的移植(四)LED测试
- 【OK6410裸机程序】移植printf和scanf
- 在OK6410 android开发板上添加led驱动模块,并通过NDK测试驱动
- 【OK6410裸机程序】按键中断
- OK6410烧写裸机程序到nandflash(改)
- 基于STM32处理器 定时器比较输出测试程序
- 只用串口和网络裸机开发ARM程序(OK6410开发板)纯(转)
- ARM嵌入式学习--OK6410裸板程序--1.GPIO控制LED
- OK6410之使用串口烧写运行全裸程序
- OK6410学习之裸板LED程序及RAM烧录
- TQ2440裸奔程序>>定时器4中断测试程序
- 一灯大师之点亮OK6410开发板上4个LED裸机程序---嵌入式回归第十篇
- OK6410与Ubuntu 11.10 NFS配置与运行第一个程序