こんにちは。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) */ 略}