stm32-定时器输出比较PWM
目录
一、输出比较简介
二、PWM简介
三、输出比较模式实现
1.输出比较框图(以通用定时器为例)
2.PWM基本结构
四、固件库实现
1.程序1:PWM呼吸灯
2.程序2:PWM驱动直流电机
3.程序3:控制舵机
一、输出比较简介

死区生成和互补输出一般用于对电机的控制
二、PWM简介
惯性系统:即要能使人眼产生视觉停留的系统
三、输出比较模式实现

1.输出比较框图(以通用定时器为例)
高级定时器比通用定时器多了个互补输出和死区生成
如右图,两个mos管构成了推挽电路,上管导通下管关闭输出高电平,下管导通上管关闭输出低电平,两管都关闭为高阻态,两管都导通为短路,会对元器件造成损伤,所以两管不能同时导通
互补输出:当单片机要控制这个电路时,就需要两个输出端口,且二者电平要相反,即互补,而这里OC1和OC1N就是互补的两个端口,即互补输出
死区发生器:但是若在上管关闭的瞬间下管就导通,很可能由于器件的不理想而出现上下管都导通的情况,为了避免这种情况发生,于是又是死区发生器,即他可以在上管关闭后延迟一段时间再导通下管,避免同时导通
2.PWM基本结构

四、固件库实现
1.程序1:PWM呼吸灯
1.我使用的是TIM3的CH2的重定义引脚PB5,所以要打开AFIO时钟
2.开启TIM3和GPIO的时钟
3.初始化GPIO结构体。注意:要记得使用库函数进行重定义
4.选择TIM3的时钟输入,可以为内部时钟,外部时钟模式1和2,
外部时钟模式1:来源可以是ITR(其他定时器,多用于定时器级联),可以是ETR(外部时 钟),可以是CH1引脚的边沿,CH1引脚和CH2引脚(多用于输入捕获测频率)
外部时钟模式2:ETR的触发控制模式
5.初始化TIM3结构体--配置PSC,ARR,计数模式,等等
6.初始化OC结构体--PWM模式选择,CCR,输出ref的有效电平
7.定时器使能
//使用TIM3的通道2的重定义引脚PB5-指南者上面是红灯
//我们配置
void PWM_Config()
{//首先开启GPIO时钟//开启AFIO时钟,因为用到了重定义RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);//开启定时器的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//重定义引脚//选择部分重定义GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//初始化GPIO结构体-PB5-输出比较GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽,手册可看GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;GPIO_Init(GPIOB,&GPIO_InitStruct);//选择TIM3的时钟输入TIM_InternalClockConfig(TIM3);//我们直接使用内部时钟//配置TIM结构体TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;//PSCTIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数模式TIM_TimeBaseInitStruct.TIM_Period = 100-1;//ARRTIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//输入滤波器的分频TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//初始化OC结构体TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCStructInit(&TIM_OCInitStruct);//先赋初值,因为我们没有把结构体配置完全TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//模式选择-PWM1TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//输出使能TIM_OCInitStruct.TIM_Pulse = 0;//CCR,这里我们不配置CCR的值,后面用一个库函数直接在主函数 里面配置,实现呼吸灯TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出ref极性,选择有效电平,即ref有效时输出高电平//TIM_OCInitStruct.TIM_OCNPolarity = ;//TIM_OCInitStruct.TIM_OCIdleState = ;//TIM_OCInitStruct.TIM_OCNIdleState = ;//TIM_OCInitStruct.TIM_OutputNState = ;TIM_OC2Init(TIM3,&TIM_OCInitStruct);//启动定时器TIM_Cmd(TIM3,ENABLE);}void PWM_SetCompare2(uint16_t Compare)
{TIM_SetCompare2(TIM3,Compare);
}
main.c#include "stm32f10x.h" // Device header
#include "bsp_led.h"
#include ".\tim\bsp_tim.h"extern uint16_t Num;//定时器都是16位的int i;
void Delay(u32 i)
{u32 temp;SysTick->LOAD=9000*i; //设置重装数值, 72MHZ时SysTick->CTRL=0X01; //使能,减到零是无动作,采用外部时钟源SysTick->VAL=0; //清零计数器do{temp=SysTick->CTRL; //读取当前倒计数值}while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达SysTick->CTRL=0; //关闭计数器SysTick->VAL=0; //清空计数器
}//ARR=99-->PWM一个周期是100,那么分辨率为1%
//占空比 = CCR/(ARR+1)
//频率 = 计数器溢出频率 = CK_PSC/(PSC+1)/(ARR+1) = 72M/720/100= 1000HZ ->1ms
int main()
{LED_GPIO_Config();PWM_Config();while(1){for(i=0;i<=100;i++){PWM_SetCompare2(i);Delay(10);}for(i=100;i>=0;i--){PWM_SetCompare2(i);Delay(10);}}
}
2.程序2:PWM驱动直流电机
具体TIM的配置过程同呼吸灯一样,同样是输出不同的PWM占空比来实现电机的不同速度
我们需要三个引脚,一个输出PWM给电机,两个接电机的控制引脚
- 使用PA2输出PWM,AIN1/2接到PA4/5
- 频率设置为1KHZ(可以自己随便设置)
- 定义一个八位有符号的变量Speed,+:正转 -:反转
- 使用GPIO_SetBits/ResetBits();来设置AIN1/2的电平高低
- 使用按键来改变转速
void PWM_Config()
{//开启时钟//使用TIM2的CH3的PA2RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启PWM引脚//初始化GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽,手册可看GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5 ;GPIO_Init(GPIOA,&GPIO_InitStruct);//选择时基单元的时钟-为内部时钟--定时器上电后默认是内部时钟,故不写这一个也行TIM_InternalClockConfig(TIM2);//初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//配置1KHZ的PWMTIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;//PSC-预分频器TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitStruct.TIM_Period = 100-1;//ARR寄存器-重装载寄存器TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频----滤波器的采样频率,可以由内部时钟直接提供,也可以由内部时钟加一个时钟分频而来,分频系数就是由TIM_ClockDivision决定*/TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//初始化OC-输出比较结构体TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCStructInit(&TIM_OCInitStruct);//因为结构体里面的成员有些是高级定时器采用得到,所以这里就先全部初始化一遍,然后再配置具体的值TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//输出比较模式TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//TIM_OCInitStruct.TIM_Pulse = 50;//CRR TIM_OCInitStruct.TIM_Pulse = 0;//输出要求波型,这里的CRR就不需要了,用固件库的一个函数 TIM_SetCompare3 直接配置CRRTIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性TIM_OC3Init(TIM2,&TIM_OCInitStruct);//CH3通道//启动定时器TIM_Cmd(TIM2,ENABLE);}
//电机控制函数void Motor_SetSpeed(int8_t Speed)//+:正转 -:反转
{if(Speed >= 0){GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_ResetBits(GPIOA,GPIO_Pin_5);TIM_SetCompare3(TIM3,Speed);}else {GPIO_ResetBits(GPIOA,GPIO_Pin_4);GPIO_SetBits(GPIOA,GPIO_Pin_5);TIM_SetCompare3(TIM3,-Speed);}
}
//主函数#include "stm32f10x.h" // Device header
#include ".\tim\bsp_tim.h"
#include ".\KEY\bsp_key.h"uint8_t KeyNum;
int8_t Speed;int main()
{KEY_GPIO_Config();PWM_Config();while(1){KeyNum = Key_Scan();if(KeyNum == 0){Speed += 20;if(Speed > 100){Speed = -100;}}else if(KeyNum == 1){Speed -= 20;if(Speed < -100){Speed = 100;}}Motor_SetSpeed(Speed);}
}
3.程序3:控制舵机

-TB6612驱动板
VM->STLINK的5v
VCC->面包板3.3v
GND->面包板负极
AO1 AO2 接电机
STBY->待机控制引脚,这里不需要待机,接面包3.3v
AIN1/2-> 任意接两个引脚
PWMA->PWM输出控制引脚
驱动VM放在左下角使用PA2输出PWM,AIN1/2接到PA4/5
- 要点:输出如上图右侧所示的PWM波型
- 指南者的PA0引脚为按键1,所以使用TIM2的CH3通道的PA2
- PWM要求频率为50HZ,即总时间20ms,高电平占0.5~2.5ms,这里我们可以给ARR配置20000-1,PSC配置72-1
- 封装Angle转换函数0-50 180->2500 -->y=Angle/180*2500+50, Angle使用浮点型,利于计算
- 使用按键来改变角度
#include "bsp_tim.h"void PWM_Config()
{//开启时钟//使用TIM2的CH3的PA2RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启PWM引脚//初始化GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽,手册可看GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;GPIO_Init(GPIOA,&GPIO_InitStruct);//选择时基单元的时钟-为内部时钟--定时器上电后默认是内部时钟,故不写这一个也行TIM_InternalClockConfig(TIM2);//初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;//PSC-预分频器TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitStruct.TIM_Period = 20000-1;//ARR寄存器-重装载寄存器TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频----滤波器的采样频率,可以由内部时钟直接提供,也可以由内部时钟加一个时钟分频而来,分频系数就是由TIM_ClockDivision决定*/TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//初始化OC-输出比较结构体TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCStructInit(&TIM_OCInitStruct);//因为结构体里面的成员有些是高级定时器采用得到,所以这里就先全部初始化一遍,然后再配置具体的值TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//输出比较模式TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//TIM_OCInitStruct.TIM_Pulse = 50;//CRR --舵机要求设置频率50HZ-即总时间20ms,高电平时间在0.5~2.5ms之间的PWM波型即CCR->500~2500TIM_OCInitStruct.TIM_Pulse = 0;//输出要求波型,这里的CRR就不需要了,用固件库的一个函数 TIM_SetCompare3 直接配置CRRTIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性TIM_OC3Init(TIM2,&TIM_OCInitStruct);//CH3通道//启动定时器TIM_Cmd(TIM2,ENABLE);
}
//0.5ms-0度 2.5ms-180度
//0度 CCR=500
//180度 CCR=2500
//舵机设置角度,范围0~180
void Servo_SetAngle(float Angle)
{TIM_SetCompare3(TIM2,Angle*2000/180+500);
}void PWM_SetCompare3(uint16_t Compare)//设置CRR
{TIM_SetCompare3(TIM2,Compare);
}
#include "stm32f10x.h" // Device header
#include ".\tim\bsp_tim.h"
#include ".\KEY\bsp_key.h"
uint8_t KeyNum;
float Angle;int main()
{KEY_GPIO_Config();LED_GPIO_Config();PWM_Config();while(1){KeyNum = Key_Scan();if(KeyNum == 0){Angle+=30;if(Angle>180){Angle = 0;}}else if(KeyNum == 1){Angle-=30;if(Angle<0){Angle = 180;}}Servo_SetAngle(Angle);}
}
相关文章:
stm32-定时器输出比较PWM
目录 一、输出比较简介 二、PWM简介 三、输出比较模式实现 1.输出比较框图(以通用定时器为例) 2.PWM基本结构 四、固件库实现 1.程序1:PWM呼吸灯 2.程序2:PWM驱动直流电机 3.程序3:控制舵机 一、输出比较简介 死区生成和互补输出一般…...
Redis对过期key的删除策略
假设设置了一批 key 只能存活 1 个小时,那么 1 小时后,redis 是怎么对这批 key 进行删除的? 定期删除 惰性删除 定期删除: redis是默认每隔100ms就随机抽取一些设置了过期时间的key,检查是否过期,如果过期就删除。…...
http的body格式
body数据都通常放在 HTTP 请求的 body 部分。 在 HTTP 请求中,Content-Type 头用于指示 body 中的数据格式。例如,对于 x-www-form-urlencoded 格式的数据,通常会设置 Content-Type: application/x-www-form-urlencoded,而对于 fo…...
Java Web开发从0到1
文章目录 总纲第1章 Java Web应用开发概述1.1 程序开发体系结构1.1.1 C/S体系结构介绍1.1.2 B/S体系结构介绍1.1.3 两种体系结构的比较1.2 Web应用程序的工作原理1.3 Web应用技术1.3.1 客服端应用技术1.3.2 服务端应用技术1.4 Java Web应用的开发环境变量1.5 Tomcat的安装与配置…...
002——编译鸿蒙(Liteos -a)
目录 一、鸿蒙是什么 二、Kconfig 2.1 概述 2.2 编译器 2.3 make使用 本文章引用了很多韦东山老师的教程内容,算是我学习过程中的笔记吧。如果侵权请联系我。 一、鸿蒙是什么 这里我补充一下对鸿蒙的描述 这张图片是鸿蒙发布时使用的,鸿蒙是一个很…...
Ansible--详解
目录 一、Ansible核心组件 二、Ansible配置 1.配置案例 (1)管理安装ansible (2)管理机分发公匙 (3)配置管理 (4)测试连接 2.命令说明 三、playbook剧本编写 1.playbook模板…...
Django和Mysql数据库
Django学习笔记 Django和Mysql数据库 Django开发操作数据库更简单,内部提供了ORM框架。 1)安装mysqlclient pip3 install mysqlclient2)ORM ORM可以帮助我们做两件事: 1.创建、修改、修改数据库中的表(不用写sql语句)[不能创…...
[蓝桥杯]-最大的通过数-CPP-二分查找、前缀和
目录 一、题目描述: 二、整体思路: 三、代码: 一、题目描述: 二、整体思路: 首先要知道不是他们同时选择序号一样的关卡通关,而是两人同时进行两个入口闯关。就是说两条通道存在相同关卡编号的的关卡被通…...
安卓UI面试题 26-30
26. Window和DecorView是什么?DecorView又是如何和Window建立联系的?Window是 WindowManager 最顶层的视图,它负责背景(窗口背景)、Title之类的标准的UI元素, Window是一个抽 象类,整个Android系统中, PhoneWindow是 Window的唯一实现类。 至于 DecorView,它是一个顶级 …...
CPU、GPU、IPU、NPU、TPU、LPU、MCU、MPU、SOC、DSP、FPGA、ASIC、GPP、ECU、
CPU: 中央处理器(Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。 它的功能主要是解释计算机指令以及处理计算机软件…...
鸿蒙车载原生开发,拓展新版图
一天内连发“五弹”、HiCar 4.0首次上车 华为鸿蒙狂扩“汽车朋友圈”-上游新闻 汇聚向上的力量 3月15日,在“华为云&华为终端云服务创新峰会2024”上,华为首批汽车行业伙伴广汽传祺、岚图汽车、零跑汽车、凯翼汽车加入鸿蒙生态合作,华为…...
15届蓝桥杯第二期模拟赛题单详细解析
文章目录 🧡🧡t1_求余🧡🧡思路代码 🧡🧡t2_灌水🧡🧡思路代码 🧡🧡t3_字符显示🧡🧡思路代码 🧡🧡t4_区间最大和…...
mysql统计数据库大小
ps:亲测可行,时间2024-03-15 15:18 mysql统计数据库大小 要统计MySQL数据库的大小,你可以使用以下SQL查询: SELECT table_schema AS "Database",ROUND(SUM(data_length index_length) / 1024 / 1024, 2) AS "Size (MB)"FROM info…...
centos防火墙firewall-cmd限定特定的ip访问
文章目录 firewall-cmd是什么?启动firewalld服务查看默认区域关闭端口访问添加富规则firewall-cmd的区域概念firewall-cmd的常用选项通用选项:状态选项:永久选项:区域选项: firewall-cmd是什么? firewall-…...
创维汽车与创维光伏储能亮相2024上海AWE,感受制造业的升级变迁
2024年3月14日,中国家电及电子消费博览会在上海正式召开。相比往届展会,2024上海AWE进驻更多行业头部力量,出展更多尖端科技,蕴含更深行业思考。创维光伏储能及乘载更先进智驾科技的创维汽车亮相此次展会。 消费电子的革新不断影响…...
Kafka配置SASL_PLAINTEXT权限。常用操作命令,创建用户,topic授权
查看已经创建的topic ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list 创建topic 创建分区和副本数为1的topic ./bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --topic acltest --partitions 1 --replication-factor 1 创建kafka用户 …...
[Java、Android面试]_05_内存泄漏和内存溢出
本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。 整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可关注收…...
MySQL-HMA 高可用故障切换
本章内容: 了解MySQL MHA搭建MySQL MHAMySQL MHA故障切换 1.案例分析 1.1.1案例概述 目前 MySQL 已经成为市场上主流数据库之一,考虑到业务的重要性,MySQL 数据库 单点问题已成为企业网站架构中最大的隐患。随着技术的发展,MHA…...
深度学习 精选笔记(11)深度学习计算相关:GPU、参数、读写、块
学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…...
深度学习 Day27——J7对于ResNeXt-50算法的思考
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制🚀 文章来源:K同学的学习圈子 文章目录 前言问题分析 前言 关键问题:ResNeXt-50中conv_shortcutFalse时…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
更新 Docker 容器中的某一个文件
🔄 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法,适用于不同场景。 ✅ 方法一:使用 docker cp 拷贝文件到容器中(最简单) 🧰 命令格式: docker cp <…...
Go爬虫开发学习记录
Go爬虫开发学习记录 基础篇:使用net/http库 Go的标准库net/http提供了完善的HTTP客户端功能,是构建爬虫的基石: package mainimport ("fmt""io""net/http" )func fetchPage(url string) string {// 创建自定…...





