之前我们使用空循环,达到了延迟的目的,但是这样子的延迟比较不精确。现在就使用实时定时器(RTT)来进行更为精确的计时。RTT虽然不是特别通用,在某些单片机上可能没有,但它较为简单。

RTT内部有一个计数器,并且可以配置这个计数器的时钟。通过配置以及计算,就可以得出经过一段时间后,该计数器的增加值。和之前一样,我们使用空循环来完成延迟,只是延迟退出的条件变为“计数器增加了一个特定的值”。

一、 RTT配置

为实现这个功能,需要配置的主要就是分频数了。RTT的时钟可以选择对慢时钟(SCLK,32.768 kHz)分频,或直接使用1 Hz的RTC时钟。为使LED能进行较为快速的闪烁,在这里就不能使用1 Hz的时钟了。RTT_MR的低十六位表示分频数,其他位使用复位值就可以了:

#define PRESCALE (1u<<10)
RTT->RTT_MR = RTT_MR_RTPRES(PRESCALE);

二、 读取RTT计数器值

通过直接读取RTT_VR就可以得到这个值了。需要注意的时,这个值可能会被主时钟异步地更新,所以可以连续读取两次该值以增加准确性:

uint32_t ReadRTT_CRTV(void)
{
uint32_t v1;
uint32_t v2;
while(1)
{
v1 = (RTT->RTT_VR) & RTT_VR_CRTV_Msk;
v2 = (RTT->RTT_VR) & RTT_VR_CRTV_Msk;
   /* 通过连续读取两次RTT_VR的值以增加准备性 */
if (v1 == v2)
{
return v1;
}
}
}

三、 更为精确的延时

延迟开始时,读取一次RTT计数器的值,再计算出延迟结束时计数器的值,接下来的工作就等待计数器更新到这个值了。

现在可以把之前实现Delay函数进行修改了:

void Delay(unsigned int ms)
{
uint32_t begin_rttv = ReadRTT_CRTV(); /* 计数器加一的频率 */
const uint32_t freq = CHIP_FREQ_SLCK_RC / PRESCALE; /* CHIP_FREQ_SLCK_RC 在CMSIS有定义,表示SLCK的频率 */
/* 计算延迟后,计数器需要增加的值
need_inc = ms /1000 / (1/freq) */
uint32_t need_inc = ms * freq / 1000;
uint32_t end_rttv = begin_rttv + need_inc; /* 等待*/
while(ReadRTT_CRTV() < end_rttv)
;
}

SAM4E单片机之旅——2、LED闪烁之轮询定时器的更多相关文章

  1. SAM4E单片机之旅——3、LED闪烁之定时器中断

    让一个LED灯闪烁不过瘾,我们应该让这块开发板完成一点更高难度的任务:比如让两个LED灯闪烁. …… 当然了,以我们的现在使用的空循环技术,还是可以实现这点的.但是这样显得略为低端.所以我们使用一个高 ...

  2. SAM4E单片机之旅——23、在AS6(GCC)中使用FPU

    浮点单元(Floating Point Unit,FPU),是用于处理浮点数运算的单元. 为使用FPU,除了需要启用FPU外,还需要对编译器进行设置,以使其针对浮点运算生成特殊的指令.虽然在Atmel ...

  3. SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压

    很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值).这个时候就可以用到模数转换器(ADC)了.这次的内容是测量开发板搭载的滑动变阻器(VR1)的电压,然后把ADC转 ...

  4. SAM4E单片机之旅——1、LED闪烁之空循环

    最近因为导师要写一本关于SAME4单片机的书籍,而我也作为一个嵌入式的初学者看了这本书.现在也让我写写几个小的程序,做做示例.既然写了文档之类的,就发到博客上来吧. 目前关于这芯片能参考的书籍大概就只 ...

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

    RTT主要用做一个全局的定时器,而且不太通用.现在尝试使用一个更为通用的定时器进行定时:定时计数器(Timer Counter, TC). TC提供了广泛的功能,主要可以分为对输入的测量,以及波形的输 ...

  6. SAM4E单片机之旅——4、LED闪烁之PWM

    两个LED灯虽然可以闪了,但是总是需要CPU的参与.现在尝试使用一种更为自动化的方法:让脉宽调制(PWM)控制器输出具有一定周期和占空比的方波,以此控制LED灯的亮灭. 一.实现思路 依然使用蓝色和琥 ...

  7. SAM4E单片机之旅——6、LED闪烁之按钮控制

    现在试试用按钮控制LED灯……让LED在一个按钮按下时亮起:弹起时灭掉. 主要目的是学习GPIO的输入及中断. 一. 电路 图中的J39-n是几个跳线插座,位置在开发板LCD附近,往下进行前要先确保跳 ...

  8. SAM4E单片机之旅——5、LED呼吸和PWM

    PWM在高频情况下,一个很好的用处就是通过控制占空比来控制输出的功率,比如控制风扇转速.LED灯的亮度等.这次就利用PWM的中断功能,动态改变脉冲的占空比,来实现呼吸灯的效果. 一.实现思路 PWM可 ...

  9. SAM4E单片机之旅——8、UART初步

    通信还是比让LED灯闪烁实用得多的. 这次试试使用UART,实现开发版和PC间的通信.功能比较简单,就是把PC发向开发版的内容发送回去.这次主要介绍一下UART的配置,至于通信,则使用较为简单的不断查 ...

随机推荐

  1. LOJ#2303. 「NOI2017」蚯蚓排队

    $n \leq 200000$的$1 \leq a_i \leq 6$的蚯蚓,有三种操作:让一只队头蚯蚓接在一只队尾蚯蚓后面:让一队蚯蚓从某个蚯蚓后面断成两队:问:给个字符串,问他的..算了你们直接看 ...

  2. 标准C程序设计七---70

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  3. BQ25890 charging ic evb 使用注意事項

    Origin : 今天做了一個小實驗, 從 bq25890 spec 可以知道, enable bq25896 充電的功能,有二個條件, 1.CHG_CONFIG bit 需為1. 2.ce pin ...

  4. locust性能测试安装

    Locust简介 Locust是一款易于使用的分布式用户负载测试工具.它用于对网站(或其他系统)进行负载测试,并确定系统可以处理多少并发用户.这个想法是,在测试期间,一群蝗虫(Locust)会攻击你的 ...

  5. CI安全

    URI安全,CodeIgniter 严格限制 URI 中所能包含的字符,以此帮助你设计的程序减少被恶意数据入侵的可能.URI 一般只包含下列内容: 字母和数字(Alpha-numeric text) ...

  6. C#实现键盘钩子

    前言: 因为项目中需要使用到快捷键,所以上网找资料了解关于快捷键的实现技术,于是有了键盘钩子的使用学习.在网上了解到,键盘钩子其实只是很多种钩子中的其中一种.所谓钩子:请看下面关于钩子的描述(来自百度 ...

  7. hdu 5443(线段树水)

    The Water Problem Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  8. LeetCode OJ--Binary Tree Level Order Traversal II

    http://oj.leetcode.com/problems/binary-tree-level-order-traversal-ii/ 树的层序遍历,和上一道题相比,对结果做一个顺序调整 reve ...

  9. UICollectionView的cell创建直接从第三个数据开始问题

    实现的效果是这样 大概意思就是第一组没有数据就直接将改组的cell高度变成0效果实现了,但是第二组数据创建cell就出问题了--奇葩问题 * 代码问题在这```-(CGSize)collectionV ...

  10. 「NOI2014」动物园

    link : https://loj.ac/problem/2246 水水KMP #include<bits/stdc++.h> #define ll long long #define ...