From 8c148ede226b8a97c5949c36dc5bfe8f023e727d Mon Sep 17 00:00:00 2001 From: michael Date: Fri, 8 Nov 2019 02:47:00 +0800 Subject: [PATCH 1/3] mcpwm: enable some unit tests again --- components/driver/test/test_pwm.c | 25 ++++--------------------- tools/ci/config/target-test.yml | 1 + 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/components/driver/test/test_pwm.c b/components/driver/test/test_pwm.c index b787f8e3ab..d419363252 100644 --- a/components/driver/test/test_pwm.c +++ b/components/driver/test/test_pwm.c @@ -665,7 +665,7 @@ TEST_CASE("MCPWM timer1 cycle fault test", "[mcpwm][test_env=UT_T1_MCPWM][timeou } } -TEST_CASE("MCPWM timer2 cycle fault test", "[mcpwm][test_env=UT_T1_MCPWM][timeout=180][ignore]") +TEST_CASE("MCPWM timer2 cycle fault test", "[mcpwm][test_env=UT_T1_MCPWM][timeout=180]") { // API just supports the high level trigger now, so comment it // mcpwm_fault_input_level_t fault_input[2] = {MCPWM_LOW_LEVEL_TGR, MCPWM_HIGH_LEVEL_TGR}; @@ -684,24 +684,7 @@ TEST_CASE("MCPWM timer2 cycle fault test", "[mcpwm][test_env=UT_T1_MCPWM][timeou } } -// to debug the "mcpwm_fault_deinit" case. The "MCPWM_NO_CHANGE_IN_MCPWMXA, MCPWM_FORCE_MCPWMXB_HIGH" scenario can work right -// however, the mcpwm_fault_deinit can not release the status after "MCPWM_NO_CHANGE_IN_MCPWMXA, MCPWM_FORCE_MCPWMXB_LOW" scenario -TEST_CASE("MCPWM timer0 one shot fault test single", "[mcpwm][test_env=UT_T1_MCPWM][timeout=60]") -{ - // API just supports the high level trigger now, so comment it -// mcpwm_fault_input_level_t fault_input[2] = {MCPWM_LOW_LEVEL_TGR, MCPWM_HIGH_LEVEL_TGR}; - mcpwm_action_on_pwmxa_t action_a[4] = {MCPWM_NO_CHANGE_IN_MCPWMXA, MCPWM_FORCE_MCPWMXA_LOW, MCPWM_FORCE_MCPWMXA_HIGH, MCPWM_TOG_MCPWMXA}; - mcpwm_action_on_pwmxb_t action_b[4] = {MCPWM_NO_CHANGE_IN_MCPWMXB, MCPWM_FORCE_MCPWMXB_LOW, MCPWM_FORCE_MCPWMXB_HIGH, MCPWM_TOG_MCPWMXB}; - - oneshot_fault_test(MCPWM_UNIT_0, MCPWM0A, MCPWM0B, MCPWM_TIMER_0, - MCPWM_SELECT_F0, MCPWM_HIGH_LEVEL_TGR, MCPWM_FAULT_0, - action_a[0], action_b[2]); -} - -// the mcpwm_fault_deinit can not release the status after "MCPWM_NO_CHANGE_IN_MCPWMXA, MCPWM_FORCE_MCPWMXB_LOW" scenario -// set it ignore -// same as the case "MCPWM timer1 one shot fault test" and case "MCPWM timer2 one shot fault test" -TEST_CASE("MCPWM timer0 one shot fault test", "[mcpwm][test_env=UT_T1_MCPWM][timeout=60][ignore]") +TEST_CASE("MCPWM timer0 one shot fault test", "[mcpwm][test_env=UT_T1_MCPWM][timeout=60]") { // API just supports the high level trigger now, so comment it // mcpwm_fault_input_level_t fault_input[2] = {MCPWM_LOW_LEVEL_TGR, MCPWM_HIGH_LEVEL_TGR}; @@ -721,7 +704,7 @@ TEST_CASE("MCPWM timer0 one shot fault test", "[mcpwm][test_env=UT_T1_MCPWM][tim } } -TEST_CASE("MCPWM timer1 one shot fault test", "[mcpwm][test_env=UT_T1_MCPWM][timeout=60][ignore]") +TEST_CASE("MCPWM timer1 one shot fault test", "[mcpwm][test_env=UT_T1_MCPWM][timeout=60]") { // API just supports the high level trigger now, so comment it // mcpwm_fault_input_level_t fault_input[2] = {MCPWM_LOW_LEVEL_TGR, MCPWM_HIGH_LEVEL_TGR}; @@ -740,7 +723,7 @@ TEST_CASE("MCPWM timer1 one shot fault test", "[mcpwm][test_env=UT_T1_MCPWM][tim } } -TEST_CASE("MCPWM timer2 one shot fault test", "[mcpwm][test_env=UT_T1_MCPWM][timeout=60][ignore]") +TEST_CASE("MCPWM timer2 one shot fault test", "[mcpwm][test_env=UT_T1_MCPWM][timeout=60]") { // API just supports the high level trigger now, so comment it // mcpwm_fault_input_level_t fault_input[2] = {MCPWM_LOW_LEVEL_TGR, MCPWM_HIGH_LEVEL_TGR}; diff --git a/tools/ci/config/target-test.yml b/tools/ci/config/target-test.yml index 8a4ab5b7cc..879559d595 100644 --- a/tools/ci/config/target-test.yml +++ b/tools/ci/config/target-test.yml @@ -331,6 +331,7 @@ UT_022: UT_023: extends: .unit_test_template + parallel: 2 tags: - ESP32_IDF - UT_T1_MCPWM From 0f10d12b81fbda0f03d69a51cb06b5f9121897a1 Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 17 Nov 2019 20:52:33 +0800 Subject: [PATCH 2/3] mcpwm: fix the fault handling and capture issues 1. The fault signal 3 for unit 2 is corrected to the right value 2. Now `mcpwm_fault_set_oneshot_mode` will clear the status before, no need to reset the peripheral. 3. The capture feature relies on the prescaler, but it's only initialized in the mcpwm_init funciton, which is used to initialize a PWM channel. This means, the capture may not work correctly if no PWM channel is enabled. Now the prescaler is also updated when `mcpwm_capture_enable` is called. --- components/driver/mcpwm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/components/driver/mcpwm.c b/components/driver/mcpwm.c index 714855ea5a..cc0ac67fae 100644 --- a/components/driver/mcpwm.c +++ b/components/driver/mcpwm.c @@ -75,7 +75,7 @@ esp_err_t mcpwm_gpio_init(mcpwm_unit_t mcpwm_num, mcpwm_io_signals_t io_signal, MCPWM_CHECK((GPIO_IS_VALID_OUTPUT_GPIO(gpio_num)), MCPWM_GPIO_ERROR, ESP_ERR_INVALID_ARG); gpio_set_direction(gpio_num, GPIO_MODE_OUTPUT); gpio_matrix_out(gpio_num, PWM1_OUT0A_IDX + io_signal, 0, 0); - } else if (io_signal >= MCPWM_SYNC_0 && io_signal < MCPWM_FAULT_2) { + } else if (io_signal >= MCPWM_SYNC_0 && io_signal <= MCPWM_FAULT_2) { gpio_set_direction(gpio_num, GPIO_MODE_INPUT); gpio_matrix_in(gpio_num, PWM1_SYNC0_IN_IDX + io_signal - OFFSET_FOR_GPIO_IDX_1, 0); } else { @@ -621,6 +621,9 @@ esp_err_t mcpwm_fault_set_oneshot_mode(mcpwm_unit_t mcpwm_num, mcpwm_timer_t tim MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG); MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG); portENTER_CRITICAL(&mcpwm_spinlock); + //clear the ost triggered status + MCPWM[mcpwm_num]->channel[timer_num].tz_cfg1.clr_ost = 1; + MCPWM[mcpwm_num]->channel[timer_num].tz_cfg1.clr_ost = 0; if (fault_sig == MCPWM_SELECT_F0) { MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f0_ost = 1; MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f0_cbc = 0; @@ -652,6 +655,9 @@ esp_err_t mcpwm_capture_enable(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t ca { MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG); portENTER_CRITICAL(&mcpwm_spinlock); + //We have to do this here, since there is no standalone init function + //without enabling any PWM channels. + MCPWM[mcpwm_num]->clk_cfg.prescale = MCPWM_CLK_PRESCL; MCPWM[mcpwm_num]->cap_timer_cfg.timer_en = 1; MCPWM[mcpwm_num]->cap_cfg_ch[cap_sig].en = 1; MCPWM[mcpwm_num]->cap_cfg_ch[cap_sig].mode = (1 << cap_edge); From 9037b8fb528c53b4de6b1286bcc873a1c476d26a Mon Sep 17 00:00:00 2001 From: "Michael (XIAO Xufeng)" Date: Sat, 15 Feb 2020 23:10:33 +0800 Subject: [PATCH 3/3] mcpwm: decrease test time cherry-pick 538540ce --- components/driver/test/test_pwm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/driver/test/test_pwm.c b/components/driver/test/test_pwm.c index d419363252..5e2f8526ec 100644 --- a/components/driver/test/test_pwm.c +++ b/components/driver/test/test_pwm.c @@ -313,10 +313,10 @@ static void oneshot_fault_test(mcpwm_unit_t unit, mcpwm_io_signals_t mcpwm_a, mc // one shot mode, it just can be triggered once TEST_ESP_OK(mcpwm_fault_init(unit, input_sig, fault_sig)); TEST_ESP_OK(mcpwm_fault_set_oneshot_mode(unit, timer, fault_sig, action_a, action_b)); - vTaskDelay(1000 / portTICK_RATE_MS); + vTaskDelay(10/ portTICK_RATE_MS); // trigger it gpio_set_level(FAULT_SIG_NUM, input_sig); - vTaskDelay(1000 / portTICK_RATE_MS); + vTaskDelay(10/ portTICK_RATE_MS); get_action_level(input_sig, action_a, action_b, 1000, 5); TEST_ESP_OK(mcpwm_fault_deinit(unit, fault_sig)); }