#include"gd32f30x.h"#include<stdio.h>#include"gd32f307c_eval.h"#define DEV_CAN0_USED
voidnvic_config(void);voidled_config(void);ErrStatuscan_loopback(void);ErrStatuscan_loopback_interrupt(void);voidcan_loopback_init(void);/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/intmain(void){/* enable CAN clock */rcu_periph_clock_enable(RCU_CAN0);#ifdef GD32F30X_CL
rcu_periph_clock_enable(RCU_CAN1);#endif /* GD32F30X_CL *//* configure NVIC */nvic_config();/* configure leds */led_config();/* set all the leds off */gd_eval_led_off(LED2);gd_eval_led_off(LED3);gd_eval_led_off(LED4);gd_eval_led_off(LED5);/* loopback of polling */test_flag=can_loopback();if(SUCCESS==test_flag){/* loopback test is success */gd_eval_led_on(LED2);gd_eval_led_on(LED3);}else{/* loopback test is failed */gd_eval_led_off(LED2);gd_eval_led_off(LED3);}/* loopback of interrupt */test_flag_interrupt=can_loopback_interrupt();if(SUCCESS==test_flag_interrupt){/* interrupt loopback test is success */gd_eval_led_on(LED4);gd_eval_led_on(LED5);}else{/* interrupt loopback test is failed */gd_eval_led_off(LED4);gd_eval_led_off(LED5);}while(1);}voidcan_loopback_init(void){can_parameter_structcan_parameter;can_filter_parameter_structcan_filter;can_struct_para_init(CAN_INIT_STRUCT,&can_parameter);can_struct_para_init(CAN_FILTER_STRUCT,&can_filter);/* initialize CAN register */can_deinit(CANX);/* 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=DISABLE;can_parameter.working_mode=CAN_LOOPBACK_MODE;/* configure baudrate to 125kbps */can_parameter.resync_jump_width=CAN_BT_SJW_1TQ;can_parameter.time_segment_1=CAN_BT_BS1_7TQ;can_parameter.time_segment_2=CAN_BT_BS2_2TQ;can_parameter.prescaler=48;can_init(CANX,&can_parameter);/* initialize filter */#ifdef DEV_CAN0_USED
/* CAN0 filter number */can_filter.filter_number=0;#else
/* CAN1 filter number */can_filter.filter_number=14;#endif
/* initialize filter */can_filter.filter_mode=CAN_FILTERMODE_MASK;can_filter.filter_bits=CAN_FILTERBITS_32BIT;can_filter.filter_list_high=(uint16_t)(DEV_CAN_POLLING_ID<<5);can_filter.filter_list_low=0x0000;/* ID and standard frame matched */can_filter.filter_mask_high=(uint16_t)(0x7FF<<5);can_filter.filter_mask_low=(uint16_t)(1U<<2);can_filter.filter_fifo_number=CAN_FIFO1;can_filter.filter_enable=ENABLE;can_filter_init(&can_filter);/* initialize filter */#ifdef DEV_CAN0_USED
/* CAN0 filter number */can_filter.filter_number=1;#else
/* CAN1 filter number */can_filter.filter_number=15;#endif
/* initialize filter */can_filter.filter_mode=CAN_FILTERMODE_MASK;can_filter.filter_bits=CAN_FILTERBITS_32BIT;/* ID and extend frame matched */can_filter.filter_list_high=(uint16_t)(DEV_CAN_INTERRUPT_ID>>13);can_filter.filter_list_low=(uint16_t)(((uint16_t)DEV_CAN_INTERRUPT_ID<<3)|(1U<<2));can_filter.filter_mask_high=(uint16_t)(0x1FFFFFFF>>13);can_filter.filter_mask_low=(uint16_t)(((uint16_t)0x1FFFFFFF<<3)|(1U<<2));can_filter.filter_fifo_number=CAN_FIFO1;can_filter.filter_enable=ENABLE;can_filter_init(&can_filter);}voidnvic_config(void){/* configure CAN0 NVIC */nvic_irq_enable(CAN0_RX1_IRQn,0,0);#ifdef GD32F30X_CL
/* configure CAN1 NVIC */nvic_irq_enable(CAN1_RX1_IRQn,0,0);#endif /* GD32F30X_CL */}voidled_config(void){gd_eval_led_init(LED2);gd_eval_led_init(LED3);gd_eval_led_init(LED4);gd_eval_led_init(LED5);}