SAM4E单片机之旅——7、LED闪烁之TC中断
RTT主要用做一个全局的定时器,而且不太通用。现在尝试使用一个更为通用的定时器进行定时:定时计数器(Timer Counter, TC)。
TC提供了广泛的功能,主要可以分为对输入的测量,以及波形的输出。同样,它可以产生一系列的中断。这一次将使TC以一个固定的周期产生中断,以达到定时的目的。
一、 TC配置
1. 在PMC中使能TC时钟。
2. 时钟选择。
TC的每个通道内部都有一个32位的计数器。可以为这个计数器选择一个时钟,使其以固定频率步进。为使LED的闪烁频率较低,需要选择较小的时钟周期。
3. 波形及中断选择。
当TC工作在波形输出模式下时,可以为输出选择若干种波形。在这里,不需要关心具体的波形,而是要关注每个波形模式下,计数器的工作方式,以及产生中断的时机。
选择的波形如下:

在当计数器的值和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;
}
}
}
SAM4E单片机之旅——7、LED闪烁之TC中断的更多相关文章
- SAM4E单片机之旅——3、LED闪烁之定时器中断
让一个LED灯闪烁不过瘾,我们应该让这块开发板完成一点更高难度的任务:比如让两个LED灯闪烁. …… 当然了,以我们的现在使用的空循环技术,还是可以实现这点的.但是这样显得略为低端.所以我们使用一个高 ...
- SAM4E单片机之旅——23、在AS6(GCC)中使用FPU
浮点单元(Floating Point Unit,FPU),是用于处理浮点数运算的单元. 为使用FPU,除了需要启用FPU外,还需要对编译器进行设置,以使其针对浮点运算生成特殊的指令.虽然在Atmel ...
- SAM4E单片机之旅——2、LED闪烁之轮询定时器
之前我们使用空循环,达到了延迟的目的,但是这样子的延迟比较不精确.现在就使用实时定时器(RTT)来进行更为精确的计时.RTT虽然不是特别通用,在某些单片机上可能没有,但它较为简单. RTT内部有一个计 ...
- SAM4E单片机之旅——1、LED闪烁之空循环
最近因为导师要写一本关于SAME4单片机的书籍,而我也作为一个嵌入式的初学者看了这本书.现在也让我写写几个小的程序,做做示例.既然写了文档之类的,就发到博客上来吧. 目前关于这芯片能参考的书籍大概就只 ...
- SAM4E单片机之旅——4、LED闪烁之PWM
两个LED灯虽然可以闪了,但是总是需要CPU的参与.现在尝试使用一种更为自动化的方法:让脉宽调制(PWM)控制器输出具有一定周期和占空比的方波,以此控制LED灯的亮灭. 一.实现思路 依然使用蓝色和琥 ...
- SAM4E单片机之旅——6、LED闪烁之按钮控制
现在试试用按钮控制LED灯……让LED在一个按钮按下时亮起:弹起时灭掉. 主要目的是学习GPIO的输入及中断. 一. 电路 图中的J39-n是几个跳线插座,位置在开发板LCD附近,往下进行前要先确保跳 ...
- SAM4E单片机之旅——5、LED呼吸和PWM
PWM在高频情况下,一个很好的用处就是通过控制占空比来控制输出的功率,比如控制风扇转速.LED灯的亮度等.这次就利用PWM的中断功能,动态改变脉冲的占空比,来实现呼吸灯的效果. 一.实现思路 PWM可 ...
- SAM4E单片机之旅——8、UART初步
通信还是比让LED灯闪烁实用得多的. 这次试试使用UART,实现开发版和PC间的通信.功能比较简单,就是把PC发向开发版的内容发送回去.这次主要介绍一下UART的配置,至于通信,则使用较为简单的不断查 ...
- SAM4E单片机之旅——24、使用DSP库求向量数量积
DSP(Digital Signal Processing,数字信号处理)中会使用大量的数学运算.Cortex-M4中,配置了一些强大的部件,以提高DSP能力.同时CMSIS提供了一个DSP库,提供了 ...
随机推荐
- hdu 2841(容斥原理+状态压缩)
Visible Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- PHP将emoji表情进行过滤
emoji表情是个麻烦的东西,不仅储存的时候需要处理,而且在PC的显示上需要三方的类库来处理.并且它还是经常更新.... 最近开发新项目的时候明确要求某个字段要过滤emoji表情,在网上找了个方法,亲 ...
- HTML5 移动端头部标签
<!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...
- Spring Cloud系列文,Feign整合Ribbon和Hysrix
在本博客之前的Spring Cloud系列里,我们讲述了Feign的基本用法,这里我们将讲述下Feign整合Ribbon实现负载均衡以及整合Hystrix实现断路保护效果的方式. 1 准备Eureka ...
- 客户端负载均衡Ribbon之源码解析
什么是负载均衡器? 假设有一个分布式系统,该系统由在不同计算机上运行的许多服务组成.但是,当用户数量很大时,通常会为服务创建多个副本.每个副本都在另一台计算机上运行.此时,出现 "Load ...
- Xamarin.Forms支持的地图显示类型
Xamarin.Forms支持的地图显示类型 在Xamarin.Forms中,专门提供了一个Map视图,用来显示地图.根据用户的需求不同,该视图支持三种地图显示类型,用户可以通过Map视图提供的M ...
- POJ 3140 Contestants Division (树dp)
题目链接:http://poj.org/problem?id=3140 题意: 给你一棵树,问你删去一条边,形成的两棵子树的节点权值之差最小是多少. 思路: dfs #include <iost ...
- 济南day3
连续几天都有点炸 预计的分拿不到,调整好心态,考试的时候多想一下,think twice,code once 唉,什么情况啊 题解链接 0+0+0 T1读错题输出反了 n*m%2判断是否==1 T2 ...
- 邁向IT專家成功之路的三十則鐵律 鐵律三:IT人長久之道–站對邊
這一回來談談IT人對於技術的學習.對於一位專業的IT人來說,在自己有興趣的技術領域之中,究竟要如何來正確選擇學習的方向呢?關於這個問題的答案,筆者個人深深體會到這確實會成為一位專業IT人士的長久經營之 ...
- win10 配置pylucene
参考文章 http://lxsay.com/archives/269 Windows 10 64 Bit 编译安装 PyLucene 6.2, 6.4 或 6.5 POSTED ON 2017-02- ...