打印
[DemoCode下载]

定时器翻转输出模式

[复制链接]
1304|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongnanxibei|  楼主 | 2017-5-6 13:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


/******************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
* $Revision: 1 $
* $Date: 14/09/15 2:23p $
* [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate the timer 0 toggle out function on pin PB.8
*
* @note
* Copyright (C) 2013-2014 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include "Nano100Series.h"

void SYS_Init(void)
{

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Enable External XTAL (4~24 MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HXT_EN_Msk);

    /* Waiting for 12MHz clock ready */
    CLK_WaitClockReady( CLK_CLKSTATUS_HXT_STB_Msk);

    /* Switch HCLK clock source to HXT */
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HXT,CLK_HCLK_CLK_DIVIDER(1));

    /* Enable IP clock */
    CLK_EnableModuleClock(UART0_MODULE);
    CLK_EnableModuleClock(TMR0_MODULE);


    /* Select IP clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_UART_CLK_DIVIDER(1));
    CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0_S_HXT, 0);

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
    SystemCoreClockUpdate();


    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Set GPB multi-function pins for UART0 RXD and TXD */
    SYS->PB_L_MFP &= ~(SYS_PB_L_MFP_PB0_MFP_Msk | SYS_PB_L_MFP_PB1_MFP_Msk);
    SYS->PB_L_MFP |= (SYS_PB_L_MFP_PB1_MFP_UART0_TX | SYS_PB_L_MFP_PB0_MFP_UART0_RX);

    /* Set Timer0 event counting/toggle out pin */
    SYS->PB_H_MFP &= ~SYS_PB_H_MFP_PB8_MFP_Msk;
    SYS->PB_H_MFP |= SYS_PB_H_MFP_PB8_MFP_TMR0_EXT;

    /* Lock protected registers */
    SYS_LockReg();

}



int main(void)
{
    /* Init System, IP clock and multi-function I/O
       In the end of SYS_Init() will issue SYS_LockReg()
       to lock protected register. If user want to write
       protected register, please issue SYS_UnlockReg()
       to unlock protected register if necessary */
    SYS_Init();

    /* Init UART to 115200-8n1 for print message */
    UART_Open(UART0, 115200);

    printf("\nThis sample code use timer 0 to generate 500Hz toggle output to TM0_CNT_OUT(PB.8) pin\n");

    /* To generate 500HZ toggle output, timer frequency must set to 1000Hz.
       Because toggle output state change on every timer timeout event */
    TIMER_Open(TIMER0, TIMER_TOGGLE_MODE, 1000);
    TIMER_Start(TIMER0);

    while(1);
}

/*** (C) COPYRIGHT 2014 Nuvoton Technology Corp. ***/



沙发
dongnanxibei|  楼主 | 2017-5-6 13:33 | 只看该作者
    /* To generate 500HZ toggle output, timer frequency must set to 1000Hz.
       Because toggle output state change on every timer timeout event */
    TIMER_Open(TIMER0, TIMER_TOGGLE_MODE, 1000);
    TIMER_Start(TIMER0);
这个其实很好解释,就是周期是500HZ,那么定时的周期就是1000.

使用特权

评论回复
板凳
yiyigirl2014| | 2017-5-6 22:36 | 只看该作者
当然了,每次中断更改一次输出极性,因此两个中断组成一个周期(一个高电平,一个低电平)

使用特权

评论回复
地板
稳稳の幸福| | 2017-5-6 23:35 | 只看该作者
这个貌似还不是中断嗯,应该是定时器特有的一种功能。

使用特权

评论回复
5
wahahaheihei| | 2017-5-7 16:06 | 只看该作者

    /* To generate 1000HZ toggle output, timer frequency must set to 2000Hz.
       Because toggle output state change on every timer timeout event */
    TIMER_Open(TIMER0, TIMER_TOGGLE_MODE, 2000);
mini58也可以这么晚

使用特权

评论回复
6
wahahaheihei| | 2017-5-7 16:16 | 只看该作者
  *                 - \ref TIMER_ONESHOT_MODE
  *                 - \ref TIMER_PERIODIC_MODE
  *                 - \ref TIMER_TOGGLE_MODE
  *                 - \ref TIMER_CONTINUOUS_MODE
通常有这些模式的。

使用特权

评论回复
7
yiy| | 2017-5-7 23:28 | 只看该作者
定时器控制器提供四种定时器计数模式: one-shot, periodic, toggle-output 和 continuous counting 计数模式。

使用特权

评论回复
8
yiy| | 2017-5-7 23:28 | 只看该作者
One–shot模式
如果定时器工作在单周期 (one-shot) 模式(TIMERx_CTL[28:27] 为 2’b00) 且 CNTEN (TIMERx_CTL[30])置
1),则定时器的计数器开始计数。一旦CNT (TIMERx_CNT[23:0])达到CMPDAT (TIMERx_CMP[23:0])的值
时,TIF (TIMERx_INTSTS[0])标志将变为1,CNT的值和 CNTEN位将由定时器控制器自动清零,然后定时
器计数操作停止。与此同时,如果INTEN (TIMERx_CTL[29])位使能,则定时器中断信号产生并送到 NVIC
通知CPU。

使用特权

评论回复
9
yiy| | 2017-5-7 23:30 | 只看该作者
Periodic 模式
如果定时器工作在周期 (periodic) 模式((TIMERx_CTL[28:27] 为 2’b01) 且 CNTEN (TIMERx_CTL[30])置
1),则定时器的计数器开始向上计数。一旦CNT (TIMERx_CNT[23:0])计数器的值达到CMPDAT
(TIMERx_CMP[23:0])的值时,TIF (TIMERx_INTSTS[0])标志将变为1,CNT的值将由定时器控制器自动清
零,然后定时器重新计数。与此同时,如果INTEN (TIMERx_CTL[29])使能,则定时器中断信号产生并送到
NVIC 通知 CPU 。在该模式,定时器控制器周期性地操作计数和 与CMPDAT的值比较,直到CNTEN位由
用户软件清0。

使用特权

评论回复
10
yiy| | 2017-5-7 23:31 | 只看该作者
Toggle-output 模式
如果定时器工作在触发输出 (toggle-out) 模式(TIMERx_CTL[28:27] 为 2’b10) ,且CNTEN
(TIMERx_CTL[30]) 位置1,则定时器的计数器开始计数。toggle-out 模式的计数操作大部分与周期模式是
一样的,除了该模式当TIF (TIMERx_INTSTS[0])被置位时,有相关的TM® 0 ~ TM® 1管脚会输出信号。因
此,管脚TM® 0 ~ TM® 1上的触发输出信号以 50% 的占空周期反复改变。输出管脚可以是TM® 0 ~ TM® 1
或TM® 0_EXT ~ TM® 1_EXT,这取决于TGLPINSEL (TIMERx_CTL[18])的设置。

使用特权

评论回复
11
yiy| | 2017-5-7 23:33 | 只看该作者
Continuous Counting 模式
如果定时器工作在连续计数 (continuous counting) 模式(TIMERx_CTL[28:27] 为 2’b11) ,且CNTEN
(TIMERx_CTL[30]) 位置1,则定时器的计数器开始计数。一旦CNT(TIMERx_CNT[23:0])的值达到
CMPDAT (TIMERx_CMP[23:0])的值时,TIF(TIMERx_INTSTS[0])标志将变为1,但CNT的值继续保持向上
计数。与此同时,如果INTEN (TIMERx_CTL[29])使能,则定时器中断信号产生并送到 NVIC 通知 CPU 。
在该模式,用户可以立刻改变不同的CMPDAT值,而不需要停止定时器计数和重新开始定时器计数。
例如,CMPDAT的值设置为 80。当CNT 达到 80时,TIF标志将被置1,定时器计数器继续计数,而且CNT
的值将不回到0,而是继续计数,81, 82, 83,˙˙˙ 到 (224
-1),然后再一次 0, 1, 2, 3, ˙˙˙ 到 2
24
-1,如此往复。
接下来,如果软件改变CMPDAT的值为200并且清除TIF标志位,当CNT的值达到200时,TIF标志将再次变
为1,。最后,软件改变CMPDAT的值为500并且清除TIF标志,当CNT的值达到500时,TIF标志将再次变为
1。这种模式就是定时器Continuous Counting 模式

使用特权

评论回复
12
yiy| | 2017-5-7 23:34 | 只看该作者
事件计数模式
定时器控制器也提供这样的应用,能对来自管脚TMx (x= 0~1)输入事件计数并将事件的次数反应到CNT
(TIMERx_CNT[23:0])的值。也可以称为事件计数功能。该功能下,EXTCNTEN (TIMERx_CTL[24])位需置
位并且定时器外设时钟源必须设为 HCLK。
软件可以通过CNTDBEN (TIMERx_EXTCTL[7])位来使能或关闭TMx管脚消抖电路。如果TMx管脚的消抖
电路关闭,输入事件频率必须少于1/3 HCLK,如果消抖电路打开,输入事件的频率须小于1/8 HCLK,以保
证CNT的值是正确的。软件也可以通过设置CNTPHASE (TIMERx_EXTCTL[0])来选择边沿检测TMx管脚的
相位。
事件计数模式下,定时器计数操作模式可以设置为one-shot, periodic 和 continuous counting模式,通过
CNT (TIMERx_CNT[23:0])寄存器来计算来自TMx管脚的输入事件。

使用特权

评论回复
13
yiy| | 2017-5-7 23:37 | 只看该作者
外部捕捉功能
输入捕捉或复位功能是用来捕捉或复位计数器的值。捕捉功能通过CAPSEL (TIMERx_EXTCTL[8])寄存
器,可配置为free-counting和trigger-counting捕捉模式。free-counting捕捉模式,复位模式, trigger-counting
捕捉模式详细描述如下。

使用特权

评论回复
14
yiy| | 2017-5-7 23:37 | 只看该作者
Free-Counting 捕捉模式
事件捕捉功能是当检测到TMx_EXT管脚(x= 0~1)边沿电平有变化时,CNT (TIMERx_CNT[23:0])会送到
CAPDAT (TIMERx_CAP[23:0])。在该模式下,需把CAPSEL (TIMERx_EXTCTL[8])和CAPFUNCS
(TIMERx_EXTCTL[4])位设置为0,用来选择TMx_EXT变化时用作事件捕捉功能,而且定时器外设时钟源
必须设为HCLK。
软件可以通过CAPDBEN (TIMERx_EXTCTL[6])位来使能或关闭TMx_EXT管脚消抖电路。在TMx_EXT的
消抖电路关闭时,TMx_EXT管脚的转变频率必须少于1/3 HCLK,在TMx_EXT的消抖电路打开时,
TMx_EXT管脚的转变频率必须少于1/8 HCLK,以保证捕捉功能能够正常工作。软件也可以通过设置
CAPEDGE (TIMERx_EXTCTL[2:1])位来选择TMx_EXT管脚的边沿转变检测方式。
在事件捕捉模式,用户不用考虑定时器计数器工作模式的选择,只有当检测到TMx_EXT管脚有边沿变化时
捕捉事件才会发生。
如果CPU不清除CAPIF (TIMERx_EINTSTS[0])状态标志,用户应知道此时的定时器会保持TIMERx_CAP寄
存器的值不变,会丢掉新的捕捉值。

使用特权

评论回复
15
yiy| | 2017-5-7 23:38 | 只看该作者
外部复位计数模式
当检测到TMx_EXT (x= 0~1)有边沿转变时,定时器同样提供事件复位计数器功能来复位CNT(TIMERx_CNT[23:0])的值。在该模式,大部分设置与事件捕捉功能相同,除了CAPFUNCS(TIMERx_EXTCTL[4])位必须设置为1来选择TMx_EXT转变时用作为事件复位计数器。

使用特权

评论回复
16
yiy| | 2017-5-7 23:40 | 只看该作者
Trigger-Counting 捕捉模式
如果CAPSEL (TIMERx_EXTCTL[8])位和CAPEN (TIMERx_EXTCTL[3])被置1,CAPFUNCS
(TIMERx_EXTCTL[4])被清0,CNT将会被清零,然后当TMx_EXT (x= 0~1)管脚触发条件产生时捕捉到数
据放入CAPDAT寄存器。TMx_EXT触发边沿可以通过CAPEDGE (TIMERx_EXTCTL[2:1])位来设置。具体
的操作办法请参考表 6.6-1.当TMx_EXT管脚触发产生后,CAPIF (TIMERx_EINTSTS[0])被置1,内部产生
一个信号被发送到NVIC 来告知CPU CAPIEN (TIMERx_EXTCTL[5])是否被置1. 在TMx_EXT的消抖电路关
闭时,TMx_EXT管脚的转变频率必须少于1/3 HCLK,在TMx_EXT的消抖电路打开时,TMx_EXT管脚的转
变频率必须少于1/8 HCLK,以保证捕捉功能能够正常工作。通过设置CAPDBEN (TIMERx_EXTCTL[6])可
以使能或禁止TMx_EXT管脚的捕捉de-bounce功能。

使用特权

评论回复
17
yiy| | 2017-5-7 23:40 | 只看该作者
ACMP启动捕捉触发
外部捕捉功能可以被 ACMP0或ACMP1输出信号触发。用户可以设置ACMPSSEL (TIMERx_EXTCTL[9])
来决定哪个ACMP 输出信号作为TMx_EXT (x= 0~1) 管脚的捕捉源. 具体的捕捉功能设置与之前外部捕捉模
式是一样的。

使用特权

评论回复
18
gejigeji521| | 2017-5-8 13:35 | 只看该作者
这个模式可以用于产生一个指定的外部驱动方波。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

207

主题

3619

帖子

16

粉丝