STM32(七):ADC电位检测 (标准库函数)

前言

上一篇文章已经介绍了如何用STM32单片机中的定时器的PWM波来实现LED的“呼吸”。这篇文章我们来介绍一下如何用STM32单片机中ADC进行电位检测,并发送到XCOM串口中显示。

一、实验原理

1.ADC模数转换的介绍

首先,我们先介绍一下AD模数模块(Analog-to-Digital Converter)。AD模数模块即模拟/数字转换器,主要功能是将连续变化的模拟信号转换为离散的数字信号。

由于单片机只能处理数字信号,因此,在对外部的模拟信号进行分析、处理的过程中,必须使用ADC模块将外部的模拟信号转换成单片机所能处理的数字信号。

A/D转换器的主要类型有以下几种:

  • 积分型
  • 逐次比较型
  • 并行比较型
  • \Sigma -\bigtriangleup调制型
  • 电容阵列逐次比较型
  • 压频变换型
A/D转换器的主要技术指标主要有以下几种:
  • 转换范围 :A/D转换器能够转换的模拟电压范围。
  • 分辨率:输出二进制数的位数表示,位数越多,分辨率越高。
  • 绝对精度:对应一个给定数字量的理论模拟输入与实际输入之差。
  • 转换速度:A/D转换器完成一次转换所需的时间。转 换时间是指从接到转换控制信号开始,到输出端得到稳定的 数字输出信号所经过的这段时间。

典型ADC结构性能比较如下:

2.STM32中的ADC

STM32拥有1~3个ADC(STM32F101/102系列只有1个ADC,STM32F103系列最少都拥有2个ADC ),这些ADC可以独立使用,也可以使用双重模式(提高采样率)。

STM32的ADC是12位逐次逼近型的模拟数字转换器。它有18个通道,可测量16个外部和2个内部信号源(温度传感器、内部参考电压)。ADC的输入时钟不得超过14MHz,其时钟频率由PCLK2分频产生。

ADC 特点
  • STM32单片机有2个独立的ADC控制器,有18个通道,可测量16个外部信号和2个内部信号源:内部温度传感器和内部参考电压(Bandgap voltage) 。
  • ADC 供电要求: 2.4V to 3.6 V 。
  • ADC 输入范围: VREF- ≤ VIN ≤ VREF+ (VREF+ and VREF- available only in LQFP100 package)
  • 精度:12位。结果可按左对齐或右对齐的方式存放在16位寄存器中。
  • A/D转换的过程:采用、保持、量化、编程。采样时间越长,转换结果越稳定。采样时间可设置为:1.5个/7.5个/13.5个/28.5个ADC时钟周期。
  • ADC转换时间 : 采用时间+转换时间(12.5个时钟周期)
  • DMA 功能 (ADC1)

要想搞清楚ADC的原理,那么首先还是先要学会看图,原理图如下图所示:

1.电压输入范围

ADC所能测量的电压范围就是VREF- ≤ VIN ≤ VREF+,把 VSSA 和 VREF-接地,把 VDDA和VREF+接 3.3V,得到ADC的输入电压范围为: 0~3.3V。

2.输入通道

STM32 16 个外部 ADC 通道可分为两组 : 规则的和注入的。
  • 每个组可以是这16个通道中的任意一些通道以任意顺序进行的组合。
  • 规则组最多有16个通道,通道和转换顺序在ADC规则系列寄存器x(ADC_JSQR)中选择。
  • 注入组最多有4个通道。通道和转换顺序在ADC注入系列寄存器(ADC_JSQR)中选择。

各通道的A/D 转换可以单次、连续、扫描或间断模 式执行, stm32f103zet6通道如下:

3.转换顺序

由于规则转换通道只有一个数据寄存器,使用多个通道进行转换需要考虑转换顺序。多个通道的使用顺序分为俩种情况:规则通道的转换顺序和注入通道的转换顺序。

可以看下参考博客,这边就不多加赘述。

4.触发源

触发有两种方式:配置寄存器和通过内部定时器或者外部IO触发转换。

  • 配置寄存器触发,通过配置控制寄存器CR2的ADON位,写1时开始转换,写0时停止转换。在程序运行过程中只要调用库函数,将CR2寄存器的ADON位置1就可以进行转换。
  • 通过内部定时器或者外部IO触发转换,也就是说可以利用内部时钟让ADC进行周期性的转换,也可以利用外部IO使ADC在需要时转换,具体的触发由控制寄存器CR2决定。

5.转换时间

转换时间由输入时钟和采样周期来决定。每个通道总的转换时间=TSampling+Tconversion Tsampling(采样时间)

转换时间=采样时间+12.5个周期

STM32的ADC最大的转换速率为1Mhz,也就是转换时间为1us(在ADCCLK=14M,采样周期为1.5个ADC时钟下得到)
不要让 ADC 的时钟超过 14M ,否则将导致结果准确度下降。

6.数据寄存器 

数据转换完成后的存放在2种数据寄存器中,分别是注入通道数据寄存器和规则通道数据寄存器。

注入通道数据寄存器

数据寄存器有4个,由于注入通道最多有4个,所以注入通道转换的数据都有固定的存放位置,不会跟规则寄存器那样产生数据覆盖的问题。

规则通道数据寄存器

负责存放规则通道转换的数据,通过32位寄存器ADC_DR来存放。

7.中断

规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们都有 独立的中断使能位。
数据转换完成之后可以产生中断,有三种情况,如下图所示:

二、实验步骤

1.配置NVIC

主要是配置ADC中断优先级,这边的对于优先级配置不懂的可以看之前的文章

STM32(三):外部中断 (标准库函数)_stm32外部中断的库函数程序怎么写-CSDN博客

static void ADC_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
   /* 配置中断优先级 */  
  NVIC_InitStructure.NVIC_IRQChannel = ADCx_IRQ;
	 /* 设置抢占式优先级为0 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	 /* 设置子优先级为0 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	 /* 使能外部中断通道 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	 /* 初始化配置嵌套向量中断控制器 */
  NVIC_Init(&NVIC_InitStructure);
}

2.GPIO 初始化

主要是对ADC IO口引脚的配置,同时还要使能端口时钟

static void ADCx_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/* 打开 ADC IO端口时钟 */
	ADC_APBxClock_FUN(ADC_GPIO_CLK, ENABLE );	
	/* 配置 ADC IO 引脚模式 */
	GPIO_InitStructure.GPIO_Pin = ADC_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;	
	/* 初始化 ADC IO */
	GPIO_Init(ADC_PORT, &GPIO_InitStructure);				
}

3.配置工作模式

static void ADCx_Mode_Config(void)
{
	ADC_InitTypeDef ADC_InitStructure;	
	/* 打开ADC时钟 */
	ADC_APBxClock_FUN(ADC_CLK,ENABLE );	
	/* ADC 模式配置 */
	/* 只使用一个ADC,属于单模式 */
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	
	/* 禁止扫描模式,多通道才要,单通道不需要 */
	ADC_InitStructure.ADC_ScanConvMode = DISABLE ; 
	/* 连续转换模式 */
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
	/* 不用外部触发转换,软件开启即可 */
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	/* 转换结果右对齐 */
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	
	/* 转换通道1个 */
	ADC_InitStructure.ADC_NbrOfChannel = 1;			
	/* 初始化ADC */
	ADC_Init(ADCx, &ADC_InitStructure);
	
	/* 配置ADC时钟为PCLK2的8分频,即9MHz */
	RCC_ADCCLKConfig(RCC_PCLK2_Div8);
	
	/* 配置 ADC 通道转换顺序为1,第一个转换,采样时间为55.5个时钟周期 */
	ADC_RegularChannelConfig(ADCx, ADC_CHANNEL, 1, ADC_SampleTime_55Cycles5);
	
	/* ADC 转换结束产生中断,在中断服务程序中读取转换值 */
	ADC_ITConfig(ADCx, ADC_IT_EOC, ENABLE);
	
	/* 开启ADC ,并开始转换 */
	ADC_Cmd(ADCx, ENABLE);
	
	/* 初始化ADC 校准寄存器   */
	ADC_ResetCalibration(ADCx);
	/*等待校准寄存器初始化完成 */
	while(ADC_GetResetCalibrationStatus(ADCx));	
	/* ADC开始校准*/
	ADC_StartCalibration(ADCx);
	/*等待校准完成 */
	while(ADC_GetCalibrationStatus(ADCx));
	
	/* 由于没有采用外部触发,所以使用软件触发ADC转换  */
	ADC_SoftwareStartConvCmd(ADCx, ENABLE);
}

记得配置ADC初始化函数,将上述配置放在一个函数ADCx_Init()

void ADCx_Init(void)
{
	ADCx_GPIO_Config();
  ADC_NVIC_Config();
	ADCx_Mode_Config();	
}

4.中断函数

但到这里我们的中断配置还没结束!!重点!!易踩坑!!

我们还需要在stm32f10x_it.c的文件里面加上新的中断服务函数 ADC_IRQHandler_FUN(),记得加上头文件,例如:

#include "bsp/adc/bsp_adc.h"

__IO uint16_t ADC_ConvertedValue;

void ADC_IRQHandler_FUN(void)
{
  if(ADC_GetITStatus(ADCx,ADC_IT_EOC)!=RESET)
  {
    ADC_ClearITPendingBit(ADCx,ADC_IT_EOC);
    /* 读取ADC的转换值 */
    ADC_ConvertedValue = ADC_GetConversionValue(ADCx);
    
  }
}

5.串口发送函数

主要是讲电压数据发送到XCOM串口助手中,运用到printf()函数,这边可以看发过的这篇文章

STM32(九):USART串口通信 (标准库函数)-CSDN博客

三、实操代码

程序分为3个文件:bsp_adc.c、bsp_adc.h、main.c

1.bsp_adc.c 

/* 包含头文件 ----------------------------------------------------------------*/
#include "bsp/adc/bsp_adc.h"

/**
  * 函数功能: ADC GPIO 初始化
  */
static void ADCx_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/* 打开 ADC IO端口时钟 */
	ADC_APBxClock_FUN(ADC_GPIO_CLK, ENABLE );	
	/* 配置 ADC IO 引脚模式 */
	GPIO_InitStructure.GPIO_Pin = ADC_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;	
	/* 初始化 ADC IO */
	GPIO_Init(ADC_PORT, &GPIO_InitStructure);				
}

/**
  * 函数功能: 配置ADC工作模式
  */
static void ADCx_Mode_Config(void)
{
	ADC_InitTypeDef ADC_InitStructure;	
	/* 打开ADC时钟 */
	ADC_APBxClock_FUN(ADC_CLK,ENABLE );	
	/* ADC 模式配置 */
	/* 只使用一个ADC,属于单模式 */
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	
	/* 禁止扫描模式,多通道才要,单通道不需要 */
	ADC_InitStructure.ADC_ScanConvMode = DISABLE ; 
	/* 连续转换模式 */
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
	/* 不用外部触发转换,软件开启即可 */
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	/* 转换结果右对齐 */
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	
	/* 转换通道1个 */
	ADC_InitStructure.ADC_NbrOfChannel = 1;			
	/* 初始化ADC */
	ADC_Init(ADCx, &ADC_InitStructure);
	
	/* 配置ADC时钟为PCLK2的8分频,即9MHz */
	RCC_ADCCLKConfig(RCC_PCLK2_Div8);
	
	/* 配置 ADC 通道转换顺序为1,第一个转换,采样时间为55.5个时钟周期 */
	ADC_RegularChannelConfig(ADCx, ADC_CHANNEL, 1, ADC_SampleTime_55Cycles5);
	
	/* ADC 转换结束产生中断,在中断服务程序中读取转换值 */
	ADC_ITConfig(ADCx, ADC_IT_EOC, ENABLE);
	
	/* 开启ADC ,并开始转换 */
	ADC_Cmd(ADCx, ENABLE);
	
	/* 初始化ADC 校准寄存器   */
	ADC_ResetCalibration(ADCx);
	/*等待校准寄存器初始化完成 */
	while(ADC_GetResetCalibrationStatus(ADCx));	
	/* ADC开始校准*/
	ADC_StartCalibration(ADCx);
	/*等待校准完成 */
	while(ADC_GetCalibrationStatus(ADCx));
	
	/* 由于没有采用外部触发,所以使用软件触发ADC转换  */
	ADC_SoftwareStartConvCmd(ADCx, ENABLE);
}

/**
  * 函数功能: NVIC配置:ADC中断优先级配置
  */
static void ADC_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
   /* 配置中断优先级 */  
  NVIC_InitStructure.NVIC_IRQChannel = ADCx_IRQ;
	 /* 设置抢占式优先级为0 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	 /* 设置子优先级为0 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	 /* 使能外部中断通道 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	 /* 初始化配置嵌套向量中断控制器 */
  NVIC_Init(&NVIC_InitStructure);
}

/**
  * 函数功能: ADC初始化
  */
void ADCx_Init(void)
{
	ADCx_GPIO_Config();
  ADC_NVIC_Config();
	ADCx_Mode_Config();	
}

2.bsp_adc.h

#ifndef __ADC_H__
#define	__ADC_H__

/* 包含头文件 ----------------------------------------------------------------*/
#include <stm32f10x.h>


// 注意:用作ADC采集的IO必须没有复用,否则采集电压会有影响

/********************ADC输入通道(引脚)配置**************************/
#define    ADC_APBxClock_FUN             RCC_APB2PeriphClockCmd

#define    ADCx                          ADC3
#define    ADC_CLK                       RCC_APB2Periph_ADC3
#define    ADCx_IRQ                      ADC3_IRQn
#define    ADC_IRQHandler_FUN            ADC3_IRQHandler

#define    ADC_GPIO_CLK                  RCC_APB2Periph_GPIOC  
#define    ADC_PORT                      GPIOC

#define    ADC_PIN                       GPIO_Pin_0        // 连接至板载精密可调电阻(需加跳帽)
#define    ADC_CHANNEL                   ADC_Channel_10    // 连接至板载精密可调电阻(需加跳帽)
//#define    ADC_PIN                       GPIO_Pin_1        // 连接至板载光敏电阻(需加跳帽)
//#define    ADC_CHANNEL                   ADC_Channel_11    // 连接至板载光敏电阻(需加跳帽)
                                      
/* 扩展变量 ------------------------------------------------------------------*/
/* 函数声明 ------------------------------------------------------------------*/
void ADCx_Init(void);

#endif /* __ADC_H__ */


3.main.c

/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"

#include "stm32f10x.h"
#include "bsp/led/bsp_led.h"
#include "bsp/key/bsp_key.h"
#include "bsp/delay/delay.h"
#include "bsp/systick/bsp_SysTick.h"
#include "bsp/GeneralTIM/bsp_GeneralTIM.h" 
#include "bsp/adc/bsp_adc.h"


/* 用于保存转换计算后的电压值 */	 
float ADC_ConvertedValueLocal;   

/* 扩展变量 ------------------------------------------------------------------*/
extern __IO uint16_t ADC_ConvertedValue;
/* 私有函数原形 --------------------------------------------------------------*/
static void Delay(uint32_t time);


/**
  * 函数功能: 主函数.
  */
int main(void)
{  
  /* 调试串口初始化配置,115200-N-8-1.使能串口发送和接受 */
  USARTx_Init(); 
  
  /* ADC 初始化 */
	ADCx_Init();
  
  /* 调用格式化输出函数打印输出数据 */
  printf("----这是一个ADC单通道电压采集实验-----\n"); 
  
  /* 无限循环 */
  while (1)
  { 
    ADC_ConvertedValueLocal =(float)ADC_ConvertedValue*3.3/4096; 
	
		printf("AD转换原始值 = 0x%04X \r\n", ADC_ConvertedValue); 
		printf("计算得出电压值 = %f V \r\n",ADC_ConvertedValueLocal); 
    
    Delay(1000);
  }
}

四、实验效果

ADC电压检测

参考博客:

STM32—ADC详解_stm32最好可设置几个模拟通道-CSDN博客

结束语

本文以STM32VET6为例讲解了如何用STM32单片机中ADC进行电位检测,并发送到XCOM串口中显示,并指出其中的易坑点。希望对大家有所帮助!如果还有什么问题,欢迎评论区留言,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

驱动开发:内核扫描SSDT挂钩状态

100编程书屋_孔夫子旧书网 在笔者上一篇文章《驱动开发:内核实现SSDT挂钩与摘钩》中介绍了如何对SSDT函数进行Hook挂钩与摘钩的,本章将继续实现一个新功能,如何检测SSDT函数是否挂钩,要实现检测挂钩状态有两种方式,第一种方式则是类似于《驱动开发:摘除InlineHook内核钩…

免费,C++蓝桥杯等级考试真题--第11级(含答案解析和代码)

C蓝桥杯等级考试真题--第11级 答案&#xff1a;D 解析&#xff1a; A. a b; b a; 这种方式会导致a和b最终都等于b原来的值&#xff0c;因为a的原始值在被b覆盖前没有保存。 B. swap(a&#xff0c;b); 如果没有自定义swap函数或者没有包含相应的库&#xff0c;这个选项会编…

Mysql执行一条语句都有哪些操作

Mysql的执行流程 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层&#xff0c; Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包括连接器&#xff0c;查询缓存、解析器、预处理器、优化器、执行器等。另外&#xf…

Linux——PXE_FTP_EL8

PXE Kickstart &#xff08; el8 &#xff09; 使用两个网口一个用net接口用于下载服务和软件包&#xff0c;另一个为仅主机用于与其他的空主机相连 PXE(preboot execute environment) 预启动执行环境。支持工作站通过网络从远端服务器下载映像&#xff0c;并由此支持通过网络启…

JavaWeb2-Vue

Vue 前端框架&#xff0c;免除原生JS中的DOM操作简化书写 &#xff08;以前学过又忘了&#xff0c;现在才知道原来vue是前端的&#xff09; 基于MVVM思想&#xff08;model-view -viewModel&#xff09;实现数据双向绑定 model是数据模型 view负责数据展示 即DOM 中间这个负责…

可视化表单生成器好用吗?

当前的社会竞争是非常大的&#xff0c;随着业务的上涨&#xff0c;很多客户都需要找到更高效、更理想的软件平台产品实现流程化办公。这就需要了解低代码技术平台了。作为新的办公助力软件平台&#xff0c;低代码技术平台更好操作、更灵活、功能更多&#xff0c;其中可视化表单…

生产管理看板系统为优化工厂车间生产工艺

一、行业现状&#xff0c;管理中普遍存在的问题 1. 先进的管理流程与相应管理制度匮乏。大量管理工作依旧主要采取“人治”模式&#xff0c;众多高层自身理论知识欠缺&#xff0c;并且还难以听取相关人员的意见。 2. 生产过程的控制较为薄弱。企业全面质量控制&#xff08;TQ…

LSP5526 直接替用 LSP5502 SOP-8降压直流转换器

LSP5526 作为一款高性能的降压型直流-直流转换器&#xff0c;在医疗设备中的应用非常广泛。由于其具有高效率、宽输入电压范围以及良好的稳定性等特点&#xff0c;它可以为医疗设备中的关键电子系统提供稳定的电源支持。以下是一些具体的医疗设备应用案例&#xff1a; 1. 医用监…

人大金仓数据库报sys_user表字段不存在的问题

目录 一.问题&#xff1a; 二.原因 三.解决方法&#xff1a; 一.问题&#xff1a; 公司的一个项目从oracle切换到人大金仓之后&#xff0c;突然报了一个sys_user里面的字段不存在。 二.原因 检查了很多次确信sys_user表没问题&#xff0c;查了相应的文档之后发现原来人大金…

笔记96:前馈控制 + 航向误差

1. 回顾 对于一个 系统而言&#xff0c;结构可以画作&#xff1a; 如果采用 这样的控制策略&#xff0c;结构可以画作&#xff1a;&#xff08;这就是LQR控制&#xff09; 使用LQR控制器&#xff0c;可以通过公式 和 构建一个完美的负反馈系统&#xff1b; a a 但是有上…

【C语言】指针(4)

一、回顾 在这之前&#xff0c;我们学习了很多关于指针的内容&#xff0c;我们先在这里简单的回顾一下。 1、一级指针 int* p; -- 整形指针-指向整形的指针 char* p; ... void* p;... ... 2、二级指针 int** p; char** p; ... 3、数组指针 -- 指向数组的指针 int (*p)[ ]…

采用_findfirst和_findnext获取当前文件夹下以及子文件夹下特定文件

1.相关知识点&#xff1a; 在实现此功能&#xff0c;主要使用到的函数包含&#xff0c;_findfirst()、_findnext()、_findclose()。通过使用上述函数以及配合结构体 _finddata_t 来达到一个遍历的效果。 _finddata_t的结构体信息 struct _finddata64i32_t {unsigned attrib…

Linux.小技巧快捷键

1. ctrl c 强制停止 终止某些程序的运行 也可以取消某行命令 2. ctrl d 退出或登出 进入python环境中&#xff0c;使用ctrl d 退出 3.history 查看历史使用了哪些命令 4. ! 历史最近使用的命令的开头 5.使用ctrl r 搜索历史使用的命令 按下 ctrl r 会进入 reverse -…

course-nlp——5-nn-imdb

本文参考自https://github.com/fastai/course-nlp。这部分是fastai1.0版本的教程&#xff0c;由于现在fastai2.0重构的改变非常大&#xff0c;所以文中的很多api都变了&#xff0c;由于学习目的并不是熟练掌握fastai&#xff0c;因此这里就简单的存一下&#xff0c;本文是用IMD…

2024-04-27 - AI for everyone - 第三周 - 吴恩达

摘要 2024-05-01 周三 杭州 阴 小记: (☆-v-) 2024-05-03 周四 杭州 🌤 小记: 这几天地铁好拥挤呀!不过体重已经减了 2 公斤 ,咔咔咔,继续坚持 2024-05-04 周四 杭州 🐟 小记: 因为在意,所以昨天有些事情超级不开心,但是我决定要彻底舍弃了,羁绊这种东西本就可…

探索数据结构:堆,计数,桶,基数排序的分析与模拟实现

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 堆排序 1.1. 算法思想 堆排序(Heap Sort)是一种基于堆数据结构的排…

R语言绘图 | 双Y轴截断图

教程原文&#xff1a;双Y轴截断图绘制教程 本期教程 本期教程&#xff0c;我们提供的原文的译文&#xff0c;若有需求请回复关键词&#xff1a;20240529 小杜的生信笔记&#xff0c;自2021年11月开始做的知识分享&#xff0c;主要内容是R语言绘图教程、转录组上游分析、转录组…

【kubernetes】探索k8s集群安全机制

目录 一、认证&#xff08;Authentication&#xff09; 1.1三种认证方式 1.2需要被认证的访问类型&#xff1a; 1.3安全性说明&#xff1a; 1.4证书颁发&#xff1a; 1.5kubeconfig 1.6Service Account 1.7Secret 与 SA 的关系 1.7.1Kubernetes 设计了一种资源对象叫做…

CSS 前端面试题学习笔记2

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“前端CSS面试题-2”。 一、主要题目 1.画一条0.5px的直线 注意&#xff1a;浏览器默认最小像素单位为1px &#xff0c;小于1px的自动默认为1px。如果给0.5px,那么浏览器会直接显示为1px&#xff0c;只有通过sca…

ARM功耗管理架构演进及变迁

安全之安全(security)博客目录导读 目录 一、功耗管理架构演进及变迁概述 二、多核 三、big.LITTLE 四、DynamIQ 五、ARM-V9 DynamIQ 思考:从单核->多核->big.LITTLE->DynamIQ,功耗管理架构演进? 一、功耗管理架构演进及变迁概述 二、多核