• SAM4E单片机之旅——7、LED闪烁之TC中断


    RTT主要用做一个全局的定时器,而且不太通用。现在尝试使用一个更为通用的定时器进行定时:定时计数器(Timer Counter, TC)。

    TC提供了广泛的功能,主要可以分为对输入的测量,以及波形的输出。同样,它可以产生一系列的中断。这一次将使TC以一个固定的周期产生中断,以达到定时的目的。

    一、 TC配置

    1. 在PMC中使能TC时钟。

    2. 时钟选择

        TC的每个通道内部都有一个32位的计数器。可以为这个计数器选择一个时钟,使其以固定频率步进。为使LED的闪烁频率较低,需要选择较小的时钟周期。

    3. 波形及中断选择

        当TC工作在波形输出模式下时,可以为输出选择若干种波形。在这里,不需要关心具体的波形,而是要关注每个波形模式下,计数器的工作方式,以及产生中断的时机。

        选择的波形如下:

    clip_image002

        在当计数器的值和RC寄存器里的值相等时,会产生一个触发,使计数器重置,并重新开始计数。

        在输出模式下,可以选择在计数器的值在与RA、RB、和(或)RC相等时,产生中断。这里选择与RC值相同时中断。

    4. 使能通道。

        首先需要使能(enable)通道时钟,并且需要启动(start)这个时钟。可以通过访问TC_CCR寄存器使能时钟,同时可以产生一个软触发,以启动时钟。

    5. NVIC中使能中断。

        该部分相关代码如下,使用的通道是TC0的通道0,计时器频率为MCK/128,RC值为31250,即每一秒产生一次中断。

    #define gUseTc TC0->TC_CHANNEL[0]
    void ConfigTC(void)
    {
    	PMC->PMC_PCER0 = (1 << ID_TC0);
    
    	gUseTc.TC_CMR = 
    			TC_CMR_WAVE						/* 波形模式 */
    			| TC_CMR_TCCLKS_TIMER_CLOCK4	/* 时钟4: MCK/128 */
    			| TC_CMR_WAVSEL_UP_RC;			/* 波形,仅上升,且RC比较时自动触发 */
    			;
    
    	/* 设置 RC */
    	gUseTc.TC_RC = TC_RC_RC(31250);
    	/* RC 比较时产生中断 */	
    	gUseTc.TC_IER = TC_IER_CPCS;
    	
    	/* 使能TC时钟 */
    	gUseTc.TC_CCR = TC_CCR_CLKEN | TC_CCR_SWTRG;
    	
    	/* NVIC */
    	NVIC_DisableIRQ(TC0_IRQn);
    	NVIC_ClearPendingIRQ(TC0_IRQn);
    	NVIC_SetPriority(TC0_IRQn, 1);
    	NVIC_EnableIRQ(TC0_IRQn);
    }
     

    二、 TC中断服务函数

    仅需改变LED引脚的电平即可。

    void TC0_Handler(void)
    {
    	uint32_t status = gUseTc.TC_SR;
    
    	/* 判断中断是否为RC比较触发的 */
    	if (status & TC_SR_CPCS)
    	{
    		if ((LED_PIOC->PIO_ODSR & LED_PIO))
    		{
    			LED_PIOC->PIO_CODR = LED_PIO;
    		}
    		else
    		{
    			LED_PIOC->PIO_SODR = LED_PIO;
    		}
    	}
    }
  • 相关阅读:
    php 字符串
    iOS copy&mutableCopy理解
    Swift学习(二)
    Swift 学习一函数&函数属性&懒加载
    LICEcap GIF 屏幕录制工具
    UIApplication介绍
    进度条渐变色
    -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    DedeCms 5.7友情链接模块注入漏洞
    phpcms v9会员中心文件上传漏洞
  • 原文地址:https://www.cnblogs.com/h46incon/p/3416755.html
Copyright © 2020-2023  润新知