STM32入门学习之定时器输入捕获
1.定时器的输入捕获可以用来测量脉冲宽度或者测量频率。输入捕获的原理图如下:
假设定时器是向上计数。在图中,t1~t2之间的便是我们要测量的高电平的时间(脉冲宽度)。首先,设置定时器为上升沿捕获,如此一来,在t1时刻可以捕获到当前定时器的计数值CNT。然后,清零CNT,并设置定时器为下降沿捕获,这样,在t2时刻,又会发生捕获事件,得到此时CNT的值,记为CCRx2。最后,根据定时器的计数频率,便可以计数出t1~t2的时间,从而得到高电平的脉冲宽度。
这里的上升沿捕获是指,当定时器复用的IO口,被输入高电平时,即t1时刻产生捕获。下降沿捕获同理。
此外,在t1~t2之间,可能产生N次的定时器溢出。为了使数据准确,需要对定时器的溢出做出处理,防止高电平的时间过长。本次实验中的处理方式为,当溢出的次数达到一定值时,强制认为已经捕获完成(捕获到上升沿、捕获到下降沿)。
CNT的计数次数:N*ARR+CRRx2。
用CNT的计数次数乘以计数周期,便可以得到t1~t2的时间长度,即高电平持续的时间。
2.修改寄存器介绍:TIMx_ARR、 TIMx_PSC、TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1等寄存器的介绍可以在前面的博客中定时器介绍部分查看。此处只介绍TIMx_CCMR1寄存器和TIMx_CCER寄存器。
(1)捕获/比较寄存器(TIMx_CCMR1):
当在输入捕获模式下使用时,对于着图中的第二行。低八位[7:0]用于捕获/比较寄存器通道1的控制。高八位[15:8]用于捕获/比较寄存器通道2的控制。本次实验中使用的通道1,因此,只介绍TIMx_CCMR1的低八位。
[7:0]各位的描述如下:
(2)捕获/比较使能寄存器(TIMx_CCER):
要想使能输入捕获,必须设置CC1E为1。
3.设计思路:
(1)使能TIM2时钟,配置PA0为下拉输入。(开发版中PA0与TIM2_CH1复用,并外接了按键。)
(2)初始化TIM2,设置TIM2的ARR和PSC。
(3)设置TIM2的输入比较参数,开启输入捕获。
4.代码:通过按键的状态获取高低电平的时间,并将时间通过串口打印。同时,使用到了定时器2的中断服务函数。
(1)usart:
#ifndef __USART_H
#define __USART_H#include "stm32f10x.h"
#include <stdio.h>#define RX_LEN 100 //Äܹ»½ÓÊܵÄ×î´ó×Ö½ÚÊýextern u8 RX_BUF[RX_LEN];
extern int len;
extern u8 RX_FLAG;void usart_init(u32 bound);#endif
#include "USART.h"int len = 0;
u8 data;
u8 RX_BUF[RX_LEN];
u8 RX_FLAG = 0;//´®¿Ú³õʼ»¯º¯Êý
void usart_init(u32 bound)
{//1.¶¨ÒåÒý½Å¡¢USART¡¢ÖжϽṹÌ壺GPIO_InitTypeDef GPIO_Initstruct;USART_InitTypeDef USART_Initstruct;NVIC_InitTypeDef NVIC_Initstruct;//2.ʹÄܶ˿ںÍUSARTµÄʱÖÓ£ºRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO,ENABLE);//3.ÅäÖÃÒý½Å£º//PA9£ºGPIO_Initstruct.GPIO_Pin = GPIO_Pin_9;GPIO_Initstruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_Initstruct);//PA10:GPIO_Initstruct.GPIO_Pin = GPIO_Pin_10;GPIO_Initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_Initstruct);//4.ÅäÖÃUSART1:USART_Initstruct.USART_BaudRate = bound;USART_Initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Initstruct.USART_Parity = USART_Parity_No;USART_Initstruct.USART_StopBits = USART_StopBits_1;USART_Initstruct.USART_WordLength = USART_WordLength_8b;USART_Init(USART1,&USART_Initstruct); //½«Ïà¹ØÊý¾ÝдÈëUSARTµÄ¼Ä´æÆ÷USART_Cmd(USART1,ENABLE); //ʹÄÜUSART¼Ä´æÆ÷USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //ʹÄܽÓÊÕÖжÏ//5.ÅäÖÃÖжϣºNVIC_Initstruct.NVIC_IRQChannel = USART1_IRQn;NVIC_Initstruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority = 3;NVIC_Initstruct.NVIC_IRQChannelSubPriority = 3;NVIC_Init(&NVIC_Initstruct);}//void USART1_IRQHandler(void)
//{
// //uint16_t x[] = {1,2,3};
// //ÅжÏÊÇ·ñ²úÉú´®¿ÚÊý¾Ý½ÓÊÜÖжÏ
// if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
// {
// data = USART_ReceiveData(USART1);
// RX_BUF[len++] = data;
// RX_FLAG = 1;
// }
//}//ÖØ¶¨Ïòfputcº¯Êý£º
//int fputc(int ch,FILE *f)
//{
// //1.Åжϴ®¿ÚÊÇ·ñ·¢ËÍÍê³É£º
// while((USART1->SR & 0x40) == 0);
//
// //2.·¢ËÍÒ»¸ö×Ö½Ú£¬½«Êý¾ÝдÈëµ½¼Ä´æÆ÷£º
// USART1->DR = (u8) ch;
// return ch;
//}
int fputc(int ch, FILE *f)
{ while((USART1->SR&0X40)==0);//Ñ»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï USART1->DR = (u8) ch; return ch;
}
(2)delay:
#ifndef __DELAY_H
#define __DELAY_H#include "stm32f10x.h"void delay_us(uint32_t us); //ÑÓʱ΢Ãë
void delay_ms(uint32_t ms); //ÑÓʱºÁÃë#endif
#include "delay.h"void delay_us(uint32_t us)
{uint32_t i;//1.Ñ¡ÔñHCLKʱÖÓ£¬²¢ÉèÖõδðʱÖÓ¼ÆÊýÖµSysTick_Config(72);for(i = 0;i < us;i++){while(!((SysTick->CTRL) & (1 << 16))); //µÈ´ý¼ÆÊýÍê³É}SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //Ñ¡ÔñSTCLKʱÖÓÔ´£¬²¢Ê§Äܶ¨Ê±Æ÷
}void delay_ms(uint32_t ms)
{uint32_t i;//1.Ñ¡ÔñHCLKʱÖÓÔ´£¬²¢ÉèÖõδðʱÖÓ¼ÆÊýÖµSysTick_Config(72000);for(i = 0;i < ms;i++){while(!((SysTick->CTRL) & (1 << 16))); //µÈ´ý¼ÆÊýÍê³É}SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //Ñ¡ÔñSTCLKʱÖÓÔ´£¬²¢Ê§Äܶ¨Ê±Æ÷
}
(3) time_capture:
#ifndef __TIME_CAPTURE_H
#define __TIME_CAPTURE_H#include "stm32f10x.h"extern u8 TIM2_CAPTURE_STATU; //ÊäÈë²¶»ñ״̬
extern u16 TIM2_CAPTURE_VALUE;void TIME_CAPTURE_Init(u16 arr,u16 psc);#endif
#include "time_capture.h"/*TIM2_CAPTURE_STATUµÄµÚ7Ϊ²¶»ñÍê³É±êÖ¾£¬
µÚ6λΪ²¶»ñµ½¸ßµçƽ±êÖ¾£¬
µÚ0-5λλ²¶»ñ¸ßµçƽºó¶¨Ê±Æ÷µÄÒç³ö´ËÊý*/
u8 TIM2_CAPTURE_STATU = 0; //ÊäÈë²¶»ñ״̬
u16 TIM2_CAPTURE_VALUE = 0; //ÊäÈë²¶»ñÖµvoid TIME_CAPTURE_Init(u16 arr,u16 psc)
{//¶¨ÒåÏà¹Ø½á¹¹Ì壺GPIO_InitTypeDef GPIO_InitStrcture;TIM_TimeBaseInitTypeDef TIME_TimeBaseStructure;TIM_ICInitTypeDef TIM2_ICInitStructure;NVIC_InitTypeDef NVIC_InitStructure;//1.ʹÄÜʱÖÓ£ºRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//2.ÅäÖÃÏà¹ØµÄ½á¹¹ÌåÐÅÏ¢£ºGPIO_InitStrcture.GPIO_Mode = GPIO_Mode_IPD;GPIO_InitStrcture.GPIO_Pin = GPIO_Pin_0;GPIO_InitStrcture.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStrcture);GPIO_ResetBits(GPIOA,GPIO_Pin_0); //³õʼʱ½«PA0ÖÃΪ0//3.ÅäÖö¨Ê±Æ÷2£ºTIME_TimeBaseStructure.TIM_Period = arr;TIME_TimeBaseStructure.TIM_Prescaler = psc;TIME_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//ÉèÖÃʱÖÓ·Ö¸îTIME_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;TIM_TimeBaseInit(TIM2,&TIME_TimeBaseStructure);//4.ÅäÖö¨Ê±Æ÷2µÄÊäÈë²¶»ñ²ÎÊý£ºTIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //ÉèÖÃÊäÈëͨµÀTIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //ÉèÖÃÉÏÉýÑØ²¶»ñTIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //Ó³Éäµ½TI1ÉÏTIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //ÉèÖÃÊäÈë·ÖƵTIM2_ICInitStructure.TIM_ICFilter = 0; //ÉèÖÃÂ˲¨Æ÷TIM_ICInit(TIM2,&TIM2_ICInitStructure);//5.ÖжϹÜÀíÅäÖãºNVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&NVIC_InitStructure);//6.ʹÄܶ¨Ê±Æ÷µÄ¸üÐÂÖжϡ¢²¶»ñÖжϺͶ¨Ê±Æ÷£ºTIM_ITConfig(TIM2,TIM_IT_Update | TIM_IT_CC1,ENABLE);TIM_Cmd(TIM2,ENABLE);}//ÖØÐ´¶¨Ê±Æ÷2µÄÖжϷþÎñº¯Êý£º
void TIM2_IRQHandler(void)
{if((TIM2_CAPTURE_STATU & 0x80) ==0) //»¹Î´²¶»ñÍê³É{if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET){if(TIM2_CAPTURE_STATU & 0x40) //²¶»ñµ½¸ßµçƽ{//´Ë´¦Êǵ±Á¬Ðø²¶»ñµ½¸ßµçƽµÄ´ÎÊý>= 0x3Fʱ£¬Ç¿ÖÆÈÏΪ²¶»ñ³É¹¦if((TIM2_CAPTURE_STATU & 0x3F) == 0x3F)//¸ßµçƽ̫³¤{TIM2_CAPTURE_STATU |= 0x80; //±ê¼Ç²¶»ñ³É¹¦TIM2_CAPTURE_VALUE = 0xFFFF;}else{TIM2_CAPTURE_STATU ++;}}}}if(TIM_GetITStatus(TIM2,TIM_IT_CC1) != RESET) //·¢Éú²¶»ñʼþ{if(TIM2_CAPTURE_STATU & 0x40) //²¶»ñµ½Ò»¸öϽµÑØ{TIM2_CAPTURE_STATU |= 0X80; //±ê¼Ç²¶»ñ³É¹¦TIM2_CAPTURE_VALUE = TIM_GetCapture1(TIM2); //»ñÈ¡¼ÆÊýcntÖµTIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //Ï´β¶×½ÉÏÉýÑØ}else{TIM2_CAPTURE_STATU = 0;TIM2_CAPTURE_VALUE = 0;TIM_SetCounter(TIM2,0); //ÉèÖüÆÊý¼Ä´æÆ÷µÄÖµTIM2_CAPTURE_STATU |= 0x40; //±ê¼Ç²¶×½µ½ÁËÉÏÉýÑØ TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); //ÉèÖÃÏ´β¶×½Ï½µÑØ}}TIM_ClearITPendingBit(TIM2,TIM_IT_CC1 | TIM_IT_Update); //Çå³ýÖжϱê־λ
}
(4) main:
#include "stm32f10x.h"
#include "USART.h"
#include "led.h"
#include "delay.h"
#include "time_capture.h"
#include <stdio.h>extern u8 data;int main(void)
{int i;u32 temp = 0;//ÖжÏÓÅÏȼ¶·Ö×飺NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//³õʼ»¯´®¿ÚUSART1:usart_init(9600);//LED_Init();//KEY_Init();TIME_CAPTURE_Init(0xFFFF,72 - 1);//GPIO_ResetBits(GPIOA,GPIO_Pin_8);//GPIO_ResetBits(GPIOD,GPIO_Pin_2);printf("½ÓÊܵ½µÄÊý¾Ý:\r\n");delay_ms(10);while(1){//printf("test\r\n");delay_ms(10);if(TIM2_CAPTURE_STATU & 0X80) //²¶×½µ½¸ßµçƽ{//printf("test2.0\r\n");temp = TIM2_CAPTURE_VALUE & 0x3F;temp *= 65536;temp += TIM2_CAPTURE_VALUE;printf("high = %d us\r\n",temp);TIM2_CAPTURE_STATU = 0; //¿ªÆôÏÂÒ»´Î²¶»ñ}}
}
5.运行结果:根据按键按键的时间,计数高电平的时间。
6.总结:通过定时器捕获可以测量脉冲宽度或者测量频率。定时器的捕获配置,主要是配置相关的寄存器,并重写定时器中断服务函数,在中断服务函数中书写数据捕获的逻辑。
相关文章:

STM32入门学习之定时器输入捕获
1.定时器的输入捕获可以用来测量脉冲宽度或者测量频率。输入捕获的原理图如下: 假设定时器是向上计数。在图中,t1~t2之间的便是我们要测量的高电平的时间(脉冲宽度)。首先,设置定时器为上升沿捕获,如此一来,在t1时刻可…...
贪心算法:基础入门篇
贪心算法:基础入门篇 文章目录: 贪心算法:基础入门篇一、认识贪心算法二、常见贪心问题2.1 纸牌问题2.2 背包问题(基础版)2.3 简单数学证明问题 三、总结 一、认识贪心算法 在求最优解的问题中,以某种贪心…...

【Windows10下启动RocketMQ报错:找不到或无法加载主类 Files\Java\jdk1.8.0_301\lib\dt.jar】解决方法
Windows10下启动RocketMQ报错:找不到或无法加载主类 一、问题产生二、产生原因三、解决办法 一、问题产生 参考RocketMQ Github官网上的说明,下载rocketmq-all-5.1.3-bin-release.zip,解压配置环境变量后,执行如下命令:…...

深入篇【Linux】学习必备:进程理解(从底层探究进程概念/进程创建/进程状态/进程优先级)
深入篇【Linux】学习必备:进程理解(从底层探究进程概念/进程创建/进程状态/进程优先级) 一.进程概念(PCB/task_struct)二.查看进程(top/ps)三.创建进程(fork)四.进程状态(僵尸进程/孤儿进程)五.进程优先级(PRI/NI) 一.进程概念(PCB/task_struct) 1.什么…...

Python 潮流周刊#15:如何分析 FastAPI 异步请求的性能?
你好,我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容,大部分为英文。标题取自其中一则分享,不代表全部内容都是该主题,特此声明。 本周刊精心筛选国内外的 250 信息源,为你挑选最值得分享的文章、教程、开源…...

基于Java+SpringBoot+Vue的网吧管理系统设计与实现(源码+LW+部署文档等)
博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…...

redis设置database 不生效剖析
设置database 不生效剖析 前言配置加载类问题commons-pool 对象池 主页传送门:📀 传送 前言 事情是这样的 今天在拉取了同事的代码做redis缓存设置的时候,发现即使已经设置了database, 但是存数据的时候还是用的默认0数据库。这引起了我的好…...

汽车及汽车零部件行业云MES解决方案
汽配行业现状: 随着经济全球化进程加快,一直走在智能化改造,数字化转型前沿的汽车行业企业,面临的信息化需求也日益增加,不管德系,美系还是日系供应链的各大厂商,均将企业信息化,数字…...
算法工程师-机器学习面试题总结(4)
深度学习 DNN 描述一下神经网络?推导反向传播公式? 神经网络(Neural Network)是一种模拟人脑神经系统的计算模型。它由许多节点(神经元)和连接它们的权重组成,这些节点和权重可以学习和调整&a…...

Linux学习之awk函数
awk里边的函数分为内置函数和自定义函数。 内置函数有下边的几种: 算术函数(arithmetic) 字符串函数(string) 输入/输出函数和通用函数(input/output, and general) 自定义函数格式如下…...

Redis的数据结构到底是一种什么样的结构?
有了上一篇NoSQL的基础,我们也都知道了Redis就是一种典型的NoSql,那我们就先简简单单的介绍一下Redis: Redis是什么? Redis(Remote Dictionary Server)是一个开源的使用ANSI C语言编写的高性能键值存储系统…...

eclipse 导入项目js报错问题
eclipse 导入项目后会出现项目中的js文件报错(红叉),如下图所示,有时候报错的文件很多,需要集中处理。 解决办法: 右键项目名称》Properties》MyEclipse》JavaScript》Include Path,在右侧选择“…...

《HeadFirst设计模式(第二版)》第七章代码——外观模式
代码文件目录: Subsystem: Amplifier package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;/*** Author 竹心* Date 2023/8/8**///扬声器 public class Amplifier {int volume 0;//音量public void on(){System.out.println("The amplifier …...
前端杂项-个人总结八股文的背诵方案
个人总结八股文的背诵方案 URL到显示网页的过程 浏览器解析URL,获取协议,主机名,端口号,路径等信息,并通过DNS查询将主机名转换为对应的IP地址浏览器与服务器建立TCP,进行三次握手。浏览器向服务器发送HT…...

利用 3D 地理空间数据实现Cesium的沉浸式环境
推荐:使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 为了将大量异构 3D 地理空间数据处理和分散到各行各业的地理空间应用程序和运行时引擎,Cesium 创建了 3D Tiles,这是一种用于高效流式传输和渲染大量异构数据集的开放标准。3D Tile…...

微服务——ES实现自动补全
效果展示 在搜索框根据拼音首字母进行提示 拼音分词器 和IK中文分词器一样的用法,按照下面的顺序执行。 # 进入容器内部 docker exec -it elasticsearch /bin/bash# 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch…...
北斗+5G 织就精确定位的“天罗地网”
今年,邓中亮更忙了。 外部会议,内部讨论,课题研究,还有疫情困扰期间没能出的差铆足劲似的补上,一天里,从离开床和回到床中间的时间都被工作冠名了。 北京邮电大学教授邓中亮 忙碌的加速键在2020年按下暂停…...
Ansible Roles详解
Ansible 的角色(Roles)是一种组织和管理任务和变量的方法,可以帮助您更好地组织和重用 Ansible 代码。角色是一个可重用的、自包含的 Ansible 单元,它封装了一组任务和变量,可以在不同的剧本中轻松地重用。 角色的目录…...

微服务学习笔记-基本概念
微服务是一种经过良好架构设计的分布式架构方案。根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。 微服务的架构特征: 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力&…...

Linux查看GPU显卡/CPU内存/硬盘信息
显卡信息命令/CPU内存/硬盘 1.显卡2、CPU内存3、硬盘 1.显卡 nvidia-smi nvidia-smi(显示一次当前GPU占用情况) nvidia-smi -l(每秒刷新一次并显示) watch -n 5 nvidia-smi (其中,5表示每隔6秒刷新一次终端…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...

Selenium 查找页面元素的方式
Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素,以下是主要的定位方式: 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…...

第2课 SiC MOSFET与 Si IGBT 静态特性对比
2.1 输出特性对比 2.2 转移特性对比 2.1 输出特性对比 器件的输出特性描述了当温度和栅源电压(栅射电压)为某一具体数值时,漏极电流(集电极电流...
Linux信号保存与处理机制详解
Linux信号的保存与处理涉及多个关键机制,以下是详细的总结: 1. 信号的保存 进程描述符(task_struct):每个进程的PCB中包含信号相关信息。 pending信号集:记录已到达但未处理的信号(未决信号&a…...
大模型的LoRa通讯详解与实现教程
一、LoRa通讯技术概述 LoRa(Long Range)是一种低功耗广域网(LPWAN)通信技术,由Semtech公司开发,特别适合于物联网设备的长距离、低功耗通信需求。LoRa技术基于扩频调制技术,能够在保持低功耗的同时实现数公里甚至数十公里的通信距离。 LoRa的主要特点 长距离通信:在城…...

【计算机网络】SDN
SDN这种新型网络体系结构的核心思想:把网络的控制层面与数据层面分离,而让控制层面利用软件来控制数据层面中的许多设备。 OpenFlow协议可以被看成是SDN体系结构中控制层面与数据层面之间的通信接口。 在SDN中取代传统路由器中转发表的是“流表”&…...
Ubantu-Docker配置最新镜像源250605
尝试其他镜像加速器 阿里云镜像加速器:登录阿里云,进入容器镜像服务获取专属加速器地址。毫秒镜像:https://docker.1ms.run。DockerHub镜像加速器:https://docker.xuanyuan.me。Docker Hub 镜像加速服务:https://dock…...

低代码采购系统搭建:鲸采云+能源行业订单管理自动化案例
在能源行业数字化转型浪潮下,某大型能源集团通过鲸采云低代码平台,仅用3周时间就完成了采购订单管理系统的定制化搭建。本文将揭秘这一成功案例的实施路径与关键成效。 项目背景与挑战 该企业面临: 供应商分散:200供应商使用不同…...