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

STM32F0的LL库使用(五)

[复制链接]
lebment 发布时间:2018-3-2 22:58
接上篇:STM32F0的LL库使用(四)




题外话:首先感谢社区的U盘,虽然还没有到货。这些贴子只是给各位了解LL库的渠道,我只不过是整理了资料。二月做了手术,没能把LL库再写三个。三月四月还要准备复试,不管怎么样,肯定还是会把这个片上的外设什么的都写完。
  
不能说这是教程,这几个帖子有点乱,那我们这次来搞低功耗模式
  硬件:STM32F030F4P6核心板,STLINK-V2-1(即NUCLEO板载仿真器拆下来的)
  软件:CubeMX(V2.4.0)+IAR(V8.20)
         LL库版本V1.9.0
  既然是低功耗模式配置嘛,很简单: 1.PNG GPIO中断用来进入低功耗模式。
  
不多说直接主程序:
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
    LL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);  
    LL_mDelay(100);
  }
  /* USER CODE END 3 */



进入低功耗模式灯就不闪。

  重点是中断服务函数:
void LL_EXTI_LINE_5_CallBack(void)
{
  uint8_t Entry=0;
  uint16_t Count=0;
     LL_mDelay(10);
  if(LL_GPIO_IsInputPinSet(GPIOA,LL_GPIO_PIN_5)==SET)  
  {
       for(;Count<3000;Count++)  
       {
         LL_mDelay(1);
         if( (LL_GPIO_IsInputPinSet(GPIOA,LL_GPIO_PIN_5)!=SET))
          {Entry=0;Count=0;}
       }
      
      for(;Count<3000;Count++)  
       {
         LL_mDelay(1);
         if( (LL_GPIO_IsInputPinSet(GPIOA,LL_GPIO_PIN_5)!=SET))
          {Entry=1;Count=0;}
         else
          {Entry=3;Count=0;}
       }
       if(Entry==0) EnterStandbyMode();
      
       if(Entry==1) EnterSTOP_LPREGUMode();
      
       if(Entry==3)  
       {
         for(;Count<5;Count++)   
         {
           LL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);  
           LL_mDelay(50);
         }
       }
  }
   
}

可以参考我前面的那个GPIO中断。

然后是进入低功耗模式函数(节选自官方例程),HAL库更简单。其实我个人感觉这段完全可以用HAL库代替了。不知道各位大神对此有什么看法?
void EnterStandbyMode(void);
void EnterSTOP_LPREGUMode(void);

void EnterStandbyMode(void)
{
  /* Disable all used wakeup sources */
  LL_PWR_DisableWakeUpPin(LL_PWR_WAKEUP_PIN1);
  /* Clear all wake up Flag */
  LL_PWR_ClearFlag_WU();
  /* Enable wakeup pin */
  LL_PWR_EnableWakeUpPin(LL_PWR_WAKEUP_PIN1);
  /** Request to enter STANDBY mode
    * Following procedure describe in STM32F0xx Reference Manual
    * See PWR part, section Low-power modes, Standby mode
    */
  /* Set STANDBY mode when CPU enters deepsleep */
  LL_PWR_SetPowerMode(LL_PWR_MODE_STANDBY);
  /* Set SLEEPDEEP bit of Cortex System Control Register */
  LL_LPM_EnableDeepSleep();
  
  /* Request Wait For Interrupt */
  __WFI();
}

void EnterSTOP_LPREGUMode(void)
{
  //所有的GPIO设置为analog模式,减小电流消耗
  LL_GPIO_InitTypeDef gpio_initstruct = {LL_GPIO_PIN_ALL,
                                         LL_GPIO_MODE_ANALOG,
                                         LL_GPIO_SPEED_FREQ_HIGH,
                                         LL_GPIO_OUTPUT_PUSHPULL,
                                         LL_GPIO_PULL_NO,
                                         LL_GPIO_AF_0};
  
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA
                           |LL_AHB1_GRP1_PERIPH_GPIOB
                           |LL_AHB1_GRP1_PERIPH_GPIOF);

  LL_GPIO_Init(GPIOA, &gpio_initstruct);
  LL_GPIO_Init(GPIOB, &gpio_initstruct);
  LL_GPIO_Init(GPIOF, &gpio_initstruct);

  LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOA
                            |LL_AHB1_GRP1_PERIPH_GPIOB
                            |LL_AHB1_GRP1_PERIPH_GPIOF);

  /** Request to enter STOP_LPREGU mode
    * Following procedure describe in STM32F0xx Reference Manual
    * See PWR part, section Low-power modes, STOP_LPREGU mode
    */
  /* Set STOP_LPREGU mode when CPU enters deepsleep */
  LL_PWR_SetPowerMode(LL_PWR_MODE_STOP_LPREGU);
  /* Set SLEEPDEEP bit of Cortex System Control Register */
  LL_LPM_EnableDeepSleep();  
  /* Request Wait For Interrupt */
  __WFI();
}

  可以开始弄个按键接上去然后观察了,俩按键,一个接GPIO中断,一个SYS_WKUP。观察现象,有错就在仔细查查,我这边没问题。


收藏 1 评论10 发布时间:2018-3-2 22:58

举报

10个回答
MrJiu 回答时间:2018-3-3 13:40:48
支持一个!!!
zero99 回答时间:2018-3-5 08:48:38
支持,最近又开始更新了啊
U盘今天会寄的,记得用之前帖子中的方法查快递啊~
板子粉丝 回答时间:2018-3-5 09:31:29
继续跟着楼主学习
lebment 回答时间:2018-3-5 16:36:33
zero99 发表于 2018-3-5 08:48
支持,最近又开始更新了啊
U盘今天会寄的,记得用之前帖子中的方法查快递啊~
...

再次感谢啊
lebment 回答时间:2018-3-5 16:36:52
板子粉丝 发表于 2018-3-5 09:31
继续跟着楼主学习

你们才是大佬啊
lebment 回答时间:2018-3-5 16:37:28
MrJiu 发表于 2018-3-3 13:40
支持一个!!!

谢谢!
板子粉丝 回答时间:2018-3-6 08:41:33
坐等楼主的(六)
zero99 回答时间:2018-3-9 14:40:48
感谢分享,已汇总到3月技术原创:
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
lebment 回答时间:2018-3-9 23:02:59
板子粉丝 发表于 2018-3-6 08:41
坐等楼主的(六)

要准备复试了,下个月发SPI,I2C
ChenStarZi 回答时间:2019-5-1 10:51:49
大佬求教,我用的STM32L0单片机,想要使用LL库,主要是长按3秒开关机和串口等,有部分对时序要求挺严格的,用MSI的时钟无法进行,只能用HSI,但是直接用Stop模式时功耗降不下来,想要切换至MSI进行降功耗,用的是LL_RCC_DeInit(),想知道再次唤醒时在中断里的延时应该怎么做,才能保证开关机的三秒

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版