/************************************************************************ Project: Welling Motor Control Paltform Filename: hwsetup.c Partner Filename: hwsetup.h Description: Hardware setup Complier: IAR Embedded Workbench for ARM 8.40.2 CPU TYPE : GD32F30x ************************************************************************* Copyright (c) 2022 Welling Motor Technology(Shanghai) Co. Ltd. All rights reserved. ************************************************************************* ************************************************************************* Revising History (ECL of this file): ************************************************************************/ /************************************************************************ Beginning of File, do not put anything above here except notes Compiler Directives: *************************************************************************/ #ifndef _HWSETUP_C_ #define _HWSETUP_C_ #endif /************************************************************************ Included File *************************************************************************/ /*#include "user.h" #include "FuncLayerAPI.h" #include "can.h"*/ #include "hwsetup.h" /************************************************************************ Constant Table (N/A) *************************************************************************/ /************************************************************************* Exported Functions: *************************************************************************/ /************************************************************************* Function: hw_voHardwareSetup; Description: Hardware Setup function. Call by: main(); Input Variables: All HW registers Output/Return Variables: All HW registers Subroutine Call: ...; Reference: N/A *************************************************************************/ void hw_voHardwareSetup1(void) { // Initialize System Control registers, WatchDog to a know state hw_voInitSysCtrl(); // Select GPIO for the device or for the specific application: hw_voInitGPIO(); } void hw_voHardwareSetup2(void) { // Initialize all the Device Peripherals to a known state: hw_voInitPeri(); // Initialize interrupt priority of peripherals: hw_voInitInt(); hw_voEnInt(); } /************************************************************************* Local Functions (N/A) *************************************************************************/ /************************************************************************* Function: hw_voInitPWM; Description: MTU Setup function. Call by: main(); Input Variables: MTU HW registers Output/Return Variables: MTU HW registers Subroutine Call: ...; Reference: N/A *************************************************************************/ void hw_voInitPeri(void) { // Initialize SysTick hw_voInitSysTick(); // Initialize CAN hw_voInitCAN(); } /************************************************************************* Function: Description: Call by: Input Variables: Output/Return Variables: Subroutine Call: Reference: *************************************************************************/ void hw_voInitSysCtrl(void) { /* Enable the Alternate Function clock */ rcu_periph_clock_enable(RCU_AF); /* Enable the GPIOA clock */ rcu_periph_clock_enable(RCU_GPIOA); /* Enable the GPIOB clock */ rcu_periph_clock_enable(RCU_GPIOB); /* Enable the GPIOC clock */ rcu_periph_clock_enable(RCU_GPIOC); /* Enable the GPIOF clock */ rcu_periph_clock_enable(RCU_GPIOF); /* Enable the CAN clock */ rcu_periph_clock_enable(RCU_CAN0); } /************************************************************************* Function: Description: Call by: Input Variables: Output/Return Variables: Subroutine Call: Reference: *************************************************************************/ void hw_voInitGPIO(void) { /*======================================================================= GPIO A =======================================================================*/ gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_12); /* CAN STB */ gpio_bit_reset(GPIOA, GPIO_PIN_12); /* Dont config PA13, for it is used for SWDIO FOR DEBUG*/ /* Dont config PA14, for it is used for SWCLK FOR DEBUG*/ gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ, GPIO_PIN_15); /* ASSIST STATE IN */ gpio_bit_reset(GPIOA, GPIO_PIN_15); /*======================================================================= GPIO B =======================================================================*/ /* Remap CAN0 GPIO */ gpio_pin_remap_config(GPIO_CAN0_PARTIAL_REMAP,ENABLE); gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_8); /* CAN_RX */ gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_9); /* CAN_TX*/ /*======================================================================= GPIO C =======================================================================*/ gpio_init(GPIOC,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1); /* IO control*/ gpio_bit_set(GPIOC, GPIO_PIN_1); gpio_init(GPIOC,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_15|GPIO_PIN_8); /* Light Enable */ } /************************************************************************* Function: Description: Call by: Input Variables: Output/Return Variables: Subroutine Call: Reference: *************************************************************************/ void hw_voInitCAN() { can_parameter_struct can_parameter; can_filter_parameter_struct can_filter; can_struct_para_init(CAN_INIT_STRUCT, &can_parameter); can_struct_para_init(CAN_INIT_STRUCT, &can_filter); /* initialize CAN register */ can_deinit(CAN0); /* initialize CAN */ can_parameter.time_triggered = DISABLE; can_parameter.auto_bus_off_recovery = ENABLE; can_parameter.auto_wake_up = DISABLE; can_parameter.auto_retrans = ENABLE; can_parameter.rec_fifo_overwrite = DISABLE; can_parameter.trans_fifo_order = ENABLE; can_parameter.working_mode = CAN_NORMAL_MODE; can_parameter.resync_jump_width = CAN_BT_SJW_1TQ; can_parameter.time_segment_1 = CAN_BT_BS1_6TQ; can_parameter.time_segment_2 = CAN_BT_BS2_1TQ; /* baudrate 1Mbps */ can_parameter.prescaler = 18; //36M/((1+6+1)*18)=250K can_init(CAN0, &can_parameter); /* initialize filter 0 */ can_filter.filter_number = 0; can_filter.filter_mode = CAN_FILTERMODE_MASK; can_filter.filter_bits = CAN_FILTERBITS_32BIT; can_filter.filter_list_high = (uint16_t)((((uint32_t)ID_TO_MC_FILTER << 21) & 0xFFFF0000) >> 16); can_filter.filter_list_low = (uint16_t)(((uint32_t)ID_TO_MC_FILTER << 21) | CAN_FF_STANDARD | CAN_FT_DATA) & 0xFFFF; can_filter.filter_mask_high = (uint16_t)((((uint32_t)ID_TO_MC_MASK << 21) & 0xFFFF0000) >> 16); can_filter.filter_mask_low = ((ID_TO_MC_MASK << 21) & 0xFFFF) | CAN_FF_STANDARD | CAN_FT_DATA; can_filter.filter_fifo_number = CAN_FIFO0; can_filter.filter_enable = ENABLE; can_filter_init(&can_filter); /* initialize filter 1 */ // can_filter.filter_number = 1; // can_filter.filter_mode = CAN_FILTERMODE_MASK; // can_filter.filter_bits = CAN_FILTERBITS_32BIT; // can_filter.filter_list_high = (uint16_t)((((uint32_t)ID_BC_FILTER << 21) & 0xFFFF0000) >> 16); // can_filter.filter_list_low = (uint16_t)(((uint32_t)ID_BC_FILTER << 21) | CAN_FF_STANDARD | CAN_FT_DATA) & 0xFFFF; // can_filter.filter_mask_high = (uint16_t)((((uint32_t)ID_BC_MASK << 21) & 0xFFFF0000) >> 16); // can_filter.filter_mask_low = ((ID_BC_MASK << 21) & 0xFFFF) | CAN_FF_STANDARD | CAN_FT_DATA; // can_filter.filter_fifo_number = CAN_FIFO0; // can_filter.filter_enable = ENABLE; // can_filter_init(&can_filter); } /************************************************************************* Function: Description: Call by: Input Variables: Output/Return Variables: Subroutine Call: Reference: *************************************************************************/ #define FSYSTICK_HZ 1000 void hw_voInitSysTick(void) { /* Setup systick timer interrupts */ /* Do not exceed 2^24-1=16777215 */ SysTick_Config(SystemCoreClock / FSYSTICK_HZ); } volatile static uint32_t delay; /*! \brief delay a time in milliseconds \param[in] count: count in milliseconds \param[out] none \retval none */ void delay_1ms(uint32_t count) { delay = count; while(0U != delay){ } } /*! \brief delay decrement \param[in] none \param[out] none \retval none */ void delay_decrement(void) { if (0U != delay){ delay--; } } extern void Period_Stick(void); /*! \brief this function handles SysTick exception \param[in] none \param[out] none \retval none */ void SysTick_Handler(void) { delay_decrement(); Period_Stick(); } /************************************************************************* Function: Description: Call by: Input Variables: Output/Return Variables: Subroutine Call: Reference: *************************************************************************/ void hw_voInitInt(void) { /* Set the priority group */ nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); /* CAN0 RX0 interrupt */ nvic_irq_enable(CAN0_RX0_IRQn, 3, 0); // NVIC->ISER[1]=0xFFFF; /* CAN0 RX1 interrupt */ nvic_irq_enable(CAN0_RX1_IRQn, 3, 0); } /************************************************************************* Function: Description: Call by: Input Variables: Output/Return Variables: Subroutine Call: Reference: *************************************************************************/ void hw_voEnInt(void) { /* CAN0 receive FIFO0 not empty interrupt */ can_interrupt_enable(CAN0, CAN_INT_RFNE0); /* CAN0 receive FIFO0 overfull interrupt */ can_interrupt_enable(CAN0, CAN_INT_RFO0); /* CAN0 receive FIFO1 not empty interrupt */ can_interrupt_enable(CAN0, CAN_INT_RFNE1); /* CAN0 receive FIFO1 overfull interrupt */ can_interrupt_enable(CAN0, CAN_INT_RFO1); /* CAN0 error interrupt */ can_interrupt_enable(CAN0, CAN_INT_ERR); /* CAN0 bus-off interrupt */ can_interrupt_enable(CAN0, CAN_INT_BO); /* CAN0 warning error interrupt */ can_interrupt_enable(CAN0, CAN_INT_WERR); /* CAN0 passive error interrupt */ can_interrupt_enable(CAN0, CAN_INT_PERR); // can_interrupt_enable(CAN0, CAN_INT_RFF0); } /************************************************************************* Copyright (c) 2022 Welling Motor Technology(Shanghai) Co. Ltd. All rights reserved. *************************************************************************/ #ifdef _HWSETUP_C_ #undef _HWSETUP_C_ #endif /************************************************************************ End of this File (EOF)! Do not put anything after this part! *************************************************************************/