STM32第十四课:低功耗模式和RTC实时时钟

文章目录

  • 需求
  • 一、低功耗模式
    • 1.睡眠模式
    • 2.停止模式
    • 3.待机模式
  • 二、RTC实现实时时钟
    • 1.寄存器配置流程
    • 2.标准库开发
    • 3.主函数调用
  • 三、需求实现代码


需求

1.实现睡眠模式、停止模式和待机模式。
2.实现RTC实时时间显示。


一、低功耗模式

  电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。
   在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。
   因此, STM32 有专门的电源管理外设监控电源并管理设备的运行模式, 确保系统正常运行,并尽量降低器件的功耗。
  简而言之,低功耗模式就是为了保证移动设备的长时间运行。
从主控芯片角度上来说,如何降低功耗:
1、降低CPU的主频 72M->48M。
2、将不必要的片上外设关闭,对应的时钟也关闭。
3、设备可以设置低功耗模式。
在这里插入图片描述
在这里插入图片描述

1.睡眠模式

首先,我们先看最简单的睡眠模式。
想要设置睡眠模式,只用直接在主函数中根据需求添加__WFI();和__WFE();函数就行。
若是想用中断唤醒就用__WFI();
  想用事件唤醒就用__WFE();

#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"
#include "delay.h"int main()
{NVIC_SetPriorityGrouping(5);//两位抢占两位次级Usart1_Config(); Delay_ms(2000);KEY1_Exti_PA0_init();printf("睡眠1\r\n");__WFI();printf("睡眠2\r\n");while(1){													}		return 0;
}

在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设, CM3 核心的外设全都还照常运行。
在这里插入图片描述
WFI和WFE 命令,它们实质上都是内核指令,只是在库文件 core_cm3.h 中把这些指令封装成了函数。

2.停止模式

想进入停止模式需要在调用指令前设置一些寄存器位。
而STM32 标准库把这部分的操作封装到 PWR_EnterSTOPMode 函数中了。所以我们直接使用即可。

#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"
#include "delay.h"
#include "string.h"
#include "key.h"int main()
{NVIC_SetPriorityGrouping(5);//两位抢占两位次级Usart1_Config(); Delay_ms(2000);KEY1_Exti_PA0_init();printf("停止1\r\n");PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);SystemInit();printf("停止2\r\n");while(1){																}return 0;
}

  在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。
停止模式可以由任意一个外部中断(EXTI)唤醒(此处用的就是key1使能EXTI来唤醒),在停止模式中可以选择电压调节器为开模式或低功耗模式。
在这里插入图片描述

  进入停止模式后, STM32 的所有 I/O 都保持在停止前的状态,而当它被唤醒时, STM32 使用 HSI 作为系统时钟(8MHz)运行,由于系统时钟会影响很多外设的工作状态,所以一般我们在唤醒后会重新开启 HSE,把系统时钟设置回原来的状态。

3.待机模式

待机模式库函数也有封装好的代码,直接用就行。
待机模式,它除了关闭所有的时钟,还把 1.8V 区域的电源也完全关闭了。(除了被使能了的用于唤醒的 I/O,其余 I/O 都进入高阻态)
简单来说,就是从待机模式唤醒后,会从头开始执行程序,类似于复位。

它有四种唤醒方式:

  1. WKUP(PA0)引脚的上升沿。
  2. RTC 闹钟事件。
  3. NRST 引脚的复位。
  4. IWDG(独立看门狗)复位。

本例程使用的是KEY1上升沿唤醒。

#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"
#include "delay.h"
#include "string.h"
#include "key.h"
uint8_t key3flag,cntt;void EnterStanbdy(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//选择WKUP唤醒PWR_WakeUpPinCmd(ENABLE);//进入待机模式PWR_EnterSTANDBYMode();//退出待机模式之后,由于SRAM电压关了,所以清空了,退出之后代码需要重新运行
}int main()
{NVIC_SetPriorityGrouping(5);//两位抢占两位次级Usart1_Config(); SysTick_Config(72000);Led_Init();key_Init();while(1){	if(ledcnt[0]>=ledcnt[1]){//过去500msledcnt[0]=0;/***LED1闪烁任务***/Led_Toggle(1);printf(" LED闪烁 \r\n");cntt++;cntt%=100;}if(keycnt[0]>=keycnt[1]){//过去10mskeycnt[0]=0;//按键非阻塞检测key3flag = key_value();if(key3flag == 2){			printf("进入待机模式\r\n");EnterStanbdy();}}														}return 0;
}

在这里插入图片描述

二、RTC实现实时时钟

  实时时钟是一个独立的定时器。 RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
  RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后, RTC的设置和时间维持不变。
  系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问:
● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟。
● 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。

RTC内部电路
在这里插入图片描述

1.寄存器配置流程

在这里插入图片描述
RTC 从配置上分两大部分:时钟的配置和定时器的配置。
时钟的配置:可以直接访问,直接由RCC的BDCR来配置时钟:时钟源的选择。
定时器的配置:不可以直接访问,因为定时器相关的寄存器在备份区域。
1、 使能备份区域访问— PWREN、BKPEN
a) 开电源控制器以及备份区的时钟
b) 电源PWR_CR的DBP置1
2、 配置分频。
3、 设置计数器计数值。
4、 需要开中断,就开不需要就不开。
5、 需要设置闹钟,就设置闹钟。

2.标准库开发

由于该模块标准库有现成的,所以此处我们使用标准库开发。

该部分在此处:
首先打开官方给的固件库:
然后创建RTC.c和RTC.h编写好基础部分。
将标准库的void RTC_Configuration(void)直接整个函数copy过来。
接下来一行一行看:

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);PWR_BackupAccessCmd(ENABLE);

该段代码就是使能PWR和BKP的时钟并使能,使备份访区能够访问。

  /* Reset Backup Domain */BKP_DeInit();//强制后备区域复位

此处可有可无,是为了防止之前有人设置过备份区,保险起见的话就加上。

  /* Enable LSE */RCC_LSEConfig(RCC_LSE_ON);//使能外部低速时钟/* Wait till LSE is ready */while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)//等待低速时钟就绪{}RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//选择RTC的时钟源RCC_RTCCLKCmd(ENABLE);//使能RTC时钟

时钟源的配置:1.打开LSE。2.等待低速时钟稳定。3.配置RTC时钟源为LSE。

RTC_WaitForSynchro();//等待APB1和RTC时钟同步/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();//等待上次写操作完成
RTC_EnterConfigMode();//进入配置模式

配置完RTC后需要等待一会儿使时钟源同步。
最后等待上次完上次写操作后就可以配置了。

 RTC_SetPrescaler(32767);RTC_WaitForLastTask();

将频率配置为1ms一次。(每操作一次就等待一下)

  RTC_SetCounter(ret);

设置一下初始值

	int ret;struct tm info;info.tm_year = 2024 - 1900;info.tm_mon = 7 - 1;info.tm_mday = 1;info.tm_hour = 4;info.tm_min = 10;info.tm_sec = 0;info.tm_isdst = -1;ret = mktime(&info);if(ret==-1){printf("时间获取出错\r\n");return;}printf("获取到秒数为%d\r\n",ret);

上面是初始值的由来
最后退出并保存

  RTC_ExitConfigMode();RTC_WaitForLastTask();

3.主函数调用

在主函数中直接定义一个32位的值承接一下秒数,然后用localtime()函数转换为标准时间显示格式打印即可。
在这里插入图片描述


三、需求实现代码

main.c

#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"
#include "delay.h"
#include "string.h"
#include "pwm.h"
#include "adc.h"
#include "su03t.h"
#include "dht11.h"
#include "kqm.h"
#include "key.h"
#include "RTC.h"uint8_t key3flag,cntt;
uint32_t sec=0;
void EnterStanbdy(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//选择WKUP唤醒PWR_WakeUpPinCmd(ENABLE);//进入待机模式PWR_EnterSTANDBYMode();//退出待机模式之后,由于SRAM电压关了,所以清空了,退出之后代码需要重新运行
}int main()
{NVIC_SetPriorityGrouping(5);//两位抢占两位次级Usart1_Config(); SysTick_Config(72000);Led_Init();key_Init();while(1){	sec = RTC_GetCounter();time_t seconds=sec;struct tm *info = localtime(&seconds);if(ledcnt[0]>=ledcnt[1]){//过去500msledcnt[0]=0;/***LED1闪烁任务***/Led_Toggle(1);printf(" LED闪烁 \r\n");printf("本地时间:%d-%02d-%02d %02d:%02d:%02d\r\n",info->tm_year + 1900, info->tm_mon + 1, info->tm_mday,info->tm_hour, info->tm_min, info->tm_sec);cntt++;cntt%=100;}if(keycnt[0]>=keycnt[1]){//过去10mskeycnt[0]=0;//按键非阻塞检测key3flag = key_value();if(key3flag == 2){			printf("进入待机模式\r\n");EnterStanbdy();}}					}return 0;
}

RTC.c

#include "RTC.h"void RTC_Configuration(void)
{int ret;struct tm info;info.tm_year = 2024 - 1900;info.tm_mon = 7 - 1;info.tm_mday = 1;info.tm_hour = 4;info.tm_min = 10;info.tm_sec = 0;info.tm_isdst = -1;ret = mktime(&info);if(ret==-1){printf("时间获取出错\r\n");return;}printf("获取到秒数为%d\r\n",ret);/* Enable PWR and BKP clocks */RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//使能PWR和BKP的时钟/* Allow access to BKP Domain */PWR_BackupAccessCmd(ENABLE);//使能后备区域访问/* Reset Backup Domain */BKP_DeInit();//强制后备区域复位/* Enable LSE */RCC_LSEConfig(RCC_LSE_ON);//使能外部低速时钟/* Wait till LSE is ready */while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)//等待低速时钟就绪{}/* Select LSE as RTC Clock Source */RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//选择RTC的时钟源/* Enable RTC Clock */RCC_RTCCLKCmd(ENABLE);//使能RTC时钟/* Wait for RTC registers synchronization */RTC_WaitForSynchro();//等待APB1和RTC时钟同步/* Wait until last write operation on RTC registers has finished */RTC_WaitForLastTask();//等待上次写操作完成RTC_EnterConfigMode();//进入配置模式//RTC->CRL |= 0x01<<4; /* Enable the RTC Second *///RTC_ITConfig(RTC_IT_SEC, ENABLE);/* Wait until last write operation on RTC registers has finished */// RTC_WaitForLastTask();/* Set RTC prescaler: set RTC period to 1sec */RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) *//* Wait until last write operation on RTC registers has finished */RTC_WaitForLastTask();RTC_SetCounter(ret);RTC_ExitConfigMode();/* Wait until last write operation on RTC registers has finished */RTC_WaitForLastTask();
}

RTC.h

#ifndef _RTC_H_
#define _RTC_H_
#include "stm32f10x.h"
#include "time.h"
#include "stdio.h"
void RTC_Configuration(void);
#endif

led.c

#include "stm32f10x.h"void Led_Init()
{//配置好模式,然后全灭//开APB2时钟RCC->APB2ENR |= 0X01 << 6;//配置PE2--PE5为通用推挽输出GPIOE->CRL &=~(0X0F << 20);//PE5GPIOE->CRL |= 0X03 << 20;GPIOE->CRL &=~(0X0F << 16);//PE4GPIOE->CRL |= 0X03 << 16;GPIOE->CRL &=~(0X0F << 12);//PE3GPIOE->CRL |= 0X03 << 12;GPIOE->CRL &=~(0X0F << 8);//PE2GPIOE->CRL |= 0X03 << 8;//4个引脚均输出高电平GPIOE->ODR |= (0x0F << 2);}
//开关灯
void Led1_Ctrl(int flag)
{if(!!flag){GPIOE->ODR &= ~(0x0F << 2);}else{GPIOE->ODR |= (0x0F << 2);}}void Led_Toggle(int flag)
{GPIOE->ODR ^= 0x01<<(flag+1);
}

key.c

#include "stm32f10x.h"
#include "stdio.h"//PA0
void KEY1_Exti_PA0_init()
{RCC->APB2ENR |= 0x05;//打开GPIO和AFIO时钟GPIOA->CRL &=~(0X0F << 0);//PC4   key2GPIOA->CRL |= 0X04 << 0;AFIO->EXTICR[0] &= ~(0x0F);//配置GPIO映射EXTI线EXTI->RTSR &= ~(0x1); //关闭上升沿检测EXTI->FTSR |= 0x01;  //打开下降沿检测EXTI->IMR |= 0x01; //打开exti的屏蔽位NVIC_SetPriority(EXTI0_IRQn,2);NVIC设置优先级NVIC_EnableIRQ(EXTI0_IRQn); //NVIC使能中断通道
}//exti0的中断服务函数
void EXTI0_IRQHandler(void)
{//判断中断标志是否被置位if((EXTI->PR&(0x1<<0))!=0){//如果置位,就清理标志位EXTI->PR |= 0x1<<0;//写1是清除printf("按键1触发中断\r\n");}
}//PC4
void KEY2_Exti_PC4_init()
{RCC->APB2ENR |= (0x01<<4); //打开GPIOC时钟RCC->APB2ENR |= 0x01; //AFIO时钟GPIOC->CRL &=~(0X0F<<16);//配置PC4   key2GPIOC->CRL |= (0X04<<16);//浮空输入AFIO->EXTICR[1] |= 0x02;//配置GPIOC映射EXTI线,外部中断配置寄存器EXTI->RTSR |= (0x01<<4) ; //打开上升沿检测EXTI->FTSR &= ~(0x1<<4);  //关闭下降沿检测EXTI->IMR |= (0x01<<4); //打开exti的屏蔽位NVIC_SetPriority(EXTI4_IRQn,2);NVIC设置优先级NVIC_EnableIRQ(EXTI4_IRQn); //NVIC使能中断通道
}void EXTI4_IRQHandler(void)
{//判断中断标志是否被置位if((EXTI->PR&(0x1<<4))!=0){//如果置位,就清理标志位printf("按键2触发中断\r\n");EXTI->PR |= (0x1<<4);//写1是清除}
}void key_Init()
{//开时钟RCC->APB2ENR |= 0x01<<4;//PCRCC->APB2ENR |= 0x01<<2;//PA//配置模式GPIOC->CRL &=~(0X0F << 24);//PC6   key4GPIOC->CRL |= 0X04 << 24;GPIOC->CRL &=~(0X0F << 20);//PC5   key3GPIOC->CRL |= 0X04 << 20;GPIOC->CRL &=~(0X0F << 16);//PC4   key2GPIOC->CRL |= 0X04 << 16;GPIOA->CRL &=~0X0F;//PA0   key1GPIOA->CRL |= 0X04;}int Get_Key_Val(void)
{int key_val = 0;if(!!(GPIOA->IDR &(0X01 << 0))==1)key_val = 1;if(!!(GPIOC->IDR &(0X01 << 4))==0)key_val = 2;if(!!(GPIOC->IDR &(0X01 << 5))==0)key_val = 3;if(!!(GPIOC->IDR &(0X01 << 6))==0)key_val = 4;return key_val;
}//PC5
void KEY3_Exti_PC5_init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStructure={0};GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOC, &GPIO_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);EXTI_InitTypeDef EXTI_InitStructure={0};EXTI_InitStructure.EXTI_Line = EXTI_Line5;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_Init(&EXTI_InitStructure);NVIC_SetPriority(EXTI9_5_IRQn,2);NVIC设置优先级00 10NVIC_EnableIRQ(EXTI9_5_IRQn); //NVIC使能中断通道
}//PC6
void KEY4_Exti_PC6_init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStructure={0};GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOC, &GPIO_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6);EXTI_InitTypeDef EXTI_InitStructure={0};EXTI_InitStructure.EXTI_Line = EXTI_Line6;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_Init(&EXTI_InitStructure);NVIC_SetPriority(EXTI9_5_IRQn,2);NVIC设置优先级00 10NVIC_EnableIRQ(EXTI9_5_IRQn); //NVIC使能中断通
}void EXTI9_5_IRQHandler(void)
{//判断中断标志是否被置位if(EXTI_GetITStatus(EXTI_Line5) != RESET){printf("按键3触发中断\r\n");//如果置位,就清理标志位EXTI_ClearITPendingBit(EXTI_Line5);}//判断中断标志是否被置位if(EXTI_GetITStatus(EXTI_Line6) != RESET){printf("按键4触发中断\r\n");//如果置位,就清理标志位EXTI_ClearITPendingBit(EXTI_Line6);}
}//非阻塞按键检测   
uint8_t key_value(void)//10ms执行一次
{static uint16_t keycnt = 0;//用来计数,本函数,进来一次加一次,if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==0){keycnt++;}else if(keycnt>=200){//等待按键松开,如果按下时间超过200*10,认为是长按printf(" 按键3长按 \r\n");keycnt = 0;return 2;}	else if(keycnt>=2){//等待按键松开,如果按下时间超过2*10ms,认为是短按printf(" 按键3短按 \r\n");keycnt = 0;return 1;}	else{//等待按键松开如果按下时间不足20ms,认为这是一次无效按下,或者没有按下return 0;}return 0;
}

delay.c

#include "stm32f10x.h"
#include "delay.h"uint32_t systicktime=0;uint16_t ledcnt[2]={0,1000};//500ms   每个任务执行的时间
uint16_t led2cnt[2]={0,2000};//700ms
uint16_t keycnt[2]={0,10};//10ms检测一次
void SysTick_Handler(void)//1ms调用一次
{//不需要清中断挂起位systicktime++;ledcnt[0]++;led2cnt[0]++;keycnt[0]++;
}void Delay_ms(uint32_t time)
{uint32_t nowtime = systicktime;while(systicktime < time+nowtime);
}void Delay_nus(uint32_t time)
{uint32_t i=0;for(i=0;i<time;i++){delay1us();}    
}void Delay_nms(uint32_t time)
{uint32_t i=0;for(i=0;i<time;i++){Delay_nus(1000);//延时1ms}    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE5(c++)开发日志(3):将前面写的输出日志的方法进行封装

Public下新增一个c类&#xff1a; 选择无属性&#xff0c;因为不需要添加任何东西进去, 也不需要借助里面任何东西。 创建一个命名空间Debug&#xff0c;可以在命名空间内写一点静态方法 &#xff1a; namespace Debug{} static void Print(const FString& message, con…

Jenkins教程-12-发送html邮件测试报告

上一小节我们学习了发送钉钉测试报告通知的方法&#xff0c;本小节我们讲解一下发送html邮件测试报告的方法。 1、自动化用例执行完后&#xff0c;使用pytest_terminal_summary钩子函数收集测试结果&#xff0c;存入本地status.txt文件中&#xff0c;供Jenkins调用 #conftest…

全球AI新闻速递6.28

全球AI新闻速递 1.首款 Transformer 专用 AI 芯片 Sohu 登场。 2.钉钉&#xff1a;宣布对所有AI大模型厂商开放&#xff0c;首批7家接入。 3.华为联合清华大学发布《AI 终端白皮书》。 4.国家卫生健康委&#xff1a;推动AI技术在制定个性化营养、运动干预方案中的应用。 …

1Python的Pandas:基本简介

1. Pandas的简介 Pandas 是一个开源的 Python 数据分析库&#xff0c;由 Wes McKinney 在 2008 年开始开发&#xff0c;目的是为了解决数据分析任务中的各种需求。Pandas 是基于 NumPy 库构建的&#xff0c;它使得数据处理和分析工作变得更加快速和简单。Pandas 提供了易于使用…

项目实战--Spring Boot实现三次登录容错功能

一、功能描述 项目设计要求输入三次错误密码后&#xff0c;要求隔段时间才能继续进行登录操作&#xff0c;这里简单记录一下实现思路 二、设计方案 有几个问题需要考虑一下&#xff1a; 1.是只有输错密码才锁定&#xff0c;还是账户名和密码任何一个输错就锁定&#xff1f;2…

父子节点内容和个数提取

有时我们需要获得菜单的内容和个数&#xff0c;这个时候通常有父子菜单&#xff0c;那么怎么分别获取到他们呢&#xff1f;以下面的智慧物业管理系统为例&#xff0c;有7个父节点&#xff0c;每个父节点下面有子节点。如何把父节点名称和总数&#xff0c;以及子节点的名称和总数…

拆分盘投资策略解析:机制、案例与风险考量

一、引言 随着互联网技术的迅猛发展和金融市场的不断创新&#xff0c;拆分盘这一投资模式逐渐崭露头角&#xff0c;成为投资者关注的焦点。它基于特定的拆分策略&#xff0c;通过调整投资者持有的份额和单价&#xff0c;实现了看似稳健的资产增长。本文旨在深入探讨拆分盘的运…

鸿蒙开发设备管理:【@ohos.multimodalInput.inputEvent (输入事件)】

输入事件 InputEvent模块描述了设备上报的基本事件。 说明&#xff1a; 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import InputEvent from ohos.multimodalInput.inputEvent;InputEvent 系统能力…

WPS图片无法居中、居中按钮无法点击(是灰色的)

在PPT中复制对象到WPS word中后&#xff0c;导致图片一直靠左&#xff0c;而无法居中 直接选中图片是错误的&#xff1a; 这时你会发现居中按钮无法点击&#xff08;是灰色的&#xff09; 正确的是选中图片的前面的部分&#xff0c;然后点击居中&#xff0c;或者Ctrl E

昇思25天学习打卡营第10天|FCN图像语义分割

一、简介&#xff1a; 本篇博客是昇思大模型打卡营应用实践部分的第一次分享&#xff0c;主题是计算机视觉&#xff08;CV&#xff09;领域的FCN图像语义分割&#xff0c;接下来几天还会陆续分享其他CV领域的知识&#xff08;doge&#xff09;。 全卷积网络&#xff08;Fully…

基于Java实现图像浏览器的设计与实现

图像浏览器的设计与实现 前言一、需求分析选题意义应用意义功能需求关键技术系统用例图设计JPG系统用例图图片查看系统用例图 二、概要设计JPG.javaPicture.java 三、详细设计类图JPG.java UML类图picture.java UML类图 界面设计JPG.javapicture.java 四、源代码JPG.javapictur…

深入理解pytest fixture:提升测试的灵活性和可维护性!

在现代软件开发中&#xff0c;测试是保证代码质量的重要环节。pytest作为一个强大的测试框架&#xff0c;以其灵活的fixture系统脱颖而出。本文将详细介绍pytest中的fixture概念&#xff0c;通过具体案例展示其应用&#xff0c;并说明如何利用fixture提高测试的灵活性和可维护性…

EKF+UKF+CKF+PF的效果对比|三维非线性滤波|MATLAB例程

前言 标题里的EKF、UKF、CKF、PF分别为&#xff1a;扩展卡尔曼滤波、无迹卡尔曼滤波、容积卡尔曼滤波、粒子滤波。 EKF是扩展卡尔曼滤波&#xff0c;计算快&#xff0c;最常用于非线性状态方程或观测方程下的卡尔曼滤波。 但是EKF应对强非线性的系统时&#xff0c;估计效果不如…

头文件没有string.h ----- 怎么统计字符串的长度?

字符串的逆序&#xff08;看收藏里面的题&#xff09; 第一种方式&#xff1a; #include <stdio.h> void f(char *p);int main() {char s[1000];gets(s);f(s);printf("%s",s);return 0; }void f(char *p) {int i0;int q,k0;while(p[i]!\0){i;}while(k<i){…

SaaS增长:小型SaaS企业可以使用推荐奖励计划吗

在SaaS&#xff08;软件即服务&#xff09;行业的激烈竞争中&#xff0c;如何快速有效地增长用户数量是每个企业都面临的挑战。对于小型SaaS企业来说&#xff0c;资源有限&#xff0c;如何最大化利用现有资源实现用户增长成为了一个重要议题。在这样的背景下&#xff0c;推荐奖…

git clone中的报错问题解决:git@github.com: Permission denied (publickey)

报错&#xff1a; Submodule path ‘kernels/3rdparty/llm-awq’: checked out ‘19a5a2c9db47f69a2851c83fea90f81ed49269ab’ Submodule path ‘kernels/3rdparty/nvbench’: checked out ‘75212298727e8f6e1df9215f2fcb47c8c721ffc9’ Submodule path ‘kernels/3rdparty/t…

自动点赞,自动评论,自动刷

最近周六日家里没事干了个自动程序。需要的找我&#xff01; 仅供学习&#xff01;&#xff01;&#xff01;&#xff01;目前实现的功能 1.自动打开痘印&#xff0c;头条等多个app 2.自动点赞&#xff0c;自动评论 3.自动养号 4.自动关注 后期逐步实现: 1.继续内容的自动…

阿里云:云通信号码认证服务,node.js+uniapp(vue),完整代码

api文档&#xff1a;云通信号码认证服务_云产品主页-阿里云OpenAPI开发者门户 (aliyun.com) reg.vue <template> <div> <input class"sl-input" v-model"phone" type"number" maxlength"11" placeholder"手机号…

TopK问题与如何在有限内存找出前几最大(小)项(纯c语言版)

目录 0.前言 1.知识准备 2.实现 1.首先是必要的HeapSort 2.造数据 其他注意事项 3.TopK的实现 0.前言 在我们的日常生活中总有排名系统&#xff0c;找出前第k个分数最高的人&#xff0c;而现在让我们用堆来在有限内存中进行实现 1.知识准备 想要实现topk问题首先我们要…