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的配置,至于通信,则使用较为简单的不断查 ...
随机推荐
- POJ 3468:A Simple Problem with Integers(线段树[成段更新])
题意:N个数Q次操作.一共两种操作:Q l r :询问[l,r]这个区间里的数字和,C l r c: [l,r]区间里的每个数都加上c.1 ≤ N,Q ≤ 100000. 方法:线段树的成段更新.注意 ...
- EXT.JS以下两种写法在初始载入时是一样的效果
/* Ext.application({ name: 'MyfirstApplication', launch: function () { Ext.Msg.alert("Hello&quo ...
- 完美解决xhost +报错: unable to open display ""
https://blog.csdn.net/wojiuguowei/article/details/79201845
- AC日记——软件包管理器 洛谷 P2416
题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...
- 关于Java的TreeMap
今天写代码的时候需要做这样的一件事情 从一个文件中读取数据,得到数百万个含有time,uid,text的对象,去重之后再根据time排序 第一反应是使用TreeMap 重载了equals和hashCo ...
- Codeforces 23E Tree(树型DP)
题目链接 Tree $dp[x][i]$表示以x为根的子树中x所属的连通快大小为i的时候 答案最大值 用$dp[x][j]$ * $dp[y][k]$ 来更新$dp[x][j + k]$. (听高手说 ...
- hadoop之hdfs------------------FileSystem及其源码分析
FileSystem及其源码分析 FileSystem这个抽象类提供了丰富的方法用于对文件系统的操作,包括上传.下载.删除.创建等.这里多说的文件系统通常指的是HDFS(DistributedFile ...
- jquery 全选获取值
首选区分一下prop与attr的差别.prop是固有属性,attr自定义属性. $("#all").click(function () {//全选.反选 if(this.check ...
- vs code theme Seti monokai
http://www.jianshu.com/p/80e983201f86 Seti-UI主题是一款极具传奇色彩的主题
- CheckedListBoxControl 或CheckedListBox 控件中显示水平滚动条 z
public partial class Form1 : Form { public Form1() { InitializeComponent(); DisplayHScroll(); } /// ...