Air001基于Keil环境点灯和调试输出工程配置

news2025/2/26 3:41:56

Air001基于Keil环境点灯和调试输出工程配置


  • 📌官方环境搭建教程介绍:https://wiki.luatos.com/chips/air001/Air001-MDK.html
  • 🔖本人使用的是基于HAL库环境搭建的。
  • 📍SDK开发资源链接:https://gitee.com/openLuat/luatos-soc-air001

✨这里就不介绍具体的环境搭建详细教程了,可以参考官方给出的教程自行搭建,这里主要讲一些外设模块的使能配置,文件架构以及引脚功能复用这一块的内容。

  • ✨本人是十分不喜欢直接使用SDK中的例程资源作为模板来使用的,虽然官方在所提供资源中提供了相关模版,但是并适合个人开发者使用习惯。里面的例程资源,大多都是根据他们自己出的开发板而展开的。例如下面的这些源文件代码,在很多例程中都被引用,而作为个人开发者使用,这些都是一些没必要的包含。
    在这里插入图片描述
  • 🍁Keil工程必要的文件架构图参考:
    在这里插入图片描述

🛠相关外设使能配置

  • 🌿启用对应的外设宏。

找到头文件air001xx_hal_conf.h,启用对应的外设宏定义。如果下面没有添加条件编译的头文件,那么可以直接跳过。

在这里插入图片描述
air001xx_hal_conf.h条件编译的宏:

#ifdef HAL_MODULE_ENABLED
 #include "air001xx_hal.h"
#endif /* HAL_MODULE_ENABLED */

#ifdef HAL_RCC_MODULE_ENABLED
 #include "air001xx_hal_rcc.h"
#endif /* HAL_RCC_MODULE_ENABLED */

#ifdef HAL_EXTI_MODULE_ENABLED
 #include "air001xx_hal_exti.h"
#endif /* HAL_EXTI_MODULE_ENABLED */

#ifdef HAL_GPIO_MODULE_ENABLED
 #include "air001xx_hal_gpio.h"
#endif /* HAL_GPIO_MODULE_ENABLED */

#ifdef HAL_CORTEX_MODULE_ENABLED
 #include "air001xx_hal_cortex.h"
#endif /* HAL_CORTEX_MODULE_ENABLED */

#ifdef HAL_DMA_MODULE_ENABLED
  #include "air001xx_hal_dma.h"
#endif /* HAL_DMA_MODULE_ENABLED */

#ifdef HAL_ADC_MODULE_ENABLED
 #include "air001xx_hal_adc.h"
#endif /* HAL_ADC_MODULE_ENABLED */

#ifdef HAL_CRC_MODULE_ENABLED
 #include "air001xx_hal_crc.h"
#endif /* HAL_CRC_MODULE_ENABLED */

#ifdef HAL_COMP_MODULE_ENABLED
#include "air001xx_hal_comp.h"
#endif /* HAL_COMP_MODULE_ENABLED */

#ifdef HAL_FLASH_MODULE_ENABLED
 #include "air001xx_hal_flash.h"
#endif /* HAL_FLASH_MODULE_ENABLED */

#ifdef HAL_I2C_MODULE_ENABLED
 #include "air001xx_hal_i2c.h"
#endif /* HAL_I2C_MODULE_ENABLED */

#ifdef HAL_IWDG_MODULE_ENABLED
 #include "air001xx_hal_iwdg.h"
#endif /* HAL_IWDG_MODULE_ENABLED */

#ifdef HAL_PWR_MODULE_ENABLED
 #include "air001xx_hal_pwr.h"
#endif /* HAL_PWR_MODULE_ENABLED */

#ifdef HAL_RTC_MODULE_ENABLED
 #include "air001xx_hal_rtc.h"
#endif /* HAL_RTC_MODULE_ENABLED */    

#ifdef HAL_SPI_MODULE_ENABLED
 #include "air001xx_hal_spi.h"
#endif /* HAL_SPI_MODULE_ENABLED */

#ifdef HAL_TIM_MODULE_ENABLED
 #include "air001xx_hal_tim.h"
#endif /* HAL_TIM_MODULE_ENABLED */

#ifdef HAL_LPTIM_MODULE_ENABLED
 #include "air001xx_hal_lptim.h" 
#endif /* HAL_LPTIM_MODULE_ENABLED */

#ifdef HAL_UART_MODULE_ENABLED
 #include "air001xx_hal_uart.h"
#endif /* HAL_UART_MODULE_ENABLED */

#ifdef HAL_WWDG_MODULE_ENABLED
 #include "air001xx_hal_wwdg.h"
#endif /* HAL_WWDG_MODULE_ENABLED */

#ifdef HAL_LED_MODULE_ENABLED
 #include "air001xx_hal_led.h"
#endif /* HAL_LED_MODULE_ENABLED */

#ifdef HAL_USART_MODULE_ENABLED
 #include "air001xx_hal_usart.h"
#endif /* HAL_USART_MODULE_ENABLED */
  • 🌿添加对应的外设源文件。

📓引脚复用

  • 🌿端口复用功能列表:

在这里插入图片描述

  • 🌿引脚复用对应的代码定义的头文件:air001xx_hal_gpio_ex.h
/*------------------------- AIR001xx ------------------------*/
#if (defined(AIR00103PRE)|| defined(AIR00130PRE) || defined(AIR001_DEV))
/**
  * @brief   AF 0 selection
  */

#define GPIO_AF0_SWJ           ((uint8_t)0x00)  /*!< SWJ (SWD) Alternate Function mapping */
#define GPIO_AF0_SPI1          ((uint8_t)0x00)  /*!< SPI1 Alternate Function mapping */
#define GPIO_AF0_SPI2          ((uint8_t)0x00)  /*!< SPI2 Alternate Function mapping */
#define GPIO_AF0_TIM14         ((uint8_t)0x00)  /*!< TIM14 Alternate Function mapping */
#define GPIO_AF0_USART1        ((uint8_t)0x00)  /*!< USART1 Alternate Function mapping */

/**
  * @brief   AF 1 selection
  */

#define GPIO_AF1_IR            ((uint8_t)0x01)  /*!< IR Alternate Function mapping */
#define GPIO_AF1_SPI2          ((uint8_t)0x01)  /*!< SPI2 Alternate Function mapping */
#define GPIO_AF1_TIM1          ((uint8_t)0x01)  /*!< TIM1 Alternate Function mapping */
#define GPIO_AF1_TIM3          ((uint8_t)0x01)  /*!< TIM3 Alternate Function mapping */
#define GPIO_AF1_USART1        ((uint8_t)0x01)  /*!< USART1 Alternate Function mapping */

/**
  * @brief   AF 2 selection
  */
#define GPIO_AF2_SPI2          ((uint8_t)0x02)  /*!< SPI2 Alternate Function mapping */
#define GPIO_AF2_TIM1          ((uint8_t)0x02)  /*!< TIM1 Alternate Function mapping */
#define GPIO_AF2_TIM14         ((uint8_t)0x02)  /*!< TIM14 Alternate Function mapping */
#define GPIO_AF2_TIM16         ((uint8_t)0x02)  /*!< TIM16 Alternate Function mapping */
#define GPIO_AF2_TIM17         ((uint8_t)0x02)  /*!< TIM17 Alternate Function mapping */

/**
  * @brief   AF 3 selection
  */
#define GPIO_AF3_LED           ((uint8_t)0x03U)  /*!< AF3: LED Alternate Function mapping      */
#define GPIO_AF3_USART1        ((uint8_t)0x03U)  /*!< AF3: USART1 Alternate Function mapping      */
#define GPIO_AF3_USART2        ((uint8_t)0x03U)  /*!< AF3: USART2 Alternate Function mapping      */
#define GPIO_AF3_SPI2          ((uint8_t)0x03U)  /*!< AF3: SPI2 Alternate Function mapping      */
/**
  * @brief   AF 4 selection
  */

#define GPIO_AF4_TIM14         ((uint8_t)0x04)  /*!< TIM14 Alternate Function mapping */
#define GPIO_AF4_USART2        ((uint8_t)0x04)  /*!< USART2 Alternate Function mapping */
/**
  * @brief   AF 5 selection
  */
#define GPIO_AF5_LPTIM         ((uint8_t)0x05)  /*!< LPTIM1 Alternate Function mapping */
#define GPIO_AF5_USART2        ((uint8_t)0x05)  /*!< USART2 Alternate Function mapping */
#define GPIO_AF5_EVENTOUT      ((uint8_t)0x05)  /*!< EVENTOUT Alternate Function mapping */
#define GPIO_AF5_TIM16         ((uint8_t)0x05)  /*!< TIM16 Alternate Function mapping */
#define GPIO_AF5_TIM17         ((uint8_t)0x05)  /*!< TIM17 Alternate Function mapping */
#define GPIO_AF5_MCO           ((uint8_t)0x05)  /*!< MCO Alternate Function mapping */
/**
  * @brief   AF 6 selection
  */
#define GPIO_AF6_I2C          ((uint8_t)0x06)  /*!< I2C1 Alternate Function mapping */
#define GPIO_AF6_LED           ((uint8_t)0x06U)  /*!< AF6: LED Alternate Function mapping      */
#define GPIO_AF6_MCO           ((uint8_t)0x06)  /*!< MCO Alternate Function mapping */
#define GPIO_AF6_EVENTOUT     ((uint8_t)0x06U)  /*!< AF6: EVENTOUT Alternate Function mapping  */
/**
  * @brief   AF 7 selection
  */
#define GPIO_AF7_EVENTOUT      ((uint8_t)0x07)  /*!< EVENTOUT Alternate Function mapping */
#define GPIO_AF7_COMP1        ((uint8_t)0x07U)  /*!< AF7: COMP1 Alternate Function mapping     */
#define GPIO_AF7_COMP2        ((uint8_t)0x07U)  /*!< AF7: COMP2 Alternate Function mapping     */
/**
  * @brief   AF 8 selection
  */
#define GPIO_AF8_USART1        ((uint8_t)0x08U)  /*!< AF8: USART1 Alternate Function mapping      */
/**
  * @brief   AF 9 selection
  */
#define GPIO_AF9_USART2        ((uint8_t)0x09)  /*!< USART2 Alternate Function mapping */
/**
  * @brief   AF 10 selection
  */
#define GPIO_AF10_SPI1          ((uint8_t)0x0A)  /*!< SPI2 Alternate Function mapping */
/**
  * @brief   AF 11 selection
  */
#define GPIO_AF11_SPI2          ((uint8_t)0x0B)  /*!< SPI2 Alternate Function mapping */
/**
  * @brief   AF 12 selection
  */
#define GPIO_AF12_I2C          ((uint8_t)0x0C)  /*!< I2C1 Alternate Function mapping */
/**
  * @brief   AF 13 selection
  */
#define GPIO_AF13_TIM1          ((uint8_t)0x0D)  /*!< TIM1 Alternate Function mapping */
#define GPIO_AF13_TIM3          ((uint8_t)0x0D)  /*!< TIM3 Alternate Function mapping */
#define GPIO_AF13_TIM14         ((uint8_t)0x0D)  /*!< TIM14 Alternate Function mapping */
#define GPIO_AF13_TIM17         ((uint8_t)0x0D)  /*!< TIM17 Alternate Function mapping */

/**
  * @brief   AF 14 selection
  */
#define GPIO_AF14_TIM1          ((uint8_t)0x0E)  /*!< TIM1 Alternate Function mapping */
/**
  * @brief   AF 15 selection
  */
#define GPIO_AF15_RTCOUT        ((uint8_t)0x0fU)
#define GPIO_AF15_MCO           ((uint8_t)0x0FU)  /*!< MCO Alternate Function mapping */
#define GPIO_AF15_IR            ((uint8_t)0x0FU)  /*!< IR Alternate Function mapping */
#define IS_GPIO_AF(AF)         ((AF) <= (uint8_t)0x0f)

#elif defined(AIR00102APRE)
/**
  * @brief   AF 0 selection
  */

#define GPIO_AF0_SWJ           ((uint8_t)0x00)  /*!< SWJ (SWD) Alternate Function mapping */
#define GPIO_AF0_SPI1          ((uint8_t)0x00)  /*!< SPI1 Alternate Function mapping */
#define GPIO_AF0_USART1        ((uint8_t)0x00)  /*!< USART1 Alternate Function mapping */

/**

🔨串口配置

  • 🌿Air001有2个串口,
  • 🔖如果想将PA2和PA3配置为串口1:
 GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
 GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
  • 🔖如果想将PA2和PA3配置为串口2:
 GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
 GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
  • 🌿usart.h文件
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    usart.h
  * @brief   This file contains all the function prototypes for
  *          the usart.c file
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USART_H__
#define __USART_H__

#ifdef __cplusplus
extern "C" {
#endif

    /* Includes ------------------------------------------------------------------*/
#include "main.h"

#define USART1_ENABLED USART1		//使能串口1,
//#define USART2_ENABLED	USART2		//使能串口2

#define USARTx_BAUDRATE 115200
#define USARTx_RX_GPIO_PORT GPIOA
#define USARTx_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define USARTx_RX_PIN GPIO_PIN_3

#define USARTx_TX_GPIO_PORT GPIOA
#define USARTx_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define USARTx_TX_PIN GPIO_PIN_2

#ifdef USART1_ENABLED
	#define USARTx_TX_AF GPIO_AF1_USART1	//USART2:GPIO_AF4_USART2 USART1:GPIO_AF1_USART1
	#define USARTx_RX_AF GPIO_AF1_USART1	//USART2:GPIO_AF4_USART2 USART1:GPIO_AF1_USART1
	#define USARTx_IRQHandler USART2_IRQHandler
	#define USARTx_IRQ USART2_IRQn
#endif
#ifdef USART2_ENABLED
	#define USARTx_TX_AF GPIO_AF4_USART2	//USART2:GPIO_AF4_USART2 USART1:GPIO_AF1_USART1
	#define USARTx_RX_AF GPIO_AF4_USART2	//USART2:GPIO_AF4_USART2 USART1:GPIO_AF1_USART1
	#define USARTx_IRQHandler USART2_IRQHandler
	#define USARTx_IRQ USART2_IRQn
#endif


extern UART_HandleTypeDef UartHandle;

void MX_USART_UART_Init(void);


#ifdef __cplusplus
}
#endif

#endif /* __USART_H__ */


  • 🌿usart.c
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    usart.c
  * @brief   This file provides code for the configuration
  *          of the USART instances.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "usart.h"
#include "stdio.h"

UART_HandleTypeDef UartHandle;

void USART_CLK_ENABLE(void)
{

    __IO uint32_t tmpreg = 0x00U;
    SET_BIT(RCC->APBENR1, RCC_APBENR1_USART2EN);
    /* RCC外围时钟启用后的延迟 */
    tmpreg = READ_BIT(RCC->APBENR1, RCC_APBENR1_USART2EN);
    UNUSED(tmpreg);

}

void MX_USART_UART_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    USART_CLK_ENABLE();
    UartHandle.Instance = USART1;	//使能串口:USART1/USART2
    UartHandle.Init.BaudRate = USARTx_BAUDRATE;
    UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
    UartHandle.Init.StopBits = UART_STOPBITS_1;
    UartHandle.Init.Parity = UART_PARITY_NONE;
    UartHandle.Init.Mode = UART_MODE_TX_RX;
    UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
    if(HAL_UART_Init(&UartHandle) != HAL_OK)
    {
        Error_Handler();
    }
    USARTx_RX_GPIO_CLK_ENABLE();//使能串口引脚对应的端口时钟
    USARTx_TX_GPIO_CLK_ENABLE();
    /**USART GPIO Configuration
        PA2     ------> USART1/2-->TX
        PA3     ------> USART1/2-->RX
        */
    GPIO_InitStruct.Pin = USARTx_TX_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = USARTx_TX_AF;
    HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = USARTx_RX_PIN;
    GPIO_InitStruct.Alternate = USARTx_RX_AF;

    HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);

    /* ENABLE NVIC */
    HAL_NVIC_SetPriority(USARTx_IRQ, 0, 1);
    HAL_NVIC_EnableIRQ(USARTx_IRQ);
}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
//    if(uartHandle->Instance == USART1)
//    {
    /* USARTx clock enable 时钟使能 */
    __HAL_RCC_USART1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART GPIO Configuration
    PA2     ------> USART2_TX
    PA3     ------> USART2_RX
    */
    GPIO_InitStruct.Pin = USARTx_TX_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = USARTx_TX_AF;
    HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = USARTx_RX_PIN;
    GPIO_InitStruct.Alternate = USARTx_RX_AF;

    HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);

    /* ENABLE NVIC */
    HAL_NVIC_SetPriority(USARTx_IRQ, 0, 1);
    HAL_NVIC_EnableIRQ(USARTx_IRQ);
//    }
}

void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{

    if(uartHandle->Instance == USART1)
    {
        /* Peripheral clock disable */
        __HAL_RCC_USART1_CLK_DISABLE();

        /**USART GPIO Configuration
            PA2     ------> USART2_TX
            PA3     ------> USART2_RX
            */
        HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2 | GPIO_PIN_3);

    }
}



/*可调用printf*/
int fputc(int ch, FILE* f)
{
    /*&huart1指的是串口1,如果用别的串口就修改数字*/
    HAL_UART_Transmit(&UartHandle , (uint8_t*)&ch , 1 , 1000);
    return ch;
}
#if 0		//默认不启用串口接收
//重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE* f)
{
    uint8_t ch = 0;
    HAL_UART_Receive(&UartHandle, &ch, 1, 1000);
    return ch;
}
#endif
/* USER CODE END 1 */

🔨GPIO输入输出配置

  • gpio.c
/* Includes ------------------------------------------------------------------*/
#include "gpio.h"

/*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/


/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    /* GPIO Ports Clock Enable */
//    __HAL_RCC_GPIOA_CLK_ENABLE(); /* 使能GPIOA时钟 */
    __HAL_RCC_GPIOB_CLK_ENABLE(); /* 使能GPIOB时钟 */

    GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3;	/* 使能对应引脚 */
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
    GPIO_InitStruct.Pull = GPIO_PULLUP;                    /* 使能上拉 */
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;          /* GPIO速度 */
    /* GPIO初始化 */
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}
  • 🌿gpio.h
#ifndef __GPIO_H__
#define __GPIO_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "main.h"

void MX_GPIO_Init(void);

#ifdef __cplusplus
}
#endif
#endif /*__ GPIO_H__ */

📚个人配置的点灯+串口调试输出模版工程

  • 🔖说明工程中配置了ASF转BIN文件调用的指令,方便串口烧录。📍具体参考《Air001基于Keil环境开发,使用airisp串口命令行烧录》
    在这里插入图片描述
  • 🌴工程架构“
    在这里插入图片描述
链接:https://pan.baidu.com/s/1iTcc5wyVwj_4L3U7FAteqA 
提取码:9mei

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

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

相关文章

私域流量宝工具源码搭建-含详细使用说明

&#x1f44b;私域流量宝致力于为个人、团队提供基于微信私域流量的推广、引流的效率工具。可减轻人力&#xff0c;有效降低资源损失、流量流失的几率。引流宝完全开源&#xff0c;免费&#xff0c;可商用、可任意二次开发。引流宝可以辅助你更好地开展营销活动推广&#xff01…

【Docker系列】push镜像报错问题解决方案

1 问题描述 docker push 报这个错&#xff0c;unknown blob 详细报错内容&#xff1a; Use docker scan to run Snyk tests against images to find vulnerabilities and learn how to fix them The push refers to repository [192.******/*******/*************] 3b3341e9d03…

2498. 青蛙过河 II;2568. 最小无法得到的或值;1954. 收集足够苹果的最小花园周长

2498. 青蛙过河 II 核心思想&#xff1a;这题有点开脑洞&#xff0c;就是如果想让代价最小只能是隔一个石头跳&#xff0c;因为其他方法的路径都会形成比这种方法大的结果&#xff0c;然后我们只需要统计出间隔石头的最大值即可。 2568. 最小无法得到的或值 核心思想&#xf…

【第二阶段】kotlin语言的匿名函数类型推断

1.常规匿名函数写法&#xff1a; 如果使用了":",必须给定参数类型和 返回值类型如下&#xff1a; val meThod:()->Int{}2.匿名函数“”&#xff0c;返回类型推断 使用类型推断“”&#xff0c;根据返回值的类型推断 fun main() {/** 常规匿名函数写法&#xff1a…

2023年最新最全软件测试面试题大全

一、面试基础题 简述测试流程: 1、阅读相关技术文档&#xff08;如产品PRD、UI设计、产品流程图等&#xff09;。 2、参加需求评审会议。 3、根据最终确定的需求文档编写测试计划。 4、编写测试用例&#xff08;等价类划分法、边界值分析法等&#xff09;。 5、用例评审(…

哈希unordered系列介绍(上)

一.Unordered_map,Unordered_set介绍 在之前我们已经介绍过set,map,multiset等等关联式容器&#xff0c;它们的底层是红黑树进行模拟实现的&#xff0c;在查询时效率可达到 l o g 2 N log_2 N log2​N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点…

【Linux】IP协议——网络层

目录 IP协议 基本概念 IP协议格式 分片与组装 网段划分 特殊的IP地址 IP地址的数量限制 私网IP地址和公网IP地址 路由 路由表生成算法 IP协议 IP协议全称为“网际互连协议&#xff08;Internet Protocol&#xff09;”&#xff0c;IP协议是TCP/IP体系中的网络层协议…

【LangChain】Memory

概要 大多数LLM应用都有对话界面。对话的一个重要组成部分是能够引用对话中先前介绍的信息。至少&#xff0c;对话系统应该能够直接访问过去消息的某些窗口。更复杂的系统需要有一个不断更新的世界模型&#xff0c;这使得它能够执行诸如维护有关实体及其关系的信息之类的事情。…

【D3S】REST接口文档自动生成 - 集成smart-doc并同步配置到Torna

目录 一、引言二、maven插件三、smart-doc.json配置四、smart-doc-maven-plugin相关命令五、推送文档到Torna六、通过Maven Profile简化构建 一、引言 D3S&#xff08;DDD with SpringBoot&#xff09;为本作者使用DDD过程中开发的框架&#xff0c;目前已可公开查看源码&#…

Object.assign详解

一、Object.assign是什么&#xff1f; Object.assign( )方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 二、用法 Object.assign(target, ...sources) 参数&#xff1a;target ——>目标对象 source ——>源对象 返回值&#xff1a;…

使用生成式 AI 模仿人类行为

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 这项研究被 2023 年学习表征国际会议 &#xff08;ICLR&#xff09; 接受&#xff0c;该会议致力于推进通常称为深度学习的人工智能分支。 图 1&#xff1a;我们的方法概述。 扩散模型已成为一类强大的生…

【JVM】JVM垃圾收集器

文章目录 什么是JVM垃圾收集器四种垃圾收集器&#xff08;按类型分&#xff09;1.串行垃圾收集器(效率低&#xff09;2.并行垃圾收集器(JDK8默认使用此垃圾回收器&#xff09;3.CMS&#xff08;并发&#xff09;垃圾收集器(只针对老年代垃圾回收的&#xff09; 什么是JVM垃圾收…

SDR硬件方案

以射频硬件为线索&#xff0c;梳理常见SDR&#xff08;软件无线电&#xff09;方案。SDR硬件位于天线和数字信号处理之间&#xff0c;负责把无线电信号数字化&#xff0c;交由主机或者嵌入式系统&#xff08;FPGA、DSP&#xff0c;MCU&#xff09;处理。SDR硬件一般包含射频和数…

Python Opencv实践 - 图像缩放

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg_cat cv.imread("../SampleImages/cat.jpg", cv.IMREAD_COLOR) plt.imshow(img_cat[:,:,::-1])#图像绝对尺寸缩放 #cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) #指定Size大…

18.3.0:Dynamic Web TWAIN Crack Web 文档扫描 SDK

Dynamic Web TWAIN用于快速部署 Web 应用程序的文档扫描 SDK&#xff0c;文档扫描SDK&#xff0c;&#xff0c;超过 5300 家公司信任 Dynamic Web TWAIN &#xff0c;因其稳健性和安全性而受到超过 5300 家公司的信赖&#xff0c;Dynamic Web TWAIN 是一款基于浏览器的文档扫描…

微信开发之一键获取标签好友的技术实现

简要描述&#xff1a; 获取标签列表 请求URL&#xff1a; http://域名地址/getContactLabelList 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选…

qtrvsim 使用

qtrvsim 使用 介绍 Qtrvsim 是一个基于 WebAssembly&#xff08;基于非 js 语言并使得其可以在浏览器中运行&#xff09;的图形化 RISC-V 微处理器模拟器&#xff0c;给初学者提供了一个实现 RISC-V 架构的渠道。 Developed by the Computer Architectures Education project…

5.2 互联网通信安全

数据参考&#xff1a;CISP官方 目录 一、什么是互联网通信安全二、为什么要关注互联网通信安全三、电子邮件应用安全四、即时通讯应用安全 一、什么是互联网通信安全 1、互联网通信应用的概念 通信的进化史 互联网通信技术&#xff08;OSI七层模型&#xff09; 互联网应…

【第二阶段】kotlin的lambda学习

匿名函数lambdm表达式 1.两数相加 fun main() {//匿名函数lambda表达式//两数相加 等价&#xff1a;val addResult:(Int,Int)->String{a,b->"两数相加结果&#xff1a;${ab}"}val addResult{a:Int,b:Int->"两数相加结果${ab}"}println(addResul…

解码Transformer:自注意力机制与编解码器机制详述与代码实现

目录 一、 Transformer的出现背景1.1 技术挑战与先前解决方案的局限性RNN和LSTM卷积神经网络&#xff08;CNN&#xff09;在序列处理中的尝试 1.2 自注意力机制的兴起1.3 Transformer的革命性影响 二、自注意力机制2.1 概念和工作原理元素的权重计算加权求和自注意力与传统注意…