注册
登录
电子工程世界-论坛
返回首页
EEWORLD首页
频道
EE大学堂
下载中心
Datasheet
专题
单片机
物联网
汽车电子
嵌入式
手机/便携
模拟电子
家用电子
网络通信
电源管理
工业控制
测试测量
半导体设计/制造
安防电子
传感器
医疗电子
梭罗瓦尔登的个人空间
https://home.eeworld.com.cn/space-uid-595066.html
[收藏]
[复制]
[分享]
[RSS]
空间首页
动态
记录
日志
相册
主题
分享
留言板
个人资料
借用开发板
论坛
淘帖
Collection
查看新帖
最新回复
社区活动
联系管理员
我的空间
帖子
日志
收藏
好友
勋章
积分
安全验证
请完成以下验证码
日志
SAM4E -实时时钟定时RTT
已有 948 次阅读
2015-1-24 21:27
实时时钟定时器是一个围绕在32位计数器旁的一个用来计数被32khz慢时钟源驱动的可编程的16位预分频器翻滚事件的计数器.因此利用一个校验过的1HZ的时钟,RTT也可以被配置成直接由1HZRTC信号驱动.当仅仅需要一个秒计数器时慢时钟可以被完全关闭以节省功耗。
RTT是ATMEL的芯片特有的功能这在st上好像没有见过,而且RTT使用起来也比较简单,下面就让我来给大家介绍一下RTT的使用。
千言万语尽在BLOCK那张图上,首先先看看那张图
/*
* rtt_int.c
*
* Created: 2015/1/22 20:03:21
* Author: ThinkPad
*/
#include "sam.h"
#define LED1_GPIO PIO_PD22
#define LED1_OFF_MS (300)
#define LED1_ON_MS (300)
#define PRESCALE (1u<<10)
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;
}
}
}
uint32_t CalcRTTNeedInc(unsigned int ms)
{
/* 计数器加一的频率 */
const uint32_t freq = CHIP_FREQ_SLCK_RC / PRESCALE;
/* 计算延迟后,计数器需要增加的值
* need_inc = ms /1000 / (1/freq) */
return (ms * freq / 1000); //1s钟跑freq,1ms就跑freq/1000,所以ms毫秒,就是ms*freq/1000//
}
void Delay(unsigned int ms)
{
uint32_t begin_rttv = ReadRTT_CRTV();
uint32_t need_inc = CalcRTTNeedInc(ms);
uint32_t end_rttv = begin_rttv + need_inc;
/* 等待*/
while(ReadRTT_CRTV() < end_rttv)
;
}
/* RTT 中断处理函数
* 在这里主要就进行LED1引脚电平的切换了
*/
void RTT_Handler(void)
{
/* 通过读取状态寄存器清除Alarm */
uint32_t read_clear = RTT->RTT_SR;
uint32_t begin_rttv = ReadRTT_CRTV();
uint32_t int_gap_ms ;
uint32_t need_inc;
if ((PIOD->PIO_ODSR & LED1_GPIO) == 0)
{
/* 现在引脚电平为低,LED是亮的 */
/* 灭灯 */
PIOD->PIO_SODR = LED1_GPIO;
/* 设置下次中断唤醒间隔的时间 */
int_gap_ms = LED1_OFF_MS;
}
else
{
/* 现在引脚电平为高,LED是灭的 */
/* 亮灯 */
PIOD->PIO_CODR = LED1_GPIO;
/* 设置下次中断唤醒间隔的时间 */
int_gap_ms = LED1_ON_MS;
}
/* 计算并设置下一次中断的条件 */
need_inc = CalcRTTNeedInc(int_gap_ms);
RTT->RTT_AR = RTT_AR_ALMV(begin_rttv + need_inc - 1);
return;
}
int main(void)
{
/* 必须要开PIOA的外围时钟*/
// PMC->PMC_PCER0 = (1 << ID_PIOA);
/* 关闭看门狗 */
WDT->WDT_MR = WDT_MR_WDDIS;
/* 初始化PIO */
/* 让PIO控制器直接控制引脚 */
PIOD->PIO_PER = LED1_GPIO;
/* 引脚输出使能 */
PIOD->PIO_OER = LED1_GPIO;
/* 引脚输出写使能 */
// PIOA->PIO_OWER = LED0_GPIO;
// PIOD->PIO_OWER = LED1_GPIO;
// NVIC_SetPriorityGrouping(0);//也可以不设置默认是0
/* 初始化 RTT */
/* 启用中断 */
NVIC_ClearPendingIRQ(RTT_IRQn);
RTT->RTT_MR = RTT_MR_RTPRES(PRESCALE)
| RTT_MR_RTTRST
| RTT_MR_ALMIEN //设置预分频器 重启定时器 开alarm中断
;
/* 计算第一次中断的时间
* 现在灯是亮的,第一次中断即在需要灯灭时
*/
NVIC_SetPriority(RTT_IRQn,0);//设置rtt的中断优先级
NVIC_EnableIRQ(RTT_IRQn); //使能RTT中断
RTT->RTT_AR = RTT_AR_ALMV(ReadRTT_CRTV() + CalcRTTNeedInc(LED1_ON_MS) -1); //设置和CRTV比较的那个值
while (1) {
}
return 0;
}
复制代码
本文来自论坛,点击查看完整帖子内容。
收藏
邀请
举报
全部
作者的其他最新日志
•
关于utf-8 with BOM
评论 (
0
个评论)
涂鸦板
您需要登录后才可以评论
登录
|
注册
评论
梭罗瓦尔登
加为好友
给我留言
打个招呼
发送消息
热门文章
头条资讯
粤港澳大湾区落地首家技术VC,创新工场25亿加持,做投资也做AI研发
赋能计算无处不在 | 存储行业的新变革:数智存储与计算创新
谁在招人?(2021年3月) 免费的Linuxer招聘服务,持续更新...
服了!你想找的电子元器件实物图都在这里!
Zircon - Fuchsia 内核分析 - 启动(平台初始化)
【物说芯语】FPGA发明者赛灵思,突破新领域的秘密武器!
新增数据手册
MI-P51N-IYZ
24445
TR0402D51K1Q1025Z
54242-802381000LF
JH241240320ACNSWNFFLWC
BLU0603P-3241-CB10Q
热搜器件
SCE2B06K0819SA
520R20IA38M4000
1300120298
LTC3851EUD-1
LQP03HQ13NJ02D
RJFTVX6MN
推荐下载
基于DSP的光纤捷联惯导系统设计与实现
基于ACDC控制芯片的原边反馈技术.doc
74lv08a
中国太阳能光热发电产业的现状及前景
W83195BR-25a
DM365中的u-boot编译以及内核编译指导手册
推荐关注
明远智睿SSD2351核心板在语音对讲与HMI领域的创新应用
电子金属加工ERP都有哪些功能
AI引擎的亮点是什么
简单分析AI智能体的适配性
差分晶振的输出方式有哪几种呢
关税“风波”下,国产容耦隔离器能否终结进口依赖?