硬汉嵌入式论坛

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

[CAN/FDCAN] CMSIS-Driver CAN FD驱动对STM32H7带的2560字RAM分配,值得借鉴

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-3-24 10:45:25 | 显示全部楼层 |阅读模式

2560字RAM区:
1.png

分配如下:

  1. *   CAN_CLOCK_TOLERANCE:       defines maximum allowed clock tolerance in 1/1024 steps
  2. *     - default value:         15  (approx. 1.5 %)
  3. *   CAN_NON_ISO_EN:            used to enable non-ISO CAN FD mode
  4. *     - default value          0 (disabled)
  5. *
  6. *   CAN1 controller configuration:
  7. *   CAN1_RX_FIFO0_ELEM_NUM:    number of receive  FIFO0 elements   (default=8,   max=64)
  8. *   CAN1_RX_FIFO1_ELEM_NUM:    number of receive  FIFO1 elements   (default=8,   max=64)
  9. *   CAN1_TX_FIFO_ELEM_NUM:     number of transmit FIFO  elements   (default=8,   max=32)
  10. *   CAN1_RX_BUF_NUM:           maximum number of receive  buffers  (default=16,  max=64)
  11. *   CAN1_TX_BUF_NUM:           maximum number of transmit buffers  (default=16,  max=32)
  12. *   CAN1_FILTER_STD_NUM:       maximum number of standard elements (default=128, max=128)
  13. *   CAN1_FILTER_EXT_NUM:       maximum number of extended elements (default=64,  max=64)
  14. *
  15. *   CAN2 controller configuration:
  16. *   CAN2_RX_FIFO0_ELEM_NUM:    number of receive  FIFO0 elements   (default=8,   max=64)
  17. *   CAN2_RX_FIFO1_ELEM_NUM:    number of receive  FIFO1 elements   (default=8,   max=64)
  18. *   CAN2_TX_FIFO_ELEM_NUM:     number of transmit FIFO  elements   (default=8,   max=32)
  19. *   CAN2_RX_BUF_NUM:           maximum number of receive  buffers  (default=16,  max=64)
  20. *   CAN2_TX_BUF_NUM:           maximum number of transmit buffers  (default=16,  max=32)
  21. *   CAN2_FILTER_STD_NUM:       maximum number of standard elements (default=128, max=128)
  22. *   CAN2_FILTER_EXT_NUM:       maximum number of extended elements (default=64,  max=64)
复制代码


通过各种条件编译设置,防止用户使用时配置错误:

  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))


  67. // CAN2 controller configuration ------

  68. #ifndef CAN2_RX_FIFO0_ELEM_NUM
  69. #define CAN2_RX_FIFO0_ELEM_NUM          (8U)
  70. #endif
  71. #if    (CAN2_RX_FIFO0_ELEM_NUM > 64U)
  72. #error  Too many Receive FIFO0 Elements defined for CAN2, maximum number of Receive FIFO0 Elements is 64 !!!
  73. #endif

  74. #ifndef CAN2_RX_FIFO1_ELEM_NUM
  75. #define CAN2_RX_FIFO1_ELEM_NUM          (8U)
  76. #endif
  77. #if    (CAN2_RX_FIFO1_ELEM_NUM > 64U)
  78. #error  Too many Receive FIFO1 Elements defined for CAN2, maximum number of Receive FIFO1 Elements is 64 !!!
  79. #endif

  80. #ifndef CAN2_RX_BUF_NUM
  81. #define CAN2_RX_BUF_NUM                 (16U)
  82. #endif
  83. #if    (CAN2_RX_BUF_NUM > 64U)
  84. #error  Too many Receive Buffers defined for CAN2, maximum number of Receive Buffers is 64 !!!
  85. #endif

  86. #ifndef CAN2_TX_FIFO_ELEM_NUM
  87. #define CAN2_TX_FIFO_ELEM_NUM           (8U)
  88. #endif
  89. #if    (CAN2_TX_FIFO_ELEM_NUM > 32U)
  90. #error  Too many Transmit FIFO Elements defined for CAN2, maximum number of Transmit FIFO Elements is 32 !!!
  91. #endif

  92. #ifndef CAN2_TX_BUF_NUM
  93. #define CAN2_TX_BUF_NUM                 (16U)
  94. #endif
  95. #if    (CAN2_TX_BUF_NUM > 32U)
  96. #error  Too many Transmit Buffers defined for CAN2, maximum number of Transmit Buffers is 32 !!!
  97. #endif

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

  101. #ifndef CAN2_FILTER_STD_NUM
  102. #define CAN2_FILTER_STD_NUM             (128U)
  103. #endif
  104. #if    (CAN2_FILTER_STD_NUM > 128U)
  105. #error  Standard Filter Elements defined for CAN2, maximum number of Standard Filter Elements is 128 !!!
  106. #endif

  107. #ifndef CAN2_FILTER_EXT_NUM
  108. #define CAN2_FILTER_EXT_NUM             (64U)
  109. #endif
  110. #if    (CAN2_FILTER_EXT_NUM > 64U)
  111. #error  Extended Filter Elements defined for CAN2, maximum number of Extended Filter Elements is 64 !!!
  112. #endif

  113. #define CAN2_RX_FIFO_EN                ((CAN2_RX_FIFO0_ELEM_NUM != 0U) || (CAN2_RX_FIFO1_ELEM_NUM != 0U))
  114. #define CAN2_RX_BUF_EN                  (CAN2_RX_BUF_NUM        != 0U)
  115. #define CAN2_TX_FIFO_EN                 (CAN2_TX_FIFO_ELEM_NUM  != 0U)
  116. #define CAN2_TX_BUF_EN                  (CAN2_TX_BUF_NUM        != 0U)
  117. #define CAN2_RX_FIFO_OBJ_NUM           ((CAN2_RX_FIFO0_ELEM_NUM != 0U) + (CAN2_RX_FIFO1_ELEM_NUM != 0U))
  118. #define CAN2_RX_BUF_OBJ_NUM             (CAN2_RX_BUF_NUM)
  119. #define CAN2_RX_TOT_OBJ_NUM             (CAN2_RX_FIFO_OBJ_NUM + CAN2_RX_BUF_OBJ_NUM)
  120. #define CAN2_TX_FIFO_OBJ_NUM           ((CAN2_TX_FIFO_ELEM_NUM  != 0U))
  121. #define CAN2_TX_BUF_OBJ_NUM             (CAN2_TX_BUF_NUM)
  122. #define CAN2_TX_TOT_OBJ_NUM             (CAN2_TX_FIFO_OBJ_NUM + CAN2_TX_BUF_OBJ_NUM)
  123. #define CAN2_TOT_OBJ_NUM                (CAN2_RX_TOT_OBJ_NUM  + CAN2_TX_TOT_OBJ_NUM)
  124. #define CAN2_TOT_ELEM_NUM               (CAN2_RX_FIFO0_ELEM_NUM + CAN2_RX_FIFO1_ELEM_NUM + CAN2_RX_BUF_NUM + CAN2_TX_BUF_NUM)

  125. #define CAN2_RAM_OFS_STD_ID             (0U)
  126. #define CAN2_RAM_OFS_EXT_ID             (CAN2_RAM_OFS_STD_ID        +   CAN2_FILTER_STD_NUM)
  127. #define CAN2_RAM_OFS_RX_FIFO0           (CAN2_RAM_OFS_EXT_ID        +  (CAN2_FILTER_EXT_NUM * 2U))
  128. #define CAN2_RAM_OFS_RX_FIFO1           (CAN2_RAM_OFS_RX_FIFO0      +  (CAN2_RX_FIFO0_ELEM_NUM * 18U))
  129. #define CAN2_RAM_OFS_RX_BUFFER          (CAN2_RAM_OFS_RX_FIFO1      +  (CAN2_RX_FIFO1_ELEM_NUM * 18U))
  130. #define CAN2_RAM_OFS_TX_EVENT_FIFO      (CAN2_RAM_OFS_RX_BUFFER     +  (CAN2_RX_BUF_NUM * 18U))
  131. #define CAN2_RAM_OFS_TX_BUFFER          (CAN2_RAM_OFS_TX_EVENT_FIFO +  (CAN2_TX_FIFO_ELEM_NUM * 2U))
  132. #define CAN2_TOT_RAM                    (CAN2_RAM_OFS_TX_BUFFER     + ((CAN2_TX_FIFO_ELEM_NUM + CAN2_RX_BUF_OBJ_NUM) * 18U))

  133. // Check Message RAM configuration
  134. #if ((CAN1_USED == 1) && (CAN2_USED == 0) && (CAN1_TOT_RAM > 2560U))
  135.   #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!
  136. #endif
  137. #if ((CAN1_USED == 0) && (CAN2_USED == 1) && (CAN2_TOT_RAM > 2560U))
  138.   #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!
  139. #endif
  140. #if ((CAN1_USED == 1) && (CAN2_USED == 1) && ((CAN1_TOT_RAM + CAN2_TOT_RAM) > 2560U))
  141.   #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!
  142. #endif

  143. // CAN message RAM base
  144. #define CAN_RAM_BASE                    (0x4000AC00)
复制代码

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 18:32 , Processed in 0.180854 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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