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连接器扣接到核心板,如下图所示。 - -![image-20240715162059747](docs/pic/tools/image-20240715162059747.png) - -### 3061M硬件说明 - - 3061M通用生态板通过 ECBMCU201MPC核心板实现控制、 ECBMOTORA 扩展板实现接口扩展以及电源接口,同时提供USB TypeC线进行调试 / 供电、12V电源适配器和一个电机。 - -![image-20240715162244103](docs/pic/tools/image-20240715162244103.png) - -3061M通用生态板用户手册详细内容请查阅:Hi3061M系列 通用生态板用户手册 00B01 - -### 3065H介绍 - -3065H 通用生态板由 ECBMCU105H (核心板)和 ECBMOTORA (电机驱动板)组成。 - -ECBMCU105H是针对 3065H 芯片开发的生态核心板,用于 3065H 芯片初始评估和设计参考,内嵌一块 USB 接口的调试板。 - -ECBMOTORA是电机驱动扩展板,支持一个 BLDC 或 PMSM 电机控制。该单板支持24V/12V DCIN 输入。 - -核心板电机驱动扩展板的常用组装方式是电机驱动板通过两个40pin 连接器扣接到核心板,如下图所示。 - -image-20240530173305431 - -### 3065H硬件说明 - - 3065H通用生态板通过ECBMCU105H 核心板实现控制、 ECBMOTORA 扩展板实现接口扩展以及电源接口,同时提供USB TypeC线进行调试 / 供电、12V电源适配器和一个电机。 - -![image-20240527103127826](docs/pic/tools/image-20240527103127826.png) - -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