当前位置: 首页 > news >正文

在线ui设计网站深圳龙岗设计

在线ui设计网站,深圳龙岗设计,盐城网站开发公司电话,去什么网站可以做ctf的题目本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写#xff0c;需要的同学可以在这里获取#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总#xff1a; ht…本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写需要的同学可以在这里获取 https://item.taobao.com/item.htm?id728461040949 配套资料获取https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总 https://blog.csdn.net/qq_35181236/article/details/132779862 第19章 RTC 本章目标 了解瑞萨处理器RTC模块的使用 19.1 RTC模块的使用 19.1.1 RTC简介 RA6M5的RTC(Real Time Clock)外设实质是一个掉电后还继续运行的定时器。RA6M5的实时时钟(RTC)有两种计数模式日历计数模式、二进制计数模式可以通过寄存器的设置来切换模式。对于日历计数模式RTC具有从2000年到2099年的100年日历并自动调整闰年的日期。对于二进制计数模式RTC计数秒并保留信息作为串行值。二进制计数模式可用于公历(西历)以外的日历。 可以选择作子时钟振荡器或LOCO作为时间计数器的计数源。RTC使用128Hz的时钟通过将计数源除以预分频器的值获得。 19.1.2 RTC特征 瑞萨处理器的RTC有如下特征 计数模式日历计数模式和二进制计数模式。时钟源子时钟或LOCO。l 日历计数模式年月日星期小时分钟秒计数。二进制计数模式32位二进制计数器。闹钟中断在日历计数模式下可以与年月日星期小时分钟和秒进行比较。在二进制计数模式下则与32位2进制计数器进行对比。周期性中断可以选择2秒1秒1/2秒1/4秒1/8秒1/16秒1/32秒1/64秒、1/128秒或1/256秒作为中断周期。进位中断当从64HZ计数器到二进制计数器的进位时和当改变64Hz计数器和R64同时读取CNT寄存器时进行中断。输入捕获当检测到捕获时间输入引脚的电平发生跳变时上升沿或者下降沿时可以进行输入捕获。 该输入捕获可以用日历计数或者二进制计数。电平跳变时可以产生中断。与GPT相同的是该输入捕获也能使用噪声滤波器。事件关联周期性输出事件。TrustZone过滤器可以设置安全属性。 19.1.3 RTC的系统框图 瑞萨处理器的RTC系统框图大致分为以下几部分 外部引脚 XCIN/XCOUT连接到外部32.768kHz晶振RTCOUT输出1Hz或64Hz的方波无法在待机模式下使用。RTCICnn 0,1,2输入捕获引脚。 计数器 这个计数器可以在VBAT供电下使用由以下寄存器同时也是计数器构成 R64CNTR64CNT是一个8位的计数器由128Hz的时钟脉冲驱动实际只使用[6:0]位故其最大计数值为128次 也就是1秒就会产生一次进位并驱动RSECCNT/BCNT计数器1。RSECCNT用于统计R64CNT每秒产生的进位信号表示“秒”设置范围为0-59如果设置其他值会导致RTC工作异常。RMINCNT用于统计RSECCNT每分钟产生的进位信号表示“分”设置范围为0-59如果设置其他值会导致RTC工作异常。RHRCNT用于统计RMINCNT每小时产生的进位信号表示“时”当RTC设置为24小时制则设置范围时0-23。 当RTC设置为12小时制则设置范围时0-11。如果设置其他值会导致RTC工作异常。RDAYCNT用于统计RHRCNT的每天时产生进位信号表示“日”计数范围取决于月份以及这一年是否为闰年。设置范围为1-31如果设置其他值会导致RTC工作异常。RWKCNT用于统计RHRCNT的每天产生的进位信号表示“星期”计数范围为0-6如果设置其他值会导致RTC工作异常。RMONCNT用于统计RDAYCNT每个月产生的进位信号表示“月”计数范围为1-12如果设置其他值会导致RTC工作异常。RYRCNT用于统计RMONCNT每个月产生的进位信号表示“年”计数范围为0-99如果设置其他值会导致RTC工作异常。 在二进制模式下RSECCNT、RMINCNT、RHRCNT、RWKCNT共同构成BCNTBinary Counter是一个32位向上递增的计数器。通过统计R64CNT的进位次数进行计数。 闹钟功能 在日历计数模式下闹钟可以按年、月、日、周、时、分、秒或它们的任意组合来设置。在设置闹钟时往涉及的寄存器的ENB位都是最高位写1 并在低位设置比较值对于不涉及的寄存器往它的ENB位写入0。例如设置闹钟为每天的8点30分 则在RMINAR分闹钟寄存器的最高位写入1同时低位为30。RHRAR时闹钟寄存器最高位写入1同时低位写8。其他寄存器则在最高位写0。 在二进制计数模式下时间值是32位的数值设置闹钟时要比较哪些位在BCNTnAER中将需要比较的位写1不需要比较的位写0。这些位的比较值是什么BCNTnAR中设置比较值。 需要注意的是在日历计数模式下闹钟寄存器的比较值使用BCD码。 中断控制 RTC支持的中断请求有以下三种 闹钟中断请求周期计数中断请求捕获比较中断请求 输入捕获控制单元 整体框图如下图所示 19.1.4 配置RTC模块 配置RTC时需要配置引脚和Stack模块。 配置RTC引脚 在RASC的配置界面中去“Pins”里的“Peripherals”找到“Timers:RTC”选择RTC0后,在右侧使能它的操作模式如果不输出RTC时钟或者捕获采样信号就不需要选择引脚如下图所示 加配置RTC的Stack模块 首先需要去“Stacks”中添加RTC的Stack如下图所示 然后去配置RTC Stack的参数。 RTC的Stack参数分为3个板块 Common配置RTC的通用参数所有的RTC模块都会使用到这个板块的参数配置Module指定RTC模块的定制参数包括模块名称、时钟源、中断回调函数、中断优先级等PinsRTC的引脚 RTC的Common板块中比较重要的参数是“Set Source Clock in Open”如果使能了这个参数且后续使用的时钟源是子时钟那么用户在代码中就不需要使用函数手动设置时钟源如果不使能就需要在代码中调用函数手动设置RTC的时钟源。默认是“Enabled”。 而RTC的Module板块需要配置的参数比较多详见下表 下图是设置万年历实验的RTC Stack模块参数配置图 在万年历实验中选择的时钟源是子时钟系统使能了周期计数中断它的优先级选择为比较低的10级优先级中断回调函数的函数名设置为rtc_callback。 19.1.5 配置信息解读 因为没有使用RTC的输入/输出引脚因而使用RASC配置好RTC并生成工程后只会在hal_data.c中生成RTC设备对象的配置信息代码。 在hal_data.c中定义了一个rtc_instance_t类型的全局变量g_rtc0它含有控制参数、配置信息、接口信息 const rtc_instance_t g_rtc0 {.p_ctrl g_rtc0_ctrl,.p_cfg g_rtc0_cfg,.p_api g_rtc_on_rtc };p_ctrlRTC控制参数它指向结构体变量g_rtc0_ctrlg_rtc0_ctrl结构体原型如下 typedef struct st_rtc_ctrl {uint32_t open; /// Whether or not driver is openconst rtc_cfg_t * p_cfg; /// Pointer to initial configurationsvolatile bool carry_isr_triggered; /// Was the carry isr triggeredvoid (* p_callback)(rtc_callback_args_t *); // Pointer to callback that is called when a rtc_event_t occurs.rtc_callback_args_t * p_callback_memory; // Pointer to non-secure memory that can be used to pass arguments to a callback in non-secure memory.void const * p_context; // Pointer to context to be passed into callback function } rtc_instance_ctrl_t;p_cfgRTC配置参数它指向全局常量g_rtc0_cfg此常量成员的取值来自用户在RASC中对RTC的配置以万年历的配置为例此常量的赋值代码如下 const rtc_cfg_t g_rtc0_cfg {.clock_source RTC_CLOCK_SOURCE_SUBCLK,.freq_compare_value_loco 255,.p_err_cfg g_rtc0_err_cfg,.p_callback rtc_callback, ......省略内容 };p_apiRTC操作函数的封装指向结构体g_rtc_on_rtc后面讲解。 19.1.6 中断回调函数 在RASC中设置了RTC的中断回调函数名字会在hal_data.h中声明此函数 #ifndef rtc_callback void rtc_callback(rtc_callback_args_t * p_args); #endif用户需要在自己的程序中实现此函数例如 void rtc_callback(rtc_callback_args_t * p_args) {if(RTC_EVENT_PERIODIC_IRQ p_args-event){} }用户可以根据参数p_args的event成员判断是什么触发了RTC的中断RTC的中断事件有以下这些 /** Events that can trigger a callback function */ typedef enum e_rtc_event {RTC_EVENT_ALARM_IRQ, /// Real Time Clock ALARM IRQRTC_EVENT_PERIODIC_IRQ, /// Real Time Clock PERIODIC IRQ } rtc_event_t;只有2种原因闹铃中断、周期计数中断。 19.1.7 API接口及其用法 RTC模块的操作方法封装到了结构体rtc_api_t中此结构体的原型如下 typedef struct st_rtc_api {fsp_err_t (* open)(rtc_ctrl_t * const p_ctrl, rtc_cfg_t const * const p_cfg);fsp_err_t (* close)(rtc_ctrl_t * const p_ctrl);fsp_err_t (* clockSourceSet)(rtc_ctrl_t * const p_ctrl);fsp_err_t (* calendarTimeSet)(rtc_ctrl_t * const p_ctrl, rtc_time_t * const p_time);fsp_err_t (* calendarTimeGet)(rtc_ctrl_t * const p_ctrl, rtc_time_t * const p_time);fsp_err_t (* calendarAlarmSet)(rtc_ctrl_t * const p_ctrl, rtc_alarm_time_t * const p_alarm);fsp_err_t (* calendarAlarmGet)(rtc_ctrl_t * const p_ctrl, rtc_alarm_time_t * const p_alarm);fsp_err_t (* periodicIrqRateSet)(rtc_ctrl_t * const p_ctrl, rtc_periodic_irq_select_t const rate);fsp_err_t (* errorAdjustmentSet)(rtc_ctrl_t * const p_ctrl, rtc_error_adjustment_cfg_t const * const err_adj_cfg);fsp_err_t (* callbackSet)(rtc_ctrl_t * const p_ctrl, void (* p_callback)(rtc_callback_args_t *),void const * const p_context, rtc_callback_args_t * const p_callback_memory);fsp_err_t (* infoGet)(rtc_ctrl_t * const p_ctrl, rtc_info_t * const p_rtc_info); } rtc_api_t;瑞萨在r_rtc.c中实现了一个rtc_api_t结构体里面填充了各个函数指针如下 const rtc_api_t g_rtc_on_rtc {.open R_RTC_Open,.close R_RTC_Close,.clockSourceSet R_RTC_ClockSourceSet,.calendarTimeGet R_RTC_CalendarTimeGet,.calendarTimeSet R_RTC_CalendarTimeSet,.calendarAlarmGet R_RTC_CalendarAlarmGet,.calendarAlarmSet R_RTC_CalendarAlarmSet,.periodicIrqRateSet R_RTC_PeriodicIrqRateSet,.infoGet R_RTC_InfoGet,.errorAdjustmentSet R_RTC_ErrorAdjustmentSet,.callbackSet R_RTC_CallbackSet, };接下来介绍这些操作函数。 打开RTC设备 fsp_err_t (* open)(rtc_ctrl_t * const p_ctrl, rtc_cfg_t const * const p_cfg);p_ctrlrtc_ctrl_t结构体类型用来记录一些状态信息p_cfgrtc_cfg_t结构体类型含有RTC的配置信息 用户可以参考以下代码调用此函数初始化RTC的配置 fsp_err_t err g_rtc0.p_api-open(g_rtc0.p_ctrl, g_rtc0.p_cfg); if(FSP_SUCCESS ! err) {printf(Error in %s on %d\r\n, __FUNCTION__, __LINE__); }关闭RTC设备 fsp_err_t (* close)(rtc_ctrl_t * const p_ctrl);关闭RTC设备只需要传入RTC的控制参数即可此函数会将控制参数p_ctrl中的状态标志位open成员改变位CLOSED。 用户可以参考以下代码关闭RTC设备 fsp_err_t err g_rtc0.p_api-close(g_rtc0.p_ctrl); if(FSP_SUCCESS ! err) {printf(Error in %s on %d\r\n, __FUNCTION__, __LINE__); }设置RTC的时钟源 fsp_err_t (* clockSourceSet)(rtc_ctrl_t * const p_ctrl);如果用户在RASC的配置中没有将“Set Source Clock in Open”设置为“Enabled”就需要在代码中调用此函数手动设置使能RTC的时钟源。 用户可以参考以下代码手动设置使能RTC的时钟源 fsp_err_t err g_rtc0.p_api-clockSourceSet(g_rtc0.p_ctrl); if(FSP_SUCCESS ! err) {printf(Error in %s on %d\r\n, __FUNCTION__, __LINE__); }设置RTC的计数起始时间 fsp_err_t (* calendarTimeSet)(rtc_ctrl_t * const p_ctrl, rtc_time_t * const p_time);p_timertc_time_t结构体类型此结构体成员表示日常的时间值年月日时分秒和星期原型如下 struct tm {int tm_sec; /* seconds after the minute, 0 to 60(0 - 60 allows for the occasional leap second) */int tm_min; /* minutes after the hour, 0 to 59 */int tm_hour; /* hours since midnight, 0 to 23 */int tm_mday; /* day of the month, 1 to 31 */int tm_mon; /* months since January, 0 to 11 */int tm_year; /* years since 1900 */int tm_wday; /* days since Sunday, 0 to 6 */int tm_yday; /* days since January 1, 0 to 365 */int tm_isdst; /* Daylight Savings Time flag */ }; typedef struct tm rtc_time_t;在注释中已经解释了这些成员的取值范围。 用户需要先定义一个rtc_time_t结构体将其各成员赋值后再调用函数calendarTimeSet函数它会设置RTC从这个时间开始计数。 用户可以参考以下代码来设置RTC的初始计数时间 rtc_time_t SetTime {.tm_sec 0, //秒.tm_min 0, //分.tm_hour 0, //小时.tm_mday 29, //日一个月中.tm_wday 1, //星期.tm_mon 5, //月份.tm_year 2023-1900, //年份如今年是2008则这里输入2008-1900108 }; fsp_err_t err g_rtc0.p_api-calendarTimeSet(g_rtc0.p_ctrl, SetTime); FSP_Assert(FSP_SUCCESS err);此段代码将RTC的初始时间设置为2023年5月29日星期一的0时0分0秒。 获取RTC的当前计数时间 fsp_err_t (* calendarTimeGet)(rtc_ctrl_t * const p_ctrl, rtc_time_t * const p_time);此函数是获取RTC当前计数的时间和设置时间使用的是同一个结构体。用户可以参考以下代码获取当前时间 void rtc_callback(rtc_callback_args_t * p_args) {if(RTC_EVENT_PERIODIC_IRQ p_args-event){/*若是周期中断获取日期*/gRtcPeriodFlag true;g_rtc0.p_api-calendarTimeGet(g_rtc0.p_ctrl, (rtc_time_t*)gCurTime);} }上述代码是在RTC的中断回调函数中更新一个全局变量gCurTime它被用来记录时间值。 可以使用如下函数返回gCurTime获得当前时间 rtc_time_t RTCDrvGetTime(void) {RTCDrvWaitPeriodInt();return gCurTime; }设置RTC的闹铃时间 fsp_err_t (* calendarAlarmSet)(rtc_ctrl_t * const p_ctrl, rtc_alarm_time_t * const p_alarm);p_alarmrtc_alarm_time_t结构体类型用于指定闹铃匹配规则、匹配值此结构体原型如下 typedef struct st_rtc_alarm_time {rtc_time_t time; /// Time structurebool sec_match; /// Enable the alarm based on a match of the seconds fieldbool min_match; /// Enable the alarm based on a match of the minutes fieldbool hour_match; /// Enable the alarm based on a match of the hours fieldbool mday_match; /// Enable the alarm based on a match of the days fieldbool mon_match; /// Enable the alarm based on a match of the months fieldbool year_match; /// Enable the alarm based on a match of the years fieldbool dayofweek_match; /// Enable the alarm based on a match of the dayofweek field } rtc_alarm_time_t;第03行闹铃匹配的时间结构体内容见前文第04~10行RTC闹铃匹配规则根据需求决定匹配哪个时间点true-匹配false-不匹配 用户需要在程序中设定好匹配规则、匹配值后再调用calendarAlarmSet函数进行设置例如 rtc_alarm_time_t AlarmTime {.time {.tm_sec 30, //秒.tm_min 0, //分.tm_hour 0, //小时.tm_mday 29, //日一个月中.tm_wday 1, //星期.tm_mon 5, //月份.tm_year 2023-1900, //年份如今年是2023则这里输入2023-1900123},.year_match 0,.mon_match 0,.mday_match 0,.dayofweek_match 0,.hour_match 0,.min_match 0,.sec_match 1, }; err g_rtc0.p_api-calendarAlarmSet(g_rtc0.p_ctrl, AlarmTime); assert(FSP_SUCCESS err);第02~10行将闹铃时间设置为2023-5-29.0:0:30第11~17行匹配规则为仅匹配秒时间段即每分钟的第30秒会匹配一次闹铃第19行调用函数完成闹铃设置 获取RTC的闹铃时间 fsp_err_t (* calendarAlarmGet)(rtc_ctrl_t * const p_ctrl, rtc_alarm_time_t * const p_alarm);获取闹铃设置信息的使用比较简单仅是帮助用户获知当前RTC设置的闹铃的匹配规则、匹配值。参数和设置闹铃时间函数的参数是同一结构体类型。 设置RTC的中断周期 fsp_err_t (* periodicIrqRateSet)(rtc_ctrl_t * const p_ctrl, rtc_periodic_irq_select_t const rate);ratertc_periodic_irq_select_t结构体类型表示触发RTC周期中断的间隔时间支持的时间如下 typedef enum e_rtc_periodic_irq_select {RTC_PERIODIC_IRQ_SELECT_1_DIV_BY_256_SECOND 6,RTC_PERIODIC_IRQ_SELECT_1_DIV_BY_128_SECOND 7,RTC_PERIODIC_IRQ_SELECT_1_DIV_BY_64_SECOND 8,RTC_PERIODIC_IRQ_SELECT_1_DIV_BY_32_SECOND 9,RTC_PERIODIC_IRQ_SELECT_1_DIV_BY_16_SECOND 10,RTC_PERIODIC_IRQ_SELECT_1_DIV_BY_8_SECOND 11,RTC_PERIODIC_IRQ_SELECT_1_DIV_BY_4_SECOND 12,RTC_PERIODIC_IRQ_SELECT_1_DIV_BY_2_SECOND 13,RTC_PERIODIC_IRQ_SELECT_1_SECOND 14,RTC_PERIODIC_IRQ_SELECT_2_SECOND 15, } rtc_periodic_irq_select_t;根据枚举成员的命名可以知道周期间隔中断时间是1/256秒、1/128秒……1秒、2秒通常选用1秒的间隔例如 err g_rtc0.p_api-periodicIrqRateSet(g_rtc0.p_ctrl, RTC_PERIODIC_IRQ_SELECT_1_SECOND); assert(FSP_SUCCESS err);获取RTC的配置信息 fsp_err_t (* infoGet)(rtc_ctrl_t * const p_ctrl, rtc_info_t * const p_rtc_info);p_rtc_infoRTC的配置信息和运行状态信息配置信息指时钟源信息运行状态则是指RTC是处于停滞状态还是运行状态 typedef struct st_rtc_info {rtc_clock_source_t clock_source; /// Clock source for the RTC blockrtc_status_t status; /// RTC run status } rtc_info_t;运行状态的枚举成员如下 typedef enum e_rtc_status {RTC_STATUS_STOPPED 0, /// RTC counter is stoppedRTC_STATUS_RUNNING 1 /// RTC counter is running } rtc_status_t;19.2 万年历实验 19.2.1 设计目的 学会使用瑞萨处理器的RTC FSP库函数接口获取RTC的计数时间并且将之打印出来观察。 19.2.2 硬件连接 作为例程实验本书没有连接外部电池电源VBAT断电后无法保存维持RTC时钟但是不影响本实验。 19.2.3 驱动程序 初始化RTC 需要设置RTC的起始计数时间并设置周期性中断的时间值代码如下 int RTCDrvInit(void) {rtc_time_t SetTime {.tm_sec 0, //秒.tm_min 0, //分.tm_hour 0, //小时.tm_mday 29, //日一个月中.tm_wday 1, //星期.tm_mon 5, //月份.tm_year 2023-1900, //年份如今年是2008则这里输入2008-1900108};fsp_err_t err g_rtc0.p_api-open(g_rtc0.p_ctrl, g_rtc0.p_cfg);assert(FSP_SUCCESS err);err g_rtc0.p_api-calendarTimeSet(g_rtc0.p_ctrl, SetTime);assert(FSP_SUCCESS err);err g_rtc0.p_api-periodicIrqRateSet(g_rtc0.p_ctrl, RTC_PERIODIC_IRQ_SELECT_1_SECOND);assert(FSP_SUCCESS err);return true; }中断回调函数和周期等待函数 本次实验先在中断回调函数中判断触发中断的原因是否为“周期中断”在全局变量gCurTime中更新当前时间值 void rtc_callback(rtc_callback_args_t * p_args) {if(RTC_EVENT_PERIODIC_IRQ p_args-event){/*若是周期中断获取日期*/gRtcPeriodFlag true;g_rtc0.p_api-calendarTimeGet(g_rtc0.p_ctrl, (rtc_time_t*)gCurTime);} }在此基础上封装一个周期中断的等待函数 static int RTCDrvWaitPeriodInt(void) {int ret (int)gRtcPeriodFlag;gRtcPeriodFlag false;return ret; }此函数如果返回true则表明时间已经更新。 3.时间获取函数 实际上这个函数可以直接读取当前时间gCurTime下面的代码中先判断是否发生了RTC周期性中断只是想得到更新后的时间值以免多次调用都得到同样的时间值 int RTCDrvGetTime(rtc_time_t *time) {if(RTCDrvWaitPeriodInt()){*time gCurTime;return true;}return false; }此函数返回true才表明获取到了最新一次更新的时间调用者根据返回值和输出参数time做处理。 19.2.4 测试程序 本次实验测试方法很简单就是获取更新的时间再打印出来代码如下 void RTCAppTest(void) {UARTDrvInit();RTCDrvInit();printf(RTC Test!\r\n);while(1){rtc_time_t time;if(RTCDrvGetTime(time)){printf (%.4d-%.2d-%.2d-%.2d:%.2d:%.2d\r, time.tm_year 1900, time.tm_mon, time.tm_mday,time.tm_hour, time.tm_min, time.tm_sec);}} }为了对齐以便观察打印的年份使用4个数字而月日时分秒使用2个数字表示。 19.2.5 测试结果 在hal_entry()函数中调用测试函数将编译出来的二进制文件烧录到处理器中运行可以看到一直在计数的时间 上图只是观察变化因为RTC的起始计数时刻并未和网络时间统一校准会出现一定的偏差。 19.3 闹铃实验 19.3.1设计目的 FSP库的RTC函数设计一个简单的闹铃匹配程序。 19.3.2 RTC模块配置 和万年历实验相比本节实验的RTC模块需要使能RTC的Alarm中断 19.3.3驱动程序 1.初始化RTC 本次实验初始化RTC的时候除了设置RTC的起始计数时间以外还要设置RTC的闹铃匹配规则和匹配值 int RTCDrvInit(void) {rtc_time_t SetTime {.tm_sec 0, //秒.tm_min 0, //分.tm_hour 0, //小时.tm_mday 29, //日一个月中.tm_wday 1, //星期.tm_mon 5, //月份.tm_year 2023-1900, //年份如今年是2023则这里输入2023-1900123};rtc_alarm_time_t AlarmTime {.time {.tm_sec 30, //秒.tm_min 0, //分.tm_hour 0, //小时.tm_mday 29, //日一个月中.tm_wday 1, //星期.tm_mon 5, //月份.tm_year 2023-1900, //年份如今年是2023则这里输入2023-1900123},.year_match 0,.mon_match 0,.mday_match 0,.dayofweek_match 0,.hour_match 0,.min_match 0,.sec_match 1,};fsp_err_t err g_rtc0.p_api-open(g_rtc0.p_ctrl, g_rtc0.p_cfg);assert(FSP_SUCCESS err);/* 设置起始计数时间 */err g_rtc0.p_api-calendarTimeSet(g_rtc0.p_ctrl, SetTime);assert(FSP_SUCCESS err);/* 设置闹铃匹配时间和匹配规则 */err g_rtc0.p_api-calendarAlarmSet(g_rtc0.p_ctrl, AlarmTime);assert(FSP_SUCCESS err);/* 设置触发周期中断的时间间隔 */err g_rtc0.p_api-periodicIrqRateSet(g_rtc0.p_ctrl, RTC_PERIODIC_IRQ_SELECT_1_SECOND);assert(FSP_SUCCESS err);return true; }中断回调函数和闹铃中断等待函数 本次实验的中断回调函数除了处理周期性中断外还要处理闹铃中断在闹铃中断事件中将闹铃事件标志置true void rtc_callback(rtc_callback_args_t * p_args) {switch(p_args-event){case (RTC_EVENT_ALARM_IRQ):{/* 如果是闹铃事件则闹铃标志设置true */gRtcAlarmFlag true;break;}case (RTC_EVENT_PERIODIC_IRQ):{/*若是周期中断获取日期*/gRtcPeriodFlag true;g_rtc0.p_api-calendarTimeGet(g_rtc0.p_ctrl, (rtc_time_t*)gCurTime);break;}default:break;} }然后再封装一个闹铃事件等待函数 static int RTCDrvAlarmEvent(void) {if(gRtcAlarmFlag){gRtcAlarmFlag false;return true;}return false; }用户通过调用此函数来判断是否触发闹铃事件。 时间获取函数 此函数就是移植的上一小节万年历实验的驱动函数此处不再说明。 19.3.4 测试程序 本节实验既要实时获取并打印RTC的计数时间也要实时判断是否发生了闹铃匹配如果发生了闹铃匹配那么就打印信息 void RTCAppTest(void) {UARTDrvInit();RTCDrvInit();while(1){rtc_time_t time;if(RTCDrvGetTime(time)){printf (%.4d-%.2d-%.2d-%.2d:%.2d:%.2d\r, time.tm_year 1900, time.tm_mon, time.tm_mday,time.tm_hour, time.tm_min, time.tm_sec);}if(RTCDrvAlarmEvent()){printf(\r\nAlarm Time!\r\n);}} }19.3.5 测试结果 在hal_entry()函数中调用测试函数将编译出来的二进制文件烧录到处理器中运行观察可以发现RTC计数时间的每个分钟的第30秒都会触发一次闹铃事件 本章完
http://www.tj-hxxt.cn/news/218532.html

相关文章:

  • 受欢迎的手机网站建设网站建设与运营就业
  • 淘宝网站页面设计北京软件开发公司排
  • 建设网站需要多少钱济南兴田德润厉害吗网站开发报价标准
  • 四川省建设厅建造师官方网站win8.1 做网站服务器
  • 网站建设技术有哪些微博内容放到wordpress
  • 深圳做网站公司排名2345网址大全的网址
  • 赌场网站建站外发加工网会员
  • 龙岗网站制作公司wordpress注册文件下载
  • 个人淘宝客网站备案营销型网站建设实战感想
  • 司法厅网站建设方案服务器个人买能干什么
  • 如何制作一个网站h5爱网逛
  • 外贸网站域名服务商网站推广一般多少钱
  • 建设一个旅游平台网站需要多少资金网站建设优化哪家专业
  • 珠海网站建设哪个平台好商贸有限公司起名
  • 做纸贸易的好网站国家企业信息查询平台官网
  • 企业网站设计欣赏小企业网站建设有什么用
  • 网站开发实训报告总结2021做网站需要哪个系统
  • 自助做app的网站app模拟制作
  • 网站建设合理化建议方案个人网页制作成品代码免费
  • 中国建设银行e路通网站做公司网站要走哪些流程
  • 江阴网站的建设域名解析不成功是什么意思
  • 建设商务网站的方案河北爱站网络科技有限公司
  • 提升审美的网站wordpress 语法编辑
  • .net 免备案网站空间 最新版天堂资源网在线
  • 免费建设网站的画出电商网站设计实训总结报告
  • wordpress免费网站模板四川省人事考试网
  • 连云港网站备案在哪优惠活动推广文案
  • 贸易公司网站建设要多少钱wordpress这么安装不了
  • 网站优化工作内容湖南省建设厅易晓林
  • 个人网站怎么申请注册建设网站企业网上银行