|
楼主 |
发表于 2022-7-14 14:22:47
|
显示全部楼层
void can_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* CAN GPIOs 配置*/
/* 使能GPIO时钟 */
RCC_AHB1PeriphClockCmd(CAN_GPIO_TX_CLK|CAN_GPIO_RX_CLK, ENABLE);
/* 引脚映射为CAN功能 */
GPIO_PinAFConfig(CAN_GPIO_RX_PORT, CAN_RX_SOURCE, CAN_AF_PORT);
GPIO_PinAFConfig(CAN_GPIO_TX_PORT, CAN_TX_SOURCE, CAN_AF_PORT);
/* 配置 CAN RX 和 TX 引脚 */
GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(CAN_GPIO_RX_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =CAN_TX_PIN ;
GPIO_Init(CAN_GPIO_TX_PORT, &GPIO_InitStructure);
/* CAN配置*/
/* 使能CAN时钟 */
RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);
/* 复位CAN寄存器 */
CAN_DeInit(CAN1);
/*
TTCM = time triggered communication mode
ABOM = automatic bus-off management
AWUM = automatic wake-up mode
NART = no automatic retransmission
RFLM = receive FIFO locked mode
TXFP = transmit FIFO priority
*/
CAN_InitStructure.CAN_TTCM = DISABLE; /* 禁止时间触发模式(不生成时间戳), T */
CAN_InitStructure.CAN_ABOM = DISABLE; /* 禁止自动总线关闭管理 */
CAN_InitStructure.CAN_AWUM = DISABLE; /* 禁止自动唤醒模式 */
CAN_InitStructure.CAN_NART = DISABLE; /* 禁止仲裁丢失或出错后的自动重传功能 */
CAN_InitStructure.CAN_RFLM = DISABLE; /* 禁止接收FIFO加锁模式 */
CAN_InitStructure.CAN_TXFP = DISABLE; /* 禁止传输FIFO优先级 */
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; /* 设置CAN为正常工作模式 */
/*
CAN 波特率 = RCC_APB1Periph_CAN1 / Prescaler / (SJW + BS1 + BS2);
SJW = synchronisation_jump_width
BS = bit_segment
CAN 波特率 = 420000000 / 20 / (1 + 12 + 8) / = 1 MBps */
/* 波特率 = 100kHz */
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
CAN_InitStructure.CAN_Prescaler = 20;
CAN_Init(CAN1, &CAN_InitStructure);
/* 设置CAN滤波器0 */
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CAN_FilterInitStructure.CAN_FilterNumber = 0; /* 滤波器序号,0-13,共14个滤波器 */
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; /* 滤波器模式,设置ID掩码模式 */
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; /* 32位滤波 */
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; /* 掩码后ID的高16bit */
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; /* 掩码后ID的低16bit */
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; /* ID掩码值高16bit */
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; /* ID掩码值低16bit */
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; /* 滤波器绑定FIFO 0 */
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; /* 使能滤波器 */
CAN_FilterInit(&CAN_FilterInitStructure);
/* 配置CAN中断 */
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //数字越小,优先级越高
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* CAN FIFO0 消息接收中断使能 */
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
} |
|