C语言驱动之配置定时器(基于S3C2440开发板)
发布日期:2021-05-26 20:05:01
浏览次数:10
分类:技术文章
本文共 4298 字,大约阅读时间需要 14 分钟。
源码地址:
这是timer.c文件
#include#include "timer.h"#include "irq.h"void timer0_init(int pre, MUX_E mux, int ms, IRQHandler irq){ //1. 设置预分频 TCFG0 &= ~(0xff << 0); //249 TCFG0 |= (pre & 0xff) << 0; //2. 设置固定分频 TCFG1 &= ~(0xf << 0); //8分频 TCFG1 |= (mux << 0); //3. 设置 TCNTB,计数值,根据延时来计算的 TCNTB0 = ms * 25; //ms * 1000 / 40(us) //4. 设置手动更新位,把TCNTB的值写入TCNT TCON |= (1 << 1); //定时器0 设置手动更新 //5. 设置自动重装载,并且清除手动更新位 TCON |= (1 << 3); // 定时器0设置为自动重装载 TCON &= ~(1 << 1); //清除手动重装载 //设置好定时器超时事件 irq_install(IRQ_TIMER0, irq); //6. 启动定时器0 TCON |= (1 << 0); }/* 时间计算: PCLK = 50M, PCLK/(precalu+1)/(2 << (mux)) = Pin 输入的频率 输出的时间: ms 毫秒 count = 50000 * ms / (precalu+1)/(2 << (mux))*/void timer_create(TIMER_T *pstConfig){ unsigned short count = 50000 * pstConfig->ms / (pstConfig->precalu + 1) / (2 << (pstConfig->mux)); //1. 设置预分频 if(pstConfig->id == TIMER_ID0 || pstConfig->id == TIMER_ID1) { TCFG0 &= ~(0xff); //249 TCFG0 |= (pstConfig->precalu & 0xff); } else { TCFG0 &= ~(0xff << 8); //249 TCFG0 |= ((pstConfig->precalu & 0xff) << 8); } //2. 设置固定分频 TCFG1 &= ~(0xf << (pstConfig->id << 2)); //8分频 TCFG1 |= (pstConfig->mux << (pstConfig->id << 2)); //3. 设置 TCNTB,计数值,根据延时来计算的 switch(pstConfig->id) { case TIMER_ID0 : TCNTB0 = count; break; case TIMER_ID1: TCNTB1 = count; break; case TIMER_ID2: TCNTB2 = count; break; case TIMER_ID3: TCNTB3 = count; break; case TIMER_ID4: TCNTB4 = count; break; } //4. 设置手动更新位,把TCNTB的值写入TCNT if(pstConfig->id == TIMER_ID0) { TCON |= (1 << 1); //定时器0 设置手动更新 //5. 设置自动重装载,并且清除手动更新位 TCON |= (1 << 3); // 定时器0设置为自动重装载 TCON &= ~(1 << 1); //清除手动重装载 } else { BIT_SET(TCON, (pstConfig->id * 4 + 5));//定时器0 设置手动更新 //5. 设置自动重装载,并且清除手动更新位 if(pstConfig->bAutoload) { if(pstConfig->id == TIMER_ID4) { BIT_SET(TCON, 22); } else { BIT_SET(TCON, (pstConfig->id * 4 + 7));// 定时器0设置为自动重装载 } } else { if(pstConfig->id == TIMER_ID4) { BIT_CLR(TCON, 22); } else { BIT_CLR(TCON, (pstConfig->id * 4 + 7));// 定时器0设置为自动重装载 } } BIT_CLR(TCON, (pstConfig->id * 4 + 5)); //清除手动重装载 } //设置好定时器超时事件 irq_install((IRQ_E)(pstConfig->id + IRQ_TIMER0), pstConfig->irq); }void timer_start(TIMER_ID_E timer){ //6. 启动定时器0 if(timer == TIMER_ID0) BIT_SET(TCON, 0); else BIT_SET(TCON, (timer*4 + 4));}void timer_stop(TIMER_ID_E timer){ if(timer == TIMER_ID0) BIT_CLR(TCON, 0); else BIT_CLR(TCON, (timer*4 + 4)); }void timer_destroy(TIMER_ID_E timer){ timer_stop(timer); irq_unstall((IRQ_E)(timer + IRQ_TIMER0));}
--------------------------------------------------华丽分割线-------------------------------------------------------
这是timer.h文件
#ifndef __TIMER_H__#define __TIMER_H__#include "irq.h"#include "type.h"// 分频比typedef enum { MUX2 = 0, MUX4, MUX8, MUX16 }MUX_E;// 定时器的编号IDtypedef enum{ TIMER_ID0, TIMER_ID1, TIMER_ID2, TIMER_ID3, TIMER_ID4,}TIMER_ID_E;typedef struct { TIMER_ID_E id; unsigned char precalu; //预分频 MUX_E mux; //固定分频 int bAutoload; //自动重装载 unsigned short ms; //定时时间,ms IRQHandler irq; }TIMER_T;/****************************************************************** * 函数名称: timer_create * 功能描述: * 创建定时器 * 参数说明 * @id:定时器的序号 * @prescaler:预分频值 * @mux:固定分频比 * @ms:定时的时间,单位(ms) * @bAuto:是否自动重装载,0:非自动加载,1:自动加载 * @handler:中断处理函数 * 返回值 * 无 ******************************************************************/void timer_create(TIMER_T *pstConfig);void timer_start(TIMER_ID_E timer);void timer_stop(TIMER_ID_E timer);void timer_destroy(TIMER_ID_E timer);void timer0_init(int pre, MUX_E mux, int ms, IRQHandler irq);#endif /*__TIMER_H__ */
转载地址:https://blog.csdn.net/Gaodes/article/details/81749869 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月20日 04时02分59秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
1010 一元多项式求导 (25 分)
2021-06-29
使用Python通过win32 COM接口实现Excel单元格写入
2021-06-30
树莓派的硬件信息了解与思考
2021-06-30
树莓派上创建个人用户
2021-06-30
wiringpi安装编译问题解决
2021-06-30
Windows上创建Emacs配置文件
2021-06-30
编写并运行第一个Lisp程序
2021-06-30
VS code中godoc命令不可用问题解决
2021-06-30
Emacs-103-使用spacemacs自带配置显示行号
2021-06-30
021_Excel的条件格式
2021-06-30
022_Excel空白值批量填充默认值
2021-06-30
023_emacs git-gutter+报错解决
2021-06-30
024_spacemacs支持org-pomodoro的声音提示
2021-06-30
025_everything搜索使用体验
2021-06-30
026_好用的windows小工具clover
2021-06-30
027-Mac触摸板实现窗口移动
2021-06-30
028_AUTOSAR RTE学习笔记-1
2021-06-30
029_AUTOSAR VFB学习笔记-2
2019-04-27
030_AUTOSAR软件组件学习笔记
2019-04-27
031_AUTOSAR学习笔记_BSW
2019-04-27