# 项目名称：YTMEVB_Demo

---

## 功能描述

该项目旨在演示 MCAL 驱动模块的典型配置和使用：

- **Gpt**
此演示使用 3 个通道初始化 Gpt。通道 0 用于生成 5ms 任务中断，通道 1 用于服务 Wdg_180_Inst0，通道 2 用于服务 Wdg_180_Inst1。

- **Pwm**
此演示使用 3 个通道初始化 Pwm。通道 0 用于驱动红色 LED，通道 1 用于驱动绿色 LED，通道 2 用于驱动蓝色 LED。ADC0 AN1（EVB 中的 RP1）和 AN2（EVB 中的 RP2）用于通过 PWM 控制蓝色和绿色 LED（**LED8**）的亮度。

- **Wdg**
此演示在窗口模式下初始化 Wdg_180_Inst0（WDG）和 Wdg_180_Inst1（EWDG），然后每 **200ms** 触发 Wdg_180_Inst0，每 **500ms** 触发 Wdg_180_Inst1。如果 Wdg_180_Inst0 在 0-500ms 内未被触发，将调用 Wdg_180_Inst0_Callback，然后系统将重置。如果 Wdg_180_Inst1 在 400-1000ms 内未被触发，将调用 Wdg_180_Inst1_Callback。

- **Adc**
此演示使用两个 HW 实例和 4 个组初始化 Adc。组 0 到组 2 分配给带中断的 ADC0，组 2 分配给带 DMA 的 ADC1。通过组 1 和组 2 收集 VDD25。比较每个组转换的结果，如果差异超过 ±50mV，Adc0_Vdd25DiffOutofRangeCnt 将增加 1。
  - Adc 转换结果控制 PWM 占空比。RGB **LED8** 由 PWM 驱动，占空比由 ADC 转换结果控制。
    * 蓝色 LED 由 AN1_RP2（在 Rev.A EVB 上）或 AN2_RP2（在 Rev.A EVB 上）驱动
    * 绿色 LED 由 AN2_RP1（在 Rev.A EVB 上）或 AN1_RP1（在 Rev.A EVB 上）驱动

- **Fls**
此演示为 Fee 配置 44kByte DFLASH（硬件地址 0x40000 到 0x4AFFF）。

- **Fee**
此演示为两个组配置三个 Fee 块。名为 'Fee_PowerOnDataBlock' 的块用于保存开机次数和 MCU 重置原因，初始化时读写。名为 'Fee_DTCDataBlock' 的块与 'Fee_PowerOnDataBlock' 一起写入。名为 'Fee_AppDataBlock' 的块每 100 秒写入一次。

- **Spi**
此演示使用序列 0 初始化 Spi_0（SPI0，1Mbit/s），并使用 DMA 传输 32 字节（0x00 到 0x1F）数据。
**注意**：请仔细检查并确保 **SIN**（PTE1/**H4-18P**）与 **SOUT**（PTE2/**H4-10p**）连接，以便测试。

- **I2c**
I2C0 配置为主模式，用于在 EVB 上读写外部 EEPROM 数据，异步模式，每 1 秒进行一次读写周期，固定写入 8 字节数据（0x00 到 0x07）。
- **Icu**
  演示配置了 3 个 Icu 通道：
  1. ***Icu_Ch0*** 需要输入一个 10KHz 的 PWM 信号到 **PTC12** 引脚进行信号测量测试。（或者 ***OCU 输出 10KHz*** 波形也可以短路测试）
  2. ***Icu_Ch1*** 连接到 **SW3**，按下 **SW3** 时切换用户 **LED_RED**/**LED7**。按下 **SW3** ***10*** 次后，MCU 进入 **PowerDown** 模式。
  3. ***Icu_Ch2***(**H2-5P**) 短路到 SW2(***J19-2P***) 进行测试，按下 **SW3** 时切换用户 **LED_RED**/**LED7**。按下 **SW2** 后 MCU 从 ***PowerDown*** 模式唤醒。

- **Ocu**
  **PTC28/eTMR0_Ch0** 被配置为一个 Ocu 通道，输出一个 **10KHz** 方波。

- **UART/CddUart**
***LINFlexD2*** 被配置为 UART 模式，<u>115200 波特率，1 位起始位，8 位数据位，1 位停止位，无校验位</u>。
  它用于打印 MCAL 驱动模块测试结果/日志，如下截图所示：
  !UART_LOG

  **注意**：1. UART 测试在 **500ms** 任务中调用；2. 应短接 **J26** 以确保通过插入 **USB1** 端口的 Type-C 电缆使 UART-to-USB 正常工作，以便在 PC 上监视消息（推荐使用串行终端程序）。
- **Lin**
演示配置了两个板载 LIN 接口 - **LIN1(LINFlexD0)** 作为 **master**/***Door*** 节点和 **LIN2(LINFlexD1)** 作为 **slave**/***Window*** 节点，波特率为 **19200** 进行测试。
两个 LIN PHY/收发器默认配置为启用（通过将 SLP_N 驱动为高电平（逻辑 1））以用于两个 LIN 总线的测试。
Lin 测试在 **200ms** 任务中执行：
  1. 主节点首先发送 **10** 个带有 ID = **0x10 到 0x19** 的主响应 LIN 消息帧和相应的 8 字节数据（<u>从节点接收主响应 LIN 消息帧并相应地检查接收到的数据</u>）：
  ```c
    uint8 lin_Master_txDataMatrix[10][8] = {
      {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x01},
      {0x31, 0x42, 0x53, 0x64, 0x78, 0x69, 0x37, 0x02},
      {0x21, 0x92, 0x03, 0x13, 0x22, 0x06, 0x07, 0x04},
      {0x31, 0x32, 0x04, 0x04, 0x33, 0xF6, 0x07, 0x08},
      {0x41, 0xB2, 0x05, 0x33, 0x05, 0xd6, 0x57, 0x10},
      {0x77, 0xA2, 0x06, 0x04, 0x7D, 0xE6, 0x07, 0x18},
      {0x99, 0xF2, 0x07, 0x58, 0x05, 0x06, 0x67, 0x20},
      {0xBB, 0xE2, 0x08, 0x32, 0x8F, 0xD6, 0x07, 0x28},
      {0xDD, 0xD2, 0x09, 0xA4, 0x05, 0x06, 0xB7, 0x30},
      {0xFF, 0xC2, 0xAA, 0x24, 0x66, 0xA6, 0x07, 0x40},
    };
- 2. 主节点然后发送 **10** 个带有 ID = **0x20 到 0x29** 的从响应 LIN 消息帧，并且从节点相应地响应以下 8 字节数据：
  ```c
    uint8 lin_Slave_txDataMatrix[10][8] = {
      {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x10},
      {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x22, 0x10},
      {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x33, 0x10},
      {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x44, 0x10},
      {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x55, 0x10},
      {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x66, 0x10},
      {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x77, 0x10},
      {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x88, 0x10},
      {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x99, 0x10},
      {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xAA, 0x10},
   };
- **Can**
演示配置了两个CAN控制器实例 - CAN1(FlexCAN1)和CAN2(FlexCAN0)，带有**500Kbit/s**(**81.25%**采样点) + **2Mbit/s**(FD数据字段,**83.33%**采样点)比特率(启用**ISO-CANFD**)，并为测试启用相应的CAN PHY(收发器)。
  - 这两个CAN总线通过(**J12** <-> **J7**)连接到同一个CAN总线，并在测试中相互发送和接收一些CAN 2.0和CANFD消息帧。
  - 如果控制器遇到CAN总线错误并进入总线关闭状态，它将自动恢复。
  - CAN **控制器**和**硬件对象**以及TX/RX消息框的配置如下所示：
  ![Can_Controller_and_Obejct_MapConfig](./Can_Controller_and_Obejct_MapConfig.jpeg)
  
  - CAN TX和RX消息缓冲区(MB)及Rx滤波器的配置如下所示：
  ![Can_Tx_Rx_MB_Filter](./CAN_TxRx_MB_Filter_Config.jpeg)
  **注意**：测试时需要将EVB板上的**J16**和**J11**需要使用跳冒短接。
  
- **Crypto**: 
  该示例分别展示了服务运行于同步模式与异步模式的过程，以及如何让服务运行于单次模式或流模式。  
---
- 注意：全局宏`MCAL_ENABLE_USER_MODE_SUPPORT`和`MCAL_SCHM_LITE`已为`VSCode + Ninja + CMake与GCC/IAR/Keil工具链`添加，如果使用IAR/Keil IDE工程进行构建/编译，需要手动将这些宏和app的子文件夹添加到工程设置中。

- 提示：使用Keil/ARMCLANG v6.18.2的`VSCode + Ninja + CMake`需要特别注意，可能需要链接器选项`--legacyalign`以确保ramcode段中的函数在根目录下的`CMakeLists.txt`文件中按预期重新映射。

```c
  target_link_libraries(${project_elf} "--entry Reset_Handler;--scatter=../board/yt_linker.scf;--legacyalign")
```
---

## 设置

+ ***步骤1***：使用YCT工具打开YTMEVB_Demo.yct文件，根据您的需求配置工具链(默认使用VS Code + GCC)
+ ***步骤2***：生成代码，如果需要，您可以更改配置以适应您自己的硬件设计，如果是这样，请确保在生成代码之前所有的修改都是正确的，没有任何错误存在。
+ ***步骤3***：根据您选择的，用VS Code/IAR/Keil IDE打开生成的项目。
+ ***步骤4***：编译项目，打开EVB电源并通过可用的调试器，如J-Link调试器，将其下载到EVB。
+ ***步骤5***：最后，通过串口打印信息查看测试运行结果。
---
## EVB硬件连接要求
用户应该仔细检查下面的硬件连接要求：
![EVB-HW-connection](./EVB_HW_Connection.jpeg)

---   

## 硬件需求
+ **EVB**: YTM32B1MD1-EVB-Q100-Rev.A/B
+ **调试器**: J-Link HW v9 或更高版本，安装了 YUNTU `YTM32B1MD1` 补丁（支持包）。

***注意***: 请确认EVB底部的版本号，如果是***YTM32B1MD1-EVB-Q100-Rev.A***，`Icu_Demo`请使用以`_RevA`结尾的样例工程。

---

## 软件需求

+ **配置和代码生成工具**
  + **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 扩展安装）
+ **Debugger driver**
    + **J-Link**: SEGGER J-Link v7.82 或更高版本，需要安装 YUNTU `YTM32B1MD1` 补丁（支持包）。
    + **Ozone Debugger tool**: SEGGER Ozone v3.28 或更高版本。

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

---