STM32(六):定时器PWM呼吸灯 (标准库函数)

news2024/11/20 4:45:17

前言

上一篇文章已经介绍了如何用STM32单片机中的TIMER定时器来控制LED灯的交替闪烁,实现了点灯的第五种方式。这篇文章我们来介绍一下如何用STM32单片机中的定时器的PWM波来实现LED的“呼吸”。

一、实验原理

关于定时器这边就不多加赘述,详细请看上一篇文章,链接放在下面了

STM32(五):TIMER定时器 (标准库函数)

这边我们介绍一下PWM

1.PWM的介绍

PWM的全称是脉冲宽度调制(Pulse-width modulation),是指在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效的地获得所需要的模拟参量,常应用于电机控速等领域。在STM32微控制器的应用中,PWM技术也非常重要,因为它能够提供精确的信号控制,从而达到对设备行为的精确管理。

  • 频率:一秒钟内从高电平时间在到低电平时间,再从低电平跳到高电平的瞬间次数,也就是一秒钟内有多少个PWM的周期,f = 1/Ts。
  • 周期:一秒钟内从高电平时间在到低电平时间,Ts= 1/f。
  • PWM信号产生:用于控制电机速度、灯光亮度等。
  • 占空比:一个周期内高电平时间和总时间的比值,Ton/Ts。
  • 分辨率:占空比变化步距。

2.PWM参数计算公式

PWM主要参数计算公式如下所示:

  • PWM频率 Freq=CK_PSC/[(PSC+1) (ARR+1)], CK_PSC=72M
  • PWM占空比=CCR/(ARR+1)
  • PWM分辨率=1/(ARR+1)

3.PWM工作原理

以下是PWM输入模式时序工作原理图,以下对其符号进行简单的解释说明

  1. T1:PWM信号的波形,显示了信号的高电平和低电平状态。
  2. TIMx_CNT :定时器的计数器(Counter),它的值会在定时器时钟的脉冲下从0开始增加,直到达到自动重载寄存器(ARR)的值后归零,循环开始新的周期。
  3. TIMx_CCR1TIMx_CCR2 :捕捉/比较寄存器(Capture/Compare Register),用于设置PWM的高电平宽度。它们的值决定了在计数器达到这些值时输出比较匹配事件,影响PWM输出信号的占空比。
  • TIMx_CCR1 设置为 0004,代表在计数器计数到4时,第一个通道的PWM输出从高电平跳变到低电平。
  • TIMx_CCR2 设置为 0002,代表在计数器计数到2时,第二个通道的PWM输出从高电平跳变到低电平。

 接下来简单介绍一下PWM信号的一个典型的边缘对齐模式,

  • ARR = 8:设置了定时器的计数上限,决定了PWM周期的长度,计数器会从0计数到8,然后重置为0,开始新的周期。
  • CCRx = 4:决定了PWM信号从高电平变为低电平的切换点,当计数器计数到4时,输出信号从高电平切换到低电平。
  • 红线(有效电平):PWM输出从高电平切换到低电平的时刻,即在计数器值等于CCR值时,输出发生变化。
  • 蓝线(无效电平):PWM输出在一个完整的周期结束时仍然是低电平。
  • CCxIF:捕捉/比较中断标志,当定时器的计数器值与CCR寄存器的预设值相匹配时,该标志被设置。

  • OCxREF:输出比较引用信号,通常与PWM的实际输出相对应,反映了PWM信号的状态更改。

二、实验步骤

1.引脚设置

这边在h文件的宏定义中定义即可

static void GENERAL_TIMx_GPIO_Config(void) 
{
  GPIO_InitTypeDef GPIO_InitStructure;

	/* 使能定时器始终:设置TIM3CLK 为 72MHZ */
	GENERAL_TIM_APBxClock_FUN (GENERAL_TIM_CLK, ENABLE);

  /* 使能定时器通道引脚GPIO时钟 */
  GENERAL_TIM_GPIO_APBxClock_FUN(GENERAL_TIM_GPIO_CLK1|GENERAL_TIM_GPIO_CLK1, ENABLE); 

  /* 配置定时器通道3输出引脚模式:复用推挽输出模式 */
  GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_PIN1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GENERAL_TIM_PORT1, &GPIO_InitStructure);
}

2.时钟中断

时钟中断函数void NVIC_Config_PWM(void),这边是对中断来源以及优先级的配置,前面在Systick中有所介绍,可以看一下之前的连接:STM32(四):Systick (标准库函数)-CSDN博客

static void NVIC_Config_PWM(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  /* 选择中断优先级配置组为2个抢占式优先级和2个子优先级,可以参考misc.h文件了解相关设置 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  /* 配置TIM3_IRQ中断为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = GENERAL_TIMx_IRQn;
	/* 设置抢占式优先级为0 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	/* 设置子优先级为3 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	/* 使能外部中断通道 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

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

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

#include "bsp/GeneralTIM/bsp_GeneralTIM.h"
extern uint8_t indexWave[];

void GENERAL_TIMx_IRQHandler(void)
{	
	static uint8_t pwm_index = 0;			/* 用于PWM查表 */
	static uint8_t period_cnt = 0;		/* 用于计算周期数 */
	
  /* 定时器更新中断 */
	if (TIM_GetITStatus(GENERAL_TIMx, TIM_IT_Update) != RESET)	
 	{			
    period_cnt++;
    /* 若输出的周期数大于20,输出下一种脉冲宽的PWM波 */
    if(period_cnt >= 20)										
    {
      /* 根据PWM表修改定时器的比较寄存器值 */
      GENERAL_TIMx->GENERAL_TIM_CCRx = indexWave[pwm_index];	
		 
      /* 标志PWM表的下一个元素 */
      pwm_index++;												
      /* 若PWM脉冲表已经输出完成一遍,重置PWM查表标志 */
      if( pwm_index >=  40)								
      {
        pwm_index=0;								
      }
      /* 重置周期计数标志 */
      period_cnt=0;												
		}
    /* 必须要清除中断标志位 */
		TIM_ClearITPendingBit (GENERAL_TIMx, TIM_IT_Update);	
	}
}

3.定时器配置

定时周期和预分频需要根据实际需要进行调整,而这边TIM_Pulse=0是因为我们给了一个脉冲配置的数组indexWave[],若不用,调整这个大小会改变“呼吸”的速率。

static void GENERAL_TIMx_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
		 
  /* 当定时器从0计数到255,即为256次,为一个定时周期 */
  TIM_TimeBaseStructure.TIM_Period = 255; 
  /* 设置预分频:不预分频,即为72MHz,输出脉冲频率:72MHz/(1999+1)/(255+1) */
  TIM_TimeBaseStructure.TIM_Prescaler = 1999;
  /* 设置时钟分频系数:不分频(这里用不到) */
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
  /* 向上计数模式 */
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(GENERAL_TIMx, &TIM_TimeBaseStructure);

  /* 模式配置:PWM模式1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  /* 输出状态设置:使能输出 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	
  /* 设置跳变值,当计数器计数到这个值时,电平发生跳变 */
  TIM_OCInitStructure.TIM_Pulse = 0;
  
  /* 当定时器计数值小于CCR1_Val时为低电平 */
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  /* 初始化定时器通道1输出PWM */
  GENERAL_TIM_OCxInit(GENERAL_TIMx, &TIM_OCInitStructure);
  /* 定时器比较输出通道1预装载配置:使能预装载 */
  GENERAL_TIM_OCxPreloadConfig(GENERAL_TIMx, TIM_OCPreload_Enable);  
  /* 使能定时器重载寄存器ARR */
  TIM_ARRPreloadConfig(GENERAL_TIMx, ENABLE);
  /* 使能定时器 */
  TIM_Cmd(GENERAL_TIMx, ENABLE);  
  /* 配置NVIC */
  NVIC_Config_PWM();
  /* 定时器更新中断 */
  TIM_ITConfig(GENERAL_TIMx, TIM_IT_Update, ENABLE);
								
}

4.PWM信号初始化


void GENERAL_TIMx_PWM_Init(void)
{
	GENERAL_TIMx_GPIO_Config();
	GENERAL_TIMx_Configuration();	
}

三、实操代码

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

1.bsp_GeneralTIM.c

#include "bsp/GeneralTIM/bsp_GeneralTIM.h" 
uint8_t indexWave[] = {1,1,2,2,3,4,6,8,10,14,19,25,33,44,59,80,107,143,191,255,
                       255,191,143,107,80,59,44,33,25,19,14,10,8,6,4,3,2,2,1,1};

/**
  * 函数功能: 配置TIMx复用输出PWM时用到的I/O
  */
static void GENERAL_TIMx_GPIO_Config(void) 
{
  GPIO_InitTypeDef GPIO_InitStructure;

	/* 使能定时器始终:设置TIM3CLK 为 72MHZ */
	GENERAL_TIM_APBxClock_FUN (GENERAL_TIM_CLK, ENABLE);

  /* 使能定时器通道引脚GPIO时钟 */
  GENERAL_TIM_GPIO_APBxClock_FUN(GENERAL_TIM_GPIO_CLK1|GENERAL_TIM_GPIO_CLK1, ENABLE); 

  /* 配置定时器通道3输出引脚模式:复用推挽输出模式 */
  GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_PIN1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GENERAL_TIM_PORT1, &GPIO_InitStructure);
	
}

/**
  * 函数功能: 配置嵌套向量中断控制器NVIC
  */
static void NVIC_Config_PWM(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  /* 选择中断优先级配置组为2个抢占式优先级和2个子优先级,可以参考misc.h文件了解相关设置 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  /* 配置TIM3_IRQ中断为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = GENERAL_TIMx_IRQn;
	/* 设置抢占式优先级为0 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	/* 设置子优先级为3 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	/* 使能外部中断通道 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/**
  * 函数功能: 配置TIMx输出的PWM信号的模式,如周期、极性、占空比
  */

static void GENERAL_TIMx_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

  /* 定时器基本参数始终 */		 
  /* 当定时器从0计数到255,即为256次,为一个定时周期 */
  TIM_TimeBaseStructure.TIM_Period = 255; 
  /* 设置预分频:不预分频,即为72MHz,输出脉冲频率:72MHz/(1999+1)/(255+1) */
  TIM_TimeBaseStructure.TIM_Prescaler = 1999;
  /* 设置时钟分频系数:不分频(这里用不到) */
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
  /* 向上计数模式 */
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(GENERAL_TIMx, &TIM_TimeBaseStructure);

  /* 定时器输出通道1模式配置 */
  /* 模式配置:PWM模式1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  /* 输出状态设置:使能输出 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	
  /* 设置跳变值,当计数器计数到这个值时,电平发生跳变 */
  TIM_OCInitStructure.TIM_Pulse = 0;
  
  /* 当定时器计数值小于CCR1_Val时为低电平 */
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  /* 初始化定时器通道1输出PWM */
  GENERAL_TIM_OCxInit(GENERAL_TIMx, &TIM_OCInitStructure);
  /* 定时器比较输出通道1预装载配置:使能预装载 */
  GENERAL_TIM_OCxPreloadConfig(GENERAL_TIMx, TIM_OCPreload_Enable);  
  /* 使能定时器重载寄存器ARR */
  TIM_ARRPreloadConfig(GENERAL_TIMx, ENABLE);
  /* 使能定时器 */
  TIM_Cmd(GENERAL_TIMx, ENABLE);  
  /* 配置NVIC */
  NVIC_Config_PWM();
  /* 定时器更新中断 */
  TIM_ITConfig(GENERAL_TIMx, TIM_IT_Update, ENABLE);
								
}

/**
  * 函数功能: TIMx输出PWM信号初始化
  * 说    明:只要调用这个函数TIMx的通道就会有PWM信号输出
  */
void GENERAL_TIMx_PWM_Init(void)
{
	GENERAL_TIMx_GPIO_Config();
	GENERAL_TIMx_Configuration();	
}

2.bsp_GeneralTIM.h

#ifndef __GENERAL_TIM_H__
#define __GENERAL_TIM_H__

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

/* 类型定义 ------------------------------------------------------------------*/
/* 宏定义 --------------------------------------------------------------------*/

#define GENERAL_TIMx                        TIM3
#define GENERAL_TIM_APBxClock_FUN           RCC_APB1PeriphClockCmd
#define GENERAL_TIM_CLK                     RCC_APB1Periph_TIM3
#define GENERAL_TIM_GPIO_APBxClock_FUN      RCC_APB2PeriphClockCmd
#define GENERAL_TIM_GPIO_CLK1               RCC_APB2Periph_GPIOA
#define GENERAL_TIM_PORT1                   GPIOA
#define GENERAL_TIM_PIN1                    GPIO_Pin_11
#define GENERAL_TIM_OCxInit                 TIM_OC3Init
#define GENERAL_TIM_OCxPreloadConfig        TIM_OC3PreloadConfig
#define GENERAL_TIM_CCRx                    CCR3
#define GENERAL_TIMx_IRQn                   TIM3_IRQn              //中断
#define GENERAL_TIMx_IRQHandler             TIM3_IRQHandler


/* 扩展变量 ------------------------------------------------------------------*/
/* 函数声明 ------------------------------------------------------------------*/

void GENERAL_TIMx_PWM_Init(void);

#endif	/* __GENERAL_TIM_H__ */

3.main.c


/* 包含头文件 ----------------------------------------------------------------*/
#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" 
/* 函数体 --------------------------------------------------------------------*/

/**
  * 函数功能: 主函数.
  */
int main(void)
{

/* 初始化定时器PWM输出 */
  GENERAL_TIMx_PWM_Init();  
  while (1)
  {
  //空
    }
}


四、实验效果

呼吸灯

结束语

本文以STM32VET6为例讲解了用STM32单片机中用定时器的PWM波来实现LED的“呼吸”,并指出其中的易坑点。希望对大家有所帮助!如果还有什么问题,欢迎评论区留言,谢谢!

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

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

相关文章

AI赋能未来教育:中国教学科研新蓝图

设“人啊 前言 回顾过去&#xff0c;传统的教育模式以知识灌输和应试为主&#xff0c;虽培养出大量人才&#xff0c;但也存在着学生创新能力不足、实践经验缺乏等问题。随着时代的进步和科技的发展&#xff0c;传统教育模式已难以满足当今社会对人才的需求。然而&#xff0c;当…

【JAVA进阶篇教学】第十三篇:Java中volatile关键字讲解

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第十三篇&#xff1a;volatile关键字讲解。 在 Java 中&#xff0c;volatile关键字是一种轻量级的同步机制&#xff0c;用于确保变量的可见性和禁止指令重排序。本文将详细解释volatile关键字的工作原理、可见性保证以及…

常见算法策略

前言 算法策略是指在解决问题或完成任务时所采用的方法、技巧或步骤的总称。 在设计算法时&#xff0c;通常会考虑多种策略&#xff0c;并选择最适合特定问题的策略来实现算法的设计和优化。 算法策略比较 动态规划 动态规划介绍入口

开放式服务管理系统

开放式服务管理系统&#xff08;ITILDESK&#xff09;是一个灵活且适应性强的解决方案&#xff0c;它旨在覆盖各类流程服务场景&#xff0c;以满足不同组织和行业的多样化需求。这种系统通常提供了一套完整的工具和功能&#xff0c;用于管理、监控和优化各种服务流程&#xff0…

R2S+ZeroTier+Trilium

软路由使用ZeroTier搭建远程笔记 软路由使用ZeroTier搭建远程笔记 环境部署 安装ZeroTier安装trilium 环境 软路由硬件&#xff1a;友善 Nanopo R2S软路由系统&#xff1a;OpenWrt&#xff0c;使用第三方固件nanopi-openwrt。内网穿透&#xff1a;ZeroTier。远程笔记&…

鸿蒙OpenHarmony:【常见编译问题和解决方法】

常见问题 常见编译问题和解决方法 鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 提示“usr/sbin/ninja: invalid option -- w” 现象描述&#xff1a; 编译失败&#xff0c;提示“usr/sbin/ninja: invalid…

医院如何做好漏费管理?什么是控费系统?控费系统现在成熟吗?

在中国深厚的人情土壤之中&#xff0c;某些医院里的医技科室&#xff0c;宛如隐秘的灰色地带&#xff0c;悄然滋生着利用职务之便谋取私利的暗流。这些科室的医务人员&#xff0c;以低于医院明文规定的收费标准&#xff0c;私下里为熟识的患者提供检查服务&#xff0c;仿佛形成…

docker 方式 elasticsearch 8.13 简单例子

安装 docker 虚拟机安装 elastic search 安装本地 # 创建 elastic 的网络 docker network create elastic # 用镜像的方式创建并启动容器 docker run -d --name es --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e "xpack.secur…

【通义千问系列】Qwen-Agent 从入门到精通【持续更新中……】

目录 前言一、快速开始1-1、介绍1-2、安装1-3、开发你自己的Agent 二、Qwen-Agent的使用和开发过程2-1、Agent2-1-1、Agent使用2-1-2、Agent开发 2-2、Tool2-2-1、工具使用2-2-2、工具开发 2-3、LLM2-3-1、LLM使用2-3-2、LLM开发 三、基于Qwen-Agent的案例分析3-1、3-2、 总结 …

Linux/Brainfuck

Brainfuck Enumeration Nmap 扫描发现对外开放了 22&#xff0c;25&#xff0c;110&#xff0c;143&#xff0c;443 五个端口&#xff0c;使用 nmap 扫描端口详细信息 ┌──(kali㉿kali)-[~/vegetable/HTB/Insane] └─$ nmap -sC -sV -p 22,25,110,143,443 -oA nmap 10.10…

【Unity Animation 2D】Unity Animation 2D骨骼绑定与动画制作

一、图片格式为png格式&#xff0c;并且角色各部分分离 图片参数设置 需要将Sprite Mode设置为Single&#xff0c;否则图片不能作为一个整体 1、创建骨骼 1.1 旋转Create Bone&#xff0c;点击鼠标左键确定骨骼位置&#xff0c;移动鼠标再次点击鼠标左键确定骨骼&#xff0c…

DSSAT作物模建模方法

原文链接&#xff1a;DSSAT作物模建模方法https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247604079&idx5&sn0151d083d35c9ea259cf155d082b0145&chksmfa821688cdf59f9eddae14a99fce4f56c6ad9d73db38e0b9b165dcb9b315b6ed845d83cd085f&token94156244…

OV SSL证书的多重优势:提升用户信任与安全

在数字化时代&#xff0c;网络安全成为了企业与用户共同关注的焦点。SSL证书作为保护数据传输安全的重要工具&#xff0c;其种类繁多&#xff0c;其中组织验证&#xff08;Organization Validation&#xff0c;简称OV&#xff09;SSL证书凭借其独特的优点&#xff0c;在众多安全…

【SpringBoot】使用阿里云实现短信验证

前言 之前在写Redis相关内容的时候&#xff0c;提到了Redis可以和我们的短信验证结合起来使用&#xff0c;于是这几天博主空了&#xff0c;想起来这个事&#xff0c;连忙学习了阿里云关于短信验证的内容&#xff0c;使用SpringBoot框架进行代码书写&#xff0c;并将Redis结合起…

SGP.02-v4.2-002

ETSI TS 102 226 [5] ts_102.226v13.0.0 Remote APDU structure for UICC based applications 在ETSI TS 102 223 [3]标准中&#xff0c;关于通过PUSH命令打开BIP&#xff08;基于IP的&#xff09;通道的数据字段可以包含任何为OPEN CHANNEL定义的COMPREHENSION-TLV&#xf…

MP4提取gif怎么操作?分享一招快制作

随着各种社交媒体的发展&#xff0c;越来越多的人在聊天中使用gif表情包来调节自己的聊天氛围。搞笑的gif表情包能够为我们平淡的生活添砖加瓦&#xff0c;带给我们一些轻松和欢乐。如果想要自己制作gif动画的时候就可以用视频转gif的工具&#xff0c;能够在不下载软件的情况下…

【Ubuntu永久授权串口设备读取权限‘/dev/ttyUSB0‘】

Ubuntu永久授权串口设备读取权限 1 问题描述2 解决方案2.1 查看ttyUSB0权限&#xff0c;拥有者是root&#xff0c;所属用户组为dialout2.2 查看dialout用户组成员&#xff0c;如图所示&#xff0c;普通用户y不在dialout组中2.3 将普通用户y加入dialout组中2.4 再次查看dialout用…

端到端将重塑智驾?获10亿美金融资,解密英国AI独角兽Wayve

‍作者 |张马也 编辑 |德新 就在前两天&#xff0c;英国AI公司Wayve宣布获得新一轮10.5亿美元融资&#xff0c;投资方为软银、英伟达和现有投资人微软&#xff0c;可以说是顶级豪华阵容。 作为一家英国公司&#xff0c;Wayve这轮融资也创造了英国AI公司有史以来最大的单笔融资…

保姆级教学 基于Hexo搭建个人网站(Github)

文章目录 搭建Hexo静态博客介绍一、注册Github账号二、 安装前置软件包三、 绑定github仓库创建SSH私钥添加私钥连接Github仓库 四、安装hexo1. 更改npm镜像源2. 创建一个文件夹 在里面打开终端3. 初始化hexo 五、切换主题1. 安装主题2. 修改默认主题查看修改主题后的网站 六、…

【密评】 | 商用密码应用安全性评估从业人员考核题库(8/58)

国家支持社会团体、企业利用自主创新技术制定&#xff08;&#xff09;国家标准、行业标准相关技术要求的商用密码团体标准、企业标准。 A.低于 B.等于 C.高于 D.相当于 在密码的实际应用中&#xff0c;通常使用下列哪种方法来实现不可否认性&#xff08;&#xff09;。 A.加密…