最近几天都在调试自己做的小型开发板,但是在CAN的这一块就是调试不过去,在初始化的时候就过不去了,程序如下:
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;

/* Configure CAN1 pin: RX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_RX;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIO_CAN, &GPIO_InitStructure);

/* Configure CAN1 pin: TX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_TX;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIO_CAN, &GPIO_InitStructure);

GPIO_PinRemapConfig(GPIO_Remap_CAN , ENABLE);

/* Configure CAN2 pin: RX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_RX_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIO_CAN_2, &GPIO_InitStructure);

/* Configure CAN2 pin: TX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_TX_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIO_CAN_2, &GPIO_InitStructure);

GPIO_PinRemapConfig(GPIO_Remap_CAN_2 , ENABLE);
}

void CAN_Config(CAN_TypeDef* CANx, uint8_t CAN_FilterNumber)
{
  /* CAN register init */
  CAN_DeInit(CANx);
  CAN_StructInit(&CAN_InitStructure);

/* CAN cell init */
  CAN_InitStructure.CAN_TTCM = DISABLE;
  CAN_InitStructure.CAN_ABOM = DISABLE;
  CAN_InitStructure.CAN_AWUM = DISABLE;
  CAN_InitStructure.CAN_NART = DISABLE;
  CAN_InitStructure.CAN_RFLM = DISABLE;
  CAN_InitStructure.CAN_TXFP = DISABLE;
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
  CAN_InitStructure.CAN_Prescaler = 4;//2
  CAN_Init(CANx, &CAN_InitStructure);

/* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=CAN_FilterNumber;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=(CANx == CAN1? 0:1);
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(CANx, &CAN_FilterInitStructure);

/* transmit */
  TxMessage.StdId = 0x321;
  TxMessage.ExtId = 0x01;
  TxMessage.RTR = CAN_RTR_DATA;
  TxMessage.IDE = CAN_ID_STD;
  TxMessage.DLC = 1;

}

CANx->MCR &= ~MCR_SLEEP;

/* Request initialisation */
  CANx->MCR |= MCR_INRQ ;

/* Wait the acknowledge */
  while (((CANx->MSR & MSR_INAK) != MSR_INAK) && (wait_ack != INAK_TimeOut))
  {
    wait_ack++;
  }

/* ...and check acknowledged */
  if ((CANx->MSR & MSR_INAK) != MSR_INAK)
  {
    InitStatus = CANINITFAILED;
  }
  else 
  {
    /* Set the time triggered communication mode */
    if (CAN_InitStruct->CAN_TTCM == ENABLE)
    {
      CANx->MCR |= MCR_TTCM;
    }
    else
    {
      CANx->MCR &= ~MCR_TTCM;
    }

/* Set the automatic bus-off management */
    if (CAN_InitStruct->CAN_ABOM == ENABLE)
    {
      CANx->MCR |= MCR_ABOM;
    }
    else
    {
      CANx->MCR &= ~MCR_ABOM;
    }

/* Set the automatic wake-up mode */
    if (CAN_InitStruct->CAN_AWUM == ENABLE)
    {
      CANx->MCR |= MCR_AWUM;
    }
    else
    {
      CANx->MCR &= ~MCR_AWUM;
    }

/* Set the no automatic retransmission */
    if (CAN_InitStruct->CAN_NART == ENABLE)
    {
      CANx->MCR |= MCR_NART;
    }
    else
    {
      CANx->MCR &= ~MCR_NART;
    }

/* Set the receive FIFO locked mode */
    if (CAN_InitStruct->CAN_RFLM == ENABLE)
    {
      CANx->MCR |= MCR_RFLM;
    }
    else
    {
      CANx->MCR &= ~MCR_RFLM;
    }

/* Set the transmit FIFO priority */
    if (CAN_InitStruct->CAN_TXFP == ENABLE)
    {
      CANx->MCR |= MCR_TXFP;
    }
    else
    {
      CANx->MCR &= ~MCR_TXFP;
    }

/* Set the bit timing register */
    CANx->BTR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) | ((uint32_t)CAN_InitStruct->CAN_SJW << 24) |
               ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) | ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) |
               ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1);

/* Request leave initialisation */
    CANx->MCR &= ~MCR_INRQ;

/* Wait the acknowledge */
   wait_ack = 0x00;

while (((CANx->MSR & MSR_INAK) == MSR_INAK) && (wait_ack != INAK_TimeOut))
   {
     wait_ack++;
   }

/* ...and check acknowledged */
    if ((CANx->MSR & MSR_INAK) == MSR_INAK)
    {
      InitStatus = CANINITFAILED;
    }
    else
    {
      InitStatus = CANINITOK ;
    }
  }

/* At this step, return the status of initialization */
  return InitStatus;

就是死在了   while (((CANx->MSR & MSR_INAK) == MSR_INAK) && (wait_ack != INAK_TimeOut))
   {
     wait_ack++;
   }手册说是到这个地方是硬件自动对CAN_MSR_INAK位自动清零,但是就是一直没出现,希望各位大神赐教啊!!!!!

总算是解决了,在CAN这一块卡了半个月,从头地仔细看了一遍STM32的CAN,检测硬件电路的设计,缺少帮忙真的很无助,总算黄天不负有心人,弄出来了,在此总结一下,感谢帮助过的各位。
    CAN1在STM上有两个可以重映射的IO口PD0,PD1和PB8,PB9,因此在对他们进行重映射时有十分注意,必须要在一下每个地方修改:
CAN1的重映射:
  #define RCC_APB2Periph_GPIO_CAN    RCC_APB2Periph_GPIOB                 //端口修改
  #define GPIO_Remap_CAN             GPIO_Remap1_CAN1                      //若是映射到PD口则是GPIO_Remap2_CAN1
  #define GPIO_CAN                   GPIOB                                  //端口修改
  #define GPIO_Pin_CAN_RX            GPIO_Pin_8                             //Rx修改
  #define GPIO_Pin_CAN_TX            GPIO_Pin_9                             //Tx修改
我就是在第二个地方失误了,重映射的时候没改,蛋疼了半个月,希望后来者能够避免此错误。

求助啊,被STM32的CAN折磨的疯了相关推荐

  1. 让手机站点像原生应用的四大途径

    干货来了,在于提升用户体验,非常实用,做webapp的童鞋不要错过~ 本文由99根据Kyle Peatt的<A Beginner's Guide to Perceived Performance ...

  2. 准备入手iPhone 4港版的必看!港行无锁版iPhone 4购买全攻略

    2010年7月,在港行无锁版iPhone 4即将推出倒计时之际,本人再次行动,将不惜继续折腾,以实事求是不怕困难的无畏精神再次将购买全程以文字形式记录下来,希望本流水记录同时也给众多期待和热爱港行的朋 ...

  3. 求助:STM32中U32存储范围

    STM32中U32变量的存储范围是多大啊?int,long都可以查到,这个百度没找到.

  4. c语言tim1-smcr是什么意思,STM32求助,为啥tim1定时器的计数器CNT一直是0没有变化?...

    这是初始化的代码,有啥缺漏啊? void Tim1Init() { //Reset TIM1 clock RCC->APB2RSTR.TIM1RST  = 1; //Enable TIM1 cl ...

  5. 入门单片机选择51还是stm32?入门单片机有哪些好的教学视频?

    不知道大家还记不记得自己小学时候自己的梦想? 有人想成为医生.有人想成为医生,有人想成为飞行员,而我想成为发明家. 可能真是我这种想法,也导致我的性格从小就比较内向,毕业出来以后也从事技术. 人生的上 ...

  6. 解读STM32标准库的程序架构 - 以GPIO操作为例

    前言 在开发新产品时,想必大家都曾像我一样碰到过一时难以解决的技术难题,在苦恼和无助中,只得求助于互联网,如果在网上突然发现有此问题相关的解决办法,以此解决了困扰了一整天甚至好几天的问题,这时大家的心 ...

  7. stm32 带通滤波器_带通滤波 - 基于STM32芯片和TFT-LCD的便携式心电图仪设计

    相关推荐 3月10日,纽约州州长安德鲁-库默(Andrew Cuomo)曾在上月宣布,纽约大都市圈的公共交通系... 发表于 2018-04-16 08:50 • 88次阅读 LCD驱动我们只需要写硬 ...

  8. 最近一直在被螺旋槽成型铣刀的计算折磨着

    外螺旋面和内螺旋面在机械传动及机构中应用非常广泛,例如:螺纹.斜齿轮.螺杆转子及金属切削刀具上的螺旋容屑槽等.他们的铣削及磨削加工,需要使用到成型铣刀或砂轮,最近一直在进行铣刀和砂轮的相关计算,一直被 ...

  9. 哥德尔:伟大的数学家与饱受精神疾病折磨的患者

    来源:下文节选自中信出版鹦鹉螺<哥德尔传>,[遇见]已获发布授权,补充部分配图 时间回到 1970 年 3 月.一位精神科医生在泛黄的笔记本上奋笔疾书,记录着诊疗中的发现,有的稀松平常,有 ...

最新文章

  1. oracle归档日志是否启用,oracle归档日志满了,导致无法启动 ORA-03113
  2. C#游戏开发快速入门 2.1 构建游戏场景
  3. 软件项目开发流程RUP上
  4. 不学Python迟早会被淘汰?Python真有这么好的前景?
  5. 存储块的删除与状态查询
  6. GDCM:gdcm::Global的测试程序
  7. Elasticsearch 8.x 正式发布!
  8. 网络爬虫基础-scrapy框架
  9. 百人计划2.6 伽马校正
  10. DirectX11环境配置
  11. kindle看pdf乱码_Kindle 中文书名 目录 乱码 解决办法
  12. opencv 阈值处理(python)
  13. android命令行启动,Android中使用am命令实现在命令行启动程序详解
  14. 网络协议总结(TCP,UDP,HTTP,HTTPS)
  15. adobe android 动画,Lottie - Android 动画详解
  16. 微信公众号采集,历史文章采集,万能key采集,点赞阅读评论采集
  17. python3.x和python2.x唯一区别_Python3.x和Python2.x的区别
  18. Gartner 2016数据仓库和数据分析数据库管理解决方案魔力象限
  19. html转换成canvas一片空白,html2canvas截图空白问题怎么解决 html2canvas截图空白问题解决方法...
  20. 单例模式之饿汉式单例模式

热门文章

  1. Spring Boot Runner启动器
  2. Nginx 学习 —— 负载均衡
  3. Leetcode:给一颗二叉树,找这颗二叉树最小的深度。
  4. 剑指offer:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。
  5. 软件测试自学舞蹈简单,中舞网APP评测:舞蹈初学者必备的APP
  6. 测试mysql安装成功_MySQL安装之“测试”
  7. cdn刷新api_闲话 CDN
  8. python的setting怎么找_python-DJANGO_SETTINGS_MODULE如何配置
  9. HighNewTech:2021阿里云开发者大会-大咖来了(更新中)
  10. Python之pandas:数据类型变换之object、category、bool、int32、int64、float64以及数据类型标准化之详细攻略