[DemoCode下载] 定时器翻转输出模式

[复制链接]
1490|18
 楼主| dongnanxibei 发表于 2017-5-6 13:30 | 显示全部楼层 |阅读模式


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

  13. void SYS_Init(void)
  14. {

  15.     /*---------------------------------------------------------------------------------------------------------*/
  16.     /* Init System Clock                                                                                       */
  17.     /*---------------------------------------------------------------------------------------------------------*/
  18.     /* Unlock protected registers */
  19.     SYS_UnlockReg();

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

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

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

  26.     /* Enable IP clock */
  27.     CLK_EnableModuleClock(UART0_MODULE);
  28.     CLK_EnableModuleClock(TMR0_MODULE);


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

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


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

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

  44.     /* Lock protected registers */
  45.     SYS_LockReg();

  46. }



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

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

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

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

  62.     while(1);
  63. }

  64. /*** (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 | 显示全部楼层
这个貌似还不是中断嗯,应该是定时器特有的一种功能。
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也可以这么晚
wahahaheihei 发表于 2017-5-7 16:16 | 显示全部楼层
  *                 - \ref TIMER_ONESHOT_MODE
  *                 - \ref TIMER_PERIODIC_MODE
  *                 - \ref TIMER_TOGGLE_MODE
  *                 - \ref TIMER_CONTINUOUS_MODE
通常有这些模式的。
yiy 发表于 2017-5-7 23:28 | 显示全部楼层
定时器控制器提供四种定时器计数模式: one-shot, periodic, toggle-output 和 continuous counting 计数模式。
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。
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。
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])的设置。
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 模式
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管脚的输入事件。
yiy 发表于 2017-5-7 23:37 | 显示全部楼层
外部捕捉功能
输入捕捉或复位功能是用来捕捉或复位计数器的值。捕捉功能通过CAPSEL (TIMERx_EXTCTL[8])寄存
器,可配置为free-counting和trigger-counting捕捉模式。free-counting捕捉模式,复位模式, trigger-counting
捕捉模式详细描述如下。
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寄
存器的值不变,会丢掉新的捕捉值。
yiy 发表于 2017-5-7 23:38 | 显示全部楼层
外部复位计数模式
当检测到TMx_EXT (x= 0~1)有边沿转变时,定时器同样提供事件复位计数器功能来复位CNT(TIMERx_CNT[23:0])的值。在该模式,大部分设置与事件捕捉功能相同,除了CAPFUNCS(TIMERx_EXTCTL[4])位必须设置为1来选择TMx_EXT转变时用作为事件复位计数器。
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功能。
yiy 发表于 2017-5-7 23:40 | 显示全部楼层
ACMP启动捕捉触发
外部捕捉功能可以被 ACMP0或ACMP1输出信号触发。用户可以设置ACMPSSEL (TIMERx_EXTCTL[9])
来决定哪个ACMP 输出信号作为TMx_EXT (x= 0~1) 管脚的捕捉源. 具体的捕捉功能设置与之前外部捕捉模
式是一样的。
gejigeji521 发表于 2017-5-8 13:35 | 显示全部楼层
这个模式可以用于产生一个指定的外部驱动方波。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

225

主题

3848

帖子

18

粉丝
快速回复 在线客服 返回列表 返回顶部