OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2184|回复: 5

STM32L1系列新品低功耗相关问题。

[复制链接]

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
发表于 2019-10-20 15:46:40 | 显示全部楼层 |阅读模式
1金钱

先简述概况:
1.STM32L152芯片,连接了一个AIR208模块(兼容SIM800C,下简称模块)。
2.电路板外接了复位按钮。
3.配置了STOP模式,并希望通过RTC定时唤醒。

再描述问题:
1.上电并使能模块后,32进入STOP模式后,瞬间被唤醒,且并不是被设置的RTC唤醒,没有进入RTC中断。
此时按下复位键,抬起复位键后,程序可运行,且现象不变。

2.在出现1的现象后,重新烧录程序,掉电并失能模块,32进入STOP模式后,瞬间被唤醒,且并不是被设置的RTC唤醒,没有进入RTC中断。
此时按下复位键,抬起复位键后,程序可运行,且现象不变。

3.在出现2的现象后,仅对电路板整体进行掉电再上电,不修改程序,32可按预期进入STOP模式并被RTC定时唤醒。
此时按下复位键,抬起复位键后,程序不可再正常运行,32可进入STOP模式,但无法被唤醒,再次掉电后问题消失。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
 楼主| 发表于 2019-10-20 16:17:13 | 显示全部楼层
再贴上代码:
int main(void)
{       
        uint16_t main_state;
       
        PRIORITY_GROUP_SET(NVIC_PriorityGroup_0);       
        BSP_IwdgInit();
        BSP_TMR_Init();
        BSP_LED_Init();       
        BSP_USART_Init();
        BSP_STMR_Auto_Start(2, 50);

        BSP_VGPRSPower_CTRL(DISABLE);
//        BSP_AIR208Init();
//        AIR208_PowerOn();
       
        BSP_RTC_WKUP_Init(5);
        PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
                       
        while (1)
        {               
                /*系统运行指示灯*/
                if(BSP_STMR_Check(2))
                {
                        BSP_IwdgFeed();
                        BSP_LED_Toggle();
                        BSP_STMR_Auto_Start(2, 50);          //将软件定时器3专用于LED闪烁
                }
        }
}


void BSP_RTC_WKUP_Config(uint32_t RTC_WakeUpCounter)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;

        /* Enable the PWR clock */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

        /* Allow access to RTC */
        PWR_RTCAccessCmd(ENABLE);

        /* LSI used as RTC source clock */
        /* The RTC Clock may varies due to LSI frequency dispersion. */   
        /* Enable the LSI OSC */
        RCC_LSICmd(ENABLE);

        /* Wait till LSI is ready */  
        while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET){}

        /* Select the RTC Clock Source */
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

        /* Enable the RTC Clock */
        RCC_RTCCLKCmd(ENABLE);

        /* Wait for RTC APB registers synchronisation */
        RTC_WaitForSynchro();

        /* EXTI configuration */
        EXTI_ClearITPendingBit(EXTI_Line20);                    //配置RTC_WKUP中断
        EXTI_InitStructure.EXTI_Line = EXTI_Line20;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);

        /* Enable the RTC Wakeup Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);  

        /* Configure the RTC WakeUp Clock source: CK_SPRE (1Hz) */
        RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
        RTC_SetWakeUpCounter(RTC_WakeUpCounter);

        /* Enable the RTC Wakeup Interrupt */
        RTC_ITConfig(RTC_IT_WUT, ENABLE);

        /* Enable Wakeup Counter */
        RTC_WakeUpCmd(ENABLE);
}

/**
  * @brief  该函数用于初始化RTC_WKUP功能
  * @param  RTC_WakeUpCounter:RTC唤醒计数器
  * @retval 无
  */
void BSP_RTC_WKUP_Init(uint32_t RTC_WakeUpCounter)
{
        RTC_InitTypeDef   RTC_InitStructure;

        BSP_RTC_WKUP_Config(RTC_WakeUpCounter);
       
        RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
        RTC_InitStructure.RTC_SynchPrediv = 255;
        RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
        RTC_Init(&RTC_InitStructure);
}

/**
  * @brief  RTC_WKUP中断处理函数
  * @param  无
  * @retval 无
  */
void RTC_WKUP_IRQHandler(void)
{
        if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
        {
                RTC_ClearITPendingBit(RTC_IT_WUT);
                EXTI_ClearITPendingBit(EXTI_Line20);       
               
/** @note
  * 由于STOP被唤醒后,系统自动切换至HSI时钟。需重新初始化RCC时钟
  */
                SystemInit();
        /*唤醒后立即喂狗*/
                BSP_IwdgFeed();
        }
}


回复

使用道具 举报

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
 楼主| 发表于 2019-10-20 16:46:08 | 显示全部楼层
进一步确定,与AIR208模块软件控制无关。
回复

使用道具 举报

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
 楼主| 发表于 2019-10-20 17:08:52 | 显示全部楼层
有一个简单的结论了,JLINK会导致上述的所有异常。拔掉JLINK之后,板子运行正常。
回复

使用道具 举报

23

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-7-14
在线时间
76 小时
 楼主| 发表于 2019-10-20 17:09:38 | 显示全部楼层
感觉把问题发到论坛上自己的解决速率高了500%。很奇怪。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-10-21 03:00:51 | 显示全部楼层
Azer 发表于 2019-10-20 17:09
感觉把问题发到论坛上自己的解决速率高了500%。很奇怪。

说明你自己会一直去努力尝试解决
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-5 12:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表