你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103RCT6中CAN重映射调不通

[复制链接]
电小龙 提问时间:2018-8-17 09:40 /
板子上设计成了PB8和PB9为CAN的IO口,查了资料说是可以用STM32的端口重映射来解决这个问题。再查看相关资料,在CAN初始化上加了__HAL_AFIO_REMAP_CAN1_2();,怎么还是不通呢,是不是要使能重映射时钟,在库文件里没有找到对应的时钟。求知道的兄弟们指点小弟一番,谢谢!!
<
收藏 评论23 发布时间:2018-8-17 09:40

举报

23个回答
wenyangzeng 回答时间:2018-8-17 10:32:19
本帖最后由 wenyangzeng 于 2018-8-17 10:34 编辑

使用CubeMX配置并重映像CAN到PB8,PB9后,CubeMX就自动为你配置GPIOB和CAN重映像,在stm32f1xx_hal_msp.c中
  1. void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
  2. {

  3.   GPIO_InitTypeDef GPIO_InitStruct;
  4.   if(hcan->Instance==CAN1)
  5.   {
  6.   /* USER CODE BEGIN CAN1_MspInit 0 */

  7.   /* USER CODE END CAN1_MspInit 0 */
  8.     /* Peripheral clock enable */
  9.     __HAL_RCC_CAN1_CLK_ENABLE();
  10.   
  11.     /**CAN GPIO Configuration   
  12.     PB8     ------> CAN_RX
  13.     PB9     ------> CAN_TX
  14.     */
  15.     GPIO_InitStruct.Pin = GPIO_PIN_8;
  16.     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  17.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  18.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  19.     GPIO_InitStruct.Pin = GPIO_PIN_9;
  20.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  21.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  22.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  23.     __HAL_AFIO_REMAP_CAN1_2();

  24.   /* USER CODE BEGIN CAN1_MspInit 1 */

  25.   /* USER CODE END CAN1_MspInit 1 */
  26.   }

  27. }
复制代码




评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

电小龙 回答时间:2018-8-17 10:36:48
wenyangzeng 发表于 2018-8-17 10:32
使用CubeMX配置并重映像CAN到PB8,PB9后,CubeMX就自动为你配置GPIOB和CAN重映像,在stm32f1xx_hal_msp.c中
...

__HAL_RCC_CAN1_CLK_ENABLE();//使能CAN时钟
        __HAL_RCC_GPIOB_CLK_ENABLE();//使能IO口时钟
   
    memset(Can.data, 0, 8);//初始化数值
        Can.data[0] = 1;
       
        Can.Stdid = 0x0742;
        Can.Rtr = CAN_RTR_DATA;
        Can.Ide = CAN_ID_STD;//标准帧
        Can.Dlc = 8;
       
        /**
          *@ PB9     ------> CAN_TX
      *@ PB8     ------> CAN_RX
          *@ GPIO配置
      */
        GPIO_InitStructe.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStructe.Pin = GPIO_PIN_9;
        GPIO_InitStructe.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStructe);
       
        GPIO_InitStructe.Mode = GPIO_MODE_INPUT;
        GPIO_InitStructe.Pin = GPIO_PIN_8;
        GPIO_InitStructe.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStructe);
       
        __HAL_AFIO_REMAP_CAN1_2();//重印射


我也有这些代码啊,怎么还是不行。是不是哪个.h文件里的哪个define需要改
回答时间:2018-8-17 10:39:55
从代码上看初始化了IO口,应该是没问题。看一下CAN初始化的过程,是否有问题。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

电小龙 回答时间:2018-8-17 10:49:49
CAN_Handler.Instance = CAN1;
        CAN_Handler.Init.Prescaler = 8;
        CAN_Handler.Init.Mode = CAN_MODE_NORMAL;
        CAN_Handler.Init.SJW = CAN_SJW_1TQ;
        CAN_Handler.Init.BS1 = CAN_BS1_16TQ;
        CAN_Handler.Init.BS2 = CAN_BS2_1TQ;
        CAN_Handler.Init.TTCM = DISABLE;//非时间触发通信模式
        CAN_Handler.Init.ABOM = DISABLE;//软件自动离线管理
        CAN_Handler.Init.AWUM = DISABLE;//睡眠模式通过软件唤醒
        CAN_Handler.Init.NART = ENABLE;//禁止报文自动传送
        CAN_Handler.Init.RFLM = DISABLE;//报文部锁定,新的覆盖旧的
        CAN_Handler.Init.TXFP = DISABLE;//优先级由报文标识符决定
        CAN_Handler.pTxMsg = &TxMessage;
        CAN_Handler.pRxMsg = &RxMessage;
       
        if(HAL_CAN_Init(&CAN_Handler) != HAL_OK)
        {
                Error_Handler();
        }
       
        /**
          *@ 过滤组设置
      */
        CAN_FilterConfStructe.FilterIdHigh = FilterIDH;
        CAN_FilterConfStructe.FilterIdLow = FilterIDL;
        CAN_FilterConfStructe.FilterMaskIdHigh = FilterMaskIDH;
        CAN_FilterConfStructe.FilterMaskIdLow = FilterMaskIDL;
        CAN_FilterConfStructe.FilterFIFOAssignment = FilterFIFOA;
        CAN_FilterConfStructe.FilterNumber = FilterNum;
        CAN_FilterConfStructe.FilterMode = Filtermode;
        CAN_FilterConfStructe.FilterScale = Filterscale;
        CAN_FilterConfStructe.FilterActivation = FilterAct;
        CAN_FilterConfStructe.BankNumber = BankNum;
        if(HAL_CAN_ConfigFilter(&CAN_Handler, &CAN_FilterConfStructe) != HAL_OK)
        {
                Error_Handler();
        }


void Can_Send(uint8_t *Buff, uint32_t Stdid)
{
        uint8_t i = 0;
        CAN_Handler.pTxMsg->StdId = Stdid;//标准标识符
        CAN_Handler.pTxMsg->RTR = CAN_RTR_DATA;//数据帧
        CAN_Handler.pTxMsg->IDE = CAN_ID_STD;//使用标准帧
        CAN_Handler.pTxMsg->DLC = 8;//数据长度
        for(i = 0; i < 8; i ++)
        {
                CAN_Handler.pTxMsg->Data[i] = Buff[i];
        }
        if(HAL_CAN_Transmit(&CAN_Handler, 0xff) != HAL_OK)//超时
        {
//                Error_Handler();
        }
}

大神们能帮我看下吗?上面一段是初始化,下面的函数是CAN发送函数,实在找不出问题出在哪?
回答时间:2018-8-17 10:58:13
楼主,用STM32CubeMX生成一个工程测试一下。我这里用的是PD0和PD1。
toofree 回答时间:2018-8-17 11:00:57
根据楼上的讨论和代码看,CAN重映射应该没有问题。
但是还是CAN不通,那么你外部是怎么接线的?STM32输出的CAN,经过CAN收发器后,出去CAN_H、CAN_L信号;CAN_H、CAN_L与外部CAN设备连接,如果只是两个设备连接的话,需要根据实际情况,是否加120欧姆终端匹配电阻。正确的是在CAN的首尾两个端点的CAN_H、CAN_L之间各加一个120欧姆电阻,但有时加一个或者不加也可以工作。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

电子星辰 回答时间:2018-8-17 11:06:17
不一定是重映射的问题,也有可能是和其它外设功能哪里冲突了

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

butterflyspring 回答时间:2018-8-17 11:58:34
你初始化过了吗?你有接终端吗?
电小龙 回答时间:2018-8-17 12:35:38
安 发表于 2018-8-17 10:58
楼主,用STM32CubeMX生成一个工程测试一下。我这里用的是PD0和PD1。

用CUbe试过还是不行
123下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版