mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 18:57:19 +02:00
Merge branch 'feat/mcpwm_hal_fixes_v3.3' into 'release/v3.3'
mcpwm: add HAL layer support (fix part, backport v3.3) See merge request espressif/esp-idf!7744
This commit is contained in:
@ -79,7 +79,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);
|
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_set_direction(gpio_num, GPIO_MODE_OUTPUT);
|
||||||
gpio_matrix_out(gpio_num, PWM1_OUT0A_IDX + io_signal, 0, 0);
|
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_set_direction(gpio_num, GPIO_MODE_INPUT);
|
||||||
gpio_matrix_in(gpio_num, PWM1_SYNC0_IN_IDX + io_signal - OFFSET_FOR_GPIO_IDX_1, 0);
|
gpio_matrix_in(gpio_num, PWM1_SYNC0_IN_IDX + io_signal - OFFSET_FOR_GPIO_IDX_1, 0);
|
||||||
} else {
|
} else {
|
||||||
@ -625,6 +625,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(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);
|
MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
|
||||||
portENTER_CRITICAL(&mcpwm_spinlock);
|
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) {
|
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_ost = 1;
|
||||||
MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f0_cbc = 0;
|
MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f0_cbc = 0;
|
||||||
@ -656,6 +659,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);
|
MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
|
||||||
portENTER_CRITICAL(&mcpwm_spinlock);
|
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_timer_cfg.timer_en = 1;
|
||||||
MCPWM[mcpwm_num]->cap_cfg_ch[cap_sig].en = 1;
|
MCPWM[mcpwm_num]->cap_cfg_ch[cap_sig].en = 1;
|
||||||
MCPWM[mcpwm_num]->cap_cfg_ch[cap_sig].mode = (1 << cap_edge);
|
MCPWM[mcpwm_num]->cap_cfg_ch[cap_sig].mode = (1 << cap_edge);
|
||||||
|
@ -314,10 +314,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
|
// 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_init(unit, input_sig, fault_sig));
|
||||||
TEST_ESP_OK(mcpwm_fault_set_oneshot_mode(unit, timer, fault_sig, action_a, action_b));
|
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
|
// trigger it
|
||||||
gpio_set_level(FAULT_SIG_NUM, input_sig);
|
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);
|
get_action_level(input_sig, action_a, action_b, 1000, 5);
|
||||||
TEST_ESP_OK(mcpwm_fault_deinit(unit, fault_sig));
|
TEST_ESP_OK(mcpwm_fault_deinit(unit, fault_sig));
|
||||||
}
|
}
|
||||||
@ -666,7 +666,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
|
// 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_fault_input_level_t fault_input[2] = {MCPWM_LOW_LEVEL_TGR, MCPWM_HIGH_LEVEL_TGR};
|
||||||
@ -685,24 +685,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
|
TEST_CASE("MCPWM timer0 one shot fault test", "[mcpwm][test_env=UT_T1_MCPWM][timeout=60]")
|
||||||
// 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]")
|
|
||||||
{
|
{
|
||||||
// API just supports the high level trigger now, so comment it
|
// 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_fault_input_level_t fault_input[2] = {MCPWM_LOW_LEVEL_TGR, MCPWM_HIGH_LEVEL_TGR};
|
||||||
@ -722,7 +705,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
|
// 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_fault_input_level_t fault_input[2] = {MCPWM_LOW_LEVEL_TGR, MCPWM_HIGH_LEVEL_TGR};
|
||||||
@ -741,7 +724,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
|
// 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_fault_input_level_t fault_input[2] = {MCPWM_LOW_LEVEL_TGR, MCPWM_HIGH_LEVEL_TGR};
|
||||||
|
Reference in New Issue
Block a user