第四课 MC9S08DZ60之实时计数器RTC

发布者:Haifeeng最新更新时间:2021-04-07 来源: eefocus关键字:MC9S08DZ60  RTC 手机看文章 扫描二维码
随时随地手机看文章

本章介绍一个利用实时中断,设计的调度模块。利用该模块,不仅可以让I/O管脚输出特定占空比的方波,还可以让程序有序的去调度。


建议读者先自行阅读芯片资料第15章的内容,内容不多。芯片资料可以到我的百度盘下载,该芯片的中英文的资料分别https://pan.baidu.com/s/1dgVbkE https://pan.baidu.com/s/1o9qFU5c,如果对英文不是很熟悉,那就阅读中文的。


1.摘取文字来了解这款芯片的RTC


第一句:15.1.2 Features 中“ 8-bit up-counter”upcounter就是向上计数,比如一个变量从0开始然后1、2、3...一直往上       加。


第二句:15.1.2 Features中“...software selectable clock sources...”"— 1-kHz internal Low Power Oscillator (LPO) ;


— External clock (ERCLK);— 32-kHz internal clock (IRCLK)"可为RTC提供的驱动时钟源,一共有三个分别为                     LPO;MCGERCLK;MCGIRCLK,可以参看本系列《第二课 MC9S08DZ60之多功能时钟发生器S08MCGV1》中对系统时钟及系统时钟图的说明。


第三句:15.3.1 RTC Status and Control Register (RTCSC) 


A.要知道RTCSC寄存器中包含中断置起标志RTIF,且Writing a logic 1 TO RTIF clears the bit and the real-time             interrupt request .写1到RTIF位及清除中断标志。


B. 要知道RTCSC寄存器中包含时钟源的选择位 RTCLKS,且只有3个不同的源。


C.要知道RTCSC寄存器中包含计数匹配成功后,中断使能与否的设置位 RTIE.


D.要知道RTCSC寄存器中包含为8位RTCCNT使用的预分频 RTCPS。


第四句:15.3.2 RTC Counter Register (RTCCNT)中“writing to RTCMOD, or writing different values to RTCLKS and     RTCPS clear the count to 0x00.  每次写匹配数值RTCMOD或者重新选择时钟源,先前的计数RTCCNT都会清零,重新开        始新的计数。另外本单片机只有8位计数器,计数最大次数为0xFF,那么最长可以设计的匹配时常为255*T每一次计数所要花的时间。T每一次计数所要花的时间由选择的时钟源和预分频值决定。


第五句:15.3.3 RTC Modulo Register (RTCMOD)中“ These eight read/write bits contain the modulo value used to                   reset the count to 0x00 upon a compare match and set the RTIF status bit”包含模值用于匹配向上计数器寄存器RTCCNT中的值,一旦RTCMOD和RTCCNT中的值相等,就会清零RTCCNT和置起中断标志RTIF。


2.分析‘’15.4.1 RTC Operation Example‘’中的例子实现过程


下图Figure 15-6为RTC计数溢出计数实例,图中第一个时序LPO 1-kHz代表的是RTCLKS=0,RTC的时钟源为LPO1kHz,周期为1ms。第二个时序预分频RTCPS为0xA,也即是十进制的10.查表Table 15-3,找到预分频系数为除4(2^2次方)。那么经过预分频后的频率为1000/4= 250Hz,周期为4ms。由下图Figure 15-2得出,每4ms计数器RTCCNT up counter一次,当RTCCNT中的计数值等于RTCMOD中的值。那么中断标志RTIF置起,RTCCNT也清零,并重新开始计数。



第三 代码部分


注:时钟的分配可以参看《第二课 MC9S08DZ60之多功能时钟发生器S08MCGV1》


注:如果有对codewarrior编译器中断函数的写法及使用不明确的,可以到https://pan.baidu.com/s/1dvjxq_B_cJArXCUY92tHAw下载资料,看文中“3.4 编写中断服务函数”。


利用8MHz外部时钟MCGERCLK作为RTC时钟源,并设置预分频为2000,最终用4KHz,每个计数时间为T=1/4k=0.25ms,这样的话,把匹配值RTCMOD写0,也即是每个T时间就置起中断RTIF,让后进入interrupt server function函数中。


头文件.H


#ifndef _DATA_TYPE_H_H

#define _DATA_TYPE_H_H

 

typedef char            INT8;

typedef unsigned char   UINT8;

typedef unsigned short  USHORT16;

typedef unsigned int    UNIT16;

typedef unsigned long   ULONG32;

typedef short           SHORT16;

typedef long            LONG32;

typedef unsigned char   BOOL;

#endif

 

#ifndef _RTC_H_H

#define _RTC_H_H

 

#define TASK_ALGOR_END    50 //周期T=50*0.25=12.5ms

#define TASK_CALIB_END    20 //周期T=20*0.25=5ms

#define TASK_CAN_END     400 //周期T=400*0.25=100ms

#define TASK_EXT_CAN_END 4000//周期T=4000*0.25=1000ms

 

enum LECU_TASK_LIST_CODE 

{

LECU_TASK_CALIBRATION = 0x0001,

LECU_TASK_ALGORITHM = 0x0002,

LECU_TASK_CAN_MAIL = 0x0004,

LECU_TASK_CAN_MAIL_EXT = 0x0008,

};

 

//  =============

 

/*

向RTCSC中RTIF位写1,用于清楚中断置起的标志位

*/

void ClearRTIF(void);

/*

clk = 0x00 1kHz低功率振荡器LPO

clk = 0x01 外部时钟ERCLK

clk = 0x1x 内部时钟IRCLK

*/

void SelectCLKS(UINT8 clk);

/*

SW = 1 real time interrupt request enable

SW = 0 real time interrupt request disable

*/

void SetInterrupt(UINT8 SW);

/*

选择时钟源和预分频除数

clk = 0x00 1kHz低功率振荡器LPO

clk = 0x01 外部时钟ERCLK

----------------------------------------------------------------------------------------------------------------

|clk       |                       preScaler                                                                    |

|-----------                                                                                                    |

|          |0  |  1  |2    | 3   | 4   | 5   | 6   | 7   |  8   |9     |10    |11  |12    |  13  |14    |15     |

|---------------------------------------------------------------------------------------------------------------|          

|0         |OFF| 2^3 | 2^5 | 2^6 | 2^7 | 2^8 | 2^9 | 2^10|  1   |2     |2^2   |10  | 2^4  |  10^2|5x10^2| 10^3  |

|---------------------------------------------------------------------------------------------------------------|

|1         |OFF| 2^10| 2^11| 2^12| 2^13| 2^14| 2^15| 2^16|  10^3|2x10^3|5x10^3|10^4|2x10^4|5x10^4|10^5  | 2x10^5|

----------------------------------------------------------------------------------------------------------------

*/

void SelectClkAndPrescaler(UINT8 clk ,UINT8 preScaler);

/*

设置与计数器匹配溢出值modValue

*/

void SetRTCMOD(UINT8 modValue);

/*

初始化各task的初始值

TaskAlgorEnd 初始设计周期为每0.25*50 = 12.5ms,复位或重启到第一次执行TaskAlgorEnd任务的时间

             T=(50-tskAlgorEnd)*0.25计。

TaskCalibEnd 初始设计周期为5ms,其他类同 TaskAlgorEnd

TaskCANEnd   初始设计周期为100ms 其他类同TaskAlgorEnd

TaskCANExtEnd初始化设计周期1000ms其他类同TaskAlgorEnd

各个task的周期可以通过宏:

                         TASK_ALGOR_END

                         TASK_CALIB_END

                         TASK_CAN_END

                         TASK_EXT_CAN_END

              修改后周期计算公式eg.T=TASK_ALGOR_END*0.25ms 

*/

void InitialTaskValue(UINT8 tskAlgorEnd,UINT8 tskCalibEnd,USHORT16 tskCANEnd,USHORT16 tskCANExtEnd);

void InitialTaskList(UINT8 tskList);

/*

每个任务执行完成后要清除,

taskBitPosition:

bit0--TaskCalibEnd

bit1--TaskAlgorEnd

bit2--TaskCANEnd

bit3--TaskCANExt

bitx--其它未开放

*/

void ClearTaskList(UINT8 taskBitPosition);

/*

返回的数值用位1,0分别表示任务执行与否

bit0--TaskCalibEnd

bit1--TaskAlgorEnd

bit2--TaskCANEnd

bit3--TaskCANExt

bitx--其它未开放

*/

UINT8 GetTaskList(void);

 

//example  for RTC initialization

void SetupRTC(void);

//for 0.25ms 

void interrupt VectorNumber_Vrtc RTC_ISR(void);

 

#endif

 

 

源文件.C

#include

#include "derivative.h"

#include "DataType.h"

#include "RTC.h"

 

//static UINT8 flag=0;//---test--for RTC------ 

//------VARIABLES PLACE HERE-----------------

static UINT8 countTaskAlgorEnd = 0;

static UINT8 countTaskCalibEnd = 0;

static USHORT16 countTaskCANEnd = 0;

static USHORT16 countTaskCANExtEnd = 0;

static USHORT16 sTaskList = 0;

//------LOCAL FUNC PLACE HERE-----------------

 

//--------------------------------------------

 

 

/*

向RTCSC中RTIF位写1,用于清楚中断置起的标志位

*/

void ClearRTIF(void) {

    RTCSC |= 0x80;/* Write 1 to clear RTIF bit */

}

/*

clk = 0x00 1kHz低功率振荡器LPO

clk = 0x01 外部时钟ERCLK

clk = 0x1x 内部时钟IRCLK

*/

void SelectCLKS(UINT8 clk) {

    UINT8 temp = RTCSC;

    RTCSC = ( temp & 0x9F ) | (( clk << 5 ) & 0x60);

}

/*

SW = 1 real time interrupt request enable

SW = 0 real time interrupt request disable

*/

void SetInterrupt(UINT8 SW) {

    if(1 == SW)

        RTCSC |= 1<<4;

    else

        RTCSC &= ~(1<<4);

}

/*

选择时钟源和预分频除数

clk = 0x00 1kHz低功率振荡器LPO

clk = 0x01 外部时钟ERCLK

----------------------------------------------------------------------------------------------------------------

|clk       |                       preScaler                                                                    |

|-----------                                                                                                    |

|          |0  |  1  |2    | 3   | 4   | 5   | 6   | 7   |  8   |9     |10    |11  |12    |  13  |14    |15     |

|---------------------------------------------------------------------------------------------------------------|          

|0         |OFF| 2^3 | 2^5 | 2^6 | 2^7 | 2^8 | 2^9 | 2^10|  1   |2     |2^2   |10  | 2^4  |  10^2|5x10^2| 10^3  |

|---------------------------------------------------------------------------------------------------------------|

|1         |OFF| 2^10| 2^11| 2^12| 2^13| 2^14| 2^15| 2^16|  10^3|2x10^3|5x10^3|10^4|2x10^4|5x10^4|10^5  | 2x10^5|

----------------------------------------------------------------------------------------------------------------

*/

void SelectClkAndPrescaler(UINT8 clk ,UINT8 preScaler) {

    UINT8 temp = RTCSC;

    RTCSC = ( temp & 0x90 ) | ((( clk << 5 ) | preScaler)& 0x6F);

[1] [2]
关键字:MC9S08DZ60  RTC 引用地址:第四课 MC9S08DZ60之实时计数器RTC

上一篇:第三课 MC9S08DZ60之通用输出输入GPIO
下一篇:Freescale MC9S08AW60汇编学习笔记

推荐阅读最新更新时间:2024-11-07 13:59

STM32片内RTC亚秒特性的应用示例(下)
不过,今天主要想聊聊如何通过RTC来实现该需求。了解STM32的RTC的人可能知道,RTC模块往往还自带一个专门的16位向下计数的唤醒定时器,即下面RTC局部框图中红框所在单元。我这里要分享的也不是这个专用唤醒定时器,而是想基于ALARM事件和亚秒特性来实现上面需求。 对于RTC的ALARM功能我们都不陌生,即先预设需要ALARM的时间点,当日历时间跟设定的ALARM时间匹配时就可以触发ALARM事件及中断。对于ALARM时间点的报警条件可以有很多灵活的组合配置,比方我们可以设置在某月某日某时某分某秒ALARM,也可以设置在某分某秒ALARM,其它不关心,或者仅设置在某个亚秒时刻ALARM,其它不关心。 上图中四种ALA
[单片机]
STM32片内<font color='red'>RTC</font>亚秒特性的应用示例(下)
STM32F407的RTC时间
RTC_InitTypeDef RTC_InitStructure; RTC_TimeTypeDef RTC_TimeStructure; RTC_DateTypeDef RTC_DataStructure; /**************************************************************************************** *函 数 名:bsp_InitRtc *函数功能:初始化rtc *形 参:无 *返 回 值:无 **************************************************************************
[单片机]
STM32F407的<font color='red'>RTC</font>时间
STM32CubeMX系列教程13:实时时钟(RTC)
1.RTC简介 实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。 RTC 提供具有可编程闹钟中断功能的日历时钟 /日历。RTC 还包含具有中断功能的周期性可编程唤醒标志。 两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。 只要芯片的备用电源一直供电,RTC上的时间会一直走。 2.新建工程 本章程序在串口printf工程的基础上修改,复制串口printf的工程,修改文件夹名。点击STM32F746I.ioc打开STM32cub
[单片机]
STM32CubeMX系列教程13:<font color='red'>实时</font>时钟(<font color='red'>RTC</font>)
STM32F407 RTC 配置理解与总结
RTC: Real time clock 相比较而言,STM32F407的RTC比STM32F1的更加容易配置。当然,F4的资源相对也就更加丰富很多了。具体的资源可查看官方参考手册,通过下面的图表也可以了解其大致功能 1、开始的时候对于 ALRAM A/B的功能没有怎么理解,后面再来看时发现其很简单,举个简单的例子,就比如,定的闹钟,当然,这个也是可以实现闹钟的功能。只是通过这个简单的例子来说明,ALARM A/B的用途或者功能吧 2、自动唤醒与时间戳及时间篡改事件,与1的差不多,细细体会就知道 3、RTC_AFO 与 RTC_AFI 就是对外输出及检测外部时间事件 4、 RTC
[单片机]
STM32F407 <font color='red'>RTC</font> 配置理解与总结
stm32实时时钟——RTC
对于单片机转ARM的同学来说,RTC可能比较少接触。提到实时时钟,更经常想到的是DS1302。当然,在STM32里,自己一个CPU已经足够,不需要DS1302。 实际上,RTC就只一个定时器而已,掉电之后所有信息都会丢失,因此我们需要找一个地方来存储这些信息,于是就找到了备份寄存器。因为它掉电后仍然可以通过纽扣电池供电,所以能时刻保存这些数据。我们在本期教程中将详细讲述RTC原理及例程,以引导大家顺利进入RTC的世界。 1.STM32的RTC模块 RTC模块之所以具有实时时钟功能,是因为它内部维持了一个独立的定时器,通过配置,可以让它准确地每秒钟中断一次。下面就来看以下它的组成结构。 1.1RTC的组成 RTC
[单片机]
STM32 低功耗模式STOP、STANDBY配合RTC应用实例
项目背景 目标:进入低功耗模式120s左右唤醒。 结果:完成低功耗驱动,完成RTC定时驱动,完成目标; Tip:使用一个新的模块时应主要参考官方文档和官方例程,有问题再上网寻找思路;(本文使用的例程在最后 ) 环境:STM32F205、 IAR6.7、J-Link 附:因为考虑到项目以后需要移植到 stm32F0系列上,而且 stm32F0系列没有 backup SRAM,所以这部分驱动不使用 backup SRAM; 注意:看门狗是不能开启的,否则会在sleep时watch dog重启; 一、STOP模式 +RTC STOP模式: 可以理解为程序进入STOP模式后会暂停运行,直到中断触发退出STOP模式,程序会
[单片机]
STM32 低功耗模式STOP、STANDBY配合<font color='red'>RTC</font>应用实例
技术文章—如何解决RTC精度及功耗问题
RTC(Real_Time Clock)为整个电子系统提供时间基准,MCU、MPU、CPU均离不开RTC电路设计,在设计、应用RTC单元时,常常会发现延时、超时或者功耗过大现象,如何解决RTC精度以及功耗问题呢?本文将为您介绍时钟芯片PCF8563应用设计,并给出相应的解决方法。 一、什么是RTC 实时时钟(Real_Time Clock)简称为RTC,主要为各种电子系统提供时间基准。通常把集成于芯片内部的RTC称为片内RTC,在芯片外扩展的RTC称为外部RTC,PCF8563是一款低功耗的CMOS实时时钟/日历外部芯片,支持可编程时钟输出、中断输出、低压检测等,与处理器通过I2C串行总线进行通信,最大总线速率可达
[电源管理]
技术文章—如何解决<font color='red'>RTC</font>精度及功耗问题
【GD32 MCU 入门教程】GD32 MCU 常见外设介绍(14)RTC 模块介绍
GD32 MCU内部提供了一个RTC(实时时钟)模块,通过RTC可以实现日历时钟、闹钟等功能。RTC也可以用于深度睡眠或待机模式的低功耗唤醒。不同系列的GD32 MCU在RTC设计和功能上有所区别,总体可以分为三大系列: (1)F10x、F30x、E10x系列RTC功能基本相同,后文简称0x系列。 (2)F1x0、F3x0、E23x系列RTC功能基本相同,后文简称x0系列。 (3)F405、F407、F450系列RTC功能基本相同,后文简称4xx系列。后文会对0x系列、x0系列、4xx系列的RTC模块分别进行介绍,简单介绍RTC的工作原理、配置使用方法。 14.1.GD32 RTC 外设简介 0x 系列 RTC 0x系列RTC整体
[单片机]
【GD32 MCU 入门教程】GD32 MCU 常见外设介绍(14)<font color='red'>RTC</font> 模块介绍
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved