和STM32F4类似,在使用GD32F4时,初始化不对会导致MCU的CAN1控制器在中断接收数据的时候无法产生中断。则需要如下初始化才行:
/*! \brief initialize CAN and filter \param[in] can_parameter \arg can_parameter_struct \param[in] can_filter \arg can_filter_parameter_struct \param[out] none \retval none */ void can_config(can_parameter_struct can_parameter, can_filter_parameter_struct can_filter) { /* initialize CAN register */ can_deinit(CAN0); can_deinit(CAN1); /* initialize CAN parameters */ can_parameter.time_triggered = DISABLE; can_parameter.auto_bus_off_recovery = DISABLE; can_parameter.auto_wake_up = DISABLE; can_parameter.auto_retrans = DISABLE; can_parameter.rec_fifo_overwrite = DISABLE; can_parameter.trans_fifo_order = DISABLE; can_parameter.working_mode = CAN_NORMAL_MODE; can_parameter.resync_jump_width = CAN_BT_SJW_1TQ; can_parameter.time_segment_1 = CAN_BT_BS1_3TQ; can_parameter.time_segment_2 = CAN_BT_BS2_2TQ; /* 1MBps */ #if CAN_BAUDRATE == 1000 can_parameter.prescaler = 5; /* 500KBps */ #elif CAN_BAUDRATE == 500 can_parameter.prescaler = 10; /* 250KBps */ #elif CAN_BAUDRATE == 250 can_parameter.prescaler = 20; /* 125KBps */ #elif CAN_BAUDRATE == 125 can_parameter.prescaler = 40; /* 100KBps */ #elif CAN_BAUDRATE == 100 can_parameter.prescaler = 50; /* 50KBps */ #elif CAN_BAUDRATE == 50 can_parameter.prescaler = 100; /* 20KBps */ #elif CAN_BAUDRATE == 20 can_parameter.prescaler = 250; #else #error "please select list can baudrate in private defines in main.c " #endif /* initialize CAN */ can_init(CAN0, &can_parameter); can_init(CAN1, &can_parameter); /* initialize filter */ can_filter.filter_number=0; can_filter.filter_mode = CAN_FILTERMODE_MASK; can_filter.filter_bits = CAN_FILTERBITS_32BIT; can_filter.filter_list_high = 0x3000; can_filter.filter_list_low = 0x0000; can_filter.filter_mask_high = 0x3000; can_filter.filter_mask_low = 0x0000; can_filter.filter_fifo_number = CAN_FIFO0; can_filter.filter_enable = ENABLE; can_filter_init(&can_filter); /* CAN1 filter number */ can_filter.filter_number = 15; can_filter_init(&can_filter); }这里有两句非常重要的代码:
/* CAN1 filter number */ can_filter.filter_number = 15; can_filter_init(&can_filter);初始化有这两句,CAN1即可顺利产生接收
