# 项目名称：Adc_Demo

---
## 功能描述

本示例用于演示 MCAL Adc 模块的配置和使用:

- **Adc**: 
  - 该示例验证 Adc 模块的主要功能，包括初始化、读取状态、启动转换、读取转换结果等。
  - ADC0配置为中断模式，即通道组转换完成后，在ADC中断服务程序中将转换结果从ADC FIFO寄存器读取到软件定义的缓存区中。
  - ADC1配置为DMA模式，即通道组转换完成后，通过DMA将转换结果从ADC FIFO寄存器传输到软件定义的缓存区中。
  - 本示例中定义了6个通道组用于测试，通道组0-3配置为ADC0，通道组4-5配置为ADC1，ADC1通道组配置为DMA模式,通道组详细设置如下表所示。

| ADC 硬件 | 通道组名称 | 传输类型 | 触发类型 | 转换和访问模式 | 通道列表 |
|----|----|----|----|----|----|
| ADC0 | ADC0_GP0_OMSA | 查询 | 软件触发 | 单次转换和单次访问 | ADC0_SE0, ADC0_SE1 |
| ADC0 | ADC0_GP1_CMSA | 中断 | 软件触发 | 连续转换和单次访问 | ADC0_SE0, ADC0_SE1,VDD,VREF,VSS |
| ADC0 | ADC0_GP2_CMLSA | 中断 | 软件触发 | 连续转换和线性流访问 | ADC0_SE0, ADC0_SE1,VDD,VREF,VSS,VDD25 |
| ADC0 | ADC0_GP3_CMCSA | 中断 | 软件触发 | 连续转换和循环流访问 | ADC0_SE0, ADC0_SE1,VDD,VREF,VSS,VDD25 |
| ADC1 | ADC1_GP0_CMSA | DMA | 软件触发 | 连续转换和单次访问 | ADC1_SE16~ADC1_SE22 |
|ADC1|ADC1_GP1_CMCSA|DMA|软件触发|连续转换和循环流访问|ADC1_SE16~ADC1_SE22|

复位后，初始化Adc驱动程序，为所有通道组设置结果缓存区，为需要的通道组启用通知，并启动所有通道组转换。所有通道组将重复启动转换并在while(1)循环中读取结果。所有通道组转换完成后，将各个通道组中ADC0_SE0通道转换结果进行相互检查。

本示例代码定义了以下变量用于观察采集结果和程序运行状态：
- **ADC转换结果变量** 
  - `Adc0_Group0ResultPhys`: 存储ADC0_GP0_OMSA通道组转换结果的物理值数组，单位为毫伏。
  - `Adc0_Group1ResultPhys`: 存储ADC0_GP1_CMSA通道组转换结果的物理值数组，单位为毫伏。
  - `Adc0_Group2ResultPhys`: 存储ADC0_GP2_CMLSA通道组转换结果的物理值数组，单位为毫伏。
  - `Adc0_Group3ResultPhys`: 存储ADC0_GP3_CMCSA通道组转换结果的物理值数组，单位为毫伏。
  - `Adc1_Group0ResultPhys`: 存储ADC1_GP0_CMSA通道组转换结果的物理值数组，单位为毫伏。
  - `Adc1_Group1ResultPhys`: 存储ADC1_GP1_CMCSA通道组转换结果的物理值数组，单位为毫伏。
- **转换次数计数变量**
  - `Adc0_Group0ConCompCnt`: 计数ADC0_GP0_OMSA通道组完成的转换次数。
  - `Adc0_Group1ConCompCnt`: 计数ADC0_GP1_CMSA通道组完成的转换次数。
  - `Adc0_Group2ConCompCnt`: 计数ADC0_GP2_CMLSA通道组完成的转换次数。
  - `Adc0_Group3ConCompCnt`: 计数ADC0_GP3_CMCSA通道组完成的转换次数。
  - `Adc1_Group0ConCompCnt`: 计数ADC1_GP0_CMSA通道组完成的转换次数。
  - `Adc1_Group1ConCompCnt`: 计数ADC1_GP1_CMCSA通道组完成的转换次数。
  - `Adc0_ResultNotMatchCnt`: 程序检查ADC0通道0在不同通道组中的转换结果不匹配计数器。具体来说，它将通道组0的结果与通道组1、通道组2和通道组3的结果进行比较。如果通道组0的结果与其他组的结果之间的差异超过100毫伏，则递增`Adc0_ResultNotMatchCnt`变量。

- **预期每个通道的转换结果值**（VDD供电电压为5V）：

|通道|描述|预期值 (mV)|
|----|----|----|
|ADC0_SE0~ADC0_SE1, ADC1_SE16~ADC1_SE22|ADC0 以及 ADC1外部输入通道 |外部输入值  |
|VDD|电源电压|5000  |
|VREFH|VREFH电压值|5000  |
|VSS|VSS电压值|0  |
|VDD25|VDD25电压值   |2500  |

**注意**：在本示例中，MCU使用5V供电。如果您需要使用3.3V供电，请自行修改该示例中ADC转换结果物理值的计算方式。

## 操作步骤

+ ***步骤1***：使用 YCT 工具打开示例的配置工程文件（`Adc_Demo.yct`），根据您的需求配置工具链（默认使用 VS Code + GCC）。
+ ***步骤2***：生成代码，如果需要，您可以更改配置（以适应您自己的硬件设计），如果这样做，请确保所有修改都正确无误，并且在生成代码之前没有错误存在。
+ ***步骤3***：根据您的配置，使用相应的工具（VS Code/IAR/Keil IDE）打开生成的工程。
+ ***步骤4***：编译生成的工程，打开 EVB 电源并通过可用的调试器（如 J-Link 调试探针）将编译好的可执行文件下载到 EVB。
+ ***步骤5***：调试、运行示例代码。
  
---

## 硬件需求

- **评估板（EVB）**：YTM32B1ME0-Q144-EVB-Rev.B/C
- **调试器**：J-Link HW v9.2或更高版本，安装有YUNTU `YTM32B1ME0` 补丁（支持包）。

***注意***: 请确认EVB底部的版本号，如果是***YTM32B1ME0-EVB-Q144 Rev.C***，`YTMEVB_Demo`、`Icu_Demo`和`Dio_Demo`请使用以**_RevC**结尾的样例工程。

---

## 软件需求

- **配置与代码生成工具**：
  - **MCAL**：Yuntu Config Tool（YCT）v2.7.0或更高版本
- **编译器工具链**：
  - **GCC**：GNU GCC v10.3或更高版本
  - **Keil/MDK**：ARM Keil/MDK v5.36或更高版本(编译器推荐使用`armclang v6.18.2`)
  - **IAR**：IAR v9.50或更高版本
  - **VS Code**：Microsoft Visual Studio Code IDE v1.76或更高版本（需安装C/C++支持、GNU工具链、CMake v3.25、ninja、Cortex-Debug扩展）
- **调试器驱动**：
  - **J-Link**：SEGGER J-Link v7.82或更高版本，需安装YUNTU `YTM32B1ME0` 补丁（支持包）。
  - **Ozone调试工具**：SEGGER Ozone v3.28或更高版本。

  ***注意***: 需要安装 **YTM32B1ME0** 补丁，补丁可通过 **YCT** 工具或联系 ***云途 销售/FAE 团队***获取.


---