本帖最后由 wanglinma 于 2016-1-6 21:32 编辑
自己参考战舰的原理图做了一块板子,正在做低功耗的项目,项目需要STM32以100ms周期唤醒,于是选择了待机模式和RTC周期唤醒。可经过逻辑分析仪测试发现,每次进入main的间隔为200ms左右(如果设置为1ms周期唤醒,则每次进入main的间隔为100ms左右),也就是
从待机模式唤醒居然需要100ms左右!
然而,奇怪是的,如果
用jlink调试运行,则每次进入main的间隔又正常了。
并且,程序下到
战舰上运行的间隔也是正常的。
但是我的原理图和战舰主要部分都差不多;
我用示波器测量
晶振32.768 KHz的输出,发现我板子的输出和战舰的不同,拍摄如下:
晶振输出
波形的周期和我程序设置的唤醒间隔相等,同样的程序在战舰上该晶振的输出则是稳定的,不像上图那样一直在跳动。
目前真是试了很多办法,未能解决,希望大家给帮忙看看!
周期唤醒和进入待机模式的代码如下:
[mw_shl_code=c,true]void RTC_Alarm_After(uint32_t t)
{
//设置闹钟时间
RTC_SetAlarm(t+RTC_GetCounter());
RTC_WaitForLastTask();
}
void MILLIS_Init(void)
{
//定义中断结构体
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
//中断时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//中断优先级配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//设置RTC闹钟中断
NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//闹钟中断接到第17线外部中断
EXTI_ClearITPendingBit(EXTI_Line17);
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//PWR_WakeUpPinCmd(DISABLE);
//电源管理部分时钟开启
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
//使能后备寄存器访问
PWR_BackupAccessCmd(ENABLE);
BKP_ClearFlag();
BKP_DeInit();
//使能LSI
RCC_LSICmd(ENABLE);
//等待晶振启动
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
{}
//设置时钟为内部晶振
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
//等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1
RTC_WaitForSynchro();
RTC_WaitForLastTask();
//使能闹钟中断
RTC_ITConfig(RTC_IT_ALR, ENABLE);
RTC_WaitForLastTask();
//分频系数
RTC_SetPrescaler(32); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32+1) */
RTC_WaitForLastTask();
//初始计数值
RTC_SetCounter(0);
RTC_WaitForLastTask();
}
void RTCAlarm_Init()
{
RTC_Alarm_After(WAKEUP_INTERVAL);
}
void RTCAlarm_IRQHandler(void)
{
//等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1
RTC_WaitForSynchro();
if (RTC_GetITStatus(RTC_IT_ALR) != RESET)
{
// 清EXTI_Line17挂起位
EXTI_ClearITPendingBit(EXTI_Line17);
// 检查唤醒标志是否设置
if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
{
// 清除唤醒标志
PWR_ClearFlag(PWR_FLAG_WU);
}
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
RTC_Alarm_After(WAKEUP_INTERVAL);
}
return;
}
进入待机模式:PWR_EnterSTANDBYMode(); [/mw_shl_code]
唉,没人搞啊,大神在哪里
一周热门 更多>