Hi:
I tested the 160us using a logic analysis instrument, but couldn't capture the waveform.
/* -------------------------------------------------------
* DPPI 通道定义
* 任务通道(Timer CC 事件发布):0~4
* 触发通道(外部事件触发延时):5~9
* ------------------------------------------------------- */
#define DPPI_CH_TASK_1US 0
#define DPPI_CH_TASK_20US 1
#define DPPI_CH_TASK_35US 2
#define DPPI_CH_TASK_160US 3
#define DPPI_CH_TASK_180US 4
#define DPPI_CH_TRIG_1US 5
#define DPPI_CH_TRIG_20US 6
#define DPPI_CH_TRIG_35US 7
#define DPPI_CH_TRIG_160US 8
#define DPPI_CH_TRIG_180US 9
/* 通道组定义 */
#define DPPI_GROUP_1US NRF_DPPI_CHANNEL_GROUP0
#define DPPI_GROUP_20US NRF_DPPI_CHANNEL_GROUP1
#define DPPI_GROUP_35US NRF_DPPI_CHANNEL_GROUP2
#define DPPI_GROUP_160US NRF_DPPI_CHANNEL_GROUP3
#define DPPI_GROUP_180US NRF_DPPI_CHANNEL_GROUP4
void wait_time_dppi_init(void)
{
nrfx_err_t err;
gpiote_inst = get_gpiote_inst();
//dppi_inst = get_dppi_inst();
/* -------------------------------------------------------
* 1. 初始化 TIMER,1MHz = 1tick/us
* ------------------------------------------------------- */
nrfx_timer_config_t config = NRFX_TIMER_DEFAULT_CONFIG(1000000);
err = nrfx_timer_init(wait_timer_inst, &config, NULL);
if (err != NRFX_SUCCESS) {
return;
}
/* -------------------------------------------------------
* 2. 配置 CC 通道(各自独立时间,非累加)
* 每个 CC 触发后自动 STOP + CLEAR,Timer 复位
* ------------------------------------------------------- */
nrfx_timer_extended_compare(wait_timer_inst, NRF_TIMER_CC_CHANNEL0,
nrfx_timer_us_to_ticks(wait_timer_inst, 2),
NRF_TIMER_SHORT_COMPARE0_STOP_MASK |
NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK,
false);
nrfx_timer_extended_compare(wait_timer_inst, NRF_TIMER_CC_CHANNEL1,
nrfx_timer_us_to_ticks(wait_timer_inst, 20),
NRF_TIMER_SHORT_COMPARE1_STOP_MASK |
NRF_TIMER_SHORT_COMPARE1_CLEAR_MASK,
false);
nrfx_timer_extended_compare(wait_timer_inst, NRF_TIMER_CC_CHANNEL2,
nrfx_timer_us_to_ticks(wait_timer_inst, 35),
NRF_TIMER_SHORT_COMPARE2_STOP_MASK |
NRF_TIMER_SHORT_COMPARE2_CLEAR_MASK,
false);
nrfx_timer_extended_compare(wait_timer_inst, NRF_TIMER_CC_CHANNEL3,
nrfx_timer_us_to_ticks(wait_timer_inst, 160),
NRF_TIMER_SHORT_COMPARE3_STOP_MASK |
NRF_TIMER_SHORT_COMPARE3_CLEAR_MASK,
false);
nrfx_timer_extended_compare(wait_timer_inst, NRF_TIMER_CC_CHANNEL4,
nrfx_timer_us_to_ticks(wait_timer_inst, 180),
NRF_TIMER_SHORT_COMPARE4_STOP_MASK |
NRF_TIMER_SHORT_COMPARE4_CLEAR_MASK,
false);
/* -------------------------------------------------------
* 3. TIMER COMPARE 事件发布到对应 DPPI 任务通道
* ------------------------------------------------------- */
nrf_timer_publish_set(NRF_TIMER22,
NRF_TIMER_EVENT_COMPARE0, DPPI_CH_TASK_1US);
nrf_timer_publish_set(NRF_TIMER22,
NRF_TIMER_EVENT_COMPARE1, DPPI_CH_TASK_20US);
nrf_timer_publish_set(NRF_TIMER22,
NRF_TIMER_EVENT_COMPARE2, DPPI_CH_TASK_35US);
nrf_timer_publish_set(NRF_TIMER22,
NRF_TIMER_EVENT_COMPARE3, DPPI_CH_TASK_160US);
nrf_timer_publish_set(NRF_TIMER22,
NRF_TIMER_EVENT_COMPARE4, DPPI_CH_TASK_180US);
/* -------------------------------------------------------
* 4. 每个 DPPI 任务通道放入独立的通道组
* ------------------------------------------------------- */
nrf_dppi_channels_group_set(NRF_DPPIC20,
BIT(DPPI_CH_TASK_1US), DPPI_GROUP_1US);
nrf_dppi_channels_group_set(NRF_DPPIC20,
BIT(DPPI_CH_TASK_20US), DPPI_GROUP_20US);
nrf_dppi_channels_group_set(NRF_DPPIC20,
BIT(DPPI_CH_TASK_35US), DPPI_GROUP_35US);
nrf_dppi_channels_group_set(NRF_DPPIC20,
BIT(DPPI_CH_TASK_160US), DPPI_GROUP_160US);
nrf_dppi_channels_group_set(NRF_DPPIC20,
BIT(DPPI_CH_TASK_180US), DPPI_GROUP_180US);
/* -------------------------------------------------------
* 5. 初始状态:所有通道组禁用
* ------------------------------------------------------- */
nrf_dppi_group_disable(NRF_DPPIC20, DPPI_GROUP_1US);
nrf_dppi_group_disable(NRF_DPPIC20, DPPI_GROUP_20US);
nrf_dppi_group_disable(NRF_DPPIC20, DPPI_GROUP_35US);
nrf_dppi_group_disable(NRF_DPPIC20, DPPI_GROUP_160US);
nrf_dppi_group_disable(NRF_DPPIC20, DPPI_GROUP_180US);
/* -------------------------------------------------------
* 6. 触发通道 → 自动启用对应通道组(EN 任务订阅)
* 外部事件发布到 DPPI_CH_TRIG_XXX 时,
* 对应通道组自动启用
* ------------------------------------------------------- */
nrf_dppi_subscribe_set(NRF_DPPIC20,
nrf_dppi_group_enable_task_get(DPPI_GROUP_1US),
DPPI_CH_TRIG_1US);
nrf_dppi_subscribe_set(NRF_DPPIC20,
nrf_dppi_group_enable_task_get(DPPI_GROUP_20US),
DPPI_CH_TRIG_20US);
nrf_dppi_subscribe_set(NRF_DPPIC20,
nrf_dppi_group_enable_task_get(DPPI_GROUP_35US),
DPPI_CH_TRIG_35US);
nrf_dppi_subscribe_set(NRF_DPPIC20,
nrf_dppi_group_enable_task_get(DPPI_GROUP_160US),
DPPI_CH_TRIG_160US);
nrf_dppi_subscribe_set(NRF_DPPIC20,
nrf_dppi_group_enable_task_get(DPPI_GROUP_180US),
DPPI_CH_TRIG_180US);
nrf_timer_subscribe_set(NRF_TIMER22,
NRF_TIMER_TASK_START,
DPPI_CH_TRIG_160US);
/* -------------------------------------------------------
* 7. CC 事件触发后 → 自动禁用对应通道组(DIS 任务订阅)
* Timer 计数到目标值后,对应通道组自动禁用
* ------------------------------------------------------- */
nrf_dppi_subscribe_set(NRF_DPPIC20,
nrf_dppi_group_disable_task_get(DPPI_GROUP_1US),
DPPI_CH_TASK_1US);
nrf_dppi_subscribe_set(NRF_DPPIC20,
nrf_dppi_group_disable_task_get(DPPI_GROUP_20US),
DPPI_CH_TASK_20US);
nrf_dppi_subscribe_set(NRF_DPPIC20,
nrf_dppi_group_disable_task_get(DPPI_GROUP_35US),
DPPI_CH_TASK_35US);
nrf_dppi_subscribe_set(NRF_DPPIC20,
nrf_dppi_group_disable_task_get(DPPI_GROUP_160US),
DPPI_CH_TASK_160US);
nrf_dppi_subscribe_set(NRF_DPPIC20,
nrf_dppi_group_disable_task_get(DPPI_GROUP_180US),
DPPI_CH_TASK_180US);
/* -------------------------------------------------------
* 8. 使能所有触发通道和任务通道
* ------------------------------------------------------- */
nrf_dppi_channels_enable(NRF_DPPIC20,
BIT(DPPI_CH_TRIG_1US) |
BIT(DPPI_CH_TRIG_20US) |
BIT(DPPI_CH_TRIG_35US) |
BIT(DPPI_CH_TRIG_160US) |
BIT(DPPI_CH_TRIG_180US) |
BIT(DPPI_CH_TASK_1US) |
BIT(DPPI_CH_TASK_20US) |
BIT(DPPI_CH_TASK_35US) |
BIT(DPPI_CH_TASK_160US) |
BIT(DPPI_CH_TASK_180US));
}
void gpio_init(void)
{
/* 2. 分配 GPIOTE 通道 */
int err = nrfx_gpiote_channel_alloc(gpiote_inst, &gpioe_channel_cs);
if (err != NRFX_SUCCESS) {
return;
}
/* 3. 配置 CS 引脚为 GPIOTE 输出任务模式 */
static const nrfx_gpiote_output_config_t output_config = {
.drive = NRF_GPIO_PIN_S0S1,
.input_connect = NRF_GPIO_PIN_INPUT_DISCONNECT,
.pull = NRF_GPIO_PIN_NOPULL,
};
/* CS 初始高电平(未选中),TOGGLE 模式 */
const nrfx_gpiote_task_config_t task_config = {
.task_ch = gpioe_channel_cs,
.polarity = NRF_GPIOTE_POLARITY_TOGGLE,
.init_val = NRF_GPIOTE_INITIAL_VALUE_HIGH, /* CS 默认高 */
};
err = nrfx_gpiote_output_configure(gpiote_inst,
CS_PIN,
&output_config,
&task_config);
printf("gpiote output configure state: 0x%x\n", err);
if (err != NRFX_SUCCESS) {
return;
}
/* 4. 使能 GPIOTE 输出任务 */
nrfx_gpiote_out_task_enable(gpiote_inst, CS_PIN);
/* GPIOTE SET 任务(CS拉低)订阅通道1 */
nrf_gpiote_subscribe_set(gpiote_inst->p_reg,
nrf_gpiote_clr_task_get(gpioe_channel_cs),
DPPI_CH_TRIG_160US);
nrf_gpiote_subscribe_set(gpiote_inst->p_reg,
nrf_gpiote_set_task_get(gpioe_channel_cs),
DPPI_CH_TASK_160US);
}
void publish_evt()
{
/* 1. 让 EGU 的 TRIGGERED 事件 publish 到 DPPI_CH_TRIG_160US */
nrf_egu_publish_set(NRF_EGU20, NRF_EGU_EVENT_TRIGGERED0, DPPI_CH_TRIG_160US);
/* 2. 使能该 DPPI 通道 */
//nrf_dppi_channels_enable(NRF_DPPIC20, BIT(DPPI_CH_TRIG_160US));
/* 3. 软件触发 EGU task,产生事件,发布到 DPPI_CH_TRIG_160US */
nrf_egu_task_trigger(NRF_EGU20, NRF_EGU_TASK_TRIGGER0);
//nrfx_timer_enable(wait_timer_inst); // 或 nrf_timer_task_trigger(NRF_TIMER22, NRF_TIMER_TASK_START)
}
int main(void)
{
wait_time_dppi_init();
gpio_init();
while(1)
{
publish_evt();
k_sleep(K_MSEC(1000));
}
}