123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- /************************************************************************
- 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--;
- }
- }
- /*!
- \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!
- *************************************************************************/
|