【正点原子STM32连载】第二十三章 高级定时器互补输出带死区控制实验 摘自【正点原子】APM32F407最小系统板使用指南

news2024/10/7 6:49:41

第二十三章 高级定时器互补输出带死区控制实验

本章将介绍使用APM32F407输出带死区和刹车控制的两路互补PWM。通过本章的学习,读者将学习到高级定时器的互补输出、死区插入和刹车的功能的使用。
本章分为如下几个小节:
23.1 硬件设计
23.2 程序设计
23.3下载验证

23.1 硬件设计
23.1.1 例程功能

  1. 定时器8通道1及其互补通道输出频率为1KHz,占空比为30%的PWM,且带死区控制
  2. 当定时器8的刹车输入引脚被拉高时,产生刹车时间,即定时器8停止输出PWM
  3. LED0闪烁,指示程序正在运行
    23.1.2 硬件资源
  4. LED
    LED1 - PF9
  5. 定时器8
    通道1 - PC6
    通道1互补通道 - PA7
    刹车输入 - PA6
    23.1.3 原理图
    本章实验使用的定时器8为APM32F407的片上资源,因此没有对应的连接原理图。
    23.2 程序设计
    23.2.1 Geehy标准库的TMR驱动
    本章实验将使用TMR8的通道1和通道1的互补通道输出两路带死区的互补PWM,同时还使用到了刹车功能,其具体的配置步骤如下:
    ①:配置TMR8的自动重装载值和预分频器数值等参数
    ②:配置输出比较通道1及其互补通道
    ③:配置刹车和死区
    ④:使能TMR8
    ⑤:使能TMR8的PWM输出
    ⑥:使能输出比较通道1输出
    ⑦:使能输出比较通道1互补通道输出
    ⑧:配置互补PWM的死区时间
    在Geehy标准库中对应的驱动函数如下:
    ①:配置TMR
    请见第16.2.1小节中配置TMR的相关内容。
    ②:配置输出比较通道
    请见第18.2.1小节中配置输出比较通道的相关内容。
    ③:配置刹车和死区
    该函数用于配置刹车和死区,其函数原型如下所示:
    void TMR_ConfigBDT(TMR_T* tmr, TMR_BDTConfig_T* BDTConfig);
    该函数的形参描述,如下表所示:
    在这里插入图片描述

表23.2.1.1 函数TMR_ConfigBDT()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表23.2.1.2 函数TMR_ConfigBDT()返回值描述
该函数使用TMR_BDTConfig_T类型的结构体变量传入TMR刹车和死区的配置参数,该结构体的定义如下所示:
typedef enum
{
TMR_RMOS_STATE_DISABLE, /* 禁止输出 /
TMR_RMOS_STATE_ENABLE /
输出无效电平 */
} TMR_RMOS_STATE_T;

typedef enum
{
TMR_IMOS_STATE_DISABLE, /* 禁止输出 /
TMR_IMOS_STATE_ENABLE /
死区期间输出无效电平,否则输出空闲电平 */
} TMR_IMOS_STATE_T;

typedef enum
{
TMR_LOCK_LEVEL_OFF, /* 无锁定写保护 /
TMR_LOCK_LEVEL_1, /
锁定写保护级别1 /
TMR_LOCK_LEVEL_2, /
锁定写保护级别2 /
TMR_LOCK_LEVEL_3 /
锁定写保护级别3 */
} TMR_LOCK_LEVEL_T;

typedef enum
{
TMR_BRK_STATE_DISABLE, /* 禁用刹车功能 /
TMR_BRK_STATE_ENABLE /
使能刹车功能 */
} TMR_BRK_STATE_T;

typedef enum
{
TMR_BRK_POLARITY_LOW, /* 刹车输入低电平有效 /
TMR_BRK_POLARITY_HIGH /
刹车输入高电平有效 */
} TMR_BRK_POLARITY_T;

typedef enum
{
TMR_AUTOMATIC_OUTPUT_DISABLE, /* 禁用自动输出 /
TMR_AUTOMATIC_OUTPUT_ENABLE /
使能自动输出 */
} TMR_AUTOMATIC_OUTPUT_T;

typedef struct
{
TMR_RMOS_STATE_T RMOS; /* 运行模式下的关闭状态 /
TMR_IMOS_STATE_T IMOS; /
空闲模式下的关闭状态 /
TMR_LOCK_LEVEL_T lockLevel; /
锁定写保护模式 /
uint16_t deadTime; /
互补输出通道的死区持续时间 /
TMR_BRK_STATE_T BRKState; /
使能刹车功能 /
TMR_BRK_POLARITY_T BRKPolarity; /
刹车输入极性 /
TMR_AUTOMATIC_OUTPUT_T automaticOutput; /
使能自动输出 */
} TMR_BDTConfig_T;
该函数的使用示例,如下所示:
#include “apm32f4xx.h”
#include “apm32f4xx_tmr.h”

void example_fun(void)
{
TMR_BDTConfig_T tmr_bdt_init_struct;

/* 配置TMR8的刹车和死区 */
tmr_bdt_init_struct.RMOS			= TMR_RMOS_STATE_DISABLE;
tmr_bdt_init_struct.IMOS			= TMR_IMOS_STATE_DISABLE;
tmr_bdt_init_struct.lockLevel		= TMR_LOCK_LEVEL_OFF;
tmr_bdt_init_struct.deadTime		= 0;
tmr_bdt_init_struct.BRKState		= TMR_BRK_STATE_ENABLE;
tmr_bdt_init_struct.BRKPolarity		= TMR_BRK_POLARITY_HIGH;
tmr_bdt_init_struct.automaticOutput	= TMR_AUTOMATIC_OUTPUT_ENABLE;
TMR_ConfigBDT(TMR8, &tmr_bdt_init_struct);

}
④:使能TMR
请见第16.2.1小节中使能TMR的相关内容。
⑤:使能高级定时器PWM输出
请见第21.2.1小节中使能高级定时器PWM输出的相关内容。
⑥:使能捕获比较通道
请见第18.2.1小节中使能捕获比较通道的相关内容。
⑦:使能捕获比较互补通道
该函数用于使能捕获不叫互补通道,其函数原型如下所示:
void TMR_EnableCCxNChannel(TMR_T* tmr, TMR_CHANNEL_T channel);
该函数的形参描述,如下表所示:
形参 描述
tmr 指向TMR外设结构体的指针
例如:TMR1、TMR2等(在apm32f4xx.h文件中有定义)
channel 指定使能的捕获比较互补通道
例如:TMR_CHANNEL_1、TMR_CHANNEL_2等(在apm32f4xx_tmr.h文件中有定义)
表23.2.1.3 函数TMR_EnableCCxNChannel()形参描述
该函数的返回值描述,如下表所示:
返回值 描述
无 无
表23.2.1.4 函数TMR_EnableCCxNChannel()返回值描述
该函数的使用示例,如下所示:
#include “apm32f4xx.h”
#include “apm32f4xx_tmr.h”

void example_fun(void)
{
/* 使能TMR1捕获比较通道1互补通道 */
TMR_EnableCCxNChannel(TMR1, TMR_CHANNEL_1);
}
⑧:配置死区时间
高级定时器的死区时间配置,可以通过函数TMR_ConfigBDT()进行配置,也可以通过写寄存器的方式直接修改高级定时器刹车和死区寄存器的DTS位,示例如下所示:
#include “apm32f4xx.h”

void example_fun(void)
{
/* 配置TMR8的死区时间 */
TMR8->BDT_B.DTS = 100;
}
23.2.2 高级定时器驱动
本章实验的高级定时器驱动主要负责向应用层提供高级定时器的初始化函数和PWM占空比、死区时间的配置函数。本章实验中,高级定时器的驱动代码包括atmr.c和atmr.h两个文件。
高级定时器驱动中,对TMR、GPIO相关的宏定义,如下所示:
#define ATMR_TMRX_CPLM TMR8
#define ATMR_TMRX_CPLM_CHY TMR_CHANNEL_1
#define ATMR_TMRX_CPLM_CLK_ENABLE()
do {
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR8);
} while (0)

#define ATMR_TMRX_CPLM_CHY_GPIO_PORT GPIOC
#define ATMR_TMRX_CPLM_CHY_GPIO_PIN GPIO_PIN_6
#define ATMR_TMRX_CPLM_CHY_GPIO_PIN_SOURCE GPIO_PIN_SOURCE_6
#define ATMR_TMRX_CPLM_CHY_GPIO_AF GPIO_AF_TMR8
#define ATMR_TMRX_CPLM_CHY_GPIO_CLK_ENABLE()
do {
RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOC);
} while (0)

#define ATMR_TMRX_CPLM_CHYN_GPIO_PORT GPIOA
#define ATMR_TMRX_CPLM_CHYN_GPIO_PIN GPIO_PIN_7
#define ATMR_TMRX_CPLM_CHYN_GPIO_PIN_SOURCE GPIO_PIN_SOURCE_7
#define ATMR_TMRX_CPLM_CHYN_GPIO_AF GPIO_AF_TMR8
#define ATMR_TMRX_CPLM_CHYN_GPIO_CLK_ENABLE()
do {
RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
} while (0)

#define ATMR_TMRX_CPLM_BKIN_GPIO_PORT GPIOA
#define ATMR_TMRX_CPLM_BKIN_GPIO_PIN GPIO_PIN_6
#define ATMR_TMRX_CPLM_BKIN_GPIO_PIN_SOURCE GPIO_PIN_SOURCE_6
#define ATMR_TMRX_CPLM_BKIN_GPIO_AF GPIO_AF_TMR8
#define ATMR_TMRX_CPLM_BKIN_GPIO_CLK_ENABLE()
do {
RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
} while (0)
高级定时器驱动中TMR8的初始化函数,如下所示:
/**

  • @brief 初始化高级定时器互补PWM输出

  • @note 当APB1PSC!=1时,定时器的时钟频率为APB2时钟的2倍

  •  	因此定时器的时钟频率为168MHz
    
  •  	定时器溢出时间计算方法:Tout = ((arr + 1) * (psc + 1)) / TMRxCLK
    
  •  	TMRxCLK=定时器时钟频率,单位MHz
    
  • @param arr: 自动重装载值

  • @param psc: 预分频器数值

  • @retval 无
    */
    void atmr_tmrx_cplm_pwm_init(uint16_t arr, uint16_t psc)
    {
    GPIO_Config_T gpio_init_struct;
    TMR_BaseConfig_T tmr_init_struct;
    TMR_OCConfig_T tmr_oc_init_struct;
    TMR_BDTConfig_T tmr_bdt_init_struct;

    /* 使能时钟 /
    ATMR_TMRX_CPLM_CLK_ENABLE(); /
    使能高级定时器时钟 /
    ATMR_TMRX_CPLM_CHY_GPIO_CLK_ENABLE(); /
    使能PWM输出引脚端口时钟 /
    ATMR_TMRX_CPLM_CHYN_GPIO_CLK_ENABLE(); /
    使能PWM互补输出引脚端口时钟 /
    ATMR_TMRX_CPLM_BKIN_GPIO_CLK_ENABLE(); /
    使能刹车输入引脚端口时钟 */

    /* 配置PWM输出引脚 /
    gpio_init_struct.pin = ATMR_TMRX_CPLM_CHY_GPIO_PIN; /
    PWM输出引脚 /
    gpio_init_struct.mode = GPIO_MODE_AF; /
    复用功能模式 /
    gpio_init_struct.speed = GPIO_SPEED_100MHz; /
    高速 /
    gpio_init_struct.otype = GPIO_OTYPE_PP; /
    推挽输出 /
    gpio_init_struct.pupd = GPIO_PUPD_DOWN; /
    下拉 /
    GPIO_Config(ATMR_TMRX_CPLM_CHY_GPIO_PORT, &gpio_init_struct);
    GPIO_ConfigPinAF(ATMR_TMRX_CPLM_CHY_GPIO_PORT, /
    配置引脚复用功能 */
    ATMR_TMRX_CPLM_CHY_GPIO_PIN_SOURCE,
    ATMR_TMRX_CPLM_CHY_GPIO_AF);

    /* 配置PWM互补输出引脚 /
    gpio_init_struct.pin = ATMR_TMRX_CPLM_CHYN_GPIO_PIN; /
    PWM互补输出引脚 /
    gpio_init_struct.mode = GPIO_MODE_AF; /
    复用功能模式 /
    gpio_init_struct.speed = GPIO_SPEED_100MHz; /
    高速 /
    gpio_init_struct.otype = GPIO_OTYPE_PP; /
    推挽输出 /
    gpio_init_struct.pupd = GPIO_PUPD_DOWN; /
    下拉 /
    GPIO_Config(ATMR_TMRX_CPLM_CHYN_GPIO_PORT, &gpio_init_struct);
    GPIO_ConfigPinAF(ATMR_TMRX_CPLM_CHYN_GPIO_PORT, /
    配置引脚复用功能 */
    ATMR_TMRX_CPLM_CHYN_GPIO_PIN_SOURCE,
    ATMR_TMRX_CPLM_CHYN_GPIO_AF);

    /* 配置刹车输入引脚 /
    gpio_init_struct.pin = ATMR_TMRX_CPLM_BKIN_GPIO_PIN; /
    刹车输入引脚 /
    gpio_init_struct.mode = GPIO_MODE_AF; /
    复用功能模式 /
    gpio_init_struct.speed = GPIO_SPEED_100MHz; /
    高速 /
    gpio_init_struct.otype = GPIO_OTYPE_PP; /
    推挽输出 /
    gpio_init_struct.pupd = GPIO_PUPD_DOWN; /
    下拉 /
    GPIO_Config(ATMR_TMRX_CPLM_BKIN_GPIO_PORT, &gpio_init_struct);
    GPIO_ConfigPinAF(ATMR_TMRX_CPLM_BKIN_GPIO_PORT, /
    配置引脚复用功能 */
    ATMR_TMRX_CPLM_BKIN_GPIO_PIN_SOURCE,
    ATMR_TMRX_CPLM_BKIN_GPIO_AF);

    /* 配置高级定时器 /
    tmr_init_struct.countMode = TMR_COUNTER_MODE_UP; /
    向上计数 /
    tmr_init_struct.clockDivision = TMR_CLOCK_DIV_1; /
    时钟分频系数 /
    tmr_init_struct.period = arr; /
    自动重装载值 /
    tmr_init_struct.division = psc; /
    预分频器数值 /
    tmr_init_struct.repetitionCounter = 0; /
    重复计数数值 /
    TMR_ConfigTimeBase(ATMR_TMRX_CPLM, &tmr_init_struct); /
    配置高级定时器 */

    /* 配置输出比较通道 /
    tmr_oc_init_struct.mode = TMR_OC_MODE_PWM1; /
    PWM模式1 /
    tmr_oc_init_struct.outputState = TMR_OC_STATE_DISABLE; /
    使能输出 /
    tmr_oc_init_struct.outputNState = TMR_OC_NSTATE_DISABLE; /
    使能互补输出 /
    tmr_oc_init_struct.polarity = TMR_OC_POLARITY_LOW; /
    低电平有效 /
    tmr_oc_init_struct.nPolarity = TMR_OC_NPOLARITY_LOW; /
    互补低电平有效 /
    tmr_oc_init_struct.idleState = TMR_OC_IDLE_STATE_SET; /
    空闲输出状态 /
    tmr_oc_init_struct.nIdleState = TMR_OC_NIDLE_STATE_SET;/
    互补空闲输出状态 /
    tmr_oc_init_struct.pulse = (arr + 1) >> 1; /
    有效电平脉宽 /
    TMR_ConfigOC1(ATMR_TMRX_CPLM, &tmr_oc_init_struct); /
    配置输出比较通道 */

    /* 配置刹车和死区 */
    tmr_bdt_init_struct.RMOS = TMR_RMOS_STATE_DISABLE;
    tmr_bdt_init_struct.IMOS = TMR_IMOS_STATE_DISABLE;
    tmr_bdt_init_struct.lockLevel = TMR_LOCK_LEVEL_OFF;
    tmr_bdt_init_struct.deadTime = 0;
    tmr_bdt_init_struct.BRKState = TMR_BRK_STATE_ENABLE;
    tmr_bdt_init_struct.BRKPolarity = TMR_BRK_POLARITY_HIGH;
    tmr_bdt_init_struct.automaticOutput = TMR_AUTOMATIC_OUTPUT_ENABLE;
    TMR_ConfigBDT(ATMR_TMRX_CPLM, &tmr_bdt_init_struct);

    /* 使能高级定时器和输出比较通道输出 /
    TMR_Enable(ATMR_TMRX_CPLM); /
    使能高级定时器 /
    TMR_EnablePWMOutputs(ATMR_TMRX_CPLM); /
    使能PWM主输出 /
    TMR_EnableCCxChannel(ATMR_TMRX_CPLM, ATMR_TMRX_CPLM_CHY);/
    使能输出比较通道 /
    TMR_EnableCCxNChannel(ATMR_TMRX_CPLM, ATMR_TMRX_CPLM_CHY); /
    使能互补通道 /
    }
    从上面的代码中可以看出,初始化函数不仅配置了TMR8的输出比较通道1输出PWM外,还配置使能了TMR8输出比较通道1的互补通道输出互补的PWM,同时还配置了死区时间和使能刹车功功能。
    高级定时器驱动中配置PWM占空比和死区时间的函数,如下所示:
    /
    *

  • @brief 设置高级定时器输出比较值和死区时间

  • @param ccr: 输出比较值

  • @param dtg: 死区时间

  • @note 当dtg[7:5] = 0xx时,死区时间 = dtg[7:0] * tDTS

  •  	当dtg[7:5] = 10x时,死区时间 = (64 + dtg[5:0]) * tDTS * 2
    
  •  	当dtg[7:5] = 110时,死区时间 = (32 + dtg[4:0]) * tDTS * 8
    
  •  	当dtg[7:5] = 111时,死区时间 = (32 + dtg[4:0]) * tDTS * 16
    
  •  	tDTS = (2^TMRx_CTRL1[9:8]) / TMRxCLK
    
  •  	TMRxCLK为定时器时钟频率
    
  •  	TMRx_CTRL1[9:8]为定时器时钟分频系数
    
  • @retval 无
    /
    void atmr_tmrx_cplm_pwm_set(uint16_t ccr, uint8_t dtg)
    {
    /
    设置死区时间 */
    ATMR_TMRX_CPLM->BDT_B.DTS = dtg;

    /* 设置输出比较值 */
    TMR_ConfigCompare1(ATMR_TMRX_CPLM, ccr);
    }
    从上面的代码中可以看出,该函数配置了TMR8的死区时间和输出比较值,因为配置PWM的占空比就是配置对应通道的输出比较值。
    23.2.3 实验应用代码
    本章实验的应用代码,如下所示:
    int main(void)
    {
    uint8_t t = 0;

    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_3); /* 设置中断优先级分组为组3 /
    sys_apm32_clock_init(336, 8, 2, 7); /
    配置系统时钟 /
    delay_init(168); /
    初始化延时功能 /
    usart_init(115200); /
    初始化串口 /
    led_init(); /
    初始化LED /
    /
    初始化高级定时器互补PWM输出,频率为1KHz /
    atmr_tmrx_cplm_pwm_init(1000 - 1, 168 - 1);
    /
    PWM占空比30%,死区时间100 * tDTS */
    atmr_tmrx_cplm_pwm_set(300 - 1, 100);

    while (1)
    {
    t++;
    if (t >= 20)
    {
    t = 0;
    LED0_TOGGLE();
    }

     	delay_ms(10);
    

    }
    }
    从上面的代码中可以看到,TMR8的自动重装载值配置为(1000-1),TMR8的预分频器数值配置为(168-1),并且TMR8的时钟频率为168MHz,因此TMR8的计数频率为1MHz,且TMR8每计数1000次溢出一次,因此溢出频率为1KHz,因此TMR8通道1及其互补通道输出两路互补PWM的频率也应该为1KHz。
    随后配置了TMR8通道1的比较值为(300-1),与自动重装载值的比值为30%,因此输出PWM的占空比也应该为30%,同时配置了死区时间为100,因为TMR8的时钟频率为168MHz,因此死区时间在配置为100的情况下,对应的具体时间为(100*1/168MHz)ns≈595ns。
    23.3 下载验证
    在完成编译和烧录操作后,可以通过示波器观察PC6引脚和PA7引脚输出的两路PWM,可以发现,这两路PWM为互补PWM,且频率为1KHz、占空比为30%、死区时间大约为595ns。应为是能了刹车和自动输出功能,因此将PA6引脚接入有效的高电平后,可以看到两路PWM都被禁止输出了,撤销PA6引脚接入的高电平后,可以看到两路PWM有自动恢复输出了。

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

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

相关文章

深度剖析:数据服务API的安全性与隐私保护

随着互联网技术的飞速发展,数据服务API已经成为了企业和个人获取、处理和分析数据的重要工具。然而,数据服务API的安全问题也日益凸显,尤其是在用户隐私保护方面。本文将深入剖析数据服务API的安全性与隐私保护问题,并结合产品FDL…

【STM32】IIC使用中DMA传输时 发送数据总少一个的问题

问题描述 在使用STM32 I2C数据发送过程中,发现每轮实际发送出去的数据总比在DMA配置中设定的传输数据个数要少一个。比方说:DMA配置里设定的传输数据个数是10个,结果发现在总线上只能发出9个,经过进一步发现是少了最后一个数据。…

MongoDB实验——MongoDB shell操作

MongoDB shell操作 实验原理 MongoDB shell是一个可执行文件,是MongoDB自带的一个交互式JavaScript shell,位于MongoDB安装路径下的/bin文件夹中。要启动MongoDB shell,可执行命令mongo。这将在控制台提示符中启动该shell,Mongo…

Spark及其生态简介

一、Spark简介 Spark 是一个用来实现快速而通用的集群计算的平台,官网上的解释是:Apache Spark™是用于大规模数据处理的统一分析引擎。 Spark 适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理、迭代算法、交互式查询、流处理…

歌尔股份半年报解读:越过山丘,前路如何?

2023年上半年,消费电子市场仍然表现低迷。Canalys数据显示,2023年第一季度同比下滑12%,第二季度同比下降11%,全球智能手机出货量连续第五个季度下滑。 这让外界议论纷纷,移动互联网的红利消失后,消费电子厂…

JDK源码-Synchronized

1. Synchronized 1.1 Synchronized定义 如果某一个资源被多个线程共享,为了避免因为资源抢占导致资源数据错乱,需要对线程进行同步,那么synchronized就是实现线程同步的关键字 synchronized的作用是保证在同一时刻, 被修饰的代…

Python Tcp编程

网络连接与通信是我们学习任何编程语言都绕不过的知识点。Python 也不例外,本文就介绍因特网的核心协议 TCP ,以及如何用 Python 实现 TCP 的连接与通信。 TCP 协议 TCP协议(Transmission Control Protocol, 传输控制协议&#…

Centos误删系统自带python2.7,yum报错恢复方法

使用wget分别下载python以及yum的rpm包 资源地址如下: http://vault.centos.org mkdir /usr/local/src/pythoncd /usr/local/src/pythonwget http://vault.centos.org/7.6.1810/os/x86_64/Packages/python-backports-1.0-8.el7.x86_64.rpmwget ht…

“处暑”即“出暑”?警惕秋老虎,收好这份初秋养生秘籍

“处暑”虽过,不过并不意味着“出暑”,尽管昼夜温差变大,但白天有时仍然很热,也多了换季感冒的风险。面对秋老虎的“烤”验,请收下这份健康养生指南,帮助我们安然度过夏末秋初! 养生秘籍一&…

suricata安装与配置

一、功能介绍 1、概述 suricata来源于经典的nids系统snort,是一套基于网络流量的威胁检测引擎,整合了ids,ips,network security monitoring(NSM)和PCAP processing等功能。 2、IDS功能 通过监听网卡流量并匹配规则引擎进行入侵实时监测和…

Omni Recover for Mac(专业的iPhone数据恢复软件)

Omni Recover for Mac是一款专业的Mac数据恢复软件,能够帮助用户快速找回被误删除、格式化、病毒攻击等原因造成的文件和数据,包括图片、视频、音频、文档、邮件、应用程序等。同时,Omni Recover for Mac还具有数据备份和清理功能&#xff0c…

香橙派 Orangepi Zero2 全志H616——简介

目录 1.外设功能介绍 1.1指令集 1.2cortex 架构 1.3CPU内核 1.4芯片SOC—麒麟9000芯片 1.外设功能介绍 1.1指令集 指令是计算机运行的最小的功能单位,而硬件的作用是完成每条指令规定的功能。就是加、减、乘、除、指数运算、等的命令集合。就相当于造房子中砌…

java设计模式---策略模式

策略模式的定义 策略设计模式是一种行为设计模式。当在处理一个业务时,有多种处理方式,并且需要再运行时决定使哪一种具体实现时,就会使用策略模式。 策略模式的类图: 策略模式的实现 在支付业务中,有三种付款方式&…

从C语言到C++_36(智能指针RAII)auto_ptr+unique_ptr+shared_ptr+weak_ptr

目录 1. 智能指针的引入_内存泄漏 1.1 内存泄漏 1.2 如何避免内存泄漏 2. RAII思想 2.1 RAII解决异常安全问题 2.2 智能指针原理 3. auto_ptr 3.1 auto_ptr模拟代码 4. unique_ptr 4.1 unique_ptr模拟代码 5. shared_ptr 5.1 shared_ptr模拟代码 5.2 循环引用 6.…

大数据学习:Hive安装部署

Hive的安装部署 注意hive就是一个构建数据仓库的工具,只需要在一台服务器上安装就可以了,不需要在多台服务器上安装。 此处以安装到node03为例;请大家保持统一 使用hadoop普通用户操作 1.1 先决条件 搭建好三节点Hadoop集群;node…

十六、策略模式

一、什么是策略模式 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法…

Python+turtle实现一个乌龟逃跑小游戏(可以和孩子一起完成)

直接上演示视频 这个代码也是之前当老师的时候,给孩子们写的一个小游戏,那么我们一起看一下这个小游戏是如何让完成的 1、首先完成代码的前期准备 1、这里我们t turtle.Pen() # 海龟—表示我们操作的小海龟 2、enemy turtle.Pen() # 敌龟—表示追击我…

计算机视觉的应用12-卷积神经网络中图像特征提取的可视化研究,让大家理解特征提取的全过程

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用12-卷积神经网络中图像特征提取的可视化研究,让大家理解特征提取的全过程。 要理解卷积神经网络中图像特征提取的全过程,我们可以将其比喻为人脑对视觉信息的处理过程。就像…

(数学) 剑指 Offer 39. 数组中出现次数超过一半的数字 ——【Leetcode每日一题】

❓ 剑指 Offer 39. 数组中出现次数超过一半的数字 难度:简单 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输…

echarts图表静态数据 象形柱形图、折线图、日历饼图、饼状图四种实现

标题 页面全部代码 <template><div class"data-serve"><div class"side"><div class"side-inner"><router-link class"side-btn" to"/camer/pushInfo"><i class"el-icon-picture&q…