mirror of
https://github.com/EFeru/hoverboard-sideboard-hack-GD.git
synced 2026-02-18 08:01:12 +00:00
Initial commit
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
/*!
|
||||
\file gd32f1x0_libopt.h
|
||||
\brief library optional for gd32f1x0
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright (C) 2017 GigaDevice
|
||||
|
||||
2014-12-26, V1.0.0, platform GD32F1x0(x=3,5)
|
||||
2016-01-15, V2.0.0, platform GD32F1x0(x=3,5,7,9)
|
||||
2016-04-30, V3.0.0, firmware update for GD32F1x0(x=3,5,7,9)
|
||||
2017-06-19, V3.1.0, firmware update for GD32F1x0(x=3,5,7,9)
|
||||
*/
|
||||
|
||||
#ifndef GD32F1X0_LIBOPT_H
|
||||
#define GD32F1X0_LIBOPT_H
|
||||
|
||||
#include "gd32f1x0_adc.h"
|
||||
#include "gd32f1x0_cec.h"
|
||||
#include "gd32f1x0_crc.h"
|
||||
#include "gd32f1x0_cmp.h"
|
||||
#include "gd32f1x0_dac.h"
|
||||
#include "gd32f1x0_dbg.h"
|
||||
#include "gd32f1x0_dma.h"
|
||||
#include "gd32f1x0_exti.h"
|
||||
#include "gd32f1x0_fmc.h"
|
||||
#include "gd32f1x0_gpio.h"
|
||||
#include "gd32f1x0_syscfg.h"
|
||||
#include "gd32f1x0_i2c.h"
|
||||
#include "gd32f1x0_fwdgt.h"
|
||||
#include "gd32f1x0_pmu.h"
|
||||
#include "gd32f1x0_rcu.h"
|
||||
#include "gd32f1x0_rtc.h"
|
||||
#include "gd32f1x0_spi.h"
|
||||
#include "gd32f1x0_timer.h"
|
||||
#include "gd32f1x0_usart.h"
|
||||
#include "gd32f1x0_wwdgt.h"
|
||||
#include "gd32f1x0_misc.h"
|
||||
#include "gd32f1x0_tsi.h"
|
||||
#ifdef GD32F170_190
|
||||
#include "gd32f1x0_slcd.h"
|
||||
#include "gd32f1x0_opa.h"
|
||||
#include "gd32f1x0_ivref.h"
|
||||
#include "gd32f1x0_can.h"
|
||||
#endif /* GD32F170_190 */
|
||||
|
||||
#endif /* GD32F1X0_LIBOPT_H */
|
||||
@@ -0,0 +1,197 @@
|
||||
/*!
|
||||
\file main.c
|
||||
\brief TIMERs cascade synchro demo
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright (C) 2017 GigaDevice
|
||||
|
||||
2014-12-26, V1.0.0, platform GD32F1x0(x=3,5)
|
||||
2016-01-15, V2.0.0, platform GD32F1x0(x=3,5,7,9)
|
||||
2016-04-30, V3.0.0, firmware update for GD32F1x0(x=3,5,7,9)
|
||||
2017-06-19, V3.1.0, firmware update for GD32F1x0(x=3,5,7,9)
|
||||
*/
|
||||
|
||||
#include "gd32f1x0.h"
|
||||
#include <stdio.h>
|
||||
#include "gd32f1x0_eval.h"
|
||||
|
||||
void gpio_config(void);
|
||||
void timer_config(void);
|
||||
|
||||
/**
|
||||
\brief configure the GPIO ports
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void gpio_config(void)
|
||||
{
|
||||
rcu_periph_clock_enable(RCU_GPIOA);
|
||||
rcu_periph_clock_enable(RCU_GPIOB);
|
||||
|
||||
/*configure PA6(TIMER2 CH0) as alternate function*/
|
||||
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);
|
||||
|
||||
/*configure PB3(TIMER1 CH1) as alternate function*/
|
||||
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3);
|
||||
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
|
||||
gpio_af_set(GPIOB, GPIO_AF_2, GPIO_PIN_3);
|
||||
|
||||
/*configure PA8(TIMER0 CH0) as alternate function*/
|
||||
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
|
||||
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
|
||||
gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_8);
|
||||
}
|
||||
|
||||
/**
|
||||
\brief configure the TIMER peripheral
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void timer_config(void)
|
||||
{
|
||||
/* timers synchronisation in cascade mode ----------------------------
|
||||
1/TIMER1 is configured as master timer:
|
||||
- PWM mode is used
|
||||
- The TIMER1 update event is used as trigger output
|
||||
|
||||
2/TIMER2 is slave for TIMER1 and master for TIMER0,
|
||||
- PWM mode is used
|
||||
- The ITR1(TIMER1) is used as input trigger
|
||||
- external clock mode is used,the counter counts on the rising edges of
|
||||
the selected trigger.
|
||||
- the TIMER2 update event is used as trigger output.
|
||||
|
||||
3/TIMER0 is slave for TIMER2,
|
||||
- PWM mode is used
|
||||
- The ITR2(TIMER2) is used as input trigger
|
||||
- external clock mode is used,the counter counts on the rising edges of
|
||||
the selected trigger.
|
||||
-------------------------------------------------------------------- */
|
||||
timer_oc_parameter_struct timer_ocintpara;
|
||||
timer_parameter_struct timer_initpara;
|
||||
|
||||
rcu_periph_clock_enable(RCU_TIMER0);
|
||||
rcu_periph_clock_enable(RCU_TIMER1);
|
||||
rcu_periph_clock_enable(RCU_TIMER2);
|
||||
|
||||
/* TIMER1 configuration */
|
||||
timer_deinit(TIMER1);
|
||||
|
||||
timer_initpara.prescaler = 3599;
|
||||
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
|
||||
timer_initpara.counterdirection = TIMER_COUNTER_UP;
|
||||
timer_initpara.period = 3999;
|
||||
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
|
||||
timer_initpara.repetitioncounter = 0;
|
||||
timer_init(TIMER1,&timer_initpara);
|
||||
|
||||
/* CH1 configuration in PWM1 mode */
|
||||
timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
|
||||
timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
|
||||
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
|
||||
timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
|
||||
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
|
||||
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
|
||||
timer_channel_output_config(TIMER1, TIMER_CH_1, &timer_ocintpara);
|
||||
|
||||
timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 1999);
|
||||
timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_PWM1);
|
||||
timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE);
|
||||
|
||||
/* auto-reload preload enable */
|
||||
timer_auto_reload_shadow_enable(TIMER1);
|
||||
/* select the master slave mode */
|
||||
timer_master_slave_mode_config(TIMER1, TIMER_MASTER_SLAVE_MODE_ENABLE);
|
||||
/* TIMER1 update event is used as trigger output */
|
||||
timer_master_output_trigger_source_select(TIMER1, TIMER_TRI_OUT_SRC_UPDATE);
|
||||
|
||||
/* TIMER2 configuration */
|
||||
timer_deinit(TIMER2);
|
||||
|
||||
timer_initpara.prescaler = 0;
|
||||
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
|
||||
timer_initpara.counterdirection = TIMER_COUNTER_UP;
|
||||
timer_initpara.period = 1;
|
||||
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
|
||||
timer_initpara.repetitioncounter = 0;
|
||||
timer_init(TIMER2,&timer_initpara);
|
||||
|
||||
/* CH0 configuration in PWM1 mode */
|
||||
timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
|
||||
timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
|
||||
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
|
||||
timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
|
||||
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
|
||||
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
|
||||
timer_channel_output_config(TIMER2, TIMER_CH_0, &timer_ocintpara);
|
||||
|
||||
timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 1);
|
||||
timer_channel_output_mode_config(TIMER2, TIMER_CH_0, TIMER_OC_MODE_PWM1);
|
||||
timer_channel_output_shadow_config(TIMER2, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);
|
||||
|
||||
/* auto-reload preload enable */
|
||||
timer_auto_reload_shadow_enable(TIMER2);
|
||||
/* slave mode selection: TIMER2 */
|
||||
timer_slave_mode_select(TIMER2, TIMER_SLAVE_MODE_EXTERNAL0);
|
||||
timer_input_trigger_source_select(TIMER2, TIMER_SMCFG_TRGSEL_ITI1);
|
||||
/* select the master slave mode */
|
||||
timer_master_slave_mode_config(TIMER2, TIMER_MASTER_SLAVE_MODE_ENABLE);
|
||||
/* TIMER2 update event is used as trigger output */
|
||||
timer_master_output_trigger_source_select(TIMER2, TIMER_TRI_OUT_SRC_UPDATE);
|
||||
|
||||
/* TIMER0 configuration */
|
||||
timer_deinit(TIMER0);
|
||||
|
||||
timer_initpara.prescaler = 0;
|
||||
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
|
||||
timer_initpara.counterdirection = TIMER_COUNTER_UP;
|
||||
timer_initpara.period = 1;
|
||||
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
|
||||
timer_initpara.repetitioncounter = 0;
|
||||
timer_init(TIMER0,&timer_initpara);
|
||||
|
||||
/* CH0 configuration in PWM1 mode */
|
||||
timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
|
||||
timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
|
||||
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
|
||||
timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
|
||||
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
|
||||
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
|
||||
timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocintpara);
|
||||
|
||||
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 1);
|
||||
timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM1);
|
||||
timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);
|
||||
|
||||
/* auto-reload preload enable */
|
||||
timer_auto_reload_shadow_enable(TIMER0);
|
||||
/* TIMER0 output enable */
|
||||
timer_primary_output_config(TIMER0,ENABLE);
|
||||
/* slave mode selection: TIMER0 */
|
||||
timer_slave_mode_select(TIMER0, TIMER_SLAVE_MODE_EXTERNAL0);
|
||||
timer_input_trigger_source_select(TIMER0, TIMER_SMCFG_TRGSEL_ITI2);
|
||||
|
||||
/* TIMER counter enable */
|
||||
timer_enable(TIMER1);
|
||||
timer_enable(TIMER2);
|
||||
timer_enable(TIMER0);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief main function
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
int main(void)
|
||||
{
|
||||
gpio_config();
|
||||
timer_config();
|
||||
|
||||
while (1);
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
/*!
|
||||
\file readme.txt
|
||||
\brief description of the TIMERs cascade synchro demo
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright (C) 2017 GigaDevice
|
||||
|
||||
2014-12-26, V1.0.0, platform GD32F1x0(x=3,5)
|
||||
2016-01-15, V2.0.0, platform GD32F1x0(x=3,5,7,9)
|
||||
2016-04-30, V3.0.0, firmware update for GD32F1x0(x=3,5,7,9)
|
||||
2017-06-19, V3.1.0, firmware update for GD32F1x0(x=3,5,7,9)
|
||||
*/
|
||||
|
||||
This demo is based on the GD32150R-EVAL/GD32190R-EVAL board, it shows how to
|
||||
synchronize TIMER peripherals in cascade mode.
|
||||
|
||||
In this example three timers are used:
|
||||
1/TIMER1 is configured as master timer:
|
||||
- PWM mode is used
|
||||
- The TIMER1 update event is used as trigger output
|
||||
|
||||
2/TIMER2 is slave for TIMER1 and master for TIMER0,
|
||||
- PWM mode is used
|
||||
- The ITR0(TIMER1) is used as input trigger
|
||||
- External clock mode is used,the counter counts on the rising edges of
|
||||
the selected trigger.
|
||||
- The TIMER2 update event is used as trigger output.
|
||||
|
||||
3/TIMER0 is slave for TIMER2,
|
||||
- PWM mode is used
|
||||
- The ITR1(TIMER2) is used as input trigger
|
||||
- External clock mode is used,the counter counts on the rising edges of
|
||||
the selected trigger.
|
||||
|
||||
The TIMERxCLK is fixed to 72 MHz, the TIMER1 counter clock is :
|
||||
108MHz/3600 = 20 KHz.
|
||||
|
||||
The master timer TIMER1 is running at TIMER1 frequency :
|
||||
TIMER1 frequency = (TIMER1 counter clock)/ (TIMER1 period + 1) = 5 Hz
|
||||
and the duty cycle = TIMER1_CH1CV/(TIMER1_CAR + 1) = 50%
|
||||
|
||||
The TIMER2 is running:
|
||||
- At (TIMER1 frequency)/ (TIMER2 period + 1) = 2.5 Hz and a duty cycle
|
||||
equal to TIMER2_CH0CV/(TIMER2_CAR + 1) = 50%
|
||||
|
||||
The TIMER0 is running:
|
||||
- At (TIMER2 frequency)/ (TIMER0 period + 1) = 1.25 Hz and a duty cycle
|
||||
equal to TIMER0_CH0CV/(TIMER0_CAR + 1) = 50%
|
||||
|
||||
Connect the three pins to a logic analyzer to monitor the different waveforms:
|
||||
- TIMER1_CH1 pin (PB3)
|
||||
- TIMER2_CH0 pin (PA6)
|
||||
- TIMER0_CH0 pin (PA8)
|
||||
|
||||
Reference in New Issue
Block a user