搜索
查看: 8622|回复: 23

[已解决] STM32F103RCT6中CAN重映射调不通

[复制链接]

该用户从未签到

34

主题

156

帖子

0

蝴蝶豆

金牌会员

最后登录
2020-10-19
发表于 2018-8-17 09:40:55 | 显示全部楼层 |阅读模式
板子上设计成了PB8和PB9为CAN的IO口,查了资料说是可以用STM32的端口重映射来解决这个问题。再查看相关资料,在CAN初始化上加了__HAL_AFIO_REMAP_CAN1_2();,怎么还是不通呢,是不是要使能重映射时钟,在库文件里没有找到对应的时钟。求知道的兄弟们指点小弟一番,谢谢!!
回复

使用道具 举报

该用户从未签到

74

主题

3420

帖子

82

蝴蝶豆

社区小助手

最后登录
2023-11-12
发表于 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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

34

主题

156

帖子

0

蝴蝶豆

金牌会员

最后登录
2020-10-19
 楼主| 发表于 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需要改
回复 支持 反对

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2018-8-17 10:39:55 | 显示全部楼层
从代码上看初始化了IO口,应该是没问题。看一下CAN初始化的过程,是否有问题。

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

34

主题

156

帖子

0

蝴蝶豆

金牌会员

最后登录
2020-10-19
 楼主| 发表于 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发送函数,实在找不出问题出在哪?
回复 支持 反对

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2018-8-17 10:58:13 | 显示全部楼层
楼主,用STM32CubeMX生成一个工程测试一下。我这里用的是PD0和PD1。
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2017-12-6 11:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    49

    主题

    3724

    帖子

    429

    蝴蝶豆

    论坛元老

    最后登录
    2021-8-7
    发表于 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

    查看全部评分

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    26

    主题

    565

    帖子

    85

    蝴蝶豆

    金牌会员

    最后登录
    2021-3-19
    发表于 2018-8-17 11:06:17 | 显示全部楼层
    不一定是重映射的问题,也有可能是和其它外设功能哪里冲突了

    评分

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

    查看全部评分

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    1306

    帖子

    929

    蝴蝶豆

    版主

    最后登录
    2021-3-31
    发表于 2018-8-17 11:58:34 | 显示全部楼层
    你初始化过了吗?你有接终端吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    34

    主题

    156

    帖子

    0

    蝴蝶豆

    金牌会员

    最后登录
    2020-10-19
     楼主| 发表于 2018-8-17 12:35:38 | 显示全部楼层
    安 发表于 2018-8-17 10:58
    楼主,用STM32CubeMX生成一个工程测试一下。我这里用的是PD0和PD1。

    用CUbe试过还是不行
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-5-14 15:12 , Processed in 0.239807 second(s), 45 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表