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

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个回答
电小龙 回答时间: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发送函数,实在找不出问题出在哪?
xuaiguo1980 回答时间:2021-2-25 15:59:48
待审核
电小龙 回答时间: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需要改
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:39:55
从代码上看初始化了IO口,应该是没问题。看一下CAN初始化的过程,是否有问题。

评分

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

查看全部评分

废鱼 回答时间:2018-8-17 10:58:13
楼主,用STM32CubeMX生成一个工程测试一下。我这里用的是PD0和PD1。
七哥 回答时间: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试过还是不行
电小龙 回答时间:2018-8-17 12:35:57
butterflyspring 发表于 2018-8-17 11:58
你初始化过了吗?你有接终端吗?

初始化了,终端电阻也接了
电小龙 回答时间:2018-8-17 12:36:18
电子星辰 发表于 2018-8-17 11:06
不一定是重映射的问题,也有可能是和其它外设功能哪里冲突了

有可能,现在找不到是哪里出了问题
wenyangzeng 回答时间:2018-8-17 13:04:17
电小龙 发表于 2018-8-17 10:49
CAN_Handler.Instance = CAN1;
        CAN_Handler.Init.Prescaler = 8;
        CAN_Handler.Init.Mode = CAN_MODE_NORM ...

发送、接收需要软件干预:
HAL_CAN_Receive(&CanHandle, CAN_FIFO0,10);


ST官方例程可以参考,
CAN_LoopBack.rar (61.14 KB, 下载次数: 27)

评分

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

查看全部评分

电小龙 回答时间:2018-8-17 13:33:47
wenyangzeng 发表于 2018-8-17 13:04
发送、接收需要软件干预:
HAL_CAN_Receive(&CanHandle, CAN_FIFO0,10);

HAL_CAN_Receive(&CanHandle, CAN_FIFO0,10);
这个一加进去程序就卡住了
废鱼 回答时间:2018-8-17 15:07:51
楼主,是否有CAN接收工具?
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版