【GD32 MCU 移植教程】从 STM32F10x 移植到 GD32E103的移植说明

news2024/11/15 4:29:16

1. 前言

对于使用微控制器进行产品开发的设计人员来说,因产品及功能升级,往往需要将一种微控制器替
换成另一种微控制器,在保留既有功能的情况下增加新功能。为了更快地推出新产品,设计人员经
常要将应用程序移植到新的微控制器。
本应用笔记旨在帮助您快速将应用程序从 STM32F10x 系列微控制器移植到 GD32E103 系列微控
制器 ( 基于 STM32F10x 标准库 V3.5.0)
GD32E103 STM32F10x 系列相比,考虑软硬件兼容性,从 Flash SRAM 容量,包括外设
模块的增强性能上来看, GD32E103 最接近 STM32F10x 互联性。
开始前您需要安装 GD32E103 关于 KEIL IAR 的插件,在工程选项的器件条目中选 GD32E103
对应型号,添加 GD32E103 Flash 下载算法。
GD32E103 STM32F10x 具有以下优点:
1、更高的主频(120MHz VS 72MHz)
2、更高版本的内核(Cortex M4 VS M3)
3、更低的功耗(Run Mode 28.6mA@120MHz VS 50mA@72MHz ; Sleep Mode: 20.8mA@120MHz VS 30mA@72MHz )
但需要注意的是, GD32E103 STM32F10x 少了 SDIO 功能,如果用户使用到 SDIO 功能,从
STM32F10x GD32E103 的移植,显然是不合适的。

2. 引脚兼容性

STM32F10x GD32E103 在相同封装下是 Pin To Pin 兼容的。但由于外设功能上的细微差别,两 者引脚定义有少许不同,如表 1 所示。 注意: STM32F10x 外设编号从 1 开始, GD32E103 外设编 号从 0 开始 ,且命名有差异。
1 STM32F10x 系列和 GD32E103 系列引脚区别

3. 内部资源兼容性

下表给出了 STM32F10x GD32E103 的资源对比总览 ( STM32F103V8 STM32F105V8
GD32E103V8 对比为例 )
2 STM32F105 系列和 GD32E103 系列内部资源对比总览

4. 程序移植

4.1 时钟移植

GD32E103 时钟设置与 STM32F10x 互联系列兼容,如从 STM32F103 移植到 GD32E103 IDE 需 要做相关调整,具体过程如下:
(1) 使用 MDK 环境时:
在工程选项 C/C++ 选项卡中 Preprocessor Symbol Define 中加入 GD32F10X_CL 的宏定义;
在工程选项 Device 中选择原 MCU 对应的互联性型号,或对应的 GD32E103 型号。
(2) 使用 IAR 环境时:
在 工 程 选 项 C/C++ Compiler 项 中 Preprocessor 选项卡下 Define Symbol 中加入 GD32F10X_CL 的宏定义。
在工程选项 Device 中选择原 MCU 对应的互联性型号,或对应的 GD32E103 型号。

4.2 Flash 操作相关软件移植

4.2.1 FLash 编程操作
STM32F10x 系列 MCU 仅支持 16 位半字编程,而 GD32E103 仅支持 32 位字和 64 位双字编程,
所以需要对 Flash 编程相关库函数进行更改。
(1) FLASH_ProgramWord 函数
说明:由原来的两次半字编程改为一次字编程。
(2) FLASH_EnableWriteProtection 函数
(3) FLASH_ProgramOptionByteData 函数
说明:由原来的半字编程改为字编程,用户需注意,选项字节需至少一次写一个字,且目标地址必须是 4 的整数倍。
(4) FLASH_EraseOptionBytes 函数

 (5) FLASH_ReadOutProtection 函数

 (6) FLASH_UserOptionByteConfig 函数

注:以上代码中的 CR_OPTWRE_Set 的定义是 STM32 固件库中没有的,需要用户自行定义为:
#define CR_OPTWRE_Set
((uint32_t)0x00000200)
4.2.2 注意事项
STM32F10x 的互联型和大容量型 ( 因为 GD32E103 没有大容量型,所以可不考虑 ) Flash 闪存页
大小为 2K ,而 GD32E103 1K ,所以用户在调用页擦除时要注意页地址范围。

5. 外设差异性

STM32F10x GD32E103 在外设上基本是兼容的,但 GD32E103 STM32F10x 在很多外设上
增加了部分功能,用户可根据以下罗列出的外设差异性选择是否使用这些功能。

5.1 模数转换器 ADC

为减轻 CPU 的负担, GD32E103 STM32F10x 增加了片上硬件过采样单元。它能够处理多个转
换,并将多个转换的结果取平均,得出一个 16 位宽的数据。 片上硬件过采样单元是以降低数据
输出率为代价,换取较高的数据分辨率。 具体功能以及寄存器设置,请用户参考 GD32E10x 用户
手册。
另外,由于两款芯片的在 ADC 设计上的差异性,在移植到 GD32E103 时, ADC 使能之后,校准
之前,需加入 1ms 的延时,以便 ADC 稳定后再进行校准。

5.2 通用同步异步收发器 USART

GD32E103 STM32F10x USART 上增加了块模式 (STM32F10x 只支持字节模式 ) 、数据极性
设置、数据位反转以及 TX RX 引脚电平反转等功能,因此, GD32E103 多了四个寄存器,分别
为: USART_CTL3 USART_RT USART_STAT1 USART_CHC 。具体功能以及寄存器设置,
请用户参考 GD32E10x 用户手册。

5.3 内部集成电路总线接口 I²C

GD32E103 STM32F10x I ² C 都支持标速 ( 最高 100KHz) 和快速 ( 最高 400KHz) ,同时 GD32E103
可支持高速模式 ( 最高 1MHz) ,要使能高速模式,需将 I2C_FMPCFG 寄存器的 FMPEN 1 。具
体功能以及寄存器设置,请用户参考 GD32E10x 用户手册。

5.4 串行外设接口/片上音频接口 SPI/I²S

GD32E103 STM32F10x SPI/I ² S 模块差异性主要表现在 GD32E103 支持 SPI TI 模式、 SPI
NSS 脉冲模式和 SPI 四线功能 ( 只有 SPI1) ,其中 SPI 的四线模式是用于控制四线 SPI Flash 外设,此模式下,数据传输速率是普通模式下的 4 倍。具体功能以及寄存器设置,请用户参考 GD32E10x用户手册。

5.5 通用串行总线全速设备接口 USBFS

GD32E103 STM32F105/107 USBFS 一致,同时 GD32E103 STM32F105/107 相比多了
IRC48M 的时钟源可选择。具体功能以及寄存器设置,请用户参考 GD32E103 用户手册。
GD32E103 STM32F103 USB 模块是不兼容的,如果用户是从 STM32F103 移植而来,需要
进行代码移植,具体请参考 STM32F103 STM32F105/107 USB 差异性。

6. 附录:

(Flash 更改后的程序,用户可直接复制替换原库函数 )
---------------------------------------------------------------------------------------------------------------------------------
0 、在 stm32f10x_flash.c 中添加
#define CR_OPTWRE_Set ((uint32_t)0x00000200)
---------------------------------------------------------------------------------------------------------------------------------
1
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
{
 FLASH_Status status = FLASH_COMPLETE;
 __IO uint32_t tmp = 0;
 /* Check the parameters */
 assert_param(IS_FLASH_ADDRESS(Address));
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(ProgramTimeout);
 if(status == FLASH_COMPLETE)
 {
 FLASH->CR |= CR_PG_Set;
 *(__IO uint32_t*)Address = (uint32_t)Data;
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(ProgramTimeout);
 /* Disable the PG Bit */
 FLASH->CR &= CR_PG_Reset;
 } 
 /* Return the Program Status */
 return status;
}

2、

FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages)
{
 uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF;
 uint32_t temp1,temp2;
 FLASH_Status status = FLASH_COMPLETE; 
 /* Check the parameters */
 assert_param(IS_FLASH_WRPROT_PAGE(FLASH_Pages));
 FLASH_Pages = (uint32_t)(~FLASH_Pages);
WRP0_Data = (uint16_t)(FLASH_Pages & WRP0_Mask);
 WRP1_Data = (uint16_t)((FLASH_Pages & WRP1_Mask) >> 8);
 WRP2_Data = (uint16_t)((FLASH_Pages & WRP2_Mask) >> 16);
 WRP3_Data = (uint16_t)((FLASH_Pages & WRP3_Mask) >> 24); 
 temp1 = (((uint32_t)WRP1_Data)<<16) | ((uint32_t)WRP0_Data);
 temp2 = (((uint32_t)WRP3_Data)<<16) | ((uint32_t)WRP2_Data);
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(ProgramTimeout); 
 if(status == FLASH_COMPLETE)
 {
 /* Authorizes the small information block programming */
 FLASH->OPTKEYR = FLASH_KEY1;
 FLASH->OPTKEYR = FLASH_KEY2;
 while((FLASH->CR&CR_OPTWRE_Set)!=CR_OPTWRE_Set )
 {}
 FLASH->CR |= CR_OPTPG_Set;
 if(temp1 != 0xFFFF)
 {
 //OB->WRP0 = temp1;
 *(__IO uint32_t*)0X1ffff808=temp1;
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(ProgramTimeout);
 }
 if((status == FLASH_COMPLETE) && (temp2 != 0xFFFF))
 {
 //OB->WRP1 = temp2;
 *(__IO uint32_t*)0X1ffff80c=temp2;
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(ProgramTimeout);
 }
 if(status != FLASH_TIMEOUT)
 {
 /* if the program operation is completed, disable the OPTPG Bit */
 FLASH->CR &= CR_OPTPG_Reset;
 }
 } 
 /* Return the write protection operation Status */
 return status; 
}
---------------------------------------------------------------------------------------------------------------------------------
3、
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint32_t Data)
{
 FLASH_Status status = FLASH_COMPLETE;
 /* Check the parameters */
 assert_param(IS_OB_DATA_ADDRESS(Address));
 status = FLASH_WaitForLastOperation(ProgramTimeout);
 if(status == FLASH_COMPLETE)
 {
 /* Authorize the small information block programming */
 FLASH->OPTKEYR = FLASH_KEY1;
 FLASH->OPTKEYR = FLASH_KEY2;
 while((FLASH->CR&CR_OPTWRE_Set)!=CR_OPTWRE_Set )
 {}
 /* Enables the Option Bytes Programming operation */
 FLASH->CR |= CR_OPTPG_Set; 
 *(__IO uint32_t*)Address = Data;
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(ProgramTimeout);
 if(status != FLASH_TIMEOUT)
 {
 /* if the program operation is completed, disable the OPTPG Bit */
 FLASH->CR &= CR_OPTPG_Reset;
 }
 }
 /* Return the Option Byte Data Program Status */
 return status;
}
---------------------------------------------------------------------------------------------------------------------------------
4、
FLASH_Status FLASH_EraseOptionBytes(void)
{
 uint16_t temp_spc = RDP_Key;
 uint32_t temp;
 FLASH_Status status = FLASH_COMPLETE;
 /* Get the actual read protection Option Byte value */ 
 if(FLASH_GetReadOutProtectionStatus() != RESET){
 temp_spc = 0xbb; 
 }
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(EraseTimeout);
 if(status == FLASH_COMPLETE){
 /* Authorize the small information block programming */
 FLASH->OPTKEYR = FLASH_KEY1;
 FLASH->OPTKEYR = FLASH_KEY2; 
 while((FLASH->CR&CR_OPTWRE_Set)!=CR_OPTWRE_Set ) {}
/* if the previous operation is completed, proceed to erase the option bytes */
 FLASH->CR |= CR_OPTER_Set;
 FLASH->CR |= CR_STRT_Set;
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(EraseTimeout); 
 if(status == FLASH_COMPLETE)
 {
 /* if the erase operation is completed, disable the OPTER Bit */
 FLASH->CR &= CR_OPTER_Reset; 
 /* Enable the Option Bytes Programming operation */
 FLASH->CR |= CR_OPTPG_Set;
 /* Restore the last read protection Option Byte value */
 // OB->RDP = (uint16_t)rdptmp; 
 temp = ((uint32_t)temp_spc)|0xffff0000;
 *(__IO uint32_t*)0X1ffff800=temp;
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(ProgramTimeout); 
 if(status != FLASH_TIMEOUT)
 {
 /* if the program operation is completed, disable the OPTPG Bit */
 FLASH->CR &= CR_OPTPG_Reset;
 }
 }
 else{
 if (status != FLASH_TIMEOUT){
 /* Disable the OPTPG Bit */
 FLASH->CR &= CR_OPTPG_Reset;
 }
 } 
 }
 /* Return the erase status */
 return status;
}
---------------------------------------------------------------------------------------------------------------------------------
5、
FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState)
{
uint16_t temp_spc; uint32_t temp;
 FLASH_Status status = FLASH_COMPLETE;
 /* Check the parameters */
 assert_param(IS_FUNCTIONAL_STATE(NewState));
 status = FLASH_WaitForLastOperation(EraseTimeout);
 if(status == FLASH_COMPLETE)
 {
 /* Authorizes the small information block programming */
 FLASH->OPTKEYR = FLASH_KEY1;
 FLASH->OPTKEYR = FLASH_KEY2;
 while((FLASH->CR&CR_OPTWRE_Set)!=CR_OPTWRE_Set )
 {}
 FLASH->CR |= CR_OPTER_Set;
 FLASH->CR |= CR_STRT_Set;
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(EraseTimeout);
 if(status == FLASH_COMPLETE)
 {
 /* if the erase operation is completed, disable the OPTER Bit */
 FLASH->CR &= CR_OPTER_Reset;
 /* Enable the Option Bytes Programming operation */
 FLASH->CR |= CR_OPTPG_Set; 
 if(NewState != DISABLE){
temp_spc = 0xBB;
 temp = ((uint32_t)temp_spc)|0xffff0000;
 }
 else{
temp_spc = (uint16_t)RDP_Key;
 temp = ((uint32_t)temp_spc)|0xffff0000; 
 }
*(__IO uint32_t*)0x1ffff800=temp;
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(EraseTimeout); 
 if(status != FLASH_TIMEOUT){
 FLASH->CR &= CR_OPTPG_Reset;
 }
 }
 else {
 if(status != FLASH_TIMEOUT){
 /* Disable the OPTER Bit */
 FLASH->CR &= CR_OPTER_Reset;
 }
 }
 }
 /* Return the protection operation Status */
 return status; 
}
-----------------------------------------------------------------------------------------------------------------------------
6、
FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG,uint16_t OB_STOP, uint16_t OB_STDBY)
{
 FLASH_Status status = FLASH_COMPLETE; 
 uint16_t temp_spc = RDP_Key;
 uint32_t temp; 
/* Get the actual read protection Option Byte value */ 
 if(FLASH_GetReadOutProtectionStatus() != RESET)
 {
 temp_spc = 0xbb; 
 }
 /* Check the parameters */
 assert_param(IS_OB_IWDG_SOURCE(OB_IWDG));
 assert_param(IS_OB_STOP_SOURCE(OB_STOP));
 assert_param(IS_OB_STDBY_SOURCE(OB_STDBY));
 /* Authorize the small information block programming */
 FLASH->OPTKEYR = FLASH_KEY1;
 FLASH->OPTKEYR = FLASH_KEY2;
 while((FLASH->CR&CR_OPTWRE_Set)!=CR_OPTWRE_Set )
 {}
 /* if the previous operation is completed, proceed to erase the option bytes */
 FLASH->CR |= CR_OPTER_Set;
 FLASH->CR |= CR_STRT_Set;
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(ProgramTimeout);
 if(status == FLASH_COMPLETE)
 { 
/* if the erase operation is completed, disable the OPTER Bit */
 FLASH->CR &= CR_OPTER_Reset; 
 /* Enable the Option Bytes Programming operation */
 FLASH->CR |= CR_OPTPG_Set; 
 temp =OB_IWDG | (uint16_t)(OB_STOP | (uint16_t)(OB_STDBY | ((uint16_t)0xF8)));
temp=temp<<16;
 temp = ((uint32_t)temp|temp_spc); 
*(__IO uint32_t*)0x1ffff800=temp;
 /* Wait for last operation to be completed */
 status = FLASH_WaitForLastOperation(ProgramTimeout);
 if(status != FLASH_TIMEOUT)
 {
 /* if the program operation is completed, disable the OPTPG Bit */
 FLASH->CR &= CR_OPTPG_Reset;
 }
 } 
 /* Return the Option Byte program Status */
 return status;
}

更多  GD32   MCU相关咨询:  https://www.gd32bbs.com/

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

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

相关文章

苹果手机数据恢复方法有哪些?推荐3个快速恢复的方法

你是否遇到过这样的情况呢&#xff1a;苹果手机进水后&#xff0c;无法打开手机&#xff0c;导致手机里的数据不见了&#xff1b;苹果手机不见了&#xff0c;买新手机却没有以前的手机数据……面对这样的情况&#xff0c;如何恢复苹果手机的数据呢&#xff1f;别急&#xff0c;…

Java基础——自学习使用(抽象类)

一、抽象类的定义 在Java中&#xff0c;抽象类是一种不能被实例化的类&#xff0c;它主要用于被其他类继承。抽象类可以包含抽象方法&#xff08;没有方法体的方法&#xff0c;仅有一个方法签名&#xff0c;以abstract关键字声明&#xff09;和非抽象方法&#xff08;即具有实现…

【前沿技术】扩散模型Stable Diffusion原理与应用

Stable Diffusion是一种基于扩散模型&#xff08;Diffusion Models&#xff09;的生成技术&#xff0c;近年来在图像生成和其他生成任务中取得了显著的进展。该技术以其高质量的生成效果、稳定的训练过程和广泛的应用前景&#xff0c;迅速在学术界和工业界引起了广泛关注。 以…

C++入门基础知识38——【关于C++ 运算符——逻辑运算符】

成长路上不孤单&#x1f60a;【14后&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

【PWN · 栈迁移 | one-read】[羊城杯 2024]pstack

从前的栈迁移&#xff0c;怎么也得泄露一个栈指针&#xff0c;或者对bss有两次及以上写的能力&#xff0c;这题过分精简&#xff0c;一时间失了分寸。。。好在信息检索到了解法&#xff0c;并动态调试了解了过程 前言 栈溢出长度不够如何利用——可以考虑栈迁移 如果从交互来…

想入门AI产品经理,你一定要明白这些!

前言 对于想要进入AI领域&#xff0c;特别是成为AI产品经理的朋友们来说&#xff0c;了解并掌握一些AI大模型的基础知识是非常重要的。接下来&#xff0c;我就用更通俗的方式&#xff0c;给大家介绍一下入行AI大模型所必备的几点知识。 一、AI大模型是啥&#xff1f; 简单来…

中秋佳节好物推荐:五款数码产品让你的节日更加精彩

中秋节是中华文化中最为重要的传统节日之一&#xff0c;它象征着团圆和丰收&#xff0c;也是我们与家人朋友欢聚一堂&#xff0c;共享美好时光的日子。除了团圆饭桌上的月饼和水果&#xff0c;我们还可以通过一些现代数码产品来为这个节日增添科技感和便利性。无论是提升个人生…

【机器学习】非线性降维、流形学习的基本概念、如何选择合适的非线性降维方法以及非线性降维的流形学习实例(含python代码)

引言 非线性降维是机器学习中用来处理高维数据的一种方法&#xff0c;特别是当数据包含复杂的非线性结构时 文章目录 引言一、非线性降维1.1 目的1.2 非线性降维方法1.2.1 核主成分分析 (Kernel PCA)1.2.2 局部线性嵌入 (LLE)1.2.3 等距映射 (Isomap)1.2.4 拉普拉斯特征映射 (L…

3秒AI写真出图,Stable Diffusion2024升级版+使用教程来了!(无需安装,解压即用)

要说今年摄影圈最大的新秀 那妥妥的就Stable Diffusion 比如下面的写真照片 你敢信这是SD绘画生成的&#xff1f; 就在刚刚它又全面升级了 新版无需安装&#xff0c;直接解压就能用 比之前推送的更加智能、快速和简单 另外还特意为大家准备了 Stable Diffusion 人工智能…

新书速览|Altium Designer 24入门与案例实践:视频教学版

本书内容 《Altium Designer 24入门与案例实践:视频教学版》以当前最新的板卡级设计软件Altium Designer 24为基础&#xff0c;全面讲述电路设计的各种基本操作方法与技巧&#xff0c;并演示两个大型综合实战案例。《Altium Designer 24入门与案例实践:视频教学版》配套示例源文…

RAG的基石:大语言模型文本向量化能力对比

什么是具象的高维向量空间&#xff1f;也许这是一个&#xff0c;在不同的平行空间里面&#xff0c;对不同的物体有各自的表示… 一、概述 大家都比较关心大语言模型的能力&#xff0c;但往往容易忽略其向量化&#xff08;Embedding&#xff09;的能力。在RAG应用中&#xff0c…

USB3202N多功能数据采集卡16位模拟量250K频率LabVIEW采集卡

品牌&#xff1a;阿尔泰科技 系列&#xff1a;多功能数据采集卡 概述&#xff1a; USB3202N多功能数据采集卡&#xff0c;LabVIEW无缝连接&#xff0c;提供图形化API函数&#xff0c;提供8通道&#xff08;RSE、NRSE&#xff09;、4通道&#xff08;DIFF&#xff09;模拟量输…

计算机毕业设计hadoop+spark+hive物流预测系统 物流大数据分析平台 物流信息爬虫 物流大数据 机器学习 深度学习

流程&#xff1a; 1.Python爬虫采集物流数据等存入mysql和.csv文件&#xff1b; 2.使用pandasnumpy或者MapReduce对上面的数据集进行数据清洗生成最终上传到hdfs&#xff1b; 3.使用hive数据仓库完成建库建表导入.csv数据集&#xff1b; 4.使用hive之hive_sql进行离线计算&…

matlab可以把多个二维图合成为三维瀑布图吗??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

小皮服务器无法启动Mysql服务器

一、用小皮服务器启动mysq&#xff0c;启动后几秒钟就停止了 出现了这种情况怎么办&#xff1f; 二、因为电脑已经启动了mysql服务 关闭掉已启动的mysql服务就好 在电脑任务栏的空白处右键&#xff0c;出现‘任务管理器’ 找到mysql服务&#xff0c;右键“结束任务” 三、再…

【论文笔记】独属于CV的注意力机制CBAM-Convolutional Block Attention Module

目录 写在前面 一、基数和宽度 二、通道注意力模块&#xff08;Channel Attention Module&#xff09; 三、空间注意力模块&#xff08;Spatial Attention Module&#xff09; 四、CBAM&#xff08;Convolutional Block Attention Module&#xff09; 五、总结 写在前面 …

调试JS代码

一、vs code调试 1.在vs code中如何进行代码调试&#xff1f; 首先&#xff0c;在vs code中配置 auto-attach&#xff0c;通过ctrl shift p&#xff0c;输入 auto-attach。设置成smart&#xff08;智能&#xff09;。如下图&#xff1a; 然后&#xff0c;对需要调试的语句在…

AWS子账号的创建与管理:提升安全性与灵活性

在现代云计算环境中&#xff0c;亚马逊网络服务&#xff08;AWS&#xff09;提供了强大的功能&#xff0c;允许用户创建和管理子账号。通过合理地使用子账号&#xff0c;企业可以有效地提升安全性、管理复杂性以及资源的灵活性。我们九河云一起细探讨AWS子账号的创建方法。 为什…

2-78 基于matlab-GUI的DTW算法语音识别

基于matlab-GUI的DTW算法语音识别&#xff0c;具有16页分析报告。能识别0-9数字&#xff0c;正确率90。预处理过程包括预滤波、采样和量化、分帧、加窗、预加重、端点检测等。经过预处理的语音数据进行特征参数提取。在训练阶段&#xff0c;将特征参数处理之后&#xff0c;每个…

双目相机实现物体尺寸的精准测量

双目视觉系统是一种模拟人类双眼的立体视觉原理&#xff0c;通过两个摄像头从不同的角度捕捉同一场景的图像&#xff0c;从而获取目标物体的三维信息。 目录 1&#xff0c;设备选型 2&#xff0c;双目相机测量的现实意义 2.1 技术优势 2.2 面对的挑战 2.3 发展趋势 3&am…