MM32W 低功耗模式的休眠和时钟配置函数
0 2023-03-22

MM32W无线MCU系列产品应用笔记 —— 低功耗BLE蓝牙应用


本章我们来看一下低功耗模式下用到的休眠和时钟配置函数。

目前MM32W0系列有n4和q1两个版本,n4主要针对需要大容量的应用方案,q1针对超低功耗精简型的应用方案,两个型号的低功耗编程操作方式相同,不同的只是MCU的时钟系统控制方式,在参考程序已经提供不同的模式下功能,用户只要改变相对应的宏定义即可实现对应的低功耗功能。

休眠函数

对于低功耗应用来说,休眠是非常关键的一个功能。开启蓝牙广播时MM32W0的控制模块有三种工作模式:正常模式、睡眠模式和停机模式。在stop模式下,射频模块都会通过IRQ引脚定时触发一个外部中断,可以借此唤醒STOP模式中的控制模块。

在阻塞模式中,休眠是蓝牙服务通过调用void McuGotoSleepAndWakeup(void) 函数实现的,对于中断模式,则是用户在代码中主动调用IrqMcuGotoSleepAndWakeup()函数来实现。

void McuGotoSleepAndWakeup(void) // auto goto sleep AND wakeup, porting api

{

if ((SleepStop)&&                                            //开启休眠功能

 (TxTimeout SCR &= 0xfb;

__WFE();

}else{                                         //STOP

SysClk48to8();                          //HSI 6分频

SCB->SCR |= 0x4;

__WFI();                                 //进入STOP模式

                                         

RCC->CR|=RCC_CR_HSION;   //从STOP模式唤醒,使能时钟

SysClk8to48();                                      //PLL倍频至48MHz

}

}

}

            

void IrqMcuGotoSleepAndWakeup(void) // auto goto sleep AND wakeup, porting api

{

if(ble_run_interrupt_McuCanSleep() == 0) return;

#ifdef USE_UART

if ((SleepStop)&&

 (TxTimeout SCR &= 0xfb;

__WFE();                                  //控制模块进入睡眠模式

}else{                                        //stop

SleepStatus = 2;

SysClk8M();

SCB->SCR |= 0x4; 

SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; 

__WFI();

}

}

#endif

}

在中断方式中,需要在中断处理函数中重新配置时钟:

void EXTI4_15_IRQHandler(void)

{

EXTI_ClearITPendingBit(EXTI_Line8); 

if(2 == SleepStatus){                //stop

RCC->CR|=RCC_CR_HSION;               //HSI使能

RCC->CR |= RCC_CR_PLLON;            //PLL使能

RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

SysTick_Config(48000);

}

SleepStatus = 0; 

ble_run(0); 

}

时钟配置

进入低功耗前后需要配置时钟,从低功耗模式恢复时,时钟默认设置为HSI6分频,需要重新配置系统时钟。

注意:下面函数属于蓝牙库接口,没有用到也不要删除。

相关时钟配置:

void SysClk48to8(void)1

{

RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);//selecting PLL clock as sys clock

    

while (RCC_GetSYSCLKSource() != 0x0)

{}

    

RCC->CR &=~(RCC_CR_PLLON);          //clear PLL

SysTick_Config(8000);

}

 

void SysClk8to48(void)         //从STOP模式中恢复

{

SetSysClock_HSI(4);//HSI:12*4=48M

 

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//selecting PLL clock as sys clock

while (RCC_GetSYSCLKSource() != 0x08)

{}

SysTick_Config(48000);

}

void SetSysClock_HSI(u8 PLL)      //重新配置HSI和PLL

{  

unsigned char temp=0;   

  

RCC->CR|=RCC_CR_HSION;  

while(!(RCC->CR&RCC_CR_HSIRDY));

RCC->CFGR=RCC_CFGR_PPRE1_2; //APB1=DIV2;APB2=DIV1;AHB=DIV1;

  

RCC->CFGR&=~RCC_CFGR_PLLSRC;              //PLLSRC ON 

  

RCC->CR &=~(RCC_CR_PLLON);                    

  

RCC->CR &=~(0x1fCR|=(PLL - 1) ACR=FLASH_ACR_LATENCY_1|FLASH_ACR_PRFTBE;       
//FLASH 2 delay clk cycles

  

RCC->CR|=RCC_CR_PLLON; //PLLON

while(!(RCC->CR&RCC_CR_PLLRDY));//waiting for PLL locked

RCC->CFGR&=~RCC_CFGR_SW;

RCC->CFGR|=RCC_CFGR_SW_PLL;//PLL to be the sys clock

while(temp!=0x02)    //waiting PLL become the sys clock

{    

temp=RCC->CFGR>>2;

temp&=0x03;

} 

}

以上时钟配置只是针对MM32W0系列的n4版本,在q1版不需要以上时钟操作。MM32W051PFB(q1)蓝牙功耗参数:

在SleepStop设置成0x02,MCU将会进入STOP模式,在保持 SRAM 和寄存器内容不丢失的情况下,停机模式可以达到最低的电能消耗。在停机模式下,HSI 的振荡器和 HSE 晶体振荡器被关闭。可以通过任一配置成 EXTI 的信号或者看门狗不复位方式把微控制器从停机模式中唤醒,EXTI 信号可以是 16 个外部 I/O 口之一、 PVD 的输出的唤醒信号。。STOP模式下无法下载调试程序。为了方便调试,可以在程序开始时加入一个延时,这样每次复位都有一段时间可以下载程序。 

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • 怎样才能快速学习8051单片机

    [导读]单片机是微机的一种,现时有8051、AVR、ARM7、ARM9等系列,其中 “8051”是源自于Intel公司的MCS-51系列芯片,但目前不同生产厂商

    前天
  • 什么是DDR?DDR的分类有哪些?

    存储器可分为易失性存储器和非易失性存储器两类,前者在掉电后会失去记忆的数据,后者即使在切断电源也可以保持数据

    05-31
  • 51单片机RAM 数据存储区、位寻址区、数据缓冲区

    [导读]1.RAM keil C语言编程RAM是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过12

    05-30
  • STM32使用库函数驱动LED灯编写程序步骤

    [导读] 一、熟悉GPIO结构体以下这个结构体是我从官方手册中获取的:[cpp] view plain copy print?typedef struct{u1

    05-30
  • 你知道Linux下的ds18b20驱动吗?

    [导读]今天在各位前辈已有成就的基础上花了两天时间终于把这个驱动给搞定了,从开始编译成模块看效果,进行调试,再到编译进内核,最后又编译了一个界面出来,虽说大多数

    05-29
  • 一文区分AT89C51和AT89C52

    [导读]AT89C51和AT89C52是单片机的两种型号。主要区别是容量不同。at89c51最多支持4KB的程序,at89c52则最多支持8KB的程序。

    05-29
  • 功能强大的时钟中断应用分析

    [导读]在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。我们可以把一些例行的

    05-29
  • 一文告诉你MCS-51单片机有几个工作寄存器?

    [导读]工作寄存器有4组,每组都是8个工作寄存器R0~R7,通过PSW中的RS1、RS0两位来选择使用哪一组,如果不选,默认是选择第0组。

    05-29
  • 一文详解STC89C52单片机

    [导读]STC89C52单片机简介

    05-29
  • AVR单片机时熔丝位配置出现的一些问题分析

    [导读]AVR单片机的熔丝位配置是AVR单片机初学者很容易出错的地方,其实只要注意一些事项,还是能够尽量避免单片机被锁死,即使单片机被锁死,也可以使用一些方法解

    05-29
  • 一文详解STC89C52处理芯片

    [导读]主要性能: 与MCS-51单片机产品兼容 、8K字节在系统可编程Flash存储器、 1000次擦写周期、全静态操作:0Hz~33Hz 、三级加密程序存储

    05-29
  • 一文详细分析51单片机中断问题

    [导读]该寄存器用于设置定时/计数器的工作方式,低四位用于定时器0,高四位用于定时器1。 GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或

    05-29
下载排行榜
更多
广告