STM32/GD32同类别芯片编号标识字段释义

文章详细解释了STM32和GD32系列芯片16位编号的含义,其中32代表单片机的32位字长,影响处理器处理能力及内存数据宽度。此外,还介绍了芯片型号的构成和下载器的线序知识,旨在方便读者进行芯片选型和配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嵌入式_STM32/GD32同类别芯片编号标识字段释义

`STM32或国产GD32的产品都有个16个字母或数字构成的编号标示,该标识各个字段表示什么意思,这里整理一下方便自己查阅选型和配置



前言

这里依意法半导体公司32位单片机GD32F103CBT6 为例:
其中32表示:单片机字长,决定了处理器一次可处理的的二进制代码位数,决定了通用寄存器,内部存存储和运器的位数和数据宽度。


一、型号说明

在这里插入图片描述

二、下载器线序

在这里插入图片描述


总结

内容简单,就当个笔记记录一下,方便以后查阅

<think>好的,我现在需要理解用户提供的这段代码,特别是ADC_ScanChannelConfig函数。首先,我会仔细阅读代码和注释,看看它的结构和各部分的作用。 首先,函数定义有三个参数:ADCx、ScanChannel和ADC_Channel。ADCx指向ADC_Type结构体的指针,可能是某个特定的ADC外设,比如ADC0或ADC1。ScanChannel是扫描通道,可能对应ADC的扫描序列中的位置。ADC_Channel则是具体的输入通道号,比如某个引脚对应的通道。 接下来,函数内部有一个条件判断,检查ScanChannel是否小于ADC_SCAN_Channel_6。如果是,处理SCAN_SQR0寄存器;否则,处理SCAN_SQR1寄存器,并将ScanChannel减去ADC_SCAN_Channel_6。这说明扫描通道被分成了两部分,前6个在SQR0,后面的在SQR1。 然后,在条件分支内部,首先清除对应位置的位域。使用&= ~(...)来清除,这里左移的位数是4乘以ScanChannel,可能每个通道占4位。接着用|=将ADC_Channel的值左移到正确的位置,然后设置到寄存器中。 我需要确认每个步骤是否正确。比如,清除操作是否正确覆盖了目标位,设置操作是否正确。时,需要理解ADC_SCAN_SQR0_SQ0_CH_Msk和ADC_SCAN_SQR0_SQ0_CH_Pos的作用,它们是用来定义通道在寄存器中的掩码和起始位的。 可能存在疑问的地方:为什么ScanChannel减去ADC_SCAN_Channel_6?是否意味着SQR0处理前6个通道,而SQR1处理从第6开始的通道?需要查看参考手册或寄存器定义来确认。另外,每个通道占4位是否足够,因为ADC_Channel可能有更多位需要设置。 还要注意数据类型转换,比如将结果转换为uint32_t,确保移位操作正确。此外,检查是否存在可能的溢出或位域覆盖问题,特别是当ScanChannel较大时。 总结来说,函数的作用是根据扫描通道的位置,在相应的寄存器中配置ADC的输入通道。用户可能需要了解如何正确使用该函数,以及各参数的含义和取值范围。需要进一步解释寄存器的结构,通道编号的分配,以及函数的使用场景和注意事项。</think>以下是代码的逐层解析: --- ### **一、函数功能概述** 此函数用于配置ADC扫描模式下的通道序列,属于底层寄存器操作。核心逻辑: **根据扫描序列位置(`ScanChannel`),将指定的ADC输入通道(`ADC_Channel`)写入对应寄存器组。** --- ### **二、参数解析** 1. **`ADCx`** - 类型:`ADC_Type*` - 作用:指向具体ADC外设(如ADC0或ADC1)的指针,用于操作其寄存器。 2. **`ScanChannel`** - 类型:`uint8_t` - 作用:扫描序列中的位置编号(例如第0位、第1位...)。 - 取值范围:需匹配`@ref ADC_SCAN_Channel`(假设定义了类似`ADC_SCAN_Channel_0`到`ADC_SCAN_Channel_11`的枚举)。 3. **`ADC_Channel`** - 类型:`uint8_t` - 作用:实际ADC硬件输入通道号(如通道0对应某个物理引脚)。 - 取值范围:由`@ref ADC_Channel`定义(如0~15)。 --- ### **三、代码逻辑分解** #### **1. 判断扫描通道分组** ```c if(ScanChannel < ADC_SCAN_Channel_6) { // 处理SCAN_SQR0寄存器(通道0~5) } else { // 处理SCAN_SQR1寄存器(通道6及更高) ScanChannel -= ADC_SCAN_Channel_6; // 转换为SQR1内部偏移 } ``` - **分组依据**:假设`ADC_SCAN_Channel_6`值为6,表示前6个通道由`SCAN_SQR0`控制,后续通道由`SCAN_SQR1`控制。 - **寄存器分工**:可能因芯片而分组,例如STM32中多通道扫描分多个寄存器存储。 --- #### **2. 寄存器操作详解** ##### **场景1:通道0~5(SCAN_SQR0)** ```c // 清空目标通道的原有配置 ADCx->SCAN_SQR0 &= ~(ADC_SCAN_SQR0_SQ0_CH_Msk << 4UL * ScanChannel); // 写入新通道号到目标位置 ADCx->SCAN_SQR0 |= (uint32_t)(ADC_Channel << (ADC_SCAN_SQR0_SQ0_CH_Pos + 4UL * ScanChannel)); ``` - **掩码与位移**: - `ADC_SCAN_SQR0_SQ0_CH_Msk`:通道号占用的位掩码(如0xF表示4位)。 - `ADC_SCAN_SQR0_SQ0_CH_Pos`:通道0在寄存器中的起始位(如位0)。 - 每个通道占4位,因此位移步进为`4UL * ScanChannel`。 - 例如,通道1的配置从位4开始,通道2从位8开始,依此类推。 ##### **场景2:通道6及更高(SCAN_SQR1)** ```c // 调整通道号为SQR1的局部偏移(如通道6对应SQR1的偏移0) ScanChannel -= ADC_SCAN_Channel_6; // 清空目标通道的原有配置 ADCx->SCAN_SQR1 &= ~(ADC_SCAN_SQR1_SQ6_CH_Msk << 4UL * ScanChannel); // 写入新通道号到目标位置 ADCx->SCAN_SQR1 |= (uint32_t)(ADC_Channel << (ADC_SCAN_SQR1_SQ6_CH_Pos + 4UL * ScanChannel)); ``` - 逻辑与`SCAN_SQR0`类似,但起始位置由`ADC_SCAN_SQR1_SQ6_CH_Pos`定义(如通道6从位0开始)。 --- ### **四、关键知识点** 1. **寄存器位域管理** - 使用位掩码(`*_Msk`)和位偏移(`*_Pos`)精准控制寄存器中的字段。 - 清除旧值:`&= ~(...)` - 写入新值:`|= (...)` 2. **通道分组设计** - 寄存器容量有限时,需分组存储多通道配置(如SQR0存前6通道,SQR1存后续通道)。 3. **参数范围约束** - `ScanChannel`必须小于芯片支持的扫描通道总数(如12通道需定义`ADC_SCAN_Channel_0`到`ADC_SCAN_Channel_11`)。 --- ### **五、使用示例** 假设需将ADC1的扫描序列第3位设置为通道8: ```c ADC_ScanChannelConfig(ADC1, ADC_SCAN_Channel_3, 8); ``` - 此时`ScanChannel=3`,触发`SCAN_SQR0`操作: - 清空`SCAN_SQR0`中第3通道对应的4位(位12~15)。 - 将通道号8(二进制`1000`)写入位12~15。 --- ### **六、注意事项** 1. **参数合法性** - 需确保`ScanChannel`和`ADC_Channel`在有效范围内,否则可能覆盖其他寄存器位。 2. **原子操作** - 若在中断中调用此函数,需防止寄存器操作被其他代码打断,必要时关中断。 3. **硬件依赖性** - 寄存器名称和位定义需严格匹配具体芯片的数据手册(如STM32GD32等)。 --- 通过此函数,可灵活配置ADC扫描序列中各位置的输入通道,适用于多通道数据采集场景(如温度、电压等多传感器采样)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值