硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5980|回复: 15
收起左侧

[CAN/FDCAN] STM32H7的CMSIS-Driver CAN FD驱动延续了早前RL-CAN组件的简单易用性

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-1-27 08:29:07 | 显示全部楼层 |阅读模式
这个是ARM独立实现的,基本没有调用H7的HAL库API。

这个CMSIS-Driver的实现给力在用户做ID配置,过滤设置,时间参数设置都非常方便,完美配合RTX5做各种事件处理,基本上用户可以不需要了解CAN,仅需了解这些API就可以玩。

API讲解也非常详细:

1.png


评分

参与人数 1金币 +20 收起 理由
jxgzlym + 20 很给力!

查看全部评分

回复

使用道具 举报

2

主题

55

回帖

61

积分

初级会员

积分
61
发表于 2021-1-27 08:49:09 | 显示全部楼层
我就用的这个,他这个canfd波特率不能配到20好像
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
 楼主| 发表于 2021-1-27 09:02:45 | 显示全部楼层
tomyqg 发表于 2021-1-27 08:49
我就用的这个,他这个canfd波特率不能配到20好像

波特率20是啥,20Mbsp,20Kbps,20bps?
回复

使用道具 举报

2

主题

55

回帖

61

积分

初级会员

积分
61
发表于 2021-1-27 09:03:55 | 显示全部楼层
20k手机发帖没打上
回复

使用道具 举报

2

主题

55

回帖

61

积分

初级会员

积分
61
发表于 2021-1-27 09:11:32 | 显示全部楼层
也不光是20K不能配,应该是波特率有限制,不能随便配的,具体还没有仔细研究
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
 楼主| 发表于 2021-1-27 09:26:18 | 显示全部楼层
tomyqg 发表于 2021-1-27 09:11
也不光是20K不能配,应该是波特率有限制,不能随便配的,具体还没有仔细研究

他这个是这种自动配置的形式,不支持的波特率有必要代入简单换算下,另外跟你的CAN主频配置也有关系。
  1. static int32_t CANx_SetBitrate (ARM_CAN_BITRATE_SELECT select, uint32_t bitrate, uint32_t bit_segments, uint8_t x) {
  2.   FDCAN_GlobalTypeDef *ptr_CAN;
  3.   uint32_t             cccr, sjw, prop_seg, phase_seg1, phase_seg2, pclk, brp, brp_max, tq_num;

  4.   if (x >= CAN_CTRL_NUM)                                                            { return ARM_DRIVER_ERROR;               }
  5.   if ((select != ARM_CAN_BITRATE_NOMINAL) && (select != ARM_CAN_BITRATE_FD_DATA)  ) { return ARM_CAN_INVALID_BITRATE_SELECT; }
  6.   if (can_driver_powered[x] == 0U)                                                  { return ARM_DRIVER_ERROR;               }

  7.   prop_seg   = (bit_segments & ARM_CAN_BIT_PROP_SEG_Msk  ) >> ARM_CAN_BIT_PROP_SEG_Pos;
  8.   phase_seg1 = (bit_segments & ARM_CAN_BIT_PHASE_SEG1_Msk) >> ARM_CAN_BIT_PHASE_SEG1_Pos;
  9.   phase_seg2 = (bit_segments & ARM_CAN_BIT_PHASE_SEG2_Msk) >> ARM_CAN_BIT_PHASE_SEG2_Pos;
  10.   sjw        = (bit_segments & ARM_CAN_BIT_SJW_Msk       ) >> ARM_CAN_BIT_SJW_Pos;

  11.   if (select == ARM_CAN_BITRATE_NOMINAL) {
  12.     if (((prop_seg + phase_seg1) < 2U) || ((prop_seg + phase_seg1) > 256U)) { return ARM_CAN_INVALID_BIT_PROP_SEG;   }
  13.     if (( phase_seg2             < 1U) || ( phase_seg2             > 128U)) { return ARM_CAN_INVALID_BIT_PHASE_SEG2; }
  14.     if (( sjw                    < 1U) || ( sjw                    > 128U)) { return ARM_CAN_INVALID_BIT_SJW;        }
  15.     brp_max = 512U;
  16.   } else {
  17.     if (((prop_seg + phase_seg1) < 2U) || ((prop_seg + phase_seg1) >  32U)) { return ARM_CAN_INVALID_BIT_PROP_SEG;   }
  18.     if (( phase_seg2             < 1U) || ( phase_seg2             >  16U)) { return ARM_CAN_INVALID_BIT_PHASE_SEG2; }
  19.     if (( sjw                    < 1U) || ( sjw                    >   8U)) { return ARM_CAN_INVALID_BIT_SJW;        }
  20.     brp_max = 32U;
  21.   }

  22.   tq_num = 1U + prop_seg + phase_seg1 + phase_seg2;
  23.   pclk   = CAN_GetClock ();           if (pclk == 0U)    { return ARM_DRIVER_ERROR;        }
  24.   brp    = pclk / (tq_num * bitrate); if (brp > brp_max) { return ARM_CAN_INVALID_BITRATE; }
  25.   if (pclk > (brp * tq_num * bitrate)) {
  26.     if ((((pclk - (brp * tq_num * bitrate)) * 1024U) / pclk) > CAN_CLOCK_TOLERANCE) { return ARM_CAN_INVALID_BITRATE; }
  27.   } else if (pclk < (brp * tq_num * bitrate)) {
  28.     if (((((brp * tq_num * bitrate) - pclk) * 1024U) / pclk) > CAN_CLOCK_TOLERANCE) { return ARM_CAN_INVALID_BITRATE; }
  29.   }

  30.   ptr_CAN = ptr_regs_CANx[x];

  31.   cccr = ptr_CAN->CCCR;
  32.   if ((cccr & (FDCAN_CCCR_CCE | FDCAN_CCCR_INIT)) != (FDCAN_CCCR_CCE | FDCAN_CCCR_INIT)) {
  33.     ptr_CAN->CCCR = FDCAN_CCCR_CCE  |   // Configuration change enable
  34.                     FDCAN_CCCR_INIT ;   // Initialization
  35.     while ((ptr_CAN->CCCR & FDCAN_CCCR_INIT) == 0U);
  36.   }

  37.   if (select == ARM_CAN_BITRATE_NOMINAL) {
  38.     ptr_CAN->NBTP  = ((brp - 1U) << 16) | ((prop_seg + phase_seg1 - 1U) << 8) |  (phase_seg2 - 1U)       | ((sjw - 1U) << 25);
  39.   } else {
  40.     ptr_CAN->DBTP = ((brp - 1U) << 16) | ((prop_seg + phase_seg1 - 1U) << 8) | ((phase_seg2 - 1U) << 4) |  (sjw - 1U);
  41.   }
  42.   ptr_CAN->CCCR = cccr;

  43.   return ARM_DRIVER_OK;
  44. }
复制代码


回复

使用道具 举报

2

主题

55

回帖

61

积分

初级会员

积分
61
发表于 2021-1-27 09:41:06 | 显示全部楼层
他在这里限制了一下
fd.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
 楼主| 发表于 2021-1-27 10:12:09 | 显示全部楼层
tomyqg 发表于 2021-1-27 09:41
他在这里限制了一下

你看的这个在那个驱动文件里面,方便上传一下不,我看的CMSIS-Driver V2.7.0没找到这个。
回复

使用道具 举报

2

主题

55

回帖

61

积分

初级会员

积分
61
发表于 2021-1-27 10:30:25 | 显示全部楼层
具体哪找的我忘记,半年前搞的了

CAN_Initialize.txt

8 KB, 下载次数: 19

回复

使用道具 举报

2

主题

55

回帖

61

积分

初级会员

积分
61
发表于 2021-1-27 10:34:17 | 显示全部楼层
看他这里的用意好像是限制了几个常用的采样点吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
 楼主| 发表于 2021-1-27 10:56:30 | 显示全部楼层
tomyqg 发表于 2021-1-27 10:34
看他这里的用意好像是限制了几个常用的采样点吧

这个是初始化例子里面的,我截图的是原始驱动文件。

这个87.5%是这个的需求

CAN采样点的设置推荐85%到90%的位置
http://www.armbbs.cn/forum.php?m ... 7078&fromuid=58
(出处: 硬汉嵌入式论坛)

回复

使用道具 举报

12

主题

178

回帖

214

积分

高级会员

积分
214
发表于 2021-1-27 16:13:21 | 显示全部楼层
不知道CMSIS-Driver里can2的RamOffset是怎么设置的。硬汉你前几天给的例程是设置成500了,这个值不知道够不够。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
 楼主| 发表于 2021-1-28 08:44:21 | 显示全部楼层
gallop020142 发表于 2021-1-27 16:13
不知道CMSIS-Driver里can2的RamOffset是怎么设置的。硬汉你前几天给的例程是设置成500了,这个值不知道够不 ...

配置为500不好,准备修改为1280,即CAN1和CAN2各分得1280字,总计2560字,正好不超。

STM32H7 FD CAN中消息RAM在CAN1和CAN2上合理分配方法
http://www.armbbs.cn/forum.php?m ... d=103560&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

12

主题

178

回帖

214

积分

高级会员

积分
214
发表于 2021-1-28 10:20:14 | 显示全部楼层
eric2013 发表于 2021-1-28 08:44
配置为500不好,准备修改为1280,即CAN1和CAN2各分得1280字,总计2560字,正好不超。

STM32H7 FD CAN ...

为兄弟的研究精神点赞
回复

使用道具 举报

27

主题

91

回帖

172

积分

初级会员

积分
172
发表于 2021-2-17 21:00:49 | 显示全部楼层
...大汉兄,有个疑问,这些RL组件比如RTX-CAN是不是基本得使用RTX能用...
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
 楼主| 发表于 2021-2-18 09:31:57 | 显示全部楼层
borrow1988 发表于 2021-2-17 21:00
...大汉兄,有个疑问,这些RL组件比如RTX-CAN是不是基本得使用RTX能用...

独立的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 23:25 , Processed in 0.264416 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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