HC32F4A0单片机的CAN接口波特率等配置说明

不想看书的小伙伴可以直接用。

系统时钟 240000000 外部晶振8M,120倍频,再4分频
CAN时钟 40000000 6分频
u32Prescaler 20 CAN位时钟=CAN时钟/u32Prescaler
2000000 = 40000000 / 20
u32TimeSeg1 15 波特率100Khz
=CAN位时钟/(u32TimeSeg1+u32TimeSeg2)
u32TimeSeg2 5
u32SJW 5 采样点位置75%=5/(5+15)

参考代码如下:

static void CanInitConfig(uint8_t chn)
{
    stc_can_init_t stcCanInit;
    stc_can_filter_config_t astcFilter[CAN_FILTER_NUM] = {
        {CAN_FILTER1_ID, CAN_FILTER1_ID_MASK, CAN_FILTER1_ID_TYPE},
        {CAN_FILTER2_ID, CAN_FILTER2_ID_MASK, CAN_FILTER2_ID_TYPE},
        {CAN_FILTER3_ID, CAN_FILTER3_ID_MASK, CAN_FILTER3_ID_TYPE},
    };

    /* Initializes CAN. */
    (void)CAN_StructInit(&stcCanInit);
    stcCanInit.stcBitCfg.u32Prescaler = 20U;//2= 1000K, 4=500K, 8=250, 20 =100K 
    stcCanInit.stcBitCfg.u32TimeSeg1  = 15U;
    stcCanInit.stcBitCfg.u32TimeSeg2  = 5U;
    stcCanInit.stcBitCfg.u32SJW       = 5U;
    stcCanInit.pstcFilter             = astcFilter;
    stcCanInit.u16FilterSelect        = CAN_FILTER_SEL;
    stcCanInit.u8WorkMode             = CAN_WORK_MD_NORMAL;//正常模式

    if (!chn)
    {
        /* Enable peripheral clock of CAN. */
        FCG_Fcg1PeriphClockCmd(CAN1_PERIPH_CLK, ENABLE);
        (void)CAN_Init(CAN1_UNIT, &stcCanInit);
        /* Enable the interrupts, the status flags can be read. */
        CAN_IntCmd(CAN1_UNIT, CAN_INT_ALL, DISABLE);
        /* Enalbe the interrupts that needed. */
        CAN_IntCmd(CAN1_UNIT, CAN_INT_SEL, ENABLE);
    }
    else
    {
        /* Enable peripheral clock of CAN. */
        FCG_Fcg1PeriphClockCmd(CAN2_PERIPH_CLK, ENABLE);
        (void)CAN_Init(CAN2_UNIT, &stcCanInit);
        /* Enable the interrupts, the status flags can be read. */
        CAN_IntCmd(CAN2_UNIT, CAN_INT_ALL, DISABLE);
        /* Enalbe the interrupts that needed. */
        CAN_IntCmd(CAN2_UNIT, CAN_INT_SEL, ENABLE);

    }
}

你可能感兴趣的:(c,单片机,c语言,CAN)