1.RTC 基本功能
2.RTC 具备各种定时中断功能,比如秒中断,分中断,时中断等。
3.RTC 具备闹钟中断,设置好闹钟过后,测试可以触发中断,详细配置下面有。
4.RTC 1HZ输出。
#include "BAT32G137.h"
#include "clk.h"
#include "rtc.h"
// bref: rtc 外设初始化
// para:
// note:
static void rtc_init(void)
{
// 配置晶振 时钟源
// 主时钟X1 X2作为IO,副时钟IO作为晶振口 这个时候外部需要接晶振
CLK_Osc_Setting(OSC_PORT,OSC_OSCILLATOR);
// 配置RTC 启用副时钟
RTC_Init(RTC_FSUB); // RTC_32M 表示意思在32M的FIH的分频时钟为RTC时钟源
INTC_ClearPendingIRQ(RTC_IRQn); /* clear INTRTC interrupt flag */
NVIC_ClearPendingIRQ(RTC_IRQn); /* clear INTRTC interrupt flag */
INTC_EnableIRQ(RTC_IRQn); /* enable INTRTC interrupt */
NVIC_EnableIRQ(RTC_IRQn); /* enable INTRTC interrupt */
// 设置秒中断.注意可以选择其他中断,比如分,时等。
RTC_Set_ConstPeriodInterruptOn(HALFSEC);
// 启动RTC
RTC->RTCC0 |= _80_RTC_COUNTER_START;
rtc_counter_value_t t;
t.sec = 0x30;
t.min = 0x19;
t.hour = 0x10;
t.week = 0x01;
RTC_Set_CounterValue(&t);
// 开启闹钟
RTC_Set_AlarmOn();
rtc_alarm_value_t t_alarm;
t_alarm.alarmwm = 0x20;
t_alarm.alarmwh = 0x10;
t_alarm.alarmww = 0xFF;
RTC_Set_AlarmValue(t_alarm);
// 开启1HZ输出
RTC_1HZ_Output();
}
// 功能一:RTC 基本功能
// 功能二:定时中断
// 功能三:闹钟
// 功能四:RTC输出
int main(void)
{
rtc_init();
//RTC_Stop();
// CLK_Osc_Setting(OSC_PORT,OSC_OSCILLATOR);
IT_Init(RTC_FSUB,0x7FFF/2);
IT_Start();
PORT->PM5 &= ~(1<<0); // P50 output enable
PORT->P5 &= ~(1<<0); // P50 output low level
while(1)
{
}
}
void IRQ22_Handler(void) __attribute__((alias("rtc_interrupt")));
/***********************************************************************************************************************
* Function Name: rtc_interrupt
* @brief RTC interrupt service routine
* @param None
* @return None
***********************************************************************************************************************/
void rtc_interrupt(void)
{
volatile uint8_t ifl, ifh;
ifl = INTC_GetPendingIRQ(RTC_IRQn);
ifh = INTC_GetPendingIRQ(IT_IRQn);
if (ifl)
{
if (RTC->RTCC1 & RTC_RTCC1_WAFG_Msk)
{
RTC->RTCC1 &= (uint8_t)~_10_RTC_ALARM_MATCH; /* clear WAFG */
INTC_ClearPendingIRQ(RTC_IRQn); /* clear INTRTC flag */
// rtc_callback_alarm();
}
if (RTC->RTCC1 & RTC_RTCC1_RIFG_Msk)
{
RTC->RTCC1 &= (uint8_t)~_08_RTC_INTC_GENERATE_FLAG; /* clear RIFG */
INTC_ClearPendingIRQ(RTC_IRQn); /* clear INTRTC flag */
// rtc_callback_constperiod();
}
}
if (ifh)
{
INTC_ClearPendingIRQ(IT_IRQn); /* clear INTIT flag */
// rtc_callback_interval();
PORT->P5 ^= 0x01;
}
}
注意1表示那天闹钟。
15间隔定时器中断
为什么会共用一个中断,是因为M0+ 只有32个IRQ,为了满足更多的中断,外扩一些一个中断模块。
但是即使怎么扩展,内核最多支持32个,所以中断标志可以很多,但是中断源和入口地址是不能变的。
注意设置时间需要定时器先启动。
15位定时器 是向上计数模式。