因为要用RTC来做
芯片的睡眠唤醒,所以要用这个RTC中断唤醒,时间不准也没关系,大概的时间可以唤醒就可以了。
查了网上很多的资料,但是因为都不是这个型号的,所以移植不了,后来查到似乎可以的,但是还是发现RTC没有工作起来,下面把RTC的初始化程序和中断程序带上,请各位高人指点下吧?
这是RTC初始化的
void RTC_chushihua(void)
{
uint8_t temp=0;
uint8_t wliao = 0;
RTC_InitTypeDef RTC_InitStructure = {0};
uint32_t LS
IFreq = 0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_LSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
{
}
/* Reset Backup Domain */
RCC_BackupResetCmd(ENABLE);
RCC_BackupResetCmd(DISABLE);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
/* Wait for RTC APB registers synchronisa
tion */
RTC_WaitForSynchro();
RTC_InitStructure.RTC_Hou
RFormat = RTC_HourFormat_24;
RTC_InitStructure.RTC_AsynchPrediv = 99; // <7f
RTC_InitStructure.RTC_SynchPrediv = 0x1FF0; // <0x1FFF
RTC_Init(&RTC_InitStructure);
//Set Default Time/Date
RTC_NVIC_Config();
}
下面是关于中断向量的设置
void RTC_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
下面是RTC中断程序,如果进入中断了,就闪一下
LED
void RTC_IRQHandler(void)
{
RTC_ClearITPendingBit(0x0001 | 0x0004);
GPIOC->ODR = 0x2000;
Delay(0xffff);
GPIOC->ODR = 0x0000;
Delay(0xfffff);
}
我已经确认其他部分是OK了,但是这个RTC始终弄不起来,求教各位高人了。
其实其中的帮助还有我同事的功劳。在这里也回报下大家:
STOP模式的KEY唤醒是属于外部中断模式;
STOP模式的串口唤醒其实是把串口接收这个IO口在睡眠前先初始化为KEY唤醒一样的外部中断模式;
虽然会丢个数据,但是和外面的机器加个握手的简单招呼就行。注意醒后要重新初始化串口。
STOP模式的RTC唤醒用内部的LSI或者外部LSE都可以,用外部LSE的时候要确认32K晶体可以正常起振,可以拿示波器看下。但是每次唤醒后都必须重新设置ALARM。这一点STM32的确不太好。
除了参考启例程外,再就是注意你LSE一定要跑起来了。
福往者福来。
一周热门 更多>