From 0dbf1540703a8f82b84e6fa5971b87d4a4501bb3 Mon Sep 17 00:00:00 2001 From: yelvlab Date: Tue, 24 Sep 2024 00:41:12 +0800 Subject: [PATCH] for test input capture PA9->PA6 TIMER0->TIMER2 --- inc/input_capture_exp.h | 3 + inc/peripheral.h | 11 --- inc/ultrasonic_driver.h | 18 ----- src/gd32e23x_it.c | 17 +---- src/input_capture_exp.c | 144 ++++++++++++++++++++++++++++++++++++++++ src/main.c | 4 ++ src/ultrasonic_driver.c | 95 -------------------------- 7 files changed, 152 insertions(+), 140 deletions(-) delete mode 100644 inc/peripheral.h diff --git a/inc/input_capture_exp.h b/inc/input_capture_exp.h index 987ba28..4a96280 100644 --- a/inc/input_capture_exp.h +++ b/inc/input_capture_exp.h @@ -5,4 +5,7 @@ #ifndef INPUT_CAPTURE_EXP_H #define INPUT_CAPTURE_EXP_H +void input_capture_config(void); +void pwm_config(void); + #endif //INPUT_CAPTURE_EXP_H diff --git a/inc/peripheral.h b/inc/peripheral.h deleted file mode 100644 index 31004a4..0000000 --- a/inc/peripheral.h +++ /dev/null @@ -1,11 +0,0 @@ -// -// Created by yelv1 on 24-9-22. -// - -#ifndef PERIPHERAL_H -#define PERIPHERAL_H - -void usart_config(void); -void led_blink_config(void); - -#endif //PERIPHERAL_H diff --git a/inc/ultrasonic_driver.h b/inc/ultrasonic_driver.h index 02d3f7e..754b6e5 100644 --- a/inc/ultrasonic_driver.h +++ b/inc/ultrasonic_driver.h @@ -7,12 +7,6 @@ #include "gd32e23x.h" -#define LED_PORT GPIOA -#define LED_PIN GPIO_PIN_9 -#define LED_RCU RCU_GPIOA -#define LED_TIMER TIMER13 -#define LED_IRQ TIMER13_IRQn - #define USART_RCU RCU_USART0 #define USART_GPIO_RCU RCU_GPIOA #define USARET_GPIO_PORT GPIOA @@ -21,18 +15,6 @@ #define USART0_PHY USART0 #define USART_BAUDRATE 115200U -#define US_TRAN_GPIO_RCU RCU_GPIOB -#define US_TRAN_GPIO_PORT GPIOB -#define US_TRAN_PIN GPIO_PIN_1 - -#define US_TRAN_RCU RCU_TIMER2 -#define US_TRAN_TIMER TIMER2 -#define US_TRAN_CH TIMER_CH_3 - -void led_config(void); void usart_config(void); -void ultrasonic_config(void); -void ultrasonic_peripheral_config(void); -void ultrasonic_pwm_out_cycles(uint8_t cycles); #endif //ULTRASONIC_DRIVER_H \ No newline at end of file diff --git a/src/gd32e23x_it.c b/src/gd32e23x_it.c index ebea871..a9e86f4 100644 --- a/src/gd32e23x_it.c +++ b/src/gd32e23x_it.c @@ -99,20 +99,5 @@ void SysTick_Handler(void) } void TIMER13_IRQHandler(void) { - if (timer_interrupt_flag_get(TIMER13, TIMER_INT_FLAG_UP) == SET) - { - timer_interrupt_flag_clear(TIMER13, TIMER_INT_FLAG_UP); - static uint8_t led_status = 0; - if (led_status) - { - //! turn on led & reconfig timer13 period to 19000(1900ms) - gpio_bit_write(GPIOA, GPIO_PIN_9, RESET); - timer_autoreload_value_config(TIMER13, 19200); - } else { - //! turn off led & reconfig timer13 period to 1000(100ms) - gpio_bit_write(GPIOA, GPIO_PIN_9, SET); - timer_autoreload_value_config(TIMER13, 800); - } - led_status = !led_status; - } + } \ No newline at end of file diff --git a/src/input_capture_exp.c b/src/input_capture_exp.c index 7f9586f..45447e5 100644 --- a/src/input_capture_exp.c +++ b/src/input_capture_exp.c @@ -5,3 +5,147 @@ #include "input_capture_exp.h" #include "gd32e23x.h" +/* + * TIMER0-CH2(PA9) output 1K 50%duty + * TIMER2 CH0(PA6) input capture + */ + +void input_capture_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + + gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6); + gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6); + gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_6); + + timer_ic_parameter_struct timer_icinitpara; + timer_parameter_struct timer_initpara; + + /* enable the TIMER clock */ + rcu_periph_clock_enable(RCU_TIMER2); + /* disable a TIMER */ + timer_deinit(TIMER2); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER2 configuration */ + timer_initpara.prescaler = 71; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 65535; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_init(TIMER2, &timer_initpara); + + /* TIMER2 configuration */ + /* initialize TIMER channel input parameter struct */ + timer_channel_input_struct_para_init(&timer_icinitpara); + /* TIMER2 CH0 input capture configuration */ + timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING; + timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI; + timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1; + timer_icinitpara.icfilter = 0x0; + timer_input_capture_config(TIMER2,TIMER_CH_0,&timer_icinitpara); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER2); + /* clear channel 0 interrupt bit */ + timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH0); + /* channel 0 interrupt enable */ + timer_interrupt_enable(TIMER2,TIMER_INT_CH0); + + /* TIMER2 counter enable */ + timer_enable(TIMER2); + + nvic_irq_enable(TIMER2_IRQn, 0); +} + +/* + * GPIOB-1 PWM output + * TIMER13_CH0(AF0) + */ +void pwm_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOB); + + gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1); + gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); + gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_1); + + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER13); + timer_deinit(TIMER13); + + timer_struct_para_init(&timer_initpara); + timer_initpara.prescaler = 71; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_init(TIMER13, &timer_initpara); + + timer_channel_output_struct_para_init(&timer_ocinitpara); + timer_ocinitpara.outputstate =TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate =TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity =TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity =TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate =TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate =TIMER_OCN_IDLE_STATE_LOW; + timer_channel_output_config(TIMER13, TIMER_CH_0, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER13, TIMER_CH_0, 500); + timer_channel_output_mode_config(TIMER13, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_auto_reload_shadow_enable(TIMER13); + + // timer_interrupt_enable(TIMER13, TIMER_INT_UP); + // nvic_irq_enable(TIMER13_IRQn, 1); + timer_enable(TIMER13); +/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/ + rcu_periph_clock_enable(RCU_GPIOA); + + gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10); + gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10); + gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_10); + + gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9); + gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); + gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_9); + + // timer_oc_parameter_struct timer_ocinitpara; + // timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER0); + timer_deinit(TIMER0); + + timer_struct_para_init(&timer_initpara); + timer_initpara.prescaler = 71; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_init(TIMER0, &timer_initpara); + + timer_channel_output_struct_para_init(&timer_ocinitpara); + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + timer_channel_output_config(TIMER0, TIMER_CH_2, &timer_ocinitpara); + timer_channel_output_config(TIMER0, TIMER_CH_1, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_2, 500); + timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE); + + timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_1, 500); + timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM1); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE); + + timer_primary_output_config(TIMER0, ENABLE); + + timer_auto_reload_shadow_enable(TIMER0); + + timer_enable(TIMER0); +} diff --git a/src/main.c b/src/main.c index 44ded2d..c3536a1 100644 --- a/src/main.c +++ b/src/main.c @@ -11,6 +11,7 @@ #include "gd32e23x_libopt.h" #include "ultrasonic_driver.h" +#include "input_capture_exp.h" #define ULTRASONIC_CYCLES 0x05U @@ -27,6 +28,9 @@ int main(void) /* configure ultrasonic board hardware */ // ultrasonic_config(); usart_config(); + input_capture_config(); + + pwm_config(); /* ---------- debug start ---------- */ diff --git a/src/ultrasonic_driver.c b/src/ultrasonic_driver.c index 6ffaa26..9647091 100644 --- a/src/ultrasonic_driver.c +++ b/src/ultrasonic_driver.c @@ -6,34 +6,6 @@ #include "gd32e23x.h" #include "systick.h" -uint8_t speed_pwm = 30; //bldc default pwm is 30 - -void led_config(void) -{ - rcu_periph_clock_enable(LED_RCU); - - gpio_mode_set(LED_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_PIN); - gpio_output_options_set(LED_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED_PIN); - gpio_bit_write(LED_PORT, LED_PIN, SET); - - rcu_periph_clock_enable(RCU_TIMER13); - timer_deinit(RCU_TIMER13); - - timer_parameter_struct timer_initpara; - timer_struct_para_init(&timer_initpara); - timer_initpara.prescaler =7199; - timer_initpara.alignedmode =TIMER_COUNTER_EDGE; - timer_initpara.counterdirection =TIMER_COUNTER_UP; - timer_initpara.period =999; - timer_initpara.clockdivision =TIMER_CKDIV_DIV1; - timer_init(LED_TIMER, &timer_initpara); - - timer_auto_reload_shadow_enable(LED_TIMER); - timer_interrupt_enable(LED_TIMER, TIMER_INT_UP); - nvic_irq_enable(LED_IRQ, 0); - timer_enable(LED_TIMER); -} - void usart_config(void) { rcu_periph_clock_enable(USART_GPIO_RCU); @@ -53,70 +25,3 @@ void usart_config(void) usart_enable(USART0_PHY); } - -void ultrasonic_config(void) -{ - rcu_periph_clock_enable(US_TRAN_GPIO_RCU); - - gpio_mode_set(US_TRAN_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, US_TRAN_PIN); - gpio_output_options_set(US_TRAN_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, US_TRAN_PIN); - gpio_af_set(US_TRAN_GPIO_PORT, GPIO_AF_1, US_TRAN_PIN); - - timer_oc_parameter_struct timer_ocinitpara; - timer_parameter_struct timer_initpara; - - rcu_periph_clock_enable(US_TRAN_RCU); - timer_deinit(US_TRAN_TIMER); - - timer_struct_para_init(&timer_initpara); - timer_initpara.prescaler = 0; - timer_initpara.alignedmode = TIMER_COUNTER_EDGE; - timer_initpara.counterdirection = TIMER_COUNTER_UP; - timer_initpara.period = 239; - timer_initpara.clockdivision = TIMER_CKDIV_DIV1; - timer_init(US_TRAN_TIMER, &timer_initpara); - - timer_channel_output_struct_para_init(&timer_ocinitpara); - timer_ocinitpara.outputstate =TIMER_CCX_ENABLE; - timer_ocinitpara.outputnstate =TIMER_CCXN_DISABLE; - timer_ocinitpara.ocpolarity =TIMER_OC_POLARITY_HIGH; - timer_ocinitpara.ocnpolarity =TIMER_OCN_POLARITY_HIGH; - timer_ocinitpara.ocidlestate =TIMER_OC_IDLE_STATE_LOW; - timer_ocinitpara.ocnidlestate =TIMER_OCN_IDLE_STATE_LOW; - timer_channel_output_config(US_TRAN_TIMER, US_TRAN_CH, &timer_ocinitpara); - - timer_channel_output_pulse_value_config(US_TRAN_TIMER, US_TRAN_CH, 120); - timer_channel_output_mode_config(US_TRAN_TIMER, US_TRAN_CH, TIMER_OC_MODE_PWM0); - timer_auto_reload_shadow_enable(US_TRAN_TIMER); - - timer_interrupt_enable(US_TRAN_TIMER, TIMER_INT_UP); - // nvic_irq_enable(TIMER2_IRQn, 1); - // timer_enable(TIMER2); -} - -void ultrasonic_peripheral_config(void) { - led_config(); - usart_config(); - ultrasonic_config(); -} - -void ultrasonic_pwm_out_cycles(uint8_t cycles) { - uint8_t current_cycle = 0; - - timer_channel_output_pulse_value_config(US_TRAN_TIMER, US_TRAN_CH, 120); - timer_channel_output_mode_config(US_TRAN_TIMER, US_TRAN_CH, TIMER_OC_MODE_PWM1); - timer_enable(US_TRAN_TIMER); - - while (current_cycle < cycles) - { - while (!timer_interrupt_flag_get(US_TRAN_TIMER, TIMER_INT_FLAG_UP)); - timer_interrupt_flag_clear(US_TRAN_TIMER, TIMER_INT_FLAG_UP); - current_cycle ++; - } - // delay_nop(); - timer_disable(US_TRAN_TIMER); - // if(gpio_output_bit_get(GPIOB, GPIO_PIN_1) == SET) - // { - // gpio_bit_reset(GPIOB, GPIO_PIN_1); - // } -} \ No newline at end of file