STM32入门学习之定时器输入捕获

news2024/10/6 4:07:32

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_ARRTIMx_PSCTIMx_CCMR1TIMx_CCERTIMx_DIERTIMx_CR1TIMx_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.总结:通过定时器捕获可以测量脉冲宽度或者测量频率。定时器的捕获配置,主要是配置相关的寄存器,并重写定时器中断服务函数,在中断服务函数中书写数据捕获的逻辑。

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

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

相关文章

C语言刷题训练【第十天】

大家好&#xff0c;我是纪宁。 今天是C语言刷题训练的第十天&#xff0c;加油&#xff01; 文章目录 &#x1f386;1、求函数返回值&#xff0c;传入 -1 &#xff0c;则在64位机器上函数返回&#xff08; &#xff09;&#x1f3a4;2、读代码选结果&#xff08; &#xff09;&…

8.13树的总结(有新知识再更新)

二叉树题目几个重点&#xff1a; 1. 理解递归&#xff0c;优先掌握递归实现 递归三部曲&#xff1a;1.确定递归函数的参数和返回类型&#xff1b;2.确定终止条件 &#xff1b;3.确定递归逻辑 因为递归一层一层对我来说有点绕&#xff0c;主要感悟就是只针对某一个节点思考&…

Mac思维导图软件Xmind for Mac中文激活版

好的思维导图软件能帮助用户更好的发挥创作能力&#xff0c;XMind是一款流行的思维导图软件&#xff0c;可以帮助用户创建各种类型的思维导图和概念图。 多样化的导图类型&#xff1a;XMind提供了多种类型的导图&#xff0c;如鱼骨图、树形图、机构图等&#xff0c;可以满足不同…

计算机视觉中的特征检测和描述

一、说明 这篇文章是关于计算机视觉中特征检测和描述概念的简要理解。在其中&#xff0c;我们探讨了它们的定义、常用技术、简单的 python 实现和一些限制。 二、什么是特征检测和描述&#xff1f; 特征检测和描述是计算机视觉中的基本概念&#xff0c;在图像识别、对象跟踪和图…

Seaborn图表使用指南!

目录 介绍线图散点图直方图概率密度函数 &#xff08;PDF&#xff09;箱线图小提琴剧情配对图热图关节图地毯图 一、介绍 数据科学已成为一个突出的领域&#xff0c;近年来呈爆炸性增长。对精通从数据中获取见解并应用这些见解来解决现实世界问题的数据科学家的需求从未增加。…

centos 7.x 单用户模式

最近碰到 centos 7.9 一些参数设置错误无法启动系统的情况&#xff0c;研究后可以使用单用户模式进入系统进行恢复操作。 进入启动界面&#xff0c;按 e ro 替换为 rw init/sysroot/bin/sh 替换前 替换后 Ctrl-x 进行重启进入单用户模式 执行 chroot /sysroot 可以查看日…

数据库操作不再困难,MyBatis动态Sql标签解析

系列文章目录 MyBatis缓存原理 Mybatis的CachingExecutor与二级缓存 Mybatis plugin 的使用及原理 MyBatis四大组件Executor、StatementHandler、ParameterHandler、ResultSetHandler 详解 MyBatisSpringboot 启动到SQL执行全流程 数据库操作不再困难&#xff0c;MyBatis动态S…

一个软件测试面试相关的面试题目,你们会做吗?

有这样一个面试题&#xff1a;在一个Web测试页面上&#xff0c;有一个输入框&#xff0c;一个计数器&#xff08;count&#xff09;按钮&#xff0c;用于计算一个文本字符串中字母a出现的个数。请设计一系列测试用例用以测试这个Web页面。 <ignore_js_op> 有经验的测试人…

WS2812B RGB灯带使用

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识&#xff0c;如果大家喜欢&#xff0c;别忘点个赞加个关注哦&#xff0c;让我们一起共同进步~ &#x…

嵌入式linux开发工具——vscode

目录 一、工具下载及安装 下载 安装 二、工具配置 在嵌入式开发中常用的工具就两个source和vscode&#xff0c;个有利弊。之前讲过source今天来讲一下vscode。 一、工具下载及安装 下载 https://code.visualstudio.com 选择需要的版本就行 x86是32位架构&#xff0c;x64…

笔记系统项目测试

一、测试用例 1.1功能测试 1.2性能测试 1.3界面测试 1.4兼容性测试 1.5易用性测试 1.6安全性测试 二、自动化测试 那就对上面的部分用例进行自动化测试 Selenium3 Junit5 2.1注册页面自动化测试 /*** 针对两次输入密码不一致进行验证* param username* param password* pa…

无涯教程-Perl - readline函数

描述 此函数从EXPR引用的文件句柄中读取一行,并返回输出。如果要直接使用FILEHANDLE,则必须将其作为typeglob传递。 Simply readline function is equvivalent to <>. 语法 以下是此函数的简单语法- readline EXPR返回值 此函数在标量context中仅返回一行,而在列表…

预测知识 | 机器学习预测模型局限性

预测知识 | 机器学习预测模型局限性 目录 预测知识 | 机器学习预测模型局限性问题描述未来发展参考资料 问题描述 数据基础设施&#xff1a;要构建模型&#xff0c;必须有数据&#xff0c;且有多来源的大数据。这一切都离不开数据基础设施的建设和发展。 错误数据输入&#xf…

「Web3大厂」价值70亿美元的核心竞争力

经过近 5 年的研发和酝酿&#xff0c;Linea 团队在 7 月的巴黎 ETHCC 大会期间宣布了主网 Alpha 的上线&#xff0c;引起了社区的广泛关注。截止 8 月 4 日&#xff0c;据 Dune 数据信息显示&#xff0c;其主网在一周内就涌入了 100 多个生态项目&#xff0c;跨入了超 2 万枚 E…

RabbitMQ基础(2)——发布订阅/fanout模式 topic模式 rabbitmq回调确认 延迟队列(死信)设计

目录 引出点对点(simple)Work queues 一对多发布订阅/fanout模式以登陆验证码为例pom文件导包application.yml文件rabbitmq的配置生产者生成验证码&#xff0c;发送给交换机消费者消费验证码 topic模式配置类增加配置生产者发送信息进行发送控制台查看 rabbitmq回调确认配置类验…

BGP的工作过程及报文

IGP核心:路由的计算。OSPF,ISIS等 BGP核心:路由的传递,不产生路由,只是路由的搬运工,一般用于规模特别大的网络中,只要TCP可达就可以建立邻居。 大型企业分支间采用BGP进行路由传递,不同的分支属于不同的BGP的AS,它们通过BGP进行路由交互。企业与运营商之间可使用BGP进行…

编写一个函数实现n的k次方,使用递归实现

在这个问题中&#xff0c;我们要考虑k的取值正负。 代码实现&#xff1a; #include <stdio.h> double Pow(int n, int k) {if (k > 0)return n * Pow(n, k - 1);else if (k 0)return 1;elsereturn 1.0 / Pow(n, -k); }int main() {int n 0;int k 0;scanf("%d…

期权定价模型系列【4】—期权组合的Delta-Gamma-Vega中性

期权组合的Delta-Gamma-Vega中性 期权组合构建时往往会进行delta中性对冲&#xff0c;在进行中性对冲后&#xff0c;期权组合的delta敞口为0&#xff0c;此时期权组合仍然存在gamma与vega敞口。因此研究期权组合的delta-gamma-vega敞口中性是有必要的。 本文旨在对delta-gamma-…

面向未来的颠覆性技术创新

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在学习摘录和笔记专…