硬汉嵌入式论坛

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

[CAN/FDCAN] STM32H7 FD CAN中消息RAM在CAN1和CAN2上合理分配方法

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-1-28 08:37:28 | 显示全部楼层 |阅读模式
CMSIS-Driver提供的分配方式非常好,还可以方便的检查是否溢出。
CAN1和CAN2共享2560个字。

1.png


CAN1:

  1. // CAN1 controller configuration ------

  2. #ifndef CAN1_RX_FIFO0_ELEM_NUM
  3. #define CAN1_RX_FIFO0_ELEM_NUM          (8U)
  4. #endif
  5. #if    (CAN1_RX_FIFO0_ELEM_NUM > 64U)
  6. #error  Too many Receive FIFO0 Elements defined for CAN1, maximum number of Receive FIFO0 Elements is 64 !!!
  7. #endif

  8. #ifndef CAN1_RX_FIFO1_ELEM_NUM
  9. #define CAN1_RX_FIFO1_ELEM_NUM          (8U)
  10. #endif
  11. #if    (CAN1_RX_FIFO1_ELEM_NUM > 64U)
  12. #error  Too many Receive FIFO1 Elements defined for CAN1, maximum number of Receive FIFO1 Elements is 64 !!!
  13. #endif

  14. #ifndef CAN1_RX_BUF_NUM
  15. #define CAN1_RX_BUF_NUM                 (16U)
  16. #endif
  17. #if    (CAN1_RX_BUF_NUM > 64U)
  18. #error  Too many Receive Buffers defined for CAN1, maximum number of Receive Buffers is 64 !!!
  19. #endif

  20. #ifndef CAN1_TX_FIFO_ELEM_NUM
  21. #define CAN1_TX_FIFO_ELEM_NUM           (8U)
  22. #endif
  23. #if    (CAN1_TX_FIFO_ELEM_NUM > 32U)
  24. #error  Too many Transmit FIFO Elements defined for CAN1, maximum number of Transmit FIFO Elements is 32 !!!
  25. #endif

  26. #ifndef CAN1_TX_BUF_NUM
  27. #define CAN1_TX_BUF_NUM                 (16U)
  28. #endif
  29. #if    (CAN1_TX_BUF_NUM > 32U)
  30. #error  Too many Transmit Buffers defined for CAN1, maximum number of Transmit Buffers is 32 !!!
  31. #endif

  32. #if    ((CAN1_TX_FIFO_ELEM_NUM + CAN1_TX_BUF_NUM) > 32U)
  33. #error  Too many Transmit Elements and Buffers defined for CAN1, maximum number of Transmit Elements and Buffers together is 32 !!!
  34. #endif

  35. #ifndef CAN1_FILTER_STD_NUM
  36. #define CAN1_FILTER_STD_NUM             (128U)
  37. #endif
  38. #if    (CAN1_FILTER_STD_NUM > 128U)
  39. #error  Standard Filter Elements defined for CAN1, maximum number of Standard Filter Elements is 128 !!!
  40. #endif

  41. #ifndef CAN1_FILTER_EXT_NUM
  42. #define CAN1_FILTER_EXT_NUM             (64U)
  43. #endif
  44. #if    (CAN1_FILTER_EXT_NUM > 64U)
  45. #error  Extended Filter Elements defined for CAN1, maximum number of Extended Filter Elements is 64 !!!
  46. #endif

  47. #define CAN1_RX_FIFO_EN                ((CAN1_RX_FIFO0_ELEM_NUM != 0U) || (CAN1_RX_FIFO1_ELEM_NUM != 0U))
  48. #define CAN1_RX_BUF_EN                  (CAN1_RX_BUF_NUM        != 0U)
  49. #define CAN1_TX_FIFO_EN                 (CAN1_TX_FIFO_ELEM_NUM  != 0U)
  50. #define CAN1_TX_BUF_EN                  (CAN1_TX_BUF_NUM        != 0U)
  51. #define CAN1_RX_FIFO_OBJ_NUM           ((CAN1_RX_FIFO0_ELEM_NUM != 0U) + (CAN1_RX_FIFO1_ELEM_NUM != 0U))
  52. #define CAN1_RX_BUF_OBJ_NUM             (CAN1_RX_BUF_NUM)
  53. #define CAN1_RX_TOT_OBJ_NUM             (CAN1_RX_FIFO_OBJ_NUM + CAN1_RX_BUF_OBJ_NUM)
  54. #define CAN1_TX_FIFO_OBJ_NUM           ((CAN1_TX_FIFO_ELEM_NUM  != 0U))
  55. #define CAN1_TX_BUF_OBJ_NUM             (CAN1_TX_BUF_NUM)
  56. #define CAN1_TX_TOT_OBJ_NUM             (CAN1_TX_FIFO_OBJ_NUM + CAN1_TX_BUF_OBJ_NUM)
  57. #define CAN1_TOT_OBJ_NUM                (CAN1_RX_TOT_OBJ_NUM  + CAN1_TX_TOT_OBJ_NUM)
  58. #define CAN1_TOT_ELEM_NUM               (CAN1_RX_FIFO0_ELEM_NUM + CAN1_RX_FIFO1_ELEM_NUM + CAN1_RX_BUF_NUM + CAN1_TX_BUF_NUM)

  59. #define CAN1_RAM_OFS_STD_ID             (0U)
  60. #define CAN1_RAM_OFS_EXT_ID             (CAN1_RAM_OFS_STD_ID        +   CAN1_FILTER_STD_NUM)
  61. #define CAN1_RAM_OFS_RX_FIFO0           (CAN1_RAM_OFS_EXT_ID        +  (CAN1_FILTER_EXT_NUM    * 2U))
  62. #define CAN1_RAM_OFS_RX_FIFO1           (CAN1_RAM_OFS_RX_FIFO0      +  (CAN1_RX_FIFO0_ELEM_NUM * 18U))
  63. #define CAN1_RAM_OFS_RX_BUFFER          (CAN1_RAM_OFS_RX_FIFO1      +  (CAN1_RX_FIFO1_ELEM_NUM * 18U))
  64. #define CAN1_RAM_OFS_TX_EVENT_FIFO      (CAN1_RAM_OFS_RX_BUFFER     +  (CAN1_RX_BUF_NUM        * 18U))
  65. #define CAN1_RAM_OFS_TX_BUFFER          (CAN1_RAM_OFS_TX_EVENT_FIFO +  (CAN1_TX_FIFO_ELEM_NUM  * 2U))
  66. #define CAN1_TOT_RAM                    (CAN1_RAM_OFS_TX_BUFFER     + ((CAN1_TX_FIFO_ELEM_NUM  + CAN1_RX_BUF_OBJ_NUM) * 18U))
复制代码



CAN2:
  1. #ifndef CAN2_RX_FIFO0_ELEM_NUM
  2. #define CAN2_RX_FIFO0_ELEM_NUM          (8U)
  3. #endif
  4. #if    (CAN2_RX_FIFO0_ELEM_NUM > 64U)
  5. #error  Too many Receive FIFO0 Elements defined for CAN2, maximum number of Receive FIFO0 Elements is 64 !!!
  6. #endif

  7. #ifndef CAN2_RX_FIFO1_ELEM_NUM
  8. #define CAN2_RX_FIFO1_ELEM_NUM          (8U)
  9. #endif
  10. #if    (CAN2_RX_FIFO1_ELEM_NUM > 64U)
  11. #error  Too many Receive FIFO1 Elements defined for CAN2, maximum number of Receive FIFO1 Elements is 64 !!!
  12. #endif

  13. #ifndef CAN2_RX_BUF_NUM
  14. #define CAN2_RX_BUF_NUM                 (16U)
  15. #endif
  16. #if    (CAN2_RX_BUF_NUM > 64U)
  17. #error  Too many Receive Buffers defined for CAN2, maximum number of Receive Buffers is 64 !!!
  18. #endif

  19. #ifndef CAN2_TX_FIFO_ELEM_NUM
  20. #define CAN2_TX_FIFO_ELEM_NUM           (8U)
  21. #endif
  22. #if    (CAN2_TX_FIFO_ELEM_NUM > 32U)
  23. #error  Too many Transmit FIFO Elements defined for CAN2, maximum number of Transmit FIFO Elements is 32 !!!
  24. #endif

  25. #ifndef CAN2_TX_BUF_NUM
  26. #define CAN2_TX_BUF_NUM                 (16U)
  27. #endif
  28. #if    (CAN2_TX_BUF_NUM > 32U)
  29. #error  Too many Transmit Buffers defined for CAN2, maximum number of Transmit Buffers is 32 !!!
  30. #endif

  31. #if    ((CAN2_TX_FIFO_ELEM_NUM + CAN2_TX_BUF_NUM) > 32U)
  32. #error  Too many Transmit Elements and Buffers defined for CAN2, maximum number of Transmit Elements and Buffers together is 32 !!!
  33. #endif

  34. #ifndef CAN2_FILTER_STD_NUM
  35. #define CAN2_FILTER_STD_NUM             (128U)
  36. #endif
  37. #if    (CAN2_FILTER_STD_NUM > 128U)
  38. #error  Standard Filter Elements defined for CAN2, maximum number of Standard Filter Elements is 128 !!!
  39. #endif

  40. #ifndef CAN2_FILTER_EXT_NUM
  41. #define CAN2_FILTER_EXT_NUM             (64U)
  42. #endif
  43. #if    (CAN2_FILTER_EXT_NUM > 64U)
  44. #error  Extended Filter Elements defined for CAN2, maximum number of Extended Filter Elements is 64 !!!
  45. #endif

  46. #define CAN2_RX_FIFO_EN                ((CAN2_RX_FIFO0_ELEM_NUM != 0U) || (CAN2_RX_FIFO1_ELEM_NUM != 0U))
  47. #define CAN2_RX_BUF_EN                  (CAN2_RX_BUF_NUM        != 0U)
  48. #define CAN2_TX_FIFO_EN                 (CAN2_TX_FIFO_ELEM_NUM  != 0U)
  49. #define CAN2_TX_BUF_EN                  (CAN2_TX_BUF_NUM        != 0U)
  50. #define CAN2_RX_FIFO_OBJ_NUM           ((CAN2_RX_FIFO0_ELEM_NUM != 0U) + (CAN2_RX_FIFO1_ELEM_NUM != 0U))
  51. #define CAN2_RX_BUF_OBJ_NUM             (CAN2_RX_BUF_NUM)
  52. #define CAN2_RX_TOT_OBJ_NUM             (CAN2_RX_FIFO_OBJ_NUM + CAN2_RX_BUF_OBJ_NUM)
  53. #define CAN2_TX_FIFO_OBJ_NUM           ((CAN2_TX_FIFO_ELEM_NUM  != 0U))
  54. #define CAN2_TX_BUF_OBJ_NUM             (CAN2_TX_BUF_NUM)
  55. #define CAN2_TX_TOT_OBJ_NUM             (CAN2_TX_FIFO_OBJ_NUM + CAN2_TX_BUF_OBJ_NUM)
  56. #define CAN2_TOT_OBJ_NUM                (CAN2_RX_TOT_OBJ_NUM  + CAN2_TX_TOT_OBJ_NUM)
  57. #define CAN2_TOT_ELEM_NUM               (CAN2_RX_FIFO0_ELEM_NUM + CAN2_RX_FIFO1_ELEM_NUM + CAN2_RX_BUF_NUM + CAN2_TX_BUF_NUM)

  58. #define CAN2_RAM_OFS_STD_ID             (0U)
  59. #define CAN2_RAM_OFS_EXT_ID             (CAN2_RAM_OFS_STD_ID        +   CAN2_FILTER_STD_NUM)
  60. #define CAN2_RAM_OFS_RX_FIFO0           (CAN2_RAM_OFS_EXT_ID        +  (CAN2_FILTER_EXT_NUM * 2U))
  61. #define CAN2_RAM_OFS_RX_FIFO1           (CAN2_RAM_OFS_RX_FIFO0      +  (CAN2_RX_FIFO0_ELEM_NUM * 18U))
  62. #define CAN2_RAM_OFS_RX_BUFFER          (CAN2_RAM_OFS_RX_FIFO1      +  (CAN2_RX_FIFO1_ELEM_NUM * 18U))
  63. #define CAN2_RAM_OFS_TX_EVENT_FIFO      (CAN2_RAM_OFS_RX_BUFFER     +  (CAN2_RX_BUF_NUM * 18U))
  64. #define CAN2_RAM_OFS_TX_BUFFER          (CAN2_RAM_OFS_TX_EVENT_FIFO +  (CAN2_TX_FIFO_ELEM_NUM * 2U))
  65. #define CAN2_TOT_RAM                    (CAN2_RAM_OFS_TX_BUFFER     + ((CAN2_TX_FIFO_ELEM_NUM + CAN2_RX_BUF_OBJ_NUM) * 18U))
复制代码



检查RAM配置是否超了

  1. // Check Message RAM configuration
  2. #if ((CAN1_USED == 1) && (CAN2_USED == 0) && (CAN1_TOT_RAM > 2560U))
  3.   #error Message RAM contains only 10 kB, current configuration of CAN1 requires more memory, please reduce number of FIFO or buffer elements for Receive or Transmit!
  4. #endif
  5. #if ((CAN1_USED == 0) && (CAN2_USED == 1) && (CAN2_TOT_RAM > 2560U))
  6.   #error Message RAM contains only 10 kB, current configuration of CAN2 requires more memory, please reduce number of FIFO or buffer elements for Receive or Transmit!
  7. #endif
  8. #if ((CAN1_USED == 1) && (CAN2_USED == 1) && ((CAN1_TOT_RAM + CAN2_TOT_RAM) > 2560U))
  9.   #error Message RAM contains only 10 kB, current configuration of CAN1 and CAN2 requires more memory, please reduce number of FIFO or buffer elements for Receive or Transmit!
  10. #endif
复制代码








回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-1-28 08:54:50 | 显示全部楼层
#if (CAN1_USED == 1)
// Statically allocated RAM for filters and buffers for CAN1 controller
static uint32_t         CAN1_RAM[CAN1_TOT_RAM] __MEMORY_AT(0x4000AC00);
#endif
#if (CAN2_USED == 1)
// Statically allocated RAM for filters and buffers for CAN2 controller
static uint32_t         CAN2_RAM[CAN2_TOT_RAM] __MEMORY_AT(0x4000C000);
#endif
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 03:01 , Processed in 0.195864 second(s), 36 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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