GD32C103——CANFD试验分享

GD32C103——CANFD试验分享

试验采用硬件设备:

购买STM32F103C8T6(48pin)最小系统板,8M晶振。——5块

购买GD32C103CBT6(48pin)芯片。——6~8块

现有CAN芯片,本人使用TJA1044芯片,5M速率。

硬件修改:

将GD32芯片,pin对pin替换STM最小系统板芯片,CAN芯片TX连接PB9,RX连接PB8,STB接地,VCC接5V。芯片PB0作为LED指示灯。

程序修改:

采用GD官网提供GD32C系列基础例程,IAR软件:

GD32C10x_Demo_Suites_V1.2.0\GD32C10x_Demo_Suites_V1.2.0\GD32C103C_START_Demo_Suites\Projects\01_GPIO_Running_LED

请自行官网下载。

引脚配置:

rcu_periph_clock_enable(RCU_GPIOA);

rcu_periph_clock_enable(RCU_GPIOB);

rcu_periph_clock_enable(RCU_AF);

gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);

gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);

gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);

gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_8);

gpio_pin_remap_config(GPIO_CAN0_PARTIAL_REMAP, ENABLE);

注意点:需开启映射使能,PB9,PB8为半映射,非全映射,这里让我查了很久。

定时器中断配置:

timer_parameter_struct  TimerParameterStruct;

rcu_periph_clock_enable(RCU_TIMER0);      //使能TIMER0的APB2外设时钟

nvic_irq_enable(TIMER0_UP_TIMER9_IRQn, 2U, 0U);  //设置TIMER0_UP_IRQn的中断优先级,抢占优先级为2,子优先级为0

timer_deinit(TIMER0);

TimerParameterStruct.period            = 10U-1U;

TimerParameterStruct.prescaler         = 1080U-1U;

TimerParameterStruct.clockdivision     = TIMER_CKDIV_DIV1;

TimerParameterStruct.counterdirection  = TIMER_COUNTER_UP;

TimerParameterStruct.alignedmode       = TIMER_COUNTER_EDGE;

TimerParameterStruct.repetitioncounter = 0;

timer_init(TIMER0,&TimerParameterStruct);

timer_counter_value_config(TIMER0,0);

timer_auto_reload_shadow_enable(TIMER0);

timer_flag_clear(TIMER0,TIMER_FLAG_UP);

timer_interrupt_flag_clear(TIMER0,TIMER_INT_FLAG_UP);

timer_interrupt_enable(TIMER0,TIMER_INT_UP);

timer_internal_clock_config(TIMER0);

timer_enable(TIMER0);

uint8_t ledFlag = 0U;

Uint16 g_timeCnt1 = 0U;

can_trasnmit_message_struct g_transmit_message;

void TIMER0_UP_TIMER9_IRQHandler(void)

{

    if( timer_interrupt_flag_get(TIMER0,TIMER_INT_FLAG_UP) )// 读取更新中断标志位

    {

        g_timeCnt1++;

        if (g_timeCnt1 > 500U) {

            g_timeCnt1 = 0U;

            g_transmit_message.tx_sfid = 0x01U;

            g_transmit_message.tx_efid = 0x08U;

            g_transmit_message.tx_ff = CAN_FF_STANDARD; // 标准 / 扩展

            g_transmit_message.tx_ft = CAN_FT_DATA;

            g_transmit_message.tx_dlen = 64U;

            g_transmit_message.fd_flag = CAN_FDF_FDFRAME; //CAN_FDF_CLASSIC;  //CANFD / CAN

            g_transmit_message.fd_brs = CAN_BRS_ENABLE;

            g_transmit_message.fd_esi = CAN_ESI_DOMINANT;

            g_transmit_message.tx_data[0] = 1U;

            can_message_transmit(CAN0,&g_transmit_message);

           

            if (ledFlag == 0U) {

                ledFlag = 1U;

                gpio_bit_set(GPIOB, GPIO_PIN_0);

            } else {

                ledFlag = 0U;

                gpio_bit_reset(GPIOB, GPIO_PIN_0);

            }

        }

        timer_flag_clear(TIMER0,TIMER_FLAG_UP);               //清除"TIMER0更新标志位"

        timer_interrupt_flag_clear(TIMER0,TIMER_INT_FLAG_UP); //清除"更新中断标志位"

    }

}

CANFD及中断配置:

void CanFD_config(void)

{

can_parameter_struct CAN_InitSt;

can_fdframe_struct can_fd_parameter;  //CAN FD 参数

can_fd_tdc_struct can_fd_tdc_parameter;

can_filter_parameter_struct CAN_FilterInitStructure;

rcu_periph_clock_enable(RCU_CAN0);

nvic_irq_enable(CAN0_RX0_IRQn, 1U, 0U);

   

can_struct_para_init(CAN_INIT_STRUCT, &CAN_InitSt);  //标准域

can_deinit(CAN0);

CAN_InitSt.time_triggered = DISABLE;

CAN_InitSt.auto_bus_off_recovery = DISABLE;

CAN_InitSt.auto_wake_up = DISABLE;

CAN_InitSt.auto_retrans = DISABLE;

CAN_InitSt.rec_fifo_overwrite = DISABLE;

CAN_InitSt.trans_fifo_order = DISABLE;

CAN_InitSt.working_mode = CAN_NORMAL_MODE;

//    CAN_InitSt.working_mode = CAN_LOOPBACK_MODE;

   

//    CAN_InitSt.resync_jump_width = CAN_BT_SJW_1TQ;

//    CAN_InitSt.time_segment_1 = CAN_BT_BS1_3TQ;

//    CAN_InitSt.time_segment_2 = CAN_BT_BS2_5TQ;

//    CAN_InitSt.prescaler = 10U; // 60/(1+3+5)/10 = 0.666

   

CAN_InitSt.resync_jump_width = CAN_BT_SJW_1TQ;

CAN_InitSt.time_segment_1 = CAN_BT_BS1_4TQ;

CAN_InitSt.time_segment_2 = CAN_BT_BS2_1TQ;

CAN_InitSt.prescaler = 20U; // 60/(1+4+1)/20 = 0.5

can_init(CAN0, &CAN_InitSt);

   

can_struct_para_init(CAN_FD_FRAME_STRUCT, &can_fd_parameter); //数据域

can_fd_parameter.fd_frame = ENABLE;

can_fd_parameter.excp_event_detect = ENABLE;

can_fd_parameter.delay_compensation = ENABLE;

can_fd_tdc_parameter.tdc_filter = 0x04U;

can_fd_tdc_parameter.tdc_mode = CAN_TDCMOD_CALC_AND_OFFSET;

can_fd_tdc_parameter.tdc_offset = 0x04U;

can_fd_parameter.p_delay_compensation = &can_fd_tdc_parameter;

can_fd_parameter.iso_bosch = CAN_FDMOD_ISO;

can_fd_parameter.esi_mode = CAN_ESIMOD_HARDWARE;

//数据区波特率设置

can_fd_parameter.data_resync_jump_width = CAN_BT_SJW_1TQ;

can_fd_parameter.data_time_segment_1 = CAN_BT_BS1_4TQ;

can_fd_parameter.data_time_segment_2 = CAN_BT_BS2_1TQ;

can_fd_parameter.data_prescaler = 5U; //2M

can_fd_init(CAN0, &can_fd_parameter);

can_struct_para_init(CAN_FILTER_STRUCT, &CAN_FilterInitStructure);

CAN_FilterInitStructure.filter_number = 0U;

CAN_FilterInitStructure.filter_mode = CAN_FILTERMODE_MASK;

CAN_FilterInitStructure.filter_bits = CAN_FILTERBITS_32BIT;

CAN_FilterInitStructure.filter_enable = ENABLE;

CAN_FilterInitStructure.filter_fifo_number = CAN_FIFO0;

CAN_FilterInitStructure.filter_list_high = (uint16_t)0U;

CAN_FilterInitStructure.filter_list_low = (uint16_t)0U;

CAN_FilterInitStructure.filter_mask_high = (uint16_t)0U;

CAN_FilterInitStructure.filter_mask_low = (uint16_t)0U ;  

can_filter_init(&CAN_FilterInitStructure);

can_interrupt_enable(CAN0,CAN_INTEN_RFNEIE0);

}

can_receive_message_struct g_receive_message;

void CAN0_RX0_IRQHandler(void)

{

if (ledFlag == 0U) {

    ledFlag = 1U;

    gpio_bit_set(GPIOB, GPIO_PIN_0);

} else {

    ledFlag = 0U;

    gpio_bit_reset(GPIOB, GPIO_PIN_0);

}

can_message_receive(CAN0, CAN_FIFO0, &g_receive_message);

}

主函数:

systick_config();

Timer0_config();

nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);

Gpio_config();

CanFD_config();

感谢查阅,转载请标注。

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值