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,151 @@
|
||||
/*!
|
||||
\file gd32f1x0_it.c
|
||||
\brief interrupt service routines
|
||||
*/
|
||||
|
||||
/*
|
||||
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_it.h"
|
||||
#include <stdio.h>
|
||||
|
||||
__IO uint32_t ic1value = 0,ic2value = 0;
|
||||
__IO uint16_t dutycycle = 0;
|
||||
__IO float frequency = 0;
|
||||
|
||||
/*!
|
||||
\brief this function handles NMI exception
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void NMI_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief this function handles HardFault exception
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void HardFault_Handler(void)
|
||||
{
|
||||
/* if Hard Fault exception occurs, go to infinite loop */
|
||||
while (1);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief this function handles MemManage exception
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void MemManage_Handler(void)
|
||||
{
|
||||
/* if Memory Manage exception occurs, go to infinite loop */
|
||||
while (1);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief this function handles BusFault exception
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void BusFault_Handler(void)
|
||||
{
|
||||
/* if Bus Fault exception occurs, go to infinite loop */
|
||||
while (1);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief this function handles UsageFault exception
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void UsageFault_Handler(void)
|
||||
{
|
||||
/* if Usage Fault exception occurs, go to infinite loop */
|
||||
while (1);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief this function handles SVC exception
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void SVC_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief this function handles DebugMon exception
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void DebugMon_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief this function handles PendSV exception
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void PendSV_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief this function handles SysTick exception
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void SysTick_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief this function handles TIMER2 interrupt request
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void TIMER2_IRQHandler(void)
|
||||
{
|
||||
if(SET == timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_CH0)){
|
||||
/* clear channel 0 interrupt bit */
|
||||
timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH0);
|
||||
/* read channel 0 capture value */
|
||||
ic1value = timer_channel_capture_value_register_read(TIMER2,TIMER_CH_0)+1;
|
||||
|
||||
if(0 != ic1value){
|
||||
/* read channel 1 capture value */
|
||||
ic2value = timer_channel_capture_value_register_read(TIMER2,TIMER_CH_1)+1;
|
||||
|
||||
/* calculate the duty cycle value */
|
||||
dutycycle = (ic2value * 100) / ic1value;
|
||||
/* calculate the frequency value */
|
||||
frequency = (float)1000000 / ic1value;
|
||||
|
||||
printf("\r\nthe value1 is %d, the value2 is %d\n", ic1value, ic2value);
|
||||
printf("\r\nthe count is %d\n",(ic1value - ic2value));
|
||||
printf("\r\nthe dutycycle is %d\n", dutycycle);
|
||||
printf("\r\nthe frequence is %f\r\n", frequency);
|
||||
}else{
|
||||
dutycycle = 0;
|
||||
frequency = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/*!
|
||||
\file gd32f1x0_it.h
|
||||
\brief the header file of the ISR
|
||||
*/
|
||||
|
||||
/*
|
||||
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_IT_H
|
||||
#define GD32F1X0_IT_H
|
||||
|
||||
#include "gd32f1x0.h"
|
||||
|
||||
/* function declarations */
|
||||
/* NMI handle function */
|
||||
void NMI_Handler(void);
|
||||
/* HardFault handle function */
|
||||
void HardFault_Handler(void);
|
||||
/* MemManage handle function */
|
||||
void MemManage_Handler(void);
|
||||
/* BusFault handle function */
|
||||
void BusFault_Handler(void);
|
||||
/* UsageFault handle function */
|
||||
void UsageFault_Handler(void);
|
||||
/* SVC handle function */
|
||||
void SVC_Handler(void);
|
||||
/* DebugMon handle function */
|
||||
void DebugMon_Handler(void);
|
||||
/* PendSV handle function */
|
||||
void PendSV_Handler(void);
|
||||
/* SysTick handle function */
|
||||
void SysTick_Handler(void);
|
||||
/* TIMER2 handle function */
|
||||
void TIMER2_IRQHandler(void);
|
||||
|
||||
#endif /* GD32F1X0_IT_H */
|
||||
@@ -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,135 @@
|
||||
/*!
|
||||
\file main.c
|
||||
\brief TIMER2 PWM input capture 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_configuration(void);
|
||||
void timer_configuration(void);
|
||||
void nvic_configuration(void);
|
||||
int fputc(int ch, FILE *f);
|
||||
|
||||
/* retarget the C library printf function to the USART */
|
||||
int fputc(int ch, FILE *f)
|
||||
{
|
||||
usart_data_transmit(EVAL_COM1, (uint8_t) ch);
|
||||
while (usart_flag_get(EVAL_COM1, USART_FLAG_TC) == RESET);
|
||||
return ch;
|
||||
}
|
||||
|
||||
/**
|
||||
\brief configure the GPIO ports
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void gpio_configuration(void)
|
||||
{
|
||||
rcu_periph_clock_enable(RCU_GPIOB);
|
||||
|
||||
/*configure PB4(TIMER2 CH0) as alternate function*/
|
||||
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4);
|
||||
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_4);
|
||||
gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_4);
|
||||
|
||||
/*configure PB5(TIMER2 CH1) as alternate function*/
|
||||
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);
|
||||
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_5);
|
||||
gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_5);
|
||||
}
|
||||
|
||||
/**
|
||||
\brief configure the nested vectored interrupt controller
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void nvic_configuration(void)
|
||||
{
|
||||
nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);
|
||||
nvic_irq_enable(TIMER2_IRQn, 1, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
\brief configure the TIMER peripheral
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void timer_configuration(void)
|
||||
{
|
||||
/* TIMER2 configuration: PWM input mode ------------------------
|
||||
the external signal is connected to TIMER2 CH0 pin(PB4)
|
||||
the rising edge is used as active edge
|
||||
the TIMER2 CH0CV is used to compute the frequency value.
|
||||
the TIMER2 CH1CV is used to compute the duty cycle value.
|
||||
------------------------------------------------------------ */
|
||||
timer_ic_parameter_struct timer_icinitpara;
|
||||
timer_parameter_struct timer_initpara;
|
||||
|
||||
rcu_periph_clock_enable(RCU_TIMER2);
|
||||
|
||||
timer_deinit(TIMER2);
|
||||
|
||||
/* 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_initpara.repetitioncounter = 0;
|
||||
timer_init(TIMER2,&timer_initpara);
|
||||
|
||||
/* TIMER2 configuration */
|
||||
/* TIMER2 CH0 PWM 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_pwm_capture_config(TIMER2,TIMER_CH_0,&timer_icinitpara);
|
||||
|
||||
/* slave mode selection: TIMER2 */
|
||||
timer_input_trigger_source_select(TIMER2,TIMER_SMCFG_TRGSEL_CI0FE0);
|
||||
timer_slave_mode_select(TIMER2,TIMER_SLAVE_MODE_RESTART);
|
||||
|
||||
/* select the master slave mode */
|
||||
timer_master_slave_mode_config(TIMER2,TIMER_MASTER_SLAVE_MODE_ENABLE);
|
||||
|
||||
/* auto-reload preload enable */
|
||||
timer_auto_reload_shadow_enable(TIMER2);
|
||||
/* clear channel 0 interrupt bit */
|
||||
timer_interrupt_flag_clear(TIMER2,TIMER_INT_CH0);
|
||||
/* channel 0 interrupt enable */
|
||||
timer_interrupt_enable(TIMER2,TIMER_INT_CH0);
|
||||
|
||||
/* TIMER2 counter enable */
|
||||
timer_enable(TIMER2);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief main function
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
int main(void)
|
||||
{
|
||||
gpio_configuration();
|
||||
gd_eval_com_init(EVAL_COM1);
|
||||
nvic_configuration();
|
||||
timer_configuration();
|
||||
|
||||
while (1);
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
/*!
|
||||
\file readme.txt
|
||||
\brief description of the TIMER2 PWM input capture 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
|
||||
use the TIMER peripheral to measure the frequency and duty cycle of an external
|
||||
signal.
|
||||
|
||||
The TIMxCLK frequency is set to systemcoreclock (72MHz), the prescaler is 72
|
||||
so the TIMER2 counter clock is 1MHz.
|
||||
|
||||
The external signal is connected to TIMER2 CH0 pin(PB4).
|
||||
The rising edge is used as active edge.
|
||||
The TIMER2 CH0CV is used to compute the frequency value.
|
||||
The TIMER2 CH1CV is used to compute the duty cycle value.
|
||||
|
||||
The minimum frequence of the input signal to measure is 16 Hz.
|
||||
|
||||
You can use USART to watch the frequency and duty cycle of the input signal.
|
||||
The USART is configured as follow:
|
||||
- BaudRate = 115200 baud
|
||||
- Word Length = 8 Bits
|
||||
- One Stop Bit
|
||||
- No parity
|
||||
- Hardware flow control disabled (RTS and CTS signals)
|
||||
- Receive and transmit enabled
|
||||
Reference in New Issue
Block a user