02:STM32--EXTI外部中断

目录

一:中断

1:简历

2:AFIO

 3:EXTI

​编辑

 4:NVIC基本结构

5:使用步骤

二:中断的应用

A:对外式红外传感计数器

1:连接图​编辑

 2:函数介绍

3:硬件介绍

 4:计数代码

B;旋转编码计数器

1:连接图

 2:硬件介绍

3:旋转编码器代码:


一:中断

1:简历

        中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行

        中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源

        中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回

        STM32中断: 68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级 (EXTI可以产生中断的,众多外设之一)

2:AFIO

使用这个函数GPIO_EXTILineConfig配置那个引脚为中断引脚: 调用这个函数,就可以配置AFIO的数据选择器,来选择我们想要的中断引脚

        AFIO主要用于引脚复用功能的选择和重定义

        在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择

 3:EXTI

EXTI_Init:

        调用这个函数,就可以根据这个结构体里的参数配置EXTI外设, 使用方法和GPIO Init也是一样;         

        选择那个IO口为中断IO口(和前面的AFIO引脚配置保持一致), 

        选择那个方式触发中断(中断模式,事件模式)

        选择触发中断的方式 (上升沿触发,下降沿触发,上升沿和下降沿触发)

 EXTI简介:
        EXTI(Extern Interrupt)外部中断

        EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序

        支持的触发方式:上升沿/下降沿/双边沿/软件触发

        支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断     (PA1、PB1、PC1这样的,PAO和PBO这样的相同的Pin只能选1个作为中断引脚)  PA6和PA7、PA9和PB15、PBO和PB1这样的都可以

原因:AFOI会在APIOA,APIO,APIOC中选择一个GPIO的16个引脚连接到后面的EXTI

        通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒

触发响应方式:中断响应/事件响应

 

基本结构:

EXTI框图

 4:NVIC基本结构

嵌套中断向量控制器: 用来统一分配断优先级和管理中断的

A:使用NVIC_PriorityGroupConfig函数先分组;分组完成后抢占优先级和响应优先级的号不能超过表中的范围

B:使用NVIC_Init初始化  (1:选择通道,选择抢占优先级和响应优先级)

 NVIC优先级分组:

         NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级(更加紧急)和低4-n位的响应优先级(紧急)抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队   (中断号:EXTI简历中的优先级)

        抢占优先级>响应优先级

        优先级的数是值越小,优先级越高,0就是最高优先级

5:使用步骤

1:第一步,配置RCC,把我们这里涉及的外设的时钟都打开(GPIO,AFIO)

2:第二步,配置GPIO,选择我们的端口为输入模式

3:第三步,配置AFIO,选择我们用的这一路GPIO,连接到后面的EXT

4:第四步,配置EXTI,选择边沿触发方式比如上升沿、下降沿或者双边沿, 还有选择触发响应方式,可以选择中断响应和事件响应

5:第五步,配置NVIC,给我们这个中断选择一个合适的优先级

最后,通过NVIC,外部中断信号就能进入CPU了

1:EXIT和NVIC的时钟一直是打开状态不需要开启

二:中断的应用

A:对外式红外传感计数器

1:连接图

 2:函数介绍

配置AFIO在文件中stm32f10x_gpio.h

void GPIO_AFIODeInit(void);

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

GPIO_AFIODeInit: 用来复位AFIO外设, 调用这个函数AFIO外设的配置就会全部清除

GPIO_PinLockConfig: 参数指定位那个引脚, 那这个引脚的配置就会被锁定,防止意外更改

GPIO_EventOutputConfig 和GPIO_EventOutputCmd :  配置AFIO的事件输出功能的

GPIO_PinRemapConfig: 引脚重新映射,  第一个参数可以选择你要重映射的方式,第二个参数是新的状态

GPIO_EXTILineConfig: 调用这个函数,就可以配置AFIO的数据选择器,来选择我们想要的中断引脚

GPIO_ETH_MediaInterfaceConfig:关于以太网的

配置EXTI在stm32f10x exti.h文件中

void EXTI_DeInit(void);
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
void EXTI_ClearFlag(uint32_t EXTI_Line);
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

EXTI_DeInit: EXTI的配置都清除,恢复成上电默认的状态

EXTI_Init:调用这个函数,就可以根据这个结构体里的参数配置EXTI外设, 使用方法和GPIO Init也是一样

EXTI_StructInit:  可以把参数传递的结构体变量赋一个默认值

EXTI_GenerateSWInterrupt:软件触发外部中断

在主函数中你想查看标志位和清除标志位使用下面的函数

EXTI_GetFlagStatus:可以获取指定的标志位是否被置1了

EXTI_ClearFlag: 可以对置1的标志位进行清除

在中断函数里,如果你想查看标志位和清除标志位使用下面的函数

EXTI_GetITStatus: 获取中断标志位是否被置1了(检测外部中断的状态)

EXTI_ClearITPendingBit: 清除中断挂起标志位

配置NMIC在misc.h文件中的函数

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);

NVIC_PriorityGroupConfig:用来中断分组的,参数是中断分组的方式

NVIC_Init: 根据结构体里面指定的参数初始化NMIC

NVIC_SetVectorTable: 设置中断向量表

NVIC_SystemLPConfig :系统低功耗配置

3:硬件介绍

 4:计数代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"

uint16_t CountSensor_count;
void CountSensor_Init(void){
	//1:配置RCC,把我们这里涉及的外设的时钟都打开(GPIO,AFIO)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	//2:配置GPIO,选择我们的端口为输入模式
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉模式
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	//3:配置AFIO,选择我们用的这一路GPIO,连接到后面的EXT
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
	//4: 第四步,配置EXTI,选择边沿触发方式比如上升沿、下降沿或者双边沿, 还有选择触发响应方式,可以选择中断响应和事件响应
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line=EXTI_Line14;//14IO口作为中断
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿触发
	EXTI_Init(&EXTI_InitStructure);
	//5:配置NVIC,给我们这个中断选择一个合适的优先级
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//到NVIC的通道
	NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级
	NVIC_Init(&NVIC_InitStructure);
}

uint16_t CountSensor_Get(void)
{
	return CountSensor_count;
}

//STM32的中断函数名字不能变,在启动文件里面查看
void EXTI15_10_IRQHandler(void){ 
	//在中断函数里,查看中断标志位是否被置1了,看是不是PB14口引发的中断(通道10~15都可以进去)
	if (EXTI_GetITStatus(EXTI_Line14)==SET){
				/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
		//读取PB14IO口是否为低电频
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0){
			CountSensor_count++;
		}
//清除中断挂起标志位
		EXTI_ClearITPendingBit(EXTI_Line14);
	}
}

int main(void)
{    
//OLED屏幕代码省略
	OLED_Init();
	CountSensor_Init();
	
	OLED_ShowString(1, 1, "Count:");
	
	while (1)
	{
		OLED_ShowNum(1, 7, CountSensor_Get(), 5);
	}
}

B;旋转编码计数器

1:连接图

 2:硬件介绍

 

 我们使用判断正反转的条件:

        正转-----B相下降沿和A相低由平时同时满足时;

        反转----在A相下降沿和B相低电频同时满足时;

本次使用了两个中断注意:

PB0和PB1设置为中断:

A:配置AFIO时:需要配置两个引脚

B:配置EXTI时:X.EXTI_Line需要配置两个 (X.EXTI_Line = EXTI_Line0 | EXTI_Line1)

C:配置NVIC时: 一次分组,2次初始化

中断函数分析:
当A为中断IO口时: A为下降沿触发中断,B1和B0同时为低电频时满足正转

当B为中断IO口时: A为下降沿触发中断,B0和B1同时为低电频时满足反转

(中断函数处理全局变量时,可以改变全局变量的值)

3:旋转编码器代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"

int16_t Encoder_Count;

void Encoder_Init(void)
{
	//1:配置RCC,把我们这里涉及的外设的时钟都打开(GPIO,AFIO)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	//2:配置GPIO,选择我们的端口为输入模式  注意打开了2个中断
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	//3:配置AFIO,选择我们用的这一路GPIO,连接到后面的EXT
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
	//4: 第四步,配置EXTI,选择边沿触发方式比如上升沿、下降沿或者双边沿, 还有选择触发响应方式,可以选择中断响应和事件响应
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断事件
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_Init(&EXTI_InitStructure);
	//5:配置NMIC,给我们这个中断选择一个合适的优先级
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; 到NVIC的通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);

	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;  到NVIC的通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_Init(&NVIC_InitStructure);
}

//返回每次调用这个Get函数之后,返回Count的变化值
//每次调用这个函数都会加1或者减1

int16_t Encoder_Get(void)
{

	int16_t Temp;
	Temp = Encoder_Count;
	
	/*返回的temp是局部变量,在栈区,也就是该函数一旦执行完,
	就会被系统释放,当再次循环调用到该函数时,
	get里的temp就需要被重新赋值,temp被赋值0,
	无论主函数如何循环都是变成了NUM+=0*/
	
	
	/*如果返回函数不清零的话,
		数字就变成等差数列求和,清零的话就疯狂加或者减一*/
	Encoder_Count = 0;
	return Temp; 
}

//void EXTI0_IRQHandler(void)
//{检测外部中断状态,如果状态为SET,会返回真(true),否则返回假(false)。
//	if (EXTI_GetITStatus(EXTI_Line0) == SET)
//	{
//		/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
//		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)
//		{//中断函数的处理可以改变全局变量的值
//			if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
//			{
//				Encoder_Count --;
//			}
//		}
//		EXTI_ClearITPendingBit(EXTI_Line0);
//	}
//}
void EXTI0_IRQHandler(void)
{检测外部中断状态,如果状态为SET,会返回真(true),否则返回假(false)。
	if (EXTI_GetITStatus(EXTI_Line0) == SET)
	{
		/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
		{
				//中断函数的处理可以改变全局变量的值
				Encoder_Count --;
			
		}
		EXTI_ClearITPendingBit(EXTI_Line0);
	}
}
//void EXTI1_IRQHandler(void)
//	{	//检测外部中断状态,如果状态为SET,会返回真(true),否则返回假(false)。
//	if (EXTI_GetITStatus(EXTI_Line1) == SET)
//	{
//		/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
//		
//		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) //PB1为低电频
//		{
//			if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)  //PB0为低电频
//			{//中断函数的处理可以改变全局变量的值
//				Encoder_Count ++;
//			}
//		}
//		//清除中断挂起标志位
//		EXTI_ClearITPendingBit(EXTI_Line1);
//	}
//}
void EXTI1_IRQHandler(void)
	{	//检测外部中断状态,如果状态为SET,会返回真(true),否则返回假(false)。
	if (EXTI_GetITStatus(EXTI_Line1) == SET)
	{
		/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
		
		
			if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)  //PB0为低电频
			{//中断函数的处理可以改变全局变量的值
				Encoder_Count ++;
			}
		
		//清除中断挂起标志位
		EXTI_ClearITPendingBit(EXTI_Line1);
	}
}
int16_t Num;

int main(void)
{
	OLED_Init();
	Encoder_Init();
	
	OLED_ShowString(1, 1, "Num:");
	
	while (1)
	{
		Num += Encoder_Get();
		OLED_ShowSignedNum(1, 5, Num, 5);
	}
}

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

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

相关文章

OpenCV基本操作——图像的基础操作

目录 图像的IO操作读取图像显示图像保存图像 绘制几何图形绘制直线绘制圆形绘制矩形向图像中添加文字效果展示 获取并修改图像中的像素点获取图像的属性图像通道的拆分与合并色彩空间的改变 图像的IO操作 读取图像 cv2.imread()import numpy as np import cv2 imgcv2.imread(…

【Java从0到1学习】08 String类

1. 概述 字符串是由多个字符组成的一串数据(字符序列),字符串可以看成是字符数组。 在实际开发中,字符串的操作是最常见的操作,没有之一。而Java没有内置的字符串类型,所以,就在Java类库中提供了一个类String 供我们…

Python爬虫:单线程、多线程、多进程

前言 在使用爬虫爬取数据的时候,当需要爬取的数据量比较大,且急需很快获取到数据的时候,可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。 一、进程和线程 进程可以理解为是正在运行的程序的实例。进…

jvs-rules API数据源配置说明(含配置APIdemo视频)

在JVS中,多数据源支持多种形态的数据接入,其中API是企业生产过程中常见的数据形态。使用数据源的集成配置,以统一的方式管理和集成多个API的数据。这些平台通常提供各种数据转换和处理功能,使得从不同数据源获取和处理数据变得更加…

搭建一个能与大家分享的旅游相册网站——“cpolar内网穿透”

如何用piwigo与cpolar结合共同搭建一个能分享的旅行相册网站 文章目录 如何用piwigo与cpolar结合共同搭建一个能分享的旅行相册网站前言1. 使用piwigo这款开源的图片管理软件2. 需要将piwigi网页复制到phpstudy3. “开始安装”进入自动安装程序4. 创建新相册5. 创建一条空白数据…

Spring Gateway+Security+OAuth2+RBAC 实现SSO统一认证平台

背景:新项目准备用SSO来整合之前多个项目的登录和权限,同时引入网关来做后续的服务限流之类的操作,所以搭建了下面这个系统雏形。 关键词:Spring Gateway, Spring Security, JWT, OAuth2, Nacos, Redis, Danymic datasource, Jav…

ansible剧本之role角色模块

role角色 一:Roles 模块1.roles 的目录结构:2.roles 内各目录含义解释3.在一个 playbook 中使用 roles 的步骤:(1)创建以 roles 命名的目录(2)创建全局变量目录(可选)&am…

Java进阶-Oracle(二十一)(2)

🌻🌻 目录 一、Oracle 数据库的操作(DDL DML DQL DCL TPL)1.1 标识符、关键字、函数等1.1.1 数值类型:1.1.2 字符串类型:1.1.3 日期类型1.1.4 大的数据类型--适合保存更多的数据 1.2 运算符1.3 函数---预定义函数、自定义函数&…

户外组网摆脱布线困扰,工业5G网关实现无人值守、远程实时监控

在物联网通信技术发达的2023,网络覆盖对所及之处的全面覆盖,科技发展的促使下很多高危户外场景也在思考如何利用无线技术提高人员安全及现场无人化管理。 煤矿是我们国家不可缺少的重要能源,其开采过程的危险系数也是众所皆知的,…

【Linux】线程的概念以及与进程的区别

目录 背景知识 什么是线程? 进程和线程的区别 线程的优缺点 背景知识 在了解线程前,我们要首先知道,OS是可以做到让进程进行细粒度划分的! 比如我们所说的进程地址空间中的堆区,它在进程PCB中的mm_structz中有一个start和…

深度学习关键要素:数据集汇总与分享

引言 在深度学习的应用中,数据被认为是最重要的因素之一。因此,选择一个好的数据集对于深度学习的成功至关重要。在选择数据集时,不仅需要关注数据量的大小、多样性以及质量,还要考虑数据集是否代表了所研究问题的真实情况。本文…

SpringBoot对接OpenAI

SpringBoot对接OpenAI 随着人工智能技术的飞速发展,越来越多的开发者希望将智能功能集成到自己的应用中,以提升用户体验和应用的功能。OpenAI作为一家领先的人工智能公司,提供了许多先进的自然语言处理和语言生成模型,其中包括深…

IDEA 设置字体大小无效

设置字体大小,一般都是从file>settings>editor>font>Size里设置,一般都有效。 但是,如果是更换了主体,则需要从主体颜色菜单那里这是,你看这个页面,上面黄色三角也提示你了,要去颜色…

5.内置构造函数

在JavaScript中最主要的数据类型有6种: 1.基本数据类型: 字符串、数值、布尔、undefined、 null 2.引用类型:对象 但是,我们会发现有些特殊情况: //普通字符串 const str andy console.1og(str.length) // 4其实字符串、数值、布尔、等基本类型也都有…

易服客工作室:WordPress 6.3 Lionel发布

WordPress 6.3 Lionel已经发布,它以美国著名爵士乐艺术家莱昂内尔汉普顿 (Lionel Hampton)的名字命名。汉普顿是一位多产的爵士颤音琴演奏家、钢琴家和打击乐演奏家,因与查尔斯明格斯、昆西琼斯等伟大人物合作以及作为同名莱昂内尔汉普顿管弦乐团的乐队领…

【ARM Cache 系列文章 9 -- ARM big.LITTLE技术】

文章目录 big.LITTLE 技术背景big.LITTLE 技术详解big.LITTLE 硬件要求 big.LITTLE 软件模型CPU MigrationGlobal Task SchedulingGlobal Task Scheduling比CPU Migration的优势 转自:https://zhuanlan.zhihu.com/p/630981648 如有侵权,请联系删除 big.L…

C++ 字符串类 string

文章目录 前言一、string 类型概括二、字符串流总结 前言 在C中,字符串是一种常见的数据类型,用于存储和操作文本数据。C标准库中提供了std::string类,它是一个功能强大的字符串类,提供了丰富的方法和操作符,使我们能…

香港大学余涛组推出开源XLANG Agent!支持三种Agent模式

作者 |小戏、ZenMoore 一个新的未来又逐渐开始从理论走向现实走到我们身边了。 语言的意义在于使用,而从 ChatGPT 以来这些大规模语言模型的意义,也必然绝不止于 Chat,在四个月前,我们介绍了清华大学关于工具学习的综述《清华发布…

2021年06月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分别为保留2位小数输出的F,以及整数N,以…

【数学建模】--主成分分析

本讲将介绍主成分分析(Principal Component Analysis,PCA),主成分分析是一种降维算法,它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,其能…