历史上的今天
返回首页

历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2018年09月10日 | STM32L152 STOP模式

2018-09-10 来源:eefocus

目的


配置芯片进入停止模式,RTC唤醒中断唤醒。


完成情况


成功进入停止模式4S,然后由RTC唤醒,ADC、日历、串口等功能成功启动。


步骤


1,进入低功耗模式相关配置


关闭高速时钟; 

RCC中关闭所有外设时钟; 

关闭外设使能;


2,唤醒相关配置


要使能 RTC 唤醒中断,需按照以下顺序操作: 

1. 将 EXTI 线 20 配置为中断模式并将其使能,然后选择上升沿有效。 

2. 配置 NVIC 中的 RTC_WKUP IRQ 通道并将其使能。 

3. 配置 RTC 以生成 RTC 唤醒定时器事件。


void RTC_configration(void)

{

  NVIC_InitTypeDef  NVIC_InitStructure;

  EXTI_InitTypeDef  EXTI_InitStructure;

    RTC_InitTypeDef RTC_InitStructure;



  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);


  /*!< Allow access to RTC */

  PWR_RTCAccessCmd(ENABLE);


 /* Clear WakeUp flag */

  PWR_ClearFlag(PWR_FLAG_WU);


  /*!< Reset RTC Domain */

  RCC_RTCResetCmd(ENABLE);

  RCC_RTCResetCmd(DISABLE);


  /*!< LSE Enable */

  RCC_LSEConfig(RCC_LSE_ON);


  /*!< Wait till LSE is ready */

  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)

  {}


  /*!

  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);


  /*!< Enable the RTC Clock */

  RCC_RTCCLKCmd(ENABLE);


  /*!< Wait for RTC APB registers synchronisation */

  RTC_WaitForSynchro();



    /* Calendar Configuration这里时假设RTC时钟是32.768,如果不是,需要在system设置中更改 */

  RTC_InitStructure.RTC_AsynchPrediv = 0x7F;

  RTC_InitStructure.RTC_SynchPrediv =  0x120; /* (37KHz / 128) - 1 = 0x120*/

  RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;

  RTC_Init(&RTC_InitStructure); 


      /* Set the date: Wednesday January 17th 2017 */

  RTC_DateStructure.RTC_Year =0x11;

  RTC_DateStructure.RTC_Month = RTC_Month_January;

  RTC_DateStructure.RTC_Date =0x13;

  RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Tuesday;

  RTC_SetDate(RTC_Format_BIN, &RTC_DateStructure);//注意设置格式


  /* Set the time to 01h 00mn 00s AM */

  RTC_TimeStructure.RTC_H12     = RTC_H12_PM;

  RTC_TimeStructure.RTC_Hours   = 0x0a;

  RTC_TimeStructure.RTC_Minutes = 0x15;

  RTC_TimeStructure.RTC_Seconds = 0x03; 

  RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure); //注意设置格式     



  /* EXTI configuration *******************************************************/

  EXTI_ClearITPendingBit(EXTI_Line20);

  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);


  /* RTC Wakeup Interrupt Generation: Clock Source: RTCDiv_16, Wakeup Time Base: 4s */

  RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);

  RTC_SetWakeUpCounter(0x0004);


  /* Enable the Wakeup Interrupt */

  RTC_ITConfig(RTC_IT_WUT, ENABLE);  


}


然后在需要进入停止模式的地方运行以下函数


void To_enter_Stop(void)

{


GPIO_InitTypeDef GPIO_InitStructure;    


//1)关闭所有不用的外设及时钟


//2)设置IO


     /* Enable Wakeup Counter */

    RTC_WakeUpCmd(ENABLE);


    /* Enter Stop Mode */

    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

}


3,管脚的配置


所有管脚设置为模拟输入以降低功耗。 

如果需要使能低功耗调试DEBUG,响应管脚保持原有设置。


4,使能低功耗模式下DEBUG


/Enable debug in stop mode/


DBGMCU_Config(DBGMCU_STOP,ENABLE);


RCC_AHBPeriphClockLPModeCmd(RCC_AHBPeriph_GPIOA,ENABLE);


5,退出低功耗模式配置


先配置时钟,然后开启GPIO,然后重新初始化相关外设。 

注意:重新初始化之前Deinit一下,否则有的会重新配置 不成功。例如GPIO


void To_Exit_Stop(void)

{


     RTC_WakeUpCmd(DISABLE);

    /* Enable HSI Clock */

  RCC_HSICmd(ENABLE);


  /*!< Wait till HSI is ready */

  while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);


  /* Enable 64-bit access */

  FLASH_ReadAccess64Cmd(ENABLE);


  /* Enable Prefetch Buffer */

  FLASH_PrefetchBufferCmd(ENABLE);


  /* Flash 1 wait state */

  FLASH_SetLatency(FLASH_Latency_1);


  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);


  while (RCC_GetSYSCLKSource() != 0x04);


  RCC_HCLKConfig(RCC_SYSCLK_Div1);  

  /* PCLK2 = HCLK */

  RCC_PCLK2Config(RCC_HCLK_Div1);


  /* PCLK1 = HCLK */

  RCC_PCLK1Config(RCC_HCLK_Div1);  


     PWR_VoltageScalingConfig(PWR_VoltageScaling_Range1);

  /* Wait Until the Voltage Regulator is ready */

  while (PWR_GetFlagStatus(PWR_FLAG_VOS) != RESET);


    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC |

                        RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOE | RCC_AHBPeriph_GPIOH |

                          RCC_AHBPeriph_GPIOF | RCC_AHBPeriph_GPIOG, ENABLE);


    GPIO_DeInit(GPIOA);

    GPIO_DeInit(GPIOB);

    GPIO_DeInit(GPIOC);

    GPIO_DeInit(GPIOD);

    GPIO_DeInit(GPIOE);

    GPIO_DeInit(GPIOF);

    GPIO_DeInit(GPIOG);

    GPIO_DeInit(GPIOH);



}


推荐阅读

史海拾趣

EKIT公司的发展小趣事

2023年10月,华为坤灵(HUAWEI eKit)在香港成功举办了分销新品发布会。针对香港市场的特点,HUAWEI eKit展示了面向SOHO办公、酒店餐饮、商业地产、零售商超等场景的新品,并通过整合政策、产品、解决方案、服务和数字工具平台等措施,助力香港区域分销伙伴不断开拓中小企业市场。通过与联强国际(香港)有限公司(SYNNEX)的紧密合作,HUAWEI eKit成功吸引了超过100名香港分销商参与此次发布会,进一步巩固了其在香港市场的地位。

A1 PROS公司的发展小趣事

进入2004年,A1 PROS开始着手研发彩色CCD传感器。经过两年的不懈努力,公司在2005年成功开发出3 IC彩色CCD传感器。这一创新产品不仅色彩还原度更高,而且功耗更低、稳定性更强,迅速受到市场的欢迎。随着彩色CCD传感器的推出,A1 PROS的产品线更加丰富,市场竞争力也进一步提升。

华润华晶公司的发展小趣事

在2006年至2007年期间,A1 PROS的技术实力得到了业界的广泛认可。韩国技术信用保证基金将A1 PROS评选为杰出技术公司,这是对A1 PROS在技术研发和创新方面所取得成就的肯定。同时,A1 PROS还被韩国工业银行选定为家族企业,获得了更多的资金支持和发展机会。

Galaxy ( Bel )公司的发展小趣事

在竞争激烈的电子行业中,A1 PROS始终保持对技术创新的追求。公司不断投入研发资金,引进先进的生产设备和技术人才,致力于开发更高性能、更环保、更节能的产品。同时,A1 PROS还积极关注行业动态和市场需求变化,不断调整和优化产品结构和市场策略。正是凭借这种持续创新的精神和对市场变化的敏锐洞察,A1 PROS得以在电子行业中保持领先地位,并引领着行业的发展方向。

以上便是关于A1 PROS公司在电子行业里发展起来的五个故事。这些故事展示了A1 PROS从初创期的黑白CCD业务起步,到成功研发彩色CCD传感器、获得技术认可、拓展国际市场以及持续创新引领行业发展的全过程。虽然这些故事是基于虚构的,但它们反映了电子行业发展的一般规律和趋势,也展现了A1 PROS作为一家优秀电子企业在行业中的成长轨迹和贡献。

Doodle Labs公司的发展小趣事

为了进一步扩大市场份额,Doodle Labs开始寻求国际合作和业务拓展。公司与多家国际知名的无人机制造商和物联网企业建立了合作关系,共同开发新的解决方案和产品。同时,Doodle Labs还积极开拓国际市场,将产品出口到欧洲、北美等地区。这些努力不仅为公司带来了更多的商业机会,也提升了Doodle Labs在国际市场的知名度。

Allied Wire & Cable Inc公司的发展小趣事

随着公司业务的不断发展,Allied公司开始积极拓展产品线,逐渐涵盖了多种类型的电线电缆产品,满足了不同客户的需求。同时,公司还积极开拓新的市场领域,将产品推广至全国范围,并逐渐拓展至国际市场。通过不断的产品创新和市场拓展,Allied公司的业务规模逐渐扩大,市场份额也稳步提升。

问答坊 | AI 解惑

替代ISD2560的语音芯片资料

替代ISD2560的语音芯片资料…

查看全部问答>

单片机的基本功能搞清楚后怎么开始做东西

经过一个暑假,单片机的基本功能搞清楚了。可是还是不知道怎么开始做东西。…

查看全部问答>

窗体WM_PAINT中显示一图片,后来在BUTTON中改了图片路径,但是怎么通知窗体重画呢?

我的窗体WM_PAINT中显示了一图片,后来在某个BUTTON单击中改了图片路径,但是怎么通知窗体重画新的图片呢? WM_PAINT中用SHLoadDIBitmap(L\"路径\\\\windows.bmp\")和Bitblt显示的一个图片 我在一个BUTTON里改变了图片的路径变量, 但是这时候窗体没 ...…

查看全部问答>

PC下的OpenGL跟WINCE下的OpenGL是不是区别很大?整个OpenGL框架是怎么样的?谁封装谁?

PC下的OpenGL跟WINCE下的OpenGL是不是区别很大?整个OpenGL框架是怎么样的?谁封装谁?…

查看全部问答>

MVME5500怎么初始化?

如题。。多谢高手指点。写的详细点。谢谢。…

查看全部问答>

ARM 中的分支指令 B 的问题

B  为什么限制在当前指令的正负32MB范围内   还有  就是 ARM 指令为字对齐,最低2位地址固定为0 是什么意思? 我看了一下B 的指令编码格式   但是不懂  我总以为范围应是  16MB  ...…

查看全部问答>

请帮忙解答一下下面程序

static void vSwap_Flashes (void) {   UINT32 ui32a;   UINT32 ui32b;   ui32a = GLOB_prImp->br0;   ui32b = GLOB_prImp->br1;   GLOB_prImp->br0 = ui32b;   GLOB_prImp->b ...…

查看全部问答>

请大家介绍几个Wince 5.0开发的论坛?

wince 5.0的开发都是自学的,最好是有哪位能够提供一份wince 5.0开发的源代码给我,十分感谢!…

查看全部问答>

让数码管显示不同数字

我是个初学者 想知道怎样让8个数码管同时显示不同的数字 我的单片机是没有锁存器的 最好编个程序出来看看 谢谢…

查看全部问答>