和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即可順利產生接收