[STM32 - 野火] - - - 固件库学习笔记 - - -十一.电源管理系统
一、电源管理系统简介
电源管理系统是STM32硬件设计和系统运行的基础,它不仅为芯片本身提供稳定的电源,还通过多种电源管理功能优化功耗、延长电池寿命,并确保系统的可靠性和稳定性。
二、电源监控器
作用:保证STM32芯片工作在它自己要求的一个电压范围内。
STM32芯片主要通过引脚VDD从外部获取电源,在它的内部具有电源监控器用于检测VDD的电压,以实现复位功能及掉电紧急处理功能,保证系统地运行。
2.1 上电复位(POR)与掉电复位(PDR)
POR:Power On Reset;
PDR:Power Down Reset;
当VDD/VDDA低于指定的限位电压VPOR/VPDR时,系统保持为复位状态,而无需外部复位电路。
-
在刚开始上电,电压低于VPOR(约1.92V)时,系统保持在上电复位状态,当VDD电压持续上升到大于VPOR时,系统开始正常运行;
-
在系统正常运行时,检测到VDD电压下降至低于VPDR阈值(约1.88V)时,系统会进入掉电复位状态。
VPOR与VPDR的差值大概在40mv。
2.2 可编程电压监控器(PVD)
除了POR与PDR功能,STM32还提供了PVD用于实时检测VDD电压:当检测到VDD电压低于编程的VPVD阈值时,会向内核产生一个PVD中断(EXTI16线中断,该中断不用手动设置)以使内核在复位前进行紧急处理。
当VDD下降到PVD阀值以下和(或)当VDD上升到PVD阀值之上时,根据外部中断第16线的上升/下降边沿触发设置,就会产生PVD中断。
使用PVD可配置8个等级。
其中,上升沿和下降沿分别表示VDD电压上升过程及下降过程的阈值。
PVD可以理解为POR与PDR的升级版,对电压值可编程,复位前通过中断通知。
三、电源系统
STM32的电源系统主要分为ADC电路、调压器供电电路以及备份域电路三个部分。
3.1 ADC电路(VDDA供电区域)
ADC电路的工作电源使用VDDA引脚输入,使用VSSA作为独立的地连接,VRED引脚则为ADC提供测量使用的参考电压。
-
为什么ADC配有单独的电源接口?
- 为了提高转换精度,方便进行单独的滤波。
VDDA供电区域包含模数转换的一部分。
3.2 调压器供电电路(VDD/1.8V供电区域)
调压器供电电路是STM32电源系统中最主要的部分,为备份域及待机模式以外的所有数字电路供电,其中包括内核、数字外设(例如串口、GPIO口、CAN口等)以及RAM。
调压器的输出电压约为1.8V。
调压器可以工作在运行模式、停止模式以及待机模式。
-
在运行模式下,1.8V域全功率运行;
-
在停止模式下 1.8V 域运行在低功耗状态, 1.8V 区域的所有时钟都被关闭,相应的外设都停止了工作,但它会保留内核寄存器以及 SRAM 的内容;
-
在待机模式下,整个 1.8V 域都断电,该区域的内核寄存器及 SRAM 内容都会丢失 (备份区域的寄存器不受影响);
除了后备供电区域外的所有数字逻辑都包含在VDD供电区域,VDD供电区只包含数字逻辑,不包含模拟。
CPU核心就是cortex m3内核,电压调节器用来调节供给cortex内核是否供电。换句话说,cortex核心由电压调节器单独供电。
3.3 备份域电路
备份域电路给晶振、时钟供电。
STM32 的 LSE 振荡器、 RTC 及备份寄存器这些器件被包含进备份域电路中,这部分的电路可以通过 STM32 的 VBAT 引脚获取供电电源,在实际应用中一般会使用 3V 的钮扣电池对该引脚供电。
上图中的电源开关结构,类似于下图中的二极管。
后备供电区域由VBAT与VDD选择供电:
- 当主电源供电时,上面是3.3V大于下面纽扣电池的输出电压,主电源供电给MCU;
- 当主电源掉电时,就由纽扣电池给MCU供电。
BDCR寄存器:备份域寄存器,可以往这个寄存器中存储一些数据,主电掉电后不会丢失(有纽扣电池)。
四、低功耗模式
按功耗由高到低排列, STM32 具有运行、睡眠、停止和待机四种工作模式。
上电复位后 STM32处于运行状态时,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗。
这三种模式中,电源消耗不同、唤醒时间不同、唤醒源不同,用户需要根据应用需求,选择最佳的低功耗模式。
4.1 睡眠模式
在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设, CM3 核心的外设全都还照常运行。
- 进入睡眠模式:通过执行WFI(Wait For Interrupt)或WFE(Wait For Event)指令进入睡眠状态。
从睡眠模式唤醒后,程序会在进入睡眠模式的地方进行执行。
-
WFI与WFE的区别:
- WFI需要进入中断服务函数中执行;
- WFE不需要进入中断服务函数中执行,节省一点时间;
4.2 停止模式
在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.2V区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。
停止模式可以由任意一个外部中断 (EXTI) 唤醒,在停止模式中可以选择电压调节器为开模式或低功耗模式。
-
若调压器处于低功耗模式下,唤醒的时间要长一点。(等待调压器恢复)
-
通过SLEEPDEEP位的设置,选择进入睡眠模式还是停止模式。(设置为0进入睡眠模式,设置为1进入停止模式)
4.3 待机模式
待机模式,它除了关闭所有的时钟,还把 1.8V 区域的电源也完全关闭了。
从待机模式唤醒,程序会从启动文件开始执行(相当于复位了)。
待机模式有四种唤醒方式,分别是== WKUP(PA0) 引脚的上升沿==, RTC 闹钟事件,== NRST 引脚的复位==和 IWDG(独立看门狗) 复位。
-
睡眠模式、停止模式以及待机待机模式,若备份域电源正常供电,备份域内的RTC都可以正常运行,备份域内的寄存器的数据会被保存,不受功耗模式影响。
-
在进入待机模式后,除了被使能了的用于唤醒的 I/O,其余 I/O 都进入高阻态。
5、实验设计
5.1 睡眠模式
// main.c文件
#include "stm32f10x.h"
#include "bsp_key.h"
#include "bsp_exti.h"
#include "bsp_systick.h"
#include "usart.h"char str[10] = {0};int main(void)
{EXTI_KEY1_Config();EXTI_KEY2_Config();USART_Config();printf("\r\n 睡眠前 \r\n");__WFI();printf("\r\n 唤醒后 \r\n");printf("\r\n str:%s \r\n", str);while(1){printf("\r\n 睡眠前 \r\n");__WFI();printf("\r\n 唤醒后 \r\n");printf("\r\n str:%s \r\n", str);}}
// stm32f10x_it.c
extern char str[10];
void EXTI0_IRQHandler(void)
{if(EXTI_GetFlagStatus(EXTI_Line_KEY1) != RESET){//LED_G_TOGGLE();strcpy(str, "按键1中断");}EXTI_ClearFlag(EXTI_Line_KEY1);
}// 这里的中断名称不要写成 EXTI4_IRQHandler
void EXTI15_10_IRQHandler(void)
{if(EXTI_GetFlagStatus(EXTI_Line_KEY2) != RESET){//LED_B_TOGGLE();strcpy(str, "按键2中断");}EXTI_ClearFlag(EXTI_Line_KEY2);
}void USART1_IRQHandler(void)
{uint8_t ucTemp;if(USART_GetFlagStatus(DEBUG_USARTx, USART_IT_RXNE) != RESET){strcpy(str, "串口中断");ucTemp = USART_ReceiveData(DEBUG_USARTx);USART_SendData(DEBUG_USARTx, ucTemp);}
}
注意:不建议在中断服务函数中添加打印函数,可能会影响系统的运行速度。
- 可以在中断服务函数中把要打印的数据赋值给变量,在主函数中打印。
在 USART1_IRQHandler 中断服务函数中,如果将函数内容改为:
void USART1_IRQHandler(void)
{uint8_t ucTemp;if(USART_GetFlagStatus(DEBUG_USARTx, USART_IT_RXNE) != RESET){strcpy(str, "串口中断");}
}
在串口上无法看到打印的数据,原因:
-
没有清除接受中断标志位,中断标志位会一直保持在置位状态,导致中断服务函数一直被反复触发,程序一直执行中断服务函数,无法正常执行主函数逻辑。
-
执行了USART_ReceiveData函数会自动清除RXNE标志位。
5.2 停止模式
// main.c文件
#include "stm32f10x.h"
#include "bsp_key.h"
#include "bsp_exti.h"
#include "bsp_rccclkconfig.h"
#include "bsp_systick.h"
#include "usart.h"char str[10] = {0};static void SYSCLKConfig_STOP(void);int main(void)
{EXTI_KEY1_Config();EXTI_KEY2_Config();USART_Config();printf("\r\n 睡眠前 \r\n");SysTick_Delay_ms(500);PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);/* 恢复 HSE 时钟 */SYSCLKConfig_STOP();printf("\r\n 唤醒后 \r\n");printf("\r\n str:%s \r\n", str);while(1){}}/*** @brief 从停止模式唤醒后配置系统时钟:启用HSE、PLL并选择PLL作为系统时钟源。* @param 无* @retval 无*/
static void SYSCLKConfig_STOP(void)
{/* After wake-up from STOP reconfigure the system clock *//* 使能 HSE */RCC_HSEConfig(RCC_HSE_ON);/* 等待 HSE 准备就绪 */while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET){}/* 使能 PLL */RCC_PLLCmd(ENABLE);/* 等待 PLL 准备就绪 */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/* 选择PLL作为系统时钟 */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* 等待PLL被选择为系统时钟 */while(RCC_GetSYSCLKSource() != 0x08){}
}
- 进入了停止模式,退出时如果没有恢复HSE时钟,系统的时钟可能会与进入停止模式的时钟不同,导致一些其他问题,如串口发送错误:
5.3 待机模式
// main.c文件
#include "stm32f10x.h"
#include "bsp_exti.h"
#include "bsp_rccclkconfig.h"
#include "bsp_systick.h"
#include "usart.h"char str[10] = {0};static void SYSCLKConfig_STOP(void);int main(void)
{USART_Config();printf("\r\n 睡眠前 \r\n");SysTick_Delay_ms(500);// 进入待机模式必须开启PWR时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);// 使能 PA0 引脚上升沿唤醒PWR_WakeUpPinCmd(ENABLE);PWR_EnterSTANDBYMode();printf("\r\n 唤醒后 \r\n");printf("\r\n str:%s \r\n", str);while(1){}}
注意:
-
1、进入待机模式时必须开启PWR时钟;
-
2、使用PA0引脚上升沿唤醒,调用PWR_WakeUpPinCmd(ENABLE)即可;
-
3、PA0 引脚上升沿唤醒与复位键唤醒效果相同,系统都会从头开始运行。
5.4 PVD检测
PVD会产生EXTI16中断。
// main.c文件
#include "stm32f10x.h"
#include "bsp_exti.h"
#include "bsp_led.h"
#include "bsp_rccclkconfig.h"
#include "bsp_systick.h"
#include "usart.h"
#include "bsp_pvd.h"int main(void)
{PVD_Config();USART_Config();while(1){}}
// bsp_pvd.c文件
#include "bsp_pvd.h"static void EXTI_PVD_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStruct.NVIC_IRQChannel = PVD_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);
}void PVD_Config(void)
{EXTI_InitTypeDef EXTI_InitStruct;// 配置 NVIC EXTI_PVD_NVIC_Config();// 开启 PWR 时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);/* 选择EXTI的信号源 */EXTI_InitStruct.EXTI_Line = EXTI_Line16;/* EXTI为中断模式 */EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;/* 上升沿中断 */EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;/* 使能中断 */EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStruct);// 3.3V 引脚 的电压低于2.6V会产生中断,其中3.3V引脚与STM32的VDD引脚相连PWR_PVDLevelConfig(PWR_PVDLevel_2V6);PWR_PVDCmd(ENABLE);
}
// bsp_pvd.h文件
#ifndef __BSP_PVD_H
#define __BSP_PVD_H#include "stm32f10x.h"void PVD_Config(void);#endif /* __BSP_PVD_H */
// stm32f10x_it.c文件
void PVD_Handler(void)
{if(PWR_GetFlagStatus(PWR_FLAG_PVDO) == SET){// 此处做电压下降的紧急处理LED_B(ON);}EXTI_ClearITPendingBit(EXTI_Line16);
}
PVD监控VDD的引脚电压,当VDD引脚电压低于设定值时产生PVD中断。
另外,
-
进入睡眠模式、停止模式、待机模式后,不能使用调试功能。
-
进入低功耗模式后,程序下载不进去,解决方法:
-
1、退出低功耗模式再下载(SWD、SCK引脚没有被更改为其他模式);
-
2、接RST复位引脚或按复位按键;
-
相关文章:

[STM32 - 野火] - - - 固件库学习笔记 - - -十一.电源管理系统
一、电源管理系统简介 电源管理系统是STM32硬件设计和系统运行的基础,它不仅为芯片本身提供稳定的电源,还通过多种电源管理功能优化功耗、延长电池寿命,并确保系统的可靠性和稳定性。 二、电源监控器 作用:保证STM32芯片工作在…...

DBO优化最近邻分类预测matlab
蜣螂优化算法(Dung Beetle Optimizer,简称 DBO)作为一种新兴的群智能优化算法,于 2022 年末被提出,其灵感主要来源于蜣螂的滚球、跳舞、觅食、偷窃以及繁殖等行为。 本次使用的数据为 Excel 格式的分类数据集。该数据…...

【深入理解FFMPEG】命令行阅读笔记
这里写自定义目录标题 第三章 FFmpeg工具使用基础3.1 ffmpeg常用命令3.1.13.1.3 转码流程 3.2 ffprobe 常用命令3.2.1 ffprobe常用参数3.2.2 ffprobe 使用示例 3.3 ffplay常用命令3.3.1 ffplay常用参数3.3.2 ffplay高级参数3.3.4 ffplay快捷键 第4章 封装与解封装4.1 视频文件转…...

图形化数据报文转换映射工具
目录 概要整体架构流程技术名词解释技术细节小结 概要 在当今数字化时代,数据的处理和分析是企业、科研机构以及各类组织日常运营的核心环节。数据来源广泛,格式多样,常见的数据格式包括XML(可扩展标记语言)和JSON&a…...

智能体0门槛开发
分享一个智能体开发流程。 2025 年啊,好多专家还有行业报告都觉得这是智能体(AI Agent)应用的头一年。相关的应用在商业、工业、消费等好些领域都到了关键的时候,这意味着从实验室走向大规模实际应用的重要转变。而且呢࿰…...

ssh密钥登录GitHub时一直提示“Error: Permission denied (publickey)”
起因 环境:Windows10 背景:之前就是按照官方说明创建个rsa密钥,在git后台添加上,就行了,近期怎么添加怎么失败,总是“Error: Permission denied (publickey)”的提示! 尝试 各种尝试…...

mapbox加载geojson,鼠标移入改变颜色,设置样式以及vue中的使用
全国地图json数据下载地址 目录 html加载全部代码 方式一:使用html方式加载geojson 1. 初始化地图 2. 加载geojson数据 设置geojson图层样式,设置type加载数据类型 设置线条 鼠标移入改变颜色,设置图层属性,此处是fill-extru…...

考研机试题:打印日期
描述 给出年分m和一年中的第n天,算出第n天是几月几号。 输入描述: 输入包括两个整数y(1<y<3000),n(1<n<366)。 输出描述: 可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。 …...

OpenHarmonyOS 3.2 编译生成的hap和app文件的名称如何配置追加版本号?
找了一圈发现官方的文档都是最新的,3.2很多API都不支持,比如获取OhosAppContext,通过OhosAppContext来获取应用版本号,最终是通过读取app.json5的文件内容来读取版本号,最终修改entry下的hvigorfile.ts如下,…...

【openwrt】openwrt odhcpd配置介绍
odhcpd odhcpd是一个嵌入式DHCP/DHCPv6/RA服务器和NDP中继的进程,odhcpd是一个守护进程,用于服务和中继IP管理协议,以配置客户端和下游路由器。它试图遵循IPv6家用路由器的RFC 6204要求。odhcpd为DHCP、RA、无状态SLAAC和有状态DHCPv6、前缀委派提供服务器服务,并可用于在没…...

基于神经网络的视频编码NNVC(1):帧内预测
在H.266/VVC发布后,基于传统编码框架提升压缩率越来越难,随着深度学习的发展,研究人员开始尝试将神经网络引入编码器。为此,JVET工作组在2020年成立AHG11小组来专门进行基于神经网络的视频编码的研究。 为了方便研究,工…...

Android开发,待办事项提醒App的设计与实现
文章目录 1. 研究目的2. 主要内容3. 运行效果图4. 涉及到的技术点5. 开发环境6. 关于作者其它项目视频教程介绍 1. 研究目的 当今,随着时代的发展和计算机的普及,人们开始利用网络来记录并管理日常的事务,时下这方面的软件数不胜数。各种日程管理软件就是将每天的工作和事务安…...

豆瓣Top250电影的数据采集与可视化分析(scrapy+mysql+matplotlib)
文章目录 豆瓣Top250电影的数据采集与可视化分析(scrapy+mysql+matplotlib)写在前面数据采集(Visual Studio Code+Navicat)1.观察网页信息2.编写Scrapy代码(Visual Studio Code)2.1 创建Scrapy项目`doubanProject`2.2 创建爬虫脚本`douban.py`2.3 修改`douban.py`的代码2…...

MySQL索引——让查询飞起来
文章目录 索引是什么??硬件理解MySQL与存储 MySQL 与磁盘交互基本单位索引的理解B vs B聚簇索引 VS 非聚簇索引索引操作创建主键索引唯一索引的创建普通索引的创建全文索引的创建查询索引删除索引 在现代数据库应用中,查询性能是决定系统响应…...

Springboot集成Elasticsearch8.0(ES)版本,采用JAVA Client方式进行连接和实现CRUD操作
本文章介绍了 springboot t集成Elasticsearch8.0(ES)版本,如何通过 AVA Client方式进行连接和实现CRUD操作 在ES7.15版本之后,ES官方将高级客户端 RestHighLevelClient标记为弃用状态。同时推出了全新的 Java API客户端 Elasticsearch Java API Client,该客户端也将在 Ela…...

【Linux】APT 密钥管理迁移指南:有效解决 apt-key 弃用警告
引言 随着 Debian 11 和 Ubuntu 22.04 版本的推出,APT 的密钥管理方式发生了重大的变化。apt-key 命令被正式弃用,新的密钥管理机制要求使用 /etc/apt/keyrings/ 或 /etc/apt/trusted.gpg.d/ 来存储和管理密钥。这一变化对管理员和普通用户来说至关重要…...

洛谷P1143 进制转换
题目链接:P1143 进制转换 - 洛谷 | 计算机科学教育新生态 题目难度:普及— 解题思路:本题先将输入的数转为10进制,然后取模,最后倒着输出就好了,最后直接上代码 #include<bits/stdc.h> using namespa…...

99.12 金融难点通俗解释:毛利率
目录 0. 承前1. 简述2. 比喻:冰淇淋店赚钱2.1 第一步:准备材料2.2 第二步:卖冰淇淋2.3 第三步:计算毛利率 3. 生活中的例子3.1 好的毛利率3.2 一般的毛利率3.3 差的毛利率 4. 小朋友要注意4.1 毛利率高不一定好4.2 毛利率低不一定…...

HUMANITY’S LAST EXAM (HLE) 综述:人工智能领域的“最终考试”
论文地址:Humanity’s Last Exam 1. 背景与动机 随着大型语言模型(LLMs)能力的飞速发展,其在数学、编程、生物等领域的任务表现已超越人类。为了系统地衡量这些能力,LLMs 需要接受基准测试(Benchmarks&…...

C++从入门到实战(二)C++命名空间
C从入门到实战(二)C命名空间 前言一、C的第一个程序二、命名空间(一)为什么需要命名空间(二)定义命名空间(三)使用命名空间1.通过命名空间限定符:2.使用 using 声明&…...

C# OpenCV机器视觉:实现农作物病害检测
在酷热难耐的夏日,阳光似火舌般舔舐大地。阿强惬意地躺在老家院子摇椅上,哼着小曲,手边放着一碗冰镇西瓜,头顶大槐树宛如巨大遮阳伞,洒下斑驳阴凉。他本想趁假期回老家放松,远离城市喧嚣与代码 “纠缠”。 …...

开源软件协议介绍
一、可以闭源使用/不具传染性的协议 允许商业使用和分发 1、BSD:详细介绍 2、LGPL许可证:详细介绍 3、MPL2.0:详细介绍 二、具有传染性/使用后需要开源自身软件的协议 不建议商业使用 1、GPL许可证:详细介绍...

CLion开发Qt桌面
IDE:CLion Qt Qt版本:5.12 学习正点原子的嵌入式Linux开发板时,使用Qt Creator写代码不是很方便,遂尝试使用CLion搭建Qt开发环境。 一、CLion的Qt环境搭建 1,配置工具链 找到Qt的安装目录,此处为E:\Tools\…...

09_异步加载_单例模式_常量类配置_不可销毁
1.首先在 资源加载服务层ResSvc.cs中添加 自定义异步加载函数 using UnityEngine; using UnityEngine.SceneManagement; //异步加载 命名空间 //功能 : 资源加载服务 public class ResSvc : MonoBehaviour{public void InitSvc(){Debug.Log("Init ResSvc...");}//自定…...

士的宁(strychnine)的生物合成-文献精读104
Biosynthesis of strychnine 士的宁(strychnine) 又名 番木鳖碱 的生物合成 摘要 士的宁(番木鳖碱)是一种天然产物,通过分离、结构阐明和合成努力,塑造了有机化学领域。目前,士的宁因其强大的…...

【开源免费】基于Vue和SpringBoot的常规应急物资管理系统(附论文)
本文项目编号 T 159 ,文末自助获取源码 \color{red}{T159,文末自助获取源码} T159,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

(Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计
源码 论文 下载地址: cc基于JAVA的网络通讯系统设计与实现(源码系统论文)https://download.csdn.net/download/weixin_39682092/90299782https://download.csdn.net/download/weixin_39682092/90299782 第1章 绪论 1.1 课题选择的…...

ray.rllib 入门实践-2:配置算法
前言: ray.rllib的算法配置方式有多种,网上的不同教程各不相同,有的互不兼容,本文汇总罗列了多种算法配置方式,给出推荐,并在最后给出可运行代码。 四种配置方式 方法1 import os from ray.rllib.algori…...

2025-01学习笔记
1.SpEL 第一次知道它的全称 Spring Expression Language(SpEL) Value("${my.property}") private String myProperty; Value("#{2 * 3}") private int computedValue; 2.逃逸分析 逃逸分析:当一个对象在方法中被定…...

多线程执行大批量数据查询
// 创建一个固定大小的线程池ExecutorService executorService Executors.newFixedThreadPool(5);// 创建多个查询任务List<Callable<List<ShopCompareBase>>> tasks new ArrayList<>();//查询门店 切割,分成十份List<List<String>> sho…...