#ifndef __BOARD_H__ #define __BOARD_H__ #include "stdint.h" #include "stdio.h" #include "hc32l19x.h" #include "clk_rst.h" #include "gpio.h" #include "prj_com.h" #include "SerPlot_drv.h" #include "wdg_drv.h" #include "stdlib.h" #include "lcd_disp.h" //add by yuewei 20260310 #include //////////////////////////////版本号 调试开关等wxl20260416//////////////////////////////////////////// #define VER_TYPE 1 // type, 1: ultrasound flow meter; #define VER_OPERATOR 1 // operator, 1: China Telecom; #define VER_MODULE 2 // module, 1: HC32_BC28; #define VER_FIRMWARE 1 /////////////////////////////集中显示频繁使用的调试开关及其他宏定义wxl20260416////////////////////////////// #define BOOTLOADER_ENABLE // 从0x0000启动运行时,屏蔽该宏 #define APP_DEBUG_PRINT // 调试打印开关 // #define DEBUG_LOW_POWER //#define DOG_ENABLE // WXL2026-5-12 // #define DEBUG_BILL // #define DEBUG_RESET_LOG_NOT_SEND // wxl2026-5-8 调试阶段,单片机初始运行不记日志,正常运行阶段记上电日志 // #define DEBUG_SAVE_BAK 0 // #define DEBUG_5MIN_REC 1 // #define DEBUG_HOUR_REC 1 // #define DEBUG_MONTH_REC 1 // #define DEBUG_DAY_REC 1 // #define DEBUG_LOG_WARM // #define DEBUG_PARAM // #define DEBUG_PATCH #define DEBUG_NB // #define DEBUG_BILL2 // #define DEBUG_BILL // add by yuewei 20260305 end // #define RTC_INTERRUPT_TIME_5_S #define ARM_MATH_CM0PLUS #if defined(ARM_MATH_CM7) || defined(ARM_MATH_CM4) || defined(ARM_MATH_CM3) || defined(ARM_MATH_CM0) || defined(ARM_MATH_CM0PLUS) #include "arm_math.h" #else #include "math.h" #define fabsf(x) fabs(x) #endif #ifdef __cplusplus extern "C" { #endif #if defined(__CC_ARM) || defined(__CLANG_ARM) extern int Image$$ER_IROM1$$Base; extern int Image$$RW_IRAM1$$ZI$$Limit; #define VECT_TAB_OFFSET ((uint32_t)&Image$$ER_IROM1$$Base) #define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) #elif __ICCARM__ #pragma section = "CSTACK" #define HEAP_BEGIN (__segment_end("CSTACK")) #else extern int __bss_end; #define HEAP_BEGIN ((void *)&__bss_end) #endif #define HEAP_END ((void *)(0x20000000 + 0x07000)) extern int Stack_Mem; #define MAIN_STACK_BEGIN ((void *)&Stack_Mem) #define MAIN_STACK_SIZE ((uint32_t)HEAP_BEGIN - (uint32_t)MAIN_STACK_BEGIN) #define RCL_38p4K_ENABLE // set EXT_CAP for 2uA power saving #define LCD_EXT_CAP // #define SYSCLK_4M_MODE // #define SYSCLK_8M_MODE #define SYSCLK_16M_MODE #define SLEEPDEEP_ENABLE #define DEBUG_ENABLE // #define USE_DEBUG_UART #define NVIC_PRIO_0 (0x00U) #define NVIC_PRIO_1 (0x01U) #define NVIC_PRIO_2 (0x02U) #define NVIC_PRIO_3 (0x03U) #define MUX_CH_NUM (4) // context_m0p.S /* 32bit CPU */ // typedef long rt_base_t; /**< Nbit CPU related date type */ extern rt_base_t rt_hw_interrupt_disable(void); extern void rt_hw_interrupt_enable(rt_base_t level); extern uint32_t SystemCoreClock; // System Clock Frequency (Core Clock) extern void SystemInit(void); // Initialize the system // extern void SystemCoreClockUpdate (void); // Update SystemCoreClock variable // board.c extern void IRQMutEnable(IRQn_Type IRQn, uint32_t Priority); extern void systick_init(void); extern void us_delay(uint32_t us); extern void CalExpireTime(uint32_t us); extern void WaitExpireTime(void); // finsh_drv.c #ifndef RCL_38p4K_ENABLE #define USART_BAUDRATE (8192) #else #define USART_BAUDRATE (9600) #endif #define SERPLOT_DMATX_OFF (0x0001u) #define YMODEM_UPGRADE_ON (0x0001u) #define CHECK_ITF_ON (0x0002u) typedef void (*uart_rx_itf)(uint8_t ch); typedef void (*ymodem_rx_itf)(uint8_t RxByte, void *arg); extern uint16_t Finsh_Uart_Mode; extern uint16_t SerPlot_Mode; extern int8_t get_nb_imei_code(void); extern int8_t at_cmd_send(uint8_t stat, char *cmd_str, char *ack, uint16_t retry_time, uint8_t time_out); extern void finsh_drv_init(void); extern void print_ch(char ch); extern void print_str(char *str); extern void DebugPrintStr(char *Str, uint16_t Len); extern uint16_t FinSh_Txbuf_Busy(void); extern void finsh_tx(volatile uint8_t *data, uint16_t len); extern void PutChar(char ch); extern void set_shell_rx_itf(uart_rx_itf itf); extern void set_check_rx_itf(uart_rx_itf itf); extern void set_ymodem_rx_itf(ymodem_rx_itf itf, void *arg); // dma_drv.c extern void DMA_ReqClkOn(void); extern void DMA_ReqClkOff(void); extern uint16_t DMA_Busy(void); // rtc_drv.c typedef struct { uint8_t year; uint8_t month; uint8_t day; uint8_t week; uint8_t hour; uint8_t minute; uint8_t second; uint8_t flag_1s : 1; // 1s uint8_t flag_1m : 1; // 1m uint8_t rsv : 6; } rtc_run_t; extern void get_rtc_run(rtc_run_t **rtc_run); extern void set_rtc_run(rtc_run_t *rtc_run); extern void rtc_init(rtc_run_t *rtc_run); extern void set_rtc_date(uint8_t year, uint8_t month, uint8_t day); extern void get_rtc_date(uint8_t *year, uint8_t *month, uint8_t *day); extern void set_rtc_time(uint8_t hour, uint8_t min, uint8_t sec); extern void get_rtc_time(uint8_t *hour, uint8_t *min, uint8_t *sec); extern uint32_t get_rtc_cnt_int(void); extern void set_rtc_cnt_int(uint32_t cnt_int); extern uint32_t get_tdc_rw_err_cnt(void); // low_pwr_drv.c extern void debug_stop(void); extern void exti_init(void); extern void EnterLowPower(void); // misc_drv.c // tdc_spi_drv.c extern void tdc_spi_init(void); extern void tdc_spi_wr_d32(uint8_t code, uint32_t data); extern void tdc_spi_wr_code(uint8_t code); extern uint32_t tdc_spi_rd_d32(uint8_t code); extern uint16_t tdc_spi_rd_d16(uint8_t code); extern uint8_t tdc_spi_rd_d8(uint8_t code); // lcd_drv.c // seg23:com0~com3 #define LCD_STATUS_BAR1 (0x01000000u) #define LCD_STATUS_BAR2 (0x02000000u) #define LCD_STATUS_BAR3 (0x04000000u) #define LCD_STATUS_BAR4 (0x08000000u) // seg22:com0~com3 #define LCD_STATUS_LEFT (0x00010000u) #define LCD_STATUS_INSTANT (0x00020000u) #define LCD_STATUS_FORWARD (0x00040000u) #define LCD_STATUS_BACKWARD (0x00080000u) // seg21:com0~com3 #define LCD_STATUS_KPA (0x00000100u) #define LCD_STATUS_LOWPWR (0x00000200u) #define LCD_STATUS_SHUTDOWN (0x00000400u) #define LCD_STATUS_LADDER (0x00000800u) // seg20:com0~com3 #define LCD_STATUS_HOUR (0x00000001u) #define LCD_STATUS_SLASH (0x00000002u) #define LCD_STATUS_DEGREE (0x00000004u) #define LCD_STATUS_YUAN (0x00000008u) #define LCD_STATUS_BAR5 (0x00000010u) #define LCD_STATUS_CIRCLE (0x00000020u) #define LCD_STATUS_CUM (0x00000040u) #define LCD_STATUS_M3 (0x00000080u) #define LCD_POINT4 (3) #define LCD_POINT5 (4) #define LCD_POINT6 (5) #define LCD_POINT7 (6) #define LCD_POINT8 (7) #define LCD_POINT9 (8) extern uint8_t DispMem_Symbol[5]; extern uint32_t DispMem_Status; extern void lcd_init(void); extern void LCD_ClrAll(void); extern void LCD_ClrStatus(void); // add by HBR 20260604 extern void LCD_ClrDec(void); extern void LCD_DispDec(uint32_t val, uint8_t pos, uint8_t dl); extern void LCD_DispDecAllPos(uint32_t val, uint8_t pos, uint8_t dl); extern void LCD_DispFloat(float val, uint8_t pos, uint8_t dl, uint8_t il); extern void LCD_DispDouble(double val, uint8_t pos, uint8_t dl, uint8_t il); extern void LCD_DispStr(char *str, uint8_t pos, uint8_t dl); extern void LCD_Update(void); extern void LCD_DispPoint(uint8_t num); // adc_drv.c extern volatile float McuTemp; extern volatile uint16_t McuVcc; // unit mV extern volatile uint16_t McuVbat; // unit mV // extern volatile uint16_t McuVTxbat; // unit mV extern volatile float WaterPressure; // unit MPa extern void adc_init(void); extern void adc_get(void); // eeprom_drv.c extern void eeprom_init(void); extern uint8_t EEPROM_WrPacket(uint8_t *Buf, uint16_t DLen); extern uint8_t EEPROM_RdPacket(uint8_t *Buf, uint16_t DLen); // mcu_flash_drv.c typedef struct { uint32_t addr; union U { uint32_t word; uint8_t byte[4]; } u; uint8_t idx; } McuFlash_WP_t; extern void McuFlash_init(void); extern void McuFlash_WaitBusy(void); extern void McuFlash_Unlock(void); extern void McuFlash_Lock(void); #ifndef BOOTLOADER_ENABLE extern int8_t McuFlash_ErasePage(uint32_t addr); extern int8_t McuFlash_WordPP(uint32_t addr, uint32_t data); #else // the following functions implemented in bootloader, shared for APP typedef uint32_t (*upgrade_pkg_crc32_fpt)(const uint8_t *buf, uint32_t size); typedef void (*McuFlash_ErasePage_fpt)(uint32_t addr); typedef void (*McuFlash_WordPP_fpt)(uint32_t addr, uint32_t data); #define upgrade_pkg_crc32(x, y) (*((upgrade_pkg_crc32_fpt)(*(uint32_t *)0xc0u)))((x), (y)) #define McuFlash_ErasePage(x) (*((McuFlash_ErasePage_fpt)(*(uint32_t *)0xc4u)))((x)) #define McuFlash_WordPP(x, y) (*((McuFlash_WordPP_fpt)(*(uint32_t *)0xc8u)))((x), (y)) #endif extern void McuFlash_EraseSegment(uint32_t start, uint32_t len); extern void McuFlash_OpenWP(uint32_t addr, McuFlash_WP_t *p); extern void McuFlash_Buf2WP(uint8_t *buf, uint32_t len, McuFlash_WP_t *p); extern void McuFlash_CloseWP(McuFlash_WP_t *p); // button_drv.c #define BTNKEY_TOUCH_FALL (0x00000010u) // #define BTNKEY_TOUCH_RISE (0x00000010u) extern uint32_t BtnKeyHistory; extern void ButtonInit(void); extern uint32_t ButtonGetEvents(void); // debug_uart_drv.c extern void debug_uart_init(void); // lpuart0_drv.c extern void lpuart0_drv_init(uint8_t baud); extern void lpuart0_tx_str(char *str); extern void lpuart0_set_rx_itf(uart_rx_itf itf); // nb_drv.c #define nb_tx_str lpuart0_tx_str // NB_EN: PF00(AF0) #define NB_EN_PIN_FUNC PF00_AF0 #define NB_EN_GPIO_PORT GpioPortF #define NB_EN_GPIO_BITMASK GpioBitMsk0 extern void nb_power_on(uint8_t baud); extern void nb_power_off(void); #define LOW_PWR_THRESHOLD (3200) // hardware_id_drv.c extern void HardwareIdInit(void); extern uint16_t GetHardwareId(void); // mux_drv.c void mux_init(void); void set_mux_ch(uint32_t ch); uint32_t get_mux_ch(void); #include "param.h" // add by yuewei 20260327 start // 输入滤波:速度 & 温度(越小越平滑) #define SPDLVL_FILTER_ALPHA 0.2f #define TEMP_FILTER_ALPHA 0.3f // 输出流量滤波(最终结果平滑) #define VOL_FILTER_ALPHA 0.15f // add by yuewei 20260327 end // add by yuewei 20260325 用于飞行时间差低通平滑滤波 #define DIFF_TOFF_FILTER_ALPHA 0.5f // add by yuewei 20260325 用于防止APSR二次修正来回跳变 #define APSR_MAX_STEP 0.01f // add by yuewei 20260305 start // #define APP_DEBUG_PRINT #ifdef APP_DEBUG_PRINT #define LOG(...) \ do \ { \ rt_enter_critical(); \ printf(__VA_ARGS__); \ rt_exit_critical(); \ } while (0) #else #define LOG(...) \ do \ { \ } while (0) // #define LOG(...) rt_thread_mdelay(2) //do {} while(0) #endif // add by yuewei 20260309 to deal hongwai long data extern uint8_t HONGWAI_LONG_RX_FLAG; // add by yuewei 20260310 to show lcd all extern void lcd_show_all(void); // add by yuewei 20260310 to enter check mode when LcdPage is 'disp_time' and key long press 5 seconds extern en_lcd_page_t LcdPage; // add by yuewei 20260310 to enter check mode when LcdPage is 'disp_time' time and key long press 5 seconds extern void check_enter_check_mode_by_key_press(void); // add by yuewei 20260310 to exit check mode when LcdPage is 'disp_cumflow' and key long press 5 seconds extern void check_enter_normal_mode_by_key_press(void); // add by yuewei 20260318, for lcd display remain time extern uint16_t ot_count_down; // add by yuewei 20260319, TDC中断信号量 extern struct rt_semaphore tdc_isr_sem; // add by yuewei 20260422, RTC中断信号量 extern struct rt_semaphore rtc_isr_sem; // add by yuewei 20260422, RTC中断函数迁移出中断 extern void rtc_interrupt_deal_tdc(void); // add by yuewei 20260319, TDC中断函数迁移出中断 extern void tof_isr_convert_tof_to_flow(void); // add by yuewei 20260416, for lcd display pass extern void lcd_show_key_trigger_report_pass(void); // add by yuewei 20260424, for lcd display "ot-Err" extern uint8_t G_OT_ERROR_FLAG_CNT; // add by yuewei 20260424, for lcd display ot error extern void lcd_show_ot_error(void); // add by yuewei 20260416 to countdown LcdTimer per 1 second extern void lcd_timer_countdown(void); // add by yuewei 20260416, short key press toggle value,defalt: 0->display fw cumflow,1->display bw cumflow extern uint8_t g_lcd_display_check_bw_cum_flow; extern uint8_t lcd_disp_pass_flag; // wxl20260423 用于显示pass字段 extern void tof_filter_init(uint8_t ch_num); // 20260429 extern uint8_t G_STATIC_OT_SETTING_FLAG; // 20260429 正在设置静态OT,不进行飞行时间差滤波 extern void set_rtc_interrupt_time(float time); // add by yuewei 20260519,设置RTC:多少秒钟进一次中断,time:0.5s, 1.0s, 1.5s, 2.0s... extern float get_rtc_interrupt_time(void); // add by yuewei 20260519,从 RTC->CR0 读取 PRDX 值,返回中断间隔秒数 // add by wuxiaolin 20260313 start // param.h 参数和记录读写相关接口 extern uint8_t get_param_firmware_ver(void); // 获取当前版本号 // extern int8_t GetChNum(void);//获取超声波通道数 extern int8_t set_hardware_para(HardWareParaDef *HardWarePara); // 设置硬件参数 extern int8_t get_hardware_para(HardWareParaDef *HardWarePara); // 读取硬件参数 extern int8_t set_patch_info(PATCH_INFO_DEF *patch_info); // 设置表端开始升级信息,收到升级指令后调用 extern uint8_t write_diff_patch_to_flash(DIFF_PACKET_DEF *Packet); // 写差分包,收到差分包后调用 extern int8_t set_server_ip_port_para(SERVER_IP_PORT_DEF *server_ip_para); // 设置服务器ip和端口号 extern int8_t get_server_ip_port_para(SERVER_IP_PORT_DEF *server_ip_para); // 读取服务ip和端口号 extern int8_t set_regular_report_para(REGULAR_REPORT_DEF *regular_report_para); // 设置定时上报周期和时间间隔 extern int8_t get_regular_report_para(REGULAR_REPORT_DEF *regular_report_para); // 读取定时上报周期和时间间隔 extern int8_t set_dma_regular_report_para(DMA_REGULAR_REPORT_DEF *dma_report_para); // 设置dma上报时间参数 extern int8_t get_dma_regular_report_para(DMA_REGULAR_REPORT_DEF *dma_report_para); // 读取dma定时上报时间参数 extern int8_t set_flow_alarm_para(FLOW_ALARM_PARA_DEF *flow_alarm_para); // 设置流量告警参数 extern int8_t get_flow_alarm_para(FLOW_ALARM_PARA_DEF *flow_alarm_para); // 读取流量告警参数 extern int8_t set_press_alarm_para(PRESS_ALARM_PARA_DEF *press_alarm_para); // 设置压力告警参数 extern int8_t get_press_alarm_para(PRESS_ALARM_PARA_DEF *press_alarm_para); // 获取压力告警参数 extern int8_t set_temp_alarm_para(TEMP_ALARM_PARA_DEF *temp_alarm_para); // 设施温度告警参数 extern int8_t get_temp_alarm_para(TEMP_ALARM_PARA_DEF *temp_alarm_para); // 读取温度告警参数 extern int8_t set_settlement_day_para(SETTLEMENT_DAY_DEF *settlement_day_para); // 设置表端结算日参数 extern int8_t get_settlement_day_para(SETTLEMENT_DAY_DEF *settlement_day_para); // 读取表端结算日参数 extern int8_t set_meter_bottom_data(METER_BOTTOM_DEF *bottom_data); // 设置表底读数 extern int8_t get_18month_record_data(uint8_t *data); // 读取月结数据 extern int8_t get_30day_record_data(uint8_t *data); // 读取日结数据 extern int8_t get_hour_record_data(uint8_t year, uint8_t month, uint8_t day, uint8_t *data); // 读取时结数据 extern int8_t get_5min_record_data(GET_5MIN_REOCORD_DEF *get_5min_record_data, uint16_t numb, uint8_t *data); // 读取5分钟密集数据 extern int8_t get_log_record(uint8_t start, uint8_t num, uint8_t *data); // 读取日志数据 暂未实现 extern int8_t set_channel_numb(uint8_t *numb); // 设置声道数 extern int8_t get_channel_numb(uint8_t *numb); // 设置声道数 extern int8_t get_device_addr(uint8_t *data); // 获取设备地址 extern int8_t set_device_addr(uint8_t *data); // 设置表地址 extern int8_t set_flow_para(FLOW_PARA_DEF *flow_para); // 设置流量参数 extern int8_t get_flow_para(FLOW_PARA_DEF *flow_para); // 读取流量参数 extern int8_t set_deltaTC_flow_para(DELTA_TC_FLOW_PARA_DEF *deltaTC_para); // 设置德尔塔TC流量参数 extern int8_t get_deltaTC_flow_para(DELTA_TC_FLOW_PARA_DEF *deltaTC_para); // 读取德尔塔TC流量参数 extern int8_t set_diameter_and_temp_compensation(DIAMETER_AND_TEMP_COMPENSATION_DEF *data); // 设置口径和温度补偿系数 extern int8_t get_diameter_and_temp_compensation(DIAMETER_AND_TEMP_COMPENSATION_DEF *data); // 读取口径和温度补偿系数 extern int8_t set_auto_match_level_para(AUTO_MATCH_LEVEL_PARA_DEF *data); // 设置自动匹配电平参数 extern int8_t get_auto_match_level_para(AUTO_MATCH_LEVEL_PARA_DEF *data); // 获取自动匹配电平参数 extern int8_t set_nbqr_para(NBQR_PARA_DEF *nbqr_para); // 设置nbqr参数 extern int8_t get_nbqr_para(NBQR_PARA_DEF *nbqr_para); // 读取nbqr参数 extern uint8_t G_TDC_DEEP_SLEEP; // add by wuxiaolin 20260313 end // extern uint8_t NB_RUN_UPDATE_FLAG;//wxl 2026-4-8 nb下载代码时,禁止长时间占用中断 #ifdef DEBUG_LOW_POWER extern uint32_t get_time[32]; extern uint8_t gtcnt; extern void get_internal_time(void); extern uint16_t tms; #define SYS_MS_CNT rt_tick_get() #endif #ifdef __cplusplus } #endif #endif