SAM4E单片机之旅——2、LED闪烁之轮询定时器
之前我们使用空循环,达到了延迟的目的,但是这样子的延迟比较不精确。现在就使用实时定时器(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闪烁之轮询定时器的更多相关文章
- SAM4E单片机之旅——3、LED闪烁之定时器中断
让一个LED灯闪烁不过瘾,我们应该让这块开发板完成一点更高难度的任务:比如让两个LED灯闪烁. …… 当然了,以我们的现在使用的空循环技术,还是可以实现这点的.但是这样显得略为低端.所以我们使用一个高 ...
- SAM4E单片机之旅——23、在AS6(GCC)中使用FPU
浮点单元(Floating Point Unit,FPU),是用于处理浮点数运算的单元. 为使用FPU,除了需要启用FPU外,还需要对编译器进行设置,以使其针对浮点运算生成特殊的指令.虽然在Atmel ...
- SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压
很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值).这个时候就可以用到模数转换器(ADC)了.这次的内容是测量开发板搭载的滑动变阻器(VR1)的电压,然后把ADC转 ...
- SAM4E单片机之旅——1、LED闪烁之空循环
最近因为导师要写一本关于SAME4单片机的书籍,而我也作为一个嵌入式的初学者看了这本书.现在也让我写写几个小的程序,做做示例.既然写了文档之类的,就发到博客上来吧. 目前关于这芯片能参考的书籍大概就只 ...
- SAM4E单片机之旅——7、LED闪烁之TC中断
RTT主要用做一个全局的定时器,而且不太通用.现在尝试使用一个更为通用的定时器进行定时:定时计数器(Timer Counter, TC). TC提供了广泛的功能,主要可以分为对输入的测量,以及波形的输 ...
- 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的配置,至于通信,则使用较为简单的不断查 ...
随机推荐
- LOJ#2303. 「NOI2017」蚯蚓排队
$n \leq 200000$的$1 \leq a_i \leq 6$的蚯蚓,有三种操作:让一只队头蚯蚓接在一只队尾蚯蚓后面:让一队蚯蚓从某个蚯蚓后面断成两队:问:给个字符串,问他的..算了你们直接看 ...
- 标准C程序设计七---70
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- BQ25890 charging ic evb 使用注意事項
Origin : 今天做了一個小實驗, 從 bq25890 spec 可以知道, enable bq25896 充電的功能,有二個條件, 1.CHG_CONFIG bit 需為1. 2.ce pin ...
- locust性能测试安装
Locust简介 Locust是一款易于使用的分布式用户负载测试工具.它用于对网站(或其他系统)进行负载测试,并确定系统可以处理多少并发用户.这个想法是,在测试期间,一群蝗虫(Locust)会攻击你的 ...
- CI安全
URI安全,CodeIgniter 严格限制 URI 中所能包含的字符,以此帮助你设计的程序减少被恶意数据入侵的可能.URI 一般只包含下列内容: 字母和数字(Alpha-numeric text) ...
- C#实现键盘钩子
前言: 因为项目中需要使用到快捷键,所以上网找资料了解关于快捷键的实现技术,于是有了键盘钩子的使用学习.在网上了解到,键盘钩子其实只是很多种钩子中的其中一种.所谓钩子:请看下面关于钩子的描述(来自百度 ...
- hdu 5443(线段树水)
The Water Problem Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- LeetCode OJ--Binary Tree Level Order Traversal II
http://oj.leetcode.com/problems/binary-tree-level-order-traversal-ii/ 树的层序遍历,和上一道题相比,对结果做一个顺序调整 reve ...
- UICollectionView的cell创建直接从第三个数据开始问题
实现的效果是这样 大概意思就是第一组没有数据就直接将改组的cell高度变成0效果实现了,但是第二组数据创建cell就出问题了--奇葩问题 * 代码问题在这```-(CGSize)collectionV ...
- 「NOI2014」动物园
link : https://loj.ac/problem/2246 水水KMP #include<bits/stdc++.h> #define ll long long #define ...