⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer_hard.c

📁 新一代基于事件的嵌入式操作系统dyos在三星的s3c44b0的arm芯片上的完整移植代码
💻 C
字号:
//----------------------------------------------------
//Copyright (C), 2004-2009,  lst.
//版权所有 (C), 2004-2009,   lst.
//所属模块: 硬件定时器
//作者:lst
//版本:V1.0.0
//文件描述: 用于44b0硬件定时器操作
//其他说明:
//修订历史:
//    2. ...
//    1. 日期:
//       作者:
//       新版本号:
//       修改说明:
//------------------------------------------------------
#include "inc_os.h"
#include "gpio.h"
struct hard_reg_timer volatile * const pg_timer_reg
                        = (struct hard_reg_timer *)0x1d50000;

//44b0x的定时器功能简述:
//1、减计数方式工作
//2、每个定时器可选5个时钟源,分别为主频的1/2分频~1/32分频,其中timer4没有1/32
//   分频代之以TCLK,timer5没有1/32分频代之以EXTCLK。
//3、每两个定时器共享一个8位预分频器,01共享一个,23共享一个,45共享一个。
//4、timer0~4有比较寄存器,用于产生PWM波形,timer5没有。
//5、每个定时器可以设定为单次运行和重复运行,可以手动启动和停止。
void timer_init(void)
{
    //DMA:No select(All Interrupt),
    pg_timer_reg->TCFG1 = 0;
}

//----设置定时器时钟源----------------------------------------------------------
//功能: 设置各定时器时钟源.
//参数: timer,定时器号
//      value,定时器输入时钟源,timer和value的对应表如下:
//      value:  0           1           2            3          4
//      timer0: 1/2分频     1/4分频     1/8分频      1/16分频   1/32分频
//      timer1: 1/2分频     1/4分频     1/8分频      1/16分频   1/32分频
//      timer2: 1/2分频     1/4分频     1/8分频      1/16分频   1/32分频
//      timer3: 1/2分频     1/4分频     1/8分频      1/16分频   1/32分频
//      timer4: 1/2分频     1/4分频     1/8分频      1/16分频   TCLK
//      timer5: 1/2分频     1/4分频     1/8分频      1/16分频   EXTCLK
//返回: 无
//-----------------------------------------------------------------------------
void timer_set_clk_source(ufast_t timer,ufast_t value)
{
    pg_timer_reg->TCFG1 &= ~(0xf << (timer<<2));
    pg_timer_reg->TCFG1 |= value << (timer<<2);
}

//----设置定时器预分频数-------------------------------------------------------
//功能: 设置各定时器预分频数.
//参数: group,定时器组号,01为1组,23为1组,45为1组
//      value,定时器预分频数,0~255对应1~256分频
//返回: 无
//-----------------------------------------------------------------------------
void timer_set_precale(ufast_t group,uint16_t value)
{
    pg_timer_reg->TCFG0 &= ~(0xff << (group<<3));
    pg_timer_reg->TCFG0 |= value << (group<<3);
}

//----设置定时器计数值----------------------------------------------------------
//功能: 设置各定时器计数值.定时器的溢出中断时间为:value*(预分频+1)/时钟源分频数
//参数: timer,定时器号
//      value,计数值
//返回: 无
//-----------------------------------------------------------------------------
void timer_set_counter(ufast_t timer,uint16_t value)
{
    switch (timer)
    {
        case 0:
            pg_timer_reg->TCNTB0 = value;
            break;
        case 1:
            pg_timer_reg->TCNTB1 = value;
            break;
        case 2:
            pg_timer_reg->TCNTB2 = value;
            break;
        case 3:
            pg_timer_reg->TCNTB3 = value;
            break;
        case 4:
            pg_timer_reg->TCNTB4 = value;
            break;
        case 5:
            pg_timer_reg->TCNTB5 = value;
            break;
        default:break;
    }
}

//----设置定时器比较值----------------------------------------------------------
//功能: 用于pwm占空比设计
//参数: timer,定时器号
//      value,比较值
//返回: 无
//-----------------------------------------------------------------------------
void timer_set_compare(ufast_t timer,uint16_t value)
{
    switch (timer)
    {
        case 0:
            pg_timer_reg->TCMPB0 = value;
            break;
        case 1:
            pg_timer_reg->TCMPB1 = value;
            break;
        case 2:
            pg_timer_reg->TCMPB2 = value;
            break;
        case 3:
            pg_timer_reg->TCMPB3 = value;
            break;
        case 4:
            pg_timer_reg->TCMPB4 = value;
            break;
        default:break;
    }
}

//----设置定时器工作方式-------------------------------------------------------
//功能: 设定定时器是连续工作还是单次工作
//参数: timer,定时器号
//      type,0=单次工作,1=自动加载连续工作
//返回: 无
//-----------------------------------------------------------------------------
void timer_set_type(ufast_t timer,ufast_t type)
{
    switch (timer)
    {
        case 0:
            pg_timer_reg->TCON &= ~(1<<3);
            pg_timer_reg->TCON |= type<<3;
            break;
        case 1:
            pg_timer_reg->TCON &= ~(1<<11);
            pg_timer_reg->TCON |= type<<11;
            break;
        case 2:
            pg_timer_reg->TCON &= ~(1<<15);
            pg_timer_reg->TCON |= type<<15;
            break;
        case 3:
            pg_timer_reg->TCON &= ~(1<<19);
            pg_timer_reg->TCON |= type<<19;
            break;
        case 4:
            pg_timer_reg->TCON &= ~(1<<23);
            pg_timer_reg->TCON |= type<<23;
            break;
        case 5:
            pg_timer_reg->TCON &= ~(1<<26);
            pg_timer_reg->TCON |= type<<26;
            break;
        default:break;
    }
}

//----重载定时器计数和比较值---------------------------------------------------
//功能: 手动重新加载定时器的计数和比较寄存器值(timer5没有比较寄存器)
//参数: timer,定时器号
//返回: 无
//-----------------------------------------------------------------------------
void timer_reload(ufast_t timer)
{
    switch (timer)
    {
        case 0:
            pg_timer_reg->TCON |= 1<<1;
            pg_timer_reg->TCON &= ~(1<<1);
            break;
        case 1:
            pg_timer_reg->TCON |= 1<<9;
            pg_timer_reg->TCON &= ~(1<<9);
            break;
        case 2:
            pg_timer_reg->TCON |= 1<<13;
            pg_timer_reg->TCON &= ~(1<<13);
            break;
        case 3:
            pg_timer_reg->TCON |= 1<<17;
            pg_timer_reg->TCON &= ~(1<<17);
            break;
        case 4:
            pg_timer_reg->TCON |= 1<<21;
            pg_timer_reg->TCON &= ~(1<<21);
            break;
        case 5:
            pg_timer_reg->TCON |= 1<<25;
            pg_timer_reg->TCON &= ~(1<<25);
            break;
        default:break;
    }
}

//----启动定时器--------------------------------------------------------
//功能: 启动定时器
//参数: timer,定时器号
//返回: 无
//-----------------------------------------------------------------------------
void timer_start(ufast_t timer)
{
    switch (timer)
    {
        case 0:
            pg_timer_reg->TCON |=1;
            break;
        case 1:
            pg_timer_reg->TCON |=1<<8;
            break;
        case 2:
            pg_timer_reg->TCON |=1<<12;
            break;
        case 3:
            pg_timer_reg->TCON |=1<<16;
            break;
        case 4:
            pg_timer_reg->TCON |=1<<20;
            break;
        case 5:
            pg_timer_reg->TCON |=1<<24;
            break;
        default:break;
    }
}

//----停止定时器--------------------------------------------------------
//功能: 停止定时器
//参数: timer,定时器号
//返回: 无
//-----------------------------------------------------------------------------
void timer_stop(ufast_t timer)
{
    switch (timer)
    {
        case 0:
            pg_timer_reg->TCON &=~1;
            break;
        case 1:
            pg_timer_reg->TCON &=~(1<<8);
            break;
        case 2:
            pg_timer_reg->TCON &=~(1<<12);
            break;
        case 3:
            pg_timer_reg->TCON &=~(1<<16);
            break;
        case 4:
            pg_timer_reg->TCON &=~(1<<20);
            break;
        case 5:
            pg_timer_reg->TCON &=~(1<<24);
            break;
        default:break;
    }
}

//----读定时器当前值--------------------------------------------------------
//功能: 读出定时器的当前计数值
//参数: timer,定时器号
//返回: 当前计数值
//-----------------------------------------------------------------------------
uint16_t timer_read(ufast_t timer)
{
    switch (timer)
    {
        case 0:
            return pg_timer_reg->TCNTO0;
            break;
        case 1:
            return pg_timer_reg->TCNTO1;
            break;
        case 2:
            return pg_timer_reg->TCNTO2;
            break;
        case 3:
            return pg_timer_reg->TCNTO3;
            break;
        case 4:
            return pg_timer_reg->TCNTO4;
            break;
        case 5:
            return pg_timer_reg->TCNTO5;
            break;
        default:break;
    }
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -