P0/P1/P2功能实现:接入业务组合根(按键/LED/过零/配网/OTA),联动、11B定时、运行记录、灯泡寿命(DP3/DP4/DP25)、CBR0 VM、512分包
This commit is contained in:
@@ -0,0 +1,137 @@
|
||||
/******************************************************************************
|
||||
* @file board_pin.h
|
||||
* @brief CBR0 板级引脚、电平与时序(电子开关-加热灯罩;换板只改本文件)
|
||||
* @author cyWu <1917507415@qq.com>
|
||||
* @date 2026.09.08
|
||||
* @version V1.0.0
|
||||
*
|
||||
* @note 与加热垫同一块电子开关板、同一套引脚和灯效,负载换成灯泡。
|
||||
* UART0_TX=PC5 在 board_jl701n_demo_cfg.h。
|
||||
* 过零用 MCPWM FPIN 双沿(CH0 下降 / CH1 上升),勿占这两个 PWM 通道。
|
||||
* 软件采样兜底必须挂真实 1ms 定时器,禁止在 20ms 节拍里空循环读沿。
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __BOARD_PIN_H__
|
||||
#define __BOARD_PIN_H__
|
||||
|
||||
#include "asm/gpio.h"
|
||||
|
||||
/*============================================================================*/
|
||||
/* 功能开关:某路硬件异常时可单独关掉,不影响配网 */
|
||||
/* 0 时对应模块 init/run 直接 return,GPIO 不配,日志打一次 xxx disabled */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_LED_ENABLE 1 /**< 1=红绿状态 LED(PA7 红 / PA8 绿,低亮) */
|
||||
#define BOARD_KEY_ENABLE 1 /**< 1=按键 PB1(低按下) */
|
||||
#define BOARD_RELAY_ENABLE 1 /**< 1=继电器 PC3(高导通=灯泡开) */
|
||||
#define BOARD_ZC_ENABLE 1 /**< 1=过零 PA1;=0 时开请求禁吸合、关请求强制断开 */
|
||||
#define BOARD_LINKAGE_ENABLE 1 /* 联动引擎(规格书 10 章);P2 开 */
|
||||
#define BOARD_TIMER_ENABLE 1 /* 定时引擎(规格书 11 章);P2 开 */
|
||||
#define BOARD_TH_SCAN_ENABLE 1 /* 断连扫描风扇广播(规格书 8 章);P2 开 */
|
||||
#define BOARD_RUNREC_ENABLE 1 /* 31 天运行记录(规格书 13.1 章);P2 开 */
|
||||
#define BOARD_LIGHT_LIFE_ENABLE 1 /* 灯泡剩余寿命(规格书 13.2 章,灯罩新增);P2 开 */
|
||||
#define BOARD_NVM_ENABLE 1 /* VM 持久化(规格书 13 章) */
|
||||
|
||||
/*============================================================================*/
|
||||
/* GPIO */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_UART_TX_PIN IO_PORTC_05 /**< 调试 UART TX(cfg: TCFG_UART0_TX_PORT) */
|
||||
#define BOARD_KEY_PIN IO_PORTB_01 /**< 按键,低电平按下 */
|
||||
#define BOARD_ZC_PIN IO_PORTA_01 /**< 过零检测,双沿都算一次过零 */
|
||||
#define BOARD_LED_GREEN_PIN IO_PORTA_08 /**< 绿灯,低电平亮 */
|
||||
#define BOARD_LED_RED_PIN IO_PORTA_07 /**< 红灯,低电平亮 */
|
||||
#define BOARD_RELAY_PIN IO_PORTC_03 /**< 继电器,高电平导通(灯泡开) */
|
||||
|
||||
#define BOARD_LED_ON_LEVEL 0 /**< LED 点亮电平:0=低亮 */
|
||||
#define BOARD_RELAY_ON_LEVEL 1 /**< 继电器有效电平:1=高导通 */
|
||||
#define BOARD_KEY_ACTIVE_LEVEL 0 /**< 按键有效电平:0=按下为低 */
|
||||
|
||||
/*============================================================================*/
|
||||
/* 按键 / 配对 / OTA */
|
||||
/*============================================================================*/
|
||||
|
||||
/**
|
||||
* 直接作为 key.c 状态机的 keyLongTime/keyLastTime 使用:
|
||||
* 松手时刻 <BOARD_KEY_PAIR_MS → SHORT_Event,切灯泡(见 5.3)
|
||||
* 按住满 BOARD_KEY_PAIR_MS → LONG_Event(仍按住),切配对提示灯(绿灯快闪)
|
||||
* 按住满 BOARD_KEY_OTA_MS → LAST_Event(仍按住,到点即触发),进 OTA
|
||||
* 按满 5s~12s 后松手 → RELEASE_Event,提交配对
|
||||
*/
|
||||
#define BOARD_KEY_PAIR_MS 5000 /**< keyLongTime:满 5s 挂配对提示灯 */
|
||||
#define BOARD_KEY_OTA_MS 12000 /**< keyLastTime:满 12s 到点直接进 OTA */
|
||||
#define BOARD_KEY_DEBOUNCE_MS 20 /**< 按键消抖(参考值;key.c 内部以 30 为准) */
|
||||
#define BOARD_PAIR_TIMEOUT_MS (120u * 1000u) /**< 配对超时 120s,失败后保持开机 */
|
||||
|
||||
/*============================================================================*/
|
||||
/* LED(红绿双通道,低亮;事件表见 led_manager.c) */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_LED_FAST_ON_MS 100 /**< 配对快闪:亮 */
|
||||
#define BOARD_LED_FAST_OFF_MS 100 /**< 配对快闪:灭 */
|
||||
#define BOARD_LED_OTA_ON_MS 200 /**< OTA 红绿交替半周期:亮 */
|
||||
#define BOARD_LED_OTA_OFF_MS 200 /**< OTA 红绿交替半周期:灭 */
|
||||
#define BOARD_LED_ALT_MS 200 /**< 交替事件半周期(配对失败 / OTA) */
|
||||
#define BOARD_LED_PAIR_OK_MS 3000 /**< 配对成功绿灯常亮时长 */
|
||||
#define BOARD_LED_PAIR_FAIL_MS 3000 /**< 配对失败提示总时长 */
|
||||
#define BOARD_LED_STANDBY_ON 1 /**< 1=跟继电器灯常亮 */
|
||||
|
||||
/*============================================================================*/
|
||||
/* 继电器 + 过零 */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_ZC_TIMEOUT_MS 100 /**< 过零超时:pending 置位后 100ms 无沿走超时路径 */
|
||||
#define BOARD_ZC_SCAN_MS 1 /**< 软件兜底采样子步长(真实 1ms 定时器驱动) */
|
||||
|
||||
/* 过零沿检测方式:MCPWM FPIN 硬件边沿中断(官方例程 usr_hw_demo/usr_hw_gpio_int.c) */
|
||||
#define BOARD_ZC_USE_IRQ 1 /**< 1=FPIN 边沿中断执行切变;0=纯软件采样(真实 1ms 定时器) */
|
||||
#define BOARD_ZC_FPIN_FALL_CH 0 /**< 下降沿用的 FPIN 通道号 0~3 */
|
||||
#define BOARD_ZC_FPIN_RISE_CH 1 /**< 上升沿用的 FPIN 通道号 0~3(双沿=规格书 2.2 要求) */
|
||||
#define BOARD_ZC_FPIN_BOTH_EDGE 1 /**< 1=双沿都算过零(占两个通道);0=只用下降沿通道 */
|
||||
#define BOARD_ZC_FPIN_FILTER_EN 1 /**< 1=开 FPIN 硬件滤波(抗过零毛刺);不触发时试 0 */
|
||||
#define BOARD_ZC_FPIN_FILTER 0x3FUL /**< 滤波档位 bits[5:0],例程默认 0b111111 */
|
||||
#define BOARD_ZC_PULL_UP 1 /**< PA1 内部上拉(光耦 OC 输出时必须有;推挽输入也无害) */
|
||||
#define BOARD_ZC_PULL_DOWN 0 /**< PA1 内部下拉,通常 0(与上拉互斥) */
|
||||
#define BOARD_ZC_SW_POLL_1MS 0 /**< 1=额外挂真实 1ms 软件采样兜底(中断失效时滞后 ≤1ms,代价 1000Hz ISR) */
|
||||
#define BOARD_ZC_DIAG_LOG 0 /**< 1=500ms 打印一次过零沿计数(台上确认中断在跑,量产出货置 0) */
|
||||
|
||||
/*============================================================================*/
|
||||
/* BLE 广播:常电默认保持快广播;电池产品可开超时切慢广播 */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_BLE_SLOW_ADV_ENABLE 0 /**< 0=一直快广播(80);1=断连满 BOARD_BLE_SLOW_ADV_SEC 后切慢(800) */
|
||||
#define BOARD_BLE_SLOW_ADV_SEC 60 /**< 使能后:已配对断连快广播持续秒数再切慢(本机 500ms 一拍) */
|
||||
|
||||
/*============================================================================*/
|
||||
/* 断连扫描(P2,规格书 8.2 节) */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_ADV_SCAN_SLOT_MS 500 /* 重连广播 / 扫描各占一拍 */
|
||||
|
||||
/*============================================================================*/
|
||||
/* 联动(规格书 10 章:1 条 20B 配置 DP11,回差开/关) */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_LINKAGE_CFG_LEN 20 /**< DP11 linkage_config 长度(Byte) */
|
||||
|
||||
/*============================================================================*/
|
||||
/* 定时(规格书 11.1 节:7 组 11B 配置 DP13~19,无模式字节) */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_TIME_CFG_LEN 11 /**< 每组定时配置长度(Byte):Byte1=类型 */
|
||||
|
||||
/*============================================================================*/
|
||||
/* 运行记录(规格书 13.1 节:31 天 × uint32 秒,DP20) */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_RUN_RECORD_DAYS 31 /**< 记录天数 */
|
||||
#define BOARD_RUN_RECORD_SAVE_SEC 600 /**< 累计吸合 10 分钟写一次 VM */
|
||||
|
||||
/*============================================================================*/
|
||||
/* 灯泡剩余寿命(规格书 13.2 节,灯罩新增:DP3/DP4/DP25) */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_LIGHT_RATED_SEC 2592000u /**< 额定工时 30*24*3600(首次上电/复位值) */
|
||||
#define BOARD_LIGHT_REPORT_MS 60000u /**< 点灯时 DP3 变化上报节流:满 60s 才走 */
|
||||
|
||||
#endif /* __BOARD_PIN_H__ */
|
||||
@@ -0,0 +1,177 @@
|
||||
/******************************************************************************
|
||||
* @file bsp_hw.c
|
||||
* @brief 板级 GPIO:红绿 LED、按键、继电器
|
||||
* @author cyWu <1917507415@qq.com>
|
||||
* @date 2026.09.04
|
||||
* @version V1.1.0
|
||||
* @history
|
||||
* - V1.1.0, 2026.09.04, cyWu, 精简注释(单标志不包结构体)
|
||||
* - V1.0.0, 2026.09.04, cyWu, 首次发布
|
||||
******************************************************************************/
|
||||
|
||||
#include "system/includes.h"
|
||||
#include "asm/gpio.h"
|
||||
#include "bsp_hw.h"
|
||||
|
||||
#define LOG_TAG_CONST APP
|
||||
#define LOG_TAG "[BSP_HW]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
static uint8_t s_initialized;
|
||||
|
||||
/**
|
||||
* @brief 配置 GPIO 为推挽输出
|
||||
* @param pin GPIO 编号
|
||||
* @param value 输出初值(电平)
|
||||
* @return 无
|
||||
*/
|
||||
static void bsp_pin_output(u32 pin, int value)
|
||||
{
|
||||
gpio_set_pull_up(pin, 0);
|
||||
gpio_set_pull_down(pin, 0);
|
||||
gpio_set_die(pin, 1);
|
||||
gpio_direction_output(pin, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 配置 GPIO 为数字输入(可内部上拉)
|
||||
* @param pin GPIO 编号
|
||||
* @param pull_up 1=内部上拉,0=不上拉
|
||||
* @return 无
|
||||
*/
|
||||
static void bsp_pin_input(u32 pin, int pull_up)
|
||||
{
|
||||
gpio_direction_output(pin, 1);
|
||||
gpio_set_direction(pin, 1);
|
||||
gpio_set_pull_down(pin, 0);
|
||||
gpio_set_pull_up(pin, pull_up ? 1 : 0);
|
||||
gpio_set_die(pin, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化 GPIO
|
||||
* @note 上电顺序:继电器先保持关(PC3=0),灯全灭(LED_ENABLE 由事件表接管)。
|
||||
* @return BSP_HW_OK=成功
|
||||
*/
|
||||
BspHw_Ret_t bsp_hw_init(void)
|
||||
{
|
||||
if (s_initialized) {
|
||||
return BSP_HW_OK;
|
||||
}
|
||||
|
||||
#if BOARD_LED_ENABLE
|
||||
bsp_pin_output(BOARD_LED_RED_PIN, BOARD_LED_ON_LEVEL ? 0 : 1); /* 红灯灭 */
|
||||
bsp_pin_output(BOARD_LED_GREEN_PIN, BOARD_LED_ON_LEVEL ? 0 : 1); /* 绿灯灭 */
|
||||
#else
|
||||
log_info("hw led disabled\n");
|
||||
#endif
|
||||
|
||||
#if BOARD_KEY_ENABLE
|
||||
bsp_pin_input(BOARD_KEY_PIN, 1); /* 上拉输入,低按下 */
|
||||
#else
|
||||
log_info("hw key disabled\n");
|
||||
#endif
|
||||
|
||||
#if BOARD_RELAY_ENABLE
|
||||
bsp_pin_output(BOARD_RELAY_PIN, 0); /* 继电器初始关(PC3=0),开请求等过零 */
|
||||
#else
|
||||
log_info("hw relay disabled\n");
|
||||
#endif
|
||||
|
||||
s_initialized = 1;
|
||||
log_info("hw init led=%d key=%d relay=%d\n",
|
||||
BOARD_LED_ENABLE, BOARD_KEY_ENABLE, BOARD_RELAY_ENABLE);
|
||||
return BSP_HW_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 查询板级硬件是否已初始化
|
||||
* @return BSP_HW_OK=已初始化,BSP_HW_ERR_NOT_INIT=未初始化
|
||||
*/
|
||||
BspHw_Ret_t bsp_hw_get_status(void)
|
||||
{
|
||||
return s_initialized ? BSP_HW_OK : BSP_HW_ERR_NOT_INIT;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 红灯开关(PA7,低电平亮)
|
||||
* @param on 1=亮,0=灭
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_led_red_set(uint8_t on)
|
||||
{
|
||||
#if BOARD_LED_ENABLE
|
||||
gpio_direction_output(BOARD_LED_RED_PIN,
|
||||
on ? BOARD_LED_ON_LEVEL : (BOARD_LED_ON_LEVEL ? 0 : 1));
|
||||
#else
|
||||
(void)on;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 绿灯开关(PA8,低电平亮)
|
||||
* @param on 1=亮,0=灭
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_led_green_set(uint8_t on)
|
||||
{
|
||||
#if BOARD_LED_ENABLE
|
||||
gpio_direction_output(BOARD_LED_GREEN_PIN,
|
||||
on ? BOARD_LED_ON_LEVEL : (BOARD_LED_ON_LEVEL ? 0 : 1));
|
||||
#else
|
||||
(void)on;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 红绿全灭
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_led_all_off(void)
|
||||
{
|
||||
bsp_led_red_set(0);
|
||||
bsp_led_green_set(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读取按键(PB1)
|
||||
* @return 1=按下,0=未按下
|
||||
*/
|
||||
uint8_t bsp_key_is_pressed(void)
|
||||
{
|
||||
#if BOARD_KEY_ENABLE
|
||||
return (uint8_t)(gpio_read(BOARD_KEY_PIN) == BOARD_KEY_ACTIVE_LEVEL);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 直接写继电器 GPIO(只准 app_relay 在过零/超时路径调用)
|
||||
* @param on 1=吸合,0=断开
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_relay_set(uint8_t on)
|
||||
{
|
||||
#if BOARD_RELAY_ENABLE
|
||||
gpio_direction_output(BOARD_RELAY_PIN,
|
||||
on ? BOARD_RELAY_ON_LEVEL : (BOARD_RELAY_ON_LEVEL ? 0 : 1));
|
||||
#else
|
||||
(void)on;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读继电器 GPIO 当前电平
|
||||
* @return 1=吸合,0=断开
|
||||
*/
|
||||
uint8_t bsp_relay_get(void)
|
||||
{
|
||||
#if BOARD_RELAY_ENABLE
|
||||
return (uint8_t)(gpio_read(BOARD_RELAY_PIN) == BOARD_RELAY_ON_LEVEL);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
/******************************************************************************
|
||||
* @file bsp_hw.h
|
||||
* @brief 板级 GPIO:红绿 LED、按键、继电器(过零见 bsp_zc)
|
||||
* @author cyWu <1917507415@qq.com>
|
||||
* @date 2026.09.04
|
||||
* @version V1.1.0
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __BSP_HW_H__
|
||||
#define __BSP_HW_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include "board_pin.h"
|
||||
|
||||
typedef enum {
|
||||
BSP_HW_OK = 0,
|
||||
BSP_HW_ERR_NOT_INIT
|
||||
} BspHw_Ret_t;
|
||||
|
||||
/**
|
||||
* @brief 初始化 GPIO:LED 双通道(初始灭)、按键(上拉输入)、继电器(初始关)
|
||||
* @return BSP_HW_OK=成功
|
||||
*/
|
||||
BspHw_Ret_t bsp_hw_init(void);
|
||||
|
||||
/**
|
||||
* @brief 查询板级硬件是否已初始化
|
||||
* @return BSP_HW_OK=已初始化,BSP_HW_ERR_NOT_INIT=未初始化
|
||||
*/
|
||||
BspHw_Ret_t bsp_hw_get_status(void);
|
||||
|
||||
/* ═══ 红绿 LED(低电平亮;on 传"亮"语义,内部按 BOARD_LED_ON_LEVEL 取反)═══ */
|
||||
|
||||
/**
|
||||
* @brief 红灯开关(PA7)
|
||||
* @param on 1=亮,0=灭
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_led_red_set(uint8_t on);
|
||||
|
||||
/**
|
||||
* @brief 绿灯开关(PA8)
|
||||
* @param on 1=亮,0=灭
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_led_green_set(uint8_t on);
|
||||
|
||||
/**
|
||||
* @brief 红绿全灭
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_led_all_off(void);
|
||||
|
||||
/* ═══ 按键 ═══ */
|
||||
|
||||
/**
|
||||
* @brief 读取按键
|
||||
* @return 1=按下,0=未按下
|
||||
*/
|
||||
uint8_t bsp_key_is_pressed(void);
|
||||
|
||||
/* ═══ 继电器(PC3,高电平导通)═══ */
|
||||
|
||||
/**
|
||||
* @brief 直接写继电器 GPIO(**只准由 app_relay 在过零时刻/超时路径调用**)
|
||||
* @param on 1=吸合(加热开),0=断开(加热关)
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_relay_set(uint8_t on);
|
||||
|
||||
/**
|
||||
* @brief 读继电器 GPIO 当前电平
|
||||
* @return 1=吸合,0=断开
|
||||
*/
|
||||
uint8_t bsp_relay_get(void);
|
||||
|
||||
#endif /* __BSP_HW_H__ */
|
||||
@@ -0,0 +1,192 @@
|
||||
/******************************************************************************
|
||||
* @file bsp_zc.c
|
||||
* @brief PA1 过零:MCPWM FPIN 双沿中断,沿到则回调切继电器
|
||||
* @author cyWu <1917507415@qq.com>
|
||||
* @date 2026.09.04
|
||||
* @version V3.1.0
|
||||
* @history
|
||||
* - V3.1.0, 2026.09.04, cyWu, 状态收进 BspZcCtx_t,去掉无用计数与排障史注释
|
||||
* - V3.0.0, 2026.09.04, cyWu, MCPWM FPIN 硬件边沿中断
|
||||
******************************************************************************/
|
||||
|
||||
#include "system/includes.h"
|
||||
#include "asm/gpio.h"
|
||||
#include "asm/mcpwm.h"
|
||||
#include "asm/hwi.h"
|
||||
#include "asm/irq.h"
|
||||
#include "asm/timer.h"
|
||||
#include "bsp_zc.h"
|
||||
#include "board_pin.h"
|
||||
#include <string.h>
|
||||
|
||||
#define LOG_TAG_CONST APP
|
||||
#define LOG_TAG "[BSP_ZC]"
|
||||
#define LOG_INFO_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
extern PWM_CH_REG *get_pwm_ch_reg(pwm_ch_num_type index);
|
||||
|
||||
typedef struct {
|
||||
BspZcEdgeCb_t edge_cb;
|
||||
volatile uint32_t edge_cnt;
|
||||
volatile uint32_t last_edge_ms;
|
||||
volatile uint8_t last_level;
|
||||
uint8_t initialized;
|
||||
} BspZcCtx_t;
|
||||
|
||||
static BspZcCtx_t s_zc;
|
||||
|
||||
/**
|
||||
* @brief FPIN 边沿 ISR:清 pending、记沿、执行切变回调
|
||||
* @note 中断上下文:禁止 printf / 写 VM / 切 BLE
|
||||
* @return 无
|
||||
*/
|
||||
___interrupt
|
||||
static void bsp_zc_interrupt(void)
|
||||
{
|
||||
if (JL_MCPWM->CH0_CON1 & BIT(15)) {
|
||||
JL_MCPWM->CH0_CON1 |= BIT(14);
|
||||
} else if (JL_MCPWM->CH1_CON1 & BIT(15)) {
|
||||
JL_MCPWM->CH1_CON1 |= BIT(14);
|
||||
} else if (JL_MCPWM->CH2_CON1 & BIT(15)) {
|
||||
JL_MCPWM->CH2_CON1 |= BIT(14);
|
||||
} else if (JL_MCPWM->CH3_CON1 & BIT(15)) {
|
||||
JL_MCPWM->CH3_CON1 |= BIT(14);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
s_zc.edge_cnt++;
|
||||
s_zc.last_edge_ms = (uint32_t)timer_get_ms();
|
||||
s_zc.last_level = (uint8_t)gpio_read(BOARD_ZC_PIN);
|
||||
|
||||
if (s_zc.edge_cb) {
|
||||
s_zc.edge_cb();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 把 PA1 接到一个 FPIN 通道(上升沿或下降沿)
|
||||
* @param index FPIN 通道 0~3
|
||||
* @param rising 1=上升沿,0=下降沿
|
||||
* @return 无
|
||||
*/
|
||||
static void bsp_zc_fpin_channel_init(u8 index, u8 rising)
|
||||
{
|
||||
PWM_CH_REG *pwm_reg;
|
||||
|
||||
if (index > 3) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (rising) {
|
||||
JL_MCPWM->FPIN_CON |= BIT(16 + index);
|
||||
} else {
|
||||
JL_MCPWM->FPIN_CON &= ~BIT(16 + index);
|
||||
}
|
||||
|
||||
#if BOARD_ZC_FPIN_FILTER_EN
|
||||
JL_MCPWM->FPIN_CON |= BIT(8 + index);
|
||||
JL_MCPWM->FPIN_CON |= ((u32)BOARD_ZC_FPIN_FILTER & 0x3FUL);
|
||||
#else
|
||||
JL_MCPWM->FPIN_CON &= ~BIT(8 + index);
|
||||
#endif
|
||||
|
||||
gpio_ich_sel_iutput_signal(BOARD_ZC_PIN,
|
||||
(enum INPUT_CH_SIGNAL)(INPUT_CH_SIGNAL_MC_FPIN0 + index),
|
||||
INPUT_CH_TYPE_GP_ICH);
|
||||
|
||||
request_irq(IRQ_MCPWM_CHX_IDX, 3, bsp_zc_interrupt, 0);
|
||||
|
||||
pwm_reg = get_pwm_ch_reg((pwm_ch_num_type)index);
|
||||
pwm_reg->ch_con1 = BIT(14) | BIT(11) | BIT(4) | (index << 0);
|
||||
JL_MCPWM->MCPWM_CON0 |= BIT(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化 PA1 输入并挂双沿 FPIN 中断
|
||||
* @param cb 沿回调,NULL 则只计数
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_zc_init(BspZcEdgeCb_t cb)
|
||||
{
|
||||
if (s_zc.initialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
memset(&s_zc, 0, sizeof(s_zc));
|
||||
s_zc.edge_cb = cb;
|
||||
|
||||
gpio_set_die(BOARD_ZC_PIN, 1);
|
||||
gpio_set_direction(BOARD_ZC_PIN, 1);
|
||||
gpio_set_pull_up(BOARD_ZC_PIN, BOARD_ZC_PULL_UP);
|
||||
gpio_set_pull_down(BOARD_ZC_PIN, BOARD_ZC_PULL_DOWN);
|
||||
s_zc.last_level = (uint8_t)gpio_read(BOARD_ZC_PIN);
|
||||
|
||||
#if BOARD_ZC_USE_IRQ
|
||||
bsp_zc_fpin_channel_init((u8)BOARD_ZC_FPIN_FALL_CH, 0);
|
||||
#if BOARD_ZC_FPIN_BOTH_EDGE
|
||||
bsp_zc_fpin_channel_init((u8)BOARD_ZC_FPIN_RISE_CH, 1);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
s_zc.initialized = 1;
|
||||
log_info("zc init irq=%d fall=%d rise=%d filt=%d lvl=%d\n",
|
||||
BOARD_ZC_USE_IRQ, BOARD_ZC_FPIN_FALL_CH,
|
||||
#if BOARD_ZC_FPIN_BOTH_EDGE
|
||||
BOARD_ZC_FPIN_RISE_CH,
|
||||
#else
|
||||
-1,
|
||||
#endif
|
||||
BOARD_ZC_FPIN_FILTER_EN, (int)s_zc.last_level);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 1ms 软件采样兜底(须由真实 1ms 定时器调用)
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_zc_scan_1ms(void)
|
||||
{
|
||||
uint8_t lvl;
|
||||
|
||||
if (!s_zc.initialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
lvl = (uint8_t)gpio_read(BOARD_ZC_PIN);
|
||||
if (lvl != s_zc.last_level) {
|
||||
s_zc.last_level = lvl;
|
||||
s_zc.edge_cnt++;
|
||||
s_zc.last_edge_ms = (uint32_t)timer_get_ms();
|
||||
if (s_zc.edge_cb) {
|
||||
s_zc.edge_cb();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 累计过零沿次数
|
||||
* @return 沿计数
|
||||
*/
|
||||
uint32_t bsp_zc_edge_count(void)
|
||||
{
|
||||
return s_zc.edge_cnt;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 最近一次沿的时间戳
|
||||
* @return timer_get_ms(),0=从未检测到
|
||||
*/
|
||||
uint32_t bsp_zc_last_edge_ms(void)
|
||||
{
|
||||
return s_zc.last_edge_ms;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 当前 PA1 电平
|
||||
* @return 0 或 1
|
||||
*/
|
||||
uint8_t bsp_zc_level(void)
|
||||
{
|
||||
return (uint8_t)gpio_read(BOARD_ZC_PIN);
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
/******************************************************************************
|
||||
* @file bsp_zc.h
|
||||
* @brief PA1 过零检测(MCPWM FPIN 双沿中断)
|
||||
* @author cyWu <1917507415@qq.com>
|
||||
* @date 2026.09.04
|
||||
* @version V3.1.0
|
||||
* @history
|
||||
* - V3.1.0, 2026.09.04, cyWu, 精简注释
|
||||
* - V3.0.0, 2026.09.04, cyWu, FPIN 硬件边沿中断
|
||||
*
|
||||
* @note BR28 无通用 GPIO 中断,沿检测复用 MCPWM FPIN(例程 usr_hw_gpio_int.c)。
|
||||
* PA1 占两个通道实现双沿。ISR 只准清 pending、计数、回调切 GPIO。
|
||||
* 软件兜底必须用真实 1ms 定时器,禁止在 20ms 节拍里空循环采样。
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __BSP_ZC_H__
|
||||
#define __BSP_ZC_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef void (*BspZcEdgeCb_t)(void);
|
||||
|
||||
/**
|
||||
* @brief 初始化 PA1 并挂 FPIN 双沿中断
|
||||
* @param cb 沿回调(app_relay 提供),NULL 则只计数
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_zc_init(BspZcEdgeCb_t cb);
|
||||
|
||||
/**
|
||||
* @brief 1ms 软件采样兜底
|
||||
* @note 须由真实 1ms 定时器调用
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_zc_scan_1ms(void);
|
||||
|
||||
/**
|
||||
* @brief 累计过零沿次数
|
||||
* @return 沿计数
|
||||
*/
|
||||
uint32_t bsp_zc_edge_count(void);
|
||||
|
||||
/**
|
||||
* @brief 最近一次沿的时间戳
|
||||
* @return timer_get_ms(),0=从未检测到
|
||||
*/
|
||||
uint32_t bsp_zc_last_edge_ms(void);
|
||||
|
||||
/**
|
||||
* @brief 当前 PA1 电平
|
||||
* @return 0 或 1
|
||||
*/
|
||||
uint8_t bsp_zc_level(void);
|
||||
|
||||
#endif /* __BSP_ZC_H__ */
|
||||
Reference in New Issue
Block a user