FIT moduleを使っていてtroubleに遭遇してしまったところです。

こんにちは。NoMaYです。

FITのDTCモジュールを使おうとしてトラブルに遭遇した所です。(今後、他にもあるかも知れないと思い、タイトルはざっくりしたものにしておきました。) DTCモジュールのサンプルプログラムなのですが、以下のコードの初期設定内容には抜け(赤文字箇所)がありますね。ですので、このサンプルプログラムをコピペしてコードを書いた時、無意識にスタックにdtc_transfer_data_cfg_tの変数を確保してしまったりすると、動作しないプログラムになってしまいます。

r01an1819xx0350-rx-dtc-dmac2/FITDemos/dtc_demo_rskrx65n_2m/dtc_demo_rskrx65n_2m/src/dtc_demo_rskrx65n_2m.c

dtc_transfer_data_cfg_t g_dtc_cfg;
dtc_transfer_data_t g_dtc_info;
dtc_err_t dtc_start(void)
{
    dtc_err_t ret = DTC_SUCCESS;
    dtc_cmd_arg_t args;

    args.act_src                     = DTCE_S12ADC0_S12ADI0;
    g_dtc_cfg.transfer_mode          = DTC_TRANSFER_MODE_REPEAT;
    g_dtc_cfg.data_size              = DTC_DATA_SIZE_WORD;
    g_dtc_cfg.src_addr_mode          = DTC_SRC_ADDR_FIXED;
    g_dtc_cfg.dest_addr_mode         = DTC_DES_ADDR_INCR;
    g_dtc_cfg.response_interrupt     = DTC_INTERRUPT_AFTER_ALL_COMPLETE;
    g_dtc_cfg.repeat_block_side      = DTC_REPEAT_BLOCK_SOURCE;
    g_dtc_cfg.chain_transfer_enable  = DTC_CHAIN_TRANSFER_DISABLE;
    g_dtc_cfg.chain_transfer_mode    = (dtc_chain_transfer_mode_t)0;
    g_dtc_cfg.source_addr            = (uint32_t)&S12AD.ADDR0;
    g_dtc_cfg.dest_addr              = (uint32_t)&g_dtc_buf;
    g_dtc_cfg.transfer_count         = BUF_SIZE;
    args.chain_transfer_nr           = 0;
    args.p_transfer_data             = &g_dtc_info;
    args.p_data_cfg                  = &g_dtc_cfg;

    ret = R_DTC_Control(DTC_CMD_CHANGING_DATA_FORCIBLY_SET, NULL, &args);
    if (DTC_SUCCESS == ret)
    {
        ret = R_DTC_Control(DTC_CMD_ACT_SRC_ENABLE, NULL, &args);
    }
    if (DTC_SUCCESS == ret)
    {
        ret = R_DTC_Control(DTC_CMD_DATA_READ_SKIP_ENABLE, NULL, NULL);
    }
    if (DTC_SUCCESS == ret)
    {
        R_DTC_Control(DTC_CMD_DTC_START, NULL, NULL);
    }

    return ret;
}

なお、DTC_CHAIN_TRANSFER_DISABLEにしているので、chain_transfer_modeの設定は不要だと思ってしまうのですが、FITのDTCモジュールの中で以下のように使われていますので(赤文字箇所)、値を不定にするのは駄目なのですね、、、

src/smc_gen/r_dtc_rx/src/r_dtc_rx.c

static dtc_err_t r_dtc_set_transfer_data(dtc_transfer_data_t *p_transfer_data,
                                   dtc_transfer_data_cfg_t *p_cfg)
{
    dtc_mra_t                          t_mra;
    dtc_mrb_t                          t_mrb;
    dtc_cra_t                          t_cra;
    dtc_crb_t                          t_crb;

    /* Cast type of "p_transfer_data" to match type of "p_td_ptr" */
    volatile dtc_internal_registers_t *p_td_ptr = (volatile dtc_internal_registers_t *)p_transfer_data;

    /* Set for MRA - . */
#if (DTC_IP_VER_DTCb <= DTC_IP)
#if (DTC_ENABLE != DTC_CFG_SHORT_ADDRESS_MODE) /* Full-address mode */
    dtc_mrc_t                          t_mrc;

    /* Casting to match type of "t_mrc.BYTE" */
    t_mrc.BYTE = (uint8_t)(p_cfg->disp_add_enable);
#endif /* (DTC_ENABLE == DTC_CFG_SHORT_ADDRESS_MODE) */
    /* Casting to match type of "t_mra.BYTE" */
    t_mra.BYTE = ((((uint8_t)p_cfg->writeback_disable | (uint8_t)p_cfg->src_addr_mode) | (uint8_t)p_cfg->data_size) | (uint8_t)p_cfg->transfer_mode);

    /* Casting to match type of "t_mrb.BYTE" */
    t_mrb.BYTE = (((((((uint8_t)p_cfg->sequence_end |(uint8_t)p_cfg->refer_index_table_enable) | (uint8_t)p_cfg->dest_addr_mode) |
                           (uint8_t)p_cfg->repeat_block_side) | (uint8_t)p_cfg->response_interrupt) |
                           (uint8_t)p_cfg->chain_transfer_enable) | (uint8_t)p_cfg->chain_transfer_mode);
#else
    略
#endif /* (DTC_IP_VER_DTCb <= DTC_IP) */

    略
}