STM32的GPIO初始化配置-学习笔记

news2024/12/28 4:19:22

简介:

        由于刚开始没有学懂GPIO的配置原理,导致后面学习其它外设的时候总是产生阻碍,因为其它外设要使用前,大部分都要配置GPIO的初始化,因此这几天重新学习了一遍GPIO的配置,记录如下。

        首先我们要知道芯片上的引脚,并不是只有GPIO的功能,还能复用成其他功能,比如PA9和PA10引脚,既可以配置成普通的IO口输出高低电平,也可以配置成UART1的TX和RX引脚。今天就以这这两个例子记录一下配置过程。

实验平台芯片是stmf103,野火的指南者开发板。使用hal库开发。

例1:PB5\PB0\PB1配置成普通IO口,控制LED灯的亮灭,

例2:将PA9配置成UART1的TX,将PA10配置成UART1的RX。

一、GPIO的功能框图

此图来自野火的《零死角玩转stm32》,此图在《stm32f10x参考手册》的GPIO章节也有,野火的标注得有需要,方便说明。

1.输出模式:即由单片机控制引脚的高低电平。

输出模式有:推挽输出、开漏输出、复用推挽输出、复用开漏输出。常用推挽输出,复用推挽输出。

①处就是芯片外部引出的引脚,左边的是芯片内部的,从外面看不见。一个引脚在同一时刻,要么是输出,要么是输入,不能同时存在。

②处两个反向串联的MOS管,就实现了推挽输出,这种模式就是普通的IO口输出高低电平,通过操作③和位置位/清除寄存器(BSRR)来控制引脚输出高低电平,从而控制外部的灯的亮灭。

④处是接片上外设,将引脚配置成其他功能,如我们将PA9配置成UART1的TX功能,这时候就不需要去配置③处的ODR和BSRR寄存器。 

2.输入模式:即由外部控制引脚的高低电平

        输入模式有:浮空输入、模拟输入、上拉输入、下拉输入,如果是输入模式的话,就是由外部控制引脚的高低电平变化,单片机去读引脚的电平变化,从而知道外部干了什么。

        比如外部接了按键,按键按下产生低电平,按键释放产生高电平,这时候单片机通过引脚高低变化就知道了按键按下了,进而产生相应的处理,此功能往往和中断一起。在此不做过多的讲解,后面学了中断之后再记录。

3.GPIO寄存器

在《stm32f10x参考手册》GPIO寄存器章节有各个寄存器的功能和作用讲解,由于我们使用hal库开发,操作寄存器的工作由hal做了,我们只需要了解有哪些参数可以修改及其作用。如果有兴趣可以看看源码是怎么操作寄存器的。

1.GPIO寄存器结构体定义

GPIO_TypeDef中就是控制GPIO的7个32位寄存器,具体每个bit位的作用记得看参考手册。

这个结构体不需要我们传入参数。我们需要修改的是GPIO_InitTypeDef结构体。

typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

GPIO_InitTypeDef结构体定义如下,可以由我们自己配置gpio引脚,速度,模式,这三个参数都是去修改GPIO_TypeDef里面的成员的某个位的。


typedef struct
{
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;

2.驱动GPIO_TypeDef中寄存器的库函数函数GPIO_Init

        我们只需要传入端口和初始化结构体即可。请看下面二的例程。

/**
  * @brief  Initializes the GPIOx peripheral according to the specified
  *         parameters in the GPIO_InitStruct.
  * @param  GPIOx: where x can be (A..G) to select the GPIO peripheral.
  * @param  GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that
  *         contains the configuration information for the specified GPIO peripheral.
  * @retval None
  */
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
  uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
  uint32_t tmpreg = 0x00, pinmask = 0x00;
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));  
  
/*---------------------------- GPIO Mode Configuration -----------------------*/
  currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
  if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
  { 
    /* Check the parameters */
    assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
    /* Output mode */
    currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
  }
/*---------------------------- GPIO CRL Configuration ------------------------*/
  /* Configure the eight low port pins */
  if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)
  {
    tmpreg = GPIOx->CRL;
    for (pinpos = 0x00; pinpos < 0x08; pinpos++)
    {
      pos = ((uint32_t)0x01) << pinpos;
      /* Get the port pins position */
      currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
      if (currentpin == pos)
      {
        pos = pinpos << 2;
        /* Clear the corresponding low control register bits */
        pinmask = ((uint32_t)0x0F) << pos;
        tmpreg &= ~pinmask;
        /* Write the mode configuration in the corresponding bits */
        tmpreg |= (currentmode << pos);
        /* Reset the corresponding ODR bit */
        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
        {
          GPIOx->BRR = (((uint32_t)0x01) << pinpos);
        }
        else
        {
          /* Set the corresponding ODR bit */
          if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
          {
            GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
          }
        }
      }
    }
    GPIOx->CRL = tmpreg;
  }
/*---------------------------- GPIO CRH Configuration ------------------------*/
  /* Configure the eight high port pins */
  if (GPIO_InitStruct->GPIO_Pin > 0x00FF)
  {
    tmpreg = GPIOx->CRH;
    for (pinpos = 0x00; pinpos < 0x08; pinpos++)
    {
      pos = (((uint32_t)0x01) << (pinpos + 0x08));
      /* Get the port pins position */
      currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);
      if (currentpin == pos)
      {
        pos = pinpos << 2;
        /* Clear the corresponding high control register bits */
        pinmask = ((uint32_t)0x0F) << pos;
        tmpreg &= ~pinmask;
        /* Write the mode configuration in the corresponding bits */
        tmpreg |= (currentmode << pos);
        /* Reset the corresponding ODR bit */
        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
        {
          GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));
        }
        /* Set the corresponding ODR bit */
        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
        {
          GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));
        }
      }
    }
    GPIOx->CRH = tmpreg;
  }
}

二、PB5\PB0\PB1点亮LED灯例程

        指南者的RGB灯接在stm32f103上的PB5、PB0、PB1三个引脚上,故我们控制对应引脚输出低电平,即可点亮LED灯。

PB5点亮LED1的代码如下。编译后,野火的指南者扳子上,RGB灯以0.5s闪烁红灯。其余两个LED灯的控制,把PB5换成PB0或者PB1即可。

#include "stm32f10x.h"

void delay_nms(u16 time);
void LED_GPIO_Config(void);


//1.主函数
int main(void)
{	
	/* LED 端口初始化 */
	LED_GPIO_Config();

	while(1)
	{
		//GPIO_Pin_5置低电平,则LED1亮
		GPIO_ResetBits(GPIOB, GPIO_Pin_5);
		
		//延时让led1亮保持
		delay_nms(500);

		//GPIO_Pin_5置高电平,则LED1灭
		GPIO_SetBits(GPIOB, GPIO_Pin_5);
		//延时让led1亮保持
		delay_nms(500);
	}
}

//2.毫秒延时,72M,需要精确延时的话还是得定时器
void delay_nms(u16 time)
{    
   u16 i=0;  
   while(time--)
   {
      i=12000;  //自己定义
      while(i--) ;    
   }
}

//3.LED1初始化函数
void LED_GPIO_Config(void)
{		
		/*定义一个GPIO_InitTypeDef类型的结构体*/
    GPIO_InitTypeDef GPIO_InitStructure;

    /*开启GPIOB外设时钟*/
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);

    /*选择要控制的GPIO引脚*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	

    /*设置引脚模式为通用推挽输出*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

    /*设置引脚速率为50MHz */   
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

    /*调用库函数,初始化GPIO*/
    GPIO_Init(GPIOB, &GPIO_InitStructure);	
    
    /* 给GPIO_Pin_5置高电平,即LED1关闭	*/
    GPIO_SetBits(GPIOB, GPIO_Pin_5);
	delay_nms(20);

}	 

三、PA9\PA10做UART1的TX和RX例程

        控制LED灯的亮灭只需要控制引脚输出高低电平即可,但是串口是通信接口,所以需要先说一下串口的数据帧格式,至于串口发送的时序图,咱们写软件的暂时可以不了解。

从上面的帧格式可以知道可变的是数据位、校验位、停止位,起始位固定由库函数实现。

在stm32f103单片机上,UART1是由PA9和PA10复用过来的,所以我们需要对GPIOA的pin9是TX要配置成复用推挽输出模式,pin10引脚是RX要配置成浮空输入模式。

配置流程:

①GPIO复用功能配置

②UART串口配置

③main函数里面调用串口收发函数,和PC上的串口助手互相发送消息

1.GPIO初始化配置

{

	GPIO_InitTypeDef GPIO_InitStructure;

	// 打开串口GPIOA的时钟
	DEBUG_USART_GPIO_APBxClkCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	// 将PA9的GPIO配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

2.串口1初始化

        由于串口接受是由外部控制引脚电平,所以需要开启串口接受中断。

{

	USART_InitTypeDef USART_InitStructure;

	// 打开串口外设的时钟
	DEBUG_USART_APBxClkCmd(RCC_APB2Periph_USART1, ENABLE);
	// 配置串口的工作参数
	// 配置波特率
	USART_InitStructure.USART_BaudRate = 115200;
	// 配置 针数据字长
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	// 配置停止位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	// 配置校验位
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	// 配置硬件流控制
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	// 配置工作模式,收发一起
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	// 完成串口的初始化配置
	USART_Init(USART1, &USART_InitStructure);
	
	//串口中断优先级配置
	NVIC_Configuration();
	
	// 使能串口接收中断
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	
	
	// 使能串口
	USART_Cmd(USART1, ENABLE);	    
}

3.串口发送和发送函数

串口是按照字节发送的,每次发送一个字节,所以要发送多个字节的时候,需要用用循环发送。

/* 发送一个字节 */
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
{
	USART_SendData(pUSARTx, data);
	while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );
}

4.完成代码

        实现下载到开发板之后,自动向串口1发送字符A,接受到PC发送的字符后,立马发给PC.

代码全部写在main.c里面即可。

#include "stm32f10x.h"
// #include "bsp_led.h"
// #include "bsp_usart.h"
// #include "stdlib.h"

void USART_Config(void);
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data);
static void NVIC_Configuration(void);

//1.主函数
int main(void)
{	
 
	USART_Config();
	Usart_SendByte(USART1,'A');

  while(1)
  {

  }
	return 0;
	
}
//2.串口初始化函数
void USART_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	// 打开串口GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	// 打开串口外设的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

	// 将USART Tx的GPIO配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	// 配置串口的工作参数
	// 配置波特率
	USART_InitStructure.USART_BaudRate = 115200;
	// 配置 针数据字长
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	// 配置停止位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	// 配置校验位
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	// 配置硬件流控制
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	// 配置工作模式,收发一起
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	// 完成串口的初始化配置
	USART_Init(USART1, &USART_InitStructure);
	
	//串口中断优先级配置
	NVIC_Configuration();
	
	// 使能串口接收中断
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	
	
	// 使能串口
	USART_Cmd(USART1, ENABLE);	    
}

//3.串口接受中断函数
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 嵌套向量中断控制器组选择 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* 配置USART为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  /* 抢断优先级*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 子优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /* 初始化配置NVIC */
  NVIC_Init(&NVIC_InitStructure);
}

//4.串口发送函数
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
{
	USART_SendData(pUSARTx, data);
	while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );
}

//5.串口接受中断服务函数,USART1_IRQHandler在startup_stm32f10x_hs.s中定义,发生串口中断,自动执行这个函数。
void USART1_IRQHandler(void)
{
    uint8_t ucTemp;
	if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
	{		
  
      ucTemp = USART_ReceiveData(USART1);
      Usart_SendByte(USART1,ucTemp);
	}

}

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

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

相关文章

ideaSSM教师评价管理系统springMVC开发mysql数据库web结构java编程计算机网页源码

一、源码特点 SSM 教师评价管理系统是一套完善的完整信息系统&#xff0c;结合SSM框架和bootstrap完成本系统SpringMVC spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发 &#xff09;&#xff0c;系统具有完整的源代码和…

Yakit爆破模块应用

yakit介绍 一款集成了各种渗透测试功能的集成软件。&#xff08;类似于burp&#xff0c;但我感觉他功能挺强大&#xff09; 爆破模块位置 按照下面图标点击 界面就是如下。 左侧可以选择爆破的类型&#xff0c;各种数据库http&#xff0c;ssh等都支持。 爆破参数 可以选择…

基于可穿戴式多模态人机接口的机械臂运动控制方法

随着科技的不断进步&#xff0c;人机接口在机械臂等辅助设备中的应用不仅为上肢运动障碍人群带来了显著的生活质量提升&#xff0c;同时也揭示出传统人机接口系统存在的一系列问题。这些问题包括指令较少、操作困难等方面&#xff0c;限制了机械臂等辅助设备在运动控制方面的多…

RocketMQ 面试题及答案整理,最新面试题

RocketMQ的消息存储机制是如何设计的&#xff1f; RocketMQ消息存储机制的设计原理&#xff1a; 1、CommitLog文件&#xff1a; 所有的消息都存储在一个连续的CommitLog文件中&#xff0c;保证了消息的顺序写入&#xff0c;提高写入性能。 2、消费队列&#xff1a; 为每个主…

3915A/B/C/D/E/F/G/H EMI测试接收机

3915A/B/C/D/E/F/G/H EMI测试接收机 产品综述 <<<<频率范围&#xff1a;10MHz~50GHz>>> 3915 系列EMI测试接收机是针对国家及国家电磁兼容标准测试需求推出的一款高性能接收机产品。它具有高灵敏度、高精度、大动态范围、低相位噪声等特点&#xff0c;支…

【spring】@Bean注解学习

Bean介绍 Bean用于指示一个方法应该产生一个Bean对象&#xff0c;并将其交给Spring容器管理。 当使用Bean注解的方法被Spring容器调用时&#xff0c;它只会执行一次&#xff0c;随后该方法返回的Bean对象会被添加到Spring的IOC&#xff08;Inversion of Control&#xff0c;控…

linux解析域名指令 nslookup 或者 host

host www.baidu.com 第二种方法 nslookup www.baidu.com 注意&#xff1a;ns是name server之意

鼓楼夜市管理wpf+sqlserver

鼓楼夜市管理系统wpfsqlserver 下载地址:鼓楼夜市管理系统wpfsqlserver 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#wpf架构和sql server数据库 功能模块&#xff1a; 登录注册 鼓楼夜市管理系统主界面所有店铺信…

YOLOv8独家改进:backbone改进 | TransXNet:聚合全局和局部信息的全新CNN-Transformer视觉主干| CVPR2024

💡💡💡本文独家改进:CVPR2024 TransXNet助力检测,代替YOLOv8 Backbone 改进结构图如下: 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适合paper !!! 💡…

【C++ Boost库】原始计时器

文章目录 前言一、原始计时器1.1 timer定时器timer类的介绍异常安全代码概况 1.2 progress_timer类如何使用异常安全代码概况 1.3 progress_display类如何使用代码概况 总结 前言 在现代软件开发中&#xff0c;时间是一种不可逆转的资源。特别是在需要按时执行任务、调度事件或…

汽车屏类产品(五):仪表Cluster常用芯片i.MX117x

前言: 仪表一般就是指方向盘前面那个表盘。做仪表的芯片最主要需要支持显示Display,而仪表的主要排版布局多种多样,但是主旨显示内容不尽相同。 仪表需求: 1、rpm转速表盘 仪表Cluster一般会有转速表盘rpm,单位一般是x1000,大部分汽车仪表范围就是0~8,也就是最高8000…

Prometheus 开源系统监控系统

文章目录 1.Prometheus简介2.Prometheus架构3.数据模型4.Prometheus Server5.AlertManager6.Exporters7.Pushgateway8.Grafana9.微服务监控 开源中间件 # Prometheushttps://iothub.org.cn/docs/middleware/ https://iothub.org.cn/docs/middleware/prometheus/prome-summary/…

【软件测试】探索和学习SDLC与软件测试的关系

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-gMpBJBc5FTUA3r7m {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

聊一聊常见的网络安全模型

目录 一、概述 二、基于时间的PDR模型 2.1 模型概念提出者 2.2 模型图 2.3 模型内容 2.3.1 Protection&#xff08;保护&#xff09; 2.3.2 Detection&#xff08;检测&#xff09; 2.3.3 Response&#xff08;响应&#xff09; 2.4 PDR模型思想 2.4.1 PDR模型假设 2…

asp购房网/网上房屋中介系统/房屋售房网站/(二手房交易)-203-(代码 +说明+开题+外文)

转载地址: http://www.3q2008.com/soft/search.asp?keyword203 以下是代码片段&#xff1a; 可以下载 查看演功能示 网站主要分前台系统和后台管理系统。 1、前台系统分为用户管理系统&#xff0c;新闻管理系统&#xff0c;资源查询系统&#xff0c;在线交流&#xff08;BBS&…

无人机远程指挥控制系统技术,无人机远程指挥中心功能详解

无人机远程指挥控制系统是一种用于实现无人机远程控制和指挥的技术。它主要基于先进的通信技术和无人机控制技术&#xff0c;使得操作人员可以在远离无人机的地方对其进行实时的控制和监控。 无人机远程指挥控制系统关键部分&#xff1a; 1. 通信技术&#xff1a;这是无人机远…

保研复习数据结构记(7)--散列查找(哈希表)

哈希表有什么特点&#xff1f;数据元素的关键字与其存储地址直接相关&#xff08;通过哈希函数相关&#xff09;&#xff0c;典型的用空间换时间的算法处理冲突的方法&#xff1f;拉链法&#xff08;链地址法&#xff09;&#xff0c;开放定址法&#xff0c;再散列法什么是查找…

國内linux服务器解决Ollama安装超时

curl -fsSL https://ollama.com/install.sh | sh 执行一直超时 做如下配置&#xff1a; 修改hosts文件&#xff0c;直接将http://github.com做个ip指向。 sudo vim /etc/hosts 输入密码后&#xff0c;按 i 增加以下配置 # github 注意下面的IP地址和域名之间有一个空格 140…

AI在商业逻辑应用中的革命性作用

在今天的商业环境中&#xff0c;我们面临着一系列复杂且瞬息万变的问题。从最初的业务点子产生&#xff0c;到方案的落地实施&#xff0c;每一个环节都充满了不确定性。传统的商业逻辑构建方式&#xff0c;往往耗时耗力&#xff0c;而且容易因为人的主观因素导致效率低下或偏离…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通信号灯识别系统(深度学习+UI界面+训练数据集+Python代码)

摘要&#xff1a;本研究详细介绍了一种采用深度学习技术的交通信号灯识别系统&#xff0c;该系统集成了最新的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地…