/** * @file board.h * @author xxx * @date 2023-08-30 14:05:55 * @brief 头文件 board.h * @copyright Copyright (c) 2023 by xxx, All Rights Reserved. */ #ifndef __BOARD_H__ #define __BOARD_H__ #include "main.h" #include "bsp.h" #include "tim.h" #include "lcds.h" #include "menu.h" #include "leds.h" #include "entity.h" #include "rtc_rx8010.h" #include "eeprom_m95.h" #include "eeprom_fm24.h" #include "eeprom_lc02b.h" #include "ntc_3950.h" #include "sht40.h" #include "dac161p997.h" #define LCD_SPI SPI2 // eeprom_lc02b 地址定义 #define PRRESSURE_CALIBRATION_ADDRESS 0x00 ///< 压力校准地址 #define HART_UART1 USART1 #define HART_UART2 UART5 #define HART_UART1_BAUDRATE (1200U) #define HART_UART2_BAUDRATE (115200U) #define APP_PRELOAD_AREA 0x10007FF0 ///< 预加载区域 #define VREF_VALUE (CPU_VREF * 1000) ///< 参考电压mV #define TIME_1US TIM1 ///< 1us定时器 #define TASK_TIM TIM6 ///< 任务定时器 #define MODE_TIM TIM7 ///< 模式定时器 #define MODE_GATHE_TIM TIM17 ///< 模式采集定时器 #define HART_TIM TIM16 ///< HART定时器 #define HART_OUT_TIM TIM3 ///< HART输出定时器 #define HART_OUT_TIM_CHANNEL LL_TIM_CHANNEL_CH2 ///< HART输出定时器通道 #ifndef ADC_MAX #define ADC_MAX 4095 //< ADC最大 #endif #ifndef DAC_MAX #define DAC_MAX 4095 //< DAC最大 #endif #define BLE_EN_ENABLE() GPIO_SET(BLE_PWR_GPIO_Port, BLE_PWR_Pin) ///< 蓝牙使能 #define BLE_EN_DISABLE() GPIO_RESET(BLE_PWR_GPIO_Port, BLE_PWR_Pin) ///< 蓝牙禁用 #define BLE_IS_ENABLE() (GPIO_READ(BLE_PWR_GPIO_Port, BLE_PWR_Pin) == SET) ///< 蓝牙使能状态 #define LCD_DMA DMA1 ///< LCD DMA #define LCD_DMA_TX_CHANNEL LL_DMA_CHANNEL_5 ///< LCD DMA发送通道 #define LCD_POWER_ON() GPIO_SET(LCD_PWR_GPIO_Port, LCD_PWR_Pin) ///< LCD电源使能 #define LCD_POWER_OFF() GPIO_RESET(LCD_PWR_GPIO_Port, LCD_PWR_Pin) ///< LCD电源禁用 #define LCD_IS_POWER_ON() (GPIO_READ(LCD_PWR_GPIO_Port, LCD_PWR_Pin) == SET) ///< LCD电源使能状态 #define LCD_DETECT() (GPIO_READ(LCD_EXTCOMIN_GPIO_Port, LCD_EXTCOMIN_Pin) == SET) ///< LCD检测,高电平没有接入,低电平接入 #define BP_S_POWER_ON() GPIO_SET(BP_S_PWR_GPIO_Port, BP_S_PWR_Pin) #define BP_S_POWER_OFF() GPIO_RESET(BP_S_PWR_GPIO_Port, BP_S_PWR_Pin) #define BP_S_IS_POWER_ON() (GPIO_READ(BP_S_PWR_GPIO_Port, BP_S_PWR_Pin) == SET) #define BP_A_POWER_ON() GPIO_SET(BP_A_PWR_GPIO_Port, BP_A_PWR_Pin) #define BP_A_POWER_OFF() GPIO_RESET(BP_A_PWR_GPIO_Port, BP_A_PWR_Pin) #define BP_A_IS_POWER_ON() (GPIO_READ(BP_A_PWR_GPIO_Port, BP_A_PWR_Pin) == SET) #define BP_B_POWER_ON() GPIO_SET(BP_B_PWR_GPIO_Port, BP_B_PWR_Pin) #define BP_B_POWER_OFF() GPIO_RESET(BP_B_PWR_GPIO_Port, BP_B_PWR_Pin) #define BP_B_IS_POWER_ON() (GPIO_READ(BP_B_PWR_GPIO_Port, BP_B_PWR_Pin) == SET) ////< 禁用 I/P 电流输出 0-6.2V #define VIP_H_EN_DISABLE() \ do \ { \ GPIO_RESET(IP_H_PWR_GPIO_Port, IP_H_PWR_Pin); \ GPIO_SET_ANALOG(IP_H_PWR_GPIO_Port, IP_H_PWR_Pin); \ } while (0) ////< 使能 I/P 电流输出 0-6.2V #define VIP_H_EN_ENABLE() \ do \ { \ GPIO_SET_OUTPUT(IP_H_PWR_GPIO_Port, IP_H_PWR_Pin); \ GPIO_SET(IP_H_PWR_GPIO_Port, IP_H_PWR_Pin); \ } while (0) /* HART */ #define HART_EN_ENABLE() GPIO_SET(HART_PWR_GPIO_Port, HART_PWR_Pin) ///< HART使能 #define HART_EN_DISABLE() GPIO_RESET(HART_PWR_GPIO_Port, HART_PWR_Pin) ///< HART禁用 #define HART_IS_ENABLE() (GPIO_READ(HART_PWR_GPIO_Port, HART_PWR_Pin) == SET) ///< HART使能状态 #define HART_RST_ON() GPIO_SET(HART_RST_GPIO_Port, HART_RST_Pin) #define HART_RST_OFF() GPIO_RESET(HART_RST_GPIO_Port, HART_RST_Pin) #define HART_RTS_ON() GPIO_SET(HART_RTS_GPIO_Port, HART_RTS_Pin) #define HART_RTS_OFF() GPIO_RESET(HART_RTS_GPIO_Port, HART_RTS_Pin) /* HART */ /* SWO */ #define SWO1_OPEN() GPIO_SET(SWO1_GPIO_Port, SWO1_Pin) ///< SWO1 开 #define SWO1_CLOSE() GPIO_RESET(SWO1_GPIO_Port, SWO1_Pin) ///< SWO1 关 #define SWO1_TOGGLE() GPIO_TOGGLE(SWO1_GPIO_Port, SWO1_Pin) ///< SWO1 翻转 #define SWO1_IS_OPEN() (GPIO_READ(SWO1_GPIO_Port, SWO1_Pin) == SET) #define SWO2_OPEN() GPIO_SET(SWO2_GPIO_Port, SWO2_Pin) ///< SWO2 开 #define SWO2_CLOSE() GPIO_RESET(SWO2_GPIO_Port, SWO2_Pin) ///< SWO2 关 #define SWO2_TOGGLE() GPIO_TOGGLE(SWO2_GPIO_Port, SWO2_Pin) ///< SWO2 翻转 #define SWO2_IS_OPEN() (GPIO_READ(SWO2_GPIO_Port, SWO2_Pin) == SET) typedef enum { FILTER_AVERAGE = 1, FILTER_MEDIAN, FILTER_MEDIAN_AVERAGE, } filter_e; typedef enum { BOARD_CACHE_1 = 0, BOARD_CACHE_2, BOARD_CACHE_MAX, } board_cache_e; typedef enum { ///< 不需要跳转到bootload APP_PRELOAD_BOOTLOAD_JUMP_NONE = 0, ///< 更新完成等待用户通知跳转到bootload APP_PRELOAD_BOOTLOAD_JUMP_WAIT = 0xd501, ///< 更新完成立即跳转到bootload APP_PRELOAD_BOOTLOAD_JUMP_IMMEDIATELY = 0xc802, } app_preload_bootload_jump_e; ///< 预加载BOOTLOAD跳转标志 typedef struct { uint32_t app_preload_version; uint8_t app_preload_language_flag; ///< 语言标志 uint16_t app_preload_first_flag; ///< 首次烧录标志 uint32_t app_preload_cupid_encrypt; ///< 加密后的CPUID } board_data_t; extern board_data_t board_data; ///< 板卡数据 extern lcd_t *lcd; ///< LCD句柄 extern __IO uint16_t dbg_assert_line; extern __IO uint16_t app_preload_bootload_flag; ///< 触发BOOTLOAD启动标志(在用户代码中接受代码文件) extern __IO uint16_t app_preload_bootload_jump_flag; ///< 触发BOOTLOAD跳转标志(在用户代码中接受代码文件) extern void board_init(void); ///< 板卡初始化 extern void board_dinit(void); ///< 板卡反初始化 extern void board_srand(void); ///< 板卡随机数种子 extern void board_work_stop_or_run(void); ///< 板卡工作停止或运行 extern void timer_cycle_update(void); ///< 板卡定时器周期更新 extern void dbg_assert_cb(uint16_t line); ///< 板卡断言回调 extern void driver_init(void); ///< 功耗引脚初始化 extern void driver_dinit(void); ///< 功耗引脚反初始化 extern BOOL is_lcd_ext_board(void); ///< 是否接入了LCD扩展板 extern void lcd_init(void); ///< LCD初始化 extern void lcd_dinit(void); ///< LCD反初始化 extern void system_clock_config_low(void); ///< 系统时钟配置低频 extern void system_clock_config_high(void); ///< 系统时钟配置高频 extern BOOL gui_can_work(void); ///< GUI是否可以工作 extern BOOL gui_is_idle(void); ///< GUI是否空闲 extern void gui_flush(void); ///< LCD刷新 extern void gui_flush_Clear(void); ///< LCD刷新并清屏 extern void gui_clr(void); ///< 清屏 extern void gui_full(void); ///< 全屏黑色 extern void gui_open(void); ///< 打开GUI extern void gui_close(void); ///< 关闭GUI extern void gui_set_scandir(uint8_t dir); ///< 设置扫描方向 extern void gui_set_clear_flag(void); ///< 设置清屏标志 extern BOOL gui_get_clear_flag(void); ///< 获取清屏标志 extern BOOL flash_read(uint32_t address, uint8_t *data, uint16_t length); ///< 读取Flash extern BOOL flash_write(uint32_t address, const uint8_t *data, uint16_t length); ///< 写入Flash extern BOOL flash_erase_page(uint32_t page); ///< 擦除Flash页 extern uint16_t get_dac(float32 output); ///< 根据目标行程计算DAC输出理论值 extern void pwm_output_position(float32 position_per); ///< PWM输出阀位百分比 extern void calib_loop(void); ///< 校准回路电流 extern void calib_kpa(void); ///< 校准压力 extern void calib_pwm_out(void); ///< 校准PWM输出 extern void calib_parapos_perent(void); extern void calib_pressure(pressure_type_e index); ///< 校准阀门位置参数 extern uint16_t get_actual_travel_adc(void); ///< 获取当前实际行程ADC值 extern float32 get_actual_travel(filter_e filter); ///< 获取当前实际行程 extern float32 get_current_by_resistance(void); ///< 通过电阻测算获取当前回路电流 extern float32 get_current(filter_e filter); ///< 获取当前回路电流 extern float32 get_current_deal(float32 current); ///< 电流数据处理 extern float32 get_temperature(void); ///< 获取当前温度值 extern float32 get_pressure(pressure_type_e id); ///< 获取当前压力 extern float32 get_dead_zone(void); ///< 获取死区 extern float32 get_flow(void); ///< 获取当前流量 extern BOOL update_real_time(date_time_t *real_time); ///< 更新实时时间 extern BOOL get_timestamp(date_time_t *time); ///< 获取时间戳 extern BOOL get_real_time(uint8_t *year, uint8_t *month, uint8_t *day, uint8_t *hour, uint8_t *min, uint8_t *sec); ///< 获取实时时间 extern float32 get_cpu_temperature(void); ///< 获取CPU温度 extern float32 get_cpu_volt(void); ///< 获取CPU电压 extern float32 get_board_current(void); ///< 获取板卡电流 extern uint32_t get_seed(void); ///< 获取随机种子 extern BOOL uart1_get_idel_status(void); ///< 获取UART1空闲状态 extern uint32_t rt_data_time_timestamp(void); ///< 获取实时时间戳 extern BOOL rtc_get_datetime(rtc_date_t *const date, rtc_time_t *const time); ///< 获取RTC时间 extern void rtc_get_datetime_ram(rtc_date_t *const date, rtc_time_t *const time); ///< 从实时数据结构中获取日期和时间 extern BOOL set_real_time(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec); extern uint8_t get_language(void); ///< 获取语言 extern uint8_t get_work_page_index(void); ///< 获取工作菜单索引 extern uint16_t get_app_preload_bootload_flag(void); ///< 获取预加载BOOTLOAD标志位 extern uint8_t get_app_preload_language_flag(void); ///< 获取预加载语言标志位 extern app_preload_bootload_jump_e get_app_preload_bootload_jump_flag(void); ///< 获取预加载BOOTLOAD跳转标志 extern void set_tim_hart_out(uint32_t sysclk); ///< 设置定时器心跳输出 extern void set_loop_4ma(void); ///< 设置回路电流4mA extern void set_loop_20ma(void); ///< 设置回路电流20mA extern void set_pressure_min(uint8_t unit, float32 set_value, pressure_type_e index); ///< 设置最小压力 extern void set_pressure_max(uint8_t unit, float32 set_value, pressure_type_e index); ///< 设置最大压力 extern void set_output_4ma_pwm(uint16_t value); ///< 设置输出4mA时的PWM值 extern void set_output_20ma_pwm(uint16_t value); ///< 设置输出20mA时的PWM值 extern void set_app_preload_language_flag(uint8_t language); ///< 设置预加载语言标志位 extern void set_language(uint8_t language); ///< 设置语言 extern void set_work_page_index(uint8_t index); ///< 设置工作菜单索引 extern void set_app_preload_bootload_flag(uint16_t flag); ///< 设置预加载BOOTLOAD标志位 extern void set_app_preload_bootload_jump_flag(app_preload_bootload_jump_e flag); ///< 设置预加载BOOTLOAD标志位 extern void uart1_set_idel_handle_1_sec(void); ///< 设置UART1空闲处理,1秒执行一次 extern void uart1_set_idel_status(BOOL idel); ///< 设置UART1空闲状态 /************************************** 通过电阻测算,只在测试程序中使用 **************************************/ extern float32 actual_adc_convert_percent(uint16_t adc); ///< 实际行程ADC值转换为百分比 extern float32 loop_current_convert(uint16_t adc); ///< 回路电流检测转换 extern float32 ip_dac2current(uint16_t dac); ///< DAC:IP输出电流值转换 extern float32 ip2current(void); ///< IP输出电流值转换 extern float32 pressure_adc2kpa(uint16_t adc); ///< 压力ADC值转换 extern void pwm_duty2current(float32 cur_ma); ///< PWM输出电流值转换 extern void update_device_temp_min_max(float32 temperature); ///< 更新设备最小、最大温度 extern BOOL wireless_can_work(float32 loop_current); ///< 无线模块是否可以工作 extern BOOL is_run_max_time(void); ///< 是否运行最大时间 #endif ///< __BOARD_H__