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秒刷新一次终端…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...