嵌入式学习--江协stm32day5
USART
1. 引脚与接口层
- 异步引脚:
TX
:发送数据输出;RX
:接收数据输入;SW_RX
:单线半双工模式的接收引脚(替代 RX)。
- 同步引脚:
SCLK
:同步模式下的时钟输出(主模式)或输入(从模式)。 - IrDA 接口:
IrDA_OUT
/IrDA_IN
,配合编解码模块实现红外通信(需外接 IrDA 收发器)。 - 硬件流控引脚:
nRTS
(请求发送,输出)、nCTS
(清除发送,输入),协调收发双方速率。
2. 数据收发核心:寄存器 + 移位寄存器
- 发送路径:
CPU/DMA
→ 写入 发送数据寄存器(TDR) → 送入 发送移位寄存器(并行→串行,逐位输出到 TX/IrDA/SW_RX)。 - 接收路径:
RX/IrDA/SW_RX
接收串行数据 → 送入 接收移位寄存器(串行→并行)→ 存入 接收数据寄存器(RDR) → 供CPU/DMA
读取。 - 关键逻辑:移位寄存器负责 “串并转换”,TDR/RDR 作为数据缓冲(避免 CPU 频繁干预)。
3. 控制与配置:CR1/CR2/CR3 寄存器
CR1
:基础配置,如:UE
:USART 使能;M
:字长(8/9 位);WAKE
:唤醒模式(空闲线 / 地址标记);- 中断使能(
TXEIE
发送空、RXNEIE
接收非空、IDLEIE
总线空闲等)。
CR2
:帧格式与同步控制,如:STOP[1:0]
:停止位数量(0.5/1/1.5/2 位);LINEN
:LIN 总线模式;- 同步模式时钟配置(
CPOL
极性、CPHA
相位、CLKEN
时钟使能)。
CR3
:高级功能,如:DMA
使能(DMAT
发送 DMA、DMA
接收 DMA);- 硬件流控(
RTSE
使能 nRTS、CTSE
使能 nCTS); - 红外模式(
IREN
)、半双工(HDSEL
)等。
4. 波特率生成:USART_BRR 寄存器
- 核心公式:
USARTDIV=16×波特率fPCLK=DIV_Mantissa+16DIV_FractionfPCLK
:USART 外设时钟(来自 RCC 配置);DIV_Mantissa
:整数部分(15 位),DIV_Fraction
:小数部分(4 位),共同决定波特率精度(如 9600、115200 等)。
- 时钟分配:生成的 USARTDIV 同时供给 发送器时钟 和 接收器时钟,保证收发同步。
5. 状态与中断:SR 寄存器 + 中断控制
- 状态标志(
SR
):TXE
:发送数据寄存器空(可写入新数据);RXNE
:接收数据寄存器非空(可读取数据);IDLE
:总线空闲(异步模式下,用于检测一帧结束);- 错误标志:
OE
(溢出)、PE
(奇偶校验错)、FE
(帧错)、NE
(噪声错)。
- 中断控制:通过
CR1
使能对应中断(如TXEIE
使能 TXE 中断),触发后进入 USART 中断控制模块,通知 CPU 处理。
串口发送
#include "stm32f10x.h" // Device header
#include "stdio.h"
#include "stdarg.h"
void Serial_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);USART_InitTypeDef USART_InitStructrue;USART_InitStructrue.USART_BaudRate=9600;USART_InitStructrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructrue.USART_Mode=USART_Mode_Tx;USART_InitStructrue.USART_Parity=USART_Parity_No;USART_InitStructrue.USART_StopBits=USART_StopBits_1;USART_InitStructrue.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitStructrue);USART_Cmd(USART1,ENABLE);}void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);}
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{uint16_t i;for(i=0;i<Length;i++){Serial_SendByte(Array[i]);}
}
void Serial_SendString(char *String)
{uint8_t i;for(i=0;String[i]!='\0';i++){Serial_SendByte(String[i]);}}
uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{uint32_t Result;while(Y--){Result*=X;}return Result;}
void Serial_SendNumber(uint32_t Number,uint8_t Length)
{uint8_t i;for(i=0;i<Length;i++){Serial_SendByte(Number/Serial_Pow(10,Length-i-1)%10+'0');}
}
int fputc(int ch,FILE *f)
{Serial_SendByte(ch);return ch;}void Serial_printf(char *format,...)
{char String[100];va_list arg;va_start(arg,format);vsprintf(String,format,arg);va_end(arg);Serial_SendString(String);}
串口发送+接收
#include "stm32f10x.h" // Device header
#include "stdio.h"
#include "stdarg.h"uint8_t Serial_RxFlag;
uint8_t Serial_RxData;
void Serial_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);USART_InitTypeDef USART_InitStructrue;USART_InitStructrue.USART_BaudRate=9600;USART_InitStructrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;USART_InitStructrue.USART_Parity=USART_Parity_No;USART_InitStructrue.USART_StopBits=USART_StopBits_1;USART_InitStructrue.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitStructrue);USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructrue;NVIC_InitStructrue.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructrue.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructrue.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructrue);USART_Cmd(USART1,ENABLE);}void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);}
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{uint16_t i;for(i=0;i<Length;i++){Serial_SendByte(Array[i]);}
}
void Serial_SendString(char *String)
{uint8_t i;for(i=0;String[i]!='\0';i++){Serial_SendByte(String[i]);}}
uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{uint32_t Result;while(Y--){Result*=X;}return Result;}
void Serial_SendNumber(uint32_t Number,uint8_t Length)
{uint8_t i;for(i=0;i<Length;i++){Serial_SendByte(Number/Serial_Pow(10,Length-i-1)%10+'0');}
}
int fputc(int ch,FILE *f)
{Serial_SendByte(ch);return ch;}void Serial_printf(char *format,...)
{char String[100];va_list arg;va_start(arg,format);vsprintf(String,format,arg);va_end(arg);Serial_SendString(String);}
uint8_t Serial_GetRxFlag()
{if(Serial_RxFlag==1){Serial_RxFlag=0;return 1;}return 0;
}
uint8_t Serial_GetRxData()
{return Serial_RxData;
}
void USART1_IRQHandler()
{if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){Serial_RxData=USART_ReceiveData(USART1);Serial_RxFlag=1;USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}
串口发送HEX数据包
#include "stm32f10x.h" // Device header
#include "stdio.h"
#include "stdarg.h"uint8_t Serial_RxFlag;
uint8_t Serial_RxData;
uint8_t Serial_TxPacket[4];
uint8_t Serial_RxPacket[4];void Serial_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);USART_InitTypeDef USART_InitStructrue;USART_InitStructrue.USART_BaudRate=9600;USART_InitStructrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;USART_InitStructrue.USART_Parity=USART_Parity_No;USART_InitStructrue.USART_StopBits=USART_StopBits_1;USART_InitStructrue.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitStructrue);USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructrue;NVIC_InitStructrue.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructrue.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructrue.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructrue);USART_Cmd(USART1,ENABLE);}void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);}
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{uint16_t i;for(i=0;i<Length;i++){Serial_SendByte(Array[i]);}
}
void Serial_SendString(char *String)
{uint8_t i;for(i=0;String[i]!='\0';i++){Serial_SendByte(String[i]);}}
uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{uint32_t Result;while(Y--){Result*=X;}return Result;}
void Serial_SendNumber(uint32_t Number,uint8_t Length)
{uint8_t i;for(i=0;i<Length;i++){Serial_SendByte(Number/Serial_Pow(10,Length-i-1)%10+'0');}
}
int fputc(int ch,FILE *f)
{Serial_SendByte(ch);return ch;}void Serial_printf(char *format,...)
{char String[100];va_list arg;va_start(arg,format);vsprintf(String,format,arg);va_end(arg);Serial_SendString(String);}
void Serial_SendPacket()
{Serial_SendByte(0xFF);Serial_SendArray(Serial_TxPacket,4);Serial_SendByte(0xFE);}
uint8_t Serial_GetRxFlag()
{if(Serial_RxFlag==1){Serial_RxFlag=0;return 1;}return 0;
}void USART1_IRQHandler()
{static uint8_t RxState=0;static uint8_t pRxPacket=0;if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){uint8_t RxData=USART_ReceiveData(USART1);if(RxState==0){if(RxData==0xFF){RxState=1;pRxPacket=0;}}else if(RxState==1){Serial_RxPacket[pRxPacket]=RxData;pRxPacket++;if(pRxPacket>=4){RxState=2;}}else if(RxState==2){if(RxData==0xFE){RxState=0;Serial_RxFlag=1;}}USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}
串口发送文本数据包
#include "stm32f10x.h" // Device header
#include "stdio.h"
#include "stdarg.h"uint8_t Serial_RxFlag;
uint8_t Serial_RxData;
char Serial_RxPacket[100];void Serial_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);USART_InitTypeDef USART_InitStructrue;USART_InitStructrue.USART_BaudRate=9600;USART_InitStructrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;USART_InitStructrue.USART_Parity=USART_Parity_No;USART_InitStructrue.USART_StopBits=USART_StopBits_1;USART_InitStructrue.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitStructrue);USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructrue;NVIC_InitStructrue.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructrue.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructrue.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructrue);USART_Cmd(USART1,ENABLE);}void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);}
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{uint16_t i;for(i=0;i<Length;i++){Serial_SendByte(Array[i]);}
}
void Serial_SendString(char *String)
{uint8_t i;for(i=0;String[i]!='\0';i++){Serial_SendByte(String[i]);}}
uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{uint32_t Result;while(Y--){Result*=X;}return Result;}
void Serial_SendNumber(uint32_t Number,uint8_t Length)
{uint8_t i;for(i=0;i<Length;i++){Serial_SendByte(Number/Serial_Pow(10,Length-i-1)%10+'0');}
}
int fputc(int ch,FILE *f)
{Serial_SendByte(ch);return ch;}void Serial_printf(char *format,...)
{char String[100];va_list arg;va_start(arg,format);vsprintf(String,format,arg);va_end(arg);Serial_SendString(String);}void USART1_IRQHandler()
{static uint8_t RxState=0;static uint8_t pRxPacket=0;if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){uint8_t RxData=USART_ReceiveData(USART1);if(RxState==0){if(RxData=='@'&&Serial_RxFlag==0){RxState=1;pRxPacket=0;}}else if(RxState==1){if(RxData=='\r'){RxState=2;}else{Serial_RxPacket[pRxPacket]=RxData;pRxPacket++;}}else if(RxState==2){if(RxData=='\n'){RxState=0;Serial_RxFlag=1;Serial_RxPacket[pRxPacket]='\0';}}USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}
相关文章:

嵌入式学习--江协stm32day5
USART 1. 引脚与接口层 异步引脚: TX:发送数据输出;RX:接收数据输入;SW_RX:单线半双工模式的接收引脚(替代 RX)。 同步引脚:SCLK:同步模式下的时钟输出&…...

(LeetCode 动态规划(基础版))96. 不同的二叉搜索树 (递推 || 递归)
题目:96. 不同的二叉搜索树 思路:二叉树长度为n时,枚举每个点u作为根节点root,那么root左边的数构成左子树种数left,root右边的数构成右子树种数right,那么当前u为根节点下,二叉树的种数为left*…...
服务器中CC攻击的特点有哪些?
CC攻击作为一种常见的网络攻击类型,主要是用来攻击网站页面的,当大量的用户在访问网站的过程中,打开页面的速度会变得比较慢,给数据库造成的压力就越大,CC攻击会消耗大量的服务器资源,给企业带来一定的经济…...

vue项目使用svg图标
下面是在 Vue 3 项目中完整引入和使用 vite-plugin-svg-icons 的步骤 1、安装插件 npm install vite-plugin-svg-icons -D # 或 yarn add vite-plugin-svg-icons -D # 或 pnpm add vite-plugin-svg-icons -D 2、配置 Vite 在 vite.config.ts 或 vite.config.js 中配置&…...

智能网卡之hinic3 WQE(Work Queue Element)结构梳理
hinic3 WQE(Work Queue Element)结构详解 本文基于 hinic3 驱动源码,对 WQE(Work Queue Element)做详细讲解。如需查阅完整源码和结构体定义可参考hinic3_nic_qp.h等文件。 1. WQE 的作用 WQE(Work Queue…...
go的工具库:github.com/expr-lang/expr
github.com/expr-lang/expr 是一个 Go 语言的表达式求值库,它允许你在运行时安全地执行表达式。主要用途包括: 1.表达式求值: program, err : expr.Compile("2 2") if err ! nil {// 处理错误 } result, err : expr.Run(program…...

力扣HOT100之二分查找:4. 寻找两个正序数组的中位数
这道题如果没有时间复杂度的限制的话,相当好做,但是这道题要求时间复杂度为O(log(m n)),思路很难想,我看了一圈题解,发现华南溜达虎的视频讲得还不错,我是参考他的思路写出来的,这里把他的思路…...

PyTorch——损失函数与反向传播(8)
Loss Functions 越小越好 L1loss MSELoss 损失函数 CrossEntyopyLoss 损失函数 import torch from torch.nn import L1Loss from torch import nn# 创建输入和目标张量,用于后续的损失计算 inputs torch.tensor([1,2,3],dtypetorch.float32) targets torch.tenso…...

macOS 升级 bash 到最新版本
macOS 的默认「终端」,千年不变的版本。 》〉bash --version GNU bash, version 3.2.57(1)-release (arm64-apple-darwin24) Copyright (C) 2007 Free Software Foundation, Inc. 官方 bash.git - bash 已经将 bash 升级到了 5.2的大版本。 macOS 最新版系统的 ba…...
Linux下如何查看一个端口被什么进程占用? 该进程又打开了哪些文件?
Linux下如何查看一个端口被什么进程占用? 该进程又打开了哪些文件? 查看端口 1.使用lsof命令查看端口占用的进程 lsof可以列出系统上打开的文件,其中包括网络连接、进程信息等。 lsof -i:<端口号> 例如,如果需…...

力扣面试150题--课程表
Day 63 题目描述 做法 初次思路:本质就是将所有前置课程和后置课程作为一个有向图(前者指向后者),判断这个图是否是一个有向无环图(即是否存在拓扑排序)(本质做法是dfs) 做法&…...

用通俗的话解释下MCP是个啥?
在AI领域,模型的开发、部署和迭代速度日益加快,但随之而来的挑战也愈发显著:如何高效管理不同版本的模型?如何在复杂环境中确保模型的可追溯性和可复用性?如何实现跨团队、跨平台的模型协作? 在计算机领域…...

LeetCode 高频 SQL 50 题(基础版)之 【子查询】· 上
题目:1978. 上级经理已离职的公司员工 题解: select employee_id from Employees where salary<30000 and manager_id is not null and manager_id not in (select distinct employee_id from Employees ) order by employee_id题目:626.…...

Spark流水线+Gravitino+Marquez数据血缘采集
1.Openlinage和Marquez简介 1.1 OpenLineage 概述 OpenLineage 是一个开放标准和框架,用于跨工具、平台和系统捕获数据血缘信息。它定义了通用的数据血缘模型和API,允许不同的数据处理工具(如ETL、调度器、数据仓库)以标准化格…...
一个完整的时间序列异常检测系统,使用Flask作为后端框架,实现了AE(自编码器)、TimesNet和LSTM三种模型,并提供可视化展示
时间序列异常检测系统 下面是一个完整的时间序列异常检测系统,使用Flask作为后端框架,实现了AE(自编码器)、TimesNet和LSTM三种模型,并提供可视化展示。 系统概述 这个系统能够: 从多种来源加载时间序列数据使用三种先进算法进行异常检测可视化展示原始数据、重建数据和…...
深度学习在非线性场景中的核心应用领域及向量/张量数据处理案例,结合工业、金融等领域的实际落地场景分析
一、工业场景:非线性缺陷检测与预测 1. 半导体晶圆缺陷检测 问题:微米级划痕、颗粒污染等缺陷形态复杂,与正常纹理呈非线性关系。解决方案: 输入张量:高分辨率晶圆图像 → 三维张量 (Batch, Height,…...

基于微信小程序的车位共享平台的设计与实现源码数据库文档
摘 要 近年来,随着国民经济的飞速发展,城镇化进程的步伐加快,城市人口急剧增长,人们的生活水平持续改善,特别是大中型城市,城市的交通规模日益增大,汽车的保有量不断提高,然而城市的…...

多模态大语言模型arxiv论文略读(111)
SEA: Supervised Embedding Alignment for Token-Level Visual-Textual Integration in MLLMs ➡️ 论文标题:SEA: Supervised Embedding Alignment for Token-Level Visual-Textual Integration in MLLMs ➡️ 论文作者:Yuanyang Yin, Yaqi Zhao, Yaji…...
网页端 VUE+C#/FastAPI获取客户端IP和hostname
1 IP可以获取,但是发现获取到的是服务端的IP,如何解决呢。 如果采用nginx反向代理,那么可以在conf/nginx.conf文件中配置 location /WebApi/ { proxy_pass http://localhost:5000/; #这个/会替换location种的WebApi路径 #关键,加…...
一个自动反汇编脚本
一、环境 wsl ubuntu18.04、python3.6 二、目的 调试程序,需要分析第三方库。希望能将多个库自动转为汇编文件。 三、使用方法 将该脚本下载,进入wsl,进入到该脚本所有文件夹。 请使用 python 脚本名.py 运行。 1)、运行…...
函数与数列的交汇融合
前情概要 现行的新高考对数列的考查难度增加,那么整理与数列交汇融合的相关题目就显得非常必要了。 典例剖析 依托函数,利用导数,求数列的最值;№ 1 、 \color{blue}{№ 1、} №1、 等差数列 { a n } \{a_{n}\} {an} 的前 n n n 项和为 S n S_{n} Sn, 已知 S 10…...

怎么让自己ip显示外省?一文说清操作
在互联网时代,IP地址不仅关联网络连接,还可能影响IP属地显示。那么,手机和电脑用户怎么让自己IP显示外省?一文说清操作要点。 二、4种主流方法详解 要让自己的IP显示为外省地址,主要有以下几种方法: …...

【Docker】容器安全之非root用户运行
【Docker】容器安全之非root用户运行 1. 场景2. 原 Dockerfile 内容3. 整改结果4. 非 root 用户带来的潜在问题4.1 文件夹读写权限异常4.2 验证文件夹权限 1. 场景 最近有个项目要交付,第三方测试对项目源码扫描后发现一个问题,服务的 Dockerfile 都未指…...

汽车车载软件平台化项目规模颗粒度选择的一些探讨
汽车进入 SDV 时代后,车载软件研发呈现出开源生态构建、电子架构升级、基础软件标准化、本土供应链崛起、AI 原生架构普及、云边协同开发等趋势,这些趋势促使车载软件研发面临新挑战,如何构建适应这些变化的平台化架构成为车企与 Tier 1 的战…...

【八股消消乐】构建微服务架构体系—服务注册与发现
😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点ÿ…...
大数据+智能零售:数字化变革下的“智慧新零售”密码
大数据+智能零售:数字化变革下的“智慧新零售”密码 大家好,今天咱们聊聊一个火到不行的话题:大数据在智能零售中的应用。这个领域,不仅是技术的“硬核战场”,更是商业创新的风口浪尖。谁能玩转数据,谁就能掌控消费者心智,实现销售爆发。 咱们不搞枯燥学术,而是用最“…...
C++_核心编程_菱形继承
4.6.8 菱形继承 菱形继承概念: 两个派生类继承同一个基类 又有某个类同时继承者两个派生类 这种继承被称为菱形继承,或者钻石继承 菱形继承问题: 1. 羊继承了动物的数据, 驼同样继承了动物的数据࿰…...

掌握Git核心:版本控制、分支管理与远程操作
前言 无论热爱技术的阅读者你是希望掌握Git的企业级应用,能够深刻理解Git操作过程及操作原理,理解工作区暂存区、版本库的含义;还是想要掌握Git的版本、分支管理,自由的进行版本回退、撤销、修改等Git操作方式与背后原理和通过分…...

c#,Powershell,mmsys.cpl,使用Win32 API展示音频设备属性对话框
常识(基础) 众所周知,mmsys.cpl使管理音频设备的控制面板小工具, 其能产生一个对话框(属性表)让我们查看和修改各设备的详细属性: 在音量合成器中单击音频输出设备的小图标也能实现这个效果&a…...

STM标准库-TIM旋转编码器
文章目录 一、编码器接口1.1简介1.2正交编码器1.3编码器接口基本结构**1. 模块与 STM32 配置的映射关系****2. 设计实现步骤(核心流程)****① 硬件规划****② 时钟使能****③ GPIO 配置(对应架构图 “GPIO” 模块)****④ 时基单元…...