STM32的CAN总线初始化

本文详细介绍了STM32微控制器中CAN总线接口的初始化配置过程,包括时钟设置、GPIO配置、CAN寄存器配置及过滤器配置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void CAN_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;   
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  /* CAN register init */
 // CAN_DeInit();
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);//刚开始漏掉这句,一直无法进入初始化模式
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE ); //¸´Î»CAN1µÄËùÓмĴæÆ÷
 // RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN, ENABLE);
 // CAN_StructInit(&CAN_InitStructure);  //½«¼Ä´æÆ÷È«²¿ÉèÖóÉĬÈÏÖµ
  /*ÅäÖÃCAN¶Ë¿ÚCAN pin: RX*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;   //IO¶Ë¿ÚµÄµÚ8λ
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;// GPIO_Mode_IN_FLOATING;   //¶Ë¿ÚģʽΪÉÏÀ­ÊäÈ뷽ʽ
  GPIO_Init(GPIOB, &GPIO_InitStructure);
   /* Configure CAN pin: TX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   //IO¶Ë¿ÚµÄµÚ9λ
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //¶Ë¿ÚģʽΪ¸´ÓÃÍÆÀ­Êä³ö·½Ê½
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_PinRemapConfig(GPIO_Remap1_CAN , ENABLE);           //ÖØ¶¨ÒåCAN1µ½PB¿Ú
  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;  //½ûֹʱ¼ä´¥·¢Í¨ÐÅ·½Ê½
  CAN_InitStructure.CAN_ABOM=DISABLE;  //½ûÖ¹CAN×ÜÏß×Ô¶¯¹Ø±Õ¹ÜÀí
  CAN_InitStructure.CAN_AWUM=DISABLE;  //½ûÖ¹×Ô¶¯»½ÐÑģʽ
  CAN_InitStructure.CAN_NART=ENABLE;  //½ûÖ¹·Ç×Ô¶¯ÖØ´«Ä£Ê½
  CAN_InitStructure.CAN_RFLM=DISABLE;  //½ûÖ¹½ÓÊÕFIFOËø¶¨
  CAN_InitStructure.CAN_TXFP=DISABLE;//ENABLE;  //½ûÖ¹·¢ËÍFIFOÓÅÏȼ¶
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN_Mode_LoopBack;//CAN_Mode_Normal;           //ÉèÖÃCAN¹¤×÷·½Ê½ÎªÕý³£ÊÕ·¢Ä£Ê½
  /* CAN ²¨ÌØÂÊ */
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;  //ÉèÖÃÖØÐÂͬ²½Ìø×ªµÄʱ¼äÁ¿×Ó
  CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;  //ÉèÖÃ×Ö¶Î1µÄʱ¼äÁ¿×ÓÊý
  CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;  //ÉèÖÃ×Ö¶Î2µÄʱ¼äÁ¿×ÓÊý
  CAN_InitStructure.CAN_Prescaler=20;  //·ÖƵϵÊý µÍ²¨ÌØÂÊÔ¶¾àÀë´«Êä¸üÎȶ¨£¬Èç¹û¾àÀë¶Ì¿ÉÒÔµ÷СÕâ¸öÖµ
  CAN_Init(&CAN_InitStructure);          //ÓÃÒÔÉϲÎÊý³õʼ»¯CAN1¶Ë¿Ú


  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=0;   //Ñ¡ÔñCAN¹ýÂËÆ÷0
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;   //³õʼ»¯Îª±êʶ/ÆÁ±Îģʽ
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;   //Ñ¡Ôñ¹ýÂËÆ÷Ϊ32λ
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;   //¹ýÂËÆ÷±êʶºÅ¸ß16λ
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;   //¹ýÂËÆ÷±êʶºÅµÍ16λ
  //ÏÂÃæÈ«0£¬Ã»¹ýÂËÈκαêʶºÅ
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;   //¸ù¾ÝģʽѡÔñ¹ýÂËÆ÷±êʶºÅ»òÆÁ±ÎºÅµÄ¸ß16λ
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;   //¸ù¾ÝģʽѡÔñ¹ýÂËÆ÷±êʶºÅ»òÆÁ±ÎºÅµÄµÍ16λ
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;   //½«FIFO 0·ÖÅ䏸¹ýÂËÆ÷0
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;   //ʹÄܹýÂËÆ÷
  CAN_FilterInit(&CAN_FilterInitStructure);
 
 /* CAN FIFO0 ½ÓÊÕÖжÏʹÄÜ */ 
 // CAN_ITConfig(CAN_IT_FMP0, ENABLE);

}

折腾了一天一直无法弄出来,是在以前程序上加个CAN功能,时钟使能在void RCC_Configuration(void)定义的,添加CAN忘了定义CAN时钟,弄一天都要开始怀疑人生了!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值