• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

【活动】想要实现如下功能,定时器该怎么配置?.

SingleYork 2016-08-29 浏览量:1247
本帖最后由 SingleYork 于 2016-9-4 19:45 编辑

[postbg]bg7.png[/postbg]如题:

想要实现如下功能,定时器该怎么配置,请简述其原理:

1)定时器0做16位自动重装10us定时,不中断,从P3.5高速输出50KHZ时钟信号。
2)定时器1做16位自动重装1ms定时, 中断,从P3.4高速输出500HZ时钟信号。
3)定时器2做16位自动重装20ms定时,中断,从P3.0高速输出25HZ时钟信号。同时中断里从P1.0取反输出25HZ时钟信号。


温馨提示:

请从以下链接中的帖子学习相关内容并进行回答,其他地方得到的答案不能作为标准答案,仅能做为补充说明,七天之内答案不可见,答题的童鞋有七天时间修改答案,每周结贴一次,选择最佳答案。获得最佳答案的童鞋将会获得相应的专家积分,专家积分排行榜有丰厚的奖励哦!每周机会有限,请认真回答!




答案出处:


I51开发板活动原帖及例程详解汇总

//www.icxbk.com/community/forum.php?mod=viewthread&tid=65414
(出处: ICKEY BBS)



3 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • u8 Timer_Inilize(u8 TIM, TIM_InitTypeDef *TIMx)
    {
    if(TIM > Timer2) return 1; //空操作

    if(TIM == Timer0)
    {
    TR0 = 0; //停止计数
    if(TIMx->TIM_Interrupt == ENABLE) ET0 = 1; //允许中断
    else ET0 = 0; //禁止中断
    if(TIMx->TIM_Polity == PolityHigh) PT0 = 1; //高优先级中断
    else PT0 = 0; //低优先级中断
    if(TIMx->TIM_Mode > TIM_16BitAutoReloadNoMask) return 2; //错误
    TMOD = (TMOD & ~0x03) | TIMx->TIM_Mode; //工作模式,0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
    if(TIMx->TIM_ClkSource == TIM_CLOCK_12T) AUXR &= ~0x80; //12T
    if(TIMx->TIM_ClkSource == TIM_CLOCK_1T) AUXR |= 0x80; //1T
    if(TIMx->TIM_ClkSource == TIM_CLOCK_Ext) TMOD |= 0x04; //对外计数或分频
    else TMOD &= ~0x04; //定时
    if(TIMx->TIM_ClkOut == ENABLE) INT_CLKO |= 0x01; //输出时钟
    else INT_CLKO &= ~0x01; //不输出时钟
    TH0 = (u8)(TIMx->TIM_Value >> 8);
    TL0 = (u8)TIMx->TIM_Value;
    if(TIMx->TIM_Run == ENABLE) TR0 = 1; //开始运行
    return 0; //成功
    }

    if(TIM == Timer1)
    {
    TR1 = 0; //停止计数
    if(TIMx->TIM_Interrupt == ENABLE) ET1 = 1; //允许中断
    else ET1 = 0; //禁止中断
    if(TIMx->TIM_Polity == PolityHigh) PT1 = 1; //高优先级中断
    else PT1 = 0; //低优先级中断
    if(TIMx->TIM_Mode >= TIM_16BitAutoReloadNoMask) return 2; //错误
    TMOD = (TMOD & ~0x30) | TIMx->TIM_Mode; //工作模式,0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装
    if(TIMx->TIM_ClkSource == TIM_CLOCK_12T) AUXR &= ~0x40; //12T
    if(TIMx->TIM_ClkSource == TIM_CLOCK_1T) AUXR |= 0x40; //1T
    if(TIMx->TIM_ClkSource == TIM_CLOCK_Ext) TMOD |= 0x40; //对外计数或分频
    else TMOD &= ~0x40; //定时
    if(TIMx->TIM_ClkOut == ENABLE) INT_CLKO |= 0x02; //输出时钟
    else INT_CLKO &= ~0x02; //不输出时钟
    TH1 = (u8)(TIMx->TIM_Value >> 8);
    TL1 = (u8)TIMx->TIM_Value;
    if(TIMx->TIM_Run == ENABLE) TR1 = 1; //开始运行
    return 0; //成功
    }

    if(TIM == Timer2) //Timer2,固定为16位自动重装, 中断无优先级
    {
    AUXR &= ~(1<<4); //停止计数
    if(TIMx->TIM_Interrupt == ENABLE) IE2 |= (1<<2); //允许中断
    else IE2 &= ~(1<<2); //禁止中断
    if(TIMx->TIM_ClkSource > TIM_CLOCK_Ext) return 2;
    if(TIMx->TIM_ClkSource == TIM_CLOCK_12T) AUXR &= ~(1<<2); //12T
    if(TIMx->TIM_ClkSource == TIM_CLOCK_1T) AUXR |= (1<<2); //1T
    if(TIMx->TIM_ClkSource == TIM_CLOCK_Ext) AUXR |= (1<<3); //对外计数或分频
    else AUXR &= ~(1<<3); //定时
    if(TIMx->TIM_ClkOut == ENABLE) INT_CLKO |= 0x04; //输出时钟
    else INT_CLKO &= ~0x04; //不输出时钟
    TH2 = (u8)(TIMx->TIM_Value >> 8);
    TL2 = (u8)TIMx->TIM_Value;
    if(TIMx->TIM_Run == ENABLE) AUXR |= (1<<4); //开始运行
    return 0; //成功
    }
    return 2; //错误
    }
    • 发布于 2016-08-29
    • 举报
    • 评论 0
    • 1
    • 0

其他答案 数量:1
  • 本帖最后由 荣丰宇 于 2016-8-29 23:20 编辑

    这个题目,呵呵出处:
    I51开发板 第六讲:定时器之配置篇_单片机讨论_技术论坛_云汉电子社区
    //www.icxbk.com/community/forum.php?mod=viewthread&tid=65517&extra=page%3D2


    本题的主要思路应该来自“第六讲”,首先是定时器的配置:

    1、确定工作方式,给方式控制寄存器TMOD写入控制字;——16位自动重装

    2、确定是采用1T还是采用12T方式,计算定时器/计数器的初值,并将初值写入寄存器TH和TL;——确定定时时间

    3、根据需要设置中断控制寄存器IE和IE2的初值,决定是否开放定时器中断;——是否启用中断

    4、根据需要设置寄存器INT_CLKO中的T2_CLKO、T1_CLKO和T0_CLKO位,确定是否采用可编程时钟输出;——是否输出时钟


    根据“第五讲”中,寄存器INT_CLKO中的T2_CLKO、T1_CLKO和T0_CLKO位分别用于控制T2、T1和T0的可编程时钟输出,置1允许从P3.0、P3.4和P3.5引脚输出时钟频率,清0禁止输出时钟频率。满足题目的输出管脚要求。另外,从P1.0取反输出时钟,则需要按照“第六讲”在定时器终端函数中计数管口翻转的方式进行。


    5、置1运行控制寄存器TCON和AUXR中的TR0、TR1和TR2位,启动定时器/计数器;


    此外,还有GPIO的初始化配置,定时器T2中断函数里实现我们所需要的功能等。

    • 发布于2016-08-29
    • 举报
    • 评论 0
    • 1
    • 0

相关问题

问题达人换一批

【活动】想要实现如下功能,定时器该怎么配置?.