STM32CUBEMX_配置stm32f103c8t6的bootloader_USB升级

news2024/11/18 1:23:49

STM32CUBEMX_配置stm32f103c8t6的bootloader_USB升级

1、使用stm32cubemx配置好工程(版本6.3.0),生成keil工程
2、移植必须要的一些函数
3、使用dfusedemo工具软件测试

①配时钟外设
在这里插入图片描述
②配ST-Link调试接口(防止无法二次烧录程序)
在这里插入图片描述

③配置USB外设
在这里插入图片描述
在这里插入图片描述

④配置USB设备

特别说明:
1、USBD_DFU_APP_DEFAULT_ADD (Base Address 0x)
说明:这个参数需要填入跳转APP程序时的那个地址
2、USBD_DFU_MEDIA Interface
说明:这个参数是DfuSeDemo这个软件需要识别的参数(DfuSeDemo是DFU升级的软件),那stm32f103c8t6这个芯片说明,bootloader程序在16k以内,剩下的48K都给APP程序使用,那就应该配置为下图这样的。

在这里插入图片描述
⑤时钟树配置
在这里插入图片描述
⑥工程配置
在这里插入图片描述
⑦修改KEIL工程文件(修改usbd_dfu_if.c文件)
在这里插入图片描述
在这里插入图片描述

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : usbd_dfu_if.c
  * @brief          : Usb device for Download Firmware Update.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2022 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under Ultimate Liberty license
  * SLA0044, the "License"; You may not use this file except in compliance with
  * the License. You may obtain a copy of the License at:
  *                             www.st.com/SLA0044
  *
  ******************************************************************************
  */
/* USER CODE END Header */

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

/* USER CODE BEGIN INCLUDE */

/* USER CODE END INCLUDE */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
  * @brief Usb device.
  * @{
  */

/** @defgroup USBD_DFU
  * @brief Usb DFU device module.
  * @{
  */

/** @defgroup USBD_DFU_Private_TypesDefinitions
  * @brief Private types.
  * @{
  */

/* USER CODE BEGIN PRIVATE_TYPES */

/* USER CODE END PRIVATE_TYPES */

/**
  * @}
  */

/** @defgroup USBD_DFU_Private_Defines
  * @brief Private defines.
  * @{
  */

#define FLASH_DESC_STR      "@Internal Flash   /0x08000000/16*001Ka,48*001Kg"

/* USER CODE BEGIN PRIVATE_DEFINES */
#define FLASH_ERASE_TIME    (uint16_t)50
#define FLASH_PROGRAM_TIME  (uint16_t)50
/* USER CODE END PRIVATE_DEFINES */

/**
  * @}
  */

/** @defgroup USBD_DFU_Private_Macros
  * @brief Private macros.
  * @{
  */

/* USER CODE BEGIN PRIVATE_MACRO */

/* USER CODE END PRIVATE_MACRO */

/**
  * @}
  */

/** @defgroup USBD_DFU_Private_Variables
  * @brief Private variables.
  * @{
  */

/* USER CODE BEGIN PRIVATE_VARIABLES */

/* USER CODE END PRIVATE_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_DFU_Exported_Variables
  * @brief Public variables.
  * @{
  */

extern USBD_HandleTypeDef hUsbDeviceFS;

/* USER CODE BEGIN EXPORTED_VARIABLES */

/* USER CODE END EXPORTED_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_DFU_Private_FunctionPrototypes
  * @brief Private functions declaration.
  * @{
  */

static uint16_t MEM_If_Init_FS(void);
static uint16_t MEM_If_Erase_FS(uint32_t Add);
static uint16_t MEM_If_Write_FS(uint8_t *src, uint8_t *dest, uint32_t Len);
static uint8_t *MEM_If_Read_FS(uint8_t *src, uint8_t *dest, uint32_t Len);
static uint16_t MEM_If_DeInit_FS(void);
static uint16_t MEM_If_GetStatus_FS(uint32_t Add, uint8_t Cmd, uint8_t *buffer);

/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */

/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

/**
  * @}
  */

#if defined ( __ICCARM__ ) /* IAR Compiler */
  #pragma data_alignment=4
#endif
__ALIGN_BEGIN USBD_DFU_MediaTypeDef USBD_DFU_fops_FS __ALIGN_END =
{
   (uint8_t*)FLASH_DESC_STR,
    MEM_If_Init_FS,
    MEM_If_DeInit_FS,
    MEM_If_Erase_FS,
    MEM_If_Write_FS,
    MEM_If_Read_FS,
    MEM_If_GetStatus_FS
};

/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Memory initialization routine.
  * @retval USBD_OK if operation is successful, MAL_FAIL else.
  */
uint16_t MEM_If_Init_FS(void)
{
  /* USER CODE BEGIN 0 */
	HAL_FLASH_Unlock();
  return (USBD_OK);
  /* USER CODE END 0 */
}

/**
  * @brief  De-Initializes Memory
  * @retval USBD_OK if operation is successful, MAL_FAIL else
  */
uint16_t MEM_If_DeInit_FS(void)
{
  /* USER CODE BEGIN 1 */
	HAL_FLASH_Lock();
  return (USBD_OK);
  /* USER CODE END 1 */
}

/**
  * @brief  Erase sector.
  * @param  Add: Address of sector to be erased.
  * @retval 0 if operation is successful, MAL_FAIL else.
  */
uint16_t MEM_If_Erase_FS(uint32_t Add)
{
  /* USER CODE BEGIN 2 */
	uint32_t PageError;
	/* Variable contains Flash operation status */
	HAL_StatusTypeDef status;
	FLASH_EraseInitTypeDef eraseinitstruct;

	eraseinitstruct.TypeErase = FLASH_TYPEERASE_PAGES;
	eraseinitstruct.PageAddress = Add;
	eraseinitstruct.NbPages = 1U;
	status = HAL_FLASHEx_Erase(&eraseinitstruct, &PageError);

	if (status != HAL_OK)
	{
		return (USBD_FAIL);
	}
	return (USBD_OK);
  /* USER CODE END 2 */
}

/**
  * @brief  Memory write routine.
  * @param  src: Pointer to the source buffer. Address to be written to.
  * @param  dest: Pointer to the destination buffer.
  * @param  Len: Number of data to be written (in bytes).
  * @retval USBD_OK if operation is successful, MAL_FAIL else.
  */
uint16_t MEM_If_Write_FS(uint8_t *src, uint8_t *dest, uint32_t Len)
{
  /* USER CODE BEGIN 3 */
  uint32_t i = 0;

	for (i = 0; i < Len; i += 4)
	{
			/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
			* be done by byte */
			if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t) (dest + i),
							*(uint32_t *) (src + i)) == HAL_OK)
			{
					/* Check the written value */
					if (*(uint32_t *) (src + i) != *(uint32_t *) (dest + i))
					{
							/* Flash content doesn't match SRAM content */
							return (USBD_FAIL);
					}
			}
			else
			{
					/* Error occurred while writing data in Flash memory */
					return (USBD_FAIL);
			}
	}
	return (USBD_OK);
  /* USER CODE END 3 */
}

/**
  * @brief  Memory read routine.
  * @param  src: Pointer to the source buffer. Address to be written to.
  * @param  dest: Pointer to the destination buffer.
  * @param  Len: Number of data to be read (in bytes).
  * @retval Pointer to the physical address where data should be read.
  */
uint8_t *MEM_If_Read_FS(uint8_t *src, uint8_t *dest, uint32_t Len)
{
  /* Return a valid address to avoid HardFault */
  /* USER CODE BEGIN 4 */
  uint32_t i = 0;
	uint8_t *psrc = src;

	for (i = 0; i < Len; i++)
	{
			dest[i] = *psrc++;
	}
	/* Return a valid address to avoid HardFault */
	return (uint8_t *) (dest);
  /* USER CODE END 4 */
}

/**
  * @brief  Get status routine
  * @param  Add: Address to be read from
  * @param  Cmd: Number of data to be read (in bytes)
  * @param  buffer: used for returning the time necessary for a program or an erase operation
  * @retval USBD_OK if operation is successful
  */
uint16_t MEM_If_GetStatus_FS(uint32_t Add, uint8_t Cmd, uint8_t *buffer)
{
  /* USER CODE BEGIN 5 */
  switch (Cmd)
    {
    case DFU_MEDIA_PROGRAM:
        buffer[1] = (uint8_t) FLASH_PROGRAM_TIME;
        buffer[2] = (uint8_t) (FLASH_PROGRAM_TIME << 8);
        buffer[3] = 0;
        break;
    case DFU_MEDIA_ERASE:
    default:
        buffer[1] = (uint8_t) FLASH_ERASE_TIME;
        buffer[2] = (uint8_t) (FLASH_ERASE_TIME << 8);
        buffer[3] = 0;
        break;
    }
    return (USBD_OK);
  /* USER CODE END 5 */
}

/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */

/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

⑧修改KEIL工程(修改main.c)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2022 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under Ultimate Liberty license
  * SLA0044, the "License"; You may not use this file except in compliance with
  * the License. You may obtain a copy of the License at:
  *                             www.st.com/SLA0044
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usb_device.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
typedef  void (*pFunction)(void);
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
	pFunction JumpToApplication;
	uint32_t JumpAddress;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
	if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
	{
		/* Test if user code is programmed starting from address 0x08007000 */
		if (((*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD) & 0x2FFFB000) == 0x20000000)
		{
			/* Jump to user application */
			JumpAddress = *(__IO uint32_t *) (USBD_DFU_APP_DEFAULT_ADD + 4);
			JumpToApplication = (pFunction) JumpAddress;

			/* Initialize user application's Stack Pointer */
			__set_MSP(*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD);
			JumpToApplication();
		}
	}
  MX_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;
  PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

⑨移植完成,可以使用DfuSeDemo软件愉快的升级APP程序了
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

理解Python的协程(Coroutine)

生成器(Generator) yield表达式的使用生产者和消费者模型yield from表达式协程(Coroutine) asyncio.coroutineasync/await总结参考链接 由于GIL的存在&#xff0c;导致Python多线程性能甚至比单线程更糟。 GIL: 全局解释器锁&#xff08;英语&#xff1a;Global Interpreter Lo…

InvocationException: GraphViz‘s executables not found【BUG已解决】

项目场景&#xff1a; 在机器学习框架中遇到了一个bug&#xff1a;安装了GraphViz模块后&#xff0c;在对着sklearn的决策树文档操作输出决策树模型结果时&#xff0c;还是爆出了如下的错误&#xff1a; 报错位置为&#xff1a; display(Image(graph.create_png())) graph.wr…

艾美捷低内毒素CpG ODN寡聚脱氧核苷酸全家族系列

免疫佐剂&#xff0c;是一类可以增强抗原免疫原性的免疫调节分子、化合物或大分子复合物。大多数佐剂可以通过启动先天免疫系统来辅助抗原应答。先天免疫系统通过模式识别受体&#xff08;pattern recognition receptor&#xff0c;PRR&#xff09;来感知各种微生物表达的病原体…

SQL通用语法及分类

目录 MySQL的启动和连接&数据模型 SQL通用语法及分类 Data Definition Language DDL - 数据库操作 DDL - 表操作 表操作 - 创建&&查询 表操作 - 数据类型 表操作-修改&&删除 DDL总结 Data Manipulation Language DML - 插入数据insert DML - 更…

高佣金流量卡上线

01 流量卡业务 常规的运营商套餐相对都比较贵&#xff0c;少则六七十一个月&#xff0c;多则几百块一个月&#xff0c;这样的套餐让运营商赚盆满钵满。 随着5G需求越来越多&#xff0c;其他第三方运营商也开始市场化营销&#xff0c;流量卡的CPA基本在60-200之间一张卡&…

汽车喷漆车间风淋室八大参数TENAISU

汽车喷漆车间风淋室风淋室配置八大参数 汽车喷漆车间风淋室及汽车涂装车间风淋室配置八大参数,光电感应自动功能系统、自动身份识别功能系统、自动臭氧杀菌功能系统、自动紫外线杀菌功能系统、自动除静电离子发生功能系统、可调延时开门功能系统、过滤器失效预警功能系统、自动…

焦脱镁叶绿酸-a修饰无机纳米材料/活性基团/上转换纳米发光颗粒/点击化学/抗体的应用

小编今天分享的科研知识是焦脱镁叶绿酸-a修饰无机纳米材料/活性基团/上转换纳米发光颗粒/点击化学/抗体的应用&#xff0c;一起来看&#xff01; 焦脱镁叶绿酸-a衍生物的应用&#xff1a; 叶绿素降解产物是合成光动力治疗药物的理想合成前体.为了获得新型叶绿素类光敏剂,以焦脱…

Vscode踩坑日记--行尾序列LF和CRLF

Vscode踩坑日记–行尾序列LF和CRLF 今天一上午什么也没干&#xff0c;一直配置Vscode&#xff0c;之前因为代码提交问题&#xff0c;需要解决配置一下eslint&#xff0c;问题就来了。 插件&#xff0c;配置信息什么都写好了还是一堆错误&#xff1f;&#xff1f;让我很懵逼 …

基于Java Springboot-MySQL实现学生信息成绩管理系统

学生成绩管理系统 项目设计的意义。 该系统的具体任务就是设计一个学生成绩的数据库管理系统&#xff0c;由计算机代替人工执行一系列诸如增加新学生成绩信息、删除学生成绩信息、学生资料、查询、修改等的处理操作&#xff0c;以方便管理人员的管理信息工作。本设计以学生成绩…

32种EMC标准电路 (共用)

01 AC24V接口EMC设计标准电路 02 AC110V-220VEMC设计标准电路 03 AC380V接口EMC设计标准电路 04 AV接口EMC设计标准电路 05 CAN接口EMC设计标准电路 06 DC12V接口EMC设计标准电路 07 DC24V接口EMC设计标准电路 08 DC48接口EMC设计标准电路 09 DC110V接口…

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

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

vivado tcl开发流程

本文以简单的led灯为例&#xff0c;阐述基于tcl的Vivado开发流程。 文件内容编写如下&#xff1a; led.v timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2022/12/12 14:57:22 // Design Name: // Module Name: alu // Project Name: // Target De…

这10种神级性能优化手段,你用过几个?

引言&#xff1a;取与舍 软件设计开发某种意义上是“取”与“舍”的艺术。 关于性能方面&#xff0c;就像建筑设计成抗震9度需要额外的成本一样&#xff0c;高性能软件系统也意味着更高的实现成本&#xff0c;有时候与其他质量属性甚至会冲突&#xff0c;比如安全性、可扩展性…

React源码分析8-状态更新的优先级机制

这是我的剖析 React 源码的第二篇文章&#xff0c;如果你没有阅读过之前的文章&#xff0c;请务必先阅读一下 第一篇文章 中提到的一些注意事项&#xff0c;能帮助你更好地阅读源码。 文章相关资料 React 16.8.6 源码中文注释&#xff0c;这个链接是文章的核心&#xff0c;文…

Maven打包同时引入本地jar包

Maven打包同时引入本地jar包 若依分离版作为案例 &#xff0c;实际测试 方法一(pom文件指定jar包目录进行引入) 1.将需要手动引入的jar包放入ruoyi-admin的resources下&#xff0c;例如&#xff1a; 2.手动jar依赖则在ruoyi-common模块下的pom.xml中引入 <dependency>…

Sqlite数据库操作(一)—— 命令行操作

目录 1、sqlite 数据库安装 2、数据库常用命令 (1) 创建数据库 (2) 系统命令 (3) sql语句 1、sqlite 数据库安装 在终端输入 sudo apt-get install sqlite3 安装sqlite3&#xff0c;安装完毕以后&#xff0c;在终端输入 sqlite3 &#xff0c;若出现以下内容&#xff0c;…

MySQL数据库学习(5)

一、概念 视图是数据库中常用对象之一&#xff0c;它的内容是数据库部分数据或以聚合等方式重构的数据。 只存放视图的定义&#xff0c;不存放数据。不存储数据&#xff0c;所以视图是一个虚表。 因为数据存在基本表中&#xff0c;基本表的数据发生变化&#xff0c;视图查询的结…

MySQL集群解决方案(1):MySQL数据库的集群方案

1、系统架构存在的问题 在我们的系统架构中&#xff0c;DBserver方面我们只是使用了单节点服务&#xff0c;如果面对大并发&#xff0c;海量数据的存储&#xff0c;显然单节点的系统架构将存在很严重的问题&#xff0c;所以接下来&#xff0c;我们将实现MySQL的集群&#xff0c…

双12有哪些宝藏数码好物值得入手、这份超值数码清单收藏好

作为一年一度的电商大促狂欢日&#xff0c;不知道各位小伙伴儿有没有入手哪些心仪的数码产品呢&#xff1f;如果确实不知道要入啥好&#xff0c;不妨一起来看看我为各位精心准备的这份最值得入手的数码产品清单吧&#xff0c;这份清单的产品最主要突出的是颜值、产品实力还有性…

anaconda使用arcpy库

anaconda使用Arcpy环境1. 查看Arcgis版本2. 创建虚拟环境3. 将anaconda环境放入jupyter中1. 查看Arcgis版本 找到Arcgis安装python路径【电脑需要下载Arcgis】点击python.exe&#xff0c;查看python版本 2. 创建虚拟环境 管理员身份打开Anaconda PowerShell Prompt 查看ana…