diff --git a/README.md b/README.md
index ec080bb9131406ffc259106190e5693957a9902b..ea97a3bbea573776eddb054908f144b15adeae54 100644
--- a/README.md
+++ b/README.md
@@ -1,301 +1,45 @@
-# open_mcu开发指南
-
-## 介绍
-
- open_mcu代码仓为支持3061M和3065M解决方案SDK。
-
-## 支持的开发板
-
-| 开发板名称 | 硬件资料 | 软件资料 | 购买链接 | 开发板介绍 |
-| :--------: | ------------------------------------------------------------ | :----------- | :----------------------------------------------------------- | :------------ |
-| 3061M | [开发板硬件原理图](https://gitee.com/HiSpark/open_mcu/tree/master/docs/hardware/3061M) | 参考示例教程 | [开发板购买链接](https://m.tb.cn/h.gMEbHlepTLs5DNB?tk=aKIe356U3bY) | 参考3061M介绍 |
-| 3065H | [开发板硬件原理图](https://gitee.com/HiSpark/open_mcu/tree/master/docs/hardware/3065H) | 参考示例教程 | [开发板购买链接](https://m.tb.cn/h.gMEbHlepTLs5DNB?tk=aKIe356U3bY) | 参考3065H介绍 |
-
-## 目录介绍
-
-| 目录 | 介绍 |
-| ------ | ---------------------- |
-| docs | 硬件原理图 |
-| src | SDK源码目录 |
-| tools | 开发工具及环境搭建指南 |
-| vendor | 存放对应开发板案例 |
-
-## 硬件介绍
-
-### 3061M介绍
-
-3061M系列 生态板由 ECBMCU201MPC(核心板)和 ECBMOTORA(电机驱动板组成)。
-
-ECBMCU201MPC是针对 3061M系列 MCU开发的生态核心板,用于 3061M初始评估和设计参考,内嵌一块 USB接口的调试板。
-
-ECBMOTORA是电机驱动扩展板,支持一个 BLDC或 PMSM电机控制。该单板支持24V/12V DCIN输入。
-
-核心板电机驱动扩展板的常用组装方式是电机驱动板通过两个40pin连接器扣接到核心板,如下图所示。
-
-
-
-### 3061M硬件说明
-
- 3061M通用生态板通过 ECBMCU201MPC核心板实现控制、 ECBMOTORA 扩展板实现接口扩展以及电源接口,同时提供USB TypeC线进行调试 / 供电、12V电源适配器和一个电机。
-
-
-
-3061M通用生态板用户手册详细内容请查阅:Hi3061M系列 通用生态板用户手册 00B01
-
-### 3065H介绍
-
-3065H 通用生态板由 ECBMCU105H (核心板)和 ECBMOTORA (电机驱动板)组成。
-
-ECBMCU105H是针对 3065H 芯片开发的生态核心板,用于 3065H 芯片初始评估和设计参考,内嵌一块 USB 接口的调试板。
-
-ECBMOTORA是电机驱动扩展板,支持一个 BLDC 或 PMSM 电机控制。该单板支持24V/12V DCIN 输入。
-
-核心板电机驱动扩展板的常用组装方式是电机驱动板通过两个40pin 连接器扣接到核心板,如下图所示。
-
-
-
-### 3065H硬件说明
-
- 3065H通用生态板通过ECBMCU105H 核心板实现控制、 ECBMOTORA 扩展板实现接口扩展以及电源接口,同时提供USB TypeC线进行调试 / 供电、12V电源适配器和一个电机。
-
-
-
-3065H通用生态板用户手册详细内容请查阅:Hi3065H通用生态板用户手册 V03
-
-## 开发环境搭建
-
-[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)
-
-## Demo
-
-3061M/3065H提供了以下Demo供开发参考,sample存放路径:[application_sample](https://gitee.com/HiSpark/open_mcu/tree/master/src/application)
-
-**主目录结构说明**
-
-| 文件夹名 | 描述 |
-| ----------------- | -------------- |
-| board\_sample | 开发板示例。 |
-| drivers_sample | 驱动程序示例。 |
-| middleware_sample | 中间件示例。 |
-| user | 用户相关。 |
-
-**表 1 board\_sample目录结构说明**
-
-| **文件夹名** | **描述** |
-| ------------ | -------------------------- |
-| dimming | 呼吸灯功能示例。 |
-| key | 按键检查功能示例。 |
-| led | 数码管功能示例。 |
-| pulses | gpio发送pwm波功能示例。 |
-| softserial | gpio实现串口通信功能示例。 |
-
-**表 2 acmp目录结构说明**
-
-| **文件夹名** | **描述** |
-| ------------ | ---------------- |
-| sample_acmp | 比较器使用示例。 |
-
-**表 3 adc目录结构说明**
-
-| **文件夹名** | **描述** |
-| ------------------------------------- | ------------------- |
-| sample_adc_associative_trigger_of_apt | APT触发ADC。 |
-| sample_adc_continue_trigger | ADC连续采样。 |
-| sample_adc_over_sample | ADC过采样。 |
-| sample_adc_single_trigger | ADC单次采样。 |
-| sample_adc_single_trigger_dma | ADC单次采样带DMA。 |
-| sample_adc_single_trigger_it | ADC单次采样带中断。 |
-| sample_adc_sync_sample | ADC同步采样。 |
-| sample_adc_sync_sample_dma | ADC同步采样带DMA。 |
-| sample_adc_sync_sample_it | ADC同步采样带中断。 |
-
-**表 4 apt目录结构说明**
-
-| **文件夹名** | **描述** |
-| -------------------------- | ------------------------------------------------- |
-| sample_apt_single_resistor | APT单电阻采样示例,仅在U相触发ADC采样信号。 |
-| sample_apt_three_resistor | APT三电阻采样示例,在U、V和W相都触发ADC采样信号。 |
-
-**表 5 can目录结构说明**
-
-| **文件夹名** | **描述** |
-| ----------------------- | ----------------------- |
-| sample_can_send_receive | CAN发送和接收数据示例。 |
-
-**表 6 capm目录结构说明**
-
-| **文件夹名** | **描述** |
-| ---------------- | -------------------------- |
-| capm_hall_sample | CAPM读取霍尔传感器值示例。 |
-
-**表 7 cfd目录结构说明**
-
-| **文件夹名** | **描述** |
-| ---------------------- | ------------------------------------- |
-| sample_cfd_check_error | cfd注入错误前后监测目标时钟异常功能。 |
-
-**表 8 cmm目录结构说明**
-
-| **文件夹名** | **描述** |
-| ---------------------- | ------------------------------------- |
-| sample_cmm_check_error | cmm注入错误前后监测目标时钟异常功能。 |
-
-**表 9 crc目录结构说明**
-
-| **文件夹名** | **描述** |
-| ---------------- | -------------------------------------------------------- |
-| sample_crc_check | 测试CRC不同算法和输入有效位宽,生成并校验crc值。 |
-| sample_crc_gen | 计算并生成CRC数值。 |
-| sample_crc_load | 通过load初始值将xmodem算法改为ccit-false算法并校验结果。 |
-
-**表 10 dac目录结构说明**
-
-| **文件夹名** | **描述** |
-| ------------ | ----------------------- |
-| sample_dac | DAC电压输出到管脚示例。 |
-
-**表 11 dma目录结构说明**
-
-| **文件夹名** | **描述** |
-| --------------------------------- | ------------------------- |
-| sample_dma_list_transfer | DMA链式传输。 |
-| sample_dma_list_transfer_continue | DMA链式传输实现连续功能。 |
-| sample_dma_mem_to_mem | DMA内存到内存传输。 |
-| sample_dma_mem_to_per | DMA内存到外设传输。 |
-| sample_dma_per_to_mem | DMA外设到内存传输。 |
-| sample_dma_per_to_per | DMA外设到外设传输。 |
-
-**表 12 flash目录结构说明**
-
-| **文件夹名** | **描述** |
-| ---------------------- | ------------------- |
-| sample_flash_blocking | 阻塞模式操作flash。 |
-| sample_flash_interrupt | 中断方式操作flash。 |
-
-**表 13 gpio目录结构说明**
-
-| **文件夹名** | **描述** |
-| --------------------- | ---------------------------- |
-| sample_gpio_circle | GPIO环回测试电平和方向属性。 |
-| sample_gpio_interrupt | 测试GPIO不同中断类型。 |
-| sample_gpio_key | GPIO用作按键功能。 |
-| sample_gpio_led | GPIO周期控制led亮灭功能。 |
-
-**表 14 gpt目录结构说明**
-
-| **文件夹名** | **描述** |
-| -------------------- | ---------------- |
-| sample_gpt_simplerun | gpt产生PWM波形。 |
-
-**表 15 i2c目录结构说明**
-
-| **文件夹名** | **描述** |
-| --------------------------- | ------------------------------ |
-| sample_i2c_blocking_stlm75 | 使用阻塞的方式读写温度传感器。 |
-| sample_i2c_interrupt_stlm75 | 使用中断的方式读写温度传感器。 |
-| sample_i2c_dma_stlm75 | 使用dma方式读写温度传感器。 |
-
-**表 16 iocmg目录结构说明**
-
-| **文件夹名** | **描述** |
-| ------------- | ----------------------------------- |
-| iolist_sample | iocmg初始化管脚列表的属性配置功能。 |
-
-**表 17 pga目录结构说明**
-
-| **文件夹名** | **描述** |
-| ------------------------- | --------------------- |
-| sample_pga | PGA内部电阻放大示例。 |
-| sample_pga_extra_resistor | PGA外部电阻放大示例。 |
-
-**表 18 pmc目录结构说明**
-
-| **文件夹名** | **描述** |
-| ----------------- | ------------------- |
-| sample_pmc_pvd | PMC掉电检测示例。 |
-| sample_pmc_wakeup | PMC定时器唤醒示例。 |
-
-**表 19 qdm目录结构说明**
-
-| **文件夹名** | **描述** |
-| ------------- | ------------------------------- |
-| sample_qdm_m | QDM使用M法读取电机转速的示例。 |
-| sample_qdm_mt | QDM使用MT法读取电机转速的示例。 |
-
-**表 20 spi目录机构说明**
-
-| **文件夹名** | **描述** |
-| ---------------------------- | --------------------------------- |
-| sample_spi_blocking_kta7953 | 使用阻塞方式读写ADC。 |
-| sample_spi_dma_kta7953 | 使用dma方式读写ADC。 |
-| sample_spi_interrupt_kta7953 | 使用中断方式读写ADC。 |
-| sample_spi_microwire_master | 演示如何使用microwire master。 |
-| sample_spi_microwire_slave | 演示如何使用microwire slave。 |
-| sample_spi_slave | 演示如何使用motorola spi slaver。 |
-
-**表 21 timer目录结构说明**
-
-| **文件夹名** | **描述** |
-| ---------------------- | ------------------------------------- |
-| sample_timer_interrupt | timer定时触发中断,执行用户串口打印。 |
-
-**表 22 tsensor目录结构说明**
-
-| **文件夹名** | **描述** |
-| -------------- | ----------------------- |
-| sample_tsensor | tsensor对器件结温采样。 |
-
-**表 23 uart目录结构说明**
-
-| **文件夹名** | **描述** |
-| ---------------------------------------- | ------------------------------------------ |
-| sample_uart_blocking_rx | UART阻塞接收。 |
-| sample_uart_blocking_tx | UART阻塞发送。 |
-| sample_uart_dma_rx | UART带DMA接收。 |
-| sample_uart_dma_tx | UART带DMA发送。 |
-| sample_uart_interrupt_tx_after_rx | UART中断接收数据之后,再中断发送此数据。 |
-| sample_uart_interrupt_rx | UART中断接收。 |
-| sample_uart_interrupt_tx | UART中断发送。 |
-| sample_uart_dma_tx_dma_rx_simultaneously | UART全双工模式,DMA同时发送和接收。 |
-| sample_uart_dma_tx_int_rx_simultaneously | UART全双工模式,DMA发送的同时,中断接收。 |
-| sample_uart_int_tx_dma_rx_simultaneously | UART全双工模式,中断发送的同时,DMA接收。 |
-| sample_uart_int_tx_int_rx_simultaneously | UART全双工模式,中断发送的同时,中断接收。 |
-| sample_uart_dma_rx_cyclically_stored | UART使用DMA循环搬运数据到指定内存。 |
-| sample_uart_single_wire_communication | UART单线通信示例。 |
-
-**表 24 wdg目录机构说明**
-
-| **文件夹名** | **描述** |
-| ----------------- | ------------------------ |
-| sample_wdg_reset | 测试wdg不喂狗复位功能。 |
-| sample_iwdg_reset | 测试iwdg不喂狗复位功能。 |
-
-**表 25 middleware\_sample目录机构说明**
-
-| **文件夹名** | **描述** |
-| -------------------------- | --------------------------------------- |
-| mcs_65ldemo | 电机控制算法在AD101HDMA_VER.B板的示例。 |
-| mcs_65demo | 电机控制算法在AD105HDMA_VER.B板的示例。 |
-| pmsm_sensorless_1shunt_foc | 永磁同步电机单电阻采样无感FOC应用。 |
-| pmsm_sensorless_2shunt_foc | 永磁同步电机双电阻采样无感FOC应用。 |
-
-## **问题与解答**
-
-如果你对项目中的代码或者文档存在疑问, 欢迎在Issues中提出你的问题(别忘了先在FAQ中看一看是否已经有答案了😎). 如果你自己解决了一个了不起的问题, 非常欢迎你把问题和解决方法发到Issues里, 如果你看到别人的问题而你正好有答案, 也欢迎你帮助解答其他人的问题, 所谓"授人玫瑰手有余香"嘛。
-
-## **参与贡献**
-
-我们非常欢迎你能对这个项目提出代码上的改进或扩展, 方法是:
-
-1. Fork 本仓库
-2. 下载到本地, 修改, 提交
-3. 推送代码
-4. 在页面点击 Pull Request
-
-这样我们就能接到你的推送申请。
-
-## **最后的话**
-
-Hispark Studio是一款年轻且处于快速发展的IDE。在使用过程中,你可能会碰到一些棘手的问题,但别担心,你可以尝试多种方法去解决,比如用搜索引擎寻找答案,或者向社区寻求帮助。记住,所有技术大神都是从解决这些问题中成长起来的。我们和其他开发者也会尽力提供帮助。
-
-最后的最后, 欢迎来到Hispark Studio的世界探险!
\ No newline at end of file
+## 基于海思MCU智能蒸烤箱控制系统
+
+## 一、前言
+本设计旨在通过上海海思3061M开发板以及无刷电机套件、PID温控等技术实现蒸烤箱的全自动控制等功能。侧重点在于体验海思MCU开发流程,包括开发环境搭建、程序仿真调试下载以及MCU外设配置和应用。
+## 二、设计内容
+单片机控制系统设计
+海思3601M开发套件作为控制核心,负责接收传感器信号、处理用户指令,并根据预设程序控制蒸烤箱的各个部件工作。
+传感器系统设计
+选用热电偶温度传感器,实时监测蒸烤箱内的温度,确保食物在合适的温度下烹饪。
+用户界面设计
+使用大彩3.5”串口屏作为机器用户界面,方便用户进行参数设置和状态查看。
+## 三、设计方法及步骤
+## 系统设计
+根据智能烤箱功能,设计整体系统架构,包括单片机控制系统、传感器系统、固态继电器、加热器、用户界面等,未做箱体。
+
+
+## 硬件设计
+1.MAX6675+热电偶温度传感器采集箱内温度
+2.PWM驱动固态继电器模块加热管加热
+3.3.5寸大彩串口屏显示模式、运行时间
+4. MOSFET控制蒸汽发生器产生蒸汽
+
+## 软件设计
+蒸烤箱设置三种工作模式:蒸模式、烤模式、蒸烤模式
+蒸烤箱工作程序如下:
+加热:程序启动后,电热器开始全功率加热,到达预设温度后由PID控制温度值,对食物加热。
+蒸汽:本设计采用蒸汽发生器产生蒸汽,由MOSFET控制蒸汽发生器工作。
+明确智能蒸烤箱设计功能后,围绕以上功能实现软件逻辑:
+1、参考3061M套件提供SPI样例,实现MAX6675的温度采集
+Temp_PV_A=Get_max6675temp(); //获取温度
+2、通过PWM和PID算法精准控温
+温度调节PID:Temp_PID()
+3、通过UART2通信实现串口屏通信。
+void Send2_Byte(uint8_t data1)
+void Sent_Temp(uint16_t screen_id,uint16_t control_id,uint16_t num)
+4.主控制程序采用轮询方式调用。
+void Main_Control(void)
+
+## 使用方法
+1、在主界面上选择烹饪模式:蒸汽、干烤、蒸烤;
+2、选择烹饪温度;
+3、选择烹饪时间;
+4、按执行工作按钮,进入自动烹饪工作状态;
+5、烹饪结束;
+6、返回主界面。
diff --git a/vendor/yibaina_3061M/demo/rost/HMI.c b/vendor/yibaina_3061M/demo/rost/HMI.c
new file mode 100644
index 0000000000000000000000000000000000000000..2407958e9823e5dcbb8cd869a16ea564d795c582
--- /dev/null
+++ b/vendor/yibaina_3061M/demo/rost/HMI.c
@@ -0,0 +1,438 @@
+#include "HMI.h"
+#include "stdio.h"
+#include "stdint.h"
+//#include "control.h"
+#include "main.h"
+#include "debug.h"
+#include "clock.h"
+
+#define Power_PARA 100 //加热器功率参数
+#define Delay_sensor 100 //新版传感器延时时间
+#define SW_ON 1
+#define ON 1
+#define SW_OFF 0
+#define OFF 0
+//低温烹饪过程菜单定义
+//extern mymenu def_menu[20]; //设置为全局变量
+/*******************************************************************************/
+
+extern uint16_t Slider_A;
+extern uint8_t cmd_buffer[64],gucDecoderIndex; //指令缓冲区
+extern uint16_t Temp_text_id;
+
+extern uint8_t cmd_size;
+extern _Bool RUN_ON,Timer_EN1,Pause_ON;
+
+/********************用户预约变量*******************************************/
+uint16_t Picture_ID;
+extern uint8_t Screen_ID,Time_setvalue_H,Time_setvalue_M,Time_setvalue_S;
+
+extern uint16_t Temp_PV_A;
+
+extern uint8_t Power_on,Workmode;
+extern uint32_t time_setvalue;
+
+uint16_t food_T;
+uint16_t Temp_1,Temp_3;
+extern uint16_t Temp_setvalue;
+uint16_t Temp_6;
+uint8_t current_pict_ID;
+
+/********************选锅状态*******************************************/
+//uint8_t mode_name[36]={"蒸汽干烤蒸烤回温△T预热保温除湿加湿"};
+uint8_t info[80];
+
+void Send2_Byte(uint8_t data1)
+{
+ while (UART2->UART_FR.BIT.txff == 1) {
+ ;
+ }
+ UART2->UART_DR.BIT.data = (unsigned char)data1;
+}
+
+void END_CMD(void)
+{
+ Send2_Byte(0xFF);
+ Send2_Byte(0xFC);
+ Send2_Byte(0xFF);
+ Send2_Byte(0xFF);
+}
+
+/******获取HMI系统时间指令******************************/
+void Get_Sys_Date_CMD(void)
+ {
+ BEGIN_CMD();
+ Send2_Byte(0x82);
+ END_CMD();
+ }
+
+
+/******系统复位******************************/
+void System_Reset(void)
+ {
+ BEGIN_CMD();
+ Send2_Byte(0x07);
+ Send2_Byte(0x35);
+ Send2_Byte(0x5A);
+ Send2_Byte(0x53);
+ Send2_Byte(0xA5);
+ END_CMD();
+ }
+
+/*!
+* \brief 获取当前画面
+*/
+uint16_t GetScreen(void)
+{
+ uint16_t screen_id1;
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x01);
+ END_CMD();
+ screen_id1=(cmd_buffer[3]<<8)+cmd_buffer[4];
+ DBG_PRINTF("screen_id %x \r\n",screen_id1);
+ return screen_id1;
+}
+
+ /**********************显示隐藏控件**************************
+ * 入口参数:
+ * uint16_t screen_id:屏幕ID
+ * uint16_t control_id:控件ID
+ * uint8_t value:设置值,1-显示,0-隐藏
+ * ********/
+void Desplay_Hide(uint16_t screen_id,uint16_t control_id,uint8_t value)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x03);
+ Send_16(screen_id);
+ Send_16(control_id);
+ Send2_Byte(value);
+ END_CMD();
+}
+
+/**********************禁用/使能控件**************************
+ * 入口参数:
+ * uint16_t screen_id:屏幕ID
+ * uint16_t control_id:控件ID
+ * uint8_t value:设置值,1-使能,0-禁止
+ * ********/
+void Disable_enable(uint16_t screen_id,uint16_t control_id,uint8_t value)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x04);
+ Send_16(screen_id);
+ Send_16(control_id);
+ Send2_Byte(value);
+ END_CMD();
+}
+
+
+/*********************文本发送***************************************/
+void Send_Text_A(uint16_t screen,uint16_t coutrol,char Text)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x10);
+ Send_16(screen);
+ Send_16(coutrol);
+ Send2_Byte(Text);
+ END_CMD();
+}
+
+/**********************读文本值***************************************/
+void Read_Text(uint16_t screen,uint16_t coutrol)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x11);
+ Send_16(screen);
+ Send_16(coutrol);
+ END_CMD();
+}
+
+/**********************汉字发送***************************************/
+void Send_Text_4(uint16_t screen,uint16_t coutrol,uint8_t Text_1,uint8_t Text_2,uint8_t Text_3,uint8_t Text_4)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x10);
+ Send_16(screen);
+ Send_16(coutrol);
+ Send2_Byte(Text_1);
+ Send2_Byte(Text_2);
+ Send2_Byte(Text_3);
+ Send2_Byte(Text_4);
+ END_CMD();
+}
+
+/******改变字体颜色*****************************/
+void Text_Color(uint16_t screen_id,uint16_t control_id,uint16_t value)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x19);
+ Send_16(screen_id);
+ Send_16(control_id);
+ Send_16(value);
+ END_CMD();
+}
+
+/******进度条控件*************/
+void Circle_proc(uint16_t screen_id,uint16_t control_id,uint16_t Start_Angle,uint16_t End_Angle)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x10);
+ Send_16(screen_id);
+ Send_16(control_id);
+ Send_16(Start_Angle);
+ Send_16(End_Angle);
+ END_CMD();
+}
+
+/***************发送5位整数************************************************
+* 函 数 名: Sent_Value()
+* 函数功能: 获得按键输入
+* 输 入: screen_id 屏幕ID
+* 输 入: control_id控件ID
+* 输 入: num发送的数据
+* 输 出: 无
+**************************************************************************/
+void Sent_Value(uint16_t screen_id,uint16_t control_id,uint16_t num)
+{
+// DBG_PRINTF("数值: %d \r\n",num);
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x10);
+ Send_16(screen_id);
+ Send_16(control_id);
+ if(num/1000)
+ {
+ Send2_Byte(num/1000+48);
+ Send2_Byte(num%1000/100+48);
+ Send2_Byte(num%100/10+48);
+ Send2_Byte(num%10+48);
+ }
+ else if(num/100)
+ {
+ Send2_Byte(num/100+48);
+ Send2_Byte(num%100/10+48);
+ Send2_Byte(num%10+48);
+ }
+ else if(num/10)
+ {
+ Send2_Byte(num/10+48);
+ Send2_Byte(num%10+48);
+ }
+ else Send2_Byte(num%10+48);
+ END_CMD();
+}
+
+
+/**********************显示icon控件状态***********************************/
+void Desplay_Icon(uint16_t screen_id,uint16_t control_id,uint8_t value)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x23);
+ Send_16(screen_id);
+ Send_16(control_id);
+ Send2_Byte(value);
+ END_CMD();
+}
+
+/******切换画面*******************************************************/
+void Screen_Change(uint16_t screen_id)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x00);
+ Send_16(screen_id);
+ END_CMD();
+}
+
+/**********************设置按钮状态***********************************/
+void Key_State(uint16_t screen_id,uint16_t control_id,uint8_t value)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x10);
+ Send_16(screen_id);
+ Send_16(control_id);
+ Send2_Byte(value);
+ END_CMD();
+}
+
+/**********************读取按钮状态***********************************/
+void Read_Key_State(uint16_t screen_id,uint16_t control_id)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x11);
+ Send_16(screen_id);
+ Send_16(control_id);
+ END_CMD();
+}
+
+/**********************读取开关按钮值***********************************/
+int8_t Read_Key_value(uint16_t screen_id1,uint16_t control_id1)
+{
+ _Bool Key_value=0;
+ Read_Key_State(screen_id1,control_id1);
+// Read_UART_DMA_AnyLenData(&g_uart2);
+ if (cmd_buffer[7]==0x10) Key_value=cmd_buffer[9];
+ return Key_value;
+}
+
+/**********************更新滑动条数值**********************************/
+void Slider_Set(uint16_t screen_id,uint16_t control_id,uint8_t value)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x10);
+ Send_16(screen_id);
+ Send_16(control_id);
+ Send2_Byte(0x00);
+ Send2_Byte(0x00);
+ Send2_Byte(0x00);
+ Send2_Byte(value);
+ END_CMD();
+}
+
+/******************发送时间数据,****************************************/
+void Sent_Time(uint16_t screen_id,uint16_t control_id,uint8_t num)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x10);
+ Send_16(screen_id);
+ Send_16(control_id);
+ Send2_Byte(num/10+0x30);
+ Send2_Byte(num%10+0x30);
+ END_CMD();
+}
+
+/******************发送字节数据,****************************************/
+void Sent_Char(uint16_t screen_id,uint16_t control_id,uint8_t num)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x10);
+ Send_16(screen_id);
+ Send_16(control_id);
+ if(num/100)
+ {
+ Send2_Byte(num/100+0x30);
+ Send2_Byte(num%100/10+0x30);
+ Send2_Byte(num%10+0x30);
+ }
+ else
+ {
+ if(num/10)
+ {
+ Send2_Byte(num/10+0x30);
+ Send2_Byte(num%10+0x30);
+ }
+ else Send2_Byte(num%10+0x30);
+ }
+ END_CMD();
+}
+
+/******************发送温度数据,1位小数**********************************/
+void Sent_Temp(uint16_t screen_id,uint16_t control_id,uint16_t num)
+{
+ BEGIN_CMD();
+ Send2_Byte(0xB1);
+ Send2_Byte(0x10);
+ Send_16(screen_id);
+ Send_16(control_id);
+// if(num>=0)
+// {
+ if(num/1000)
+ {
+ Send2_Byte(num/1000+0x30);
+ Send2_Byte(num%1000/100+0x30);
+ Send2_Byte(num%100/10+0x30);
+ Send2_Byte(0x2E);
+ Send2_Byte(num%10+0x30);
+ }
+ else
+ {
+ if(num/100)
+ {
+ Send2_Byte(num/100+0x30);
+ Send2_Byte(num%100/10+0x30);
+ Send2_Byte(0x2E);
+ Send2_Byte(num%10+0x30);
+ }
+ else
+ {
+ Send2_Byte(num/10+0x30);
+ Send2_Byte(0x2E);
+ Send2_Byte(num%10+0x30);
+ }
+ }
+ END_CMD();
+}
+
+
+/**************************************************************************
+* 函 数 名: Get_Time_Set()
+* 函数功能: 获取时间设定值
+* 输 入: 无
+* 输 出: uint16_t Tempe
+***************************************************************************/
+uint16_t Get_Time_Set(uint16_t screen_ID,uint16_t coutrol_ID)
+{
+ static uint16_t Tempe1=0;
+ Read_Text(screen_ID,coutrol_ID); //读取时间分钟值
+ BASE_FUNC_DelayMs(10);
+ if(cmd_size==14) Tempe1=(cmd_buffer[8]-0x30);
+ if(cmd_size==15) Tempe1=(cmd_buffer[8]-0x30)*10+(cmd_buffer[9]-0x30);
+ if(cmd_size==16) Tempe1=(cmd_buffer[8]-0x30)*100+(cmd_buffer[9]-0x30)*10+(cmd_buffer[10]-0x30);
+ DBG_PRINTF("time data11: %d \r\n",Tempe1);
+ return Tempe1;
+}
+
+/******************获取画面4指令***********************************************/
+void Screen3_Instruct(void)
+{
+ switch(cmd_buffer[6])
+ {
+ case 1:
+ Screen_Change(0);
+ return;
+ break;
+ default:
+ break;
+ }
+}
+
+
+/**********显示温度、时间变化数据***************
+ * 函数名:Sand_Data()
+ * 功能:实时显示温度、时间值
+ * 入口参数: 无
+ * 出口参数:无
+ * *********************************/
+void Sand_Data(uint16_t screen1,uint16_t control_id)
+{
+ Sent_Value(screen1,5,Slider_A);
+ Circle_proc(screen1,control_id,271,271+360*Slider_A/100);
+ Sent_Value(screen1,19,Time_setvalue_H);
+ Sent_Value(screen1,28,Time_setvalue_M);
+ Sent_Value(screen1,2,Time_setvalue_S);
+ Sent_Temp(screen1,25,Temp_PV_A);
+}
+
+/***********读列表数据并执行统一运行界面程序*********/
+void Read_Run(void)
+{
+ Power_on=RUN_ON=ON;
+ Key_State(3,21,0);
+ Circle_proc(3,10,271,272);
+ Desplay_Hide(3,10,1);
+ Screen_Change(3);
+}
diff --git a/vendor/yibaina_3061M/demo/rost/HMI.h b/vendor/yibaina_3061M/demo/rost/HMI.h
new file mode 100644
index 0000000000000000000000000000000000000000..74ef6772917ba846d3466412fcbedb672d7fba33
--- /dev/null
+++ b/vendor/yibaina_3061M/demo/rost/HMI.h
@@ -0,0 +1,40 @@
+#include "stdio.h"
+#include "stdint.h"
+#include "debug.h"
+#include "clock.h"
+
+#define CMD_HEAD 0XEE
+#define CMD_TAIL 0XFFFCFFFF
+#define Send_16(P1) Send2_Byte((P1)>>8);Send2_Byte(P1)
+#define Send_32(P1) Send_16((P1)>>16);Send_16((P1)&0xFFFF)
+#define BEGIN_CMD() Send2_Byte(0XEE) //发送帧头
+
+void END_CMD(void);
+void Send2_Byte(uint8_t data1);
+uint16_t Get_Temp_Set(uint16_t screen,uint16_t coutrol);
+uint16_t Get_Time_Set(uint16_t screen_ID,uint16_t coutrol_ID);
+
+void Get_HMI_Instruct(void);
+void System_Reset(void); //系统复位
+void Sent_Value(uint16_t screen_id,uint16_t control_id,uint16_t num);
+void Sent_Temp(uint16_t screen_id,uint16_t control_id,uint16_t num);
+void Read_Text(uint16_t screen,uint16_t coutrol);
+void Send_Text_4(uint16_t screen,uint16_t coutrol,uint8_t Text_1,uint8_t Text_2,uint8_t Text_3,uint8_t Text_4);
+void Desplay_Hide(uint16_t screen_id,uint16_t control_id,uint8_t value); //显示/隐藏控件
+void Disable_enable(uint16_t screen_id,uint16_t control_id,uint8_t value); //禁止控件使能
+void Text_Color(uint16_t screen_id,uint16_t control_id,uint16_t value);
+void Desplay_Icon(uint16_t screen_id,uint16_t control_id,uint8_t value);
+void Key_State(uint16_t screen_id,uint16_t control_id,uint8_t value);
+int8_t Read_Key_value(uint16_t screen_id1,uint16_t control_id1); //读取按键值
+void Read_Key_State(uint16_t screen_id,uint16_t control_id); //读取按键状态
+void Get_Sys_Date_CMD(void);
+void Send_Text_A(uint16_t screen,uint16_t coutrol,char Text);
+void Sent_Time(uint16_t screen_id,uint16_t control_id,uint8_t num);
+void Sent_Char(uint16_t screen_id,uint16_t control_id,uint8_t num);
+void Screen_Change(uint16_t screen_id);
+void Slider_Set(uint16_t screen_id,uint16_t control_id,uint8_t value);
+void Circle_proc(uint16_t screen_id,uint16_t control_id,uint16_t Start_Angle,uint16_t End_Angle);
+uint16_t GetScreen(void);
+void Screen3_Instruct(void); //中心温度设置界面指令处理(screen3)
+void Sand_Data(uint16_t screen1,uint16_t control_id);
+void Read_Run(void); //读列表数据并执行统一运行
\ No newline at end of file
diff --git a/vendor/yibaina_3061M/demo/rost/README.md b/vendor/yibaina_3061M/demo/rost/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..ea97a3bbea573776eddb054908f144b15adeae54
--- /dev/null
+++ b/vendor/yibaina_3061M/demo/rost/README.md
@@ -0,0 +1,45 @@
+## 基于海思MCU智能蒸烤箱控制系统
+
+## 一、前言
+本设计旨在通过上海海思3061M开发板以及无刷电机套件、PID温控等技术实现蒸烤箱的全自动控制等功能。侧重点在于体验海思MCU开发流程,包括开发环境搭建、程序仿真调试下载以及MCU外设配置和应用。
+## 二、设计内容
+单片机控制系统设计
+海思3601M开发套件作为控制核心,负责接收传感器信号、处理用户指令,并根据预设程序控制蒸烤箱的各个部件工作。
+传感器系统设计
+选用热电偶温度传感器,实时监测蒸烤箱内的温度,确保食物在合适的温度下烹饪。
+用户界面设计
+使用大彩3.5”串口屏作为机器用户界面,方便用户进行参数设置和状态查看。
+## 三、设计方法及步骤
+## 系统设计
+根据智能烤箱功能,设计整体系统架构,包括单片机控制系统、传感器系统、固态继电器、加热器、用户界面等,未做箱体。
+
+
+## 硬件设计
+1.MAX6675+热电偶温度传感器采集箱内温度
+2.PWM驱动固态继电器模块加热管加热
+3.3.5寸大彩串口屏显示模式、运行时间
+4. MOSFET控制蒸汽发生器产生蒸汽
+
+## 软件设计
+蒸烤箱设置三种工作模式:蒸模式、烤模式、蒸烤模式
+蒸烤箱工作程序如下:
+加热:程序启动后,电热器开始全功率加热,到达预设温度后由PID控制温度值,对食物加热。
+蒸汽:本设计采用蒸汽发生器产生蒸汽,由MOSFET控制蒸汽发生器工作。
+明确智能蒸烤箱设计功能后,围绕以上功能实现软件逻辑:
+1、参考3061M套件提供SPI样例,实现MAX6675的温度采集
+Temp_PV_A=Get_max6675temp(); //获取温度
+2、通过PWM和PID算法精准控温
+温度调节PID:Temp_PID()
+3、通过UART2通信实现串口屏通信。
+void Send2_Byte(uint8_t data1)
+void Sent_Temp(uint16_t screen_id,uint16_t control_id,uint16_t num)
+4.主控制程序采用轮询方式调用。
+void Main_Control(void)
+
+## 使用方法
+1、在主界面上选择烹饪模式:蒸汽、干烤、蒸烤;
+2、选择烹饪温度;
+3、选择烹饪时间;
+4、按执行工作按钮,进入自动烹饪工作状态;
+5、烹饪结束;
+6、返回主界面。
diff --git a/vendor/yibaina_3061M/demo/rost/control.c b/vendor/yibaina_3061M/demo/rost/control.c
new file mode 100644
index 0000000000000000000000000000000000000000..b4b63476aeb8b95bd904de9ae2554affef23f4dd
--- /dev/null
+++ b/vendor/yibaina_3061M/demo/rost/control.c
@@ -0,0 +1,386 @@
+/**
+ * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+ * following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * @file sample_spi_interrupt_w25q32.c
+ * @author MCU Driver Team
+ * @brief Sample for SPI Module Interrupt.
+ * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash.
+ * Write data and read data to address 0 of W25Q32
+ */
+
+#include "main.h"
+#include "spi.h"
+#include "debug.h"
+#include "stdio.h"
+#include "stdint.h"
+#include "string.h"
+#include "control.h"
+#include "math.h"
+
+extern _Bool Pause_ON,StopStatus,RUN_ON;
+float Temp_Con_Water,mcu_T,Error_setvalue; //冷凝水温度,MCU温度
+float T_A_Error,Temp_probe_AV; //平均温度
+extern uint16_t food_T,Picture_ID,Temp_text_id,Temp_setvalue,Temp_PV_A;
+/********************PID调节变量*******************************************/
+uint8_t Init_A,Power_PARA,Work_Step_A;
+/********************用户预约变量*******************************************/
+extern uint8_t Time_setvalue_H,Time_setvalue_M,Time_setvalue_S,Workmode;
+volatile uint8_t water_pump_time_on,water_pump_time_off;
+extern uint32_t work_time,timerct;
+volatile uint32_t timercnt3;
+extern uint32_t time_setvalue;
+_Bool Temp_flag; //温度到标志位
+
+/********************PID调节变量*******************************************/
+
+volatile uint16_t PWM_ticks,Slider_A;
+volatile uint8_t Power_on,PID_ticks,PID_CAL_A,Timer_EN1;
+uint16_t PWM_A,PWM_B,Power_value;
+uint8_t PWM_out,Power_P,ON_A; //Power_value功率调节因子
+
+/********************调温滑块变量*******************************************/
+uint8_t Control_mode,slider_id; //工作模式Workmode
+
+//蒸汽产生时间参数设置
+void vapor_para(uint8_t pump_time)
+{
+ water_pump_time_on=60;
+ water_pump_time_off=40;
+ if (pump_time==3)
+ {
+ water_pump_time_off=5; //蒸烤模式喷水时长5s
+ water_pump_time_on=50; //喷水时间间隔
+// DBG_PRINTF("pump_time water_pump_time_off2 %d %d \r\n",pump_time,water_pump_time_off);
+ }
+}
+
+/******************加热器温度PID计算***************
+ *函数名:Temp_PID()
+ *串口参数:PID_out:PID值
+ *使用说明:计算温度调节PID值
+ * *********************************/
+
+uint16_t Temp_PID(uint16_t init_value,float error,float PID_I,float PID_P)
+{
+ float Integ=0;
+ float P,I;
+ float PID_out;
+
+ P=(float)(error*PID_P);
+ if((error-Error_setvalue))
+ Integ=Integ+error*PID_I;
+ else Integ=0;
+ I=(float)Integ;
+ PID_out=(uint16_t)(init_value+P+I);
+ if(PID_out>200)
+ PID_out=200;
+ if(PID_out<0)
+ PID_out=0;
+ return PID_out;
+}
+
+/******************加热器温度PID控制****************************
+*函数名:Heater_Control()
+* 入口参数:无
+* 串口参数:无
+*使用说明:加热器PID调节自动控制启停
+*************************************************/
+void Heater_Control()
+{
+ T_A_Error=(float)Temp_setvalue-Temp_PV_A/10;
+ Power_Conj();
+ if(PID_CAL_A==1) //定时计算
+ {
+ PWM_A=Temp_PID(Init_A,T_A_Error,0.02,0.8);
+ PID_CAL_A=0;
+ }
+ if(PWM_ticks=60) && (Power_P<=80)) Power_value=20; //实时温度介于设定值的70~90%之间,80%功率加热
+ if (Power_P>80) Power_value=40; //实时温度大于设定值的90%,70%功率加热
+}
+
+/******************模式A参数设定***********************************************/
+void Mode_Parameter(uint8_t Mode_A)
+{
+ timerct=0; //时间计数清零
+ Control_mode=0; //加热控制方式为定时
+ Init_A=50; //PID调节初始参数
+ Slider_A=0; //进度条比例初始值
+ Desplay_Hide(3,9,0);
+ switch (Mode_A) {
+ case 0:
+ Power_on=0;
+ Pause_ON=OFF; //加热器模拟电源开关关闭
+ Timer_EN1=0;
+ Control_mode=0; //加热控制方式为定时
+ Temp_text_id=4;
+ Desplay_Hide(0,4,1);
+ Desplay_Hide(0,31,0);
+ Desplay_Hide(0,32,0);
+ HAL_TIMER_Stop(&g_timer1); //关闭TIM1
+ HAL_TIMER_Stop(&g_timer0); //关闭TIM0
+ Workmode=1; //工作模式:蒸汽
+ Send_Text_4(3,4,0xD5,0xF4,0xC6,0xFB);
+ Screen_Change(0);
+ break;
+ case 1: //蒸煮模式
+ // strcpy(info, p);
+ Common_para(10); //设置公共参数
+ Control_mode=0; //加热控制方式为定时
+ vapor_para(1); //喷水时间参数
+ Work_Step_A=1; //工作流程1
+ Send_Text_4(3,4,0xD5,0xF4,0xC6,0xFB);
+ break;
+ case 2: //干烤模式
+ Common_para(10); //设置公共参数
+ Control_mode=0; //加热控制方式为定时
+ Work_Step_A=2; //工作流程2
+ Send_Text_4(3,4,0xB8,0xC9,0xBF,0xBE);
+ HAL_TIMER_Stop(&g_timer1); //关闭TIM1
+ break;
+ case 3: //蒸烤模式
+ Common_para(10); //设置公共参数
+ Control_mode=0; //加热控制方式为定时
+ vapor_para(3); //喷水时间参数
+ Work_Step_A=3; //工作流程3
+ Send_Text_4(3,4,0xD5,0xF4,0xBF,0xBE);
+ break;
+ default:
+ break;
+ }
+}
+
+/******************公共参数设置*****************
+ * 函数名;Common_para(uint8_t slider_no)
+ * 功能:公共参数设置
+ * 入口参数:uint8_t slider_no,进度条选择
+ * 串口参数:无
+ * *********************************************/
+void Common_para(uint8_t slider_no)
+{
+ Power_on=ON;
+ Timer_EN1=ON;
+ Pause_ON=OFF;
+ timerct=0;
+ slider_id=slider_no;
+ Circle_proc(3,slider_no,271,272);
+ Desplay_Hide(3,10,1);
+ HAL_TIMER_Start(&g_timer1);
+ HAL_TIMER_Start(&g_timer0);
+ HAL_TIMER_Start(&g_timer2);
+ Screen_Change(3);
+}
+
+/******************加热主控制A***********************************************/
+void Main_Control(void)
+{
+ switch(Work_Step_A)
+ {
+ case 0:
+ Screen_Change(0);
+ break;
+ case 1: //蒸模式
+ Heater_Control();
+ if ((time_setvalue-timerct)<=0)
+ {
+ DBG_PRINTF("时间到: \r\n");
+ End_Control();
+ break;
+ }
+ if ((fabs(T_A_Error)<=3) || ((Temp_PV_A/10)>(float)Temp_setvalue)) Heater_power(0);
+ else Heater_power(Power_value);
+ break;
+ case 2: //烤模式
+ Heater_Control();
+ if ((time_setvalue-timerct)<=0)
+ {
+ DBG_PRINTF("时间到: \r\n");
+ End_Control();
+ break;
+ }
+ if ((fabs(T_A_Error)<=3) || ((Temp_PV_A/10)>(float)Temp_setvalue)) Heater_power(0);
+ else Heater_power(Power_value);
+ break;
+ case 3: //蒸烤模式
+ Heater_Control();
+ if ((time_setvalue-timerct)<=0)
+ {
+ DBG_PRINTF("时间到: \r\n");
+ End_Control();
+ break;
+ }
+ if ((fabs(T_A_Error)<=3) || ((Temp_PV_A/10)>((float)Temp_setvalue))) Heater_power(0);
+ else Heater_power(Power_value);
+ break;
+ default:
+ break;
+ }
+}
+
+/**********************************
+ * 函数名:End_Control
+ * 功能:烹饪流程结束时,系统参数恢复
+ * 入口参数:无
+ * 串口参数:无
+**********************************/
+void End_Control(void)
+{
+ Power_on=OFF;
+ RUN_ON=OFF;
+ Pause_ON=OFF;
+ Time_setvalue_H=0;
+ Time_setvalue_M=0;
+ Time_setvalue_S=0;
+ Water_P_con(OFF);
+ Heater_power(0);
+ Work_Step_A=0;
+ timerct=0;
+ timercnt3=0;
+ Workmode=0;
+ FanMotor_con(OFF);
+ HAL_TIMER_Stop(&g_timer1);
+ HAL_TIMER_Stop(&g_timer0);
+ HAL_TIMER_Stop(&g_timer2);
+ Desplay_Hide(3,slider_id,0);
+ Desplay_Hide(3,9,1);
+ DBG_PRINTF("Rost End \r\n");
+ BASE_FUNC_DelayMs(1000);
+ Screen_Change(2);
+ return;
+}
+
+
+void TIMER1_InterruptProcess(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ {
+ if (Power_on)
+ {
+ timercnt3++;//计时自加1
+ if((timercnt3%water_pump_time_on)==0)//12s
+ {
+ Heater_power(100);
+ BASE_FUNC_DelayMs(200);
+ }
+ if(timercnt3%(water_pump_time_on+water_pump_time_off)==0)
+ {
+ timercnt3=0;
+ }
+ }
+ if(timercnt3>65000)
+ {
+ timercnt3=0;
+ }
+ }
+ /* USER CODE END TIMER2_InterruptProcess */
+}
+
+void TIMER2_InterruptProcess(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+// if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
+ {
+ PWM_ticks++;
+ PID_ticks++;
+ if(PWM_ticks>=200)
+ PWM_ticks=0;
+ if (PWM_ticks>40)
+ {
+ PID_CAL_A=1;
+ PID_ticks=0;
+ }
+
+ }
+}
+static unsigned char g_rxStr =0;
+static unsigned char g_txStr =0xff;
+
+
+//读温度
+/*
+********************************************************************************
+** @name : Get_max6675temp
+** @函数功能 : 获取MAX6675读取的热电偶的值
+** @函数说明 :K型热电偶读取函数
+** @输出参数 :成功返回TRUE 否者热电偶
+********************************************************************************
+*/
+
+int Get_max6675temp(void)
+{
+ uint8_t flag;
+ uint16_t i,t,t1;
+ float temprature;
+ MAX6675_CSL();
+
+ HAL_SPI_WriteReadIT(&g_spi0, &g_rxStr,&g_txStr,1);
+ i= g_rxStr<<8;
+ HAL_SPI_WriteReadIT(&g_spi0,&g_rxStr,&g_txStr,1);
+ i = i|g_rxStr;
+ MAX6675_CSH();
+ flag = i&0x04;
+ t = i>>3;
+ temprature =(float)1023.75*t/4096;
+ t1=(uint16_t)(temprature*100)/10;
+ if(i!=0)
+ {
+ if(flag==0)
+ {
+ DBG_PRINTF("temperature test:%d %f \r\n",t1,temprature);
+ }
+ }
+ else
+ {
+ DBG_PRINTF("The thermocouple is not connected\r\n");
+ }
+ return t1;
+}
diff --git a/vendor/yibaina_3061M/demo/rost/control.h b/vendor/yibaina_3061M/demo/rost/control.h
new file mode 100644
index 0000000000000000000000000000000000000000..1a92a13730291e1a1a72eafa5f5c03be4447506c
--- /dev/null
+++ b/vendor/yibaina_3061M/demo/rost/control.h
@@ -0,0 +1,30 @@
+#ifndef _MAX6675_H
+#define _MAX6675_H
+
+#include "stdio.h"
+#include "stdint.h"
+#include "main.h"
+#include "debug.h"
+#include "gpio.h"
+#include "iocmg_ip.h"
+
+//#define MAX6675_CS_PORT GPIOA
+#define MAX6675_CS_PIN GPIO_PIN_5
+#define MAX6675_CSL() HAL_SPI_SetChipConfigSelectEx(&g_spi0, HAL_SPI_CHIP_CONFIG_SOFR_UNSET)
+#define MAX6675_CSH() HAL_SPI_SetChipConfigSelectEx(&g_spi0, HAL_SPI_CHIP_CONFIG_SOFR_SET)
+
+int Get_max6675temp(void);
+uint16_t Temp_PID(uint16_t init_value,float error,float PID_I,float PID_P);
+
+void Heater_Control(void);
+void Time_Control(void);
+
+void Main_Control(void);
+void Mode_Parameter(uint8_t Mode_A); //模式参数设置值
+void vapor_para(uint8_t pump_time); //蒸汽产生时间参数设置
+void Heater_power(uint16_t n);
+void Power_Conj(void); //加热功率PWM占空比因子调节函数
+void End_Control(void); //烹饪流程结束时系统参数重置
+void Common_para(uint8_t slider_no); //公共参数设置
+
+#endif
diff --git a/vendor/yibaina_3061M/demo/rost/generatecode/feature.h b/vendor/yibaina_3061M/demo/rost/generatecode/feature.h
new file mode 100644
index 0000000000000000000000000000000000000000..1e8331dc3060e84d7aeff4e361c01c89a64f344f
--- /dev/null
+++ b/vendor/yibaina_3061M/demo/rost/generatecode/feature.h
@@ -0,0 +1,119 @@
+/**
+ * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+ * following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * @file feature.h
+ * @author MCU Driver Team
+ * @brief This file contains macro configurations related to the project. This file is generated by the IDE tool.
+ */
+
+#ifndef McuMagicTag_FEATURE_H
+#define McuMagicTag_FEATURE_H
+
+/* Macro definitions --------------------------------------------------------- */
+#define CHIP_3061MNPICA MACRO_ENABLE
+
+#define MACRO_ENABLE 1
+#define MACRO_DISABLE 0
+
+/* Macro switch */
+#define BASE_DEFINE_USE_ASSERT MACRO_ENABLE
+#ifndef FLASH_CRC_CONFIG
+#define FLASH_CRC_CONFIG
+#endif /* #ifndef FLASH_CRC_CONFIG */
+#define BASE_MATH_SINCOS_MIDDLE_TABLE MACRO_ENABLE /**< This macro is used to control the table type when the
+ BASE_MATH_GetSinCos() queries the table. When the value of
+ this macro is MACRO_ENABLE, the error value obtained by the
+ BASE_MATH_GetSinCos() is relatively small, and the return
+ value of the function may be greater than or less than the
+ actual value. When the value of this macro is MACRO_DISABLE,
+ the error value obtained by the BASE_MATH_GetSinCos() is
+ relatively large. However, in the range [0°, 180°) and
+ [180°, 360°), the return value of the function is either
+ greater than or less than the actual value. */
+
+#define MCS_PARAM_CHECK MACRO_ENABLE
+#define APT_PARAM_CHECK MACRO_ENABLE
+#define ADC_PARAM_CHECK MACRO_ENABLE
+#define CAPM_PARAM_CHECK MACRO_ENABLE
+#define CRG_PARAM_CHECK MACRO_ENABLE
+#define I2C_PARAM_CHECK MACRO_ENABLE
+#define UART_PARAM_CHECK MACRO_ENABLE
+#define SPI_PARAM_CHECK MACRO_ENABLE
+#define TIMER_PARAM_CHECK MACRO_ENABLE
+#define IWDG_PARAM_CHECK MACRO_ENABLE
+#define WWDG_PARAM_CHECK MACRO_ENABLE
+#define GPIO_PARAM_CHECK MACRO_ENABLE
+#define GPT_PARAM_CHECK MACRO_ENABLE
+#define DMA_PARAM_CHECK MACRO_ENABLE
+#define CRC_PARAM_CHECK MACRO_ENABLE
+#define CFD_PARAM_CHECK MACRO_ENABLE
+#define CMM_PARAM_CHECK MACRO_ENABLE
+#define CAN_PARAM_CHECK MACRO_ENABLE
+#define FLASH_PARAM_CHECK MACRO_ENABLE
+#define PMC_PARAM_CHECK MACRO_ENABLE
+#define ACMP_PARAM_CHECK MACRO_ENABLE
+#define DAC_PARAM_CHECK MACRO_ENABLE
+#define PGA_PARAM_CHECK MACRO_ENABLE
+#define IOCMG_PARAM_CHECK MACRO_ENABLE
+#define QDM_PARAM_CHECK MACRO_ENABLE
+
+/* Peripheral module macro switch--------------------------------------------- */
+#define BOARD_DIM_NUM 1 /**< Number of dimming handle arrays. */
+
+#define BOARD_KEY_NUM 10 /**< Number of key handle arrays. */
+#define BOARD_KEY_PRESS_ON GPIO_HIGH_LEVEL /**< GPIO status corresponding to long press valid. */
+#define BOARD_KEY_PRESS_OFF GPIO_LOW_LEVEL /**< GPIO status corresponding to short press valid. */
+
+#define BOARD_LED_SEG_NUM 4 /**< Number of segments. */
+#define BOARD_LED_SEGMENT_ON GPIO_HIGH_LEVEL /**< GPIO level status corresponding to valid segments. */
+#define BOARD_LED_SEGMENT_OFF GPIO_LOW_LEVEL /**< GPIO level status corresponding to invalid segments. */
+
+#define BOARD_MKEY_SCHEME_NUMBER BOARD_MKEY_SCHEME_NUMBER_ONE /**< Define the scheme to be adopted. */
+#define BOARD_MKEY_OUT_NUM 4 /**< Number of GPIO pins used as output during scanning. */
+#define BOARD_MKEY_IN_NUM 4 /**< Number of GPIO pins used as input during scanning. */
+#define BOARD_MKEY_OUT_PIN_VALID GPIO_LOW_LEVEL /**< GPIO level status corresponding to the valid \
+ status of the output GPIO in the key matrix. */
+#define BOARD_MKEY_OUT_PIN_INVALID GPIO_HIGH_LEVEL /**< GPIO level status corresponding to the \
+ invalid status of the output GPIO in the key matrix. */
+#define BOARD_MKEY_IN_PIN_VALID GPIO_LOW_LEVEL /**< Indicates the GPIO level corresponding to the \
+ valid status of the input GPIO in the key matrix. */
+#define BOARD_MKEY_IN_PIN_INVALID GPIO_HIGH_LEVEL /**< Indicates the GPIO level corresponding to the \
+ invalid status of the input GPIO in the key matrix. */
+
+#define BOARD_PULSES_NUM 2 /**< Number of pulse handles. */
+
+#define BASE_DEFINE_SLIPAVERAGE_NUM 2 /**< Sliding average array length. */
+
+#define LISTNODE_MAX 20
+
+#define BASE_DEFINE_DMA_QUICKSTART
+
+#define XTRAIL_FREQ 30000000U
+
+#define DBG_USE_NO_PRINTF 0U
+#define DBG_USE_UART_PRINTF 1U
+
+#define DBG_PRINTF_USE DBG_USE_UART_PRINTF
+#if (DBG_PRINTF_USE == DBG_USE_UART_PRINTF)
+#define DBG_PRINTF_UART_PORT UART0
+#endif
+
+/* USER CODE BEGIN 0 */
+/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */
+/* USER CODE END 0 */
+
+#endif /* McuMagicTag_FEATURE_H */
\ No newline at end of file
diff --git a/vendor/yibaina_3061M/demo/rost/generatecode/main.h b/vendor/yibaina_3061M/demo/rost/generatecode/main.h
new file mode 100644
index 0000000000000000000000000000000000000000..8f0ddfc02a4052db0af8b4980faee42ce2946385
--- /dev/null
+++ b/vendor/yibaina_3061M/demo/rost/generatecode/main.h
@@ -0,0 +1,108 @@
+/**
+ * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+ * following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * @file main.h
+ * @author MCU Driver Team
+ * @brief This file contains driver init functions.
+ */
+
+/* Define to prevent recursive inclusion ------------------------------------- */
+#ifndef McuMagicTag_SYSTEM_INIT_H
+#define McuMagicTag_SYSTEM_INIT_H
+
+#include "uart.h"
+#include "uart_ex.h"
+#include "spi.h"
+#include "spi_ex.h"
+#include "gpio.h"
+#include "crg.h"
+#include "dma.h"
+#include "dma_ex.h"
+#include "iocmg.h"
+#include "gpt.h"
+#include "gpt_ex.h"
+#include "timer.h"
+#include "timer_ex.h"
+#include "stdio.h"
+#include "stdint.h"
+#include "debug.h"
+#include "control.h"
+#include "hmi.h"
+#include "clock.h"
+
+#define IO_SPEED_FAST 0x00U
+#define IO_SPEED_SLOW 0x01U
+
+#define IO_DRV_LEVEL4 0x00U
+#define IO_DRV_LEVEL3 0x01U
+#define IO_DRV_LEVEL2 0x02U
+#define IO_DRV_LEVEL1 0x03U
+
+#define XTAL_DRV_LEVEL4 0x03U
+#define XTAL_DRV_LEVEL3 0x02U
+#define XTAL_DRV_LEVEL2 0x01U
+#define XTAL_DRV_LEVEL1 0x00U
+#define ON 1
+#define OFF 0
+#define Water_P_con(n) HAL_GPIO_SetValue(&g_gpio4, GPIO_PIN_6, n) //纯净水电磁阀控制端口接在mosfet6,1--导通,0--截止继 //修改PWM占空比
+#define FanMotor_con(n) HAL_GPIO_SetValue(&g_gpio4, GPIO_PIN_5, n) //风机电机控制端口接在继电器3,1--风机开,0--风机关
+
+extern UART_Handle g_uart0;
+extern UART_Handle g_uart2;
+extern SPI_Handle g_spi0;
+extern DMA_Handle g_dmac;
+extern GPIO_Handle g_gpio4;
+extern GPT_Handle g_gptHandle;
+extern TIMER_Handle g_timer0;
+extern TIMER_Handle g_timer1;
+extern TIMER_Handle g_timer2;
+extern TIMER_Handle g_timer3;
+//extern TIMER_Handle g_timer3;
+
+BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect);
+void SystemInit(void);
+void GPT2_Init(void);
+void Cmd_buff_Clear(void);
+//void TIMER3_Init(uint16_t arr);
+void UART0WriteInterruptCallback(void *handle);
+void UART0ReadInterruptCallback(void *handle);
+void UART2WriteInterruptCallback(void *handle);
+void UART2ReadInterruptCallback(void *handle);
+
+void UART2InterruptErrorCallback(void *handle);
+void UART0InterruptErrorCallback(void *handle);
+
+void UART2_TXDMACallback(void *handle);
+void UART2_RXDMACallback(void *handle);
+void HAL_UART2_IrqHandler(void *handle);
+
+void SPI0TXCallback(void *handle);
+void SPI0RXCallback(void *handle);
+void SPI0TXRXCallback(void *handle);
+void SPI0ErrorCallback(void *handle);
+void SPI0CsCallback(void *handle);
+
+void TIMER2_InterruptProcess(void *handle);
+void TIMER0_InterruptProcess(void *handle);
+void TIMER1_InterruptProcess(void *handle);
+void TIMER3_InterruptProcess(void *handle);
+
+/* USER CODE BEGIN 0 */
+/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */
+/* USER CODE END 0 */
+
+#endif /* McuMagicTag_SYSTEM_INIT_H */
\ No newline at end of file
diff --git a/vendor/yibaina_3061M/demo/rost/generatecode/system_init.c b/vendor/yibaina_3061M/demo/rost/generatecode/system_init.c
new file mode 100644
index 0000000000000000000000000000000000000000..081f14b2726151cfb72a672a9c1933ab48b3023f
--- /dev/null
+++ b/vendor/yibaina_3061M/demo/rost/generatecode/system_init.c
@@ -0,0 +1,486 @@
+/**
+ * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+ * following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * @file system_init.c
+ * @author MCU Driver Team
+ * @brief This file contains driver init functions.
+ */
+
+#include "main.h"
+#include "ioconfig.h"
+#include "iocmg_ip.h"
+#include "stdint.h"
+#include "stdio.h"
+
+#define UART0_BAND_RATE 115200
+#define UART2_BAND_RATE 115200
+
+#define SPI0_FREQ_SCR 2
+#define SPI0_FREQ_CPSDVSR 50
+uint8_t g_rxStr[64]={0x0};
+volatile _Bool rxDMAFlag;
+
+//TIMER_Handle g_timer3;
+
+BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect)
+{
+ CRG_Handle crg;
+ crg.baseAddress = CRG;
+ crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC;
+ crg.pllPreDiv = CRG_PLL_PREDIV_4;
+ crg.pllFbDiv = 48; /* PLL Multiplier 48 */
+ crg.pllPostDiv = CRG_PLL_POSTDIV_2;
+ crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL;
+ crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3;
+ crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC;
+ crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */
+
+ if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) {
+ return BASE_STATUS_ERROR;
+ }
+ *coreClkSelect = crg.coreClkSelect;
+ return BASE_STATUS_OK;
+}
+
+
+static void GPIO_Init(void)
+{
+ HAL_CRG_IpEnableSet(GPIO4_BASE, IP_CLK_ENABLE);
+ g_gpio4.baseAddress = GPIO4;
+
+ g_gpio4.pins = GPIO_PIN_5; //风机控制
+ HAL_GPIO_Init(&g_gpio4);
+ HAL_GPIO_SetDirection(&g_gpio4, g_gpio4.pins, GPIO_INPUT_MODE);
+ HAL_GPIO_SetValue(&g_gpio4, g_gpio4.pins, GPIO_LOW_LEVEL);
+ HAL_GPIO_SetIrqType(&g_gpio4, g_gpio4.pins, GPIO_INT_TYPE_NONE);
+ g_gpio4.pins = GPIO_PIN_6; //水泵控制
+ HAL_GPIO_Init(&g_gpio4);
+ HAL_GPIO_SetDirection(&g_gpio4, g_gpio4.pins, GPIO_INPUT_MODE);
+ HAL_GPIO_SetValue(&g_gpio4, g_gpio4.pins, GPIO_LOW_LEVEL);
+ HAL_GPIO_SetIrqType(&g_gpio4, g_gpio4.pins, GPIO_INT_TYPE_NONE);
+ return;
+}
+
+__weak void SPI0TXCallback(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN SPI0TXCallback */
+ /* USER CODE END SPI0TXCallback */
+}
+
+__weak void SPI0RXCallback(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN SPI0RXCallback */
+ /* USER CODE END SPI0RXCallback */
+}
+
+__weak void SPI0TXRXCallback(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN SPI0TXRXCallback */
+ /* USER CODE END SPI0TXRXCallback */
+}
+
+__weak void SPI0ErrorCallback(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN SPI0ErrorCallback */
+ /* USER CODE END SPI0ErrorCallback */
+}
+
+__weak void SPI0CsCallback(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN SPI0CsCallback */
+ /* USER CODE END SPI0CsCallback */
+}
+
+static void SPI0_Init(void)
+{
+ HAL_CRG_IpEnableSet(SPI0_BASE, IP_CLK_ENABLE); /* SPI0 clock enable. */
+ g_spi0.baseAddress = SPI0;
+
+ g_spi0.mode = HAL_SPI_MASTER;
+ g_spi0.csMode = SPI_CHIP_SELECT_MODE_CALLBACK;
+ g_spi0.xFerMode = HAL_XFER_MODE_INTERRUPTS;
+ g_spi0.clkPolarity = HAL_SPI_CLKPOL_0;
+ g_spi0.clkPhase = HAL_SPI_CLKPHA_1;
+ g_spi0.endian = HAL_SPI_BIG_ENDIAN;
+ g_spi0.frameFormat = HAL_SPI_MODE_MOTOROLA;
+ g_spi0.dataWidth = SPI_DATA_WIDTH_8BIT;
+ g_spi0.freqScr = SPI0_FREQ_SCR;
+ g_spi0.freqCpsdvsr = SPI0_FREQ_CPSDVSR;
+ g_spi0.waitEn = BASE_CFG_DISABLE;
+ g_spi0.waitVal = 127; /* 127 is microwire wait time */
+ g_spi0.rxBuff = NULL;
+ g_spi0.txBuff = NULL;
+ g_spi0.transferSize = 0;
+ g_spi0.txCount = 0;
+ g_spi0.rxCount = 0;
+ g_spi0.state = HAL_SPI_STATE_RESET;
+ g_spi0.rxIntSize = SPI_RX_INTERRUPT_SIZE_1;
+ g_spi0.txIntSize = SPI_TX_INTERRUPT_SIZE_1;
+ g_spi0.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1;
+ g_spi0.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1;
+ HAL_SPI_Init(&g_spi0);
+
+ HAL_SPI_RegisterCallback(&g_spi0, SPI_TX_COMPLETE_CB_ID, SPI0TXCallback);
+ HAL_SPI_RegisterCallback(&g_spi0, SPI_RX_COMPLETE_CB_ID, SPI0RXCallback);
+ HAL_SPI_RegisterCallback(&g_spi0, SPI_TX_RX_COMPLETE_CB_ID, SPI0TXRXCallback);
+ HAL_SPI_RegisterCallback(&g_spi0, SPI_ERROR_CB_ID, SPI0ErrorCallback);
+ HAL_SPI_RegisterCallback(&g_spi0, SPI_CS_CB_ID, SPI0CsCallback);
+ IRQ_Register(IRQ_SPI0, HAL_SPI_IrqHandler, &g_spi0);
+ IRQ_SetPriority(IRQ_SPI0, 1); /* 1 is priority value */
+ IRQ_EnableN(IRQ_SPI0);
+ HAL_SPI_ChipSelectChannelSet(&g_spi0, SPI_CHIP_SELECT_CHANNEL_0);
+}
+
+__weak void UART0InterruptErrorCallback(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN UART0_TRNS_IT_ERROR */
+ /* USER CODE END UART0_TRNS_IT_ERROR */
+}
+
+__weak void UART0WriteInterruptCallback(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN UART0_WRITE_IT_FINISH */
+ /* USER CODE END UART0_WRITE_IT_FINISH */
+}
+
+__weak void UART0ReadInterruptCallback(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN UART0_READ_IT_FINISH */
+ /* USER CODE END UART0_READ_IT_FINISH */
+}
+
+static void UART0_Init(void)
+{
+ HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */
+ g_uart0.baseAddress = UART0;
+
+ g_uart0.baudRate = UART0_BAND_RATE;
+ g_uart0.dataLength = UART_DATALENGTH_8BIT;
+ g_uart0.stopBits = UART_STOPBITS_ONE;
+ g_uart0.parity = UART_PARITY_NONE;
+ g_uart0.txMode = UART_MODE_INTERRUPT;
+ g_uart0.rxMode = UART_MODE_INTERRUPT;
+ g_uart0.fifoMode = BASE_CFG_ENABLE;
+ g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8;
+ g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8;
+ g_uart0.hwFlowCtr = BASE_CFG_DISABLE;
+ g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X;
+ g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE;
+ HAL_UART_Init(&g_uart0);
+ HAL_UART_RegisterCallBack(&g_uart0, UART_TRNS_IT_ERROR, (UART_CallbackType)UART0InterruptErrorCallback);
+ HAL_UART_RegisterCallBack(&g_uart0, UART_WRITE_IT_FINISH, (UART_CallbackType)UART0WriteInterruptCallback);
+ HAL_UART_RegisterCallBack(&g_uart0, UART_READ_IT_FINISH, (UART_CallbackType)UART0ReadInterruptCallback);
+ IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart0);
+ IRQ_SetPriority(IRQ_UART0, 1); /* 1 is priority value */
+ IRQ_EnableN(IRQ_UART0);
+}
+
+__weak void UART2InterruptErrorCallback(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN UART2_TRNS_IT_ERROR */
+ /* USER CODE END UART2_TRNS_IT_ERROR */
+}
+
+__weak void UART2WriteInterruptCallback(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN UART2_WRITE_IT_FINISH */
+ /* USER CODE END UART2_WRITE_IT_FINISH */
+}
+
+__weak void UART2ReadInterruptCallback(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN UART2_READ_IT_FINISH */
+ DBG_PRINTF("UART2_Irq \r\n");
+ /* USER CODE END UART2_READ_IT_FINISH */
+}
+
+static void UART2_Init(void)
+{
+ HAL_CRG_IpEnableSet(UART2_BASE, IP_CLK_ENABLE); /* UART2 clock enable. */
+ g_uart2.baseAddress = UART2;
+
+ g_uart2.baudRate = UART2_BAND_RATE;
+// g_uart2.baudRate = bound;
+ g_uart2.dataLength = UART_DATALENGTH_8BIT;
+ g_uart2.stopBits = UART_STOPBITS_ONE;
+ g_uart2.parity = UART_PARITY_NONE;
+ g_uart2.txMode = UART_MODE_BLOCKING;
+ g_uart2.rxMode = UART_MODE_INTERRUPT;
+ g_uart2.fifoMode = BASE_CFG_ENABLE;
+ g_uart2.fifoTxThr = UART_FIFODEPTH_SIZE8;
+ g_uart2.fifoRxThr = UART_FIFODEPTH_SIZE8;
+ g_uart2.hwFlowCtr = BASE_CFG_DISABLE;
+ g_uart2.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X;
+ g_uart2.handleEx.msbFirst = BASE_CFG_DISABLE;
+ HAL_UART_Init(&g_uart2);
+ HAL_UART_RegisterCallBack(&g_uart2, UART_TRNS_IT_ERROR, (UART_CallbackType)UART2InterruptErrorCallback);
+ HAL_UART_RegisterCallBack(&g_uart2, UART_WRITE_IT_FINISH, (UART_CallbackType)UART2WriteInterruptCallback);
+ HAL_UART_RegisterCallBack(&g_uart2, UART_READ_IT_FINISH, (UART_CallbackType)UART2ReadInterruptCallback);
+ IRQ_Register(IRQ_UART2, HAL_UART_IrqHandler, &g_uart2);
+ IRQ_SetPriority(IRQ_UART2, 1); /* 1 is priority value */
+ IRQ_EnableN(IRQ_UART2);
+}
+
+void GPT2_Init(void)
+{
+ HAL_CRG_IpEnableSet(GPT2_BASE, IP_CLK_ENABLE);
+
+ g_gptHandle.baseAddress = GPT2;
+ g_gptHandle.clockDiv = 10 - 1; /* 10 is the internal frequency division of GPT */
+ g_gptHandle.period = 49999; /* 49999 is the number of GPT counting cycles. */
+ g_gptHandle.refA0.refdot = 25000; /* 10000 is the value of PWM reference point A. */
+ g_gptHandle.refA0.refAction = GPT_ACTION_OUTPUT_HIGH; /* GPT Action High */
+ g_gptHandle.refB0.refdot = 25000; /* 20000 is the value of PWM reference point B. */
+ g_gptHandle.refB0.refAction = GPT_ACTION_OUTPUT_LOW; /* GPT Action Low */
+ g_gptHandle.bufLoad = BASE_CFG_ENABLE;
+ g_gptHandle.pwmKeep = BASE_CFG_ENABLE;
+ g_gptHandle.handleEx.periodIntEnable = BASE_CFG_DISABLE;
+ g_gptHandle.handleEx.outputFinIntEnable = BASE_CFG_DISABLE;
+ g_gptHandle.triggleAdcOutFinish = BASE_CFG_DISABLE;
+ g_gptHandle.triggleAdcPeriod = BASE_CFG_DISABLE;
+
+ HAL_GPT_Init(&g_gptHandle);
+
+}
+
+__weak void TIMER0_InterruptProcess(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN TIMER0_InterruptProcess */
+ /* USER CODE END TIMER0_InterruptProcess */
+}
+
+static void TIMER0_Init(void)
+{
+ HAL_CRG_IpEnableSet(TIMER0_BASE, IP_CLK_ENABLE); /* TIMER0 clock enable. */
+ unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER0) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 1000000;
+
+ g_timer0.baseAddress = TIMER0;
+ g_timer0.load = load - 1; /* Set timer value immediately */
+ g_timer0.bgLoad = load - 1; /* Set timer value */
+ g_timer0.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */
+ g_timer0.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */
+ g_timer0.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */
+ g_timer0.interruptEn = BASE_CFG_ENABLE;
+ g_timer0.adcSocReqEnable = BASE_CFG_DISABLE;
+ g_timer0.dmaReqEnable = BASE_CFG_DISABLE;
+ HAL_TIMER_Init(&g_timer0);
+ IRQ_Register(IRQ_TIMER0, HAL_TIMER_IrqHandler, &g_timer0);
+
+ HAL_TIMER_RegisterCallback(&g_timer0, TIMER_PERIOD_FIN, TIMER0_InterruptProcess);
+ IRQ_SetPriority(IRQ_TIMER0, 1); /* 1 is priority value */
+ IRQ_EnableN(IRQ_TIMER0);
+}
+
+__weak void TIMER1_InterruptProcess(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN TIMER1_InterruptProcess */
+ /* USER CODE END TIMER1_InterruptProcess */
+}
+
+static void TIMER1_Init(void)
+{
+ HAL_CRG_IpEnableSet(TIMER1_BASE, IP_CLK_ENABLE); /* TIMER1 clock enable. */
+ unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER1) / (1u << (TIMERPRESCALER_DIV_256 * 4)) / 1000000u) * 1000000;
+
+ g_timer1.baseAddress = TIMER1;
+ g_timer1.load = load - 1; /* Set timer value immediately */
+ g_timer1.bgLoad = load - 1; /* Set timer value */
+ g_timer1.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */
+ g_timer1.prescaler = TIMERPRESCALER_DIV_256; /* Don't frequency division */
+ g_timer1.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */
+ g_timer1.interruptEn = BASE_CFG_ENABLE;
+ g_timer1.adcSocReqEnable = BASE_CFG_DISABLE;
+ g_timer1.dmaReqEnable = BASE_CFG_DISABLE;
+ HAL_TIMER_Init(&g_timer1);
+ IRQ_Register(IRQ_TIMER1, HAL_TIMER_IrqHandler, &g_timer1);
+
+ HAL_TIMER_RegisterCallback(&g_timer1, TIMER_PERIOD_FIN, TIMER1_InterruptProcess);
+ IRQ_SetPriority(IRQ_TIMER1, 1); /* 1 is priority value */
+ IRQ_EnableN(IRQ_TIMER1);
+}
+
+__weak void TIMER2_InterruptProcess(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN TIMER2_InterruptProcess */
+ /* USER CODE END TIMER2_InterruptProcess */
+}
+
+static void TIMER2_Init(void)
+{
+ HAL_CRG_IpEnableSet(TIMER2_BASE, IP_CLK_ENABLE); /* TIMER2 clock enable. */
+ unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER2) / (1u << (TIMERPRESCALER_DIV_256 * 4)) / 1000000u) * 100000;
+
+ g_timer2.baseAddress = TIMER2;
+ g_timer2.load = load - 1; /* Set timer value immediately */
+ g_timer2.bgLoad = load - 1; /* Set timer value */
+ g_timer2.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */
+ g_timer2.prescaler = TIMERPRESCALER_DIV_256; /* Don't frequency division */
+ g_timer2.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */
+ g_timer2.interruptEn = BASE_CFG_ENABLE;
+ g_timer2.adcSocReqEnable = BASE_CFG_DISABLE;
+ g_timer2.dmaReqEnable = BASE_CFG_DISABLE;
+ HAL_TIMER_Init(&g_timer2);
+ IRQ_Register(IRQ_TIMER2, HAL_TIMER_IrqHandler, &g_timer2);
+
+ HAL_TIMER_RegisterCallback(&g_timer2, TIMER_PERIOD_FIN, TIMER2_InterruptProcess);
+ IRQ_SetPriority(IRQ_TIMER2, 1); /* 1 is priority value */
+ IRQ_EnableN(IRQ_TIMER2);
+}
+__weak void TIMER3_InterruptProcess(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ /* USER CODE BEGIN TIMER2_InterruptProcess */
+ /* USER CODE END TIMER2_InterruptProcess */
+}
+
+static void TIMER3_Init(void)
+{
+ HAL_CRG_IpEnableSet(TIMER3_BASE, IP_CLK_ENABLE); /* TIMER2 clock enable. */
+ unsigned int load = 0;
+ load = (HAL_CRG_GetIpFreq((void *)TIMER3) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 5000;
+ g_timer3.baseAddress = TIMER3;
+ g_timer3.load = load - 1; /* Set timer value immediately */
+ g_timer3.bgLoad = load - 1; /* Set timer value */
+ g_timer3.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */
+ g_timer3.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */
+ g_timer3.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */
+ g_timer3.interruptEn = BASE_CFG_ENABLE;
+ g_timer3.adcSocReqEnable = BASE_CFG_DISABLE;
+ g_timer3.dmaReqEnable = BASE_CFG_DISABLE;
+ HAL_TIMER_Init(&g_timer3);
+ IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3);
+
+ HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess);
+ IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */
+ IRQ_EnableN(IRQ_TIMER3);
+ HAL_TIMER_Start(&g_timer3);
+ HAL_TIMER_Init(&g_timer3);
+ IRQ_Register(IRQ_TIMER3, HAL_TIMER_IrqHandler, &g_timer3);
+
+ HAL_TIMER_RegisterCallback(&g_timer3, TIMER_PERIOD_FIN, TIMER3_InterruptProcess);
+ IRQ_SetPriority(IRQ_TIMER3, 1); /* 1 is priority value */
+ IRQ_EnableN(IRQ_TIMER3);
+}
+
+static void IOConfig(void)
+{
+ SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0;
+ SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1;
+ /* Config PIN16 风机控制*/
+ HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_GPIO4_5); /* Check function selection */
+ HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_GPIO4_5, PULL_NONE); /* Pull-up and Pull-down */
+ HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_GPIO4_5, SCHMIDT_DISABLE); /* Schmitt input on/off */
+ HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_GPIO4_5, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
+ HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_GPIO4_5, DRIVER_RATE_2); /* Output signal edge fast/slow */
+ /* Config PIN17 水泵控制控制*/
+ HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_GPIO4_6); /* Check function selection */
+ HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_GPIO4_6, PULL_NONE); /* Pull-up and Pull-down */
+ HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_GPIO4_6, SCHMIDT_DISABLE); /* Schmitt input on/off */
+ HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_GPIO4_6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
+ HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_GPIO4_6, DRIVER_RATE_2); /* Output signal edge fast/slow */
+ /* Config PIN6 */
+ HAL_IOCMG_SetPinAltFuncMode(GPIO5_2_AS_GPT2_PWM); /* Check function selection */
+ HAL_IOCMG_SetPinPullMode(GPIO5_2_AS_GPT2_PWM, PULL_NONE); /* Pull-up and Pull-down */
+ HAL_IOCMG_SetPinSchmidtMode(GPIO5_2_AS_GPT2_PWM, SCHMIDT_DISABLE); /* Schmitt input on/off */
+ HAL_IOCMG_SetPinLevelShiftRate(GPIO5_2_AS_GPT2_PWM, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
+ HAL_IOCMG_SetPinDriveRate(GPIO5_2_AS_GPT2_PWM, DRIVER_RATE_2); /* Output signal edge fast/slow */
+ /* Config PIN39 */
+ HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */
+ HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */
+ HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */
+ HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
+ HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */
+ /* Config PIN40 */
+ HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */
+ HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */
+ HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */
+ HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
+ HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */
+ /* Config PIN15 */
+ HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_GPIO4_5); /* Check function selection */
+ HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_GPIO4_5, PULL_NONE); /* Pull-up and Pull-down */
+ HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_GPIO4_5, SCHMIDT_DISABLE); /* Schmitt input on/off */
+ HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_GPIO4_5, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
+ HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_GPIO4_5, DRIVER_RATE_2); /* Output signal edge fast/slow */
+ /* Config PIN11 */
+ HAL_IOCMG_SetPinAltFuncMode(GPIO1_5_AS_UART2_TXD); /* Check function selection */
+ HAL_IOCMG_SetPinPullMode(GPIO1_5_AS_UART2_TXD, PULL_NONE); /* Pull-up and Pull-down */
+ HAL_IOCMG_SetPinSchmidtMode(GPIO1_5_AS_UART2_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */
+ HAL_IOCMG_SetPinLevelShiftRate(GPIO1_5_AS_UART2_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
+ HAL_IOCMG_SetPinDriveRate(GPIO1_5_AS_UART2_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */
+ /* Config PIN12 */
+ HAL_IOCMG_SetPinAltFuncMode(GPIO1_6_AS_UART2_RXD); /* Check function selection */
+ HAL_IOCMG_SetPinPullMode(GPIO1_6_AS_UART2_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */
+ HAL_IOCMG_SetPinSchmidtMode(GPIO1_6_AS_UART2_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */
+ HAL_IOCMG_SetPinLevelShiftRate(GPIO1_6_AS_UART2_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
+ HAL_IOCMG_SetPinDriveRate(GPIO1_6_AS_UART2_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */
+ /* Config PIN3 AS_SPI0_CLK*/
+ HAL_IOCMG_SetPinAltFuncMode(GPIO2_7_AS_SPI0_CLK); /* Check function selection */
+ HAL_IOCMG_SetPinPullMode(GPIO2_7_AS_SPI0_CLK, PULL_NONE); /* Pull-up and Pull-down */
+ HAL_IOCMG_SetPinSchmidtMode(GPIO2_7_AS_SPI0_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */
+ HAL_IOCMG_SetPinLevelShiftRate(GPIO2_7_AS_SPI0_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
+ HAL_IOCMG_SetPinDriveRate(GPIO2_7_AS_SPI0_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */
+ /* Config PIN4 AS SPI0_RXD*/
+ HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_SPI0_RXD); /* Check function selection */
+ HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_SPI0_RXD, PULL_NONE); /* Pull-up and Pull-down */
+ HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_SPI0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */
+ HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_SPI0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
+ HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_SPI0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */
+ /* Config PIN5 AS_SPI0_TXD*/
+ HAL_IOCMG_SetPinAltFuncMode(GPIO2_5_AS_SPI0_TXD); /* Check function selection */
+ HAL_IOCMG_SetPinPullMode(GPIO2_5_AS_SPI0_TXD, PULL_NONE); /* Pull-up and Pull-down */
+ HAL_IOCMG_SetPinSchmidtMode(GPIO2_5_AS_SPI0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */
+ HAL_IOCMG_SetPinLevelShiftRate(GPIO2_5_AS_SPI0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
+ HAL_IOCMG_SetPinDriveRate(GPIO2_5_AS_SPI0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */
+ /* Config PIN1 AS_SPI0_CSN0*/
+ HAL_IOCMG_SetPinAltFuncMode(GPIO0_7_AS_SPI0_CSN0); /* Check function selection */
+ HAL_IOCMG_SetPinPullMode(GPIO0_7_AS_SPI0_CSN0, PULL_NONE); /* Pull-up and Pull-down */
+ HAL_IOCMG_SetPinSchmidtMode(GPIO0_7_AS_SPI0_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */
+ HAL_IOCMG_SetPinLevelShiftRate(GPIO0_7_AS_SPI0_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
+ HAL_IOCMG_SetPinDriveRate(GPIO0_7_AS_SPI0_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */
+}
+
+void SystemInit(void)
+{
+ IOConfig();
+// DMA_Init();
+ UART0_Init();
+ UART2_Init();
+ SPI0_Init();
+ GPIO_Init();
+ GPT2_Init();
+ TIMER0_Init();
+ TIMER1_Init();
+ TIMER2_Init();
+ TIMER3_Init();//5000us
+ /* USER CODE BEGIN system_init */
+ /* USER CODE END system_init */
+}
\ No newline at end of file
diff --git a/vendor/yibaina_3061M/demo/rost/main.c b/vendor/yibaina_3061M/demo/rost/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..9b843426e7314b346bb1166a5b3ed897713c26c2
--- /dev/null
+++ b/vendor/yibaina_3061M/demo/rost/main.c
@@ -0,0 +1,227 @@
+/**
+ * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
+ * following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * @file main.c
+ * @author MCU Driver Team
+ * @brief Main program body.
+ */
+
+#include "typedefs.h"
+#include "feature.h"
+#include "main.h"
+#include "math.h"
+#include "stdlib.h"
+/* USER CODE BEGIN 0 */
+/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */
+/* 建议用户放置头文件 */
+/* USER CODE END 0 */
+UART_Handle g_uart0;
+UART_Handle g_uart2;
+SPI_Handle g_spi0;
+DMA_Handle g_dmac;
+GPIO_Handle g_gpio4;
+//GPIO_Handle g_gpio5;
+GPT_Handle g_gptHandle;
+TIMER_Handle g_timer0;
+TIMER_Handle g_timer1;
+TIMER_Handle g_timer2;
+TIMER_Handle g_timer3;
+/* USER CODE BEGIN 1 */
+/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */
+/* USER CODE END 1 */
+#define Power_PARA 100 //加热器功率参数
+#define ON 1 //开关变量置1
+#define OFF 0 //开关变量置0
+
+volatile uint8_t Usart3Timeout;
+uint8_t gucDecoderState= 0;
+volatile uint8_t cmd_buffer[64];
+volatile uint8_t gucDecoderIndex;
+uint8_t U2RxBuffer[64];
+volatile uint8_t cmd_size,tt;
+volatile uint32_t work_time,timerct,control_on;
+
+//uint8_t cmd_size,cmd_buffer[64]; //DMA接收串口数据缓冲区
+uint8_t Screen_ID,Time_setvalue_H,Time_setvalue_M,Time_setvalue_S,Temp_text_id,Workmode;
+uint32_t time_setvalue;
+uint16_t Temp_setvalue,Temp_PV_A;
+extern uint8_t Power_on,Slider_A;
+
+/**
+ * @brief User-defined read completion interrupt callback function.
+ * @param UART_Handle UART handle.
+ * @retval None.
+ */
+void UART2ReadInterruptCallback(void *handle)
+{
+ BASE_FUNC_UNUSED(handle);
+ HAL_UART_ReadIT(&g_uart2, U2RxBuffer, 1); /* Start receiving again */
+ cmd_buffer[gucDecoderIndex++]=U2RxBuffer[0];
+ Usart3Timeout = 3;
+ return;
+}
+
+void Cmd_buff_Clear(void)
+{
+ for (uint8_t i=0;i