我也来贴个代码吧,不知道楼主函数的具体实现,就自己写了。
int main(void)
{
// uint32_t n;
DeviceInit(); // 初始化
rtcAlarmAheadSet(500); // 设置RTC闹铃超前值
rtcAlarmEventEnable(); // 使能RTC闹铃事件
for (;;)
{
// 进入停机模式,等待RTC闹铃事件唤醒
//sysModeStop(SYS_WAKEUP_EVENT);
/* Request to enter STOP mode with regulator in low power mode*/
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE);
// // 对GD32F103必须插入一个延时才行,否则LED不会闪烁(STM32F103不需要)
// n = 80;
// while (--n != 0);
// 重新设定RTC闹铃超前值
rtcAlarmAheadSet(500);
// 反转LED,形成闪烁效果
// LedToggle(LED1);
LedToggle();
}
}
void DeviceInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(LED_GPIO_CLK , ENABLE);
GPIO_InitStructure.GPIO_Pin = LED_PIN ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_PORT, &GPIO_InitStructure);
GPIO_ResetBits(LED_PORT, LED_PIN );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
RCC_LSEConfig(RCC_LSE_ON);
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{}
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_SetPrescaler(32);
RTC_WaitForLastTask();
}
void LedToggle(void)
{
LED_PORT->ODR ^= LED_PIN;
}
void rtcAlarmAheadSet(uint32_t almtime)
{
//按道理这几句是不该注释掉的,不过注释掉了程序也没出问题,呵呵
// RTC_WaitForSynchro();
// RTC_ClearFlag(RTC_FLAG_SEC);
// while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET);
// RTC_WaitForLastTask();
RTC_SetAlarm(almtime);
RTC_WaitForLastTask();
RTC_SetCounter(0);
RTC_WaitForLastTask();
}
void rtcAlarmEventEnable(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
/* Configure EXTI Line17(RTC Alarm) to generate an interrupt on rising edge */
EXTI_ClearITPendingBit(EXTI_Line17);
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
|