你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用停止模式后不能进入待机模式

[复制链接]
abc5504@139.com 提问时间:2017-10-19 13:50 /
本帖最后由 江湖书生 于 2017-10-19 14:04 编辑

想法:先进入停止模式若干秒,唤醒后工作,然后再进入待机模式。主循环重复这个过程。但是实际情况是:只能进入一次待机状态,后续就只进停止模式,不进待机状态。请大家帮忙看看,代码如下(只贴出相关代码)。//--主循环--
int main(void)
{
  HAL_Init();       
        SystemPower_Config();
        SystemClock_Config();
        MX_RTC_Init();
        if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB))
        {
                __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
                __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
                HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
        }
       
        MX_GPIO_Init();
        MX_LPUART1_UART_Init();               
  //MX_ADC_Init();
  MX_USART1_UART_Init();
                 
  while(1)
  {
                HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
                OutTime();
                HAL_Delay(500);
                CollectAI();
                ProcessAI();
                HAL_Delay(500);
                //ReportData();
                StandbySystem();
        }
}

//--电源配置--
void SystemPower_Config(void)
{
  HAL_PWREx_EnableUltraLowPower();                               
  HAL_PWREx_EnableFastWakeUp();                               
  __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_StopWakeUpClock_MSI);
}

//--待机等待--
void StandbySystem(void)
{       
        uint8_t u8Buf[2]={0x88,0x88};
       
        if(HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 20, RTC_WAKEUPCLOCK_CK_SPRE_16BITS)!=HAL_OK)
        {
                HAL_UART_Transmit(&hlpuart1,u8Buf,2,50);
        }
  else HAL_PWR_EnterSTANDBYMode();                                                                                                                                                                                                               
}

//--停机等待(1~32秒)--
void StopSystem(uint16_t StopTime)
{
        uint32_t u32Time;
        if(StopTime==0) return;
        if(StopTime>=32) u32Time=0xFFFF;
        else u32Time=(StopTime<<11);
        HAL_RTCEx_SetWakeUpTimer_IT(&hrtc,u32Time,RTC_WAKEUPCLOCK_RTCCLK_DIV16);
        HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);
}

//--RTC唤醒中断回调函数--
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
  __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
        HAL_RTCEx_DeactivateWakeUpTimer(hrtc);
}

//--采集AI通道--
static void CollectAI(void)
{
        HAL_GPIO_WritePin(En15V_Port,En15V_Pin,GPIO_PIN_SET);                       
        HAL_GPIO_WritePin(EnBatTest_Port,EnBatTest_Pin,GPIO_PIN_SET);       
        //StopSystem(5);
        //SystemClock_Config();
        HAL_Delay(2000);
        MX_ADC_Init();
        u8CvtIndex=0;
        HAL_ADC_Start_IT(&hadc);
        while(u8CvtIndex<3)
        {
                HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
        }
        HAL_ADC_Stop_IT(&hadc);
        HAL_GPIO_WritePin(En15V_Port,En15V_Pin,GPIO_PIN_RESET);       
        HAL_GPIO_WritePin(EnBatTest_Port,EnBatTest_Pin,GPIO_PIN_RESET);
}



收藏 评论5 发布时间:2017-10-19 13:50

举报

5个回答
废鱼 回答时间:2017-10-19 16:22:15
复位以后这个也清除不掉,需要手动清除。我测试407是这样的。
该标志由软件写零清除。
软件必须在 WUTF 再次置 1 的 1.5 个 RTCCLK 周期之前将该标志清零。
废鱼 回答时间:2017-10-19 14:34:32
楼主,我看了一下RTCwakeup以后,没有再次设置下次唤醒时间。加上这个再测试一下。
abc5504@139.com 回答时间:2017-10-19 15:42:04
安 发表于 2017-10-19 14:34
楼主,我看了一下RTCwakeup以后,没有再次设置下次唤醒时间。加上这个再测试一下。 ...

谢谢您!
直接原因是PWR_CSR寄存器中的WUF标志置位,且进入待机时未清除。
abc5504@139.com 回答时间:2017-10-19 15:48:44
但是仍然有疑惑:WUF标志是怎么设置上的?待机唤醒后执行复位流程,在程序开始处会检查是否待机复位,如果是会清除WUF标志(代码如下);
if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB))
{
        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
        HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
}
进入停止模式,被唤醒定时器唤醒后,中断处理回调函数中也会清除WUF标志(代码如下)
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
    HAL_RTCEx_DeactivateWakeUpTimer(hrtc);
}
xiaosanguo 回答时间:2018-3-8 16:23:30
楼主你好!能把你的源程序发我看一下吗?初学者对这方面很感兴趣,想多了解了解。谢谢了!

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版