1. stm32 CAN通信标准库函数
uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct);
void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct);
uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);
uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox);
void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage);
void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState);
FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG);
void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG);
ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT);
void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT);
2. 利用标准库进行初始化
void CAN_Config(void)
{
CAN_InitTypeDef CAN_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
GPIO_PinAFConfig(GPIOB,GPIO_Pin_13,GPIO_AF_CAN2);
GPIO_PinAFConfig(GPIOB,GPIO_Pin_12,GPIO_AF_CAN2);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
CAN_InitStruct.CAN_ABOM=ENABLE;
CAN_InitStruct.CAN_AWUM=ENABLE;
CAN_InitStruct.CAN_NART=ENABLE;
CAN_InitStruct.CAN_RFLM=DISABLE;
CAN_InitStruct.CAN_TTCM=DISABLE;
CAN_InitStruct.CAN_TXFP=DISABLE;
CAN_InitStruct.CAN_Mode=CAN_Mode_LoopBack;
CAN_InitStruct.CAN_Prescaler=6;
CAN_InitStruct.CAN_SJW=CAN_SJW_2tq;
CAN_InitStruct.CAN_BS1=CAN_BS1_4tq;
CAN_InitStruct.CAN_BS2=CAN_BS2_2tq;
CAN_Init(CAN2,&CAN_InitStruct);
CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStruct.NVIC_IRQChannel=CAN2_RX0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStruct);
}
3. 筛选器初始化
void CAN_Filter(void)
{
CAN_FilterInitTypeDef CAN_FilterInitStruct;
CAN_FilterInitStruct.CAN_FilterNumber=14;
CAN_FilterInitStruct.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStruct.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStruct.CAN_FilterActivation=ENABLE;
CAN_FilterInitStruct.CAN_FilterIdHigh= (((uint32_t)0x1314<<3|CAN_Id_Extended|CAN_RTR_Data)&0xFFFF0000);
CAN_FilterInitStruct.CAN_FilterIdLow=(((uint32_t)0x1314<<3|CAN_Id_Extended|CAN_RTR_Data)&0x0000FFFF);
CAN_FilterInitStruct.CAN_FilterMaskIdHigh=0xFFFF;CAN_FxR2寄存器的高16位
CAN_FilterInitStruct.CAN_FilterMaskIdLow=0xFFFF;CAN_FxR2寄存器的低16位
CAN_FilterInit(&CAN_FilterInitStruct);
}
4. 发送数据
uint8_t mail_box;
CanTxMsg TxMessage;
TxMessage.StdId=0;
TxMessage.ExtId=0x1314;
TxMessage.IDE=CAN_Id_Extended;
TxMessage.RTR=CAN_RTR_Data;
TxMessage.DLC=8;
for(i=0;i<8;i++)
{
TxMessage.Data[i]=data[i];
}
mail_box = CAN_Transmit(CAN2,&TxMessage);
5. 接收数据
void CAN2_RX0_IRQHandler(void)
{
if(CAN_GetITStatus(CAN2,CAN_IT_FMP0)==SET)
{
CAN_Receive(CAN2, CAN_FIFO0,&RxMessage);
printf("RxMessage.StdId:%x\r\n" ,RxMessage.StdId);
printf("RxMessage.ExtId:%x\r\n" ,RxMessage.ExtId);
printf("RxMessage.IDE:%x\r\n" ,RxMessage.IDE);
printf("RxMessage.RTR:%x\r\n" ,RxMessage.RTR);
printf("RxMessage.DLC:%x\r\n" ,RxMessage.DLC);
for(i=0;i<RxMessage.DLC;i++)
{
printf("RxMessage.Data[i]:%x\r\n",RxMessage.Data[i]);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异