打印
[APM32F1]

想探讨一下CAN在APM32F1上可以直接使用STM32F1 的HAL库例程吗

[复制链接]
645|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fieldpeng|  楼主 | 2024-8-11 23:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近接到一个公司的项目,要在APM32F1的CAN口接出来连接一个CAN转换模块,将数据传输出去,可以直接用STM32F1的HAL库吗?不知道该怎么直接使用和测试,求解。

使用特权

评论回复
沙发
ABCDEFG1234| | 2024-8-12 17:52 | 只看该作者
可以直接使用STM32F1的HAL库,使用cubeMX生CAN成初始化代码就可以了

使用特权

评论回复
板凳
fieldpeng|  楼主 | 2024-8-13 23:54 | 只看该作者
APM32F1使用的是CAN1,引脚为PA11,PA12。/**
  * 函数功能: CAN通信初始化
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:工装发送数据需要20K,8M晶振
  */
void MX_CAN_Init(void)
{
  /*CAN单元结构体*/
  CAN_FilterConfTypeDef  sFilterConfig;

  /*CAN单元初始化*/
  hCAN.Instance = CANx;             // CAN外设
  hCAN.pTxMsg = &TxMessage;
  hCAN.pRxMsg = &RxMessage;

  hCAN.Init.Prescaler = 4;          // BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+6+2)/4=1Mbps
  hCAN.Init.Mode = CAN_MODE_NORMAL; // 正常工作模式
  hCAN.Init.SJW = CAN_SJW_2TQ;      // BTR-SJW 重新同步跳跃宽度 2个时间单元
  hCAN.Init.BS1 = CAN_BS1_6TQ;      // BTR-TS1 时间段1 占用了6个时间单元
  hCAN.Init.BS2 = CAN_BS2_2TQ;      // BTR-TS1 时间段2 占用了3个时间单元
  //hCAN.Init.BS2 = CAN_BS2_3TQ;      // BTR-TS1 时间段2 占用了3个时间单元(对应文档内容)        36/(1+6+3)/4=0.9Mbps
  hCAN.Init.TTCM = DISABLE;         // MCR-TTCM  关闭时间触发通信模式使能
  hCAN.Init.ABOM = ENABLE;          // MCR-ABOM  自动离线管理
  hCAN.Init.AWUM = ENABLE;          // MCR-AWUM  使用自动唤醒模式
  hCAN.Init.NART = DISABLE;         // MCR-NART  禁止报文自动重传          DISABLE-自动重传
  hCAN.Init.RFLM = DISABLE;         // MCR-RFLM  接收FIFO 锁定模式  DISABLE-溢出时新报文会覆盖原有报文
  hCAN.Init.TXFP = DISABLE;         // MCR-TXFP  发送FIFO优先级 DISABLE-优先级取决于报文标示符
  HAL_CAN_Init(&hCAN);

  /*CAN过滤器初始化*/
  sFilterConfig.FilterNumber = 0;                    //过滤器组0
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;  //工作在标识符屏蔽位模式
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //过滤器位宽为单个32位。
  /* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */

  sFilterConfig.FilterIdHigh         = (((uint32_t)0x1314<<3)&0xFFFF0000)>>16;                                //要过滤的ID高位
  sFilterConfig.FilterIdLow          = (((uint32_t)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; //要过滤的ID低位
  sFilterConfig.FilterMaskIdHigh     = 0xFFFF;                        //过滤器高16位每位必须匹配
  sFilterConfig.FilterMaskIdLow      = 0xFFFF;                        //过滤器低16位每位必须匹配
  sFilterConfig.FilterFIFOAssignment = 0;           //过滤器被关联到FIFO 0
  sFilterConfig.FilterActivation = ENABLE;          //使能过滤器
  sFilterConfig.BankNumber = 14;
  HAL_CAN_ConfigFilter(&hCAN, &sFilterConfig);
}

CAN1的滤波器设置不同,需要重新设置

使用特权

评论回复
地板
chenjun89| | 2024-8-14 08:00 | 只看该作者
大概率是不行的,除非芯片硬件上完全一样,你可以试试。

使用特权

评论回复
5
weifeng90| | 2024-8-14 20:07 | 只看该作者
个人认为不得行吧,硬件设计,寄存器地址等应该都不一样的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

12

帖子

0

粉丝