(HAL)STM32F407ZGT6——10-4 高级定时器 PWM 输入模式实验

一、高级定时器简介

高级定时器的框图和通用定时器框图很类似,只是添加了其它的一些功能,如:重复计数器、带死区控制的互补输出通道、断路输入等。

高级定时器的时钟来自APB2, 而PCLK2 = 168Mhz, 我们设置PPRE2不分频, 因此高级定时器时钟 = 168Mhz。

1、重复计数器

在学习基本定时器和通用定时器的时候,我们知道定时器发生上溢或者下溢时,会直接生成更新事件。有重复计数器的定时器并不完全是这样的,定时器每次发生上溢或下溢时,重复计数器的值会减一,当重复计数器的值为 0 时,再发生一次上溢或者下溢才会生成定时器更新事件。

2、输出比较

第②部分的 TIMx_CH1N、TIMx_CH2N 和 TIMx_CH3N 分别是定时器通道 1、通道 2 和通道 3的互补输出通道,通道4 是没有互补输出通道的。DTG 是死区发生器,死区时间由DTG[7:0]位来配置。如果不使用互补通道和死区时间控制,那么高级定时器 TIM1 和 TIM8 和通用定时器的输出比较部分使用方法基本一样,只是要注意 MOE 位得置1 定时器才能输出。

3、断路功能

断路功能也称刹车功能,一般用于电机控制的刹车。F4 系列有一个断路通道,断路源可以是刹车输入引脚(TIMx_BKIN),也可以是一个时钟失败事件。时钟失败事件由复位时钟控制器中的时钟安全系统产生。系统复位后,断路功能默认被禁止,MOE 位为低。

使能断路功能的方法:将TIMx_BDTR 的位 BKE 置1。断路输入引脚 TIMx_BKIN 的输入有效电平可通过TIMx_BDTR 寄存器的位BKP 设置。

使能刹车功能后:由 TIMx_BDTR 的MOE、OSSI、OSSR 位,TIMx_CR2 的OISx、OISxN位,TIMx_CCER 的CCxE、CCxNE 位控制OCx 和OCxN 输出状态。无论何时,OCx 和OCxN输出都不能同时处在有效电平。 

当发生断路输入后,会怎么样?

1,MOE 位被异步地清零,OCx 和OCxN 为无效、空闲或复位状态(由OSSI 位选择)。 

2,OCx 和 OCxN 的状态:由相关控制位状态决定,当使用互补输出时:根据情况自动控制输出电平,参考《STM32F4xx 参考手册_V4(中文版).pdf》手册第382 页的表73 具有断路功能的互补通道Ocx 和 OcxN 的控制位。

3,BIF 位置1,如果使能了 BIE 位,还会产生刹车中断;如果使能了TDE 位,会产生DMA请求。

4,如果AOE 位置 1,在下一个更新事件 UEV 时,MOE 位被自动置1。

高级定时器框图部分就简单介绍到这里,下面通过实际的实验来学习高级定时器。

二、实验内容及其注意事项

   1、实验内容

         本次实验将PC6复用为TIM8_CH1,映射到同一个Tl1使用两个CCRx捕获比较器,将Tl1FP1配置为上升沿触发捕获并且使能中断,将Tl1FP2配置为下降沿触发捕获。另外将Tl1配置为上升沿触发的从模式的复位模式。测量的PWM波形由通用定时器TIM14_CH1产生,可通过TIM14的CCR1的值设置占空比。

2、注意事项:

(1)问题:上升沿是先触发清零动作还是CCR1(捕获比较器)的捕获动作?

答案是,硬件会先进行CCR1的捕获动作,再进行清零。

(2)本次实验为,PC9(TIM14_CH1)配置psc = 0,arr = 65535,精度为 1/168M = 6ns,最长测量时间约为390us。

(3)F4仅有一个捕获比较寄存器CCR1。如下图:

三、相关配置文件

1、atim.c

#include "./BSP/TIMER/atim.h"



TIM_HandleTypeDef a_timx_chy_ic_handle;





uint8_t g_timxchy_pwmin_sta  = 0;   /* PWM输入状态 */

uint16_t g_timxchy_pwmin_psc  = 0;  /* PWM输入分频系数 */

uint32_t g_timxchy_pwmin_hval = 0;  /* PWM的高电平脉宽 */

uint32_t g_timxchy_pwmin_cval = 0;  /* PWM的周期宽度 */



void a_timx_chy_ic_init(void)

{

    /* 时钟使能,引脚初始化 */

    __HAL_RCC_TIM8_CLK_ENABLE();

    __HAL_RCC_GPIOC_CLK_ENABLE();

    

    GPIO_InitTypeDef gpio_init_struct;

    gpio_init_struct.Pin = GPIO_PIN_6;                   /* LED0引脚 */

    gpio_init_struct.Mode = GPIO_MODE_AF_PP;                /* 复用推挽输出 */

    gpio_init_struct.Alternate = GPIO_AF3_TIM8;

    gpio_init_struct.Pull = GPIO_PULLDOWN;                    /* 上拉 */

    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */

    HAL_GPIO_Init(GPIOC, &gpio_init_struct);                 /* 初始化LED0引脚 */

    

    a_timx_chy_ic_handle.Instance = TIM8;

    a_timx_chy_ic_handle.Init.Prescaler = 0;

    a_timx_chy_ic_handle.Init.Period = 65535;

    a_timx_chy_ic_handle.Init.CounterMode = TIM_COUNTERMODE_UP;

    //a_timx_chy_ic_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

    HAL_TIM_IC_Init(&a_timx_chy_ic_handle);

    

    

    /* 从模式选择复位模式初始化*/

    TIM_SlaveConfigTypeDef a_timx_chy_slave_config = {0};

    a_timx_chy_slave_config.SlaveMode = TIM_SLAVEMODE_RESET;        /* 选择复位模式,上升沿到来时,CNT变为0 */

    a_timx_chy_slave_config.InputTrigger = TIM_TS_TI1FP1;

    a_timx_chy_slave_config.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;

    a_timx_chy_slave_config.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;

    a_timx_chy_slave_config.TriggerFilter = 0;

    HAL_TIM_SlaveConfigSynchro(&a_timx_chy_ic_handle, &a_timx_chy_slave_config);

    

    /* 输入捕获初始化 */

    /* TL1 */

    TIM_IC_InitTypeDef a_timx_chy_ic_config = {0};

    a_timx_chy_ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;

    a_timx_chy_ic_config.ICPolarity = TIM_ICPOLARITY_RISING;

    a_timx_chy_ic_config.ICPrescaler = TIM_ICPSC_DIV1;

    a_timx_chy_ic_config.ICFilter = 0xff;

    HAL_TIM_IC_ConfigChannel(&a_timx_chy_ic_handle, &a_timx_chy_ic_config, TIM_CHANNEL_1);

    

    /* TL2 */

    a_timx_chy_ic_config.ICSelection = TIM_ICSELECTION_INDIRECTTI;            /* 注意TIM_CCMR1_CC2S_1 */

    a_timx_chy_ic_config.ICPolarity = TIM_ICPOLARITY_FALLING;

    a_timx_chy_ic_config.ICPrescaler = TIM_ICPSC_DIV1;

    a_timx_chy_ic_config.ICFilter = 0xff;

    HAL_TIM_IC_ConfigChannel(&a_timx_chy_ic_handle, &a_timx_chy_ic_config, TIM_CHANNEL_2);  /* 注意这里是通道2 */

    

    /* 配置定时器中断优先级,使能捕获中断 */

    HAL_NVIC_SetPriority(TIM8_CC_IRQn, 1, 3);

    HAL_NVIC_EnableIRQ(TIM8_CC_IRQn);

    

    /* 使能通道,通道1设置为捕获中断 */

    HAL_TIM_IC_Start_IT(&a_timx_chy_ic_handle,TIM_CHANNEL_1);

    HAL_TIM_IC_Start(&a_timx_chy_ic_handle,TIM_CHANNEL_2);

    

}





/**

* @brief       定时器TIMX PWM输入模式 重新启动捕获

* @param       无

* @retval      无

*/

void atim_timx_pwmin_chy_restart(void)

{

    sys_intx_disable();                                             /* 关闭中断 */



    g_timxchy_pwmin_sta = 0;                /* 清零状态,重新开始检测 */

    g_timxchy_pwmin_hval = 0;

    g_timxchy_pwmin_cval = 0;



    sys_intx_enable();                                              /* 打开中断 */

}





/* 定时器8 输入捕获 中断服务函数,仅TIM1/TIM8有这个函数,其他普通定时器没有这个中断服务函数! */

void TIM8_CC_IRQHandler(void)

{



    HAL_TIM_IRQHandler(&a_timx_chy_ic_handle); /* 定时器共用处理函数 */

}



void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

{

    if(htim->Instance == TIM8)

    {

        if(g_timxchy_pwmin_sta == 0)

        {

            if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) /* 当前活动通道是否为通道1 */

            {

                g_timxchy_pwmin_cval = HAL_TIM_ReadCapturedValue(&a_timx_chy_ic_handle,TIM_CHANNEL_1) + 1 + 1;      /* 第一个+1是因为从0开始计数 */

                g_timxchy_pwmin_hval = HAL_TIM_ReadCapturedValue(&a_timx_chy_ic_handle, TIM_CHANNEL_2) + 1 + 1;     /* 最后+1为手动修复误差 */

                g_timxchy_pwmin_sta = 1;

            }

        }

    }

}

 

注意误差问题

2、gtim.c

#include "./BSP/TIMER/gtim.h"



TIM_HandleTypeDef g_timx_pwm_chy_handle;     /* 定时器x句柄 */



/**

* @brief       通用定时器TIMX 通道Y PWM输出 初始化函数(使用PWM模式1)

* @note

*              通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候

*              通用定时器的时钟为APB1时钟的2倍, 而APB1为42M, 所以定时器时钟 = 84Mhz

*              定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.

*              Ft=定时器工作频率,单位:Mhz

*

* @param       arr: 自动重装值。

* @param       psc: 预分频系数

* @retval      无

*/

void gtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc)

{

    TIM_OC_InitTypeDef timx_oc_pwm_chy = {0};                       /* 定时器输出句柄 */

    

    g_timx_pwm_chy_handle.Instance = TIM14;                 /* 定时器x */

    g_timx_pwm_chy_handle.Init.Prescaler = psc;                     /* 预分频系数 */

    g_timx_pwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP;    /* 递增计数模式 */

    g_timx_pwm_chy_handle.Init.Period = arr;                        /* 自动重装载值 */

    HAL_TIM_PWM_Init(&g_timx_pwm_chy_handle);                       /* 初始化PWM */



    timx_oc_pwm_chy.OCMode = TIM_OCMODE_PWM1;                       /* 模式选择PWM1 */

    timx_oc_pwm_chy.Pulse = arr / 2;                                /* 设置比较值,此值用来确定占空比 */



    timx_oc_pwm_chy.OCPolarity = TIM_OCPOLARITY_LOW;                                        /* 输出比较极性为低 */

    HAL_TIM_PWM_ConfigChannel(&g_timx_pwm_chy_handle, &timx_oc_pwm_chy, TIM_CHANNEL_1); /* 配置TIMx通道y */

    HAL_TIM_PWM_Start(&g_timx_pwm_chy_handle, TIM_CHANNEL_1);                           /* 开启对应PWM通道 */

}



/**

* @brief       定时器底层驱动,时钟使能,引脚配置

*              此函数会被HAL_TIM_PWM_Init()调用

* @param       htim:定时器句柄

* @retval      无

*/

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)

{

    if (htim->Instance == TIM14)

    {

        GPIO_InitTypeDef gpio_init_struct;

      __HAL_RCC_TIM14_CLK_ENABLE();

      __HAL_RCC_GPIOF_CLK_ENABLE();

        gpio_init_struct.Pin = GPIO_PIN_9;              /* 通道y的GPIO口 */

        gpio_init_struct.Mode = GPIO_MODE_AF_PP;                        /* 复用推完输出 */

        gpio_init_struct.Pull = GPIO_PULLUP;                            /* 上拉 */

        gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;                  /* 高速 */

        gpio_init_struct.Alternate = GPIO_AF9_TIM14;         /* IO口REMAP设置, 是否必要查看头文件配置的说明! */

        HAL_GPIO_Init(GPIOF, &gpio_init_struct);

    }

}





3、main.c文件



#include "./SYSTEM/sys/sys.h"

#include "./SYSTEM/usart/usart.h"

#include "./SYSTEM/delay/delay.h"

#include "./BSP/LED/led.h"

#include "./BSP/KEY/key.h"

#include "./BSP/TIMER/atim.h"

#include "./BSP/TIMER/gtim.h"





extern uint16_t g_timxchy_pwmin_psc;    /* PWM输入状态 */

extern uint16_t g_timxchy_pwmin_sta;    /* PWM输入状态 */

extern uint32_t g_timxchy_pwmin_hval;   /* PWM的高电平脉宽 */

extern uint32_t g_timxchy_pwmin_cval;   /* PWM的周期宽度 */



int main(void)

{

    uint8_t t = 0;

    double ht, ct, f, tpsc;



    HAL_Init();                             /* 初始化HAL库 */

    sys_stm32_clock_init(336, 8, 2, 7);     /* 设置时钟,168Mhz */

    delay_init(168);                        /* 延时初始化 */

    usart_init(115200);                     /* 串口初始化为115200 */

    //led_init();                             /* 初始化LED */



    gtim_timx_pwm_chy_init(10 - 1, 84 - 1);   /* 1Mhz的计数频率, 100Khz PWM */

    TIM14->CCR1 = 2;                          /* F4仅有一个捕获比较寄存器CCR1,设置占空比 */

    a_timx_chy_ic_init();                     /* 初始化PWM输入捕获 */

    while (1)

    {

        delay_ms(10);

        t++;



        if (t >= 20)    /* 每200ms输出一次结果,并闪烁LED0,提示程序运行 */

        {

            if(g_timxchy_pwmin_sta)                                /* 捕获了一次数据 */

            {

                printf("\r\n");                                     /* 输出空,另起一行 */

                printf("PWM PSC  :%d\r\n", g_timxchy_pwmin_psc);    /* 打印分频系数 */

                printf("PWM Hight:%d\r\n", g_timxchy_pwmin_hval);   /* 打印高电平脉宽 */

                printf("PWM Cycle:%d\r\n", g_timxchy_pwmin_cval);   /* 打印周期 */

                tpsc = ((double)g_timxchy_pwmin_psc + 1) / 168;     /* 得到PWM采样时钟周期时间 */

                ht = g_timxchy_pwmin_hval * tpsc;                   /* 计算高电平时间 */

                ct = g_timxchy_pwmin_cval * tpsc;                   /* 计算周期长度 */

                f = (1 / ct) * 1000000;                             /* 计算频率 */

                printf("PWM Hight time:%.3fus\r\n", ht);            /* 打印高电平脉宽长度 */

                printf("PWM Cycle time:%.3fus\r\n", ct);            /* 打印周期时间长度 */

                printf("PWM Frequency :%.3fHz\r\n", f);             /* 打印频率 */

                atim_timx_pwmin_chy_restart();                      /* 重启PWM输入检测 */

            }



            LED1_TOGGLE();                                          /* DS1闪烁 */

            t = 0;

        }

    }

}

3、main.c文件

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/atim.h"
#include "./BSP/TIMER/gtim.h"


extern uint16_t g_timxchy_pwmin_psc;    /* PWM输入状态 */
extern uint16_t g_timxchy_pwmin_sta;    /* PWM输入状态 */
extern uint32_t g_timxchy_pwmin_hval;   /* PWM的高电平脉宽 */
extern uint32_t g_timxchy_pwmin_cval;   /* PWM的周期宽度 */

int main(void)
{
    uint8_t t = 0;
    double ht, ct, f, tpsc;

    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7);     /* 设置时钟,168Mhz */
    delay_init(168);                        /* 延时初始化 */
    usart_init(115200);                     /* 串口初始化为115200 */
    //led_init();                             /* 初始化LED */

    gtim_timx_pwm_chy_init(10 - 1, 84 - 1);   /* 1Mhz的计数频率, 100Khz PWM */
    TIM14->CCR1 = 2;                          /* F4仅有一个捕获比较寄存器CCR1,设置占空比 */
    a_timx_chy_ic_init();                     /* 初始化PWM输入捕获 */
    while (1)
    {
        delay_ms(10);
        t++;

        if (t >= 20)    /* 每200ms输出一次结果,并闪烁LED0,提示程序运行 */
        {
            if(g_timxchy_pwmin_sta)                                /* 捕获了一次数据 */
            {
                printf("\r\n");                                     /* 输出空,另起一行 */
                printf("PWM PSC  :%d\r\n", g_timxchy_pwmin_psc);    /* 打印分频系数 */
                printf("PWM Hight:%d\r\n", g_timxchy_pwmin_hval);   /* 打印高电平脉宽 */
                printf("PWM Cycle:%d\r\n", g_timxchy_pwmin_cval);   /* 打印周期 */
                tpsc = ((double)g_timxchy_pwmin_psc + 1) / 168;     /* 得到PWM采样时钟周期时间 */
                ht = g_timxchy_pwmin_hval * tpsc;                   /* 计算高电平时间 */
                ct = g_timxchy_pwmin_cval * tpsc;                   /* 计算周期长度 */
                f = (1 / ct) * 1000000;                             /* 计算频率 */
                printf("PWM Hight time:%.3fus\r\n", ht);            /* 打印高电平脉宽长度 */
                printf("PWM Cycle time:%.3fus\r\n", ct);            /* 打印周期时间长度 */
                printf("PWM Frequency :%.3fHz\r\n", f);             /* 打印频率 */
                atim_timx_pwmin_chy_restart();                      /* 重启PWM输入检测 */
            }

            LED1_TOGGLE();                                          /* DS1闪烁 */
            t = 0;
        }
    }
}

四、实验过程的注意问题

1、时钟使能问题。

时钟使能不可放在中间,必须放到最前面。导致下面问题,串口打印出错误的结果。

2、关于TI1FP2的配置问题描述。

TIM_ICFilter和TIM_ICPolarity不像TI1FP2那样在INDIRECT模式下使用(在channel1路径上)作为输入信号。因此,CCMR1必须是防止未初始化的过滤器和极性值。(来自有道翻译)

笔者的理解是必须把TI1FP2的filter以及polarity一起配置好。

五、实验现象

占空比均设为80%,改变了分频系数。图二现象出现较大误差。

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

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

相关文章

RTC实时时钟之读取时间

1. RTC 基本介绍 RTC(Real Time Clock) 即实时时钟,它是一个可以为系统提供精确的时间基准的元器件,RTC一般采用精度较高的晶振作为时钟源,有些RTC为了在主电源掉电时还可以工作,需要外加电池供电 2. RTC 控制器 2.1 RTC的特点是:…

NC248:左叶子之和(C++)

1.题目描述 2.题目分析 我们以一个二叉树为例 左叶子的特点是什么? 是左节点并且没有左右孩子节点 所以我们用leftnode保存root->lefe节点,判断条件为leftnode存在,并且不存在leftnode->left和leftnode->right,如果满…

[力扣 Hot100]Day18 矩阵置零

题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 出处 思路 在原数组上直接操作势必会出现“冗余”的0,即原本[i,j]处不是0,例如由于i行的其他位置有0导致[i,j]…

Kali Linux初识

Kali Linux(以前称为 BackTrack Linux)是一个开源的、基于 Debian 的 Linux 发行版,旨在进行高级渗透测试和安全审计。它通过提供通用工具、配置和自动化来做到这一点,使用户能够专注于需要完成的任务。 包括 600 多种渗透测试工…

LeetCode 使循环数组所有元素相等的最少秒数

地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 难度:中等 题目描述:给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒,你可以对数组执行以下操作: 对于范围在 [0, n - 1] 内的每…

【中关村开源生态论坛暨大模型智能应用技术大会】—— 探索AI和开源在未来的应用

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-9ttR7rpX3BzyF2C4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

任务悬赏系统搭建开发定制,任务分销系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、任务悬赏系统功能和运营方式 总结 前言 任务悬赏系统就是在小程序内可以做任务赚取佣金,这款系统主要针对手上有达人资源的用户可以冲一下这个项目…

(自用)learnOpenGL学习总结-高级OpenGL-几何着色器

在顶点着色器和片段着色器中间还有一个几何着色器。 几何着色器的输入是一个图元的一组顶点,在几何着色器中进行任意变换之后再给片段着色器,可以变成完全不一样的图元、可以生成更多的顶点。 #version 330 core layout (points) in; layout (line_str…

MySql 慢SQL配置,查询,处理

一.慢SQL配置相关 1.查看慢SQL是否开启 执行下面命令查看是否开启慢SQL show variables like %slow_query_log; 复制代码 OFF: 未开启ON: 2.打开慢SQL配置 执行下面的命令开启慢查询日志 set global slow_query_logON; 复制代码 3.修改慢查询阈值 前面介绍了SQL执行到达了…

Elasticsearch Windows版安装配置

Elasticsearch简介 Elasticsearch是一个开源的搜索文献的引擎,大概含义就是你通过Rest请求告诉它关键字,他给你返回对应的内容,就这么简单。 Elasticsearch封装了Lucene,Lucene是apache软件基金会一个开放源代码的全文检索引擎工…

已解决,引入外部文件,element-plus中的分页组件,当其位置在页面底部时,layout中的sizes(下拉框)始终向下弹出,且显示不完整,期望向上弹出

已解决:由于引入了外部样式,定位的问题导致的 解决办法: .el-select-dropdown {position: initial;margin: 0px;}排查问题的方法: 注释引入的外部文件,逐级排查问题所在,再新的css文件中重写样式&#xff…

第5章 python深度学习——波斯美女

第5章 深度学习用于计算机视觉 本章包括以下内容: 理解卷积神经网络(convnet) 使用数据增强来降低过拟合 使用预训练的卷积神经网络进行特征提取 微调预训练的卷积神经网络 将卷积神经网络学到的内容及其如何做出分类决策可视化 本章将…

用 CanvasKit 实现超级丝滑的原神地图(已开源)!!!

首先给大家送上预览地址: 官网地址:https://webstatic.mihoyo.com/ys/app/interactive-map/index.html canvaskit地址:http://106.55.55.247/ky-genshin-map/ 为什么 canvaskit 有如此高的性能? 第一个问题,官方网页…

【数据结构 07】AVL树

目录 一、二叉搜索树 二、AVL树 2.1 左单旋 2.2 右单旋 2.3 左右双旋 2.4 右左双旋 三、AVL.h 四、test.cpp 一、二叉搜索树 二叉搜索树,又称二叉排序树(Binary Search Tree),相比于普通二叉树,BST的特性有&a…

Python学习--一个逻辑推理的猜数字的游戏

修订Pico Fermi Bagels猜数字游戏代码,仅用于学习Python。 运行界面如下: 修订的代码如下: # // # 提升逻辑思维猜数字小游戏 # BY:Al Sweigart alinventwithpython.com # 翻译:诚外无物 # 说明:一个逻辑…

rust学习基于tokio_actor聊天服务器实战(一 )

前言 tokio是Rust中使用最广泛的异步Runtime,它性能高、功能丰富、便于使用,是使用Rust实现高并发不可不学的一个框架 Actor 背后的基本思想是产生一个独立的任务,该任务独立于程序的其他部分执行某些工作。 通常,这些参与者通过使…

如何使用postman进行接口自动化测试?

1、什么是自动化测试? 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试,模拟人去操作软件界面,把人从简单重复的劳动中解放出来,本质是用代码去测试另一段代码,属于一种软件开发工作&a…

TRIZ:打破便携与功能矛盾,卫星通信领域的新曙光!

在当今的卫星通信领域,便携性与功能性的矛盾一直是困扰着研发人员的一大难题。如何在保持设备便携的同时,确保其功能的完善和稳定,成为了业界关注的焦点。而解决这一问题的关键,或许正隐藏在TRIZ这一强大的创新方法论之中。 TRIZ&…

【PyCharm教程】PyCharm 安装、卸载和升级包

PyCharm 为特定的 Python 解释器提供了安装、卸载和升级 Python 包的方法。默认情况下,PyCharm 使用 pip 来管理项目包。对于 Conda 环境,您可以使用conda 包管理器。 在 PyCharm 中,您可以在Python 包工具窗口和 Python 解释器Settings/Pre…

暴雨受邀出席太原市人工智能行业协会年度大会

2024年1月26日,太原市人工智能行业协会第二届二次会员大会暨2024年年会成功召开。太原市委、市工商联、市大数据应用中心、市政协经济委员会以及太原市科技局的专家领导,与三百多名来自各行业的人工智能企业家和协会会员一同参加了本次盛会,共…