STM32 基础知识(探索者开发板)--103讲 通用定时器

定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us
arr:自动重装载值        psc:时钟预分频数

定时器相关实验通用步骤

1.定时器初始化
a.定义结构体句柄
b.设基地址
c.设分频系数
d.设自动重装载值
e. 设计数模式
f.初始化定时器
2.外设模式配置
a.设置模式
d.映射通道
c.
3.Msp硬件配置
a.使能定时器,GPIO时钟
b.设置GPIO模式,引脚,上下拉,高低速
c.初始化GPIO
d.使能中断,设置中断优先级
4.使能计数器,中断,定时器中断服务函数,回调函数等

通用定时器相关代码如下

//gtim.c#include "./BSP/TIMER/gtim.h"
#include "./BSP/LED/led.h"
#include "./SYSTEM/usart/usart.h"TIM_HandleTypeDef g_timx_handle;             /* 定时器x句柄 *//*** @brief       通用定时器TIMX定时中断初始化函数* @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_int_init(uint16_t arr, uint16_t psc)
{GTIM_TIMX_INT_CLK_ENABLE(); /* 使能TIMx时钟 */g_timx_handle.Instance = GTIM_TIMX_INT;                 /* 通用定时器x */g_timx_handle.Init.Prescaler = psc;                     /* 预分频系数 */g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP;    /* 递增计数模式 */g_timx_handle.Init.Period = arr;                        /* 自动装载值 */HAL_TIM_Base_Init(&g_timx_handle);HAL_NVIC_SetPriority(GTIM_TIMX_INT_IRQn, 1, 3);         /* 设置中断优先级,抢占优先级1,子优先级3 */HAL_NVIC_EnableIRQ(GTIM_TIMX_INT_IRQn);                 /* 开启ITMx中断 */HAL_TIM_Base_Start_IT(&g_timx_handle);                  /* 使能定时器x和定时器x更新中断 */
}/*** @brief       定时器中断服务函数* @param       无* @retval      无*/
void GTIM_TIMX_INT_IRQHandler(void)
{/* 以下代码没有使用定时器HAL库共用处理函数来处理,而是直接通过判断中断标志位的方式 */if(__HAL_TIM_GET_FLAG(&g_timx_handle, TIM_FLAG_UPDATE) != RESET){LED1_TOGGLE();__HAL_TIM_CLEAR_IT(&g_timx_handle, TIM_IT_UPDATE);  /* 清除定时器溢出中断标志位 */}
}/*********************************以下是通用定时器PWM输出实验程序*************************/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 = GTIM_TIMX_PWM;                 /* 定时器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, GTIM_TIMX_PWM_CHY); /* 配置TIMx通道y */HAL_TIM_PWM_Start(&g_timx_pwm_chy_handle, GTIM_TIMX_PWM_CHY);                           /* 开启对应PWM通道 */
}/*** @brief       定时器底层驱动,时钟使能,引脚配置*              此函数会被HAL_TIM_PWM_Init()调用* @param       htim:定时器句柄* @retval      无*/
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{if (htim->Instance == GTIM_TIMX_PWM){GPIO_InitTypeDef gpio_init_struct;GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE();                            /* 开启通道y的CPIO时钟 */GTIM_TIMX_PWM_CHY_CLK_ENABLE();                                 /* 使能定时器时钟 */gpio_init_struct.Pin = GTIM_TIMX_PWM_CHY_GPIO_PIN;              /* 通道y的CPIO口 */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 = GTIM_TIMX_PWM_CHY_GPIO_AF;         /* IO口REMAP设置, 是否必要查看头文件配置的说明! */HAL_GPIO_Init(GTIM_TIMX_PWM_CHY_GPIO_PORT, &gpio_init_struct);}
}/*********************************以下是通用定时器输入捕获实验程序*************************/TIM_HandleTypeDef g_timx_cap_chy_handle;   /* 定时器x句柄 *//*** @brief       通用定时器TIMX 通道Y 输入捕获 初始化函数* @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_cap_chy_init(uint32_t arr, uint16_t psc)
{TIM_IC_InitTypeDef timx_ic_cap_chy = {0};g_timx_cap_chy_handle.Instance = GTIM_TIMX_CAP;                /* 定时器5 */g_timx_cap_chy_handle.Init.Prescaler = psc;                    /* 预分频系数 */g_timx_cap_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP;   /* 向上计数模式 */g_timx_cap_chy_handle.Init.Period = arr;                       /* 自动重装载值 */HAL_TIM_IC_Init(&g_timx_cap_chy_handle);                       /* 初始化定时器 */timx_ic_cap_chy.ICPolarity = TIM_ICPOLARITY_RISING;     /* 上升沿捕获 */timx_ic_cap_chy.ICSelection = TIM_ICSELECTION_DIRECTTI; /* 映射到TI1上 */timx_ic_cap_chy.ICPrescaler = TIM_ICPSC_DIV1;           /* 配置输入分频,不分频 */timx_ic_cap_chy.ICFilter = 0;                           /* 配置输入滤波器,不滤波 */HAL_TIM_IC_ConfigChannel(&g_timx_cap_chy_handle, &timx_ic_cap_chy, GTIM_TIMX_CAP_CHY); /* 配置TIM5通道1 */__HAL_TIM_ENABLE_IT(&g_timx_cap_chy_handle, TIM_IT_UPDATE);         /* 使能更新中断 */HAL_TIM_IC_Start_IT(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);     /* 开始捕获TIM5的通道1 */}/*** @brief       通用定时器输入捕获初始化接口*              HAL库调用的接口,用于配置不同的输入捕获* @param       htim:定时器句柄* @note        此函数会被HAL_TIM_IC_Init()调用* @retval      无*/
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{if (htim->Instance == GTIM_TIMX_CAP)                        /* 输入通道捕获 */{GPIO_InitTypeDef gpio_init_struct;GTIM_TIMX_CAP_CHY_CLK_ENABLE();                         /* 使能TIMx时钟 */GTIM_TIMX_CAP_CHY_GPIO_CLK_ENABLE();                    /* 开启捕获IO的时钟 */gpio_init_struct.Pin = GTIM_TIMX_CAP_CHY_GPIO_PIN;      /* 输入捕获的GPIO口 */gpio_init_struct.Mode = GPIO_MODE_AF_PP;                /* 复用推挽输出 */gpio_init_struct.Pull = GPIO_PULLDOWN;                  /* 下拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;     /* 高速 */gpio_init_struct.Alternate = GTIM_TIMX_CAP_CHY_GPIO_AF; /* 复用为捕获TIM5的通道1 */HAL_GPIO_Init(GTIM_TIMX_CAP_CHY_GPIO_PORT, &gpio_init_struct);HAL_NVIC_SetPriority(GTIM_TIMX_CAP_IRQn, 1, 3);         /* 抢占1,子优先级3 */HAL_NVIC_EnableIRQ(GTIM_TIMX_CAP_IRQn);                 /* 开启ITMx中断 */}
}/* 输入捕获状态(g_timxchy_cap_sta)* [7]  :0,没有成功的捕获;1,成功捕获到一次.* [6]  :0,还没捕获到高电平;1,已经捕获到高电平了.* [5:0]:捕获高电平后溢出的次数,最多溢出63次,所以最长捕获值 = 63*65536 + 65535 = 4194303*       注意:为了通用,我们默认ARR和CCRy都是16位寄存器,对于32位的定时器(如:TIM5),也只按16位使用*       按1us的计数频率,最长溢出时间为:4194303 us, 约4.19秒**      (说明一下:正常32位定时器来说,1us计数器加1,溢出时间:4294秒)*/
uint8_t g_timxchy_cap_sta = 0;    /* 输入捕获状态 */
uint16_t g_timxchy_cap_val = 0;   /* 输入捕获值 *//*** @brief       定时器中断服务函数* @param       无* @retval      无*/
void GTIM_TIMX_CAP_IRQHandler(void)
{HAL_TIM_IRQHandler(&g_timx_cap_chy_handle);        /* 定时器共用处理函数 */
}/*** @brief       定时器输入捕获中断处理回调函数* @param       htim:定时器句柄指针* @note        该函数在HAL_TIM_IRQHandler中会被调用* @retval      无*/
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == GTIM_TIMX_CAP){if ((g_timxchy_cap_sta & 0X80) == 0)         /* 还没成功捕获 */{if (g_timxchy_cap_sta & 0X40)            /* 捕获到一个下降沿 */{g_timxchy_cap_sta |= 0X80;           /* 标记成功捕获到一次高电平脉宽 */g_timxchy_cap_val = HAL_TIM_ReadCapturedValue(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 获取当前的捕获值 */TIM_RESET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);                     /* 一定要先清除原来的设置 */TIM_SET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_RISING);/* 配置TIM5通道1上升沿捕获 */}else                                     /* 还未开始,第一次捕获上升沿 */{g_timxchy_cap_sta = 0;               /* 清空 */g_timxchy_cap_val = 0;g_timxchy_cap_sta |= 0X40;           /* 标记捕获到了上升沿 */__HAL_TIM_DISABLE(&g_timx_cap_chy_handle);      /* 关闭定时器5 */__HAL_TIM_SET_COUNTER(&g_timx_cap_chy_handle,0);/* 定时器5计数器清零 */TIM_RESET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);   /* 一定要先清除原来的设置!! */TIM_SET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_FALLING);/* 定时器5通道1设置为下降沿捕获 */__HAL_TIM_ENABLE(&g_timx_cap_chy_handle);       /* 使能定时器5 */}}}
}/*** @brief       定时器更新中断回调函数* @param       htim : 定时器句柄指针* @note        此函数会被定时器中断函数共同调用的* @retval      无*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == GTIM_TIMX_CAP){if ((g_timxchy_cap_sta & 0x80) == 0)               /* 还没成功捕获 */{if (g_timxchy_cap_sta & 0x40)                  /* 已经捕获到高电平了 */{if ((g_timxchy_cap_sta & 0x3F) == 0x3F)    /* 高电平太长了 */{TIM_RESET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);                     /* 一定要先清除原来的设置 */TIM_SET_CAPTUREPOLARITY(&g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_RISING);/* 配置TIM5通道1上升沿捕获 */g_timxchy_cap_sta |= 0x80;             /* 标记成功捕获了一次 */g_timxchy_cap_val = 0xFFFF;}else  /* 累计定时器溢出次数 */{g_timxchy_cap_sta++;}}}}
}/*********************************以下是通用定时器脉冲计数实验程序*************************/TIM_HandleTypeDef g_timx_cnt_chy_handle;        /* 定时器x句柄 *//* 记录定时器计数器的溢出次数, 方便计算总脉冲个数 */
uint32_t g_timxchy_cnt_ofcnt = 0 ;              /* 计数溢出次数 *//*** @brief       通用定时器TIMX 通道Y 脉冲计数 初始化函数* @note*              本函数选择通用定时器的时钟选择: 外部时钟源模式1(SMS[2:0] = 111)*              这样CNT的计数时钟源就来自 TIMX_CH1/CH2, 可以实现外部脉冲计数(脉冲接入CH1/CH2)**              时钟分频数 = psc, 一般设置为0, 表示每一个时钟都会计数一次, 以提高精度.*              通过读取CNT和溢出次数, 经过简单计算, 可以得到当前的计数值, 从而实现脉冲计数** @param       arr: 自动重装值 * @retval      无*/
void gtim_timx_cnt_chy_init(uint16_t psc)
{GPIO_InitTypeDef gpio_init_struct;TIM_SlaveConfigTypeDef tim_slave_config = {0};GTIM_TIMX_CNT_CHY_CLK_ENABLE();                                        /* 使能TIMx时钟 */GTIM_TIMX_CNT_CHY_GPIO_CLK_ENABLE();                                   /* 开启GPIOA时钟 */g_timx_cnt_chy_handle.Instance = GTIM_TIMX_CNT;                        /* 定时器x */g_timx_cnt_chy_handle.Init.Prescaler = psc;                            /* 预分频系数 */g_timx_cnt_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP;           /* 递增计数模式 */g_timx_cnt_chy_handle.Init.Period = 65535;                             /* 自动重装载值 */HAL_TIM_IC_Init(&g_timx_cnt_chy_handle);gpio_init_struct.Pin = GTIM_TIMX_CNT_CHY_GPIO_PIN;                     /* 输入捕获的GPIO口 */gpio_init_struct.Mode = GPIO_MODE_AF_PP;                               /* 复用推挽输出 */gpio_init_struct.Pull = GPIO_PULLDOWN;                                 /* 下拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;                    /* 高速 */gpio_init_struct.Alternate = GTIM_TIMX_CNT_CHY_GPIO_AF;                /* 复用为捕获TIMx的通道 */HAL_GPIO_Init(GTIM_TIMX_CNT_CHY_GPIO_PORT, &gpio_init_struct);/* 从模式:外部触发模式1 */tim_slave_config.SlaveMode = TIM_SLAVEMODE_EXTERNAL1;                  /* 从模式:外部触发模式1 */tim_slave_config.InputTrigger = TIM_TS_TI1FP1;                         /* 输入触发:选择 TI1FP1(TIMX_CH1) 作为输入源 */tim_slave_config.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;         /* 触发极性:上升沿 */tim_slave_config.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;         /* 触发预分频:无 */tim_slave_config.TriggerFilter = 0x0;                                  /* 滤波:本例中不需要任何滤波 */HAL_TIM_SlaveConfigSynchronization(&g_timx_cnt_chy_handle, &tim_slave_config);HAL_NVIC_SetPriority(GTIM_TIMX_CNT_IRQn, 1, 3);                        /* 设置中断优先级,抢占优先级1,子优先级3 */HAL_NVIC_EnableIRQ(GTIM_TIMX_CNT_IRQn);                                /* 开启ITMx中断 */__HAL_TIM_ENABLE_IT(&g_timx_cnt_chy_handle, TIM_IT_UPDATE);            /* 使能更新中断 */HAL_TIM_IC_Start(&g_timx_cnt_chy_handle, GTIM_TIMX_CNT_CHY);           /* 开始捕获TIMx的通道y */
}/*** @brief       通用定时器TIMX 通道Y 获取当前计数值 * @param       无* @retval      当前计数值*/
uint32_t gtim_timx_cnt_chy_get_count(void)
{uint32_t count = 0;count = g_timxchy_cnt_ofcnt * 65536;                    /* 计算溢出次数对应的计数值 */count += __HAL_TIM_GET_COUNTER(&g_timx_cnt_chy_handle); /* 加上当前CNT的值 */
//    printf("gtim_timx count %d \r\n", count);return count;
}/*** @brief       通用定时器TIMX 通道Y 重启计数器* @param       无* @retval      当前计数值*/
void gtim_timx_cnt_chy_restart(void)
{__HAL_TIM_DISABLE(&g_timx_cnt_chy_handle);          /* 关闭定时器TIMX */g_timxchy_cnt_ofcnt = 0;                            /* 累加器清零 */__HAL_TIM_SET_COUNTER(&g_timx_cnt_chy_handle, 0);   /* 计数器清零 */__HAL_TIM_ENABLE(&g_timx_cnt_chy_handle);           /* 使能定时器TIMX */
}/*** @brief       通用定时器TIMX 脉冲计数 更新中断服务函数* @param       无* @retval      无*/
void GTIM_TIMX_CNT_IRQHandler(void)
{/* 以下代码没有使用定时器HAL库共用处理函数来处理,而是直接通过判断中断标志位的方式 */if(__HAL_TIM_GET_FLAG(&g_timx_cnt_chy_handle, TIM_FLAG_UPDATE) != RESET){g_timxchy_cnt_ofcnt++;          /* 累计溢出次数 */}__HAL_TIM_CLEAR_IT(&g_timx_cnt_chy_handle, TIM_IT_UPDATE);
}

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/gtim.h"int main(void)
{uint32_t curcnt = 0;uint32_t oldcnt = 0;uint8_t key = 0;uint8_t t = 0;HAL_Init();                                 /* 初始化HAL库 */sys_stm32_clock_init(336, 8, 2, 7);         /* 设置时钟,168Mhz */delay_init(168);                            /* 延时初始化 */usart_init(115200);                         /* 串口初始化为115200 */led_init();                                 /* 初始化LED */key_init();                                 /* 初始化按键 */gtim_timx_cnt_chy_init(0);                  /* 定时器计数初始化, 不分频 */gtim_timx_cnt_chy_restart();                /* 重启计数 */while (1){key = key_scan(0);                      /* 扫描按键 */if (key == KEY0_PRES)                   /* KEY0按键按下,重启计数 */{printf("key0 press \r\n");gtim_timx_cnt_chy_restart();        /* 重新启动计数 */}curcnt = gtim_timx_cnt_chy_get_count(); /* 获取计数值 */if (oldcnt != curcnt){oldcnt = curcnt;printf("CNT:%d\r\n", oldcnt);       /* 打印脉冲个数 */}t++;if (t > 40)                             /* 200ms进入一次 */{t = 0;LED0_TOGGLE();                      /* LED0闪烁, 提示程序运行 */}delay_ms(10);}
}

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

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

相关文章

【机器学习】西瓜书第6章支持向量机课后习题6.1参考答案

【机器学习】西瓜书学习心得及课后习题参考答案—第6章支持向量机 1.试证明样本空间中任意点x到超平面(w,b)的距离为式(6.2)。 首先,直观解释二维空间内点到直线的距离: 由平面向量的有关知识,可得: 超平面的法向量为 w w w&am…

PHP的Laravel加一个小页面出现问题(whereRaw的用法)

1.权限更新问题 因为是已经有样例了所以html和php页面很快写出来了 然后就是页面写完了路由不知道在哪写,后来想起来之前有要开权限来着,试了一下,还是不行,不过方向是对了 这是加的路由,不过需要在更新一下权限 这…

开箱即用的企业级数据和业务管理中后台前端框架Ant Design Pro 5的开箱使用和偏好配置

Ant Design Pro 介绍 Ant Design Pro 是一个开箱即用的企业级前端解决方案,基于 Ant Design 设计体系,提供了丰富的组件和功能,帮助开发者更快速地开发和部署企业级应用。 Ant Design Pro 使用 React、umi 和 dva 这三个主要的前端开发技术…

Linux高级管理——yum仓库服务

一、部署yum软件仓库: 借助于YLM软件仓库,可以完成安装.卸载、自动升级rpm软件包等任务。YUM的前身是YUP (Yellow dog Updater, Yellow dog Linux的软件更新器),最初由TSS公司(TerraSoft Solutions,INC.)使…

数据结构--查找

目录 1. 查找的基本概念 2. 线性表的查找 3. 树表的查找 3.1 二叉排序树 3.1.1 定义: 3.1.2 存储结构: 3.1.3 二叉排序树的查找 3.1.4 二叉排序树的插入 3.1.5 二叉排序树删除 3.2 平衡二叉树(AVL 3.2.1 为什么要有平衡二叉树 3.2.2 定义 3.3 B-树 3.3.1…

Linux命令-ps命令

ps用于显示进程 process:进程 执行:ps -ef -e:等价于 ‘-A’ ,表示列出全部的进程 -f:显示全部的列(显示全字段)配合grep命令去搜索程序: ps -ef | grep sshd

http——https实现指南

第一部分:HTTPS安全证书简介 什么是HTTPS安全证书? 在网络通信中,HTTPS安全证书是一种由可信任的证书颁发机构(CA)签发的数字证书,用于保障网站与用户之间的数据传输安全。通过加密和身份验证&#xff0c…

mapboxgl 中热力图的实现以及给热力图点增加鼠标移上 popup 效果

文章目录 概要效果预览技术思路技术细节小结 概要 本篇文章还是关于最近做到的 mapboxgl 地图展开的。 借鉴官方示例:https://iclient.supermap.io/examples/mapboxgl/editor.html#heatMapLayer 效果预览 技术思路 将接口数据渲染到地图中形成热力图。还需要将热…

Postman使用

Postman使用 Pre-request Script 参考: Scripting in Postman 可以请求、集合或文件夹中添加Pre-request Script,在请求运行之前执行JavaScript 如设置变量值、参数、Header和正文数据,也可以使用Pre-request Script来调试代码&#xff0…

RabbitMQ核心概念记录

本文来记录下RabbitMQ核心概念 文章目录 什么叫消息队列为何用消息队列RabbitMQ简介RabbitMQ基本概念RabbitMQ 特点具体特点包括 Rabbitmq的工作过程RabbitMQ集群RabbitMQ 的集群节点包括Rabbit 模式大概分为以下三种单一模式普通模式镜像模式 本文小结 什么叫消息队列 消息&am…

数据的价值:隐藏在数字背后的巨大财富

在当今数字化的时代,数据已经成为了一种宝贵的资源,它的价值被越来越多的人所认识。数据不仅可以帮助企业更好地了解市场和消费者,提高决策的准确性,还可以为社会带来更多的便利和创新。企业、组织和个人可以利用数据来更好地了解…

告别封号风险,海外社媒多账号如何运营?

相信作海外社媒运营的小伙伴都知道,想要管理好一个甚至多个社交媒体帐户,需要精力漫长的养号期,投入大量的金钱精力区保证每个账号的安全。但是,还是会有概率导致封号,从而白费力气。接下来让我们深入探讨营销人员面临…

安全生产人员定位系统助企业实现智能化管理,提高生产安全性和效率

安全生产人员定位系统是基于物联网技术的系统,通过集成各种传感器和通信技术,实时监测员工的位置和活动状态。该系统可以帮助企业管理者了解员工的工作状态,及时发现潜在的安全隐患,从而采取相应的措施,保障员工的安全…

<JavaEE> TCP 的通信机制(四) -- 流量控制 和 拥塞控制

目录 TCP的通信机制的核心特性 五、流量控制 1)什么是“流量控制”? 2)如何做到“流量控制”? 3)“流量控制”的作用 六、拥塞控制 1)什么是“拥塞控制”? 2)如何做到“拥塞…

C# 让数据保留小数后两位,不足的补充0

在C#中,可以使用Math.Floor、Math.Ceiling或者Math.Round方法结合字符串格式化来实现小数点后两位的保留,并在不足的情况下补充0。 以下是一个例子: double value 1.2345; string formattedValue value.ToString("0.00"); // 输…

C#/WPF 只允许一个实例程序运行并将已运行程序置顶

使用用互斥量(System.Threading.Mutex)&#xff1a; 同步基元&#xff0c;它只向一个线程授予对共享资源的独占访问权。在程序启动时候&#xff0c;请求一个互斥体&#xff0c;如果能获取对指定互斥的访问权&#xff0c;就职运行一个实例。 实例代码&#xff1a; /// <…

python/pytorch读取数据集

MNIST数据集 MNIST数据集包含了6万张手写数字&#xff08;[1,28,28]尺寸&#xff09;&#xff0c;以特殊格式存储。本文首先将MNIST数据集另存为png格式&#xff0c;然后再读取png格式图片&#xff0c;开展后续训练 另存为png格式 import torch from torch.utils.data impor…

gRPC-Go基础(2)protobuf基础

文章目录 0. 简介1. Message2. Message中的字段3. 枚举类型4. Map类型5. Oneof类型6. Any类型7. Struct类型 0. 简介 前面讲过protobuf工具protoc的使用&#xff0c;本章我们将简单介绍一下protobuf的语法和相关细节。 1. Message protobuf实际上是一套类似于Json或者XML的数…

《微信小程序开发从入门到实战》学习六十四

6.4 交互API 6.4.3 操作菜单API 使用wx.showActionSheet接口可以显示操作菜单&#xff0c;该接口接受Object参&#xff0c;该参属性如下&#xff1a; itemList&#xff1a;string[],数组的每一项代表一个菜单选项&#xff0c;最多支持6个选项 itemColor&#xff1a;按钮的文…

开源项目推荐:Frooodle/Stirling-PDF

简介一个本地的处理 PDF 的工具&#xff0c;界面是 Web UI&#xff0c;可以支持 Docker 部署。各种主要的 PDF 操作都可以支持。比如拆分、合并、转换格式、重新排列、添加图片、旋转、压缩等等。这个本地托管的网络应用最初完全由 ChatGPT 制作&#xff0c;后来逐渐发展&#…