STM32F4 | 外部中断实验

news2024/11/27 20:32:32

文章目录

    • 一、STM32F4 外部中断简介
    • 二、硬件设计
    • 三、软件设计
    • 四、实验现象
    • 五、STM32CubeMX 配置外部中断

  本章我们将介绍如何将 STM32F429IO 口作为外部中断输入。

一、STM32F4 外部中断简介

  这里首先介绍STM32F4 IO 口中断的一些基础概念。STM32F4 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32F4 的强大之处。STM32F429 的中断控制器支持 22个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F42922 个外部中断为:

  • EXTI 线 0~15:对应外部 IO 口的输入中断。
  • EXTI 线 16:连接到 PVD 输出。
  • EXTI 线 17:连接到 RTC 闹钟事件。
  • EXTI 线 18:连接到 USB OTG FS 唤醒事件。
  • EXTI 线 19:连接到以太网唤醒事件。
  • EXTI 线 20:连接到 USB OTG HS(在 FS 中配置)唤醒事件。
  • EXTI 线 21:连接到 RTC 入侵和时间戳事件。
  • EXTI 线 22:连接到 RTC 唤醒事件。

  从上面可以看出,STM32F4IO 口使用的中断线只有 16 个,但是 STM32F4IO 口却远远不止 16 个,那么 STM32F4 是怎么把 16 个中断线和 IO 口一一对应起来的呢?于是 STM32就这样设计,GPIO 的引脚 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G,H,I)分别对应中断线 0~15。这样每个中断线对应了最多 9 个 IO 口,以线 0 为例:它对应了 GPIOA.0GPIOB.0GPIOC.0GPIOD.0GPIOE.0GPIOF.0GPIOG.0GPIOH.0GPIOI.0。而中断线每次只能连接到 1 个 IO口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上了。下面我们看看 GPIO跟中断线的映射关系图
在这里插入图片描述
GPIO 和中断线映射关系是在寄存器SYSCFG_EXTICR1~ SYSCFG_EXTICR4 中配置的。所以我们要配置外部中断,还需要打开 SYSCFG 时钟。
  接下来我们来看看使用 HAL 库配置外部中断的一般步骤。HAL 中外部中断相关配置函数和定义在文件 stm32f4xx_hal_exti.hstm32f4xx_hal_exti.c 文件中。

  1. 使能 IO 口时钟。
      首先,我们要使用 IO 口作为中断输入,所以我们要使能相应的 IO 口时钟。

  2. 设置 IO 口模式,触发条件,开启 SYSCFG 时钟,设置 IO 口与中断线的映射关系
      在函数 HAL_GPIO_Init 中一次性完成。例如我们要设置 PA0 链接中断线 0,并且为上升沿触发,代码为:

    GPIO_InitTypeDef GPIO_Initure;
    GPIO_Initure.Pin=GPIO_PIN_0; //PA0
    GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //外部中断,上升沿触发
    GPIO_Initure.Pull=GPIO_PULLDOWN; //默认下拉
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
    

      当我们调用 HAL_GPIO_Init 设置 IOMode 值为 GPIO_MODE_IT_RISING(外部中断上升 沿 触 发 ), GPIO_MODE_IT_FALLING (外部中断下降沿触发)或者GPIO_MODE_IT_RISING_FALLING(外部中断双边沿触发)的时候,该函数内部会通过判断
    Mode 的值来开启 SYSCFG 时钟,并且设置 IO 口和中断线的映射关系。
      因为我们这里初始化的是 PA0,调用该函数后中断线 0 会自动连接到PA0。如果某个时间,我们又同样的方式初始化了 PB0,那么 PA0 与中断线的链接将被清除,而直接链接 PB0 到中断线 0。

  3. 配置中断优先级(NVIC),并使能中断。
      我们设置好中断线和 GPIO 映射关系,然后又设置好了中断的触发模式等初始化参数。既然是外部中断,涉及到中断我们当然还要设置 NVIC 中断优先级。设置中断线 0 的中断优先级并使能外部中断 0 的方法为:

    HAL_NVIC_SetPriority(EXTI0_IRQn,2,1); //抢占优先级为 2,子优先级为 1
    HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断线 0
    
  4. 编写中断服务函数。
      我们配置完中断优先级之后,接着要做的就是编写中断服务函数。中断服务函数的名字是在 HAL 库中事先有定义的。这里需要说明一下,STM32F4IO 口外部中断函数只有 7 个,分别为:

    void EXTI0_IRQHandler(); 
    void EXTI1_IRQHandler(); 
    void EXTI2_IRQHandler(); 
    void EXTI3_IRQHandler(); 
    void EXTI4_IRQHandler(); 
    void EXTI9_5_IRQHandler(); 
    void EXTI15_10_IRQHandler();
    

    中断线 0-4 每个中断线对应一个中断函数,中断线 5-9 共用中断函数 EXTI9_5_IRQHandler,中断线 10-15 共用中断函数 EXTI15_10_IRQHandler。一般情况下,我们可以把中断控制逻辑直接编写在中断服务函数中,但是 HAL 库把中断处理过程进行了简单封装。

  5. 编写中断处理回调函数 HAL_GPIO_EXTI_Callback
      HAL 库为了用户使用方便,它提供了一个中断通用入口函数HAL_GPIO_EXTI_IRQHandler,在该函数内部直接调用回调函数 HAL_GPIO_EXTI_Callback。我们可以看看 HAL_GPIO_EXTI_IRQHandler 函数定义:

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
	if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
	{
		__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
		HAL_GPIO_EXTI_Callback(GPIO_Pin);
	}
}

该函数实现的作用非常简单,就是清除中断标志位,然后调用回调函数HAL_GPIO_EXTI_Callback()实现控制逻辑。所以,我们编写中断控制逻辑将跟串口实验类似,在中断服务函数中直接调用外部中断共用处理函数HAL_GPIO_EXTI_IRQHandler,然后在回调函数 HAL_GPIO_EXTI_Callback 中通过判断中断是来自哪个 IO 口编写相应的中断服务控制逻辑。

  下面总结一下配置IO口外部中断的一般步骤:

  • 使能 IO 口时钟。
  • 调用函数 HAL_GPIO_Init 设置 IO 口模式,触发条件,使能 SYSCFG 时钟以及设置 IO口与中断线的映射关系。
  • 配置中断优先级(NVIC),并使能中断。
  • 在中断服务函数中调用外部中断共用入口函数 HAL_GPIO_EXTI_IRQHandler
  • 编写外部中断回调函数 HAL_GPIO_EXTI_Callback

通过以上几个步骤的设置,我们就可以正常使用外部中断了。

二、硬件设计

  本实验用到的硬件资源有:

  • 指示灯 DS0DS1
  • 4 个按键:KEY0KEY1KEY2、和 KEY_UP

在阿波罗 STM32 开发板上的按键 KEY0 连接在 PH3 上、KEY1 连接在 PH2 上、KEY2 连接在 PC13 上、KEY_UP 连接在 PA0上。如图所示:
在这里插入图片描述
这里需要注意的是:KEY0KEY1KEY2 是低电平有效的(按下是低电平),而 KEY_UP 是高电平有效的(按下是高电平),并且外部都没有上下拉电阻,所以,需要在 STM32F429 内部设置上下拉。输入模式配置如下

  • PH3:上拉输入
  • PH2:上拉输入
  • PC13:上拉输入
  • PA0:下拉输入

三、软件设计

  我们直接复制“按键输入实验”的工程模板,将复制过来的模板文件夹重新命名为“4-外部中断实验”。在HARDWARE->EXTI 文件夹下面新建exti.c 文件以及头文件 exti.h
  打开exti.c 文件,代码如下:

#include "exti.h"
#include "delay.h"
#include "led.h"
#include "key.h"


//外部中断初始化
void EXTI_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;
    
    __HAL_RCC_GPIOA_CLK_ENABLE();               //开启GPIOA时钟
    __HAL_RCC_GPIOC_CLK_ENABLE();               //开启GPIOC时钟
    __HAL_RCC_GPIOH_CLK_ENABLE();               //开启GPIOH时钟
    
    GPIO_Initure.Pin=GPIO_PIN_0;                //PA0
    GPIO_Initure.Mode=GPIO_MODE_IT_RISING;      //上升沿触发
    GPIO_Initure.Pull=GPIO_PULLDOWN;
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
    
    GPIO_Initure.Pin=GPIO_PIN_13;               //PC13
    GPIO_Initure.Mode=GPIO_MODE_IT_FALLING;     //下降沿触发
    GPIO_Initure.Pull=GPIO_PULLUP;
    HAL_GPIO_Init(GPIOC,&GPIO_Initure);
    
    GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3;     //PH2,3
    HAL_GPIO_Init(GPIOH,&GPIO_Initure);
    
    //中断线0-PA0
    HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);       //抢占优先级为2,子优先级为0
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);             //使能中断线0
    
    //中断线2-PH2
    HAL_NVIC_SetPriority(EXTI2_IRQn,2,1);       //抢占优先级为2,子优先级为1
    HAL_NVIC_EnableIRQ(EXTI2_IRQn);             //使能中断线2
    
    //中断线3-PH3
    HAL_NVIC_SetPriority(EXTI3_IRQn,2,2);       //抢占优先级为2,子优先级为2
    HAL_NVIC_EnableIRQ(EXTI3_IRQn);             //使能中断线2
    
    //中断线13-PC13
    HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,3);   //抢占优先级为2,子优先级为3
    HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);         //使能中断线13  
}


//中断服务函数
void EXTI0_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);//调用中断处理公用函数
}

void EXTI2_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);//调用中断处理公用函数
}

void EXTI3_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);//调用中断处理公用函数
}

void EXTI15_10_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);//调用中断处理公用函数
}

//中断服务程序中需要做的事情
//在HAL库中所有的外部中断服务函数都会调用此函数
//GPIO_Pin:中断引脚号
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    delay_ms(100);      //消抖
    switch(GPIO_Pin)
    {
        case GPIO_PIN_0:
            if(WK_UP==1) 
            {
				LED1=!LED1;//控制LED0,LED1互斥点亮
				LED0=!LED1;
            }
            break;
        case GPIO_PIN_2:
            if(KEY1==0)  //LED1翻转
            {
                LED1=!LED1;    
            }
            break;
        case GPIO_PIN_3:
            if(KEY0==0)  //同时控制LED0,LED1翻转 
            {
                LED0=!LED0;
				LED1=!LED1;
            }
            break;

        case GPIO_PIN_13:
            if(KEY2==0)  
            {
				LED0=!LED0;//控制LED0翻转
            }
            break;
    }
}

其头文件exti.h

#ifndef _EXTI_H
#define _EXTI_H
#include "sys.h"	

void EXTI_Init(void);
#endif

  exti.c 文件总共包含 6 个函数。外部中断初始化函数 void EXTIX_Init 用来配置 IO 口外部中断相关步骤并使能中断,另一个函数HAL_GPIO_EXTI_Callback 是外部中断共用回调函数,用来处理所有外部中断真正的控制逻辑。其他 4 个都是中断服务函数。

  • void EXTI0_IRQHandler(void)是外部中断 0 的服务函数,负责 KEY_UP 按键的中断检测;
  • void EXTI2_IRQHandler(void)是外部中断 2 的服务函数,负责 KEY2 按键的中断检测;
  • void EXTI3_IRQHandler(void)是外部中断 3 的服务函数,负责 KEY1 按键的中断检测;
  • void EXTI4_IRQHandler(void)是外部中断 4 的服务函数,负责 KEY0 按键的中断检测;

  下面我们分别介绍这几个函数。
  首先是外部中断初始化函数 void EXTIX_Init(void),该函数内部主要做了两件事情。首先是调用 IO 口初始化函数 HAL_GPIO_Init 来初始化 IO 口,其次是设置中断优先级并使能中断线。接下来我们看看外部中断服务函数,一共 4 个。所有的中断服务函数内部都只调用了同样一个函数 HAL_GPIO_EXTI_IRQHandler,该函数是外部中断共用入口函数,函数内部会进行中断标志位清零, 并且调用中断处理共用回调函数HAL_GPIO_EXTI_Callback
  最后是外部中断回调函数 HAL_GPIO_EXTI_Callback,该函数用来编写真正的外部中断控制逻辑。该函数有一个入口参数就是 IO 口序号。所以我们在该函数内部,一般通过判断 IO 口序号值来确定中断是来自哪个 IO 口,也就是哪个中断线,然后编写相应的控制逻辑。所以在该函数内部,我们通过 switch 语句判断 IO 口来源。
  主函数main 函数代码如下:

int main(void)
{
	 HAL_Init(); //初始化 HAL 库 
	 Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
	 delay_init(180); //初始化延时函数
	 uart_init(115200); //初始化 USART
	 LED_Init(); //初始化 LED 
	 EXTI_Init(); //外部中断初始化
	 while(1)
	 {
		 printf("OK\r\n"); //打印 OK 提示程序运行
		 delay_ms(1000); //每隔 1s 打印一次
	 }
}

while 死循环中不停的打印字符串到串口。当有某个外部按键按下之后,会触发中断服务函数做出相应的反应。

四、实验现象

  使用 USB 线将开发板和电脑连接成功后(电脑能识别开发板上 CH340 串口),把编译后产生的.hex 文件烧入到芯片内。在串口调试助手里面可以看到如图所示:
在这里插入图片描述
此时,按下 KEY0KEY1KEY2KEY_UP 可以观察到 DS0DS1 跟着按键的变化而变化。

五、STM32CubeMX 配置外部中断

  对于外部中断的配置,首先在 MCU 引脚配置图界面选择相应的 GPIO 设置其模式为外部中断模式。
在这里插入图片描述
然后我们打开依次点击 Configuration->GPIO进入 GPIO 详细配置界面 Pin Configuration,界面会列出 4 个 IO 口的配置信息。
在这里插入图片描述
  从上图界面可以看出,当我们配置 IO 口作为外部中断触发引脚之后,其详细配置界面便只有三个选项。第一个选项 GPIO mode 用来设置外部中断触发方法,上升沿触发还是下降沿触发还是双边沿触发。第二个选项 GPIO Pull-up/Pull-down 用来设置是默认上拉还是下拉。这里除了设置 PA0 为上升沿触发默认下拉外,其他 IO 口都设置为下降沿触发默认上拉。
  配置好 IO 口信息之后,接下来就需要配置 NVIC 中断优先级设置。依次点击Configuration->NVIC,进入 NVIC 配置界面。在界面可以看到有四个外部中断线可配置,这是因为我们前面开启了四个 IO 口的外部中断(对应 4 个外部中断线)。依次配置四个中断线的 NVIC 即可,配置完成后如下图所示:
在这里插入图片描述
 &esmp;最后生成工程,在 main.c 中生成的函数 MX_GPIO_Init 和我们实验工程中 exti.c 文件中的函数 EXTI_Init 内容一致,在stm32f4xx_it.c 中生成了 4 个中断服务函数,和 exti.c 文件中的中断服务函数内容一致。当然,回调函数 HAL_GPIO_EXTI_Callback 的内容软件是无法自动生成的,需要我们自己编写。


/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PH2 PH3 */
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI0_IRQn);

  HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 1);
  HAL_NVIC_EnableIRQ(EXTI2_IRQn);

  HAL_NVIC_SetPriority(EXTI3_IRQn, 2, 2);
  HAL_NVIC_EnableIRQ(EXTI3_IRQn);

  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 3);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

}
/******************************************************************************/
/* STM32F4xx Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_stm32f4xx.s).                    */
/******************************************************************************/

/**
* @brief This function handles EXTI line0 interrupt.
*/
void EXTI0_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI0_IRQn 0 */

  /* USER CODE END EXTI0_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  /* USER CODE BEGIN EXTI0_IRQn 1 */

  /* USER CODE END EXTI0_IRQn 1 */
}

/**
* @brief This function handles EXTI line2 interrupt.
*/
void EXTI2_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI2_IRQn 0 */

  /* USER CODE END EXTI2_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
  /* USER CODE BEGIN EXTI2_IRQn 1 */

  /* USER CODE END EXTI2_IRQn 1 */
}

/**
* @brief This function handles EXTI line3 interrupt.
*/
void EXTI3_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI3_IRQn 0 */

  /* USER CODE END EXTI3_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
  /* USER CODE BEGIN EXTI3_IRQn 1 */

  /* USER CODE END EXTI3_IRQn 1 */
}

/**
* @brief This function handles EXTI line[15:10] interrupts.
*/
void EXTI15_10_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */

  /* USER CODE END EXTI15_10_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */

  /* USER CODE END EXTI15_10_IRQn 1 */
}

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

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

相关文章

实验五图形用户界面编程

目录 一、目的与任务 二、内容、要求与安排方式 三、实验设备 四、实验步骤 一、目的与任务 掌握常用事件及其处理模型;掌握常用GUI控制组件的使用及其事件的处理;掌握菜单的使用以及对话框的使用。 二、内容、要求与安排方式 1、实验内容与要求&…

SpringCloud系列(五)Nacos 注册中心配置管理的设置及使用

介绍几种 Nacos 常用的配置, 如统一配置管理的步骤, 如何配置自动刷新及多环境配置优先级问题. Nacos 配置管理⚽️ 统一配置管理⚽️⚽️配置自动刷新⚽️⚽️⚽️ 多环境配置优先级⚽️ 统一配置管理 步骤一: 在 Nacos 中添加配置信息, 如添加时间格式的配置内容; 步骤二: …

Ribbon实战与原理剖析

一、ribbon概述 1、ribbon简介 目前主流的负载方案分为以下两种: 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx&#xff0…

读写锁的学习与实验

目录 目录 1,场景 2,接口 3,场景模拟 1,场景 有一种场景,读者多,写者少,绝大多数的情况下我们都是在进行读取而不修改,只有少数的情况下我们才会修改。 场景一:比如…

解决jenkins构建失败,空间不足问题

随着构建次数过多,之后jenkins构建会出现空间不足的问题,解决方式如下: 目录 1.配置时,去除旧的构建任务 2.使用脚本,删除历史构建 3.清理磁盘空间 4.重新加载服务器节点 1.配置时,去除旧的构建任务 2…

计算机网络(自顶向下)学习笔记——路由选择算法

第五章—路由选择算法 5.1、路由的概念 路由:按照某种指标(传输延迟,所经过的站点数目等)找到一条 从源节点到目标节点的较好路径 较好路径: 按照某种指标较小的路径指标:站数, 延迟,费用,队列长度等, 或者是一些单纯指标的加权平均采用什么样的指标,表示网络使用者希望网络…

m基于优化算法的多车辆的路径规划matlab仿真,对比GA,PSO以及烟花算法

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 路径规划是运动规划的主要研究内容之一。运动规划由路径规划和轨迹规划组成,连接起点位置和终点位置的序列点或曲线称之为路径,构成路径的策略称之为路径规划。路径规划在…

微软12月多个安全漏洞修复解决方案

安全狗应急响应中心监测到,微软发布了2022年12月份安全更新,事件等级:严重,事件评分:10.0。此次安全更新发布了52个漏洞的补丁,主要覆盖了以下组件:Azure; Office and Office Components; SysIn…

提高电网的稳态稳定性(Matlab代码实现)

目录 1 概述 2 稳态稳定性分析 2.1 系统模型 2.2 稳态稳定性 2.3 问题说明 3 仿真结果 4 一点小智慧 5 Matlab代码实现 1 概述 随着电力系统的复杂性和规模的增加,电力系统的有效控制变得越来越困难。我们提出了一种自动控制策略,该策略基于通过…

如何使用typeScript实现贪吃蛇游戏?

1.配置文件 配置文件写过一次之后,可以复制粘贴使用,修改部分细节就可以了。 package.json {"name": "snake","version": "1.0.0","description": "","main": "index.js&q…

网络协议——RPC协议综述

拿最简单的场景,客户端调用一个加法函数,将两个整数加起来,返回它们的和。 如果放在本地调用,那是简单的不能再简单了,。但是一旦变成了远程调用,门槛一下子就上去了。 如何解决这五个问题? …

秦力洪复盘2022:蔚来的长板和误判

作者 | 张祥威 编辑 | 王博最初我们看蔚来,觉得它是中国的特斯拉。后来它主动挑战宝马,以46万的平均单价在高端品牌阵营厮杀,看上去又具备成为宝马的潜力。再到后来,蔚来宣布将推出全新品牌,喊话月销5万辆,…

[附源码]Nodejs计算机毕业设计基于大数据的高校国有固定资产管理及绩效自动评价系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

Django学习15 -- 验证码

1. 验证码 验证码(CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart),全自动区分计算机和人类的图灵测试的简称,一种区分用户是计算机还是人的公共全自动程序。防止恶意破解密码、…

Java+Swing+mysql实现学生选课管理系统

JavaSwing实现学生选课管理系统一、系统介绍二、系统展示1.课程查询2.课程添加3.退课三、系统实现四、其他1.其它系统2.获取源码一、系统介绍 本系统实现了学生登录和管理员登录,学生实现选课,查看已选课程,修改密码,查看学生信息…

Vue.use 与 Vue.prototype 在注册插件时,使用上有什么区别

很多使用Vue开发的童鞋,可能对Vue的原型对象prototype有了解过,但对于Vue.use只知如何使用,却不知其背后的含义。那么,今天我们就来瞧一瞧Vue.use()背后的逻辑。 🎈 首先,Vue.use()是什么? 官方…

外汇天眼:投资200美元起 每天收益7%!千万别被蒙蔽双眼!

12月14日,英国金融行为监管局( FCA )首次对 GoldVest FX 发出警告,提示投资者警惕与这家未经授权的公司打交道。 FCA警告称:GoldVest FX 在未经我们授权的情况下在英国提供金融服务或产品,如果一旦遭受资金损失,您将无…

logback-spring.xml 配置化说明记录如何在SpringBoot项目里面配置logback-spring.xml教程说明

目录 前言描述 logback-spring.xml 配置项详细 配置位置路径 前言描述 无论什么样的java应用都需要日志分级, 日志记录器(Logger)是日志处理的核心组件。log4j具有5种正常级别(Level)。 DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的。1.static L…

【三维目标检测】FCAF3D(二)

FCAF3D数据和源码配置调试过程请参考上一篇博文:【三维目标检测】FCAF3D(一)_Coding的叶子的博客-CSDN博客。本文主要详细介绍FCAF3D网络结构及其运行中间状态。 1 模型总体过程 FCAF3D模型的整体结构如下图所示。该模型属于anchor-free目标…

SIoU Loss 原理与代码解析

paper:SIoU Loss: More Powerful Learning for Bounding Box Regression code:https://github.com/meituan/YOLOv6/blob/main/yolov6/utils/figure_iou.py#L75 存在的问题 之前的目标检测模型的回归损失考虑到了预测的bounding box和gt box之间的dis…