diff --git a/rt-thread-version/rt-thread-standard/_sidebar.md b/rt-thread-version/rt-thread-standard/_sidebar.md index 6a8393f4d69050386bfa8b116f18be43d7ace3dc..cc01b38d0aa94bbbb9af1833c3b1cb2121d64d79 100644 --- a/rt-thread-version/rt-thread-standard/_sidebar.md +++ b/rt-thread-version/rt-thread-standard/_sidebar.md @@ -193,13 +193,14 @@ - 英飞凌PSoC™6系列 - [BSP制作教程](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/ifx-psoc6/PSoC6系列BSP制作教程.md) - [PSoC™6开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/ifx-psoc6/PSoC6开发实践指南.md) + - NXP-MCX系列 + - [恩智浦FRDM-MCXN947开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/恩智浦FRDM-MCX974实践指南.md) - 官方开发板 - [星火一号](/rt-thread-version/rt-thread-standard/hw-board/spark-1/spark-1.md) - [ART-PI](/rt-thread-version/rt-thread-standard/hw-board/art-pi/art-pi.md) - [英飞凌评估套件](/rt-thread-version/rt-thread-standard/hw-board/ifx-eval-kit/ifx-eval-kit.md) - [HMI-Board](/rt-thread-version/rt-thread-standard/hw-board/ra6m3-hmi-board/ra6m3-hmi-board.md) - [Vision-Board](/rt-thread-version/rt-thread-standard/hw-board/ra8d1-vision-board/ra8d1-vision-board.md) - - Demo示例 - 开源参考设计 - [英飞凌网关Demo](/rt-thread-version/rt-thread-standard/tutorial/open-projects-design/Infineon/Infineon-gateway-demo.md) diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/042b4119286256772a5d66dd33947936.png-1715249990237104.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/042b4119286256772a5d66dd33947936.png-1715249990237104.webp new file mode 100644 index 0000000000000000000000000000000000000000..17b1ad3396d3a070362546deafeb89fec894dd7b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/042b4119286256772a5d66dd33947936.png-1715249990237104.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/042b4119286256772a5d66dd33947936.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/042b4119286256772a5d66dd33947936.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..17b1ad3396d3a070362546deafeb89fec894dd7b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/042b4119286256772a5d66dd33947936.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/05c353a5faaf96a8c59f5377dc88f3ef.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/05c353a5faaf96a8c59f5377dc88f3ef.png new file mode 100644 index 0000000000000000000000000000000000000000..70db6f885442ba9b71020e56a48f24d0569ea212 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/05c353a5faaf96a8c59f5377dc88f3ef.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/060934c3053b7cd81675d46db692d0fa.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/060934c3053b7cd81675d46db692d0fa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dd5fe220620fd24a31677fcc371f2e9b8d18c98c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/060934c3053b7cd81675d46db692d0fa.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/08d5919dea152fac6ca5273cc033d356.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/08d5919dea152fac6ca5273cc033d356.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b411caed8fe8d2fcecf674116589f0647ff3aa02 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/08d5919dea152fac6ca5273cc033d356.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/0cf2dcb5782573310e84dc530feac7f2.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/0cf2dcb5782573310e84dc530feac7f2.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..c277d44616ba9374c2722f277db4886a211a2876 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/0cf2dcb5782573310e84dc530feac7f2.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/0d0c70cfe50598483c6c21629d55a8e9.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/0d0c70cfe50598483c6c21629d55a8e9.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..60ad104df16b3f06d7166e61a6a566842fa98c75 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/0d0c70cfe50598483c6c21629d55a8e9.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/0e23f277bed2390f8d6a0fc99bb1a64e.png-171523840847415.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/0e23f277bed2390f8d6a0fc99bb1a64e.png-171523840847415.webp new file mode 100644 index 0000000000000000000000000000000000000000..ca5bc5dd54b3d2a215594ff246c30b2d5e543a88 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/0e23f277bed2390f8d6a0fc99bb1a64e.png-171523840847415.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/0e23f277bed2390f8d6a0fc99bb1a64e.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/0e23f277bed2390f8d6a0fc99bb1a64e.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..ca5bc5dd54b3d2a215594ff246c30b2d5e543a88 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/0e23f277bed2390f8d6a0fc99bb1a64e.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/114cc98c7d9ffe68287d0a05f10aa4c3.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/114cc98c7d9ffe68287d0a05f10aa4c3.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..2f8173d433e788774f45c47c015ecd268813b2b0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/114cc98c7d9ffe68287d0a05f10aa4c3.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/122c40e708b959b90803797161c10602.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/122c40e708b959b90803797161c10602.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..14ad19c7196e1f77db4d0b43d74a13b80b1c1e03 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/122c40e708b959b90803797161c10602.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/128684d19c8e897ed87e93c79c49749f.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/128684d19c8e897ed87e93c79c49749f.png new file mode 100644 index 0000000000000000000000000000000000000000..42df4d8ba2dd12731c9f8c8d9f760284943aa5a4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/128684d19c8e897ed87e93c79c49749f.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/161ee550046696b5c45869f659f9a422.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/161ee550046696b5c45869f659f9a422.png new file mode 100644 index 0000000000000000000000000000000000000000..c630cfd9725ce74953390fb9b34e1b35e24450b1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/161ee550046696b5c45869f659f9a422.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/16cfdd300117302687989bdf90dda3cf.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/16cfdd300117302687989bdf90dda3cf.png new file mode 100644 index 0000000000000000000000000000000000000000..5fdeaf624a5c1771d52d33a9ae71a07430c125ef Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/16cfdd300117302687989bdf90dda3cf.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/16faf008b7fe429125be96393f0a3e53.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/16faf008b7fe429125be96393f0a3e53.png new file mode 100644 index 0000000000000000000000000000000000000000..11121ce27a63a447d5644d5b4c4896d9f898ac8e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/16faf008b7fe429125be96393f0a3e53.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/1970d6bc093bebfdf6e23c2238feda75.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/1970d6bc093bebfdf6e23c2238feda75.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..fae032e1a0d8b22e9f118552fa5d95eba6b20a09 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/1970d6bc093bebfdf6e23c2238feda75.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/197653133f39b9d5b3c1424dfed4d005.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/197653133f39b9d5b3c1424dfed4d005.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f03bf60e49937ba6f270bdcb1ee9a4c162324c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/197653133f39b9d5b3c1424dfed4d005.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/19e199a266de3c418b127fa33ace2738.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/19e199a266de3c418b127fa33ace2738.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..d1da7761a825b7c404098e577bc6909b048fe66e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/19e199a266de3c418b127fa33ace2738.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/1a30bdd3cbe5a725915521f280bf40f0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/1a30bdd3cbe5a725915521f280bf40f0.png new file mode 100644 index 0000000000000000000000000000000000000000..6e431113d7b46cedd59ff065df0534dc90469035 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/1a30bdd3cbe5a725915521f280bf40f0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/1ade7f67d9cf90a615fd8a02a37e3ae3.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/1ade7f67d9cf90a615fd8a02a37e3ae3.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..eba57ca4711ff6409bac10257f631af529de07f4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/1ade7f67d9cf90a615fd8a02a37e3ae3.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/1c73ccf75883f3e4cb9e8c7dc8a4db15.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/1c73ccf75883f3e4cb9e8c7dc8a4db15.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e2c7ab9fbd1ae836a58e7982206fcd7acd33b8fe Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/1c73ccf75883f3e4cb9e8c7dc8a4db15.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/20f31602de655b770f3ba5a95b7196bb.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/20f31602de655b770f3ba5a95b7196bb.png new file mode 100644 index 0000000000000000000000000000000000000000..e45eae53654af273758111b43104bbab40f116cb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/20f31602de655b770f3ba5a95b7196bb.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/21aedf589066744d53887b49b4ddd30b.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/21aedf589066744d53887b49b4ddd30b.png new file mode 100644 index 0000000000000000000000000000000000000000..e22d0786bcf3dba40ce80b08ac2cae4dda42865a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/21aedf589066744d53887b49b4ddd30b.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/224856a35aa7feae067e9b5daded6ad3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/224856a35aa7feae067e9b5daded6ad3.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf8f549452c8026c728321a69ee22650c0a4291 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/224856a35aa7feae067e9b5daded6ad3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/22790b72439b99e5c9ddbe898be7f5fc.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/22790b72439b99e5c9ddbe898be7f5fc.png new file mode 100644 index 0000000000000000000000000000000000000000..e06666ff86b54ae43dfc18ff8f392b672a531769 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/22790b72439b99e5c9ddbe898be7f5fc.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/242e1a8f30f9fc8d1544e685e0a7e575.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/242e1a8f30f9fc8d1544e685e0a7e575.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7b9f1ece68fff15ac07fc7006bb5d9f4683215 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/242e1a8f30f9fc8d1544e685e0a7e575.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2483d9b38b174b1bb2a42b207b85cb9a.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2483d9b38b174b1bb2a42b207b85cb9a.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..08fc44b9ea08cf9e44c6e8ea3088b31731ea133e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2483d9b38b174b1bb2a42b207b85cb9a.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/25600ced37217c3e74c92470fa17a1b7.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/25600ced37217c3e74c92470fa17a1b7.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..e583d0cbf950f000fa991832cab46ef524e763bc Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/25600ced37217c3e74c92470fa17a1b7.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/273d6110e1e246ac758e51a283643e04.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/273d6110e1e246ac758e51a283643e04.png new file mode 100644 index 0000000000000000000000000000000000000000..4f84297d63f4d05a484b9c20ee4223d81810e34f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/273d6110e1e246ac758e51a283643e04.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2767a790a99b54b66740587f1f7b87c1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2767a790a99b54b66740587f1f7b87c1.png new file mode 100644 index 0000000000000000000000000000000000000000..cc168d3b992cb9fba2bac15a039c2f690641fb37 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2767a790a99b54b66740587f1f7b87c1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/29422f07254b0562f4ca5767416b40f4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/29422f07254b0562f4ca5767416b40f4.png new file mode 100644 index 0000000000000000000000000000000000000000..1fa35f273377837b5074d7d5b9cf0aa09a2eb9e4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/29422f07254b0562f4ca5767416b40f4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2ab18f49928a723aea4938ab3f8a13e6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2ab18f49928a723aea4938ab3f8a13e6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..78c03a545bcb565814d0e7a56352dd3d96270777 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2ab18f49928a723aea4938ab3f8a13e6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2b594519bbe03475d8827c568582bc55-171523821049013.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2b594519bbe03475d8827c568582bc55-171523821049013.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa72bbd7a9c4d72d4dad7b7bfbe30041e7d6dd9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2b594519bbe03475d8827c568582bc55-171523821049013.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2b594519bbe03475d8827c568582bc55.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2b594519bbe03475d8827c568582bc55.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa72bbd7a9c4d72d4dad7b7bfbe30041e7d6dd9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2b594519bbe03475d8827c568582bc55.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2b7cfcba523dabf4a841d345f2d874cb.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2b7cfcba523dabf4a841d345f2d874cb.png new file mode 100644 index 0000000000000000000000000000000000000000..49c8b46489e6011e6b0c2222a348a61283c6bb61 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2b7cfcba523dabf4a841d345f2d874cb.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2b93a6ed16724361d42e95ab4cbf775f.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2b93a6ed16724361d42e95ab4cbf775f.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..19d661e80db341a959e1c7ff049c69c38cfcdd05 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2b93a6ed16724361d42e95ab4cbf775f.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2c4767ecb1f1b15782557e4b0d65fc78.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2c4767ecb1f1b15782557e4b0d65fc78.png new file mode 100644 index 0000000000000000000000000000000000000000..b4186119cae802b8e80dfafbf5a08308f9253bbb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2c4767ecb1f1b15782557e4b0d65fc78.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2c8547a52f58d6b4dc8c201306757e31.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2c8547a52f58d6b4dc8c201306757e31.png new file mode 100644 index 0000000000000000000000000000000000000000..c130a2c222a500e8c71933f2cb590ac343c46fc5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2c8547a52f58d6b4dc8c201306757e31.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2da87cfd65455d3551980955b1629651.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2da87cfd65455d3551980955b1629651.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..700c091469cae6c4db83c743cbf125df008e753b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2da87cfd65455d3551980955b1629651.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2f044083cefcf0e9961894e75ecd00e1.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2f044083cefcf0e9961894e75ecd00e1.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..14a2afaba8a38995274bc25cf503614a11e44057 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2f044083cefcf0e9961894e75ecd00e1.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2fe81c312ade7cf42d83397429aa7854.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2fe81c312ade7cf42d83397429aa7854.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..53bd1102713929c08c748e4d02fda3e3870aa202 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2fe81c312ade7cf42d83397429aa7854.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2ff30c892b61a603581711b31d38726a.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2ff30c892b61a603581711b31d38726a.png new file mode 100644 index 0000000000000000000000000000000000000000..2595a38478681f1ad3a31b308b51e30f1482d19b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/2ff30c892b61a603581711b31d38726a.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/304bfed046bf684a2254beecf3c122ea.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/304bfed046bf684a2254beecf3c122ea.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e6a5cad2f8f7079ca693038574e8d33c9d6f1d7d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/304bfed046bf684a2254beecf3c122ea.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/32746091652abe331b041126a3195efe.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/32746091652abe331b041126a3195efe.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..18b095deb8024d3dc3fa2e268a3968fadeaf617b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/32746091652abe331b041126a3195efe.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/337405b1fb6339166c1a016ee2d11863.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/337405b1fb6339166c1a016ee2d11863.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4c31fe793afae8bbb821c725abf5239ebaa786b6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/337405b1fb6339166c1a016ee2d11863.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3410d5bdecf1d90f0b22712b8f92a1b8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3410d5bdecf1d90f0b22712b8f92a1b8.png new file mode 100644 index 0000000000000000000000000000000000000000..fd1513c53077c65507a95f624b789369c76380b4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3410d5bdecf1d90f0b22712b8f92a1b8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/349ddb16fe5330db0777ff5ae019925b.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/349ddb16fe5330db0777ff5ae019925b.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..3eb87b00b2f95abce33fe2fed197807e1137ed24 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/349ddb16fe5330db0777ff5ae019925b.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3511bc7aae896250e2880914fdfef384.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3511bc7aae896250e2880914fdfef384.png new file mode 100644 index 0000000000000000000000000000000000000000..995f88e522381488ee4c02beadbf1283e1485866 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3511bc7aae896250e2880914fdfef384.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/351cbd3da9cc998dd701dba293606bdd.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/351cbd3da9cc998dd701dba293606bdd.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..1b5a0fe901d56484c205aa727e1d85927e5b029e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/351cbd3da9cc998dd701dba293606bdd.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/35b91d57e4cd39b3444e480fe59b7a2d.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/35b91d57e4cd39b3444e480fe59b7a2d.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..de5d28a2a44ca94618de11f9a0d406dc0dadc19b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/35b91d57e4cd39b3444e480fe59b7a2d.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/38b74f43c3d60707d0cbb85d087d3912.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/38b74f43c3d60707d0cbb85d087d3912.png new file mode 100644 index 0000000000000000000000000000000000000000..9444b64e7af02cfe2b3196ba67a7dfdd3cb747f7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/38b74f43c3d60707d0cbb85d087d3912.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3931f2308bed22146b1359a72a907dcc-1715308334739161.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3931f2308bed22146b1359a72a907dcc-1715308334739161.png new file mode 100644 index 0000000000000000000000000000000000000000..07709e20eebb7699756a165da86baa44091457b4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3931f2308bed22146b1359a72a907dcc-1715308334739161.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3931f2308bed22146b1359a72a907dcc.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3931f2308bed22146b1359a72a907dcc.png new file mode 100644 index 0000000000000000000000000000000000000000..07709e20eebb7699756a165da86baa44091457b4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3931f2308bed22146b1359a72a907dcc.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3accd57e7e33f577c5f7c45a3d4a8f91.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3accd57e7e33f577c5f7c45a3d4a8f91.png new file mode 100644 index 0000000000000000000000000000000000000000..c1a69ae8bb51c1a5d10147fbb6b4d1f7e013e506 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3accd57e7e33f577c5f7c45a3d4a8f91.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3bc81998f19f9368747e726d0933df54.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3bc81998f19f9368747e726d0933df54.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..95976210d53153fc4fad8dc9ec82075656f03d42 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3bc81998f19f9368747e726d0933df54.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3bfb7b34622ce6def1477e0450d53cda.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3bfb7b34622ce6def1477e0450d53cda.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6d0bbc0a3c9ce58c71b02b61ec6501c1b675b2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3bfb7b34622ce6def1477e0450d53cda.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3d41a9fa3c57448ade0a0aa5d77c5d11.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3d41a9fa3c57448ade0a0aa5d77c5d11.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..8cdef4498d20c6c42b5565a58c383336e2f6feb9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3d41a9fa3c57448ade0a0aa5d77c5d11.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3dc411c95c06ed52e23c0305771a79d6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3dc411c95c06ed52e23c0305771a79d6.png new file mode 100644 index 0000000000000000000000000000000000000000..188dbb354caddb014d496b2dcf20192059ca338e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/3dc411c95c06ed52e23c0305771a79d6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4045101a0caffd543b973447ef2d641e.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4045101a0caffd543b973447ef2d641e.png new file mode 100644 index 0000000000000000000000000000000000000000..8258874e13ce4c2120c71a5012150ce25cd47ec4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4045101a0caffd543b973447ef2d641e.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/422e413c17e49c594384849f320fa19c.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/422e413c17e49c594384849f320fa19c.png new file mode 100644 index 0000000000000000000000000000000000000000..481ffc0a2a1f4cef18d236962c17efffdf910c9b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/422e413c17e49c594384849f320fa19c.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/442f1ef3062c20c710190fc73216a378.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/442f1ef3062c20c710190fc73216a378.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..9c9f21e00f1620ae7fef5d63d52a550bfde04319 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/442f1ef3062c20c710190fc73216a378.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/44547ec317d6ec1e0f8983b9bc5ed438.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/44547ec317d6ec1e0f8983b9bc5ed438.png new file mode 100644 index 0000000000000000000000000000000000000000..97dd6a328496db34c6772047abfd83ff926fca5b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/44547ec317d6ec1e0f8983b9bc5ed438.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/44e44e99a1c8841a2f28defacfbbe2aa.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/44e44e99a1c8841a2f28defacfbbe2aa.png new file mode 100644 index 0000000000000000000000000000000000000000..149e1fe6698795afaa5bc782a400eea8abe9f506 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/44e44e99a1c8841a2f28defacfbbe2aa.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/455bce4a3126e8cff4e584baae2cb0ad.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/455bce4a3126e8cff4e584baae2cb0ad.png new file mode 100644 index 0000000000000000000000000000000000000000..90e2e1df1798ff85dff74b9e6a5b6a644cb55713 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/455bce4a3126e8cff4e584baae2cb0ad.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/459d89302584096fec9367ee5c5ca2f0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/459d89302584096fec9367ee5c5ca2f0.png new file mode 100644 index 0000000000000000000000000000000000000000..4dd4e34dbb98afd53095ecc44fa31a5840f80b33 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/459d89302584096fec9367ee5c5ca2f0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/45d81c9359c5a3cf8473fe8ca950d677.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/45d81c9359c5a3cf8473fe8ca950d677.png new file mode 100644 index 0000000000000000000000000000000000000000..4b78a3786175f5825fe9d60e06cde7acf279f32f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/45d81c9359c5a3cf8473fe8ca950d677.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/45ebd573941c2410432a55a0a14c83a9.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/45ebd573941c2410432a55a0a14c83a9.png new file mode 100644 index 0000000000000000000000000000000000000000..5461b0eb78ffc86ff20b2254db54df8074691381 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/45ebd573941c2410432a55a0a14c83a9.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/470a415caa9f23e77411bc58ca9cf445.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/470a415caa9f23e77411bc58ca9cf445.png new file mode 100644 index 0000000000000000000000000000000000000000..0d265eeab49f5691496d3815562553e10407c26d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/470a415caa9f23e77411bc58ca9cf445.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4769dd41945b5bd11449f1603cf3d037.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4769dd41945b5bd11449f1603cf3d037.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..19710349f94c2ddcadaea561d104c0f0ad28f3cb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4769dd41945b5bd11449f1603cf3d037.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/48046e669bb952fc83938842fddd79f5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/48046e669bb952fc83938842fddd79f5.png new file mode 100644 index 0000000000000000000000000000000000000000..88c46096ce6d033b2384d1447a7dbdc20474923c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/48046e669bb952fc83938842fddd79f5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/482c8190a84bd1c78da9b709182653e3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/482c8190a84bd1c78da9b709182653e3.png new file mode 100644 index 0000000000000000000000000000000000000000..21377bd180562a44cb098f7e1a12e1ad15021104 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/482c8190a84bd1c78da9b709182653e3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/488bee3e02e91cef7af5da244fcfc615.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/488bee3e02e91cef7af5da244fcfc615.png new file mode 100644 index 0000000000000000000000000000000000000000..69c2982037340be4970877263e326bbd20f1582a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/488bee3e02e91cef7af5da244fcfc615.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/495b2bee3da03739167ea96a72aeb88d.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/495b2bee3da03739167ea96a72aeb88d.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..7f464191db1710bfd09a68e294b6d1c8225f8a59 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/495b2bee3da03739167ea96a72aeb88d.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4b41ec9e5339414f9001231213465899.gif b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4b41ec9e5339414f9001231213465899.gif new file mode 100644 index 0000000000000000000000000000000000000000..44a9d7d1a6e80de3ff90e9bc4dc9f1afbdd54b6e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4b41ec9e5339414f9001231213465899.gif differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4bf807a21f34f425b4ae9bccdd9dcd42.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4bf807a21f34f425b4ae9bccdd9dcd42.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..c7ff2391e4de47e629b60f01db5b7e8cd15bc25c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4bf807a21f34f425b4ae9bccdd9dcd42.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4d4b3f0c53ad8d51fb370917a8f2b32d.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4d4b3f0c53ad8d51fb370917a8f2b32d.png new file mode 100644 index 0000000000000000000000000000000000000000..1ecd79e0badcd243c72d882e564542e1bc8b3343 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4d4b3f0c53ad8d51fb370917a8f2b32d.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4ed9143a87a4c9d5a52b5d23f7ca5c77.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4ed9143a87a4c9d5a52b5d23f7ca5c77.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..efea396388118998e50ade36b86c024d75e6e1c8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/4ed9143a87a4c9d5a52b5d23f7ca5c77.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/50501cbc12d258403d01f9f4be91e07e.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/50501cbc12d258403d01f9f4be91e07e.png new file mode 100644 index 0000000000000000000000000000000000000000..c80b0ce6de816a10e413d12e1af18d6d169d75e6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/50501cbc12d258403d01f9f4be91e07e.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5087e03577337f74f6747d0992ec07b9.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5087e03577337f74f6747d0992ec07b9.png new file mode 100644 index 0000000000000000000000000000000000000000..5cd7e37d9ce0e89562a404e1fd02dba6cae21c8d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5087e03577337f74f6747d0992ec07b9.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/50d4d78b3c125d87ab15f0796343b1f0.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/50d4d78b3c125d87ab15f0796343b1f0.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..2ddd586c5ead192a4428cc35e913d704c16fcc55 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/50d4d78b3c125d87ab15f0796343b1f0.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/52dee79b2627ba7119808b6a371421ca.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/52dee79b2627ba7119808b6a371421ca.png new file mode 100644 index 0000000000000000000000000000000000000000..513eb9f4dfc7d4130df4fe025e1a2c45951b3adc Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/52dee79b2627ba7119808b6a371421ca.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/537f3ed816186e4cfbdeed020e322a79.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/537f3ed816186e4cfbdeed020e322a79.png new file mode 100644 index 0000000000000000000000000000000000000000..d9a580d8e85e2fa241bb9644d169e255739a61e9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/537f3ed816186e4cfbdeed020e322a79.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/539e8434d8b76713f1b4dbe6b4e04727.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/539e8434d8b76713f1b4dbe6b4e04727.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..33ae176e169829310ddac0a8279ff20185a31f94 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/539e8434d8b76713f1b4dbe6b4e04727.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/53a8af02b2fdbe95c1a6f288c21a576b.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/53a8af02b2fdbe95c1a6f288c21a576b.png new file mode 100644 index 0000000000000000000000000000000000000000..78e31a7e00789631724b3a9a66fc0c43b234bbf0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/53a8af02b2fdbe95c1a6f288c21a576b.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/56af33d1e6a7a9be879b1dfb7de65a14.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/56af33d1e6a7a9be879b1dfb7de65a14.png new file mode 100644 index 0000000000000000000000000000000000000000..d63b88f80382b45379820a4dc1ccb532847dc8c4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/56af33d1e6a7a9be879b1dfb7de65a14.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/56e76bde70ce1667af34ffcd88ad798a.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/56e76bde70ce1667af34ffcd88ad798a.png new file mode 100644 index 0000000000000000000000000000000000000000..db0de1497f2f1502d020d801b244a15e41ba4a9e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/56e76bde70ce1667af34ffcd88ad798a.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5883a44c1f7939487c3d34785be741d2.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5883a44c1f7939487c3d34785be741d2.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..e75a64847e1e3fb0bc853d80bd7a22a62b602b47 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5883a44c1f7939487c3d34785be741d2.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/59c2ff89ebfa9399929ba962c4cb187d.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/59c2ff89ebfa9399929ba962c4cb187d.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..51a661b99a4d2e66c4fd6ecd5e6433fc2962dbd9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/59c2ff89ebfa9399929ba962c4cb187d.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5a65dedfd57d652b56af450f161fdf73.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5a65dedfd57d652b56af450f161fdf73.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b90f94d512fc8e7ee008359e6c9f69afe1dd416 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5a65dedfd57d652b56af450f161fdf73.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5b30c90856e2424e76530f657e8018f3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5b30c90856e2424e76530f657e8018f3.png new file mode 100644 index 0000000000000000000000000000000000000000..9f494c3d388e7b07a18fd9aa658a1ff714407d4a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5b30c90856e2424e76530f657e8018f3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5cbcae59f8d8284d4e4541acd0f2be76.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5cbcae59f8d8284d4e4541acd0f2be76.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..84e93f1b3c8fb7474b0e848d990b9997552eb6d9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5cbcae59f8d8284d4e4541acd0f2be76.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5d9d4cd9f38da98ad09a15c585c4e047.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5d9d4cd9f38da98ad09a15c585c4e047.png new file mode 100644 index 0000000000000000000000000000000000000000..65875074abdf3f0a8a56cae8545499c3d655cff0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5d9d4cd9f38da98ad09a15c585c4e047.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5ee46cf9b1a5bfff195fe2cc53565055.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5ee46cf9b1a5bfff195fe2cc53565055.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..f51613939c7c55b9a2290a46b3921522705bea25 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/5ee46cf9b1a5bfff195fe2cc53565055.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/60af2b499fe545965de12fefd8a84366.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/60af2b499fe545965de12fefd8a84366.png new file mode 100644 index 0000000000000000000000000000000000000000..a9add5bc32473470c1760076a5b777c4fd9407a5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/60af2b499fe545965de12fefd8a84366.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6214a67be9c5284678d6486ed1c09732.gif b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6214a67be9c5284678d6486ed1c09732.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b4260bff48a7188f3f4b80f44277f0647b20449 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6214a67be9c5284678d6486ed1c09732.gif differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/64873c8c1f363743230d6797a1ef6ab8.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/64873c8c1f363743230d6797a1ef6ab8.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..a65020c51160ed655f48f02aeedf5de669821986 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/64873c8c1f363743230d6797a1ef6ab8.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/64f468fbf7b21279f2d577f0b237a63f.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/64f468fbf7b21279f2d577f0b237a63f.png new file mode 100644 index 0000000000000000000000000000000000000000..da8f0639394da83bf6ba73b9bcd694f78dd3cd97 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/64f468fbf7b21279f2d577f0b237a63f.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/67019fb82dfd3481e5c7b7264a0681a0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/67019fb82dfd3481e5c7b7264a0681a0.png new file mode 100644 index 0000000000000000000000000000000000000000..2c2924797698c045e34df91dedc0bbf1bc91a00b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/67019fb82dfd3481e5c7b7264a0681a0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6a2f4ab12967ce210f741ff1f9fef225.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6a2f4ab12967ce210f741ff1f9fef225.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..de8e33d20e3467325bfb1cb48c4d7d6cb22948d0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6a2f4ab12967ce210f741ff1f9fef225.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6aaf8ce2eeb7075feb152b3d35862ee8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6aaf8ce2eeb7075feb152b3d35862ee8.png new file mode 100644 index 0000000000000000000000000000000000000000..80c5fe30fcc22f2fcba35a0e6d832e04d3c3086a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6aaf8ce2eeb7075feb152b3d35862ee8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6b7436db731ea0c3d6325449e147601b.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6b7436db731ea0c3d6325449e147601b.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..1e4be2f7fd6140ada0ca00b36ffa3059deab829d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6b7436db731ea0c3d6325449e147601b.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6bff6eacd79d147380e717e3d4876d72.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6bff6eacd79d147380e717e3d4876d72.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e109fb361e80de5048446470794531ff071a31dc Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6bff6eacd79d147380e717e3d4876d72.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6c0adad1b129e031efd2fec1b5119681.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6c0adad1b129e031efd2fec1b5119681.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ace104a09756a50ed147fd7800da39d4846c76 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6c0adad1b129e031efd2fec1b5119681.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6c71b7d9c0c8f9872455f4ab9e40fd05.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6c71b7d9c0c8f9872455f4ab9e40fd05.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..bb27a1738d6127c75c9c0c596d96bf6e3ef9dd6a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6c71b7d9c0c8f9872455f4ab9e40fd05.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6cbf54b2a8c047d623296d85bb9cb8a3.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6cbf54b2a8c047d623296d85bb9cb8a3.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..2a2d85430e5e388ff623da0a0520ac75eecd7db6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6cbf54b2a8c047d623296d85bb9cb8a3.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6d07ca7e31b3d94cfb432a9e0bcb002f.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6d07ca7e31b3d94cfb432a9e0bcb002f.png new file mode 100644 index 0000000000000000000000000000000000000000..5a794146e012727625040c17c558face243ba5f2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6d07ca7e31b3d94cfb432a9e0bcb002f.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6dd25ff4728dab976ddb607fd89fb158.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6dd25ff4728dab976ddb607fd89fb158.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..8c106a325cb5eb9c733eb53398a2077184d02241 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6dd25ff4728dab976ddb607fd89fb158.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6e2e32985afcb217429d53d9452915d7.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6e2e32985afcb217429d53d9452915d7.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..32fa3ab35c580a4b69adb3f6633ab81bf2ed3c0c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6e2e32985afcb217429d53d9452915d7.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6e33daff6dc5e441073953fcd5753b8b.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6e33daff6dc5e441073953fcd5753b8b.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..742b77c019cfb6983b9ea575347291b859ccac55 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6e33daff6dc5e441073953fcd5753b8b.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6ee20d1047449b46db3f1d03e487d528.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6ee20d1047449b46db3f1d03e487d528.png new file mode 100644 index 0000000000000000000000000000000000000000..6f81e6deb312e25ac74d9d6ecf92dfdbc3473209 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/6ee20d1047449b46db3f1d03e487d528.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/70152c854c0e5ea271f2e857424ae6e9.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/70152c854c0e5ea271f2e857424ae6e9.png new file mode 100644 index 0000000000000000000000000000000000000000..2713a09a0ec4b1c57ce445ede1967ff9e6ea053b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/70152c854c0e5ea271f2e857424ae6e9.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/707c0f628112a151ae111aea53f9d3c8.gif b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/707c0f628112a151ae111aea53f9d3c8.gif new file mode 100644 index 0000000000000000000000000000000000000000..a7fcdc9e847dd8af1839ce87e6bc0301a822f0f6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/707c0f628112a151ae111aea53f9d3c8.gif differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/72212169e5d905bdd69c5db2f6488544.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/72212169e5d905bdd69c5db2f6488544.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe673b0f2e2ceed6d4ef3858b395d5467574780 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/72212169e5d905bdd69c5db2f6488544.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/72dcedb0c6c713147433a2fccfb9ef6c.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/72dcedb0c6c713147433a2fccfb9ef6c.png new file mode 100644 index 0000000000000000000000000000000000000000..62543359193da9a07b26871575b9884249c1e901 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/72dcedb0c6c713147433a2fccfb9ef6c.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/771c01b91ac8d2728ea51466ebead345.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/771c01b91ac8d2728ea51466ebead345.png new file mode 100644 index 0000000000000000000000000000000000000000..25fa0061feabbbb790e41e9471ca0215f6af2361 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/771c01b91ac8d2728ea51466ebead345.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/7917ecb6def15896c8ce88f7c4b1aad2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/7917ecb6def15896c8ce88f7c4b1aad2.png new file mode 100644 index 0000000000000000000000000000000000000000..09a842e62cabae6eea35474c3c4d23161553148d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/7917ecb6def15896c8ce88f7c4b1aad2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/79f91f9df25289f2d0e39a99b16e45ff.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/79f91f9df25289f2d0e39a99b16e45ff.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..891241f9f441d64ffd013445dedad21dddbf6350 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/79f91f9df25289f2d0e39a99b16e45ff.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/7aaacf775085293092d90a7f490678d7.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/7aaacf775085293092d90a7f490678d7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..166aa082a296a87d61e975a50ffc37bd6ac4308a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/7aaacf775085293092d90a7f490678d7.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/7fc5d935c21266dbbedf332713faa96b.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/7fc5d935c21266dbbedf332713faa96b.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..8e3975ad502030b25bc3553dc7afaab048eb67e7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/7fc5d935c21266dbbedf332713faa96b.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/7fd071f2b4cfe955b245fd053b8f1365.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/7fd071f2b4cfe955b245fd053b8f1365.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb477e58dabfdb54cd011e278773db22a774cc3 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/7fd071f2b4cfe955b245fd053b8f1365.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/80d2efed3f88aa75fd44818988e42b46.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/80d2efed3f88aa75fd44818988e42b46.png new file mode 100644 index 0000000000000000000000000000000000000000..062c5847b53e2fd0cdc398646519fba9a202ab4f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/80d2efed3f88aa75fd44818988e42b46.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/814ec4cbc70efab3b0a8e5a2b4626b37.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/814ec4cbc70efab3b0a8e5a2b4626b37.png new file mode 100644 index 0000000000000000000000000000000000000000..da0de4e7247e1e44a0c47e33a5b593d34148a9d6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/814ec4cbc70efab3b0a8e5a2b4626b37.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/81b1d61cf20e64a55773ff4cd3644867.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/81b1d61cf20e64a55773ff4cd3644867.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..43a7def50400253a224d22acba355713ab465029 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/81b1d61cf20e64a55773ff4cd3644867.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/81db0a38cb64d05b9984f5d77b5de003.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/81db0a38cb64d05b9984f5d77b5de003.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..1bc13fc6db129951caad4c0b606c50734ffa6207 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/81db0a38cb64d05b9984f5d77b5de003.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8595c13392b223b682be2f5ee62960e9.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8595c13392b223b682be2f5ee62960e9.png new file mode 100644 index 0000000000000000000000000000000000000000..37fcbb7846494a3f4ecb3ee9be29f2a38f07e998 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8595c13392b223b682be2f5ee62960e9.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/85ae3b8de73fb03ebcccf99c0761bb19.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/85ae3b8de73fb03ebcccf99c0761bb19.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..9c5c945ed411efb1239ebecc2cdb2af94735f0ca Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/85ae3b8de73fb03ebcccf99c0761bb19.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/85bdb066fdc885bad4653881ab6cffc6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/85bdb066fdc885bad4653881ab6cffc6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..8089ad8cc1e97d1a9a0aee6d014fc675add6b697 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/85bdb066fdc885bad4653881ab6cffc6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/86b60df9aea75b4078160feb2b0b10e6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/86b60df9aea75b4078160feb2b0b10e6.png new file mode 100644 index 0000000000000000000000000000000000000000..2b93ca61c7a4447874cf3d94a9bc0900eeb506f8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/86b60df9aea75b4078160feb2b0b10e6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/86ca75b4c921b2892211002bc48d82fc.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/86ca75b4c921b2892211002bc48d82fc.png new file mode 100644 index 0000000000000000000000000000000000000000..f53448ea40bc74f426f825c567c4ddf549041b93 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/86ca75b4c921b2892211002bc48d82fc.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8b25532961abd17209ee2eee1ae9ae96.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8b25532961abd17209ee2eee1ae9ae96.png new file mode 100644 index 0000000000000000000000000000000000000000..d2b7795d658d57345281b60e278938b0890c2ed2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8b25532961abd17209ee2eee1ae9ae96.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8bfdc1c411e8b2fe2c1e8569ef6fbfd0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8bfdc1c411e8b2fe2c1e8569ef6fbfd0.png new file mode 100644 index 0000000000000000000000000000000000000000..7423d5a8e290b5c03b8506215ffb95d217b679ac Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8bfdc1c411e8b2fe2c1e8569ef6fbfd0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8cadf6b1d3d3ea9bf385fce20b66c525.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8cadf6b1d3d3ea9bf385fce20b66c525.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..d9a2ce831d51a140b520c6e709b76e557adb47e5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8cadf6b1d3d3ea9bf385fce20b66c525.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8d5920d3f58479542b8b84219e2005d0.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8d5920d3f58479542b8b84219e2005d0.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..ee93cb26ae6c53e5d516a548046d2d286ee989b0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8d5920d3f58479542b8b84219e2005d0.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8eee1322b5a984769b151f959614a278.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8eee1322b5a984769b151f959614a278.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..82f7a9c7732427d69c83c028d2737cc469b40e26 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8eee1322b5a984769b151f959614a278.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8fd7ed51234ef6b945989d4eccd91736.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8fd7ed51234ef6b945989d4eccd91736.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..da7230b4cfd30bdac0860b7bf103ec85ae9181e2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/8fd7ed51234ef6b945989d4eccd91736.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/907b955a3632471094732a4f0d87e6a4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/907b955a3632471094732a4f0d87e6a4.png new file mode 100644 index 0000000000000000000000000000000000000000..298f6b195e184f734b3338afda7708f0b942d515 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/907b955a3632471094732a4f0d87e6a4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/90a45c8d3b8837e26e0f04548d54f00f.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/90a45c8d3b8837e26e0f04548d54f00f.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..5815e4874de230307b8b8fe9b5761a4165712a25 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/90a45c8d3b8837e26e0f04548d54f00f.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/91e2141bbc00f9fdaa332a1c3c57c0a9.gif b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/91e2141bbc00f9fdaa332a1c3c57c0a9.gif new file mode 100644 index 0000000000000000000000000000000000000000..d447132a6d1741675a958a0613ae7503b48ba8a2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/91e2141bbc00f9fdaa332a1c3c57c0a9.gif differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9272407b9abed443b0a583047f324b72.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9272407b9abed443b0a583047f324b72.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..0c5c31895dff10f6d6232cbdcf600aa3e7caa898 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9272407b9abed443b0a583047f324b72.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/92f3291aad7143d0ce4e9b41a98c0ebf.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/92f3291aad7143d0ce4e9b41a98c0ebf.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..e9c16de5396dc2935a51a4e46f2a70b2bfeb56d0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/92f3291aad7143d0ce4e9b41a98c0ebf.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/933fc5d40be54289c1afba65f06951ea.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/933fc5d40be54289c1afba65f06951ea.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..cdedc1db9656af0515031778a63f036d193aef01 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/933fc5d40be54289c1afba65f06951ea.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/94774108c0b4e229456af6aca0c70415.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/94774108c0b4e229456af6aca0c70415.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2f8c8870a8988ef07e5178866410168a73aa98 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/94774108c0b4e229456af6aca0c70415.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9598fc4fa59d8d85d32ff55412b863b5.gif b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9598fc4fa59d8d85d32ff55412b863b5.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd84ee2e01be89423e5b3db680980e05a462d703 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9598fc4fa59d8d85d32ff55412b863b5.gif differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9682111b8a414deb3ef4be96afedaf12-171523855621017.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9682111b8a414deb3ef4be96afedaf12-171523855621017.png new file mode 100644 index 0000000000000000000000000000000000000000..f3042a0bb889b6f96c2f5f24a764073d688ece14 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9682111b8a414deb3ef4be96afedaf12-171523855621017.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9682111b8a414deb3ef4be96afedaf12.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9682111b8a414deb3ef4be96afedaf12.png new file mode 100644 index 0000000000000000000000000000000000000000..f3042a0bb889b6f96c2f5f24a764073d688ece14 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9682111b8a414deb3ef4be96afedaf12.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/98b320359c6c35885410bbfb17f7f6af.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/98b320359c6c35885410bbfb17f7f6af.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..6ba8ff48dfc35a5b4d3d3e47602c8f32bc81d98e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/98b320359c6c35885410bbfb17f7f6af.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9951a8ce39712f9f2fa388f60131a5ee.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9951a8ce39712f9f2fa388f60131a5ee.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..fa5189e2f23e377f5838ba0cb122679c5f56b0aa Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9951a8ce39712f9f2fa388f60131a5ee.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9a33097717cdc3ce3db14b394ddd575f.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9a33097717cdc3ce3db14b394ddd575f.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..bc0ed224f32ee670f8aadc35357f306250f2fcac Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9a33097717cdc3ce3db14b394ddd575f.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9a6f7c6b890eb74b8cbd4bb130b73c25.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9a6f7c6b890eb74b8cbd4bb130b73c25.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..eae8a343c38982233412e976aa80305a1c67c5d6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9a6f7c6b890eb74b8cbd4bb130b73c25.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9bfd0b71b1764ccd4a81c7bb52ed2655.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9bfd0b71b1764ccd4a81c7bb52ed2655.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..dab34ada5531d9ead8486739c11711f60fb477e7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9bfd0b71b1764ccd4a81c7bb52ed2655.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9d666abb5ea7161e84de309602c50099.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9d666abb5ea7161e84de309602c50099.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..cdecfe4ac67a701ba73151837f0528a96ff2581f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/9d666abb5ea7161e84de309602c50099.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAcEvmn8HzpGdZc9QFuWBgdi.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAcEvmn8HzpGdZc9QFuWBgdi.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ecbea6d3b3a286256b3149f22c0288cb9929c2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAcEvmn8HzpGdZc9QFuWBgdi.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAcYXs6svDFOzZzvbS15wauH.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAcYXs6svDFOzZzvbS15wauH.png new file mode 100644 index 0000000000000000000000000000000000000000..a90c14cbfe976acc991f25dc525ae78ba667f25c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAcYXs6svDFOzZzvbS15wauH.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAdFxutaiqBM25LbiaRS1GHW.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAdFxutaiqBM25LbiaRS1GHW.png new file mode 100644 index 0000000000000000000000000000000000000000..65dfddc750695a4aaa945e4de679ebd9eca08878 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAdFxutaiqBM25LbiaRS1GHW.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAep_e0euDBOUI8SIc6EP1Yy.gif b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAep_e0euDBOUI8SIc6EP1Yy.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ea49b45c1b8d663de015ded807327154a6303e5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAep_e0euDBOUI8SIc6EP1Yy.gif differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAfH9B0a7sRNOZVUVsVMTCFS.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAfH9B0a7sRNOZVUVsVMTCFS.png new file mode 100644 index 0000000000000000000000000000000000000000..fce5daeb454ee3716ebc57ae388719f6b8b809ac Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAfH9B0a7sRNOZVUVsVMTCFS.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAfqDW1xJmtF-Ji8ppm58lN7.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAfqDW1xJmtF-Ji8ppm58lN7.png new file mode 100644 index 0000000000000000000000000000000000000000..0eba29e5f5e36a7c61aba44b655f60d4dc201271 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/AgAABnNowAfqDW1xJmtF-Ji8ppm58lN7.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a066902c4f30f09fb42055fe3323477f.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a066902c4f30f09fb42055fe3323477f.png new file mode 100644 index 0000000000000000000000000000000000000000..c6203a3e00639ec9c5c00c183e72095b7f895a4a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a066902c4f30f09fb42055fe3323477f.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a18910fc086cf3e55c9fc5d93906feb6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a18910fc086cf3e55c9fc5d93906feb6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..d91f5855079a1f60f1513741028c30d3f7088505 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a18910fc086cf3e55c9fc5d93906feb6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a46d04e6cc33a99d93ef35ce3e8051d5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a46d04e6cc33a99d93ef35ce3e8051d5.png new file mode 100644 index 0000000000000000000000000000000000000000..87582998aafe4459383d349d01e2bb08a2eea297 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a46d04e6cc33a99d93ef35ce3e8051d5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a556807d09de95c6c5e616c1bb6bd060.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a556807d09de95c6c5e616c1bb6bd060.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..65a5078b76e9472b614042d00557f1322dc520a2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a556807d09de95c6c5e616c1bb6bd060.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a87194a8ed35beafc8d9b5b0c4eec888.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a87194a8ed35beafc8d9b5b0c4eec888.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..11bd349af353cced3cc2be52d9e07432a53ecc1e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/a87194a8ed35beafc8d9b5b0c4eec888.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/abb00720dfe52ce44164582ece18483d.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/abb00720dfe52ce44164582ece18483d.png new file mode 100644 index 0000000000000000000000000000000000000000..cda0b160b933386c8771de5bf878d1c7ef133e58 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/abb00720dfe52ce44164582ece18483d.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ac0cc0a33054c1f42ea7793983363a76.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ac0cc0a33054c1f42ea7793983363a76.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..99fba8f1eea1e243b575236a57b09917a674c095 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ac0cc0a33054c1f42ea7793983363a76.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ad54cc1ea50b101a627e2f282851b181.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ad54cc1ea50b101a627e2f282851b181.png new file mode 100644 index 0000000000000000000000000000000000000000..fe866780258b3fba30ee309ec125592ef9901016 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ad54cc1ea50b101a627e2f282851b181.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/aedf4bfcfa7e8bdf1b54cfdfac8be884.png-171524958094093.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/aedf4bfcfa7e8bdf1b54cfdfac8be884.png-171524958094093.webp new file mode 100644 index 0000000000000000000000000000000000000000..6cb3312368bc52e850f984f9d7ee29643e26cd4d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/aedf4bfcfa7e8bdf1b54cfdfac8be884.png-171524958094093.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/aedf4bfcfa7e8bdf1b54cfdfac8be884.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/aedf4bfcfa7e8bdf1b54cfdfac8be884.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..6cb3312368bc52e850f984f9d7ee29643e26cd4d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/aedf4bfcfa7e8bdf1b54cfdfac8be884.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/af723325c813439a48cd524ae375ed6e.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/af723325c813439a48cd524ae375ed6e.png new file mode 100644 index 0000000000000000000000000000000000000000..17d1baf0c142896546e5b7b7d95ccd5014d6aa65 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/af723325c813439a48cd524ae375ed6e.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b3482634df549c911fcec6023824d8a5.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b3482634df549c911fcec6023824d8a5.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..de0408f47e869c26644c3beac9915c401f555d4e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b3482634df549c911fcec6023824d8a5.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b376d1e5fe5cf2d139561319a9c450b1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b376d1e5fe5cf2d139561319a9c450b1.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8a02f43ddc30758a8b664e7d58621f6c3e594f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b376d1e5fe5cf2d139561319a9c450b1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b3d6b59d47659117cf3a1e7e75e560fa.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b3d6b59d47659117cf3a1e7e75e560fa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6be2a9d2df14ffa3dec04ab4701b3bd8749f425c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b3d6b59d47659117cf3a1e7e75e560fa.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b467841d28f66f8b6a279fe0ee672de7.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b467841d28f66f8b6a279fe0ee672de7.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..868eaacb385f947d8dae505de29f97df7963451e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b467841d28f66f8b6a279fe0ee672de7.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b54f737244f418f22ffdb662d9b1aa81.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b54f737244f418f22ffdb662d9b1aa81.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..7dcaa0ea1ead85b468cf4a3faaafade735bec05c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b54f737244f418f22ffdb662d9b1aa81.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b6957bd4ce7985518f72d318f615c810.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b6957bd4ce7985518f72d318f615c810.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4438403c86fcfea39d757a7b10209aad7c57ee5d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b6957bd4ce7985518f72d318f615c810.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b6fccdaf6a77aca1c240dd2d97d04fa9.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b6fccdaf6a77aca1c240dd2d97d04fa9.png new file mode 100644 index 0000000000000000000000000000000000000000..4a88075744ffb0092789069860d28cdeed1ff8e1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b6fccdaf6a77aca1c240dd2d97d04fa9.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b8fbb3c46be855a58f4ba5f60916323a.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b8fbb3c46be855a58f4ba5f60916323a.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..522b45bf8aafc060af75fbfc9f3ba27c52945faa Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/b8fbb3c46be855a58f4ba5f60916323a.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bc023a625fcd17727c1c238395835877.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bc023a625fcd17727c1c238395835877.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..5c5afc947f6a697893bf7b7f4584cba67ab31390 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bc023a625fcd17727c1c238395835877.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bcc8616c3716b6ab7ec6d25b9dd20337.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bcc8616c3716b6ab7ec6d25b9dd20337.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..09019b112a0bfd5e7a7ab71ab5b7880d5d23ed9b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bcc8616c3716b6ab7ec6d25b9dd20337.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bd2a7ece7970ab10eb03c7cec300dba6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bd2a7ece7970ab10eb03c7cec300dba6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..54f7ddfb1521eb5e764ee1f9b48ff1acf3abf8f8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bd2a7ece7970ab10eb03c7cec300dba6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bd9be6f3d2249cd15d609db8b9431464.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bd9be6f3d2249cd15d609db8b9431464.png new file mode 100644 index 0000000000000000000000000000000000000000..7b71e0f9f37f0e055492def96fa87232c7287190 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bd9be6f3d2249cd15d609db8b9431464.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bdb3c76ce1d367402c47d20df3f6fa5f.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bdb3c76ce1d367402c47d20df3f6fa5f.png new file mode 100644 index 0000000000000000000000000000000000000000..bd4a3702210fca9c47bcc50bb7769e35de2a04a8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bdb3c76ce1d367402c47d20df3f6fa5f.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bdf5d18d4219fcc9398dad8c39649d0a.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bdf5d18d4219fcc9398dad8c39649d0a.png new file mode 100644 index 0000000000000000000000000000000000000000..09a0c80d55c6728c4fa1a94f8a485324be392f2a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bdf5d18d4219fcc9398dad8c39649d0a.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/be20544f145d826935b6f241422dee92.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/be20544f145d826935b6f241422dee92.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..975077171bae60cfd5027e962fefa9af29f8e091 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/be20544f145d826935b6f241422dee92.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bf1b7a563279da07786928ba73810f17.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bf1b7a563279da07786928ba73810f17.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..7eda9132d05f5216ab3ff765089c8ac679be4597 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/bf1b7a563279da07786928ba73810f17.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c020116a65e5905e8716ef026423223a.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c020116a65e5905e8716ef026423223a.png new file mode 100644 index 0000000000000000000000000000000000000000..4e07c899a0c5d1d34d307285f85f59704b9ca34f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c020116a65e5905e8716ef026423223a.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c41be9ec5455cd50b36615ef7356f7a6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c41be9ec5455cd50b36615ef7356f7a6.png new file mode 100644 index 0000000000000000000000000000000000000000..672b91379c65d2629432f185b72706efc94bcccd Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c41be9ec5455cd50b36615ef7356f7a6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c4cea4a3411db312eea22e8b4256f1cc.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c4cea4a3411db312eea22e8b4256f1cc.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..52a654b3d48fc8423175b9faaee0aaa3b023fa8c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c4cea4a3411db312eea22e8b4256f1cc.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c55a6c10ce83387ae9a8c315b5db7157.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c55a6c10ce83387ae9a8c315b5db7157.png new file mode 100644 index 0000000000000000000000000000000000000000..9c5c4a7675f21ad70fc3b77f60b36eb15b561ccb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c55a6c10ce83387ae9a8c315b5db7157.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c601c666d809bf5deb37e6fe7a3af83e.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c601c666d809bf5deb37e6fe7a3af83e.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7c157aefbda8d829e0cc758d3ae5acafa5f177 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c601c666d809bf5deb37e6fe7a3af83e.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c890da27b81c3facf1f4b8f3e84238ae.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c890da27b81c3facf1f4b8f3e84238ae.png new file mode 100644 index 0000000000000000000000000000000000000000..c1c5be161786de5d642abf6ee56978f2eb13124d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c890da27b81c3facf1f4b8f3e84238ae.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c943eb7be02edb25ac332e4f741ed8f0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c943eb7be02edb25ac332e4f741ed8f0.png new file mode 100644 index 0000000000000000000000000000000000000000..aecbe648fba9453fcd67d9e745d4014e1c4781ef Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/c943eb7be02edb25ac332e4f741ed8f0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/cc6cf5b66dad1248c7e8525ff3a877e6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/cc6cf5b66dad1248c7e8525ff3a877e6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..624db24f97cc26573d3521d4b1bb2a08927fdb78 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/cc6cf5b66dad1248c7e8525ff3a877e6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ccf397cf13b44c68a8572e0ef16301e2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ccf397cf13b44c68a8572e0ef16301e2.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e59606e2016b52461a170eb1f4a84f9ef636f1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ccf397cf13b44c68a8572e0ef16301e2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/cdf64c79486ebab348d4d3a93ebb6777.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/cdf64c79486ebab348d4d3a93ebb6777.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..be9ef411954fb54e6ac10e1c04348213eb9034aa Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/cdf64c79486ebab348d4d3a93ebb6777.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ce25588cb1a7d2967da07b3f5a92fcdd.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ce25588cb1a7d2967da07b3f5a92fcdd.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..a3a069a0c7af8c5e6a068d1939bd0acec216ae37 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ce25588cb1a7d2967da07b3f5a92fcdd.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ce5b59913e8ba358f3c15eb8079fd2b0.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ce5b59913e8ba358f3c15eb8079fd2b0.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..781d0ee01cd7cfa70762cf49199c685ac34fcb1f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ce5b59913e8ba358f3c15eb8079fd2b0.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ce7718669cf93384060388b211c61f64.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ce7718669cf93384060388b211c61f64.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b4da3a7e48ed1ed5d0b554a6b1caf1c159117422 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ce7718669cf93384060388b211c61f64.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/cfba34a91afe507c9e8ccd0b83d78209.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/cfba34a91afe507c9e8ccd0b83d78209.png new file mode 100644 index 0000000000000000000000000000000000000000..8a8758f24a44a7a6ad8be0c0d9a5b52388fdb896 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/cfba34a91afe507c9e8ccd0b83d78209.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/cfd8879ed1fbc57257b423864431ae22.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/cfd8879ed1fbc57257b423864431ae22.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..17730d3f0d9bd9452373b56adf5820a11eecfa9a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/cfd8879ed1fbc57257b423864431ae22.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d2153619c42fa7a91b7333b639a1c4f6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d2153619c42fa7a91b7333b639a1c4f6.png new file mode 100644 index 0000000000000000000000000000000000000000..fad8d48e903f1a6dacf306b66bdcbcff1afececd Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d2153619c42fa7a91b7333b639a1c4f6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d29eb02b4f5c0534a7690c1a88799ef0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d29eb02b4f5c0534a7690c1a88799ef0.png new file mode 100644 index 0000000000000000000000000000000000000000..7f31892c97312e6bf9b48bf3bb551fd29b767e84 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d29eb02b4f5c0534a7690c1a88799ef0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d4cbc0db7019c3f16ba3a74783698a70.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d4cbc0db7019c3f16ba3a74783698a70.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4ddf59c500452ef9569015606f11a651e0194119 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d4cbc0db7019c3f16ba3a74783698a70.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d4eee48a3012ae68e384611d8d2f10e4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d4eee48a3012ae68e384611d8d2f10e4.png new file mode 100644 index 0000000000000000000000000000000000000000..700c08282b830305216fb89c39c15e453e65ac57 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d4eee48a3012ae68e384611d8d2f10e4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d56376686a1ba70e241bf1c9642aa114.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d56376686a1ba70e241bf1c9642aa114.png new file mode 100644 index 0000000000000000000000000000000000000000..e7996a4ab60615073819c759a55bedd6f080a08a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d56376686a1ba70e241bf1c9642aa114.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d693dc8925419cc68e127bbdab3b76b8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d693dc8925419cc68e127bbdab3b76b8.png new file mode 100644 index 0000000000000000000000000000000000000000..b8baf99b5aa315788c0abade249e64cb398575e0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d693dc8925419cc68e127bbdab3b76b8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d992712ff19e8fdc61ed370765e67f07.gif b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d992712ff19e8fdc61ed370765e67f07.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6415908abf8e562e09c482398587715e34e285d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/d992712ff19e8fdc61ed370765e67f07.gif differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/dc2f17223de001939a92dce5951d430d.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/dc2f17223de001939a92dce5951d430d.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..84a16f7f53b73223d2dcb9a0c8253c40ee316da7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/dc2f17223de001939a92dce5951d430d.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/df22b47a8a1609e6ae0bd17a0f0572ef.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/df22b47a8a1609e6ae0bd17a0f0572ef.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..c6314c6cbd173de4272904bf3db1c3481f7e2904 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/df22b47a8a1609e6ae0bd17a0f0572ef.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e106b7877e3b19fb1fe16e51200adb52.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e106b7877e3b19fb1fe16e51200adb52.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..9eb8888ae223104dc14c6ceddedb7ec89916c5a6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e106b7877e3b19fb1fe16e51200adb52.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e15325826ef83b0591ac3edddaf86628.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e15325826ef83b0591ac3edddaf86628.png new file mode 100644 index 0000000000000000000000000000000000000000..50b9c8fc43c95d590cc94aed76580db3a1055e61 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e15325826ef83b0591ac3edddaf86628.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e30ab7cbbf19b33420175ea11237cefe.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e30ab7cbbf19b33420175ea11237cefe.png new file mode 100644 index 0000000000000000000000000000000000000000..ce6a439ab43d43ace68f913f78042b8d707186d0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e30ab7cbbf19b33420175ea11237cefe.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e37dc2903f1bfe2992bb9cfd738d02b6.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e37dc2903f1bfe2992bb9cfd738d02b6.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..7993d0404293fe3087fb9599185ddfecbca31b72 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e37dc2903f1bfe2992bb9cfd738d02b6.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e43b9e3d402b6ecbea3d64a80432d7b0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e43b9e3d402b6ecbea3d64a80432d7b0.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b7f8802688ad61236c50a7069da49a16a30203 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e43b9e3d402b6ecbea3d64a80432d7b0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e45d924aa79d45f56bdcc946a354a3c0.gif b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e45d924aa79d45f56bdcc946a354a3c0.gif new file mode 100644 index 0000000000000000000000000000000000000000..f63abac3ce7514c9674ad58ef2b89dd255441b85 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e45d924aa79d45f56bdcc946a354a3c0.gif differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e552319cc0590b5c6879afa0d80e300b.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e552319cc0590b5c6879afa0d80e300b.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..8ee8ec3868499fa152e630ae263bc601c580645e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e552319cc0590b5c6879afa0d80e300b.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e5ea6f78bf2fcfdbd323538ec96c5e2e.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e5ea6f78bf2fcfdbd323538ec96c5e2e.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..eb3e2beaff87db1e4fc06c9efbaf96801c155272 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e5ea6f78bf2fcfdbd323538ec96c5e2e.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e9d38f294eb0593793e8adb8e1b09a5d.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e9d38f294eb0593793e8adb8e1b09a5d.png new file mode 100644 index 0000000000000000000000000000000000000000..7e0853dacc8bf1f95c80129938393d957e071efb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/e9d38f294eb0593793e8adb8e1b09a5d.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ea49d4689b0dea17dfc4fd3cc328da2e.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ea49d4689b0dea17dfc4fd3cc328da2e.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..fba7e4c269d3569a39c4597defb39f8a084e2933 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ea49d4689b0dea17dfc4fd3cc328da2e.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/eb403e9729bdfaf104c3a53a66c3999a.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/eb403e9729bdfaf104c3a53a66c3999a.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5aeafea04c2a8a21158369b80415c1465236b8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/eb403e9729bdfaf104c3a53a66c3999a.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ec8e9699c71c9c75f51edabc7a8eefdf.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ec8e9699c71c9c75f51edabc7a8eefdf.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf828f3667e21e2b0d64d3b602f746c8c82560b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ec8e9699c71c9c75f51edabc7a8eefdf.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ee3a4372d62672841ed3d137187527a9.png-171524803095463.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ee3a4372d62672841ed3d137187527a9.png-171524803095463.webp new file mode 100644 index 0000000000000000000000000000000000000000..cb3cd36d83b42fa56db48ec4e6e983734c01dc1b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ee3a4372d62672841ed3d137187527a9.png-171524803095463.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ee3a4372d62672841ed3d137187527a9.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ee3a4372d62672841ed3d137187527a9.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..cb3cd36d83b42fa56db48ec4e6e983734c01dc1b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/ee3a4372d62672841ed3d137187527a9.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/eed8b398b8362b8457e2c92899587a2c.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/eed8b398b8362b8457e2c92899587a2c.png new file mode 100644 index 0000000000000000000000000000000000000000..dddc4df375884a4fd6cc6a9ebae9586cdf47489b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/eed8b398b8362b8457e2c92899587a2c.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f029c397ad671e06b67e264e6deb5ac5.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f029c397ad671e06b67e264e6deb5ac5.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..fc3860e279ffb143dbb91fd679037e3031edb151 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f029c397ad671e06b67e264e6deb5ac5.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f1bbc1ab31c05d9a0d06a79c2b104285.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f1bbc1ab31c05d9a0d06a79c2b104285.png new file mode 100644 index 0000000000000000000000000000000000000000..ef8d4e5605f8bef2c831a5ada5eeaaf60f8f21b0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f1bbc1ab31c05d9a0d06a79c2b104285.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f2d04b19f50e09ad9b3b723e1a87eb57.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f2d04b19f50e09ad9b3b723e1a87eb57.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..ee2677e6c9bdc63afdf729ae1a8abb9b667900b3 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f2d04b19f50e09ad9b3b723e1a87eb57.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f4098e5940657153191019c220cec862.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f4098e5940657153191019c220cec862.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..37b73290ebcdfbfac18cbe5592cc1f765e069eeb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f4098e5940657153191019c220cec862.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f961049204c09a22604a0ffda3185ee4.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f961049204c09a22604a0ffda3185ee4.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..bfe5e0a623a3dc1d494bb12831800a3dcb98597a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f961049204c09a22604a0ffda3185ee4.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f9db87d72be025f8c58cf73d52548272.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f9db87d72be025f8c58cf73d52548272.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..a9469ebff14ca91c374221a32fa8d7c6f73da416 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/f9db87d72be025f8c58cf73d52548272.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/fa33fb40406c0d90903620687894ec5e.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/fa33fb40406c0d90903620687894ec5e.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..5b41427f671415d433b24881bbc9180dad15efcf Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/fa33fb40406c0d90903620687894ec5e.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/fc436a1e63fb0760803b443e5690cb35.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/fc436a1e63fb0760803b443e5690cb35.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..802d40072e6b74473444a37bb794b494c65bfe1f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/fc436a1e63fb0760803b443e5690cb35.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/fdd55ec62ab7d5a2693ce944cd70f5f8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/fdd55ec62ab7d5a2693ce944cd70f5f8.png new file mode 100644 index 0000000000000000000000000000000000000000..37336f67e48534950f863203ba652251831ecd31 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/Book_Picture/fdd55ec62ab7d5a2693ce944cd70f5f8.png differ diff --git "a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/\346\201\251\346\231\272\346\265\246FRDM-MCX974\345\256\236\350\267\265\346\214\207\345\215\227.md" "b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/\346\201\251\346\231\272\346\265\246FRDM-MCX974\345\256\236\350\267\265\346\214\207\345\215\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..1e9240098de4ba5afb472c62a4b12f3a17a0b4eb --- /dev/null +++ "b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/\346\201\251\346\231\272\346\265\246FRDM-MCX974\345\256\236\350\267\265\346\214\207\345\215\227.md" @@ -0,0 +1,6402 @@ +# **恩智浦FRDM-MCXN947开发实践指南** + +| **目录** | 作者 | +| -------------------------------------------- | ---------------------- | +| **零、实践指南说明** | **RT-Thread & 恩智浦** | +| **一、恩智浦FRDM-MCX947上的UART实践** | 刘工 & 王渝鑫 | +| **二、恩智浦FRDM-MCX947上的GPIO实践** | 辛书伟 & 吴达 | +| **三、恩智浦FRDM-MCX947上的RTC实践** | 李磊 & 刘鹏 | +| **四、恩智浦FRDM-MCX947上的ADC实践** | 梅工 & 刘协泉 | +| **五、恩智浦FRDM-MCX947上的ADC实践** | 刘协泉 | +| **六、恩智浦FRDM-MCX947上的Flash实践** | 齐衡 & 澄淇思 | +| **七、恩智浦FRDM-MCX947上的SPI实践** | 程杰 & Jisheng Zhang | +| **八、恩智浦FRDM-MCX947上的PWM实践** | 盛建忠 & 幸年军 | +| **九、恩智浦FRDM-MCX947上的 IIC(软件) 实践** | 印凯平 & 刘江龙 | +| **十、恩智浦FRDM-MCX947上的 IIC(硬件) 实践** | 莫海文 & 朱明明 | +| **十一、恩智浦FRDM-MCX947上的ETH实践** | 李海 & 麦欢艺 | +| **十二、恩智浦FRDM-MCX947上的CAN实践** | 张沣驫 & 舒扬 | +| **十三、恩智浦FRDM-MCX947上的TFT实践** | 莫金瑞 & 李硕 | +| **十四、恩智浦FRDM-MCX947上的USB-D实践** | 李建波 & 麦子丰 | +| **十五、恩智浦FRDM-MCX947上的SDHI实践** | 程廷桢 & 王宇 | +| **其他示例工程** | | +| **十六、恩智浦FRDM-MCX947上的RW007实践** | 谢小龙 & 许思维 | +| **十七、恩智浦FRDM-MCX947上的WDT看门狗实践** | 何剑波 & 吴炳坤 | +| **FAQ** | **RT-Thread & 恩智浦** | + + + +# 《恩智浦FRDM-MCX947开发实践指南》零、实践指南说明 + +## 硬件介绍 + +1. 开发板描述: + +NXP FRDM-MCXN947板是NXP官方基于MCXN947器件的低成本设计和评估板。MCXN947器件将Arm Cortex-M33单片机和神经处理单元(NPU)集成到单个封装中。NXP支持MCXN947设备的工具和软件,包括硬件评估板,软件开发IDE,示例应用程序和驱动程序。该板由一个MCXN947器件和一个64 mbit外部串行闪存(由Windows提供)组成。该板还具有P3T1755DP I3C温度传感器,CAN PHY,以太网PHY,SDHC电路(DNP),RGB LED,触摸板,高速USB电路,按钮和MCU-Link调试探头电路。提供Arduino扩展,PMOD扩展,MicroBus总线扩展。支持摄像头模块和NXP低成本LCD模块PAR-LCD-S035。兼容Arduino屏蔽模块和Mikroe点击板。板载MCU-Link调试探头基于LPC55S69单片机。 + + + +2. 开发板外观如下图所示: + +![AgAABnNowAfH9B0a7sRNOZVUVsVMTCFS](Book_Picture/AgAABnNowAfH9B0a7sRNOZVUVsVMTCFS.png) + + + +3. 该开发板常用 **板载资源** 如下: + +![AgAABnNowAdFxutaiqBM25LbiaRS1GHW](Book_Picture/AgAABnNowAdFxutaiqBM25LbiaRS1GHW.png) + + + +- MCU:MCXN947VDFT,主频150 MHz +- 外部FLASH:W25Q64JVSSIQ(8 MB) +- 常用外设 +- LED:RGBLED(R接P0_10,G接P0_27,B接P1_2) +- 按键:3个,RESET(RESET_B),WAKEUP(P0_23),ISPMODE(P0_6) +- 常用接口:Arduino兼容IO接口,mikroBUS 接口,PMOD接口,FlexIO接口,摄像头接口,USB接口,CAN接口,MCU-Link USB接口,Debug接口 + +开发板更多详细信息请参考 [**NXP官方网站**](https://www.nxp.com/design/design-center/development-boards/general-purpose-mcus/frdm-development-board-for-mcx-n94-n54-mcus:FRDM-MCXN947) + +## 快速上手 + +### 环境搭建 + +目前FRDM-MCXN947板级支持包提供MDK5,并且支持 GCC 开发环境,现以 MDK5 开发环境为例,介绍如何将示例程序运行起来。运行示例程序前需要做如下准备工作: + +> NXP官方的FRDM-MCXN947的上手教程,可以参考[**这里**](https://docs.nxp.com/bundle/UG10092/page/topics/introduction.html#) + +1. MDK开发环境 + + 需要安装 MDK-ARM 5.38(或以上版本均可)。安装方法可以参考 [**Keil MDK安装**](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/quick-start/keil/keil)。 + +2. 源码获取 + + https://github.com/RT-Thread/rt-thread/ + + [**源码目录说明**](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/quick-start/src_code_introduction/rtthread_dir) + +3. 使用USB线连接开发板的USB转串口 到 PC 机。 + + ![AgAABnNowAcEvmn8HzpGdZc9QFuWBgdi](Book_Picture/AgAABnNowAcEvmn8HzpGdZc9QFuWBgdi.png) + + + +### 运行示例 + +#### 编译下载 + +进入到 rt-thread\bsp\nxp\mcxn\frdm-mcxn947 文件夹中,双击 project.uvprojx 文件,打开 MDK5工程。 + +![AgAABnNowAcYXs6svDFOzZzvbS15wauH](Book_Picture/AgAABnNowAcYXs6svDFOzZzvbS15wauH.png) + +执行编译,编译完成后,点击下载按钮将固件下载至开发板,下载完成后,程序会自动开始运行,观察程序运行状况。 + +> **提示:工程默认配置使用 CMSIS-DAP下载程序,点击下载按钮可下载程序到开发板** + +![AgAABnNowAfqDW1xJmtF-Ji8ppm58lN7](Book_Picture/AgAABnNowAfqDW1xJmtF-Ji8ppm58lN7.png) + + + +#### 运行 + +如没有自动运行,按下复位按键重启开发板,观察开发板上 LED 的实际效果。正常运行后,LED 灯会周期性闪烁,如下图所示: + +![AgAABnNowAep_e0euDBOUI8SIc6EP1Yy](Book_Picture/AgAABnNowAep_e0euDBOUI8SIc6EP1Yy.gif) + +连接开发板对应串口到PC,在串口工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```C + \ | / +- RT - Thread Operating System + / | \ 5.1.0 build Feb 19 2024 16:40:05 + 2006 - 2024 Copyright by RT-Thread team +using armclang, version: 6190004 +MCXN947 HelloWorld +msh > + +``` + + + +### 继续学习 + +已完成 RT-Thread 快速上手!点击这里进行 [**内核学习**](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/kernel/kernel-video)。 + +## 其他资料 + +恩智浦 FRDM-MCX947 开发实践指南 + + + +------ + + + +**我有疑问:**[**RT-Thread 官方论坛**](https://club.rt-thread.org/) + +# **一、恩智浦FRDM-MCXN947上的UART实践**(刘工) + +## 1. 开发环境 + +>linux + scons + env +> 使用 pyocd 烧写 + +## 2. 步骤说明 + +### 2.1 修改编译器路径 + +打开 rtconfig.py 文件,根据使用的编译器类型,首先确认 `EXEC_PATH` 这个变量定义的路径对不对,不对的先按照自己计算机上的路径进行修改。 + +### 2.2 第一次执行编译 + +```c +$ scons -s +/mnt/rtthread/gcc-arm-none-eabi-10.3-2021.10/arm-none-eabi/include/time.h:56:1: error: unknown type name 'clock_t'; did you mean '_flock_t'? + 56 | clock_t clock (void); +/mnt/rtthread/rt-thread/components/libc/compilers/common/include/sys/time.h:55:5: error: unknown type name 'suseconds_t' + 55 | suseconds_t tv_usec; /* and microseconds */ +``` + +首先,到论坛上搜一圈有没有类似的问题。参考论坛文章 [error: unknown type name ‘clock_t’](https://club.rt-thread.org/ask/question/981978b1d833e9cf.html) 修改 “rtconfig.py” 文件。 + +```c +$ vim rtconfig.py +CFLAGS = DEVICE + ' -Wall -D__FPU_PRESENT' +修改为: +CFLAGS = DEVICE + ' -Wall -D__FPU_PRESENT -D_POSIX_C_SOURCE=1' +``` + +### 2.3 再次编译 + +```c +[lau@localhost frdm-mcxn947]$ scons -s +Memory region Used Size Region Size %age Used + m_interrupts: 688 B 1 KB 67.19% + m_text: 84792 B 767 KB 10.80% + m_core1_image: 0 GB 256 KB 0.00% + m_data: 80056 B 312 KB 25.06% + rpmsg_sh_mem: 0 GB 0 GB + m_flash1: 0 GB 1 MB 0.00% + m_sramx: 0 GB 96 KB 0.00% + m_flash_config: 0 GB 512 B 0.00% + m_usb_sram: 0 GB 4 KB 0.00% + text data bss dec hex filename + 85472 640 79424 165536 286a0 rtthread.elf +``` + +### 2.4 烧写程序 + +```C +$ pyocd load -e sector -t mcxn947vdf rtthread.bin +0001886 E Transfer error while reading AHB-AP#1 ROM table: Memory transfer fault @ 0xe00fffd0-0xe00fffff [ap] +0001934 I Loading /mnt/rtthread/rt-thread/bsp/nxp/mcx/mcxn/frdm-mcxn947/rtthread.bin [load_cmd] +[==================================================] 100% +0010434 I Erased 90112 bytes (11 sectors), programmed 82944 bytes (162 pages), skipped 0 bytes (0 pages) at 9.53 kB/s [loader] +``` + +> 我使用的时候一直有个错误,不知道各位使用 PYOCD 烧写的有没有上面这个 “Memory transfer fault”,因为没影响后面使用也没有细究原因(其实是没百度出来所以然来) + +### 2.5 运行 + +使用 USB TypeC 线连接计算机和 MCXN947 的 MCU-LINK 口,linux 系统里会增加一个串口设备: “/dev/ttyACM0”。 + rtt 默认波特率 115200,我们打开一个串口终端,按下 MCXN947 的 RESET 按键,串口终端里将打印出 rtt 启动信息。 +![img](Book_Picture/e45d924aa79d45f56bdcc946a354a3c0.gif) + +### 2.6 移植 serialX 驱动 + +详细移植步骤参考论坛文章。 + +项目配置进行了改动,去掉了 finsh ,下面测试 serialX 使用的也是 uart4 (和 finsh 相同的,为减少干扰先砍掉 finsh + + + +### 2.7 测试 + +测试仍然用之前的测试方案,测试代码可以在 [serialX](https://gitee.com/thewon/serialX) 里找到。 + +[收发测试视频](https://oss-club.rt-thread.org/uploads/20240331/e5e6900a868992a8a3dc9e1eb977dece.mp4)。 + + + +### 2.8 遇到的问题 + +1. 第一个就是第一次编译出现的那个未定义错误。 +2. 前边也提到了使用 PYOCD 烧写有个错误信息,但是没影响使用。 +3. 因为我在虚拟机里的linux系统开发的,但是在 linux 系统下串口总是出问题,然后就在 linux 系统开发烧写,然后切换到 win 系统看系统调试输出信息,这个也是有问题的。每次都需要把 USB 线拔掉再重新插上。 +4. 在测试打开关闭的时候,发现每次打开关闭串口设备时,都会发一个 ‘\xFF’ 出来。这可能是一个 bug。 +5. 目前测试 + `LPUART_EnableInterrupts(uart->uart_base, kLPUART_TxDataRegEmptyInterruptEnable);` + `LPUART_EnableInterrupts(uart->uart_base, kLPUART_RxDataRegFullInterruptEnable);` + 这两个开中断的结果不是叠加的。因为我每次打开/关闭发送数据寄存器空中断后,发现不再触发接收,必须在关闭发送中断后重新打开接收中断。这可能也是一个 bug。 + +### 2.9 本次测评实现的优化及改进 + +1. 原串口驱动只实现了接收中断,发送必须用 poll 模式。本次测评增加了发送中断,支持使用中断模式发送数据。 +2. 移植了 serialX 串口驱动框架。 +3. 最后,项目源码见我的仓库分支 [mcxn947 serialX](https://github.com/thewon86/rt-thread/tree/mcxn947) + +## 3. 原文连接 + +原文连接:https://club.rt-thread.org/ask/article/2937110f8e5bd2e3.html + +# **二、恩智浦FRDM-MCXN947上的GPIO实践**(辛书伟) + +## 1. 开发环境 + +>windows 安装环境搭建 +> keil V5 + +![img](Book_Picture/2767a790a99b54b66740587f1f7b87c1.png) + + + +安装 nxp MCXN947 的pack 这里使用的是17的版本 + +NXP.MCXN947_DFP.17.0.0.pack + 安装完成后,https://gitee.com/rtthread/rt-thread 拉取代码 + 在\bsp\nxp\mcx\mcxn\frdm-mcxn947\下打开keil project + 选择下c编译选项 + + + +![img](Book_Picture/a46d04e6cc33a99d93ef35ce3e8051d5.png) + + + +编译完成后,下载,然后点击板子上的重启按钮即可 + + + +![img](Book_Picture/304bfed046bf684a2254beecf3c122ea.png.webp) + + + +默认功能是红灯500ms 亮一下,500ms 灭一下,按wakeup 按钮时,debug uart口会打印sw pressed + + + +## 2. 步骤说明 + +### 2.1 PIN 相关设置解析 + +RT-Thread 中的pin 驱动都使用了统一接口如下: + + + +![img](Book_Picture/56af33d1e6a7a9be879b1dfb7de65a14.png) + + + +支持pin的模式设置、pin 状态读取、pin接口设置、使能管脚中断、设置管脚中断、取消管脚中断、使能管脚中断 这几个函数,下面针对这几个函数讲解下如何使用。 + +#### 2.1.1 rt_pin_mode + +rt_pin_mode 主要进行管脚模式设置,主要支持如下设置 + + + +```C +#define PIN_MODE_OUTPUT 0x00 +#define PIN_MODE_INPUT 0x01 +#define PIN_MODE_INPUT_PULLUP 0x02 +#define PIN_MODE_INPUT_PULLDOWN 0x03 +#define PIN_MODE_OUTPUT_OD 0x04 +``` + + + +分别是 输出模式 输入模式 输入上拉 输入下拉 输出开漏模式 +rt_pin_mode 调用底层函数是 + `void mcx_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode)` + rt_base_t pin 的输入跟管脚对应关系是 + + +```C +pin = PortNum*32+PinNum +``` + + + +PortNum 对应 PORT0 PORT1 PORT2 PORT3 PORT4 (0 1 2 3 4) + PinNum 对应管脚数 + 举个例子,如PORT1 PIN 14 则pin = 1*32+14 = 46 + +后续的管脚模拟都会用的到,目前支持的GPIO状态还相对少,后续如果增加控制可以开启RT_USING_PINCTRL 并完成相关驱动的适配 + + +#### 2.1.2 rt_pin_read + +当把管脚配置为输入模式后,rt_pin_read 调用mcx_pin_read 获取当前管脚的逻辑状态 + +```C +static rt_ssize_t mcx_pin_read(rt_device_t dev, rt_base_t pin) +{ + return GPIO_PinRead(PIN2GPIO(pin), GET_GPIO_PIN(pin)); +} +``` + + + +#### 2.1.3 rt_pin_write + +当 把管脚设置为输出模式后,可通过rt_pin_write 进行管脚的电平设置,支持 高电平 低电平设置,底层调用的是mcx_pin_write + + + +```C +static void mcx_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value) +{ + GPIO_PinWrite(PIN2GPIO(pin), GET_GPIO_PIN(pin), value); +} +``` + + + +#### 2.1.4 rt_pin_attach_irq + +设置管脚的中断触发状态,支持高电平、低电平、上升沿、下降沿、边沿触发,调用底层的mcx_pin_attach_irq,可设置回调函数 + + + +```C + +static rt_err_t mcx_pin_attach_irq(struct rt_device *device, rt_base_t pin, rt_uint8_t mode, void (*hdr)(void *args), void *args) +{ + switch (mode) + { + case PIN_IRQ_MODE_RISING: + GPIO_SetPinInterruptConfig(PIN2GPIO(pin), GET_GPIO_PIN(pin), kGPIO_InterruptRisingEdge); + break; + case PIN_IRQ_MODE_FALLING: + GPIO_SetPinInterruptConfig(PIN2GPIO(pin), GET_GPIO_PIN(pin), kGPIO_InterruptFallingEdge); + break; + case PIN_IRQ_MODE_RISING_FALLING: + GPIO_SetPinInterruptConfig(PIN2GPIO(pin), GET_GPIO_PIN(pin), kGPIO_InterruptEitherEdge); + break; + case PIN_IRQ_MODE_HIGH_LEVEL: + GPIO_SetPinInterruptConfig(PIN2GPIO(pin), GET_GPIO_PIN(pin), kGPIO_InterruptLogicOne); + break; + case PIN_IRQ_MODE_LOW_LEVEL: + GPIO_SetPinInterruptConfig(PIN2GPIO(pin), GET_GPIO_PIN(pin), kGPIO_InterruptLogicZero); + break; + } + pin_irq_hdr_tab[pin].pin = pin; + pin_irq_hdr_tab[pin].mode = mode; + pin_irq_hdr_tab[pin].hdr = hdr; + pin_irq_hdr_tab[pin].args = args; + return RT_EOK; +} +``` + + + +#### 2.1.5 rt_pin_detach_irq + +rt_pin_detach_irq 调用底层mcx_pin_detach_irq,取消当前管脚的中断设置 + +```C +static rt_err_t mcx_pin_detach_irq(struct rt_device *device, rt_base_t pin) +{ + GPIO_SetPinInterruptConfig(PIN2GPIO(pin), GET_GPIO_PIN(pin), kGPIO_InterruptStatusFlagDisabled); + return RT_EOK; +} +``` + + + +#### 2.1.6 rt_pin_irq_enable + +rt_pin_irq_enable 可用于gpio 中断的开启及关闭,调用底层的 mcx_pin_irq_enable + +```c +static rt_err_t mcx_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled) +{ + if(enabled) + { + EnableIRQ(PIN2IRQ(pin)); + } + else + { + DisableIRQ(PIN2IRQ(pin)); + } + return RT_EOK; +} +``` + + + +### 2.2 利用PIN 接口实现 DHT11 温度湿度的解析 + +DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。 + + + +![img](Book_Picture/08d5919dea152fac6ca5273cc033d356.png.webp) + + + +相关控制时序参考:https://blog.csdn.net/qq_45863399/article/details/119982631 + +这里讲下如何进行dhtxx 库的移植 + +#### 2.2.1 dhtxx库添加 + +![img](Book_Picture/64f468fbf7b21279f2d577f0b237a63f.png) + +我这里使用的是 RT-Thread ENV V1.5.0 版本,强烈建议大家使用,舍弃了之前的menuconfig ,代替的是pyconfig + +```c +scons --pyconfig +``` + +输入上面的命令 + +![img](Book_Picture/2b594519bbe03475d8827c568582bc55.png) + +界面有常用的按钮设置,方便进行存储 、打开、搜索等设置,相当方便 + +![img](Book_Picture/907b955a3632471094732a4f0d87e6a4.png) + +搜索dhtxx + 选择DHTXX 点击下面的 jump 调转相应界面,按图进行设置 + +![img](Book_Picture/3accd57e7e33f577c5f7c45a3d4a8f91.png) + +GPIO 可以针对自己的连接进行设置,我这里使用的是PORT1 PIN 14 所以PIN=32*1+14 =46 + +然后点击保存,运行 + +```C +//更新组件 +pakgs --update +//重新生成keil 工程 + scons --target=mdk5 +``` + +生成keil 工程注意rtconfig.py keil 改成自己的keil安装位置 + +![screenshot_image.png](Book_Picture/0e23f277bed2390f8d6a0fc99bb1a64e.png-171523840847415.webp) + + + +#### 2.2.2 dhtxx库修改 + +去除 sensor_asair_dhtxx.c 及 dhtxx.c 中的 + `RT_WEAK void rt_hw_us_delay(rt_uint32_t us)` + 这里使用board.c 中的设置 + + + +dhtxx.h 中的 + +```C +#include +``` + +替换为 + +```c +#include +``` + +由于之前库使用的rt 4.0 版本,5.0 版本 sensor.h 在drivers文件夹下面 + +#### 2.2.3 dhtxx 输出测试 + +main.c 中添加 + +```c +#include "dhtxx.h" +dht_device_t sensor = dht_create(PKG_USING_DHTXX_SAMPLE_PIN); +``` + + + +主循环中添加 + +```c + rt_pin_write(LEDB_PIN, PIN_HIGH); /* Set GPIO output 1 */ + for(int i=0;i<1000;i++) + { + rt_hw_us_delay(500); + } + /* Delay 500mS */ + rt_pin_write(LEDB_PIN, PIN_LOW); /* Set GPIO output 0 */ + for(int i=0;i<1000;i++) + { + rt_hw_us_delay(500); + } +if(dht_read(sensor)) { + rt_int32_t temp = dht_get_temperature(sensor); + rt_int32_t humi = dht_get_humidity(sensor); + rt_kprintf("Temp: %d, Humi: %d\n", temp, humi); +} +else { + rt_kprintf("Read dht sensor failed.\n"); +} +``` + + +串口log 中可打印出相应的湿度及温度 + +![screenshot_image.png](Book_Picture/9682111b8a414deb3ef4be96afedaf12-171523855621017.png) + +相关代码:https://gitee.com/xinshuwei/NXP_MCXN947_project.git + +相关视频:[NXP MCXN947 实现DHT11 温湿度采集_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1AZ421J7Ru/?spm_id_from=333.1350.jump_directly) + +## 3. 原文连接 + +原文连接1:[RT-Thread-NXP MCXN947 测评(1)开箱环境搭建RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/48aa7894ecce66dc.html) + +原文连接2:[RT-Thread-NXP MCXN947 测评(2)基于GPIO 控制实现DHT11 温湿度采集RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/67a2c9fdddff5cc8.html) + + + +# **三、恩智浦FRDM-MCX947上的RTC实践**(刘鹏) + +## 1. 开发环境 + +通过env环境配置 FRDM-MCXN947的RTC设备以及Alarm闹钟 ,并对NXP MCXN947的使用进行详细配置并演示测试 + +> 开发环境:MDK 5.38,env 1.5.0 +> 环境搭建博客见: +> +> [【恩智浦FRDM-MCX947开箱实践指南1】](https://vor2345.blog.csdn.net/article/details/137411166) +> +> [ENV用户手册](https://www.rt-thread.org/document/site/#/development-tools/env/env) + +在开启 RTC 设备框架以及 RTC 驱动之后,用户可以#include 用来引用标准的时间操作函数(例如 time、ctime、stime、mktime等)。在Unix系统或者Windows系统下怎么使用里边的函数。 + +RTC 设备框架也提供了set_date()和set_time()函数,方便用户快速修改时间和日期。 + +| 函数 | 描述 | +| ---------- | -------------------------------- | +| set_date() | 设置日期,年、月、日(当地时区) | +| set_time() | 设置时间,时、分、秒(当地时区) | + + + +### 1.1 模块介绍 + +实时时钟(RTC)是一个低功耗模块,提供时间保持和日历功能,还可以针对振荡器中由于晶体或温度引起的32kHz或16kHz时钟的变化来补偿1Hz时钟。 + +![screenshot_image.png](Book_Picture/f4098e5940657153191019c220cec862.png.webp) + +MCXN947 RTC包括以下功能: + +- 专为低功耗设计:时间和日期计数器交错排列,以防止同时切换 + +- 基本时钟功能:天、小时、分钟和秒的独立计数器,日历支持—独立的年、月和星期几计数器:使用用户定义的参数自动调整夏令时 + +- 自动调整月份和闰年,如果您选择提供外部补偿的1Hz时钟,则支持运行计数器的外部时钟 + +- 时区偏移量——RTC使用本地时间,该时间隐含地包含时区偏移量 + +- 带中断的可编程报警——如果MCU将其用作唤醒事件,则从RTC输出报警 + + 周期性中断(采样定时器中断) + +- 硬件补偿——针对温度变化或晶体特性导致的振荡器时钟频率变化,补偿1 Hz时钟(到计数器)。 + + + +## 2. 步骤说明 + +### 2.1 RTC步骤说明 + +#### 2.1.1 新建工程 + +下拉代码git clone `https://github.com/RT-Thread/rt-thread.git rt-thread` + 文件配置代码位置如下图分部,克隆的rt-thread文件在env环境大文件夹下 + +![screenshot_image.png](Book_Picture/19e199a266de3c418b127fa33ace2738.png.webp) + +以管理员身份运行`env.exe`,启动正常如下 + +![screenshot_image.png](Book_Picture/128684d19c8e897ed87e93c79c49749f.png) + + + +切换到`frdm-mcxn947`工程目录`cd rt-thread\bsp\nxp\mcx\mcxn\frdm-mcxn947` + +![screenshot_image.png](Book_Picture/a066902c4f30f09fb42055fe3323477f.png) + +此时正确进入环境配置界面 + +#### 2.1.2 配置RTC + +env环境中输入`menuconfig`后按回车,弹出当前工程的配置界面 + +![screenshot_image.png](Book_Picture/537f3ed816186e4cfbdeed020e322a79.png) + +使能RTC模块`Hardware Drivers Config ---> On-chip Peripheral Drivers ---> Enable RTC` + +![screenshot_image.png](Book_Picture/d693dc8925419cc68e127bbdab3b76b8.png) + +输入`Y`激活Enable RTC + save保存设置,回车 + +![screenshot_image.png](Book_Picture/94774108c0b4e229456af6aca0c70415.png) + +输入`scons --target=mdk5`后按回车重新生成工程 + +![screenshot_image.png](Book_Picture/2ff30c892b61a603581711b31d38726a.png) + +### 2.2 代码验证 + +#### 2.2.1 测试代码 + +编写main测试代码,首先初始化RTC设备,然后设置日期时间,延时3秒后获取时间并打印。 + +```c +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2019-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-10-24 Magicoe first version + * 2020-01-10 Kevin/Karl Add PS demo + * 2020-09-21 supperthomas fix the main.c + * + */ +#include +#include +#include "drv_pin.h" +#define LEDB_PIN ((0*32)+10) +#define BUTTON_PIN ((0*32)+23) +static void sw_pin_cb(void *args); +#define RTC_NAME "rtc" +static int rtc_test(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + time_t now; + rt_device_t device = RT_NULL; + /*寻找设备*/ + device = rt_device_find(RTC_NAME); + if (!device) + { + return RT_ERROR; + } + /*初始化RTC设备*/ + if(rt_device_open(device, 0) != RT_EOK) + { + return RT_ERROR; + } + /* 设置日期 */ + ret = set_date(2024, 4, 6); + if (ret != RT_EOK) + { + rt_kprintf("set RTC date failed\n"); + return ret; + } + /* 设置时间 */ + ret = set_time(15, 22, 30); + if (ret != RT_EOK) + { + rt_kprintf("set RTC time failed\n"); + return ret; + } + /* 延时3秒 */ + rt_thread_mdelay(3000); + /* 获取时间 */ + now = time(RT_NULL); + rt_kprintf("%s\n", ctime(&now)); + return ret; +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(rtc_test, rtc test); +int main(void) +{ +#if defined(__CC_ARM) + rt_kprintf("using armcc, version: %d\n", __ARMCC_VERSION); +#elif defined(__clang__) + rt_kprintf("using armclang, version: %d\n", __ARMCC_VERSION); +#elif defined(__ICCARM__) + rt_kprintf("using iccarm, version: %d\n", __VER__); +#elif defined(__GNUC__) + rt_kprintf("using gcc, version: %d.%d\n", __GNUC__, __GNUC_MINOR__); +#endif + rt_pin_mode(LEDB_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */ + rt_pin_mode(BUTTON_PIN, PIN_MODE_INPUT_PULLUP); + rt_pin_attach_irq(BUTTON_PIN, PIN_IRQ_MODE_FALLING, sw_pin_cb, RT_NULL); + rt_pin_irq_enable(BUTTON_PIN, 1); + rt_kprintf("RTC Alarm2 for NXP MCXN947 Review\r\n"); +#ifdef RT_USING_SDIO + rt_thread_mdelay(2000); + if (dfs_mount("sd", "/", "elm", 0, NULL) == 0) + { + rt_kprintf("sd mounted to /\n"); + } + else + { + rt_kprintf("sd mount to / failed\n"); + } +#endif + while (1) + { + rt_pin_write(LEDB_PIN, PIN_HIGH); /* Set GPIO output 1 */ + rt_thread_mdelay(500); /* Delay 500mS */ + rt_pin_write(LEDB_PIN, PIN_LOW); /* Set GPIO output 0 */ + rt_thread_mdelay(500); /* Delay 500mS */ + } +} +static void sw_pin_cb(void *args) +{ + rt_kprintf("sw pressed\r\n"); +} +// end file + +``` + + + +- 中文乱码 + + 许多刚刚接触单片机的小白,都很有可能遇到过使用 Keil 编写注释时出现中文变成问号或者乱码的情况。 + + > 解决步骤 首先打开 Keil,在菜单栏中点击`Edit`–>选择Configuration命令–>将`Encoding`选择为`Chinese GB2312(Simplified)`–>点击 OK 即可。 + > + > ![screenshot_image.png](Book_Picture/bdb3c76ce1d367402c47d20df3f6fa5f.png) + +编译并下载 + +![screenshot_image.png](Book_Picture/b467841d28f66f8b6a279fe0ee672de7.png.webp) + +使用`rtc_test`和~date~测试代码 + +![screenshot_image.png](Book_Picture/98b320359c6c35885410bbfb17f7f6af.png.webp) + + + +#### 2.2.2 打印输出 + +从以上打印信息可以看出,rtc已经使能,然后使用date命令确认时间已正常写入。 + +```c +15:30:03.371 -> sram heap, begin: 0x0x20001994, end: 0x0x2005f600 +15:30:03.375 -> +15:30:03.375 -> +15:30:03.375 -> +15:30:03.375 -> \ | / +15:30:03.376 -> - RT - Thread Operating System +15:30:03.378 -> +15:30:03.379 -> / | \ 5.1.0 build Apr 6 2024 15:29:15 +15:30:03.383 -> +15:30:03.383 -> 2006 - 2024 Copyright by RT-Thread team +15:30:03.386 -> +15:30:03.386 -> using armclang, version: 6210000 +15:30:03.390 -> RTC Alarm2 for NXP MCXN947 Review +15:30:03.393 -> +15:30:03.393 -> +15:30:03.393 -> msh >rtc_test +15:30:17.100 -> +15:30:20.099 -> Sat Apr 6 15:30:33 2024 +15:30:20.101 -> +15:30:20.101 -> +15:30:20.101 -> +15:30:20.101 -> msh >date +15:30:33.387 -> +15:30:33.387 -> local time: Sat Apr 6 15:30:47 2024 +15:30:33.390 -> +15:30:33.390 -> timestamps: 1712388647 +15:30:33.392 -> timezone: UTC+08:00:00 +15:30:33.394 -> +15:30:33.394 -> msh > +``` + + + +### 2.3 Alarm介绍 + +alarm 闹钟功能是基于 RTC 设备实现的,根据用户设定的闹钟时间,当时间到时触发 alarm 中断,执行闹钟事件,在硬件上 RTC 提供的 Alarm 是有限的,RT-Thread 将 Alarm 在软件层次上封装成了一个组件,原理上可以实现无限个闹钟,但每个闹钟只有最后一次设定有效。 + +> 注意:要使用 Alarm 组件,需要使用 menuconfig 配置打开 Alarm 组件功能,由于alarm 是基于 RTC 设备,因此 RTC 也需要打开,且需要实现 RTC提供的 ops 接口中的set_alarm 和 get_alarm 接口,具体实现过程请参考 RTC驱动[开发文档](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/rtc/rtc) + +现在是基于上面RTC案例开发,alarm 组件开启位置 : `RT-Thread Components -> Device Drivers -> Using RTC alarm&Using software simulation RTC device` + + +```c +RT-Thread Components ---> + Device Drivers ---> + [*] Using RTC alarm + [*] Using software simulation RTC device /* 使用软件模拟 RTC */ +``` + + + +![screenshot_image.png](Book_Picture/86ca75b4c921b2892211002bc48d82fc.png) + +输入`scons --target=mdk5`后按回车重新生成工程 + +![screenshot_image.png](Book_Picture/44547ec317d6ec1e0f8983b9bc5ed438.png) + + + +#### 2.3.1 访问 Alarm 设备 + +应用程序通过使用 alarm 组件提供的接口使用 Alarm 功能,相关接口如下 : + +| 函数 | 描述 | +| ------------------ | ---------------------- | +| rt_alarm_create() | 创建闹钟 | +| rt_alarm_start() | 启动闹钟 | +| rt_alarm_stop() | 停止闹钟 | +| rt_alarm_delete() | 删除闹钟 | +| rt_alarm_control() | 控制 alarm 设备 | +| rt_alarm_dump() | 打印显示设置的闹钟信息 | + +#### 2.3.2 Alarm 使用示例 + +alarm 设备使用可以参考以下示例代码: + +```c +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2019-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-10-24 Magicoe first version + * 2020-01-10 Kevin/Karl Add PS demo + * 2020-09-21 supperthomas fix the main.c + * + */ +#include +#include +#include "drv_pin.h" +#define LEDB_PIN ((0*32)+10) +#define BUTTON_PIN ((0*32)+23) +static void sw_pin_cb(void *args); +int i; +/* +** 程序清单:这是一个 RTC 设备使用例程 +** 例程导出了 alarm_sample 命令到控制终端 +** 命令调用格式:alarm_sample +** 程序功能:设置RTC时间,创建闹钟,模式:每秒触发,启动闹钟 +**/ +void user_alarm_callback(rt_alarm_t alarm, time_t timestamp) +{ + rt_kprintf("user alarm callback function.\n"); + rt_pin_write(LEDB_PIN, PIN_LOW); /* Set GPIO output 1 */ + rt_thread_mdelay(500); /* Delay 500mS */ + rt_pin_write(LEDB_PIN, PIN_HIGH); /* Set GPIO output 0 */ + rt_thread_mdelay(500); /* Delay 500mS */ + i = i +1; + if(i >= 2){ + rt_alarm_stop(alarm); + } +} +void alarm_sample(void) +{ + rt_device_t dev = rt_device_find("rtc"); + struct rt_alarm_setup setup; + struct rt_alarm * alarm = RT_NULL; + static time_t now; + struct tm p_tm; + i= 0; + if (alarm != RT_NULL) + return; + /* 获取当前时间戳,并把下一秒时间设置为闹钟时间 */ + now = time(NULL) + 1; + gmtime_r(&now,&p_tm); + setup.flag = RT_ALARM_SECOND; + setup.wktime.tm_year = p_tm.tm_year; + setup.wktime.tm_mon = p_tm.tm_mon; + setup.wktime.tm_mday = p_tm.tm_mday; + setup.wktime.tm_wday = p_tm.tm_wday; + setup.wktime.tm_hour = p_tm.tm_hour; + setup.wktime.tm_min = p_tm.tm_min; + setup.wktime.tm_sec = p_tm.tm_sec; + alarm = rt_alarm_create(user_alarm_callback, &setup); + if(RT_NULL != alarm) + { + rt_alarm_start(alarm); + } +} +/* export msh cmd */ +MSH_CMD_EXPORT(alarm_sample,alarm sample); +#define RTC_NAME "rtc" +static int rtc_test(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + time_t now; + rt_device_t device = RT_NULL; + /*寻找设备*/ + device = rt_device_find(RTC_NAME); + if (!device) + { + return RT_ERROR; + } + /*初始化RTC设备*/ + if(rt_device_open(device, 0) != RT_EOK) + { + return RT_ERROR; + } + /* 设置日期 */ + ret = set_date(2024, 4, 6); + if (ret != RT_EOK) + { + rt_kprintf("set RTC date failed\n"); + return ret; + } + /* 设置时间 */ + ret = set_time(20, 31, 30); + if (ret != RT_EOK) + { + rt_kprintf("set RTC time failed\n"); + return ret; + } + /* 延时3秒 */ + rt_thread_mdelay(3000); + /* 获取时间 */ + now = time(RT_NULL); + rt_kprintf("%s\n", ctime(&now)); + return ret; +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(rtc_test, rtc test); +int main(void) +{ +#if defined(__CC_ARM) + rt_kprintf("using armcc, version: %d\n", __ARMCC_VERSION); +#elif defined(__clang__) + rt_kprintf("using armclang, version: %d\n", __ARMCC_VERSION); +#elif defined(__ICCARM__) + rt_kprintf("using iccarm, version: %d\n", __VER__); +#elif defined(__GNUC__) + rt_kprintf("using gcc, version: %d.%d\n", __GNUC__, __GNUC_MINOR__); +#endif + rt_pin_mode(LEDB_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */ + rt_pin_mode(BUTTON_PIN, PIN_MODE_INPUT_PULLUP); + rt_pin_attach_irq(BUTTON_PIN, PIN_IRQ_MODE_FALLING, sw_pin_cb, RT_NULL); + rt_pin_irq_enable(BUTTON_PIN, 1); + rt_kprintf("RTC Alarm2 for NXP MCXN947 Review\r\n"); +#ifdef RT_USING_SDIO + rt_thread_mdelay(2000); + if (dfs_mount("sd", "/", "elm", 0, NULL) == 0) + { + rt_kprintf("sd mounted to /\n"); + } + else + { + rt_kprintf("sd mount to / failed\n"); + } +#endif + while (1) + { +// rt_pin_write(LEDB_PIN, PIN_HIGH); /* Set GPIO output 1 */ +// rt_thread_mdelay(500); /* Delay 500mS */ +// rt_pin_write(LEDB_PIN, PIN_LOW); /* Set GPIO output 0 */ + rt_thread_mdelay(500); /* Delay 500mS */ + } +} +static void sw_pin_cb(void *args) +{ + rt_kprintf("sw pressed\r\n"); +} +#include "fsl_device_registers.h" // Device header +// end file +``` + + + +#### 2.3.3 源码解析 + +在原来的RTC例程上添加了闹钟示例函数: + `void alarm_sample(void)`:设置了RTC设备的时间,并创建了一个每秒触发一次的闹钟并且闪烁红色LED灯 + +编译上传后,调试结果如下 : + +![screenshot_image.png](Book_Picture/122c40e708b959b90803797161c10602.png.webp) + +可以正常设置时间,并且唤醒闹钟设置,闹钟响起后交替LED闪烁提醒。 + + + +## 3. 原文连接 + +原文连接:https://club.rt-thread.org/ask/article/7f188e83b235d064.html + +视频连接:https://www.bilibili.com/video/BV12z421y7Yt/ + + + +# **四、恩智浦FRDM-MCXN947上的ADC实践**(刘协泉) + +## 1. 开发环境 + +本章通过env环境配置 FRDM-MCXN947的ADC并实验,验证目前该平台上的adc功能支持情况。 + +> ENV环境 + +## 2. 步骤说明 + +### 2.1 下拉代码 + +```c +git clone https://github.com/RT-Thread/rt-thread.git rt-thread +``` + + + +### 2.2 配置项目 + +1. 切换到frdm-mcxn947工程目录 +2. 在env环境下右键单击鼠标,选择“ConEmu Here”。 +3. 打开ADC配置 + 1. 在弹出的env环境中输入“menuconfig”后按回车,弹出当前工程的配置界面 + 2. 切换到“HardWare Drivers Config” + 3. 切换到“On-Chip Peripheral Drivers” + 4. 选择“Enable ADC Channel” + 5. 从界面上看,目前板卡已经支持adc0_ch0, adc0_ch1, adc0_ch8, adc0_ch13, adc0_26 五路ADC口,但看pinmux.c中,目前实际配置的adc口为adc0_cha0 + 6. 将因此选中adc0_ch0后保存退出 + 7. 输入“scons —target=mdk5”后按回车重新生成工程 + +### 2.3 硬件连接 + +#### 2.3.1 adc通道硬件位置查询 + +通过查看驱动drv_adc.c代码,发现驱动实际使用的是ADC0_CHAx,而且大于14的通道会改为使用减去14的那个通道,因此实际通道为ADC0_CHA0 + +![screenshot_image.png](Book_Picture/488bee3e02e91cef7af5da244fcfc615.png) + +原理图中adc位置分布 + +![screenshot_image.png](Book_Picture/c55a6c10ce83387ae9a8c315b5db7157.png) + +![screenshot_image.png](Book_Picture/b54f737244f418f22ffdb662d9b1aa81.png.webp) + +#### 2.3.2 板卡位置 + +![screenshot_image.png](Book_Picture/be20544f145d826935b6f241422dee92.png.webp) + + + +### 2.4 编写测试程序 + +在application中添加测试文件adc_test.c,并编写如下代码 + +```C +#include +#define ADC_DEV_NAME "adc0" +#define REFER_VOLTAGE 3300 // max adc voltage is 3.3V +#define CONVERT_BITS (1 << 16) // 16bit adc0 +void adc_test(int argv, char **argc) { + rt_adc_device_t adc_dev; + rt_uint32_t value, vol; + rt_err_t ret = RT_EOK; + adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME); + if (adc_dev == RT_NULL) { + rt_kprintf("adc_test failed! can't find %s device!\n", ADC_DEV_NAME); + return; + } + ret = rt_adc_enable(adc_dev, 0); + while (1) { + value = rt_adc_read(adc_dev, 0); + vol = value * REFER_VOLTAGE / CONVERT_BITS; + rt_kprintf("the voltage is :[%d.%03d]V \n", vol / 1000, vol % 1000); + rt_thread_delay(2000); + } + return; +} +MSH_CMD_EXPORT(adc_test, ADC test) +``` + +编译后下载至开发板,在命令行中输入adc_test验证效果。 + + + +### 2.5 代码验证 + +预期效果: + J4的第2脚接到J3的第14脚时,读到的电压值在0V左右 + J4的第2脚接到J3的第4脚时,读到的电压值在3.3V左右 + +验证视频:[FDRM_MCXN947 ADC验证_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1ut421V7YG/?vd_source=e9c2364b7c6b169f3655235d47876c5a) + +由于代码涉及到提PR的部分,因此最终测试代码暂未上传,待PR结果确定后,将剩余的adc功能验证代码提交。代码路径:[oxlm/rt-thread at frdm-mcxn947 (github.com)](https://github.com/oxlm/rt-thread/tree/frdm-mcxn947) + + + +### 2.6 遇到的问题 + +#### 2.6.1 drv_adc.c代码未编到 + +原因: drv_adc.c中所有代码都被 #if defined(BSP_USING_ADC0) || defined(BSP_USING_ADC1) 包裹,但这两个宏并未定义 + 修复方法: + +1. 修改bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig +2. 重新运行menuconfig后保存 +3. 运行scons —target=mdk5重新生成工程 + +![screenshot_image.png](Book_Picture/2c8547a52f58d6b4dc8c201306757e31.png) + + + +#### 2.6.2 工程中缺少fsl_lpadc.c和fsl_spc.c + +原因:这两个文件并未被添加至编译链表中 + 修复方法:在 bsp/nxp/mcx/mcxn/Libraries/MCXN947/SConscript中添加以下两行代码 + +```c +src += ['MCXN947/drivers/fsl_lpadc.c'] +src += ['MCXN947/drivers/fsl_spc.c'] +``` + + + +#### 2.6.3 编译后adc0_ch0无功能 + +原因:管脚复用关系并未改到adc功能 + 修复方法:修改pin_mux.c,注释掉 FC2_P0 I2C_SDA并解除 ANA_0, ADC0_A0的注释 + +```c + PORT4->PCR[0] = PORT_PCR_MUX(0) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* ANA_0, ADC0_A0 */ + // PORT4->PCR[1] = PORT_PCR_MUX(0) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* ANA_1, ADC0_B0 */ + // PORT4->PCR[0] = PORT_PCR_MUX(2) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC2_P0 I2C_SDA */ + PORT4->PCR[1] = PORT_PCR_MUX(2) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC2_P1 I2C_SCL */ + +``` + + + +## 3. 原文连接 + +原文连接:https://club.rt-thread.org/ask/article/4c18786229c67767.html + + + +# **五、恩智浦FRDM-MCXN947上的DAC实践**(刘协泉) + +## 1. 开发环境 + +> ENV环境 + +## 2. 步骤说明 + +### 2.1 研究可行性 + +#### 2.1.1 RM中DAC管脚信息 + +![screenshot_image.png](Book_Picture/fdd55ec62ab7d5a2693ce944cd70f5f8.png) + +![screenshot_image.png](Book_Picture/52dee79b2627ba7119808b6a371421ca.png) + +![screenshot_image.png](Book_Picture/abb00720dfe52ce44164582ece18483d.png) + +#### 2.1.2 规格书中对应的引脚信息 + +![screenshot_image.png](Book_Picture/539e8434d8b76713f1b4dbe6b4e04727.png.webp) + +经过以上信息,可以判定可以给这个板子添加DAC驱动。 + +### 2.2 代码修改 + +#### 2.2.1 Kconfig中增加DAC相关配置 + +```c + menuconfig BSP_USING_DAC + config BSP_USING_DAC + bool "Enable DAC Channel" + select RT_USING_DAC + default y + if BSP_USING_DAC + config BSP_USING_DAC0 + bool "Enable DAC0 Channel" + default n + config BSP_USING_DAC1 + bool "Enable DAC1 Channel" + default n + config BSP_USING_DAC2 + bool "Enable DAC2 Channel" + default n + endif +``` + +#### 2.2.2 添加drv_dac.c文件 + +```c +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2024-03-24 Oxlm first version + */ +#include +#include +#include "fsl_dac.h" +#include "fsl_dac14.h" +#ifdef RT_USING_DAC +// #define DRV_DEBUG +#define DBG_TAG "drv.dac" +#ifdef DRV_DEBUG +#define DBG_LVL DBG_LOG +#else +#define DBG_LVL DBG_INFO +#endif /* DRV_DEBUG */ +#include +struct mcx_dac { + struct rt_dac_device mcxn_dac_device; + LPDAC_Type *dac_base; + clock_attach_id_t clock_attach_id; + clock_div_name_t clock_div_name; + uint8_t clock_div; + uint8_t referenceVoltageSource; /* kDAC_ReferenceVoltageSourceAlt1, VREFH reference pin */ + uint8_t SOC_CNTRL_BIT; + char *name; +}; +static struct mcx_dac mcx_dac_obj[] = { +#ifdef BSP_USING_DAC0 + { + .dac_base = DAC0, + .clock_attach_id = kFRO_HF_to_DAC0, + .clock_div_name = kCLOCK_DivDac0Clk, + .clock_div = 1u, + .referenceVoltageSource = kDAC_ReferenceVoltageSourceAlt1, + .SOC_CNTRL_BIT = 4, + .name = "dac0", + }, +#endif +#ifdef BSP_USING_DAC1 + { + .dac_base = DAC1, + .clock_attach_id = kFRO_HF_to_DAC1, + .clock_div_name = kCLOCK_DivDac1Clk, + .clock_div = 1u, + .referenceVoltageSource = kDAC_ReferenceVoltageSourceAlt1, + .SOC_CNTRL_BIT = 5, + .name = "dac1", + }, +#endif +#ifdef BSP_USING_DAC2 + { + .dac_base = DAC2, + .clock_attach_id = kFRO_HF_to_DAC2, + .clock_div_name = kCLOCK_DivDac2Clk, + .clock_div = 1u, + .referenceVoltageSource = kDAC_ReferenceVoltageSourceAlt1, + .SOC_CNTRL_BIT = 6, + .name = "dac2", + }, +#endif +}; +rt_err_t mcxn_dac_disabled(struct rt_dac_device *device, rt_uint32_t channel) { + RT_ASSERT(device != RT_NULL); + struct mcx_dac *dac = (struct mcx_dac *)device->parent.user_data; + if (dac->dac_base == DAC2) { + DAC14_Deinit(dac->dac_base); + } else { + DAC_Deinit(dac->dac_base); + } + return RT_EOK; +} +rt_err_t mcxn_dac_enabled(struct rt_dac_device *device, rt_uint32_t channel) { + RT_ASSERT(device != RT_NULL); + struct mcx_dac *dac = (struct mcx_dac *)device->parent.user_data; + dac_config_t dacConfigStruct; + dac14_config_t dac14ConfigStruct; + if (dac->dac_base == DAC2) { + DAC14_GetDefaultConfig(&dac14ConfigStruct); + dac14ConfigStruct.enableOpampBuffer = true; + dac14ConfigStruct.enableDAC = true; + DAC14_Init(dac->dac_base, &dac14ConfigStruct); + } else { + DAC_GetDefaultConfig(&dacConfigStruct); + dacConfigStruct.referenceVoltageSource = dac->referenceVoltageSource; + DAC_Init(dac->dac_base, &dacConfigStruct); + DAC_Enable(dac->dac_base, RT_TRUE); + } + return RT_EOK; +} +rt_err_t mcxn_dac_write(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value) { + RT_ASSERT(device != RT_NULL); + struct mcx_dac *dac = (struct mcx_dac *)device->parent.user_data; + if (dac->dac_base == DAC2) { + if (*value > 0x3FFFU) { + *value = 0x3FFFU; + } + DAC14_SetData(dac->dac_base, *value); + } else { + if (*value > 0xFFFU) { + *value = 0xFFFU; + } + DAC_SetData(dac->dac_base, *value); + } + return RT_EOK; +} +struct rt_dac_ops mcxn_dac_ops = { + .disabled = mcxn_dac_disabled, + .enabled = mcxn_dac_enabled, + .convert = mcxn_dac_write, +}; +static int mcxn_dac_init(void) { + int i; + int dac_num = sizeof(mcx_dac_obj) / sizeof(struct mcx_dac); + for (i = 0; i < dac_num; i++) { + CLOCK_SetClkDiv(mcx_dac_obj[i].clock_div_name, mcx_dac_obj[i].clock_div); + CLOCK_AttachClk(mcx_dac_obj[i].clock_attach_id); + SPC0->ACTIVE_CFG1 |= 0x01; // Enable VREF + SPC0->ACTIVE_CFG1 |= (0x01 << mcx_dac_obj[i].SOC_CNTRL_BIT); + if (RT_EOK != rt_hw_dac_register(&mcx_dac_obj[i].mcxn_dac_device, mcx_dac_obj[i].name, &mcxn_dac_ops, + (void *)(mcx_dac_obj + i))) { + LOG_E("%s register failed", mcx_dac_obj[i].name); + return -RT_ERROR; + } + } + return RT_EOK; +} +INIT_DEVICE_EXPORT(mcxn_dac_init); +#endif + +``` + + + +#### 2.2.3 将文件添加至编译工具链 + +在bsp\nxp\mcx\mcxn\Libraries\drivers\SConscript中添加以下信息 + +```c +if GetDepend('BSP_USING_DAC'): + src += ['drv_dac.c'] +``` + + + +#### 2.2.4 pin_mux.c中相关管脚的修改 + +注释掉dac0和dac1相关gpio配置,新增dac0和dac1配置 + +```c + /* DAC */ + PORT4->PCR[2] = PORT_PCR_MUX(0) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(0); /* DAC0 */ + PORT4->PCR[3] = PORT_PCR_MUX(0) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(0); /* DAC1 */ + /* MCX_RST UART */ + //PORT4->PCR[2] = PORT_PCR_MUX(2) | PORT_PCR_PS(0) | PORT_PCR_PE(1) | PORT_PCR_IBE(1); /* FC2_UART */ + //PORT4->PCR[3] = PORT_PCR_MUX(2) | PORT_PCR_PS(0) | PORT_PCR_PE(1) | PORT_PCR_IBE(1); /* FC2_UART */ + +``` + + + +### 2.3 项目配置 + +1. 在env中打开ADC0_A0,打开DAC2后保存 +2. 运行scons --target=mdk5重新生成工程 +3. 硬件中将DAC2跳接至adc0_a0 + +### 2.4 结果验证 + +```c + \ | / +- RT - Thread Operating System + / | \ 5.1.0 build Mar 24 2024 22:01:29 + 2006 - 2024 Copyright by RT-Thread team +using armclang, version: 6210000 +MCXN947 HelloWorld +msh >adc probe adc0 +probe adc0 success +msh >adc enable adc0 +adc0 channel 0 enables success +msh >adc read 0 +adc0 channel 0 read value is 0x000025F0 +msh >adc read 0 +adc0 channel 0 read value is 0x0000276B +msh >adc read 0 +adc0 channel 0 read value is 0x00002519 +msh >adc read 0 +adc0 channel 0 read value is 0x000026D0 +msh > +msh > +msh >dac probe dac2 +probe dac2 success +msh >dac enable dac2 +dac2 channel 0 enables success +msh >dac write 0 20 +dac2 channel 0 write value is 20 +msh >adc read 0 +adc0 channel 0 read value is 0x000000CE +msh >adc read 0 +adc0 channel 0 read value is 0x000000AF +msh >adc read 0 +adc0 channel 0 read value is 0x000000A4 +msh >dac write 0 10000 +dac2 channel 0 write value is 10000 +msh >adc read 0 +adc0 channel 0 read value is 0x00009BDA +msh > +``` + +DAC0和DAC1的验证省略,其最终结果和DAC2结果类似。 + +## 3. 原文连接 + +原文连接:https://club.rt-thread.org/ask/article/429cbc051f053397.html + + + + + +# **六、恩智浦FRDM-MCXN947上的FLSH实践**(齐衡) + +## 1. 开发环境 + +本次实践开发环境使用IAR,划分片上的2Mflash 资源0-1M留给rt-thread使用,1-2M 的空间用于适配MTD设备管理,并在此基础上适配littlefs文件系统用于管理flash空间,本次评测主要基于上述的3点来展开。 + +> IAR +> +> ENV + +## 2. 步骤说明 + +### 2.1 基于IAR9.50 运行RT-thread 系统 + +#### 2.1.1 创建 IAR 模板工程 + +我们从github 上拉取的最新的rt-thread 的nxp mcxn947的bsp 代码适配了gcc 和 keil5 的工程,暂时没有IAR的工程模板,我们添加IAR工程运行RT-thread 的标准版的最小系统。RT-thread 使用scons 来管理工程,如果要支持IAR 环境我们只要创建IAR 工程模板文件(template.ewp),模板文件只要设置mcu型号及使用的link文件的基本信息即可,使用scons 工具即可根据上述的模板文件生成IAR工程。 + + +![iar_temp1.jpg](Book_Picture/e5ea6f78bf2fcfdbd323538ec96c5e2e.jpg.webp) + + + +在link 路径下选择如下link file + +```c +$PROJ_DIR$\board\linker_scripts\MCXN947_cm33_core0_flash.icf +``` + + + +![iar_temp2.jpg](Book_Picture/cdf64c79486ebab348d4d3a93ebb6777.jpg.webp) + +模板文件只要配置cpu信息及link路径即可。 + + + +#### 2.1.2 生成IAR工程 + +配置好上面的工程模板后,使用env工具在bsp 目录下执行menuconfig 命令更新config,之后使用scons —target=iar 就会自动生成IAR 工程。 + 执行完会在bsp目录下生成如下IAR工程配置文件。 + +```c + bsp/nxp/mcx/mcxn/frdm-mcxn947/project.ewp + bsp/nxp/mcx/mcxn/frdm-mcxn947/project.eww + bsp/nxp/mcx/mcxn/frdm-mcxn947/template.ewp +``` + +使用IAR 打开上述生成的 project.eww workspace 文件,scons 生成的工程内已经包含了rt-thread 标准版的最小系统文件了。 + +![iar_project.jpg](Book_Picture/b3d6b59d47659117cf3a1e7e75e560fa.jpg) + +IAR 工程生成完毕后,编译发现会有如下的编译错误。 + +![iar_error.jpg](Book_Picture/5a65dedfd57d652b56af450f161fdf73.jpg) + +错误的原因为RT-thread 设置了使用堆空间,修改board.h文件内IAR 堆地址配置即可,修改如下。 + +```c +--- a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.h ++++ b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.h +@@ -36,9 +36,8 @@ extern int Image$$ARM_LIB_STACK$$ZI$$Base; + #define HEAP_END ((void*)&Image$$ARM_LIB_STACK$$ZI$$Base) + #elif defined(__ICCARM__) + #pragma section="HEAP" +-#define HEAP_BEGIN (__segment_end("HEAP")) +-extern void __RTT_HEAP_END; +-#define HEAP_END (&__RTT_HEAP_END) ++#define HEAP_BEGIN (__section_begin("HEAP")) ++#define HEAP_END (__section_end("HEAP")) + #elif defined(__GNUC__) + extern int __HeapBase; + extern int __HeapLimit; + +``` + +修改以上配置后将程序下载到板子内运行会输出RTT标志性的开机log,串口也可以正常响应输入命令,至此RT-thread 基于IAR 的最小系统已经运行起来。 + +```c +sram heap, begin: 0x0x04001868, end: 0x0x04003868 + \ | / +- RT - Thread Operating System + / | \ 5.1.0 build Mar 21 2024 21:19:14 + 2006 - 2024 Copyright by RT-Thread team +using iccarm, version: 9050001 +MCXN947 HelloWorld +msh > + +``` + + + +### 2.2 使用内部flash适配MTD NOR 设备驱动 + +RT-thread 将常用的存储设备抽象成MTD(Memory Technology Device)设备驱动,MCXN947 的片内有2M的NOR flash,大部分都是空闲未使用状态,本次试验将使用后1M进行验证将这部分flash 通过RT-thread 的MTD nor 设备进行管理 + +#### 2.2.1 添加flash驱动文件 + +默认的link 文件是将所有的flash 空间划分给用户使用的,我们更新link 文件保留后1M的空间用于MTD设备驱动管理,最终交给文件系统管理,按照如下修改方式释放后1M的空间不使用。 + +```c +--- a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/linker_scripts/MCXN947_cm33_core0_flash.icf ++++ b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/linker_scripts/MCXN947_cm33_core0_flash.icf + if (isdefinedsymbol(__qspi_xip__)) { +@@ -84,8 +84,7 @@ if (isdefinedsymbol(__qspi_xip__)) { + | mem:[from m_text_start to m_text_end]; + } else { + define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end] +- | mem:[from m_text_start to m_text_end] +- | mem:[from m_flash1_start to m_flash1_end]; ++ | mem:[from m_text_start to m_text_end];^M + } + define region DATA_region = mem:[from m_data_start to m_data_end-__size_cstack__] + | mem:[from m_sramx_start to m_sramx_end]; + +``` + +MTD NOR 设备通过结构体struct rt_mtd_nor_device 进行管理,包含了设备基类结构体,Flash 块大小,块起始地址,块结束地址,以及NOR 设备操作方法,定义如下: + +```c +struct rt_mtd_nor_device +{ + struct rt_device parent; + rt_uint32_t block_size; /* The Block size in the flash */ + rt_uint32_t block_start; /* The start of available block*/ + rt_uint32_t block_end; /* The end of available block */ + /* operations interface */ + const struct rt_mtd_nor_driver_ops* ops; +}; +struct rt_mtd_nor_driver_ops +{ + rt_err_t (*read_id) (struct rt_mtd_nor_device* device); + rt_ssize_t (*read) (struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint8_t* data, rt_size_t length); + rt_ssize_t (*write) (struct rt_mtd_nor_device* device, rt_off_t offset, const rt_uint8_t* data, rt_size_t length); + rt_err_t (*erase_block)(struct rt_mtd_nor_device* device, rt_off_t offset, rt_size_t length); +}; +``` + +以上配置信息主要包括nor flash 的每个block 的大小及起始块和结束块已经nor flash 分读id,读/写及块擦除的ops 信息,rt-thread 系统内已经集成了nor flash 的驱动框架,我们只要填充好上述结构体注册到系统内部即完成了rt-thread 的nor flash驱动适配。 + +我们要实现内部flash 的读写擦除接口,需要使用nxp的flash 驱动文件fsl_flash.c,该文件现在的bsp是美有集成到工程内部的,我们需要修改/bsp/nxp/mcx/mcxn/Libraries/MCXN947/SConscript 脚本文件添加驱动文件即对应的文件include路径,对应修改如下: + +```c +diff --git a/bsp/nxp/mcx/mcxn/Libraries/MCXN947/SConscript b/bsp/nxp/mcx/mcxn/Libraries/MCXN947/SConscript +index 9b806287b..021ffca28 100644 +--- a/bsp/nxp/mcx/mcxn/Libraries/MCXN947/SConscript ++++ b/bsp/nxp/mcx/mcxn/Libraries/MCXN947/SConscript +@@ -2,7 +2,7 @@ Import('rtconfig') + from building import * + cwd = GetCurrentDir() +-path = [cwd + '/../CMSIS/Core/Include',cwd + '/components/codec', cwd + '/MCXN947', cwd + '/MCXN947/drivers', cwd + '/middleware/sdmmc/inc', cwd + '/middleware/sdmmc/port'] ++path = [cwd + '/../CMSIS/Core/Include',cwd + '/components/codec', cwd + '/MCXN947', cwd + '/MCXN947/drivers', cwd + '/middleware/sdmmc/inc', cwd + '/middleware/sdmmc/port', cwd + '/MCXN947/drivers/romapi/flash/'] + src = Split(''' + MCXN947/system_MCXN947_cm33_core0.c + ''') +@@ -58,6 +58,7 @@ src += ['MCXN947/drivers/fsl_mrt.c'] + src += ['MCXN947/drivers/fsl_reset.c'] + src += ['MCXN947/drivers/fsl_vref.c'] + src += ['MCXN947/drivers/fsl_usdhc.c'] ++src += ['MCXN947/drivers/romapi/flash/src/fsl_flash.c'] + group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path) +``` + +更新配置脚本文件后,env下使用scons —target=iar命令更新IAR工程,重新生成的IAR工程里已经包含了flash 驱动文件了。 + + + +#### 2.2.2 适配MTD设备驱动 + +添加完依赖的驱动文件后,我们基于sdk的flash驱动文件适配MTD NOR 设备驱动需要底层适配的接口及参数配置。 + +使用fsl_flash.c 驱动库适配mtd nor flash read函数: + +```c +rt_ssize_t mflash_read(struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint8_t* data, rt_size_t length) +{ + uint32_t dest; + struct mflash_mtd * p_mflash_mtd = (struct mflash_mtd *)device; + dest = p_mflash_mtd->mflash_start + offset; + if((dest + length) > (device->block_end*device->block_size)) + return 0; + for(uint32_t i=0; i < length; i++) + { + data[i] = *((__IO rt_uint8_t*)dest); + dest++; + } + return length; +} + +``` + + + +使用fsl_flash.c 驱动库适配mtd nor flash write函数: + +```c +static flash_config_t g_flash_instance = {0}; +static uint32_t g_pflashBlockBase = 0; +static uint32_t g_pflashTotalSize = 0; +static uint32_t g_pflashSectorSize = 0; +static uint32_t g_pflashPageSize = 0; +struct mflash_mtd +{ + struct rt_mtd_nor_device mtd_device; + struct rt_mutex lock; + uint32_t mflash_start; + uint8_t page_size; + void * user_data; +}; +rt_ssize_t mlash_write(struct rt_mtd_nor_device* device, rt_off_t offset, const rt_uint8_t* data, rt_size_t length) +{ + status_t ret; + uint32_t dest; + struct mflash_mtd * p_mflash_mtd = (struct mflash_mtd *)device; + dest = p_mflash_mtd->mflash_start + offset; + if((dest + length) > (device->block_end*device->block_size)) + return 0; + for(uint32_t i = 0;i < length; i += 128) + { + ret = FLASH_Program(&g_flash_instance, dest, (uint8_t *)data, 128); + if(ret != kStatus_Success) + break; + } + return ret == kStatus_Success ? length : 0; +} + +``` + + + +使用fsl_flash.c 驱动库适配mtd nor flash erase函数: + +```c +rt_err_t mflash_erase_block(struct rt_mtd_nor_device* device, rt_off_t offset, rt_size_t length) +{ + status_t ret; + uint32_t addr; + struct mflash_mtd * p_mflash_mtd = (struct mflash_mtd *)device; + addr = p_mflash_mtd->mflash_start + offset; + ret = FLASH_Erase(&g_flash_instance, addr, FSL_FEATURE_SYSCON_FLASH_SECTOR_SIZE_BYTES, kFLASH_ApiEraseKey); + return ret == kStatus_Success ? RT_EOK : -1; +} + + +``` + + + +添加接口在driver 初始化阶段调用flash 初始化处理,配置flashblock信息,向系统注册mtd nor flash驱动 + +```c +int rt_hw_mflash_init(void) +{ + static struct mflash_mtd mflash; + mflash.mtd_device.ops = &mflash_ops; + mflash.mtd_device.block_size = FSL_FEATURE_SYSCON_FLASH_SECTOR_SIZE_BYTES; + mflash.mtd_device.block_start = 128; + mflash.mtd_device.block_end = 255; + mflash.mflash_start = 0x100000; + mflash.page_size = 128; + status_t result; + result = FLASH_Init(&g_flash_instance); + if (result != kStatus_Success) + return result; + result = FLASH_GetProperty(&g_flash_instance, kFLASH_PropertyPflashBlockBaseAddr, &g_pflashBlockBase); + if (result != kStatus_Success) + return result; + result = FLASH_GetProperty(&g_flash_instance, kFLASH_PropertyPflashSectorSize, &g_pflashSectorSize); + if (result != kStatus_Success) + return result; + result = FLASH_GetProperty(&g_flash_instance, kFLASH_PropertyPflashTotalSize, &g_pflashTotalSize); + if (result != kStatus_Success) + return result; + result = FLASH_GetProperty(&g_flash_instance, kFLASH_PropertyPflashPageSize, &g_pflashPageSize); + rt_mtd_nor_register_device("mflash",&mflash.mtd_device); + return RT_EOK; +} +INIT_DEVICE_EXPORT(rt_hw_mflash_init); + +``` + + + +flash 驱动依赖了mtd nor 驱动框架,在kconfig 文件内追加配置项目将mtd nor 驱动框架加入工程编译。 + +```c +diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig +index 673c8da05..dd170b531 100644 +--- a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig ++++ b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig +@@ -19,6 +19,10 @@ menu "On-chip Peripheral Drivers" + select RT_USING_PIN + default y ++config BSP_USING_MFLASH ++ select RT_USING_MTD_NOR ++ bool "Using mcxn947 mflash driver" ++ default n + menuconfig BSP_USING_UART + bool "Enable UART" + default y + +``` + +然后在env 环境下使能BSP_USING_MFLASH 配置,并更新工程,此时mtd nor设备驱动就被加载到工程内部了。 + +![mflash.jpg](Book_Picture/8cadf6b1d3d3ea9bf385fce20b66c525.jpg.webp) + +烧写后输入list device 命令可以看到MTD 驱动已经被注册到系统内部了。 + +```c +msh >list device +device type ref count +-------- -------------------- ---------- +mflash MTD Device 0 +pin Pin Device 0 +uart5 Character Device 0 +uart4 Character Device 2 +uart2 Character Device 0 + +``` + +我们继续添加mflash 测试代码验证mtd 驱动接口,open 用于打开设备获取driver handler,write/read 分别用于读写flash 验证。 + +```c +static void mflash(int argc,char *argv[]) +{ + static rt_device_t mtd = RT_NULL; + if(!strcmp(argv[1], "open")) + { + mtd = rt_device_find("mflash"); + if(!mtd) + rt_kprintf("rt find device failed.\n"); + else + rt_kprintf("rt find device ok.\n"); + } + else if(!strcmp(argv[1], "erase")) + { + rt_mtd_nor_erase_block((struct rt_mtd_nor_device*)mtd,0x00,8192); + } + else if(!strcmp(argv[1], "write")) + { + char * writetest = " hello world "; + rt_mtd_nor_write((struct rt_mtd_nor_device*)mtd,0,writetest,16); + } + else if(!strcmp(argv[1], "read")) + { + char readbuff[16]; + rt_mtd_nor_read((struct rt_mtd_nor_device*)mtd,0,readbuff,16); + rt_kprintf("read test data is %s \n",readbuff); + } +} +MSH_CMD_EXPORT(mflash, mflash mtd test); + +``` + +使用上面的测试命令输入mflash open、mflash write,mflash read 进行写入回读验证,测试命令写入的 +“ hello world “字符串已经被正常的读取回来了。至此mtd的精简驱动基本适配完成,上述的驱动程序没有适配多任务并发访问及输入参数的检查,只是作为基本验证驱动来使用。 + +```c +msh >mflash open +rt find device ok. +msh >mfl +mflash +msh >mflash write +msh >mf +mflash +msh >mflash read +read test data is hello world +msh > +``` + + + +### 2.3 对接flash驱动适配littlefs文件系统 + +适配好了MTD NOR 驱动程序后,我们可以对接文件系统,使用文件系统来管理flash设备,littlefs 我们可以使用rt-thread 的软件包开启,开启后配置flash参数即可,具体配置如下: + + + +![littlefs.jpg](Book_Picture/8eee1322b5a984769b151f959614a278.jpg.webp) + + + +使用littlefs 需要依赖DFS我们在menuconfig 内开启DFS配置。 + +![dfs.jpg](Book_Picture/8d5920d3f58479542b8b84219e2005d0.jpg.webp) + + + +保存配置后env下使用 pkgs —update 命令更新littlefs软件包,并使用scons重新生成iar 工程。 + +```c +$ pkgs --update +[Use Gitee server] +Cloning into 'D:\work\rt_thread_master\rt-thread\bsp\nxp\mcx\mcxn\frdm-mcxn947\packages\rt_vsnprintf_full-latest'... +remote: Enumerating objects: 106, done. +remote: Counting objects: 100% (21/21), done. +remote: Compressing objects: 100% (21/21), done. +remote: Total 106 (delta 11), reused 0 (delta 0), pack-reused 85 +Receiving objects: 100% (106/106), 158.16 KiB | 834.00 KiB/s, done. +Resolving deltas: 100% (41/41), done. +==============================> RT_VSNPRINTF_FULL latest is downloaded successfully. +Cloning into 'D:\work\rt_thread_master\rt-thread\bsp\nxp\mcx\mcxn\frdm-mcxn947\packages\littlefs-latest'... +remote: Enumerating objects: 3089, done. +remote: Counting objects: 100% (3/3), done. +remote: Compressing objects: 100% (3/3), done. +remote: Total 3089 (delta 0), reused 0 (delta 0), pack-reused 3086Receiving objects: 99% (3059/3089), 1.11 MiB | 1.09 MiB/ +Receiving objects: 100% (3089/3089), 1.36 MiB | 1.17 MiB/s, done. +Resolving deltas: 100% (2148/2148), done. +==============================> LITTLEFS latest is downloaded successfully. +==============================> rt_vsnprintf_full update done +==============================> littlefs update done +Operation completed successfully. +``` + + + +编译工程后发现会有如下编译错误,错误原因是littlefs 的接口参数和dfs 定义的有差异,我们按照dfs 的参数修改即可。 + +![littlefs_error.jpg](Book_Picture/5883a44c1f7939487c3d34785be741d2.jpg.webp) + +修改如下: + +![fix_error.jpg](Book_Picture/b8fbb3c46be855a58f4ba5f60916323a.jpg.webp) + +修改后我们在启动过程中添加如下代码挂载文件系统。 + +```c +#if defined(BSP_USING_MFLASH) && defined(PKG_USING_LITTLEFS) +#include +#include +#define DBG_TAG "app.filesystem" +#define DBG_LVL DBG_INFO +#include +static int littlefs_mount(void) +{ + if(rt_device_find("mflash") == RT_NULL) + { + return -RT_EIO; + } + int ret = dfs_mount("mflash", "/", "lfs", 0, 0); + if (ret != 0) + { + rt_kprintf("ret: %d\n",ret); + LOG_E("mflash mount to '/' failed!"); + ret = dfs_mkfs("lfs","mflash"); + if(ret != 0) + return ret; + ret = dfs_mount("mflash", "/", "lfs", 0, 0); + if(ret != 0) + return ret; + } + return RT_EOK; +} +INIT_ENV_EXPORT(littlefs_mount); +#endif + +``` + +启动运行系统内已经集成了文件系统相关的测试命令,简单测试了下文件创建写入,及文件夹创建都是ok的,df 命令也能看到当前文件系统的剩余空间,说明基于内部flash的littlefs 已经正常工作了。 + +![littlefs.gif](Book_Picture/6214a67be9c5284678d6486ed1c09732.gif) + + + +### 2.4 文件系统功能验证 + +#### 2.4.1 使用ulog 功能组件 + +RTT 的ulog组件可以方便的把前端的log 和 后端的物理设备(uart/flash/fs)对接起来,官方的文档说明有详细的说明ulog日志,FRDM-MCXN947 默认ulog是开启的,只是对接的设备是console,我们基于本次适配的littlefs 将ulog 输出对接到littlefs 来验证文件系统的存储功能。 + env 环境开启ulog 后端设备为文件。 + +![ulog.png](Book_Picture/59c2ff89ebfa9399929ba962c4cb187d.png.webp) + +#### 2.4.2 测试验证ulog写入文件功能 + +env 下开启log 写入文件后,重新生成IAR工程后,我们就可以基于此基础上添加如下测试代码,王文件系统循环50次写入测试数据,对应测试代码如下: + +```c +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-08-02 armink the first version + */ +#include +#include +#ifndef ULOG_USING_SYSLOG +#define LOG_TAG "example" +#define LOG_LVL LOG_LVL_DBG +#include +#else +#include +#endif /* ULOG_USING_SYSLOG */ +#include +/* +* 后端注册表 +*/ +struct _log_file +{ + const char *name; //文件名 + ulog_backend_t backend; + struct ulog_file_be *file_be; + const char *dir_path; //保存路径 + rt_size_t max_num; //保存最大文件数量 + rt_size_t max_size; //保存最大文件大小 + rt_size_t buf_size; //文件保存缓存大小 +}; +/* +* 文件后端标识 +*/ +typedef enum +{ + console_id, + sys_id, + motion_id, +}ulog_file_be_name; +#define ROOT_PATH "/" //设置保存路径 +#define FILE_SIZE 5 * 1024 //设置单个文件大小 +#define BUFF_SIZE 512 //设备缓存区大小 +static struct ulog_backend sys_log_backend; +static struct ulog_file_be sys_log_file; +static struct _log_file table[] = +{ + {"sys" ,&sys_log_backend,&sys_log_file,ROOT_PATH,10,FILE_SIZE,BUFF_SIZE}, +}; +/* Private function prototypes -----------------------------------------------*/ +/** + * @brief 系统日志文件后端初始化. + * @param None. + * @retval None. + * @note None. +*/ +void sys_log_file_backend_init(void) +{ + struct ulog_file_be *file_be = &sys_log_file; + uint8_t id = 0; + file_be->parent = sys_log_backend; + ulog_file_backend_init( file_be, + table[id].name, + table[id].dir_path, + table[id].max_num, + table[id].max_size, + table[id].buf_size); + ulog_file_backend_enable(file_be); //必须使能才能有效 +} +void ulog_example(void) +{ + int count = 0; + sys_log_file_backend_init(); +#ifdef ULOG_USING_SYSLOG + openlog("example1", 0, 0); +#endif + while (count++ < 50) + { +#ifndef ULOG_USING_SYSLOG + /* output different level log by LOG_X API */ + LOG_D("LOG_D(%d): RT-Thread is an open source IoT operating system from China.", count); + LOG_I("LOG_I(%d): RT-Thread is an open source IoT operating system from China.", count); + LOG_W("LOG_W(%d): RT-Thread is an open source IoT operating system from China.", count); + LOG_E("LOG_E(%d): RT-Thread is an open source IoT operating system from China.", count); + ulog_d("test", "ulog_d(%d): RT-Thread is an open source IoT operating system from China.", count); + ulog_i("test", "ulog_i(%d): RT-Thread is an open source IoT operating system from China.", count); + ulog_w("test", "ulog_w(%d): RT-Thread is an open source IoT operating system from China.", count); + ulog_e("test", "ulog_e(%d): RT-Thread is an open source IoT operating system from China.", count); +#ifdef ULOG_USING_FILTER + if (count == 20) + { + /* Set the global filer level is INFO. All of DEBUG log will stop output */ + ulog_global_filter_lvl_set(LOG_LVL_INFO); + /* Set the test tag's level filter's level is ERROR. The DEBUG, INFO, WARNING log will stop output. */ + ulog_tag_lvl_filter_set("test", LOG_LVL_ERROR); + } + else if (count == 30) + { + /* Set the example tag's level filter's level is LOG_FILTER_LVL_SILENT, the log enter silent mode. */ + ulog_tag_lvl_filter_set("example", LOG_FILTER_LVL_SILENT); + /* Set the test tag's level filter's level is WARNING. The DEBUG, INFO log will stop output. */ + ulog_tag_lvl_filter_set("test", LOG_LVL_WARNING); + } + else if (count == 40) + { + /* Set the test tag's level filter's level is LOG_FILTER_LVL_ALL. All level log will resume output. */ + ulog_tag_lvl_filter_set("test", LOG_FILTER_LVL_ALL); + /* Set the global filer level is LOG_FILTER_LVL_ALL. All level log will resume output */ + ulog_global_filter_lvl_set(LOG_FILTER_LVL_ALL); + } +#endif /* ULOG_USING_FILTER */ +#else + /* output different priority log by syslog API */ + syslog(LOG_INFO, "syslog(%d) LOG_INFO: RT-Thread is an open source IoT operating system from China.", count); + syslog(LOG_DEBUG, "syslog(%d) LOG_DEBUG: RT-Thread is an open source IoT operating system from China.", count); + syslog(LOG_WARNING, "syslog(%d) LOG_WARNING: RT-Thread is an open source IoT operating system from China.", count); + syslog(LOG_ERR, "syslog(%d) LOG_ERR: RT-Thread is an open source IoT operating system from China.", count); + syslog(LOG_INFO | LOG_MAIL, "syslog(%d) LOG_INFO | LOG_MAIL: RT-Thread is an open source IoT operating system from China.", count); + syslog(LOG_DEBUG | LOG_DAEMON, "syslog(%d) LOG_DEBUG | LOG_DAEMON: RT-Thread is an open source IoT operating system from China.", count); + syslog(LOG_WARNING | LOG_AUTH, "syslog(%d) LOG_WARNING | LOG_AUTH: RT-Thread is an open source IoT operating system from China.", count); + syslog(LOG_ERR | LOG_SYSLOG, "syslog(%d) LOG_ERR | LOG_SYSLOG: RT-Thread is an open source IoT operating system from China.", count); + if (count == 20) + { + /* Set log priority mask. Only output ERR and WARNING log. */ + setlogmask(LOG_MASK(LOG_ERR) | LOG_MASK(LOG_WARNING)); + } + else if (count == 40) + { + /* Set log priority mask. The log which level is less than ERROR will stop output. */ + setlogmask(LOG_UPTO(LOG_ERR)); + } +#endif /* ULOG_USING_SYSLOG */ + rt_thread_delay(rt_tick_from_millisecond(rand() % 1000)); + } +} +MSH_CMD_EXPORT(ulog_example, run ulog example) +``` + +使用上述测试代码集成的ulog_example 命令进行验证,发现运行后发现文件系统内会有对应的日志文件。 + 使用cat 命令读取的内容和输出的保持一致。 + +![20240326-125332.gif](Book_Picture/9598fc4fa59d8d85d32ff55412b863b5.gif) + + + +### 2.5 Flash实践--W25Q64 + +板子上片外挂载了一颗W25Q64 的norflash,该flash 可以支持xip 启动运行,本次试验在前面叙述的基础上,适配片外的flah 驱动至MTD NOR设备,并挂载至littlefs文件系统验证flash驱动。 + +#### 2.5.1 适配NOR flash驱动 + +从板子的原理图可以看出,W25Q64 芯片通过flexspi和mcu连接。 + +![19675.jpg](Book_Picture/7aaacf775085293092d90a7f490678d7.jpg) + +根据上一篇的littlefs 适配物理层设备主要依赖需要flash 的write/read/erase 三个函数,我们记忆此基础上实现W25Q64的操作函数实现和littlefs的对接。 + +- pinmux初始化 + /bsp/nxp/mcx/mcxn/frdm-mcxn947/board/MCUX_Config/board/pin_mux.c BOARD_InitBootPins(void) 函数内追加pin脚初始化。 + + ```c + diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/MCUX_Config/board/pin_mux.c b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/MCUX_Config/board/pin_mux.c + index 392a3ef26b..38d5a3900d 100644 + --- a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/MCUX_Config/board/pin_mux.c + +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/MCUX_Config/board/pin_mux.c + @@ -149,6 +149,259 @@ void BOARD_InitBootPins(void) + PORT1->PCR[5] = PORT_PCR_MUX(9) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* ENET0_TXEN */ + PORT1->PCR[6] = PORT_PCR_MUX(9) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* ENET0_TXD0 */ + PORT1->PCR[7] = PORT_PCR_MUX(9) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* ENET0_TXD1 */ + + /* OSPI */ + + const port_pin_config_t port3_0_pinB17_config = {/* Internal pull-up/down resistor is disabled */ + + kPORT_PullDisable, + + /* Low internal pull resistor value is selected. */ + + kPORT_LowPullResistor, + + /* Fast slew rate is configured */ + + kPORT_FastSlewRate, + + /* Passive input filter is disabled */ + + kPORT_PassiveFilterDisable, + + /* Open drain output is disabled */ + + kPORT_OpenDrainDisable, + + /* Low drive strength is configured */ + + kPORT_LowDriveStrength, + + /* Pin is configured as FLEXSPI0_A_SS0_b */ + + kPORT_MuxAlt8, + + /* Digital input enabled */ + + kPORT_InputBufferEnable, + + /* Digital input is not inverted */ + + kPORT_InputNormal, + + /* Pin Control Register fields [15:0] are not locked */ + + kPORT_UnlockRegister}; + + /* PORT3_0 (pin B17) is configured as FLEXSPI0_A_SS0_b */ + + PORT_SetPinConfig(PORT3, 0U, &port3_0_pinB17_config); + + + + const port_pin_config_t port3_10_pinF17_config = {/* Internal pull-up resistor is enabled */ + + kPORT_PullUp, + + /* Low internal pull resistor value is selected. */ + + kPORT_LowPullResistor, + + /* Fast slew rate is configured */ + + kPORT_FastSlewRate, + + /* Passive input filter is disabled */ + + kPORT_PassiveFilterDisable, + + /* Open drain output is disabled */ + + kPORT_OpenDrainDisable, + + /* Low drive strength is configured */ + + kPORT_LowDriveStrength, + + /* Pin is configured as FLEXSPI0_A_DATA2 */ + + kPORT_MuxAlt8, + + /* Digital input enabled */ + + kPORT_InputBufferEnable, + + /* Digital input is not inverted */ + + kPORT_InputNormal, + + /* Pin Control Register fields [15:0] are not locked */ + + kPORT_UnlockRegister}; + + /* PORT3_10 (pin F17) is configured as FLEXSPI0_A_DATA2 */ + + PORT_SetPinConfig(PORT3, 10U, &port3_10_pinF17_config); + + + + const port_pin_config_t port3_11_pinF16_config = {/* Internal pull-up resistor is enabled */ + + kPORT_PullUp, + + /* Low internal pull resistor value is selected. */ + + kPORT_LowPullResistor, + + /* Fast slew rate is configured */ + + kPORT_FastSlewRate, + + /* Passive input filter is disabled */ + + kPORT_PassiveFilterDisable, + + /* Open drain output is disabled */ + + kPORT_OpenDrainDisable, + + /* Low drive strength is configured */ + + kPORT_LowDriveStrength, + + /* Pin is configured as FLEXSPI0_A_DATA3 */ + + kPORT_MuxAlt8, + + /* Digital input enabled */ + + kPORT_InputBufferEnable, + + /* Digital input is not inverted */ + + kPORT_InputNormal, + + /* Pin Control Register fields [15:0] are not locked */ + + kPORT_UnlockRegister}; + + /* PORT3_11 (pin F16) is configured as FLEXSPI0_A_DATA3 */ + + PORT_SetPinConfig(PORT3, 11U, &port3_11_pinF16_config); + + + + const port_pin_config_t port3_12_pinG16_config = {/* Internal pull-up/down resistor is disabled */ + + kPORT_PullDisable, + + /* Low internal pull resistor value is selected. */ + + kPORT_LowPullResistor, + + /* Fast slew rate is configured */ + + kPORT_FastSlewRate, + + /* Passive input filter is disabled */ + + kPORT_PassiveFilterDisable, + + /* Open drain output is disabled */ + + kPORT_OpenDrainDisable, + + /* Low drive strength is configured */ + + kPORT_LowDriveStrength, + + /* Pin is configured as FLEXSPI0_A_DATA4 */ + + kPORT_MuxAlt8, + + /* Digital input enabled */ + + kPORT_InputBufferEnable, + + /* Digital input is not inverted */ + + kPORT_InputNormal, + + /* Pin Control Register fields [15:0] are not locked */ + + kPORT_UnlockRegister}; + + /* PORT3_12 (pin G16) is configured as FLEXSPI0_A_DATA4 */ + + PORT_SetPinConfig(PORT3, 12U, &port3_12_pinG16_config); + + + + const port_pin_config_t port3_13_pinH16_config = {/* Internal pull-up/down resistor is disabled */ + + kPORT_PullDisable, + + /* Low internal pull resistor value is selected. */ + + kPORT_LowPullResistor, + + /* Fast slew rate is configured */ + + kPORT_FastSlewRate, + + /* Passive input filter is disabled */ + + kPORT_PassiveFilterDisable, + + /* Open drain output is disabled */ + + kPORT_OpenDrainDisable, + + /* Low drive strength is configured */ + + kPORT_LowDriveStrength, + + /* Pin is configured as FLEXSPI0_A_DATA5 */ + + kPORT_MuxAlt8, + + /* Digital input enabled */ + + kPORT_InputBufferEnable, + + /* Digital input is not inverted */ + + kPORT_InputNormal, + + /* Pin Control Register fields [15:0] are not locked */ + + kPORT_UnlockRegister}; + + /* PORT3_13 (pin H16) is configured as FLEXSPI0_A_DATA5 */ + + PORT_SetPinConfig(PORT3, 13U, &port3_13_pinH16_config); + + + + const port_pin_config_t port3_14_pinH17_config = {/* Internal pull-up/down resistor is disabled */ + + kPORT_PullDisable, + + /* Low internal pull resistor value is selected. */ + + kPORT_LowPullResistor, + + /* Fast slew rate is configured */ + + kPORT_FastSlewRate, + + /* Passive input filter is disabled */ + + kPORT_PassiveFilterDisable, + + /* Open drain output is disabled */ + + kPORT_OpenDrainDisable, + + /* Low drive strength is configured */ + + kPORT_LowDriveStrength, + + /* Pin is configured as FLEXSPI0_A_DATA6 */ + + kPORT_MuxAlt8, + + /* Digital input enabled */ + + kPORT_InputBufferEnable, + + /* Digital input is not inverted */ + + kPORT_InputNormal, + + /* Pin Control Register fields [15:0] are not locked */ + + kPORT_UnlockRegister}; + + /* PORT3_14 (pin H17) is configured as FLEXSPI0_A_DATA6 */ + + PORT_SetPinConfig(PORT3, 14U, &port3_14_pinH17_config); + + + + const port_pin_config_t port3_15_pinH15_config = {/* Internal pull-up/down resistor is disabled */ + + kPORT_PullDisable, + + /* Low internal pull resistor value is selected. */ + + kPORT_LowPullResistor, + + /* Fast slew rate is configured */ + + kPORT_FastSlewRate, + + /* Passive input filter is disabled */ + + kPORT_PassiveFilterDisable, + + /* Open drain output is disabled */ + + kPORT_OpenDrainDisable, + + /* Low drive strength is configured */ + + kPORT_LowDriveStrength, + + /* Pin is configured as FLEXSPI0_A_DATA7 */ + + kPORT_MuxAlt8, + + /* Digital input enabled */ + + kPORT_InputBufferEnable, + + /* Digital input is not inverted */ + + kPORT_InputNormal, + + /* Pin Control Register fields [15:0] are not locked */ + + kPORT_UnlockRegister}; + + /* PORT3_15 (pin H15) is configured as FLEXSPI0_A_DATA7 */ + + PORT_SetPinConfig(PORT3, 15U, &port3_15_pinH15_config); + + + + const port_pin_config_t port3_6_pinD17_config = {/* Internal pull-up/down resistor is disabled */ + + kPORT_PullDisable, + + /* Low internal pull resistor value is selected. */ + + kPORT_LowPullResistor, + + /* Fast slew rate is configured */ + + kPORT_FastSlewRate, + + /* Passive input filter is disabled */ + + kPORT_PassiveFilterDisable, + + /* Open drain output is disabled */ + + kPORT_OpenDrainDisable, + + /* Low drive strength is configured */ + + kPORT_LowDriveStrength, + + /* Pin is configured as FLEXSPI0_A_DQS */ + + kPORT_MuxAlt8, + + /* Digital input enabled */ + + kPORT_InputBufferEnable, + + /* Digital input is not inverted */ + + kPORT_InputNormal, + + /* Pin Control Register fields [15:0] are not locked */ + + kPORT_UnlockRegister}; + + /* PORT3_6 (pin D17) is configured as FLEXSPI0_A_DQS */ + + PORT_SetPinConfig(PORT3, 6U, &port3_6_pinD17_config); + + + + const port_pin_config_t port3_7_pinD14_config = {/* Internal pull-up/down resistor is disabled */ + + kPORT_PullDisable, + + /* Low internal pull resistor value is selected. */ + + kPORT_LowPullResistor, + + /* Fast slew rate is configured */ + + kPORT_FastSlewRate, + + /* Passive input filter is disabled */ + + kPORT_PassiveFilterDisable, + + /* Open drain output is disabled */ + + kPORT_OpenDrainDisable, + + /* Low drive strength is configured */ + + kPORT_LowDriveStrength, + + /* Pin is configured as FLEXSPI0_A_SCLK */ + + kPORT_MuxAlt8, + + /* Digital input enabled */ + + kPORT_InputBufferEnable, + + /* Digital input is not inverted */ + + kPORT_InputNormal, + + /* Pin Control Register fields [15:0] are not locked */ + + kPORT_UnlockRegister}; + + /* PORT3_7 (pin D14) is configured as FLEXSPI0_A_SCLK */ + + PORT_SetPinConfig(PORT3, 7U, &port3_7_pinD14_config); + + + + const port_pin_config_t port3_8_pinE14_config = {/* Internal pull-up/down resistor is disabled */ + + kPORT_PullDisable, + + /* Low internal pull resistor value is selected. */ + + kPORT_LowPullResistor, + + /* Fast slew rate is configured */ + + kPORT_FastSlewRate, + + /* Passive input filter is disabled */ + + kPORT_PassiveFilterDisable, + + /* Open drain output is disabled */ + + kPORT_OpenDrainDisable, + + /* Low drive strength is configured */ + + kPORT_LowDriveStrength, + + /* Pin is configured as FLEXSPI0_A_DATA0 */ + + kPORT_MuxAlt8, + + /* Digital input enabled */ + + kPORT_InputBufferEnable, + + /* Digital input is not inverted */ + + kPORT_InputNormal, + + /* Pin Control Register fields [15:0] are not locked */ + + kPORT_UnlockRegister}; + + /* PORT3_8 (pin E14) is configured as FLEXSPI0_A_DATA0 */ + + PORT_SetPinConfig(PORT3, 8U, &port3_8_pinE14_config); + + + + const port_pin_config_t port3_9_pinF15_config = {/* Internal pull-up/down resistor is disabled */ + + kPORT_PullDisable, + + /* Low internal pull resistor value is selected. */ + + kPORT_LowPullResistor, + + /* Fast slew rate is configured */ + + kPORT_FastSlewRate, + + /* Passive input filter is disabled */ + + kPORT_PassiveFilterDisable, + + /* Open drain output is disabled */ + + kPORT_OpenDrainDisable, + + /* Low drive strength is configured */ + + kPORT_LowDriveStrength, + + /* Pin is configured as FLEXSPI0_A_DATA1 */ + + kPORT_MuxAlt8, + + /* Digital input enabled */ + + kPORT_InputBufferEnable, + + /* Digital input is not inverted */ + + kPORT_InputNormal, + + /* Pin Control Register fields [15:0] are not locked */ + + kPORT_UnlockRegister}; + + /* PORT3_9 (pin F15) is configured as FLEXSPI0_A_DATA1 */ + + PORT_SetPinConfig(PORT3, 9U, &port3_9_pinF15_config); + } + ``` + +- clock初始化 + bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.c 文件rt_hw_board_init 函数内添加以下补丁使能flexspi clock + + ```c + @@ -86,11 +86,13 @@ void rt_hw_board_init() + CLOCK_AttachClk(kPLL0_to_CTIMER2); + CLOCK_AttachClk(kPLL0_to_CTIMER3); + CLOCK_AttachClk(kPLL0_to_CTIMER4); + + CLOCK_AttachClk(kPLL0_to_FLEXSPI); + CLOCK_SetClkDiv(kCLOCK_DivCtimer0Clk, 1u); + CLOCK_SetClkDiv(kCLOCK_DivCtimer1Clk, 1u); + CLOCK_SetClkDiv(kCLOCK_DivCtimer2Clk, 1u); + CLOCK_SetClkDiv(kCLOCK_DivCtimer3Clk, 1u); + CLOCK_SetClkDiv(kCLOCK_DivCtimer4Clk, 1u); + + CLOCK_SetClkDiv(kCLOCK_DivFlexspiClk, 2U); + SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + /* set pend exception priority */ + + ``` + + + +- W25Q64初始化处理 + 添加以下接口自动初始化W25Q64 flash + + ```c + int rt_hw_nor_flash_init(void) + { + static struct norflash_mtd norflash; + status_t sta; + norflash.mtd_device.ops = &norflash_ops; + norflash.mtd_device.block_size = SECTOR_SIZE; + norflash.mtd_device.block_start = 0; + norflash.mtd_device.block_end = 16383; + norflash.mflash_start = 0x80000000; + norflash.page_size = 256; + flexspi_nor_flash_init(); + sta = flexspi_nor_enable_octal_mode(EXAMPLE_FLEXSPI); + if (sta != kStatus_Success) + { + rt_kprintf("enable_octal_mode failed %x\n",sta); + return RT_ERROR; + } + rt_mtd_nor_register_device("norflash",&norflash.mtd_device); + return RT_EOK; + } + INIT_DEVICE_EXPORT(rt_hw_nor_flash_init); + + ``` + + ```c + void flexspi_nor_flash_init(void) + { + flexspi_config_t config; + /* To store custom's LUT table in local. */ + uint32_t tempCustomLUT[CUSTOM_LUT_LENGTH] = {0U}; + FLEXSPI_Type *base = FLEXSPI0; + /*Get FLEXSPI default settings and configure the flexspi. */ + FLEXSPI_GetDefaultConfig(&config); + /*Set AHB buffer size for reading data through AHB bus. */ + config.ahbConfig.enableAHBPrefetch = true; + config.rxSampleClock = kFLEXSPI_ReadSampleClkLoopbackFromDqsPad; + config.enableCombination = true; + config.ahbConfig.enableAHBBufferable = true; + config.ahbConfig.enableAHBCachable = true; + FLEXSPI_Init(base, &config); + /* Configure flash settings according to serial flash feature. */ + FLEXSPI_SetFlashConfig(base, &deviceconfig, kFLEXSPI_PortA1); + /* Copy LUT information from flash region into RAM region, because flash will be reset and back to single mode; + In lately time, LUT table assignment maybe failed after flash reset due to LUT read entry is application's + required mode(such as octal DDR mode) and flash is being in single SDR mode, they don't matched. */ + uint32_t TempFastReadSDRLUTCommandSeq[4]; + memcpy(TempFastReadSDRLUTCommandSeq, FastReadSDRLUTCommandSeq, sizeof(FastReadSDRLUTCommandSeq)); + /* Copy LUT information from flash region into RAM region, because LUT update maybe corrupt read sequence(LUT[0]) + * and load wrong LUT table from FLASH region. */ + memcpy(tempCustomLUT, customLUTOctalMode, sizeof(tempCustomLUT)); + /* Update LUT table into a specific mode, such as octal SDR mode or octal DDR mode based on application's + * requirement. */ + FLEXSPI_UpdateLUT(base, 0, tempCustomLUT, CUSTOM_LUT_LENGTH); + /* Do software reset. */ + FLEXSPI_SoftwareReset(base); + EXAMPLE_FLASH_RESET_CONFIG(); + /* FAST_READ4B: back to single mode and update read LUT entry into FAST_READ4B after flash reset, + to make sure fetch code/data from flash is right. */ + FLEXSPI_UpdateLUT(base, 4 * NOR_CMD_LUT_SEQ_IDX_READ, TempFastReadSDRLUTCommandSeq, 4); + } + status_t flexspi_nor_enable_octal_mode(FLEXSPI_Type *base) + { + flexspi_transfer_t flashXfer; + status_t status; + /* Copy LUT information from flash region into RAM region, because flash boot mode maybe not same with application's + required mode. + If yes, doesn't need to memory copy operation; if no, need to memory opeation before flash access failure due to + mismatch LUT read command sequence. */ + uint32_t TempOctalReadDDRLUTCommandSeq[4]; + memcpy(TempOctalReadDDRLUTCommandSeq, OctalReadDDRLUTCommandSeq, sizeof(OctalReadDDRLUTCommandSeq)); + uint32_t writeValue = FLASH_ENABLE_OCTAL_CMD; + /* Write enable */ + status = flexspi_nor_write_enable(base, 0, false); + if (status != kStatus_Success) + { + return status; + } + /* Enable quad mode. */ + flashXfer.deviceAddress = 0; + flashXfer.port = FLASH_PORT; + flashXfer.cmdType = kFLEXSPI_Write; + flashXfer.SeqNumber = 1; + flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_ENTEROPI; + flashXfer.data = &writeValue; + flashXfer.dataSize = 1; + status = FLEXSPI_TransferBlocking(base, &flashXfer); + if (status != kStatus_Success) + { + return status; + } + status = flexspi_nor_wait_bus_busy(base, true); + /* 8DTRD: enter octal DDR and update read LUT entry into 8DTRD. */ + FLEXSPI_UpdateLUT(base, 4 * NOR_CMD_LUT_SEQ_IDX_READ, TempOctalReadDDRLUTCommandSeq, 4); + /* Do software reset. */ + FLEXSPI_SoftwareReset(base); + return status; + } + + ``` + + + +- W25Q64 erase 函数 + 调用flexspi 驱动接口实现如下erase 函数 + + ```c + status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address) + { + status_t status; + flexspi_transfer_t flashXfer; + #if defined(CACHE_MAINTAIN) && CACHE_MAINTAIN + flexspi_cache_status_t cacheStatus; + flexspi_nor_disable_cache(&cacheStatus); + #endif + /* Write enable */ + status = flexspi_nor_write_enable(base, 0, true); + if (status != kStatus_Success) + { + return status; + } + flashXfer.deviceAddress = address; + flashXfer.port = FLASH_PORT; + flashXfer.cmdType = kFLEXSPI_Command; + flashXfer.SeqNumber = 1; + flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_ERASESECTOR; + status = FLEXSPI_TransferBlocking(base, &flashXfer); + if (status != kStatus_Success) + { + return status; + } + status = flexspi_nor_wait_bus_busy(base, true); + /* Do software reset. */ + FLEXSPI_SoftwareReset(base); + #if defined(CACHE_MAINTAIN) && CACHE_MAINTAIN + flexspi_nor_enable_cache(cacheStatus); + #endif + return status; + } + + ``` + + + +- W25Q64 write 函数 + 使用flexspi接口实现 write 函数 + + ```c + #define FLASH_PAGE_SIZE 256 + status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src) + { + status_t status; + flexspi_transfer_t flashXfer; + #if defined(CACHE_MAINTAIN) && CACHE_MAINTAIN + flexspi_cache_status_t cacheStatus; + flexspi_nor_disable_cache(&cacheStatus); + #endif + /* Write neable */ + status = flexspi_nor_write_enable(base, dstAddr, true); + if (status != kStatus_Success) + { + return status; + } + /* Prepare page program command */ + flashXfer.deviceAddress = dstAddr; + flashXfer.port = FLASH_PORT; + flashXfer.cmdType = kFLEXSPI_Write; + flashXfer.SeqNumber = 1; + flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM; + flashXfer.data = (uint32_t *)src; + flashXfer.dataSize = FLASH_PAGE_SIZE; + status = FLEXSPI_TransferBlocking(base, &flashXfer); + if (status != kStatus_Success) + { + return status; + } + status = flexspi_nor_wait_bus_busy(base, true); + /* Do software reset. */ + FLEXSPI_SoftwareReset(base); + #if defined(CACHE_MAINTAIN) && CACHE_MAINTAIN + flexspi_nor_enable_cache(cacheStatus); + #endif + return status; + } + + ``` + +- W25Q64 read 函数 + read 函数按照内存的方式访问0x80000000地址即可再次就不展开read 函数的实现了 + +- 更新kconfig + 更新kconfig 添加配置菜单项 + + ```c + $ git diff bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig + diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig + index fe4f9ffaa6..3c0df28a29 100644 + --- a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig + +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig + @@ -171,6 +171,11 @@ endmenu + menu "Board extended module Drivers" + + config BSP_USING_NORFLASH + + select RT_USING_MTD_NOR + + bool "Using mcxn947 norflash(w25q64) driver" + + default n + + + endmenu + endmenu + + ``` + + + +使用env 工具开启对应的配置,默认配置是关闭状态。 + +![32170.jpg](Book_Picture/e37dc2903f1bfe2992bb9cfd738d02b6.jpg.webp) + + + +#### 2.5.2 加入MTD驱动管理 + +将上述实现的flash 的操作接口通过MTD NOR设备注册至系统,添加如下代码自动注册设备。 + +```c +struct norflash_mtd +{ + struct rt_mtd_nor_device mtd_device; + struct rt_mutex lock; + uint32_t mflash_start; + uint16_t page_size; + void * user_data; +}; +rt_ssize_t norlash_write(struct rt_mtd_nor_device* device, rt_off_t offset, const rt_uint8_t* data, rt_size_t length) +{ + status_t ret; + uint32_t dest; + struct norflash_mtd * p_mflash_mtd = (struct norflash_mtd *)device; + dest = 0x00 + offset; + if((length) > ((device->block_end*device->block_size))) + return 0; + for(uint32_t i = 0;i < length; i += 256) + { + //dest = dest + (i*256); + //data = &data[1*256]; + ret = flexspi_nor_flash_page_program(EXAMPLE_FLEXSPI, dest, (void *)data); + if(ret != kStatus_Success) + break; + } + return ret == kStatus_Success ? length : 0; +} +rt_ssize_t norflash_read(struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint8_t* data, rt_size_t length) +{ + uint32_t dest; + struct norflash_mtd * p_mflash_mtd = (struct norflash_mtd *)device; + dest = p_mflash_mtd->mflash_start + offset; + if((dest + length) > (p_mflash_mtd->mflash_start + (device->block_end*device->block_size))) + return 0; + for(uint32_t i=0; i < length; i++) + { + data[i] = *((__IO rt_uint8_t*)dest); + dest++; + } + return length; +} +rt_err_t norflash_erase_block(struct rt_mtd_nor_device* device, rt_off_t offset, rt_size_t length) +{ + status_t ret; + uint32_t addr; + struct norflash_mtd * p_mflash_mtd = (struct norflash_mtd *)device; + addr = offset+0x00; + ret = flexspi_nor_flash_erase_sector(EXAMPLE_FLEXSPI, addr); + return ret == kStatus_Success ? RT_EOK : -1; +} +const static struct rt_mtd_nor_driver_ops norflash_ops = +{ + .read_id = NULL, + .read = norflash_read, + .write = norlash_write, + .erase_block = norflash_erase_block, +}; +int rt_hw_nor_flash_init(void) +{ + static struct norflash_mtd norflash; + status_t sta; + norflash.mtd_device.ops = &norflash_ops; + norflash.mtd_device.block_size = SECTOR_SIZE; + norflash.mtd_device.block_start = 0; + norflash.mtd_device.block_end = 16383; + norflash.mflash_start = 0x80000000; + norflash.page_size = 256; + flexspi_nor_flash_init(); + sta = flexspi_nor_enable_octal_mode(EXAMPLE_FLEXSPI); + if (sta != kStatus_Success) + { + rt_kprintf("enable_octal_mode failed %x\n",sta); + return RT_ERROR; + } + rt_mtd_nor_register_device("norflash",&norflash.mtd_device); + return RT_EOK; +} +INIT_DEVICE_EXPORT(rt_hw_nor_flash_init); + +``` + +更新程序后输入msh />list device 命令发现norflash 驱动已经被系统识别 + +```c +msh />list device +device type ref count +-------- -------------------- ---------- +norflash MTD Device 0 +mflash MTD Device 1 +pin Pin Device 0 +uart5 Character Device 0 +uart4 Character Device 2 +uart2 Character Device 0 +``` + + + +#### 2.5.3 配置little norflash 参数 + +- 按照W25Q64 的page =256, block = 4096 配置littlefs flash 参数 + +![9656.jpg](Book_Picture/fa33fb40406c0d90903620687894ec5e.jpg.webp) + +- 自动挂载文件系统 + 添加如下代码自动挂载norflash 驱动至littlefs + + ```c + static int littlefs_mount_norflash(void) + { + if(rt_device_find("norflash") == RT_NULL) + { + return -RT_EIO; + } + int ret = dfs_mount("norflash", "/", "lfs", 0, 0); + if (ret != 0) + { + rt_kprintf("ret: %d\n",ret); + LOG_E("norflash mount to '/' failed!"); + ret = dfs_mkfs("lfs","norflash"); + if(ret != 0) + return ret; + ret = dfs_mount("norflash", "/", "lfs", 0, 0); + if(ret != 0) + return ret; + } + return RT_EOK; + } + INIT_ENV_EXPORT(littlefs_mount_norflash); + + ``` + +自动加载后运行程序,发现flash 已经按照预期的方式挂载到文件系统了,64M 的flash 相对之前的内部的1M空间富裕的多了。一下子实现鸟枪换炮了。 + +![20240329-004831.gif](Book_Picture/d992712ff19e8fdc61ed370765e67f07.gif) + + + +测试代码已提交如下路径:https://gitee.com/andeyqi/rt-thread/tree/NXP_BSP/ + +## 3. 原文连接 + +原文路径1:https://club.rt-thread.org/ask/article/acdce3db4145b144.html + +原文路径2:https://club.rt-thread.org/ask/article/cdbb6ba89854e118.html + + + + + +# **七、恩智浦FRDM-MCX947上的SPI实践**(程杰~(文章1)~、Lisheng Zhang~(文章2)~) + +## 1. 开发环境 + +> 文章1:ENV环境 +> +> 文章2:Linux下ENV环境 + +## 2. 步骤说明 + +### 2.1 文章1 + +本方案旨在通过在FRDM-MCXN947开发板上实现BMI270加速度传感器数据的读取,来评估RT-thread对该平台SPI的支持情况。 + +#### 2.1.1 硬件方案 + +- 开发板主板通过板载3.3V电源为BMI270传感器的VDD和VDDIO供电 +- BMI270传感器通过转接板连接到开发板的Flexcomm6_SPI口上 + +![Setup_3.jpg](Book_Picture/9bfd0b71b1764ccd4a81c7bb52ed2655.jpg.webp) + + + +#### 2.1.2 软件方案 + +- 启动初始化Flexcomm6_SPI外设,配置波特率至8MHz(传感器最高支持10MHz)。 +- 软件定时器控制轮询读取传感器加速度计数据,轮询频率为50Hz。 +- 加速度计传感器配置+/-16G量程,1600Hz输出频率。 +- 控制台串口打印加速度计原始数据(16bit整型数据)。 +- 由板载Wakeup按钮(开发板正面右上角按钮)控制使能传感器和软件定时器。 +- 本测试基于RT-thread代码仓库commit - 39e6b36bb02b431999bd8b91701d3761a56b3eb3 +- 传感器驱动来源于Bosch Sensortec代码仓库 BMI270 [v2.86.1版本](https://github.com/boschsensortec/BMI270_SensorAPI/releases/tag/v2.86.1) + +#### 2.1.3 关于BMI270 (来源于ChatGPT v3.5) + +BMI270是一款集成了惯性测量单元(IMU)和传感器数据处理器的先进传感器。它是Bosch Sensortec在运动控制和导航领域的最新创新之一,被广泛用于智能手机、可穿戴设备、健康监测、虚拟现实和增强现实等领域。 + 以下是BMI270的一些主要特点和优势: + 1. 小巧集成:BMI270采用了先进的封装技术,使其体积小巧,适用于空间受限的应用场景。 + 2. 低功耗设计:Bosch Sensortec注重低功耗设计,BMI270在提供高性能的同时能够保持低功耗运行,使其适用于依赖于电池供电的设备。 + 3. 多功能性:BMI270集成了三轴加速度计和三轴陀螺仪,同时还具备传感器数据处理器,能够提供精确的运动跟踪和姿态估计功能。 + 4. 高性能运动跟踪:通过先进的传感器融合算法和数据处理技术,BMI270能够实现精确的运动跟踪,包括步数计数、姿态识别等功能。 + 5. 高度集成:BMI270集成了传感器和处理器,简化了系统设计,减少了外部元件的数量,降低了系统成本。 + +#### 2.1.4 实验步骤 + +##### 2.1.4.1 配置并初始化SPI + +这一块没有太多可以说的,按照软件实施模块中的描述,将波特率设置在8MHz,模式设置为3(CPOL=1, CPHA=1),手动控制片选引脚。需要注意的一点是,BMI270这款传感器,默认是使用I2C接口的,如果我们想要使用SPI接口,需要先将传感器片选引脚拉低再拉高(提供一个上升沿电平)。 + +```c +#define SENSOR_SPI_NAME "sens_spi" +#define SENSOR_SPI_CS (3 * 32 + 23) +/*! + * @brief This function is to get sensor SPI device + * + * @return Pointer to sensor SPI device + */ +struct rt_spi_device* sensor_spi_device_get(void) +{ + return (struct rt_spi_device *)rt_device_find(SENSOR_SPI_NAME); +} +/*! + * @brief This function is to initialize flexcomm6_SPI for BMI270 sensor w/r + * + * @return Initialize result + */ +rt_err_t sensor_spi_init(void) +{ + struct rt_spi_configuration cfg = { 0 }; + cfg.data_width = 8; + cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_3 | RT_SPI_MSB | RT_SPI_NO_CS; + cfg.max_hz = 8 *1000 *1000; + /* Attach chip select pin and apply name to SPI device */ + rt_hw_spi_device_attach("spi6", SENSOR_SPI_NAME, SENSOR_SPI_CS); + /* Get SPI device from name */ + struct rt_spi_device *sensor_spi_dev = sensor_spi_device_get(); + if (RT_NULL == sensor_spi_dev) + { + rt_kprintf("rt_device_find(%s) failed\n", SENSOR_SPI_NAME); + return -RT_ERROR; + } + /* Apply configuration to SPI device */ + rt_spi_configure(sensor_spi_dev, &cfg); + /* Pull down and then pull up to switch sensor comm interface to SPI */ + rt_spi_take(sensor_spi_dev); + rt_spi_release(sensor_spi_dev); + return RT_EOK; +} + +``` + + + +##### 2.1.4.2 传感器驱动读写函数 + +BMI270传感器驱动中的SPI读写接口需要我们根据具体的平台来单独实。传感器的一般操作方式是先写入要操作的寄存器地址,然后再读取或者写入相应的数据,所以这里我们采用RT-thread中的rt_spi_send_then_recv()方法和rt_spi_send_then_send()方法来实现。 + +```c +/*! + * @brief This function is to read data from sensor regs + * + * @param[in] reg: Register address from which data is read. + * @param[in] data: Pointer to data buffer where read data is stored. + * @param[in] len: Number of bytes of data to be read. + * @param[in] intf_ptr: Pointer to SPI interface device + * + * @return SPI read result + * + * @retval == RT_EOK -> Success + * @retval != RT_EOK -> Failure + */ +rt_int8_t sensor_spi_read(rt_uint8_t reg, rt_uint8_t *data, rt_uint32_t len, void *intf_ptr) +{ + /* Variable to define return result */ + rt_err_t rslt; + if (data == NULL || intf_ptr == NULL) + { + return -1; + } + /* Get device handler */ + struct rt_spi_device *sensor_spi_dev = (struct rt_spi_device *)intf_ptr; + /* Take CS pin */ + /* No need take CS by user manually, this operation is took account into rt_spi_send_then_recv() */ + // rslt = rt_spi_take(sensor_spi_dev); + // if (RT_EOK != rslt) + // { + // rt_kprintf("rt_spi_take() failed, error code = %d", rslt); + // return rslt; + // } + rslt = rt_spi_send_then_recv(sensor_spi_dev, ®, 1, data, len); + if (RT_EOK != rslt) + { + rt_kprintf("rt_spi_send_then_recv() failed, error code = %d", rslt); + return rslt; + } + /* Release CS pin */ + /* No need release CS by user manually, this operation is took account into rt_spi_send_then_recv() */ + // rslt = rt_spi_release(sensor_spi_dev); + // if (RT_EOK != rslt) + // { + // rt_kprintf("rt_spi_release() failed, error code = %d", rslt); + // return rslt; + // } + return RT_EOK; +} +/*! + * @brief This function is to write data from sensor regs + * + * @param[in] reg: Register address from which data is write. + * @param[in] data: Pointer to data buffer where write data is stored. + * @param[in] len: Number of bytes of data to be write. + * @param[in] intf_ptr: Pointer to SPI interface device + * + * @return SPI write result + * + * @retval == RT_EOK -> Success + * @retval != RT_EOK -> Failure + */ +rt_int8_t sensor_spi_write(rt_uint8_t reg, const rt_uint8_t *data, rt_uint32_t len, void *intf_ptr) +{ + /* Variable to define return result */ + rt_err_t rslt; + if (data == NULL || intf_ptr == NULL) + { + return -1; + } + /* Get device handler */ + struct rt_spi_device *sensor_spi_dev = (struct rt_spi_device *)intf_ptr; + /* Take CS pin */ + /* No need take CS by user manually, this operation is took account into rt_spi_send_then_send() */ + // rslt = rt_spi_take(sensor_spi_dev); + // if (RT_EOK != rslt) + // { + // rt_kprintf("rt_spi_take() failed, error code = %d", rslt); + // return rslt; + // } + rslt = rt_spi_send_then_send(sensor_spi_dev, ®, 1, data, len); + if (RT_EOK != rslt) + { + rt_kprintf("rt_spi_send_then_send() failed, error code = %d", rslt); + return rslt; + } + /* Release CS pin */ + /* No need release CS by user manually, this operation is took account into rt_spi_send_then_send() */ + // rslt = rt_spi_release(sensor_spi_dev); + // if (RT_EOK != rslt) + // { + // rt_kprintf("rt_spi_release() failed, error code = %d", rslt); + // return rslt; + // } + return RT_EOK; +} + +``` + +##### 2.1.4.3 传感器轮询线程 + +线程间的同步采用rt_event事件集 + +- 当软件定时器触发中断时,中断会给线程发送SENSOR_EVT_POLLING事件,轮询线程会读取传感器数据,并打印在工作台中。 +- 当用户点击Wakeup按钮时,GPIO中断会给线程发送SENSOR_EVT_ENABLE或者SENSOR_EVT_DISABLE事件,轮询线程会开启或关闭传感器及定时器。 + +```c +/*! Earth's gravity in m/s^2 */ +#define GRAVITY_EARTH (9.80665f) +/*! Scheduler events */ +#define SENSOR_EVT_POLLING (1 << 0) +#define SENSOR_EVT_ENABLE (1 << 1) +#define SENSOR_EVT_DISABLE (1 << 2) +static rt_uint8_t sensor_active_flag; +static rt_thread_t sensor_scheduler_tid; +static rt_timer_t sensor_timer; +static rt_sem_t sensor_sem; +static rt_event_t sensor_event; +/*! + * @brief This function is to prepare sensor scheduler application + */ +rt_err_t sensor_scheduler_app(void) +{ + rt_err_t ret = RT_EOK; + sensor_event = rt_event_create("sens_evt", RT_IPC_FLAG_FIFO); + if (sensor_event == RT_NULL) + { + rt_kprintf("sensor event create failed!\n"); + return -RT_ERROR; + } + /* Create scheduler_app thread */ + sensor_scheduler_tid = rt_thread_create("sens_app", + sensor_scheduler_entry, + RT_NULL, + 1024, + 4, + 1000); + if (sensor_scheduler_tid == RT_NULL) { + rt_kprintf("sensor scheduler app thread create failed!\n"); + // rt_sem_delete(sensor_sem); + rt_event_delete(sensor_event); + return -RT_ERROR; + } + /* Startup scheduler_app thread */ + ret = rt_thread_startup(sensor_scheduler_tid); + if (ret != RT_EOK) { + rt_kprintf("sensor scheduler app thread startup failed, error code = %d!\n", ret); + // rt_sem_delete(sensor_sem); + rt_event_delete(sensor_event); + return -RT_ERROR; + } + /* Create sensor polling timer, polling rate is 50Hz */ + sensor_timer = rt_timer_create("sens_tmr", + sensor_timer_timeout, + RT_NULL, + 20, + RT_TIMER_FLAG_PERIODIC); + if (sensor_timer == RT_NULL) { + rt_kprintf("sensor timer create failed!\n"); + // rt_sem_delete(sensor_sem); + rt_event_delete(sensor_event); + return -RT_ERROR; + } + return RT_EOK; +} +/*! + * @brief Main process function to read sensor data + */ +static void sensor_scheduler_entry(void *parameter) +{ + (void)parameter; + /* Status of api are returned to this variable. */ + rt_int8_t rslt; + /* Structure to define type of sensor and their respective data. */ + struct bmi2_sens_data sens_data = { { 0 } }; + /* Sensor data in unit mps2 */ + float x, y, z; + /* Variable to define event set */ + rt_uint32_t event; + /* Assign accel sensor to variable. */ + rt_uint8_t sensor_list = BMI2_ACCEL; + while (1) + { + if (rt_event_recv(sensor_event, SENSOR_EVT_POLLING | SENSOR_EVT_ENABLE | SENSOR_EVT_DISABLE, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &event) == RT_EOK) + { + if (event & SENSOR_EVT_POLLING) + { + rslt = bmi2_get_sensor_data(&sens_data, &dev); + if (rslt) + { + rt_kprintf("bmi2_get_sensor_data() failed, error code = %d\n", rslt); + continue; + } + else if (sens_data.status & BMI2_DRDY_ACC) + { + /* Converting lsb to meter per second squared for 16 bit accelerometer at 2G range. */ + x = lsb_to_mps2(sens_data.acc.x, 2, 16); + y = lsb_to_mps2(sens_data.acc.y, 2, 16); + z = lsb_to_mps2(sens_data.acc.z, 2, 16); + rt_kprintf("Sensor Data: %d, %d, %d\n", sens_data.acc.x, sens_data.acc.y, sens_data.acc.z); + } + } + if (event & SENSOR_EVT_ENABLE) + { + rslt = bmi2_sensor_enable(&sensor_list, 1, &dev); + if (rslt) + { + rt_kprintf("bmi2_sensor_enable() failed, error code = %d\n", rslt); + } + rslt = rt_timer_start(sensor_timer); + if (rslt) + { + rt_kprintf("rt_timer_start failed, error code = %d!\n", rslt); + } + sensor_active_flag = 1; + rt_kprintf("BMI270 accel enabled\r\n"); + } + if (event & SENSOR_EVT_DISABLE) + { + rslt = bmi2_sensor_disable(&sensor_list, 1, &dev); + if (rslt) + { + rt_kprintf("bmi2_sensor_disable() failed, error code = %d\n", rslt); + } + rslt = rt_timer_stop(sensor_timer); + if (rslt) + { + rt_kprintf("rt_timer_stop failed, error code = %d!\n", rslt); + } + sensor_active_flag = 0; + rt_kprintf("BMI270 accel disabled\r\n"); + } + } + } +} +/*! + * @brief Interrupt function to sensor timer timeout + */ +static void sensor_timer_timeout(void *parameter) +{ + (void)parameter; + rt_event_send(sensor_event, SENSOR_EVT_POLLING); +} +/*! + * @brief This function converts lsb to meter per second squared for 16 bit accelerometer at + * range 2G, 4G, 8G or 16G. + */ +static float lsb_to_mps2(int16_t val, float g_range, uint8_t bit_width) +{ + float half_scale = ((float)(1 << bit_width) / 2.0f); + return (GRAVITY_EARTH * val * g_range) / half_scale; +} + +``` + +##### 2.1.4.4 传感器控制接口 + +传感器控制接口主要包含以下几个函数: + +- sensor_intf_init: 主要用户传感器的初始化及一些基本配置 +- sensor_enable: 通知轮询线程使能传感器和软件定时器 +- sensor_disable: 通知轮询线程关闭传感器和软件定时器 + +```c +/*! Macro that defines read write length */ +#define READ_WRITE_LEN UINT8_C(46) +static struct bmi2_dev dev; +rt_err_t sensor_intf_init(void) +{ + /* Status of api are returned to this variable. */ + rt_int8_t rslt; + /* Structure to define accelerometer configuration. */ + struct bmi2_sens_config config; + /* Get SPI device from name */ + void *sensor_spi_dev = (void *)sensor_spi_device_get(); + if (RT_NULL == sensor_spi_dev) + { + rt_kprintf("sensor_spi_device_get() failed\n"); + return -RT_ERROR; + } + memset(&dev, 0, sizeof(dev)); + dev.intf = BMI2_SPI_INTF; + dev.read = sensor_spi_read; + dev.write = sensor_spi_write; + dev.delay_us = sensor_intf_delay_us; + dev.intf_ptr = sensor_spi_dev; + dev.read_write_len = READ_WRITE_LEN; + /* Initialize bmi270. */ + rslt = bmi270_init(&dev); + if (rslt) + { + rt_kprintf("bmi270_init() failed, error code = %d\n", rslt); + return -RT_ERROR; + } + /* Disable advanced power save mode */ + rslt = bmi2_set_adv_power_save(BMI2_DISABLE, &dev); + if (rslt) + { + rt_kprintf("bmi2_set_adv_power_save() failed, error code = %d\n", rslt); + return -RT_ERROR; + } + /* Configure the type of feature. */ + config.type = BMI2_ACCEL; + /* Get default configurations for the type of feature selected. */ + rslt = bmi2_get_sensor_config(&config, 1, &dev); + if (rslt) + { + rt_kprintf("bmi2_get_sensor_config() failed, error code = %d\n", rslt); + return -RT_ERROR; + } + /* Set Output Data Rate */ + config.cfg.acc.odr = BMI2_ACC_ODR_200HZ; + /* Gravity range of the sensor (+/- 2G, 4G, 8G, 16G). */ + config.cfg.acc.range = BMI2_ACC_RANGE_16G; + /* The bandwidth parameter is used to configure the number of sensor samples that are averaged + * if it is set to 2, then 2^(bandwidth parameter) samples + * are averaged, resulting in 4 averaged samples. + * Note1 : For more information, refer the datasheet. + * Note2 : A higher number of averaged samples will result in a lower noise level of the signal, but + * this has an adverse effect on the power consumed. + */ + config.cfg.acc.bwp = BMI2_ACC_NORMAL_AVG4; + /* Enable the filter performance mode where averaging of samples + * will be done based on above set bandwidth and ODR. + * There are two modes + * 0 -> Ultra low power mode + * 1 -> High performance mode(Default) + * For more info refer datasheet. + */ + config.cfg.acc.filter_perf = BMI2_PERF_OPT_MODE; + /* Set the accel configurations. */ + rslt = bmi2_set_sensor_config(&config, 1, &dev); + if (rslt) + { + rt_kprintf("bmi2_set_sensor_config() failed, error code = %d\n", rslt); + return -RT_ERROR; + } + return RT_EOK; +} +/*! + * @brief This function is to enable sensor and startup sensor polling timer + * + * @return Enable result + */ +rt_err_t sensor_enable(void) +{ + return rt_event_send(sensor_event, SENSOR_EVT_ENABLE); +} +/*! + * @brief This function is to disable sensor and stop sensor polling timer + * + * @return Disable result + */ +rt_err_t sensor_disable(void) +{ + return rt_event_send(sensor_event, SENSOR_EVT_DISABLE); +} +/*! + * @brief Sensor delay function + * + * @param[in] period: Delay period in us + * @param[in] intf_ptr: Reserved + * + */ +static void sensor_intf_delay_us(rt_uint32_t period, void *intf_ptr) +{ + (void)intf_ptr; + if (period > 1000) + { + rt_thread_mdelay((period + 500) / 1000); + } + else + { + rt_hw_us_delay(period); + } +} + +``` + + + +##### 2.1.4.5 主程序和Wakeup GPIO中断 + +这部分主要复用RT-thread本开发板BSP中的内容,对部分代码进行一些修改: + +- 主程序中调用SPI初始化方法 +- 在GPIO中断响应函数中调用sensor_enable和sensor_disable接口 + +```c +int main(void) +{ +... + rt_err_t ret = sensor_spi_init(); + if (ret) + { + rt_kprintf("sensor_spi_init failed, error code = %d\n", ret); + } + ret = sensor_intf_init(); + if (ret) + { + rt_kprintf("sensor_intf_init failed, error code = %d\n", ret); + } + ret = sensor_scheduler_app(); + if (ret) + { + rt_kprintf("sensor_scheduler_app failed, error code = %d\n", ret); + } + while (1) + { + rt_pin_write(LEDB_PIN, PIN_HIGH); /* Set GPIO output 1 */ + rt_thread_mdelay(500); /* Delay 500mS */ + rt_pin_write(LEDB_PIN, PIN_LOW); /* Set GPIO output 0 */ + rt_thread_mdelay(500); /* Delay 500mS */ + } +} +static void sw_pin_cb(void *args) +{ + if (sensor_status_get()) + { + sensor_disable(); + } + else + { + sensor_enable(); + } +} + + + + +``` + + + +#### 2.1.5 测评结论 + +RT-thread针对MCXN947平台的BSP包,能够基本实现SPI通讯功能。在硬件初始化阶段,SPI会被统一重置为Master默认属性,波特率会被配置为24MHz。 + 但是由于目前并没有真正实现rt_spi_ops的.configure接口,用户如果想调用rt_spi_configure方法配置SPI的属性,是无法生效的。(笔者将Flexcomm6_SPI接口配置为8MHz一开始是没有生效的。) + 目前源代码如下: + +```c +static rt_err_t spi_configure(struct rt_spi_device *device, struct rt_spi_configuration *cfg) +{ + rt_err_t ret = RT_EOK; +// struct lpc_spi *spi = RT_NULL; +// spi = (struct lpc_spi *)(device->bus->parent.user_data); +// ret = lpc_spi_init(spi->SPIx, cfg); + return ret; +} +static struct rt_spi_ops lpc_spi_ops = +{ + .configure = spi_configure, + .xfer = spixfer +}; + +``` + +笔者实现了一个基础版本,如有需要的朋友,可以复制到drv_spi.c文件中: + +```c + +/*! + * @brief Initialize spi device via user configuration + * + * @param[in] base: Handler of low power SPI + * @param[in] cfg: Structure to RT-thread spi configuration definition + * + * @return Initialize result + * @retval == RT_EOK -> Success + * @retval != RT_EOK -> Failed + */ +static rt_err_t lpc_spi_init(LPSPI_Type *base, struct rt_spi_configuration *cfg) +{ + /* Find SPI index via handler */ + int idx = 0; + for(idx = 0; idx < ARRAY_SIZE(lpc_obj); idx++) + { + if (lpc_obj[idx].LPSPIx == base) + { + break; + } + } + if (idx == ARRAY_SIZE(lpc_obj)) + { + return -RT_ERROR; + } + /* Load default configuration for master spi device */ + lpspi_master_config_t masterConfig = {0}; + LPSPI_MasterGetDefaultConfig(&masterConfig); + /* TODO: Need to check, whether NXP SPI supports 32bits or not */ + if(cfg->data_width != 8 && cfg->data_width != 16) + { + cfg->data_width = 8; + } + masterConfig.baudRate = cfg->max_hz; + masterConfig.bitsPerFrame = cfg->data_width; + if(cfg->mode & RT_SPI_MSB) + { + masterConfig.direction = kLPSPI_MsbFirst; + } + else + { + masterConfig.direction = kLPSPI_LsbFirst; + } + if(cfg->mode & RT_SPI_CPHA) + { + masterConfig.cpha = kLPSPI_ClockPhaseSecondEdge; + } + else + { + masterConfig.cpha = kLPSPI_ClockPhaseFirstEdge; + } + if(cfg->mode & RT_SPI_CPOL) + { + masterConfig.cpol = kLPSPI_ClockPolarityActiveLow; + } + else + { + masterConfig.cpol = kLPSPI_ClockPolarityActiveHigh; + } + masterConfig.pcsToSckDelayInNanoSec = 1000000000U / masterConfig.baudRate * 1U; + masterConfig.lastSckToPcsDelayInNanoSec = 1000000000U / masterConfig.baudRate * 1U; + masterConfig.betweenTransferDelayInNanoSec = 1000000000U / masterConfig.baudRate * 1U; + LPSPI_MasterInit(base, &masterConfig, CLOCK_GetFreq(lpc_obj[idx].clock_name)); + return RT_EOK; +} +static rt_err_t spi_configure(struct rt_spi_device *device, struct rt_spi_configuration *cfg) +{ + rt_err_t ret = RT_EOK; + struct lpc_spi *spi = RT_NULL; + spi = (struct lpc_spi *)(device->bus->parent.user_data); + ret = lpc_spi_init(spi->LPSPIx, cfg); + return ret; +} + +``` + +此外,当前代码中存在一个错误, SPI6结构体实例中,缺少了’},’,需要用户自行补上: + +```c +#ifdef BSP_USING_SPI6 + { + .LPSPIx = LPSPI6, + .clock_attach_id = kFRO_HF_DIV_to_FLEXCOMM6, + .clock_div_name = kCLOCK_DivFlexcom6Clk, + .clock_name = kCLOCK_FroHf, + .tx_dma_request = kDmaRequestMuxLpFlexcomm6Tx, + .rx_dma_request = kDmaRequestMuxLpFlexcomm6Rx, + .DMAx = DMA0, + .tx_dma_chl = 4, + .rx_dma_chl = 5, + .name = "spi6", + }, // 代码仓库中,缺失此行 +#endif /* BSP_USING_SPI6 */ + +``` + +在NXP的设置选项中,片选引脚是高电平有效还是低电平有效是可以被配置的,但是在BSP包中,这个属性是无法被设置的,原因如下: + +- 在rt_spi_configuration结构体中,没有片选引脚有效性的属性 +- 在spixfer方法中,拉片选的时候,并没有对片选引脚有效性的属性的判断 +- 如果在硬件中,有器件是需要片选引脚为高电平生效的,需要修改这个函数的实现方式 + +```c +static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *message) +{ +... + if(message->cs_take) + { + rt_pin_write(cs->pin, PIN_LOW); // 此处写死为低电平有效 + } +... + if(message->cs_release) + { + rt_pin_write(cs->pin, PIN_HIGH); + } +... +} + +``` + + + +### 2.2 文章2 + +开发环境主要解决两个问题:编译、烧录和调试。对于喜欢linux命令行下开发的人来说,更习惯scons/makefile/cmake/meson + gcc + openocd/pyocd,下面分享适用于NXP MCXN947平台的scons + gcc + pyocd开发环境搭建,其中scons是build工具,gcc是toolchain,pyocd用来烧录和调试。假设系统是debian系,其它系列arch、红帽、gentoo大同小异。按步骤做完后你也能从源码编译rt-thread并烧录到板子上启动进msh。 + +#### 2.2.1 工具安装 + +scons和gcc建议安装linux发行版自带的,还能随着系统升级而升级。 + +```c +$ sudo apt-get install gcc-arm-none-eabi scons +``` + +对于pyocd的安装有讲究,因pyocd开发非常快,更新比较频繁,所以发行版自带的版本可能有点旧,所以笔者选择通过pip安装,当然如果芯片架构比较成熟,可用旧版本的pyocd。 + +```c +$ python3 -m pip install -U pyocd +``` + +注意1:通过上述pip安装的pyocd,其位置在$HOME/.local/bin,记得将此目录设置进PATH环境变量 + 注意2:通过上述pip安装的pyocd,未安装对应的udev rules,请到pyocd官方仓库下载50-cmsis-dap.rules文件,并将其放入/etc/udev/rules.d/目录,并执行 + +```c +$ sudo udevadm control --reload +``` + +pyocd对各种SoC的支持是通过所谓的DFP(Device Familiy Pack)来支持的, pack格式遵循Open-CMSIS-Pack Spec。pack来源又分为pyocd built in,pyocd下载的,手动管理的。这里并不过于深入pyocd的pack管理。幸运的是MCXN947可以由pyocd命令下载,说明NXP已经将其pack上传到Keil了。让我们安装MCXN947对应的pack + +```c +$ pyocd pack install MCXN947 +``` + +看看安装成功没有 + +```c +$ pyocd list -t +... + mcxn947 NXP MCXN947 MCXN947 pack + mcxn947vdf NXP MCXN947VDF MCXN947 pack + mcxn947vnl NXP MCXN947VNL MCXN947 pack +... + +``` + +可以看到已经支持MCXN947 target了 + + + +#### 2.2.2 rt-thread源码clone和编译 + +```c +$ git clone https://gitee.com/rtthread/rt-thread.git +$ cd rt-thread +``` + +设置好RTT_EXEC_PATH环境变量 + +```c +export RTT_EXEC_PATH=$PATH +``` + +编译rt-thread + +```c +$ cd bsp/nxp/mcx/mcxn/frdm-mcxn947 +$ scons --menuconfig //选你要选的内容,或者什么都不做直接退出 +$ scons +``` + +编译结束会在当前目录下有rtthread.bin文件,我们需要把它烧入开发板。 + + + +#### 2.2.3 bin文件烧入开发板 + +用USB线缆连接PC机usb端口和开发板的标记为MCU-LINK type-c端口,然后运行pyocd测试能否看到调试器和目标版 + +```c +$ pyocd list + # Probe/Board Unique ID Target +-------------------------------------------------------------------------------------------------------- + 0 NXP Semiconductors MCU-LINK FRDM-MCXN947 (r0E7) CMSIS-DAP V3.128 B04TBJOPWGO3X ✖ mcxn947vdft + NXP FRDM-MCXN947 + +``` + +Nice, 已经识别调试器daplink和目标板! 开始烧录镜像,不过在烧录镜像前打开串口吧,板子的uart接入了daplink的cdc虚拟串口,可以用minicom等串口工具,这里不多费笔墨。 + +```c +$ pyocd load -e sector -t mcxn947vdf rtthread.bin +``` + +这里并不对pyocd命令参数做过多介绍,以后有机会可以单独写一篇文章介绍pyocd的使用、pack管理和在线调试。镜像烧录完毕后,板子会被自动reset,然后minicom下就能看到rtt启动log和msh了。 + +```c +sram heap, begin: 0x0x200019e8, end: 0x0x200119e8 + \ | / +- RT - Thread Operating System + / | \ 5.1.0 build Mar 19 2024 21:21:21 + 2006 - 2024 Copyright by RT-Thread team +using gcc, version: 13.2 +MCXN947 HelloWorld +msh > +``` + + + +#### 2.2.4 MCXN947 SPI简介 + +根据NXP官方的手册,芯片集成了被称为LP_FLEXCOMM(Low-Power Flexible Communication Interface)模块,这种模块可以当LPUART用,又可以当LPSPI用,也可以当LPI2C用。当然任意一时间点只能是LPSPI, LPUART, LPI2C这三者其中之一,用之前需要配置一下。这样的模块MCXN947芯片里总共集成了10个,编号分别为0, 1, … 9。下面的内容中会简称这些LP_FLEXCOMM模块为FCn。模块对应的针脚称为FCn_P0, FCn_P1, … FCn_P6(其中n=0, 1, 2, …9)。显而易见,并不是所有针脚都会用上,比如当LPI2C用时其实只要两根SDA/SCL针脚,所以NXP手册在66.2.3 External Signals章节列了一个表格把FCn_Px针脚究竟是什么信号讲得很清楚,弄明白这点很重要,因为后面需要增加代码改动pinmux。 + +另外MCXN947芯片集成了2个eDMA(Enhanced Direct Memory Access Controller)模块,每个eDMA模块能支持128个channel,而且这128个channel可以和LP_FLEXCOMM模块任意搭配,这带来了非常大的灵活性,只是使用时需要注意DMA channel的不能重复。 + + +#### 2.2.5 MCXN947 SPI在RT-Thread中实践 + +在测评这个时间点,RT-Thread主线仓库中,SPI只支持FC3所在模块当SPI用即SPI3。由FRDM-MCXN947原理图可知,对应SPI3的MISO针脚没引出,所以要完整测评SPI我们得找个FC模块且其SCLK、MISO、MOSI、CS针脚都引出的。仔细观察原理图,FC6进入我们的视野,针脚全引出不说,且正好位于mikroBUS J6插槽,非常方便用杜邦线接出做实验 + +##### 2.2.5.1 增加FC6 pinmux + +我们修改bsp/nxp/mcx/mcxn/frdm-mcxn947/board/MCUX_Config/board/pin_mux.c增加FC6 pinmux设置。 + +```c +- PORT3->PCR[20] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_IBE(1); /* FC6_P0 +*/ +- PORT3->PCR[21] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_IBE(1); /* FC6_P1 +*/ ++ /* mikroBUS SPI6 */ ++ PORT3->PCR[20] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC6_P0 SDO/D[0], FC6_SPI_MOSI */ ++ PORT3->PCR[21] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC6_P1 SCK, FC6_SPI_CLK */ ++ PORT3->PCR[22] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC6_P2 SDI/D[1], FC3_SPI_MISO */ ++ PORT3->PCR[23] = PORT_PCR_MUX(0) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* CS */ ++ + +``` + +##### 2.2.5.2 增加SPI6主控实例 + +修改bsp/nxp/mcx/mcxn/Libraries/drivers/drv_spi.c增加SPI6主控实例,并和eDMA channel挂接 + +```c +@@ -20,6 +20,9 @@ enum + #ifdef BSP_USING_SPI3 + SPI3_INDEX, + #endif ++#ifdef BSP_USING_SPI6 ++ SPI6_INDEX, ++#endif + }; +@@ -61,6 +64,20 @@ static struct lpc_spi lpc_obj[] = + .name = "spi3", + }, + #endif ++#ifdef BSP_USING_SPI6 ++ { ++ .LPSPIx = LPSPI6, ++ .clock_attach_id = kFRO_HF_DIV_to_FLEXCOMM6, ++ .clock_div_name = kCLOCK_DivFlexcom6Clk, ++ .clock_name = kCLOCK_FroHf, ++ .tx_dma_request = kDmaRequestMuxLpFlexcomm6Tx, ++ .rx_dma_request = kDmaRequestMuxLpFlexcomm6Rx, ++ .DMAx = DMA0, ++ .tx_dma_chl = 4, ++ .rx_dma_chl = 5, ++ .name = "spi6", ++ }, ++#endif + }; + +``` + +经测试不挂eDMA channel也是可以,不用DMA搬FIFO数据而是用CPU去做,可以如下修改spixfer()函数,当然MCXN947提供的eDMA channel如此之多,不用白不用😀,我猜基本没人不用DMA吧,这么测试只是为了测评覆盖的完整性,实际产品中并不会使用。 + + +```c +@@ -133,7 +150,7 @@ static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_ +message *m + // if(message->length < MAX_DMA_TRANSFER_SIZE) +- if(0) ++ if(1) + { + LPSPI_MasterTransferBlocking(spi->LPSPIx, &transfer); + } + +``` + +如此SPI6主控已经添加完毕,接下来我们需要使用RT-Thread SPI API去发起SPI传输。 + + + +#### 2.2.6 SPI外部loopback测试 + +要测SPI得接上一个SPI device,但在此之前我们不妨试试SPI主控的外部loopback测试。用杜邦线连接J6插槽的P3_20和P3_22,硬件准备完毕。我们需要写点loopback测试代码,幸运的是RT-Thread中已经有这样的例子,我们拿过来修改下即可。主要代码如下: + +```c +#define SPI_NAME "spi60" +#define CS_PIN (3*32+23) +static struct rt_spi_device *spi_dev; +/* attach spi device */ +static int rt_spi_device_init(void) +{ + struct rt_spi_configuration cfg; + rt_hw_spi_device_attach("spi6", SPI_NAME, CS_PIN); + cfg.data_width = 8; + cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB | RT_SPI_NO_CS; + cfg.max_hz = 1 *1000 *1000; + spi_dev = (struct rt_spi_device *)rt_device_find(SPI_NAME); + if (RT_NULL == spi_dev) + { + rt_kprintf("spi sample run failed! can't find %s device!\n", SPI_NAME); + return -RT_ERROR; + } + rt_spi_configure(spi_dev, &cfg); + return RT_EOK; +} +INIT_APP_EXPORT(rt_spi_device_init); +/* spi loopback mode test case */ +static int spi_sample(int argc, char **argv) +{ + rt_uint8_t t_buf[32], r_buf[32]; + int i = 0; + static struct rt_spi_message msg1; + for (i = 0; i < sizeof(t_buf); i++) + { + t_buf[i] = i; + } + msg1.send_buf = &t_buf; + msg1.recv_buf = &r_buf; + msg1.length = sizeof(t_buf); + msg1.cs_take = 1; + msg1.cs_release = 1; + msg1.next = RT_NULL; + rt_spi_transfer_message(spi_dev, &msg1); + rt_kprintf("spi rbuf : "); + for (i = 0; i < sizeof(r_buf); i++) + { + rt_kprintf("%x ", r_buf[i]); + } + rt_kprintf("\nspi loopback mode test over!\n"); + return RT_EOK; +} +MSH_CMD_EXPORT(spi_sample, spi loopback test); + +``` + + + +初始化时我们挂接一个SPI60 device到系统中。在spi_sample这个测试命令中,构造特别的t_buf用于传输,调用RT-Thread SPI api发送32个字节数据,传输完毕后打印r_buf。 + + + +#### 2.2.7 配置编译和测试 + +```c +scons --menuconfig中 +Hardware Drivers Config ---> + On-chip Peripheral Drivers ---> + Enable SPI + Enable Flexcomm6 as SPI + Enable SPI6 BUS Sample +``` + + + +选中Enable SPI, Enable Flexcomm6 as SPI和Enable SPI6 BUS Sample + +编译完成烧录后测试log如下: + +```c + msh >spi_sample + spi rbuf : 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f + spi loopback mode test over! + +``` + +上述所有代码即将发起RT-Thread仓库PR,应该有希望合入RT-Thread主线仓库。 + + + +#### 2.2.8 Nor flash实践 + +上述加入SPI6主控后测试了external loopback,测试结果表明RT-Thread适配MCXN947芯片的SPI这块已经成熟。接下来我们要找个实际的SPI设备来测试,最好能SPI发和收都能覆盖到。最常见的SPI设备有SSD1306 SPI屏、PSRAM,Nor Flash等,但SPI屏只需要正确发送数据即可显示,不满足我们的发和收都要覆盖的要求,当然读者有兴趣可以用板子的SPI6接块SPI屏自己试下u8g2,当一个小作业哦。正当我寻找合适的SPI设备时,有大牛指点:FRDM-MCXN947这块板子上的W25Q64JVSSIQ Nor Flash接入的针脚其实可以复用为SPI使用的,那简直太完美了,杜邦线都不用接了😀 故以Nor Flash为例测试SPI。 + +##### 2.2.8.1 RT-Thread Nor Flash框架 + +经调研和阅读RT-Thread源码发现,RT-Thread对于遵循SFDP(什么是SFDP?可阅读RT-Thread源码目录中components/drivers/spi/sfud/README.md)的Nor Flash支持非常完美,它是通过一个叫SFUD(Serial Flash Universal Driver 串行Flash通用驱动库)的component来支持的,在此之上经fal、mtd可以挂接littlefs等文件系统,具体可参考RT-Thread官方文档,但本文侧重点在于SPI通信测试,故只要能通过sfud验证SPI传输即可。 + + +##### 2.2.8.2 FRDM-MCXN947 W25Q64JVSSIQ的SPI适配 + +由FRDM-MCXN947原理图得知,如W25Q64JVSSIQ做SPI设备使用,涉及针脚为P3_0, P3_7, P3_8和P3_9,查询NXP芯片手册可知,这些针脚可以复用为FC7(FCn含义见上一篇文章),所以根据上一篇文章的流程,我们需要修改pinmux和加入SPI7主控,最后还需要attach设备。 + +###### 2.2.8.2.1 pinmux修改 + +修改bsp/nxp/mcx/mcxn/frdm-mcxn947/board/MCUX_Config/board/pin_mux.c加入如下代码: + +```c +@@ -95,6 +95,11 @@ void BOARD_InitBootPins(void) + PORT3->PCR[22] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC6_P2 SDI/D[1], FC3_SPI_MISO */ + PORT3->PCR[23] = PORT_PCR_MUX(0) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* CS */ ++ /* SPI7 */ ++ PORT3->PCR[0] = PORT_PCR_MUX(0) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* CS */ ++ PORT3->PCR[7] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC7_P1 SCK, FC7_SPI_CLK */ ++ PORT3->PCR[8] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC7_P0 SDO/D[0], FC7_SPI_MOSI */ ++ PORT3->PCR[9] = PORT_PCR_MUX(3) | PORT_PCR_PS(0) | PORT_PCR_PE(0) | PORT_PCR_IBE(1); /* FC7_P2 SDI/D[1], FC7_SPI_MISO */ + +``` + + + +###### 2.2.8.2.2 加入SPI7主控 + +修改bsp/nxp/mcx/mcxn/Libraries/drivers/drv_spi.c + +``` c +@@ -23,6 +23,9 @@ enum + #ifdef BSP_USING_SPI6 + SPI6_INDEX, + #endif ++#ifdef BSP_USING_SPI7 ++ SPI7_INDEX, ++#endif + }; +@@ -78,6 +81,20 @@ static struct lpc_spi lpc_obj[] = + .name = "spi6", + }, + #endif ++#ifdef BSP_USING_SPI7 ++ { ++ .LPSPIx = LPSPI7, ++ .clock_attach_id = kFRO_HF_DIV_to_FLEXCOMM7, ++ .clock_div_name = kCLOCK_DivFlexcom7Clk, ++ .clock_name = kCLOCK_FroHf, ++ .tx_dma_request = kDmaRequestMuxLpFlexcomm7Tx, ++ .rx_dma_request = kDmaRequestMuxLpFlexcomm7Rx, ++ .DMAx = DMA0, ++ .tx_dma_chl = 6, ++ .rx_dma_chl = 7, ++ .name = "spi7", ++ }, ++#endif + }; + +``` + + + +###### 2.2.8.2.3 attach SPI设备 + +新增bsp/nxp/mcx/mcxn/frdm-mcxn947/board/ports/ + spi_flash_init.c如下: + +```c +#include +#include +#include "spi_flash.h" +#include "spi_flash_sfud.h" +#include "drv_pin.h" +#define CS_PIN (3*32+0) +static int rt_spi_flash_init(void) +{ + int result = -1; + result = rt_hw_spi_device_attach("spi7", "spi70", CS_PIN); + rt_kprintf("value is %d\n",result); + if(result == RT_EOK) + { + rt_kprintf("rt_hw_spi_device_attach successful!\n"); + } + return RT_EOK; +} +INIT_COMPONENT_EXPORT(rt_spi_flash_init); + +``` + + + +##### 2.2.8.3 配置编译以及sf命令小试牛刀 + +```c +在scons --menuconfig界面中 +Hardware Drivers Config ---> + On-chip Peripheral Drivers --> + Enable Flexcomm7 as SPI + +``` + +选中Enable Flexcomm7 as SPI + +```c +RT-Thread Components ---> + Device Drivers ---> + Using SPI Bus/Device device drivers + Using Serial Flash Universal Driver +``` + +选中Using Serial Flash Universal Driver和Using auto probe flash JEDEC SFDP parameter + +编译烧录后sf测试log如下: + +```c +msh >sf probe spi70 +I/SFUD: Found a Winbond flash chip. Size is 8388608 bytes. +I/SFUD: sf_cmd flash device initialized successfully. +I/SFUD: Probe SPI flash sf_cmd by SPI device spi70 success. +8 MB sf_cmd is current selected device. + +``` + +log表明能成功探测出Nor flash设备为Winbond flash chip,大小为8MB,到此已经能表明SPI的发和收都正常工作了,到此按理说已经结束了,但可以用sf命令再做点什么,下面我们做个喜闻乐见的benchmark: + +```c +msh >sf bench +DANGER: It will erase full chip! Please run 'sf bench yes'. +msh >sf bench yes +Erasing the sf_cmd 8388608 bytes data, waiting... +Erase benchmark success, total time: 19.141S. +Writing the sf_cmd 8388608 bytes data, waiting... +Write benchmark success, total time: 32.769S. +Reading the sf_cmd 8388608 bytes data, waiting... +Read benchmark success, total time: 9.770S. + +``` + + + +##### 2.2.8.4 经验 + +设备没按预期工作,可查一查pinmux,并且pinmux中各个pin的function number不能想当然的认为从小到大顺序增长,芯片厂家有时候为对称性或设计美观,有些function number是跳过的 + +如果碰上不小心误改FRDM-MCXN947板子的swd有关针脚的pinmux,导致daplink再也连不上时,可以一直按住FRDM-MCXN947板子上ISP按钮再按RST按钮强制无条件进ISP BOOT mode,这时daplink可以连上了,板子救回 + + +## 3. 原文连接 + +文章1:https://club.rt-thread.org/ask/article/6dd07af96c966305.html + +文章2-连接1:https://club.rt-thread.org/ask/article/fe8a41cc4cff573a.html + +文章2-连接2:https://club.rt-thread.org/ask/article/70ee638811dc459a.html + +文章2-连接3:https://club.rt-thread.org/ask/article/65bf948814d237bc.html + + + +# **八、恩智浦FRDM-MCX947上的PWM实践**(幸年军) + +## 1. 开发环境 + +> keil mdk + +## 2. 步骤说明 + +### 2.1 下载环境 + +1、下载安装MDK开发环境,由于本人习惯keil,所以后续都是使用keil进行测试,根据官方要求,MCX-N947这款开发板需要5.38及以上版本; + 2、下载官方的rt-thread-master,下载地址为:https://github.com/RT-Thread/rt-thread/ ,解压后,在如下路径打开工程文件\rt-thread-master\bsp\nxp\mcx\mcxn\frdm-mcxn947\project,如下图所示 +![捕获1.JPG](Book_Picture/90a45c8d3b8837e26e0f04548d54f00f.jpg.webp) + +### 2.2 编译 + +直接编译的话会出现如下错误 + +![screenshot_image.png](Book_Picture/771c01b91ac8d2728ea51466ebead345.png) + +提示找不到rt_vsnprintf.c,解决方法有两种: + +- 将rt_vsnprintf.c不添加到工程,选择rt_vsnprintf.c右键,点第一个Opitions for File rt_vsnprintf.c,取消Include in Target Bulid前面的√,如下图所示; + + ![screenshot_image.png](Book_Picture/6cbf54b2a8c047d623296d85bb9cb8a3.png.webp) + +- 通过env工具重新生成MDK工程,详细步骤可以参考rtthread官网,地址https://www.rt-thread.org/document/site/#/development-tools/env/env ;建议使用第二种方法,本人也是使用第二种方法进行测试; + +### 2.3 配置工程 + +通过步骤2安装好env工具后,就可以在project目录重新配置工程,鼠标右键选择ConEmu Here,如下所示; + +![screenshot_image.png](Book_Picture/ee3a4372d62672841ed3d137187527a9.png-171524803095463.webp) + + + +在弹出的命令窗口输入menuconfig 命令,回车,即出现配置窗口,如下所示 + +![screenshot_image.png](Book_Picture/495b2bee3da03739167ea96a72aeb88d.png.webp) + +选择Hardware Drivers Config —>On-chip Peripheral ,选中Timer和PWM,点Save 和 Exit,返回到cmd界面,输入scons —target=mdk5,生成新的工程。 +![screenshot_image.png](Book_Picture/64873c8c1f363743230d6797a1ef6ab8.png.webp) + +可以看到MCX-N947开发板的 Green LED引脚可以作为PWM0的通道3输出,所以后续步骤直接通过rtthread的驱动模块直接操作Green LED引脚即可,驱动详细说明可以参考rtthread官网的驱动介绍,地址https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pwm/pwm; + 查看MCX-N947开发板手册,可以找到Green LED引脚为P0_27引脚,所以直接在工程开始通过宏定义该引脚,同理,定义设备号和通道;如下图 + +![screenshot_image.png](Book_Picture/b376d1e5fe5cf2d139561319a9c450b1.png) + +### 2.4 编写代码 + +在main函数中,定义需要用的变量,如周期,占空比,增长方向参数等,使用先查找设备接口查找设备,然后通过修改pwm周期占空比参数接口,不断的修改pwm的占空比,模拟出渐亮渐暗的呼吸效果;如下图所示 + +![screenshot_image.png](Book_Picture/e30ab7cbbf19b33420175ea11237cefe.png) + + + +### 2.5 下载烧录观察现象 + +下载到开发板,可以看到LED灯呈现绿色的渐亮渐灭呼吸效果; + +通过示波器可以观察到pwm波形,占空比先不断增加,然后不断减小,周而复始,如下如所示: + +![screenshot_image.png](Book_Picture/2b93a6ed16724361d42e95ab4cbf775f.png.webp) + +![screenshot_image.png](Book_Picture/f029c397ad671e06b67e264e6deb5ac5.png.webp) + +![screenshot_image.png](Book_Picture/4bf807a21f34f425b4ae9bccdd9dcd42.png.webp) + +## 原文连接 + +原文连接:https://club.rt-thread.org/ask/article/66f1ac25504e640b.html + + + +# **九、恩智浦FRDM-MCX947上的 IIC(软件) 实践**(刘江龙~(文章1)~、印凯平~(文章2)~) + +## 1. 开发环境 + +> 文章1 Keil MDK +> +> 文章2 ENV环境 + +## 2. 步骤说明 + +### 2.1 文章1 + +#### 2.1.1 安装keil5软件 + +参考rt-thread官方文档教程-快速开发 +[https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/quick-start/frdm_mcxn947/quick-start] + 安装至少MDK-ARM 5.38或以上版本,我下载的是5.39,旧的版本工具链啥的会有兼容问题 + +![screenshot_image.png](Book_Picture/9a6f7c6b890eb74b8cbd4bb130b73c25.png.webp) + +问题记录:使用keil5连接不上板卡,无法识别cmsis-dap + +![screenshot_image.png](Book_Picture/d4cbc0db7019c3f16ba3a74783698a70.png.webp) + +未识别到设备时,此时sw device这里会为空 + +![screenshot_image.png](Book_Picture/e552319cc0590b5c6879afa0d80e300b.png.webp) + +本人重新安装keil5后便正常,可能是驱动的原因。 +使用官方的uninstall把软件删除,它会把一些驱动啥的也删除,然后再重新安装就可以正常识别了,别的方法比如覆盖安装新版本都试过了没有用。 + +正常安装完后需要安装对应的板卡包,要去keil官网找到对应板卡的pack ![screenshot_image.png](Book_Picture/6e33daff6dc5e441073953fcd5753b8b.png.webp) 最新的17.0.0版本就行了,点击下载 + +![screenshot_image.png](Book_Picture/1a30bdd3cbe5a725915521f280bf40f0.png) + +安装完keil后会显示pack install图标,双击即可安装 + +![screenshot_image.png](Book_Picture/16cfdd300117302687989bdf90dda3cf.png) + +安装完后即可在pack install 查看板卡信息 + +![screenshot_image.png](Book_Picture/e106b7877e3b19fb1fe16e51200adb52.png.webp) + +安装keil后进入pack installer 默认会下载各个厂商的常用板卡包,在这里只要安装对应板卡的包就能正常编译项目了 + +#### 2.1.2 rt-thread 的源代码 + +RT-Thread是一个开源的嵌入式实时操作系统(RTOS),专门设计用于嵌入式系统和物联网(IoT)设备。它具有小巧、灵活、可裁剪、可移植等特点,适用于各种不同的处理器架构和硬件平台。RT-Thread提供了丰富的功能组件和严格的实时性能,使得它能够应用于多种嵌入式系统,包括工业控制、智能家居、医疗设备、智能穿戴、智能交通等领域 + + +```c +git clone https://gitee.com/rtthread/rt-thread.git +``` + +#### 2.1.3 ENV工具 + +RT-Thread ENV 工具是 RT-Thread 官方提供的一个环境配置工具,用于方便地配置和管理 RT-Thread 工程的环境参数。它通常与 RT-Thread Studio 集成在一起,为用户提供了一个可视化的环境配置界面。 + +下载完是一个压缩包,解压后工具都在里面 +![screenshot_image.png](Book_Picture/5087e03577337f74f6747d0992ec07b9.png) + +打开env.exe 后进入env工具,可以用menuconfig配置项目,挺方便的。 + 在设置里面使能功能,然后会修改相关代码。 + 使用起来就相当于一个小型linux系统,用于项目管理,比如tina linux + ![screenshot_image.png](Book_Picture/9951a8ce39712f9f2fa388f60131a5ee.png.webp) 先使用cd命令切换到项目目录 + +![screenshot_image.png](Book_Picture/ccf397cf13b44c68a8572e0ef16301e2.png) + +然后输入menuconfig就能进入配置页面,有Kconfig配置文件的目录才能打开menuconfig + +![screenshot_image.png](Book_Picture/81b1d61cf20e64a55773ff4cd3644867.png.webp) + +我们需要使能I2C软件 + +设定软件模拟I2C,并且配置相应的引脚 + +![screenshot_image.png](Book_Picture/32746091652abe331b041126a3195efe.png.webp) + +开启I2C + +![screenshot_image.png](Book_Picture/6e2e32985afcb217429d53d9452915d7.png.webp) + +加入ssd1306驱动支持 + +![screenshot_image.png](Book_Picture/197653133f39b9d5b3c1424dfed4d005.png) + +设置I2C地址以及名称 + +![screenshot_image.png](Book_Picture/3410d5bdecf1d90f0b22712b8f92a1b8.png) + + + +配置完成后需要更新项目 + +```c +pkgs --update +``` + + + +![screenshot_image.png](Book_Picture/470a415caa9f23e77411bc58ca9cf445.png) + +然后导出相应ide的项目 + +导出mdk项目 + +```c +scons --target=mdk5 +``` + +进入项目目录,打开project.uvprojx项目文件 + +![screenshot_image.png](Book_Picture/56e76bde70ce1667af34ffcd88ad798a.png) + +#### 2.1.4 Keil配置 + +项目目录结构 + +![screenshot_image.png](Book_Picture/85bdb066fdc885bad4653881ab6cffc6.png.webp) + + + +ssd1306目录包含了相关驱动代码 + +设置默认c编译器为c99 + +![screenshot_image.png](Book_Picture/9272407b9abed443b0a583047f324b72.png.webp) + +点击编译 + +![screenshot_image.png](Book_Picture/f9db87d72be025f8c58cf73d52548272.png.webp) + +会报一些错误,将相关代码删除即可 + 忽略相关警告 + +查看keil软件是否连接板卡 + +![screenshot_image.png](Book_Picture/aedf4bfcfa7e8bdf1b54cfdfac8be884.png-171524958094093.webp) + +点击下载至板卡 + +![screenshot_image.png](Book_Picture/aedf4bfcfa7e8bdf1b54cfdfac8be884.png-171524958094093.webp) + +按下reset后重启执行更新的代码,闪烁蓝色呼吸灯 + +#### 2.1.5 打开串口工具 + +连接后打印rt-thread信息 + +![screenshot_image.png](Book_Picture/21aedf589066744d53887b49b4ddd30b.png) + +查看支持的命令 + +![screenshot_image.png](Book_Picture/242e1a8f30f9fc8d1544e685e0a7e575.png) + + + +#### 2.1.6 板卡连接 + +ssd1306 有四个引脚,两个用于I2C通信,另外两个供电 + 前面配置板卡I2C模拟引脚为P0_4(SCL),P0_5(SDA),连接好通信的端口以及3.3V供电 + +![screenshot_e344cedfd3c4f645d6a21700f531cda.jpg](Book_Picture/2483d9b38b174b1bb2a42b207b85cb9a.jpg.webp) + +执行ssd1306_TestAll命令后开始测试oled屏幕 + +![screenshot_365e2b35bfc3faf7c7433127234cd77.jpg](Book_Picture/25600ced37217c3e74c92470fa17a1b7.jpg.webp) + +#### 2.1.7 测试资料 + +测试视频:https://www.bilibili.com/video/BV1Vr421g7Bu/ + +测试代码:https://github.com/icegodness/MCXN947_ssd1306 + + +### 2.2 文章2 + +#### 2.2.1 新建工程 + +环境准备: + +首先根据RT-thread文档步骤走:NXP FRDM-MCXN947 (rt-thread.org) + +- 需要安装 MDK-ARM 5.38 (或以上版本均可) + + +- 下载最新的源码https://github.com/RT-Thread/rt-thread/ + + +找到frdm-mcxn947软件工程: + +![screenshot_image.png](Book_Picture/e43b9e3d402b6ecbea3d64a80432d7b0.png) + +建立工程IIC软件模拟测试工程命令为:frdm-mcxn947_IIC(simulate)SH1106。 + +通过一个OLED测试IIC(软件模拟) + +准备工作: + +- 准备一片OLED物料,支持IIC通信方式。 + + +- 查询OLED手册,找到屏幕分辨率与其控制芯片。本次使用分辨率:128*64,控制芯片为SH1106。 + + +首次编译出现报错: +![screenshot_image.png](Book_Picture/45ebd573941c2410432a55a0a14c83a9.png) + +在工程首页打开EVN工具更新一下工程。会提示缺失文件的软件包更新。 + +![screenshot_image.png](Book_Picture/ce5b59913e8ba358f3c15eb8079fd2b0.png.webp) + +再次编译: + +![screenshot_image.png](Book_Picture/ce25588cb1a7d2967da07b3f5a92fcdd.png.webp) + +连接设备:下载代码,提示代码下载完成。 + +![screenshot_image.png](Book_Picture/042b4119286256772a5d66dd33947936.png-1715249990237104.webp) + + + +![screenshot_image.png](Book_Picture/042b4119286256772a5d66dd33947936.png-1715249990237104.webp) + +打卡终端助手:已经打印串口信息。“frdm-mcxn947”工程运行起来了!按下SW2按键输出 “sw pressed”。 + +![screenshot_image.png](Book_Picture/48046e669bb952fc83938842fddd79f5.png) + + + +#### 2.2.2 配置IIC(软件) + +查看原理图与工程例程了解引脚的定义方式。可以看到: + +原理图中例程 LED 引脚为:P0_10 + +```c +#define LEDB_PIN ((0*32)+10) +``` + +原理图中例程按键引脚P0_23 + +```c +#define BUTTON_PIN ((0*32)+23) +``` + +![screenshot_image.png](Book_Picture/f961049204c09a22604a0ffda3185ee4.png.webp) + +根据此方式需要定义模拟IIC引脚: P0_24、P0_25 + +进入ENV工具修改设备驱动如下: + +![screenshot_image.png](Book_Picture/b6957bd4ce7985518f72d318f615c810.png.webp) + +增加SH1106软件包。由于SSD1306、SH1106兼容所以直接使用SSD1306软件包测试。 + +![screenshot_image.png](Book_Picture/fc436a1e63fb0760803b443e5690cb35.png.webp) + +确认后需要更新软件包并重新生成工程,如下指令。 + +```c +pkgs --update +scons --target=mdk5 +``` + + + +编译工程报错。缺失头文件”_ansi.h”。 + +原因: + +_ansi.h 是 newlib 提供的头文件,Keil 环境可能没有提供该头文件。引入 _ansi.h 是为了使用 _BEGIN_STD_C 和 _END_STD_C 宏定义。 + +需要怎么做: + +需要把头文件“ssd1306.h”和“ssd1306_tests.h”宏定义替换为: + +```c +_BEGIN_STD_C 替换为 #define _BEGIN_STD_C extern "C" { +_END_STD_C 替换为 #define _END_STD_C } +``` + +重新编译,编译成功! + +#### 2.2.3代码验证 + +##### 2.2.3.1 测试代码 + +输入测试指令 + +```c +ssd1306_TestAll +``` + +![screenshot_image.png](Book_Picture/161ee550046696b5c45869f659f9a422.png) + +可以看到,LOG,模拟IIC 已经创建。SCL 引脚为:0x18( 24 ) SDA引脚为: 0x19( 25 )。与ENV工具定义相同。 + +![screenshot_image.png](Book_Picture/bd2a7ece7970ab10eb03c7cec300dba6.png.webp) + +IIC(软件模拟)测试完成。 + +另:同时测试了硬件IIC ,硬件IIC刷新屏幕感官速度会快一些。 + + + +## 3. 原文连接 + +文章1:https://club.rt-thread.org/ask/article/ce413688e704abdf.html + +文章 2:https://club.rt-thread.org/ask/article/3a0ab90b237b617c.html + + + +# **十、恩智浦FRDM-MCX947上的 IIC(硬件) 实践**(莫海文) + +## 1. 开发环境 + +基本的开发资料有以下几个,软件包或者资料都可以在NXP官网、Keil的官网找到,插一句话,最近Keil免费了。 + +> 1. MDK531 +> 2. NXP.MCXN947_DFP.17.0.0 +> 3. rt_vsnprintf_full-latest.zip开发包 +> 4. 官方的文档:UM12018.pdf +> 5. RT-Thread GitHub仓库最新代码 + +开发环境搭建请参考视频:[FRDM-MCXN947开发板开发环境上手_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1LD421j7V1/?spm_id_from=333.999.0.0&vd_source=d939b06c630702aeb499bac767324c8c)。 + +## 2. 步骤说明 + +### 2.1 实验目的 + +最近南方地区都在下暴雨,气候闷热潮湿,人们出门都在时刻关注天气的变化情况;刚好这个时候RT-Thread社区给我送来一款包装精致的NXP开发板,让我手头上的BME280温湿度气压传感器有了用武之地;BME280采用i2c接口和主机通信,能实时监控室内、室外的温度、湿度、大气压情况,基于它我们能做很多工业、物联网、医疗、汽车方面的应用 + +### 2.2 实验准备 + +我们需要准备以下材料 + +1. NXP FRDM-MCXN947开发板 +2. 温湿度气压模块BME280 (i2c接口) +3. SSD1306 OLED模块(i2c接口) +4. 公母头杜邦线若干 + +### 2.3 模块电路 + +#### 2.3.1 板载资源 + +本次实验是通过软件i2c + 硬件i2c方式来进行通信,软件i2c采用引脚P0_4 (SCL)和P0_5 (SDA) ,硬件i2c采用引脚P0_25 (SCL)和P0_24 (SDA),前者位于`J9`内侧的第8和第9引脚,后者位于`J2`外侧的第7和第5引脚,引脚图参考如下,注意不要接错 + +![i2c引脚图.png](Book_Picture/4769dd41945b5bd11449f1603cf3d037.png.webp) + +#### 2.3.2 实物连接 + +软件i2c口接OLED SSD1306模块,硬件i2c口接BME280模块,电源VCC和GND在J8和J6上面都有,千万别接错了! + +![实物连接图.jpg](Book_Picture/933fc5d40be54289c1afba65f06951ea.jpg.webp) + + + +### 2.4 程序设计 + +#### 2.4.1 模块配置 + +克隆rt-thread官方仓库的代码,MCXN947板子的最小例程在`bsp\nxp\mcx\mcxn\frdm-mcxn947`目录下 + +```c +git clone https://github.com/RT-Thread/rt-thread.git +``` + +用RT-Thread Studio导入frdm-mcxn947工程,然后打开env工具 + +![env工具.png](Book_Picture/2fe81c312ade7cf42d83397429aa7854.png.webp) + +在env终端输入命令menuconfig,配置rt-thread工程 + +![menuconfig.png](Book_Picture/2ab18f49928a723aea4938ab3f8a13e6.png.webp) + +在`RT-Thread Components`下找到`Device Drivers`并`Select`进去,软件i2c引脚配置如下 + +![软件i2c.png](Book_Picture/81db0a38cb64d05b9984f5d77b5de003.png.webp) + +在`Hardware Drivers Config`下找到`On-chip Peripheral Drivers`并`Select`进去,硬件i2c引脚配置如下 + +![硬件i2c.png](Book_Picture/6b7436db731ea0c3d6325449e147601b.png.webp) + +找到`RT-Thread online packages -> peripheral libraries and drivers -> ssd1306`并`Select`进去,配置SSD1306模块,记得改掉I2c bus name和开启ssd1306的sample选项,这里名称为i2c2,和上面配置的软件i2c名称一致 +![ssd1306.png](Book_Picture/f2d04b19f50e09ad9b3b723e1a87eb57.png.webp) + +配置完后通过`Exit`退出,先更新软件包,再导出为mdk5工程,然后用Keil5打开 + +```c +pkgs --update +scons --target=mdk5 +``` + +#### 2.4.2 编译工程 + +需要注释一些代码确保编译通过 + +ssd1306_tests.h + +![ssd1306_tests头文件.png](Book_Picture/351cbd3da9cc998dd701dba293606bdd.png.webp) + +ssd1306.h + +![ssd1306头文件.png](Book_Picture/df22b47a8a1609e6ae0bd17a0f0572ef.png.webp) + + + +#### 2.4.3 编码集成 + +##### 2.4.3.1 SSD1306 + +调用初始化接口并设置背景为黑色 + +``` c +ssd1306_Init(); +ssd1306_Fill(Black); +``` + +绘图接口示范,先往buffer里边填字符串数据,然后设置坐标,再绘制字符 + +```c +rt_memset(buffer, SIZE, 0); +rt_snprintf(buffer, SIZE, "Temp : %d'C\r\n",(int)temp_act); +ssd1306_SetCursor(2, 26); +ssd1306_WriteString(buffer, Font_6x8, White); +``` + +##### 2.4.3.2 BME280 + +`readCalibrationData`、`calibration_T`、`calibration_P`、`calibration_H`用于读取和校准BME280的数据 + +```c +static unsigned long int hum_raw,temp_raw,pres_raw; +static rt_uint8_t data[8]; +static signed long int t_fine; +static uint16_t dig_T1; +static int16_t dig_T2; +static int16_t dig_T3; +static uint16_t dig_P1; +static int16_t dig_P2; +static int16_t dig_P3; +static int16_t dig_P4; +static int16_t dig_P5; +static int16_t dig_P6; +static int16_t dig_P7; +static int16_t dig_P8; +static int16_t dig_P9; +static int8_t dig_H1; +static int16_t dig_H2; +static int8_t dig_H3; +static int16_t dig_H4; +static int16_t dig_H5; +static int8_t dig_H6; +static signed long int temp_cal; +static unsigned long int press_cal,hum_cal; +static double temp_act; +static double press_act; +static double hum_act; +static void readCalibrationData() +{ + uint8_t data[32]; + read_bme280_reg(0x88, data, 24); + read_bme280_reg(0xa1, data + 24, 1); + read_bme280_reg(0xe1, data + 25, 7); + dig_T1 = (data[1] << 8) | data[0]; + dig_T2 = (data[3] << 8) | data[2]; + dig_T3 = (data[5] << 8) | data[4]; + dig_P1 = (data[7] << 8) | data[6]; + dig_P2 = (data[9] << 8) | data[8]; + dig_P3 = (data[11]<< 8) | data[10]; + dig_P4 = (data[13]<< 8) | data[12]; + dig_P5 = (data[15]<< 8) | data[14]; + dig_P6 = (data[17]<< 8) | data[16]; + dig_P7 = (data[19]<< 8) | data[18]; + dig_P8 = (data[21]<< 8) | data[20]; + dig_P9 = (data[23]<< 8) | data[22]; + dig_H1 = data[24]; + dig_H2 = (data[26]<< 8) | data[25]; + dig_H3 = data[27]; + dig_H4 = (data[28]<< 4) | (0x0F & data[29]); + dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F); + dig_H6 = data[31]; +} +static signed long int calibration_T(signed long int adc_T) +{ + signed long int var1, var2, T; + var1 = ((((adc_T >> 3) - ((signed long int)dig_T1<<1))) * ((signed long int)dig_T2)) >> 11; + var2 = (((((adc_T >> 4) - ((signed long int)dig_T1)) * ((adc_T>>4) - ((signed long int)dig_T1))) >> 12) * ((signed long int)dig_T3)) >> 14; + t_fine = var1 + var2; + T = (t_fine * 5 + 128) >> 8; + return T; +} +static unsigned long int calibration_P(signed long int adc_P) +{ + signed long int var1, var2; + unsigned long int P; + var1 = (((signed long int)t_fine)>>1) - (signed long int)64000; + var2 = (((var1>>2) * (var1>>2)) >> 11) * ((signed long int)dig_P6); + var2 = var2 + ((var1*((signed long int)dig_P5))<<1); + var2 = (var2>>2)+(((signed long int)dig_P4)<<16); + var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13)) >>3) + ((((signed long int)dig_P2) * var1)>>1))>>18; + var1 = ((((32768+var1))*((signed long int)dig_P1))>>15); + if (var1 == 0) + { + return 0; + } + P = (((unsigned long int)(((signed long int)1048576)-adc_P)-(var2>>12)))*3125; + if(P<0x80000000) + { + P = (P << 1) / ((unsigned long int) var1); + } + else + { + P = (P / (unsigned long int)var1) * 2; + } + var1 = (((signed long int)dig_P9) * ((signed long int)(((P>>3) * (P>>3))>>13)))>>12; + var2 = (((signed long int)(P>>2)) * ((signed long int)dig_P8))>>13; + P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4)); + return P; +} +static unsigned long int calibration_H(signed long int adc_H) +{ + signed long int v_x1; + v_x1 = (t_fine - ((signed long int)76800)); + v_x1 = (((((adc_H << 14) -(((signed long int)dig_H4) << 20) - (((signed long int)dig_H5) * v_x1)) + + ((signed long int)16384)) >> 15) * (((((((v_x1 * ((signed long int)dig_H6)) >> 10) * + (((v_x1 * ((signed long int)dig_H3)) >> 11) + ((signed long int) 32768))) >> 10) + (( signed long int)2097152)) * + ((signed long int) dig_H2) + 8192) >> 14)); + v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int)dig_H1)) >> 4)); + v_x1 = (v_x1 < 0 ? 0 : v_x1); + v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1); + return (unsigned long int)(v_x1 >> 12); +} + +``` + +i2c读写接口封装 + +```c +static int read_bme280_reg(rt_uint8_t reg_addr, rt_uint8_t *data, rt_uint8_t len) +{ + struct rt_i2c_msg msgs[2]; + msgs[0].addr = BME280_ADDR; + msgs[0].flags = RT_I2C_WR; + msgs[0].buf = ®_addr; + msgs[0].len = 1; + msgs[1].addr = BME280_ADDR; + msgs[1].flags = RT_I2C_RD; + msgs[1].buf = data; + msgs[1].len = len; + if (rt_i2c_transfer(i2c_bus, msgs, 2) == 2) + { + return RT_EOK; + } + else + return -RT_ERROR; +} +static int8_t write_bme280_reg(uint8_t reg, uint8_t *data, uint16_t len) +{ + rt_uint8_t tmp = reg; + struct rt_i2c_msg msgs[2]; + msgs[0].addr = BME280_ADDR; /* Slave address */ + msgs[0].flags = RT_I2C_WR; /* Write flag */ + msgs[0].buf = &tmp; /* Slave register address */ + msgs[0].len = 1; /* Number of bytes sent */ + msgs[1].addr = BME280_ADDR; /* Slave address */ + msgs[1].flags = RT_I2C_WR | RT_I2C_NO_START; /* Read flag */ + msgs[1].buf = data; /* Read data pointer */ + msgs[1].len = len; /* Number of bytes read */ + if (rt_i2c_transfer(i2c_bus, msgs, 2) != 2) + { + return -RT_ERROR; + } + return RT_EOK; +} + +``` + +`init_bme280`用于初始化i2c设备 + +```c +static int init_bme280(void) +{ + i2c_bus = (struct rt_i2c_bus_device *) rt_device_find(BME280_I2C_BUS_NAME); + if (i2c_bus == RT_NULL) + { + rt_kprintf("can't find %s device!\n", BME280_I2C_BUS_NAME); + return RT_ERROR; + } + rt_uint8_t data; + int size = read_bme280_reg(0xD0, &data, 1); + rt_kprintf("bme280 device id : %x\n", data); + uint8_t osrs_t = 1; //Temperature oversampling x 1 + uint8_t osrs_p = 1; //Pressure oversampling x 1 + uint8_t osrs_h = 1; //Humidity oversampling x 1 + uint8_t mode = 3; //Normal mode + uint8_t t_sb = 5; //Tstandby 1000ms + uint8_t filter = 0; //Filter off + uint8_t spi3w_en = 0; //3-wire SPI Disable + uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode; + uint8_t config_reg = (t_sb << 5) | (filter << 2) | spi3w_en; + uint8_t ctrl_hum_reg = osrs_h; + write_bme280_reg(0xF2, &ctrl_hum_reg, 1); + write_bme280_reg(0xF4, &ctrl_meas_reg, 1); + write_bme280_reg(0xF5, &config_reg, 1); + readCalibrationData(); + return RT_EOK; +} + +``` + +将BME280的设置当作一条命令来执行 + +```c +void run_bme280() +{ + bme280_thread = rt_thread_create("bme280", bme280_entry, RT_NULL, 1024, 16, 20); + if(bme280_thread != RT_NULL) + { + rt_thread_startup(bme280_thread); + } +} +MSH_CMD_EXPORT(run_bme280, run bme280); + +``` + +### 2.5 实验现象 + +用窗口工具打开开发板对应的串口,命令行输入`run_bme280` + +![命令行.png](Book_Picture/cc6cf5b66dad1248c7e8525ff3a877e6.png.webp) + + + +效果如下,OLED实时展示当前环境的温度、湿度、大气压 + +![实验效果.jpg](Book_Picture/5cbcae59f8d8284d4e4541acd0f2be76.jpg.webp) + + + +## 3. 原文连接 + +原文连接:https://club.rt-thread.org/ask/article/f667d03a76b90096.html + +开箱视频:https://www.bilibili.com/video/BV1wA4m1A7v9/?spm_id_from=333.999.0.0&vd_source=d939b06c630702aeb499bac767324c8c + +开发视频:https://www.bilibili.com/video/BV1LD421j7V1/?spm_id_from=333.999.0.0&vd_source=d939b06c630702aeb499bac767324c8c + + + + + +# **十一、恩智浦FRDM-MCX947上的ETH实践**(李海) + +## 1. 开发环境 + +NXP FRDM-MCXN947板是NXP官方针对MCX N94x/54x微控制器家族推出的紧凑且可扩展的开发板,帮助用户快速开展原型设计,开发板提供丰富的行业标准接口,可以轻松访问MCU的I/O,同时板载外部闪存与MCU-Link调试器,支持各种附加版的扩展,为用户提供简单高效的评估和开发体验。 +我的任务是测试ETH接口,也就是网络接口。开发板提供了RJ45的接口,我们先测试最基本的网络功能,然后在此基础上测试网络相关的应用程序。 + +> ENV环境 + +## 2. 步骤说明 + +### 2.1 使能PHY驱动 + +在RT-Thread Components -> Device Drivers中选择Using ethernet phy device drivers + +![使能PHY](Book_Picture/45d81c9359c5a3cf8473fe8ca950d677.png) + + + +### 2.2 使能网络相关组件 + +在RT-Thread Components -> Network中选择网络相关的组件 + +![使能网络相关组件](Book_Picture/ec8e9699c71c9c75f51edabc7a8eefdf.png) + + + +### 2.3 遇到的问题和解决方案 + +不过当直接将程序下载到开发板时遇到了一个问题,当使用ifconfig命令时,程序报告错误:ifconfig: network interface device list error. + 然后使用list device命令也确实没有看到网络相关的设备。 + 经过仔细检查编译日志,发现drv_eth.c文件就压根没有编译。而注册网络设备的工作是在drv_eth.c文件中实现的。我检查了drv_eth.c所在目录的D:\rt-thread\bsp\nxp\mcx\mcxn\Libraries\drivers\SConscript。该文件的内容是这样的: + +```c +from building import * +cwd = GetCurrentDir() +src = [] +if GetDepend('BSP_USING_PIN'): + src += ['drv_pin.c'] +if GetDepend('BSP_USING_UART'): + src += ['drv_uart.c'] +if GetDepend('BSP_USING_RTC'): + src += ['drv_rtc.c'] +if GetDepend('BSP_USING_SPI'): + src += ['drv_spi.c'] +if GetDepend('BSP_USING_SDIO'): + src += ['drv_sdio.c'] +if GetDepend('BSP_USING_I2C'): + src += ['drv_i2c.c'] +if GetDepend('BSP_USING_ADC'): + src += ['drv_adc.c'] +if GetDepend('BSP_USING_DAC'): + src += ['drv_dac.c'] +if GetDepend('BSP_USING_HWTIMER'): + src += ['drv_hwtimer.c'] +if GetDepend('BSP_USING_WDT'): + src += ['drv_wdt.c'] +if GetDepend('BSP_USING_PWM'): + src += ['drv_pwm.c'] +path = [cwd,cwd + '/config'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path) +Return('group') + +``` + +从这个文件看,压根就没有添加drv_eth.c,所以即使我们在前面选择了ETH PHY的选项,也不会编译drv_eth.c文件。解决的办法是在文件中加上: + +```c +if GetDepend('RT_USING_PHY'): + src += ['drv_eth.c'] +``` + +### 2.4 测试结果 + +再次编译程序并下载,这次程序就可以正常运行了。 + 我们通过ifconfig命令很容易看到当前的网络配置。ps命令也可以看出当前的各个网络相关线程都正常运行。 + +![检查网络接口](Book_Picture/72dcedb0c6c713147433a2fccfb9ef6c.png) + +再使用PING命令可以正常工作了! + +![ping命令](Book_Picture/224856a35aa7feae067e9b5daded6ad3.png) + + + +## 3. 原文连接 + +原文连接1 : https://club.rt-thread.org/ask/article/418085ebf2358e12.html + +原文连接 2 :https://club.rt-thread.org/ask/article/8c430a3802a8c4a9.html + + + +# **十二、恩智浦FRDM-MCX947上的CAN实践**(舒扬) + +## 1. 开发环境 + +> Keil + ENV + +## 2. 步骤说明 + +### 2.1 配置项修改 + +在此之前,对于CAN模块,需要首先在如下文件中添加使能CAN模块配置项: + `\rt-thread-master\bsp\nxp\mcx\mcxn\frdm-mcxn947\board\Kconfig` + +```c + menuconfig BSP_USING_CAN + bool "Enable CAN" + default n + select RT_USING_CAN + if BSP_USING_CAN + config BSP_USING_CAN0 + bool "Enable CAN0" + default y + config BSP_USING_CAN1 + bool "Enable CAN1" + default n + endif + +``` + +之后打开ENV环境: + +![screenshot_image.png](Book_Picture/6dd25ff4728dab976ddb607fd89fb158.png.webp) + +开启使用CAN外设的开关: + +![screenshot_image.png](Book_Picture/bcc8616c3716b6ab7ec6d25b9dd20337.png.webp) + +接下来选择使用CAN0: + +![screenshot_image.png](Book_Picture/9a33097717cdc3ce3db14b394ddd575f.png.webp) + +点击保存,退出: + +![screenshot_image.png](Book_Picture/c601c666d809bf5deb37e6fe7a3af83e.png) + +生成Keil工程: + +![screenshot_image.png](Book_Picture/53a8af02b2fdbe95c1a6f288c21a576b.png) + + + +### 2.2 添加代码 + +添加can driver: + +![screenshot_image.png](Book_Picture/eb403e9729bdfaf104c3a53a66c3999a.png) + + + +参考:CAN 设备使用示例 https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/can/can?id=can-设备使用示例 + +根据FlexCAN的电路图: +![screenshot_image.png](Book_Picture/1970d6bc093bebfdf6e23c2238feda75.png.webp) + +修改pin_mux.c + +```c +#ifdef BSP_USING_CAN0 + PORT1->PCR[11] = PORT_PCR_MUX(11) | PORT_PCR_PS(0) | PORT_PCR_PE(1) | PORT_PCR_IBE(1); /* CAN0 RX */ + PORT1->PCR[10] = PORT_PCR_MUX(11) | PORT_PCR_PS(0) | PORT_PCR_PE(1) | PORT_PCR_IBE(1); /* CAN0 TX */ +#endif +#ifdef BSP_USING_CAN1 + PORT4->PCR[15] = PORT_PCR_MUX(11) | PORT_PCR_PS(0) | PORT_PCR_PE(1) | PORT_PCR_IBE(1); /* CAN1 RX*/ + PORT4->PCR[16] = PORT_PCR_MUX(11) | PORT_PCR_PS(0) | PORT_PCR_PE(1) | PORT_PCR_IBE(1); /* CAN1 TX*/ +#endif + +``` + +### 2.3 烧录编译 + +编译遇到错误: + +![screenshot_image.png](Book_Picture/c943eb7be02edb25ac332e4f741ed8f0.png) + +修改为: + +```c + /* hdr 值为 - 1,表示直接从 uselist 链表读取数据 */ + rxmsg.hdr_index = -1; +``` + +重新编译,下载: + +![screenshot_image.png](Book_Picture/2f044083cefcf0e9961894e75ecd00e1.png.webp) + +关于控制台输入输出,参考根据Reference Manual: + +![screenshot_image.png](Book_Picture/4ed9143a87a4c9d5a52b5d23f7ca5c77.png.webp) + +检查pin_mux.c里面P1_8与P1_9: + +```c + /* UART */ + PORT1->PCR[8] = PORT_PCR_MUX(2) | PORT_PCR_PS(0) | PORT_PCR_IBE(1); /* FC4_P0 */ + PORT1->PCR[9] = PORT_PCR_MUX(2) | PORT_PCR_PS(0) | PORT_PCR_IBE(1); /* FC4_P1 */ + +``` + +### 2.4 程序运行 + +![screenshot_image.png](Book_Picture/2b7cfcba523dabf4a841d345f2d874cb.png) + +msh> can_sample 回车,可以看到CAN上位机接受到一帧CAN报文: + +![screenshot_image.png](Book_Picture/cfd8879ed1fbc57257b423864431ae22.png.webp) + +在上位机选择定时发送,5s发送一帧: + +![screenshot_image.png](Book_Picture/ea49d4689b0dea17dfc4fd3cc328da2e.png.webp) + +至此,CAN的收发测试完毕。 + +### 2.5 开发资料 + +代码: [nxp.zip](https://club.rt-thread.org/file_download/025db40490f2f336) + +视频:https://club.rt-thread.org/file_download/716b3de02206fa28 + + + +## 3. 原文连接 + +原文连接: https://club.rt-thread.org/ask/article/4eb845060ae9e4b3.html + + + +# **十三、恩智浦FRDM-MCX947上的TFT实践**(莫金瑞) + +## 1. 开发环境 + +> 编译配置工具:env 从 RT-Thread 官网下载 [Env工具](https://www.rt-thread.org/download.html) +> 代码编辑器:vscode +> 下载器:使用LinkServer.exe命令下载,来自于下载Linkserver 1.4.85 installer for Windows (nxp官网) + +## 2. 步骤说明 + +### 2.1 模块介绍 + +#### 2.1.1 硬件 + +FRDM-MCXN947开发板: + +该开发板具有丰富的接口详细可参考NXP官方网站,从下图板载资源中可看出TFTLCD可以通过flexIO进行驱动。 + +![screenshot_image.png](Book_Picture/67019fb82dfd3481e5c7b7264a0681a0.png) + +![screenshot_image.png](Book_Picture/bc023a625fcd17727c1c238395835877.png.webp) + +FTLCD为正点原子并口屏: + +![screenshot_image.png](Book_Picture/1ade7f67d9cf90a615fd8a02a37e3ae3.png.webp) + +#### 2.1.2 软件 + +下拉RTT代码 + +```c +git clone https://github.com/RT-Thread/rt-thread.git rt-thread +``` + +本人在vscode中编辑代码,通过env工具来配置和编译,在windows的PowerShell中使用LinkServer.exe命令来进行烧录。命令如下: + +```c +LinkServer.exe flash MCXN947:FRDM-MCXN947 load ./rtthread.elf +``` + +![screenshot_image.png](Book_Picture/85ae3b8de73fb03ebcccf99c0761bb19.png.webp) + +有简单方式可以在vscode中配置tasks.json,在vscode中实现编辑、编译和烧录一站式操作,参见大佬文章:使用VSCode 搭建 [RT-Thread 关于 NXP mcxn947 开发环境(二)](https://club.rt-thread.org/ask/article/e46d421071211221.html),本人比较懒,从里面搬了烧录命令来使用了。 + + + +#### 2.1.3 为啥不使用keil进行开发? + +主要原因是开发板一到手,下载的最新版并安装了MCXN947_DFP的keil就链接不上板子,CMSIS-DAP链接过程中会报错如下: + +![screenshot_image.png](Book_Picture/e15325826ef83b0591ac3edddaf86628.png) + +我首先思考的是电脑驱动不对,去官网下载了MCU-LINK_installer_3.133,在安装过程会自动安装电脑的驱动(当然事后发现,这个电脑驱动过程其实不需要,会自动装),仍然不起作用!在MCU-LINK_installer_3.133目录下两个脚本,可更新板载下载器固件为JLINK方式,需要配合板子上J21跳线帽来操作。 + +![screenshot_image.png](Book_Picture/814ec4cbc70efab3b0a8e5a2b4626b37.png) + +操作步骤:1.安装跳线帽;2.断电重启;3.运行program_JLINK.cmd程序进行固件更新;4更新完成后,需要取掉跳线帽,然后进行断电重启,(板子上复位按钮不行,必须断电操作)。可以看到keil识别到JLINK: + +![screenshot_image.png](Book_Picture/0d0c70cfe50598483c6c21629d55a8e9.png.webp) + +烧录过程中任然会有报错: + +![screenshot_image.png](Book_Picture/50d4d78b3c125d87ab15f0796343b1f0.png.webp) + +经过一番折腾之后,我将板载下载器固件更新回了CMSIS-DAP方式,采用了上述开发方法。 + +### 2.2 添加LCD驱动与代码修改 + +在ports目录下添加了LCD驱动和SConscript文件 + +![screenshot_image.png](Book_Picture/8b25532961abd17209ee2eee1ae9ae96.png) + +添加完文件后,发现LCD驱动任然没有被编译,主要原因是ports上一级目录中的SConscript文件,没有采用遍历所有目录下的SConscript文件的写法 + 方法一:添加遍历SConscript的写法 + +```c +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +``` + +方法二:参考其他BSP有在根SConscript文件中,单独读取board/ports/SConscript文件 + +```c +objs.extend(SConscript(os.path.join(os.getcwd(), 'board', 'ports', 'SConscript'))) +``` + +在pin_mux.c中缺少对flexIO并口的配置,添加并口,CS,RS,RD,WR,ReSet引脚的配置,代码如下: + +```c +/* Configure port mux of FlexIO data pins */ +void FLEXIO_8080_Config_Data_Pin(void) +{ + FLEXIO_DATA0_PORT->PCR[FLEXIO_DATA0_PIN] = PORT_PCR_MUX(FLEXIO_DATA0_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D0 */ + FLEXIO_DATA1_PORT->PCR[FLEXIO_DATA1_PIN] = PORT_PCR_MUX(FLEXIO_DATA1_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D1 */ + FLEXIO_DATA2_PORT->PCR[FLEXIO_DATA2_PIN] = PORT_PCR_MUX(FLEXIO_DATA2_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D2 */ + FLEXIO_DATA3_PORT->PCR[FLEXIO_DATA3_PIN] = PORT_PCR_MUX(FLEXIO_DATA3_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D3 */ + FLEXIO_DATA4_PORT->PCR[FLEXIO_DATA4_PIN] = PORT_PCR_MUX(FLEXIO_DATA4_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D4 */ + FLEXIO_DATA5_PORT->PCR[FLEXIO_DATA5_PIN] = PORT_PCR_MUX(FLEXIO_DATA5_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D5 */ + FLEXIO_DATA6_PORT->PCR[FLEXIO_DATA6_PIN] = PORT_PCR_MUX(FLEXIO_DATA6_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D6 */ + FLEXIO_DATA7_PORT->PCR[FLEXIO_DATA7_PIN] = PORT_PCR_MUX(FLEXIO_DATA7_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D7 */ + FLEXIO_DATA8_PORT->PCR[FLEXIO_DATA8_PIN] = PORT_PCR_MUX(FLEXIO_DATA8_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D8 */ + FLEXIO_DATA9_PORT->PCR[FLEXIO_DATA9_PIN] = PORT_PCR_MUX(FLEXIO_DATA9_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D9 */ + FLEXIO_DATA10_PORT->PCR[FLEXIO_DATA10_PIN] = PORT_PCR_MUX(FLEXIO_DATA10_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D10 */ + FLEXIO_DATA11_PORT->PCR[FLEXIO_DATA11_PIN] = PORT_PCR_MUX(FLEXIO_DATA11_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D11 */ + FLEXIO_DATA12_PORT->PCR[FLEXIO_DATA12_PIN] = PORT_PCR_MUX(FLEXIO_DATA12_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D12 */ + FLEXIO_DATA13_PORT->PCR[FLEXIO_DATA13_PIN] = PORT_PCR_MUX(FLEXIO_DATA13_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D13 */ + FLEXIO_DATA14_PORT->PCR[FLEXIO_DATA14_PIN] = PORT_PCR_MUX(FLEXIO_DATA14_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D14 */ + FLEXIO_DATA15_PORT->PCR[FLEXIO_DATA15_PIN] = PORT_PCR_MUX(FLEXIO_DATA15_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS(0); /* FXIO0_D15 */ +} +/* Configure FLEXIO_WR pin as FlexIO function */ +void FLEXIO_8080_Config_WR_FlexIO(void) +{ + FLEXIO_WR_PORT->PCR[FLEXIO_WR_PIN] = PORT_PCR_MUX(FLEXIO_WR_PIN_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; +// FLEXIO_WR_PORT->PCR[FLEXIO_WR_PIN] = PORT_PCR_MUX(FLEXIO_WR_PIN_MUX); +} +/* Configure FLEXIO_WR pin as GPIO function and outputting high level */ +void FLEXIO_8080_Config_WR_GPIO(void) +{ + FLEXIO_WR_GPIO->PSOR |= 1U << FLEXIO_WR_PIN; + FLEXIO_WR_GPIO->PDDR |= 1U << FLEXIO_WR_PIN; + FLEXIO_WR_PORT->PCR[FLEXIO_WR_PIN] = PORT_PCR_MUX(0) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; +} +void FLEXIO_8080_Set_WR_Pin(bool level) +{ + if(level) + { + FLEXIO_WR_GPIO->PSOR |= 1U << FLEXIO_WR_PIN; + } + else + { + FLEXIO_WR_GPIO->PCOR |= 1U << FLEXIO_WR_PIN; + } +} +/* Configure FLEXIO_RD pin as FlexIO function */ +void FLEXIO_8080_Config_RD_FlexIO(void) +{ + FLEXIO_RD_PORT->PCR[FLEXIO_RD_PIN] = PORT_PCR_MUX(FLEXIO_RD_PIN_MUX) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; +} +/* Configure FLEXIO_RD pin as GPIO function and outputting high level */ +void FLEXIO_8080_Config_RD_GPIO(void) +{ + FLEXIO_RD_GPIO->PSOR |= 1U << FLEXIO_RD_PIN; + FLEXIO_RD_GPIO->PDDR |= 1U << FLEXIO_RD_PIN; + FLEXIO_RD_PORT->PCR[FLEXIO_RD_PIN] = PORT_PCR_MUX(0) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; +} +/* Set FLEXIO_CS pin's level */ +void FLEXIO_8080_Set_RD_Pin(bool level) +{ + if(level) + { + FLEXIO_RD_GPIO->PSOR |= 1U << FLEXIO_RD_PIN; + } + else + { + FLEXIO_RD_GPIO->PCOR |= 1U << FLEXIO_RD_PIN; + } +} +/* Configure FLEXIO_CS pin as GPIO function and outputting high level */ +void FLEXIO_8080_Config_CS_GPIO(void) +{ + FLEXIO_CS_GPIO->PSOR |= 1U << FLEXIO_CS_PIN; + FLEXIO_CS_GPIO->PDDR |= 1U << FLEXIO_CS_PIN; + FLEXIO_CS_PORT->PCR[FLEXIO_CS_PIN] = PORT_PCR_MUX(0U) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; +} +/* Set FLEXIO_CS pin's level */ +void FLEXIO_8080_Set_CS_Pin(bool level) +{ + if(level) + { + FLEXIO_CS_GPIO->PSOR |= 1U << FLEXIO_CS_PIN; + } + else + { + FLEXIO_CS_GPIO->PCOR |= 1U << FLEXIO_CS_PIN; + } +} +/* Configure RS pin as GPIO function and outputting high level */ +void FLEXIO_8080_Config_RS_GPIO(void) +{ + FLEXIO_RS_GPIO->PSOR |= 1U << FLEXIO_RS_PIN; + FLEXIO_RS_GPIO->PDDR |= 1U << FLEXIO_RS_PIN; + FLEXIO_RS_PORT->PCR[FLEXIO_RS_PIN] = PORT_PCR_MUX(0U) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; +} +/* Set RS pin's level */ +void FLEXIO_8080_Set_RS_Pin(bool level) +{ + if(level) + { + FLEXIO_RS_GPIO->PSOR |= 1U << FLEXIO_RS_PIN; + } + else + { + FLEXIO_RS_GPIO->PCOR |= 1U << FLEXIO_RS_PIN; + } +} +/* Configure ReSet pin as GPIO function and outputting high level */ +void FLEXIO_8080_Config_ReSet_GPIO(void) +{ + FLEXIO_ReSet_GPIO->PSOR |= 1U << FLEXIO_ReSet_PIN; + FLEXIO_ReSet_GPIO->PDDR |= 1U << FLEXIO_ReSet_PIN; + FLEXIO_ReSet_PORT->PCR[FLEXIO_ReSet_PIN] = PORT_PCR_MUX(0U) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; +} +/* Set ReSet pin's level */ +void FLEXIO_8080_Set_ReSet_Pin(bool level) +{ + if(level) + { + FLEXIO_ReSet_GPIO->PSOR |= 1U << FLEXIO_ReSet_PIN; + } + else + { + FLEXIO_ReSet_GPIO->PCOR |= 1U << FLEXIO_ReSet_PIN; + } +} +/* Configure ReSet pin as GPIO function and outputting high level */ +void FLEXIO_8080_Config_Te_GPIO(void) +{ + FLEXIO_Te_GPIO->PSOR |= 1U << FLEXIO_Te_PIN; + FLEXIO_Te_GPIO->PDDR |= 1U << FLEXIO_Te_PIN; + FLEXIO_Te_PORT->PCR[FLEXIO_Te_PIN] = PORT_PCR_MUX(0U) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; +} +/* Set ReSet pin's level */ +void FLEXIO_8080_Set_Te_Pin(bool level) +{ + if(level) + { + FLEXIO_Te_GPIO->PSOR |= 1U << FLEXIO_Te_PIN; + } + else + { + FLEXIO_Te_GPIO->PCOR |= 1U << FLEXIO_Te_PIN; + } +} + + +``` + + + +### 2.3 编译运行 + +[程序运行.mp4](https://oss-club.rt-thread.org/uploads/20240414/00545cf4e8a025deef7a15b9b83b9d02.mp4) + +![0b5018b41c7deda43f75 -big-portrait.gif](Book_Picture/4b41ec9e5339414f9001231213465899.gif) + + + +#### 2.4 LVGL使用 + +在menuconfig中启用lvgl + +![screenshot_image.png](Book_Picture/c890da27b81c3facf1f4b8f3e84238ae.png) + +在applicaions中添加了lvgl相关的配置和接口文件 + +![screenshot_image.png](Book_Picture/72212169e5d905bdd69c5db2f6488544.png) + +在lv_conf.h中定义了一下几个宏定义 + +```c +#define LV_COLOR_16_SWAP 0 /*spi通信时设置1 */ +#define LV_COLOR_DEPTH 16 /*颜色深度 */ +#define LV_USE_PERF_MONITOR 1 /*启用帧率监控 */ +``` + +在lv_port_disp.c中定义了显示分辨率、显示buffer、显示更新的回调函数,并在lv_port_disp_init函数里进行注册 + +![screenshot_image.png](Book_Picture/af723325c813439a48cd524ae375ed6e.png) + +在回调函数里调用lcd驱动里的区域填充函数 + +![screenshot_image.png](Book_Picture/70152c854c0e5ea271f2e857424ae6e9.png) + +### 2.5 LVGL验证 + +跑一个benchmark看一看效果 + +![sdf -big-portrait.gif](Book_Picture/707c0f628112a151ae111aea53f9d3c8.gif) + +lvgl跑出来的帧率为18 + +![screenshot_image.png](Book_Picture/1c73ccf75883f3e4cb9e8c7dc8a4db15.png.webp) + +采用编译优化等级O1,导致LCD功能有问题,屏幕不显示。于是LCD驱动部分代码采用O0,其他代码采用O1,修改编译脚本rtconfig.py,脚本默认走的是debug分支,将其修改到release分支 + +![screenshot_image.png](Book_Picture/4045101a0caffd543b973447ef2d641e.png) + +当然这个修改会对整个工程产生影响,需要在LCD驱动部分编译脚本中添加局部编译参数 + +![screenshot_image.png](Book_Picture/29422f07254b0562f4ca5767416b40f4.png) + +lvgl帧率提升至26 + +![screenshot_image.png](Book_Picture/9d666abb5ea7161e84de309602c50099.png.webp) + +当然尝试了双buf和优化等级O3,帧率没有再提高 + +### 2.6 开发资料 + +测试代码: https://club.rt-thread.org/file_download/abeb4979abe82a68 + + + +### 2.7 FRDM-MCXN947在windows下使用GDB + +上文缺少了debug的表述,在这里补充FRDM-MCXN947开发板在windows下使用GDB工具来debug的方法。 + +LinkServer.exe除了下载程序到flash的作用外,还提供了gdbserver,为gdb的使用提供了基础。 + 在常用方式下,GDB调试命令,OpenOCD根据调试命令转换到对应硬件的表述。在gdbserver中提供了相应的硬件信息,同时为GDB提供了接口,来实现GDB调试。 +![screenshot_image.png](Book_Picture/44e44e99a1c8841a2f28defacfbbe2aa.png) + +#### 2.7.1 下载程序到flash + +```c +LinkServer.exe flash MCXN947:FRDM-MCXN947 load .\rtthread.elf +``` + +#### 2.7.2 启动gdbserver + +```c +LinkServer.exe gdbserver MCXN947:FRDM-MCXN947 +``` + +可以看到gdbserver为gdb打开了3333端口 + +![screenshot_image.png](Book_Picture/3931f2308bed22146b1359a72a907dcc-1715308334739161.png) + +#### 2.7.3 gdb接入gdbserver端口 + +gdb使用的是env工具env_released_1.3.5\env-windows-v1.3.5\tools\gnu_gcc\arm_gcc\mingw\bin目录下的arm-none-eabi-gdb.exe,并将该目录加入了环境变量PATH,便于直接使用arm-none-eabi-gdb.exe命令。 + +首先gdb要载入刚刚下载的二进制文件,并进入gdb + +```c +arm-none-eabi-gdb.exe .\rtthread.elf +``` + +gdb接入gdbserver的3333端口 + +```c +target remote :3333 +``` + +![screenshot_image.png](Book_Picture/d4eee48a3012ae68e384611d8d2f10e4.png) + +同时可以看到gdbserver终端打印出了,链接成功的日志 + +![screenshot_image.png](Book_Picture/455bce4a3126e8cff4e584baae2cb0ad.png) + +接下来就可以开心的debug啦! + +#### 2.7.4 gdb调试展示 + +由于没有软重启的功能,所以进入gdb后需要reset按钮手动重启 + 先gdb中打好main.c中的断点,然后continue + +![screenshot_image.png](Book_Picture/273d6110e1e246ac758e51a283643e04.png) + +手动reset板子,可以发现已经hit上断点了 + +![screenshot_image.png](Book_Picture/bdf5d18d4219fcc9398dad8c39649d0a.png) + +单步执行,可以看到蓝色的LED等随着程序单步运行而亮灭: + +![screenshots.gif](Book_Picture/91e2141bbc00f9fdaa332a1c3c57c0a9.gif) + +看一看register,除了16进制的数值和函数地址外,在右侧提供了十进制数值和函数名 + +![screenshot_image.png](Book_Picture/bd9be6f3d2249cd15d609db8b9431464.png) + + + +## 3. 原文连接 + +原文连接 1 :https://club.rt-thread.org/ask/article/7fc9d655879ca0a5.html + +原文连接 2 :https://club.rt-thread.org/ask/article/588df61d78531254.html + + + +# **十四、恩智浦FRDM-MCX947上的USB-D实践**(麦子丰) + +## 1. 开发环境 + +> 1. vscode : https://code.visualstudio.com/# +> 2. RT-Thread env工具: https://www.rt-thread.org/download.html +> 3. RT-Thread内核: https://github.com/RT-Thread/rt-thread.git +> 4. Linkserver 1.4.85 installer for Windows (nxp官网) + + + +## 2. 步骤说明 + +### 2.1 VScode准备工作 + +1. 下载并安装vscode + +2. 安装必要的组件: + + ![screenshot_image.png](Book_Picture/6a2f4ab12967ce210f741ff1f9fef225.png.webp) + +3. 到rt-thread关于mcxn947的工程目录(rt-thread\bsp\nxp\mcx\mcxn\frdm-mcxn947 )并通过vscode打开 + +4. 在上方的命令执行行输入> Tasks: Configure Task 生成.vscode/tasks.json, 并编辑 + + ```c + { + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "make", + "type": "shell", + "command": "H:/mcxn947/env-windows-1.5.0/tools/bin/make.exe", + "args": [ + "-j" + ] + }, + { + "label": "make clean", + "type": "shell", + "command": "H:/mcxn947/env-windows-1.5.0/tools/bin/make.exe", + "args": [ + "clean" + ] + } + ] + } + + ``` + + ps:command用到的是env工具里的make工具,具体路径请按实际修改。 + +### 2.2 RT-Thread env工具的准备工作 + +1. 进入env工具包的目录 + +2. 双击运行env.exe + +3. 通过cd命令切换到\rt-thread\bsp\nxp\mcx\mcxn\frdm-mcxn947\目录 + + 比如:cd ..\rt-thread\bsp\nxp\mcx\mcxn\frdm-mcxn947\ + +4. 在该目录下执行scons —target=makefile + + ![screenshot_image.png](Book_Picture/5ee46cf9b1a5bfff195fe2cc53565055.png.webp) + +5. 修改文件config.mk + 在DEFINES的结尾添加一项 + + ![screenshot_image.png](Book_Picture/cfba34a91afe507c9e8ccd0b83d78209.png) + +6. 修改文件rt-thread\tools\rtthread.mk + + ![screenshot_image.png](Book_Picture/a87194a8ed35beafc8d9b5b0c4eec888.png.webp) + +![screenshot_image.png](Book_Picture/0cf2dcb5782573310e84dc530feac7f2.png.webp) + +删除以上两项。此处因为修改了rtthread.mk,可能会影响到其他工程编译,请留意 + + + +### 2.4 编译过程 + +1. 打开工程目录rt-thread\bsp\nxp\mcx\mcxn\frdm-mcxn947 + +2. 在vscode上方的命令执行行输入> Tasks: Run Task 选择 make clean -> Continue without scanning the task output. + +3. 在vscode上方的命令执行行输入> Tasks: Run Task 选择 make -> Continue without scanning the task output. + + ![screenshot_image.png](Book_Picture/79f91f9df25289f2d0e39a99b16e45ff.png.webp) + + 成功编译出rtthread.elf和rtthread.bin文件。 + +### 2.5 烧录步骤 + +#### 2.5.1 VScode + +安装必要的组件: + +![screenshot_image.png](Book_Picture/c4cea4a3411db312eea22e8b4256f1cc.png.webp) + +到rt-thread关于mcxn947的工程目录并通过vscode打开 + +在上方的命令执行行输入> Tasks: Configure Task 生成.vscode/tasks.json, 并编辑 + +```c +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "make", + "type": "shell", + "command": "H:/mcxn947/env-windows-1.5.0/tools/bin/make.exe", + "args": [ + "-j1" + ] + }, + { + "label": "make clean", + "type": "shell", + "command": "H:/mcxn947/env-windows-1.5.0/tools/bin/make.exe", + "args": [ + "clean" + ] + }, + { + "label": "flash", + "type": "shell", + "command": "C:/NXP/LinkServer_1.4.85/LinkServer.exe", + "args": [ + "flash", + "MCXN947:FRDM-MCXN947", + "load", + "./rtthread.elf" + ] + }, + { + "label": "erase", + "type": "shell", + "command": "C:/NXP/LinkServer_1.4.85/LinkServer.exe", + "args": [ + "flash", + "MCXN947:FRDM-MCXN947", + "erase" + ] + }, + { + "label": "start LinkServer", + "type": "shell", + "command": "C:/NXP/LinkServer_1.4.85/LinkServer.exe", + "args": [ + "gdbserver", + "MCXN947:FRDM-MCXN947" + ] + }, ] +} + +``` + +ps:command用到的是env工具里的make工具,具体路径请按实际修改。请替换LinkServer.exe的路径为用户安装路径。 + +修改launch.json文件 + +```c +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Cortex Debug", + "cwd": "${workspaceFolder}", + "executable": "./rtthread.elf", + "request": "launch", + "type": "cortex-debug", + "runToEntryPoint": "main", + "servertype": "external", + "gdbTarget": "localhost:3333", + "armToolchainPath": "H:/mcxn947/env-windows-1.5.0/tools/gnu_gcc/arm_gcc/mingw/bin/", + } + ] +} + +``` + +ps:请替换工具链路径为用户实际安装路径。 + +#### 2.5.2 烧写过程 + +1. 打开工程目录rt-thread\bsp\nxp\mcx\mcxn\frdm-mcxn947 +2. 全片擦除:在vscode上方的命令执行行输入> Tasks: Run Task 选择 erase-> Continue without scanning the task output. +3. 程序烧写:在vscode上方的命令执行行输入> Tasks: Run Task 选择 flash-> Continue without scanning the task output. + +#### 2.5.3 调试过程 + +1. 打开工程目录rt-thread\bsp\nxp\mcx\mcxn\frdm-mcxn947 + +2. 开启gdb server:在vscode上方的命令执行行输入> Tasks: Run Task 选择 start LinkServer -> Continue without scanning the task output. + + ![screenshot_image.png](Book_Picture/3bc81998f19f9368747e726d0933df54.png.webp) + +3. 按vscode左边的debug按钮,然后点击开始 + + ![screenshot_image.png](Book_Picture/6c0adad1b129e031efd2fec1b5119681.png) + + ![screenshot_image.png](Book_Picture/d29eb02b4f5c0534a7690c1a88799ef0.png) + +4. 进入调试模式 + + ![screenshot_image.png](Book_Picture/a556807d09de95c6c5e616c1bb6bd060.png.webp) + + ps: 若提示连接超时,请将开发板断电后重新上电。 + +5. 串口输出 + + ![screenshot_image.png](Book_Picture/35b91d57e4cd39b3444e480fe59b7a2d.png.webp) + + ps:若串口没有反应,请将按开发板rst重启。 + +### 2.6 适配 NXP mcxn947 usbd驱动 + +#### 2.6.1 准备阶段 + +下载nxp官方sdk(这里我使用vscode插件进行下载) + +![screenshot_image.png](Book_Picture/6bff6eacd79d147380e717e3d4876d72.png.webp) + +抽取目录和文件 + +```c +$(NXP_SDK_DIR)/middleware/usb/device +$(NXP_SDK_DIR)/middleware/usb/include +$(NXP_SDK_DIR)/middleware/usb/phy +$(NXP_SDK_DIR)/boards/frdmmcxn947/usb_examples/usb_device_cdc_vcom/bm/cm33_core0/us +``` + +b_device_config.h 此文件抽取后放到`$(NXP_SDK_DIR)/middleware/usb/include` + +#### 2.6.2 修改阶段 + +1. 修改文件bsp/nxp/mcx/mcxn/Libraries/drivers/SConscript, 末尾添加内容 + +```c +if GetDepend(‘BSP_USING_USB_DEVICE’): +src += [‘drv_usbd.c’] +src += Glob(‘usb/device/.c’) +src += Glob(‘usb/phy/.c’) +path = [cwd, cwd + ‘/usb/device’, cwd + ‘/usb/include’, cwd + ‘/usb/phy’] +``` + +2. bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig, 末尾添加内容 + + config BSP_USING_USB_DEVICE + + ```c + bool "Enable usb device" + select RT_USING_USB_DEVICE + default y + ``` + +3. 添加文件bsp/nxp/mcx/mcxn/Libraries/drivers/drv_usbd.c + +4. env -> menuconfig 添加虚拟串口 + + ![screenshot_image.png](Book_Picture/442f1ef3062c20c710190fc73216a378.png.webp) + + + +#### 2.6.3 驱动drv_usbd.c主要内容分析 + +USB_DeviceClockInit()函数 + 此函数主要配置了电压域和usb的时钟源。它是一个底层配置函数,与主控密切相关,参考官方的sdk可以实现。 + +```c +static void USB_DeviceClockInit(uint8_t controllerId) +{ +#if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0U) + usb_phy_config_struct_t phyConfig = { + BOARD_USB_PHY_D_CAL, + BOARD_USB_PHY_TXCAL45DP, + BOARD_USB_PHY_TXCAL45DM, + }; +#endif +#if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0U) + SPC0->ACTIVE_VDELAY = 0x0500; + /* Change the power DCDC to 1.8v (By deafult, DCDC is 1.8V), CORELDO to 1.1v (By deafult, CORELDO is 1.0V) */ + SPC0->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK; + SPC0->ACTIVE_CFG |= SPC_ACTIVE_CFG_DCDC_VDD_LVL(0x3) | SPC_ACTIVE_CFG_CORELDO_VDD_LVL(0x3) | + SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK | SPC_ACTIVE_CFG_DCDC_VDD_DS(0x2u); + /* Wait until it is done */ + while (SPC0->SC & SPC_SC_BUSY_MASK) + ; + if (0u == (SCG0->LDOCSR & SCG_LDOCSR_LDOEN_MASK)) + { + SCG0->TRIM_LOCK = 0x5a5a0001U; + SCG0->LDOCSR |= SCG_LDOCSR_LDOEN_MASK; + /* wait LDO ready */ + while (0U == (SCG0->LDOCSR & SCG_LDOCSR_VOUT_OK_MASK)) + ; + } + SYSCON->AHBCLKCTRLSET[2] |= SYSCON_AHBCLKCTRL2_USB_HS_MASK | SYSCON_AHBCLKCTRL2_USB_HS_PHY_MASK; + SCG0->SOSCCFG &= ~(SCG_SOSCCFG_RANGE_MASK | SCG_SOSCCFG_EREFS_MASK); + /* xtal = 20 ~ 30MHz */ + SCG0->SOSCCFG = (1U << SCG_SOSCCFG_RANGE_SHIFT) | (1U << SCG_SOSCCFG_EREFS_SHIFT); + SCG0->SOSCCSR |= SCG_SOSCCSR_SOSCEN_MASK; + while (1) + { + if (SCG0->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK) + { + break; + } + } + SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK | SYSCON_CLOCK_CTRL_CLKIN_ENA_FM_USBH_LPT_MASK; + CLOCK_EnableClock(kCLOCK_UsbHs); + CLOCK_EnableClock(kCLOCK_UsbHsPhy); + CLOCK_EnableUsbhsPhyPllClock(kCLOCK_Usbphy480M, 24000000U); + CLOCK_EnableUsbhsClock(); + USB_EhciPhyInit(controllerId, 24000000U, &phyConfig); +#endif +} +``` + +USB1_HS_IRQHandler()中断 + 这是官方关于usb的中断函数,函数名称可以在向量表处查询得到。函数里直接调用了官方sdk包提供的USB_DeviceEhciIsrFunction(),可以轻松回调usb的中断。 + +```c +void USB1_HS_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + USB_DeviceEhciIsrFunction(ehci0_handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +``` + +struct udcd_ops操作函数结构体的实现 + 这里的操作函数接口可以把板级的底层操作顺利接入到rtt的操作系统中,因此这里应该抽取nxp官方sdk的关于usb的对应底层操作来实现。 + +```c +const static struct udcd_ops _ehci0_udc_ops = +{ + _ehci0_set_address, + _ehci0_set_config, + _ehci0_ep_set_stall, + _ehci0_ep_clear_stall, + _ehci0_ep_enable, + _ehci0_ep_disable, + _ehci0_ep_read_prepare, + _ehci0_ep_read, + _ehci0_ep_write, + _ehci0_ep0_send_status, + _ehci0_suspend, + _ehci0_wakeup, +}; + +``` + +usb device的初始化函数 + 函数里包含了底层的初始化,并且将操作函数,可以实现的端点池全部打包进行注册,以后rtt系统需要操作usbd这个设备便可以利用对应的ops实现了。 + +```c +static int rt_usbd_init(void) +{ + rt_memset((void *)&_fsl_udc_0, 0, sizeof(struct udcd)); + _fsl_udc_0.parent.type = RT_Device_Class_USBDevice; + _fsl_udc_0.parent.init = drv_ehci0_usbd_init; + _fsl_udc_0.ops = &_ehci0_udc_ops; + /* Register endpoint infomation */ + _fsl_udc_0.ep_pool = _ehci0_ep_pool; + _fsl_udc_0.ep0.id = &_ehci0_ep_pool[0]; + _fsl_udc_0.device_is_hs = RT_FALSE; + rt_device_register((rt_device_t)&_fsl_udc_0, "usbd", 0); + rt_usb_device_init(); + return 0; +} +INIT_DEVICE_EXPORT(rt_usbd_init); + +``` + +#### 2.6.4 应用程序main.c的分析 + +1. 找到虚拟串口设备描述符 + + `dev = rt_device_find("vcom");` + +2. 打开虚拟串口设备 + + `err = rt_device_open(dev, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX);` + +3. 设置设备的接收回调函数 + + `err = rt_device_set_rx_indicate(dev, &rx_ind);` + +4. 在回调里读取串口数据 + + `rt_device_read(dev, 0, rx, size);` + +#### 2.6.5 实验现象 + +开发板以1s间隔不断输出hello world到虚拟串口,pc端可以在任意时刻发送字符到开发板。 + +![screenshot_image.png](Book_Picture/dc2f17223de001939a92dce5951d430d.png.webp) + +repo: https://gitee.com/makhouse/rt-thread.git + + + +## 3. 原文连接 + +原文连接1:https://club.rt-thread.org/ask/article/1ce86e6e1663f358.html + +原文连接2:https://club.rt-thread.org/ask/article/e46d421071211221.html + +原文链接3:https://club.rt-thread.org/ask/article/b1d932d3dff1ca6a.html + + + + + +# **十五、恩智浦FRDM-MCX947上的SDHI实践**(王宇) + +## 1. 开发环境 + +> Keil with MDK,官方推荐5.36及以上,本次我用的是5.38 +> scon + +## 2. 步骤说明 + +### 2.1 模块介绍 + +先来看看本次要测评的模块: + +![board_block_diagram.png](Book_Picture/a18910fc086cf3e55c9fc5d93906feb6.png.webp) + +这个虚线框,难道是没有卡槽的意思吗?果然,拿到开发板后: + +![卡槽位置.jpg](Book_Picture/8fd7ed51234ef6b945989d4eccd91736.jpg.webp) + +还好还有之前的卡槽存货,简单焊上一个完事,应该能用,不能用大不了回来再看。 + +![焊接完成.jpg](Book_Picture/92f3291aad7143d0ce4e9b41a98c0ebf.jpg.webp) + +实际上本次测评的虽然是SDIO,但是在官方资源描述是SDHC,在网上简单找了下资料: + +| SD卡(Secure Digital Memory Card) | Mini SD卡(Mini Secure Digital Memory Card) | SDHC卡(Secure Digital High Capacity) | SDXC卡(SD eXtended Capacity) | +| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| SD是早先的版本的,据说是由MMC演变而来的。最大支持2GB大小容量。通过9针的接口界面与专门的驱动器相连接,SD接口除了保留MMC的7针外,还在两边加多了2针,作为数据线。SD卡的通信协议包括SD总线和SPI两类,通信电压范围:2.0-3.6V;工作电压范围:2.0-3.6V。SD卡的结构能保证数字文件传送的安全性,也很容易重新格式化,所以有着广泛的应用领域。 | miniSD卡是SD卡发展而来,性能和传统的SD卡并无大的区别,T-Flash卡:全名(TransFLash由),是一种超小型卡(11151MM)。TF卡可经SD卡转换器后,当SD卡使用。 | SDHC是大容量SD卡,也就是SD High Capacity,支持最大32GB大小容量。SDHC,Secure Digital High Capacity,大容量SD,也就是说,超过2G的SD都叫SDHC,因为早期的SD使用的是FAT16文件系统,并不支持大容量,而SDHC升级为FAT32,才支持2G以上的大容量。 | SDXC除了容量可以升级为最大2T以外,主要是可以支持300M/s的传输速度,也就是说是“高速SD”卡。SDXC又是不可向下兼容的,不支持普通的SD和SDHC卡槽和读卡器。 | + +### 2.2 新建工程 + +1. 首先从RT Thread官当下载最新代码 https://github.com/RT-Thread/rt-thread/ + +2. 在源码目录.bsp\nxp\mcx\mcxn\frdm-mcxn947 的位置找到N947的工程,并在此打开scons + +3. 执行 + + ```c + scons --dist --target=mdk5 + ``` + + 生成初始工程 + + ![new project.PNG](Book_Picture/d56376686a1ba70e241bf1c9642aa114.png) + +4. 此时位于dist目录中的工程就是专门为MCXN947生成的工程了,可以单独拷贝到任何目录,不依赖于当前源码目录。 + +5. 在新生成的工程目录中执行 + + ```c + pkgs --update + ``` + + 这一步的目的是从服务器拉取工程中用到但是尚未下载源码的包,如果没有这一步,直接在keil中编译会报错 + + ![pkgs update.PNG](Book_Picture/20f31602de655b770f3ba5a95b7196bb.png) + +6. 新的工程就建好了,可以现在keil中编译,下载一下。 + +### 2.3 配置SDIO + +接下来就是为本次验证的配置, 首先打开menuconfig工具,需要配置的有以下几项: + +DFS 虚拟文件系统 + +![dfs.PNG](Book_Picture/50501cbc12d258403d01f9f4be91e07e.png) + +MMC/SD driver + +![sd driver.PNG](Book_Picture/6aaf8ce2eeb7075feb152b3d35862ee8.png) + +SDIO 外设驱动 + +![SDIO driver.PNG](Book_Picture/f1bbc1ab31c05d9a0d06a79c2b104285.png) + +结束后退出并保存,注意这里要重新生成以下keil工程,否则keil里是没有刚刚新的配置的。 + + + +### 2.4 代码验证 + +使用Keil编译并下载Demo程序 + +#### 2.4.1 SD卡识别 + +```c +#ifdef RT_USING_SDIO + rt_thread_mdelay(2000); + if (dfs_mount("sd", "/", "elm", 0, NULL) == 0) + { + rt_kprintf("sd mounted to /\n"); + } + else + { + rt_kprintf("sd mount to / failed\n"); + } +#endif +``` + +![sd mount.PNG](Book_Picture/6d07ca7e31b3d94cfb432a9e0bcb002f.png) + + + +#### 2.4.2 文件读写测试 + +##### 2.4.2.1 代码实现 + +写一个文件读写的测试case,主要实现的功能有: + +1. 在当前目录打开或新建一个名为“test.txt”的文件 +2. 在文件中写入一段文字,关闭文件 +3. 重新打开文件,并读取打印其中的文字 + +代码实现如下: + +```c +#include +#include "drv_pin.h" +#include "dfs_fs.h" +int rwTest(void) +{ + FILE *fout; + char buf[32]; + const char test[] = "This is a test file"; + rt_kprintf("This is SD card read&write test\r\n"); + fout = fopen("test.txt", "wb"); + if (fout == NULL) { + printf("Failed to open file \"%s\"\n", "test.txt"); + exit(-1); + } + fwrite(test, 1, sizeof(test), fout); + fclose(fout); + fout = fopen("test.txt", "r"); + if (fout == NULL) { + printf("Failed to open file \"%s\"\n", "test.txt"); + exit(-1); + } + fread(buf, 1, sizeof(buf), fout); + rt_kprintf("Read from file: %s \r\n", buf); +} +MSH_CMD_EXPORT(rwTest, rwTest); +``` + +##### 2.4.2.2 测试结果 + +![rw.PNG](Book_Picture/16faf008b7fe429125be96393f0a3e53.png) + + + +使用ls命令查看文件,并使用cat命令查看文件内容: + +![cat.PNG](Book_Picture/ad54cc1ea50b101a627e2f282851b181.png) + + + +#### 2.4.3 读写速度测试 + +##### 2.4.3.1 代码实现 + +对于读写速度测试,由于自己对RTOS的领悟还没有那么深刻,设计的方案可能不那么科学,如果有上面欠考虑的地方还请多多指教。 +按照自己的理解设计了一个测试case,主体思路就是对512B - 64KB的读写速度进行测试,使用timer0记录时间。 + 代码如下: + +```c +#include +#include "drv_pin.h" +#include "dfs_fs.h" +void readWriteTest(int size) +{ + FILE *fout, *fin; + void* buf; + rt_device_t hw_dev; + rt_hwtimerval_t timeout_s; /* 用于保存定时器经过时间 */ + /* 查找定时器设备 */ + hw_dev = rt_device_find("timer0"); + rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); + /* 设置定时器超时值为10s并启动定时器 */ + timeout_s.sec = 10; /* 秒 */ + timeout_s.usec = 0; /* 微秒 */ + fout = fopen("test.txt", "wb"); + buf = malloc(size); + rt_memset(buf, 0xff, size); + if (fout == NULL) { + printf("Failed to open file \"%s\"\n", "test.txt"); + exit(-1); + } + if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) + { + rt_kprintf("set timeout value failed\n"); + return; + } + fwrite(buf, 1, size, fout); + fclose(fout); + rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); + rt_kprintf("%d Byte write test, time cost: Sec = %d, Usec = %d\n", size, timeout_s.sec,timeout_s.usec); + fin = fopen("test.txt", "r"); + if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) + { + rt_kprintf("set timeout value failed\n"); + return; + } + fread(buf, 1, size, fin); + fclose(fin); + rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); + rt_kprintf("%d Byte read test, time cost: Sec = %d, Usec = %d\n", size, timeout_s.sec,timeout_s.usec); + free(buf); +} +int speedTest(void) +{ + rt_kprintf("This is SD card speed test\r\n"); + readWriteTest(512); + readWriteTest(1024); + readWriteTest(2048); + readWriteTest(4096); + readWriteTest(8192); + readWriteTest(16384); + readWriteTest(32768); + readWriteTest(65536); +} +MSH_CMD_EXPORT(speedTest, speedTest); +``` + + + +##### 2.4.3.2 测试结果 + +结果说实话还是很出乎我的意料的,自己也做了反复尝试 + +![sp.PNG](Book_Picture/05c353a5faaf96a8c59f5377dc88f3ef.png) + +初步的结论是,4K以下的读写速率相差很小,可能是主要的时间消耗在了调用和系统调度。之前在另一块产品中,主频比这个单片机低很多,而且还是使用的SPI接口,但是写一个512的扇区也只需要6ms,而这里竟然需要15ms。好在随着我不断加大测试数据量,区别在大数据读写还是很大的。 + + + +### 2.5 一些思考 + +我觉得这个测试仍然存在一些疑点,目前我怀疑的有以下几个,如果有知道的大佬欢迎讨论,或者不知道我们一起学习也可以。 + +1. 4K以下读写或许和文件系统实现有一些关系 +2. 也可能和SDIO的实现有关系 +3. 或许我采用的计时方式并不准确,有一个很大的基准值叠加在了结果上面,导致实际观测的实际差不准确 +4. 其他的,欢迎大家补充讨论。 + + + +### 2.6 开发资料 + +所有的代码其实在文章中已经全部贴出来了,不过也给出仓库:https://gitee.com/yu-wang-yy/mcxn947-sdio + + + + + +## 3. 原文连接 + +原文连接:https://club.rt-thread.org/ask/article/588517571e124630.html + + + +# **十六、恩智浦FRDM-MCX947上的RW007实践**(许思维) + +## 1. 开发环境 + +本文将会介绍如何使用RT-Thread env 工具创建一个基于RT-Thread RTOS的软件项目;如何使用RT-Thread env 工具对项目进行配置,实现FRDM-MCXN947开发板通过RW007模组进行WiFi联网;以及如何使用RT-Thread env 工具对项目进行配置,实现WiFi网络延迟和带宽测试。 + +> ENV环境 + +## 2. 步骤说明 + +### 2.1 RW007模组介绍 + +RW007模组是由上海睿赛德电子科技有限公司开发的一款支持WiFi和蓝牙功能的无线通信模块,它提供了基于SPI和UART 两种接口的通信方式。 + +RW007模组硬件资料: https://pan.baidu.com/s/1NeQN2XNIUv4JP2ina4pnMw + +SPI接口相对于UART接口,具有更高的通信速率,因此本文采用SPI接口进行实验。 + +RW007模组工作在SPI模式下时,主控芯片为模组需要提供1组SPI信号,一个中断输入,一个IO输出,包含电源和地总,一共8个引脚。 + +RT-Thread官方也提供了RW007模组的Arduino评估板(以下简称RW007评估板),如下图所示: + +![image7.jpg](Book_Picture/b3482634df549c911fcec6023824d8a5.jpg.webp) + +图片中间部分为RW007模组。 + +查阅RW007评估版原理图,可以看到SPI和UART接口部分,如下图所示: + +![image8.png](Book_Picture/3dc411c95c06ed52e23c0305771a79d6.png) + +可以看到,Arduino接口与RW007模组引脚的连接关系,如下表所示: + +| Arduino接口引脚 | 模组引脚 | 功能说明 | +| --------------- | -------- | ------------------- | +| D13 | CLK | SPI时钟信号 | +| D12 | MISO | SPI主机输入从机输出 | +| D11 | MOSI | SPI主机输出从机输入 | +| D10 | CS | SPI片选信号 | +| D9 | INT | 模组中断信号 | +| D8 | RST | 模组复位控制 | +| 3.3V | VCC | 模组电源正 | +| GND | GND | 模组电源负 | + +### 2.2 Arduino接口简介 + +FRDM-MCXN947开发板上提供了Arduino接口,如下图蓝色部分: + +![image9.png](Book_Picture/ce7718669cf93384060388b211c61f64.png.webp) + + + +FRDM-MXCN947开发板 Arduino接口,和RW007评估版通信的引脚如下: + +![image10.png](Book_Picture/337405b1fb6339166c1a016ee2d11863.png.webp) + + + +其中,D10~D13为SPI信号,D9为中断信号(INT),D8为复位控制(RST); + +FRDM-MCXN947开发板和RW007评估板连接如下图: + +![mcxn947_rw007.jpg](Book_Picture/2da87cfd65455d3551980955b1629651.jpg.webp) + +### 2.3 RW007软件包简介 + +RT-Thread rw007软件包实现了MCU主控端与RW007模组的SPI/UART接口的底层通讯,同时实现了与RT-Thread的WiFi框架、网络协议栈对接。借助此软件包,开发者可以在RT-Thread系统上轻松实现WiFi联网或BLE功能。 + +软件包源码仓库链接: https://github.com/RT-Thread-packages/rw007 + +软件包源码仓库链接(国内镜像): https://gitee.com/RT-Thread-Mirror/rw007 + +### 2.4 RT-Thread env工具简介 + +RT-Thread Env 工具 包括配置器和包管理器,用来对内核和组件的功能进行配置,对组件进行自由裁剪,对线上软件包进行管理,使得系统以搭积木的方式进行构建,简单方便。 + +RT-Thread Env工具下载页面: https://www.rt-thread.org/download.html#download-rt-thread-env-tool + +### 2.5 新建工程 + +首先,克隆RT-Thread主线源码到本地(Windows系统使用git-bash): + +```c +$ mkdir -pv /e/Opensource/rt-thread/master +$ cd /e/Opensource/rt-thread/master +$ git clone https://github.com/RT-Thread/rt-thread.git . +``` + +接着,跳转到 FRDM-MXCN947 板级支持包(BSP)目录: + +```c +$ cd bsp/nxp/mcx/mcxn/frdm-mcxn947/ +``` + +最后,使用 scons 命令创建独立的项目目录(可以在env命令行,或者gitb-bash中执行): + +```c +scons --dist --target=mdk --project-name=rtt_n947 --project-path=e:/DIY/FRDM-MCXN947/rtt_n947/ +``` + +其中,target参数用于指定项目模板(可以使用mdk、iar等),project-name参数和project-path参数分别表示项目名称和项目目录,可以根据实际需要修改修改。 + +注意:git-bash执行scons之前,需要保证已经安装了Python,并且已使用pip install scons安装scons软件包。否则会报 scons 命令找不到。 + +scons命令执行成功,命令输出,如下图所示: + +![Untitled.png](Book_Picture/80d2efed3f88aa75fd44818988e42b46.png) + +scons命令创建的目录,内容如下图所示: + +![Untitled 1.png](Book_Picture/3d41a9fa3c57448ade0a0aa5d77c5d11.png.webp) + +其中,rtt_n947开头的两个文件,就是scons生成的项目文件。如果不加—project-name参数,则是project开头的两个文件。 + +#### 2.5.1 添加rw007软件包 + +在env命令行环境中,跳转到上一小节创建的项目目录 E:\DIY\FRDM-MCXN947\rtt_n947目录, + +然后,使用 menuconfig 命令: + +![Untitled 2.png](Book_Picture/6ee20d1047449b46db3f1d03e487d528.png) + + + +#### 2.5.2 打开RW007配置项 + +类似的,依次选择: + +│ -> Hardware Drivers Config + +│ -> Board extended module Drivers + +如下图所示: + +![Untitled 3.png](Book_Picture/eed8b398b8362b8457e2c92899587a2c.png) + + + +空格选中Enable RW007选项。 + +选中该选项后,将会自动选中rw007软件包,以及片上SPI1配置。 + +左右移动光标到Save上,回车保存配置。 + +保存配置之后,.config和rtconfig.h文件将会更新。 + +保存配置后,就可以退出配置界面了。 + +#### 2.5.3 启用pin驱动 + +类似的,依次进入菜单: + +→ Hardware Drivers Config → On-chip Peripheral Drivers + +如下图所示: + +![Untitled 4.png](Book_Picture/6c71b7d9c0c8f9872455f4ab9e40fd05.png.webp) + +如图,选中Enable GPIO。 + +这样,就开启了pin驱动。开启pin驱动的原因是,SPI的CS使用了pin接口进行控制。 + +左右移动光标到Save上,回车保存配置。 + +保存配置之后,.config和rtconfig.h文件将会更新。 + +保存配置后,就可以退出配置界面了。 + +##### 2.5.4 禁用rw007的STM32驱动 + +类似的,依次选择: + +RT-Thread online packages → IoT - internet of things → Wi-Fi → rw007: SPI WIFI rw007 driver + +进入rw007软件包配置界面: + +![Untitled 5.png](Book_Picture/ac0cc0a33054c1f42ea7793983363a76.png.webp) + +上下移动光标到”example driver port (rw007 for stm32)”上,回车,进入这个配置项: + +![Untitled 6.png](Book_Picture/422e413c17e49c594384849f320fa19c.png) + +选中,not use example driver porting by myself。 + +选中之后,自动返回rw007软件包配置页面: + +![Untitled 7.png](Book_Picture/114cc98c7d9ffe68287d0a05f10aa4c3.png.webp) + +此时,rw007的STM32驱动就被禁用掉了。 + +左右移动光标到Save上,回车保存配置。 + +保存配置之后,.config和rtconfig.h文件将会更新。 + +保存配置后,就可以退出配置界面了。 + +#### 2.5.5 下载软件包 + +刚刚我们用menuconfig选中了“RT-Thread online packages”中的rw007软件包,rw007软件包的代码默认不在本地。menuconfig选中并保存配置后,需要运行pkgs —update命令,才能将rw007软件包的代码下载到本地。 + +执行pkgs —update命令,输出如下图所示: + +![Untitled 8.png](Book_Picture/5b30c90856e2424e76530f657e8018f3.png) + + + +#### 2.5.6 更新MDK项目文件 + +使用menuconfig命令修改配置之后(尤其是增加软件包之后),需要更新MDK项目文件,新增的代码才会被编译。 + +对于scons创建时添加了project-name参数的,更新时也要加project-name参数: + +![Untitled 9.png](Book_Picture/22790b72439b99e5c9ddbe898be7f5fc.png) + + + +### 2.6 编译运行 + +#### 2.6.1 打开MDK项目 + +鼠标双击打开rtt_n947.uvprojx文件,打开后看到如下图所示: + +![Untitled 10.png](Book_Picture/7fd071f2b4cfe955b245fd053b8f1365.png) + +可以看到,rw007的代码已经在里面了。 + +#### 2.6.2 编译下载程序 + +在Keil中,按F7编译项目,按F8下载固件。 + +下载固件之前,需要使用USB Type-C线,将PCUSB口连接到FRDM-MCXN947开发板的MCU-LINK口上。 + +默认的下载固件设置是正确的,如果不能下载固件很可能是没有安装MCXN947的支持包。 + +下载固件完成,Keil输出如下 + +![Untitled 11.png](Book_Picture/4d4b3f0c53ad8d51fb370917a8f2b32d.png) + +#### 2.6.3 运行RT-Thread + +打开串口终端,配置如下: + +![Untitled 12.png](Book_Picture/bf1b7a563279da07786928ba73810f17.png.webp) + +连接串口后, + +按下开发板复位键,串口终端可以看到,输出了RW007固件的版本信息: + +![Untitled 13.png](Book_Picture/c020116a65e5905e8716ef026423223a.png) + +### 2.7 WIFI测试 + +接下来,我们进行一些简单的WiFi测试。 + +接下来我们查看wifi命令的使用方式: + +![Untitled 14.png](Book_Picture/459d89302584096fec9367ee5c5ca2f0.png) + +#### 2.7.1 扫描测试 + +尝试扫描周围的WiFi热点: + +![Untitled 15.png](Book_Picture/c41be9ec5455cd50b36615ef7356f7a6.png) + +可以看到,成功扫描到了周围的WiFi热点。 + +#### 2.7.2 连接测试 + +尝试连接其中的一个热点(这里连接的是无线路由器): + +![Untitled 16.png](Book_Picture/5d9d4cd9f38da98ad09a15c585c4e047.png) + +可以看到,成功连接上了WiFi热点,并且获取到了IP地址。 + +### 2.8 延迟测试 + +ping命令可以输出网络延迟信息,可以作为网络延迟的简单测试工具。 + +#### 2.8.1 ping百度 + +接下来,用 ping 命令测试一下,板子能不能ping通baidu.com: + +![Untitled 17.png](Book_Picture/8595c13392b223b682be2f5ee62960e9.png) + +可以ping通baidu.com,说明TCP/IP协议基本没有太大问题(域名解析OK,而且可以发送数据到公网主机)。 + + + +#### 2.8.2 ping路由器 + +接下来,ping一下局域网的无线路由器: + +![Untitled 18.png](Book_Picture/3bfb7b34622ce6def1477e0450d53cda.png) + +ping局域网的路由器,延迟明显小了很多。 + +作为对比,可以看一下笔记本ping路由器的延迟: + +![Untitled 19.png](Book_Picture/38b74f43c3d60707d0cbb85d087d3912.png) + +我的笔记本电脑连接的也是同一个无线路由器。 + +模组比笔记本的WiFi延迟稍微高一点点,差别不大。 + +### 2.9 带宽测试 + +#### 2.9.1 添加netutils软件包 + +RT-Thread的netutils组件中提供了iperf命令,可以用于测试网络带宽。 + +menuconfig界面,依次选择: + +![Untitled 20.png](Book_Picture/482c8190a84bd1c78da9b709182653e3.png) + +选中netutils软件包,然后回车进入软件包配置页面: + +![Untitled 21.png](Book_Picture/60af2b499fe545965de12fefd8a84366.png) + +如图,选中Enable iperf-liked network performace tool。 + +左右移动光标到Save上,回车保存配置。 + +保存配置之后,.config和rtconfig.h文件将会更新。 + +保存配置后,就可以退出配置界面了。 + +执行pkgs —update命令,输出如下图所示: + +![Untitled 22.png](Book_Picture/e9d38f294eb0593793e8adb8e1b09a5d.png) + +更新MDK项目文件: + +![Untitled 23.png](Book_Picture/b6fccdaf6a77aca1c240dd2d97d04fa9.png) + +重新编译固件,下载固件,复位运行,串口终端就有iperf命令了: + +![Untitled 24.png](Book_Picture/2c4767ecb1f1b15782557e4b0d65fc78.png) + + + +#### 2.9.2 iperf命令参数 + +直接运行iperf,默认输出帮助信息: + +![Untitled 25.png](Book_Picture/86b60df9aea75b4078160feb2b0b10e6.png) + +可以看到iperf的命令参数使用方法。 + +注意: + +1. RT-Thread的iperf命令实现中,对参数的顺序由要求,如果使用过程中发现参数报错,需要查看源码定位原因; +2. RT-Thread的iperf不支持持续时间选项,一般是先启动,后通过stop选项停止的方式控制测试时长; + +#### 2.9.3 PC端的iperf + +PC端的iperf可以到iperf项目官网下载:https://iperf.fr/iperf-download.php + +我使用的mobaxterm,里面自带了iperf命令,所以就不单独下载了: + +![Untitled 26.png](Book_Picture/d2153619c42fa7a91b7333b639a1c4f6.png) + +#### 2.9.4 iperf测试准备工作 + +进行iperf测试之前,需要准备: + +1. 最好用PC创建热点,用无线路由器也行,但是需要确保信号强度足够; +2. 确保开发板和PC直接的距离不要太远,否则WiFi信号较弱,测试的结果可能会偏小; +3. 最好在WiFi热点较少的环境下进行测试,否则测出的结果数据也会偏小; + +#### 2.9.5 进行iperf带宽测试 + +下面进行测试,测试步骤如下: + +1. 在PC上,启动iperf服务端:iperf -s -p 5678 + +2. 在开发板上,通过ping命令测试开发板和PC直接IP是否可达 + +3. 在开发板上,启动iperf客户端:iperf -c 192.168.3.6 -p 5678 (其中192.168.3.6是PC的IP地址) + + 启动后,可以通过ps命令查看正在运行的线程 + +4. 一段时间后,在开发板上,停止iperf客户端:iperf —stop + +5. 开发板上iperf停止后,PC端应该可以看到iperf的输出; + +开发板上整个过程的输出如下: + +![Untitled 27.png](Book_Picture/7917ecb6def15896c8ce88f7c4b1aad2.png) + +PC端输出: + +![Untitled 28.png](Book_Picture/3511bc7aae896250e2880914fdfef384.png) + +可以看到带宽为7.02Mbps。 + + + +#### 2.9.6 iperf测试小结 + +实际上,影响WiFi带宽测试结果数据的因素很多。我们这里,其中,起决定性的的主要由以下几个方面: + +1. 模组本身支持的最高WiFi传输速率; +2. 模组接口支持的最高工作频率; +3. 主控芯片接口最高支持的工作频率; +4. 热点的WiFi最高传输速率; +5. 各种环境因素,例如开发板和PC直接的距离、环境是否有其他热点干扰等等; + +为了测出比较高的数据,我把开发板直接放到路由器天线边上,才测到以上的结果: + +![mcxn947_wifi_ap.jpg](Book_Picture/349ddb16fe5330db0777ff5ae019925b.jpg.webp) + +### 2.10 补充说明 + +如果有时候测试发现栈溢出,则需要修改TCPIP线程栈大小: + +![Untitled 29.png](Book_Picture/8bfdc1c411e8b2fe2c1e8569ef6fbfd0.png) + +将其修改为4096即可。 + + + +## 3. 原文连接 + +原文连接:https://club.rt-thread.org/ask/article/d3a1d5b19289eba5.html + + + +# **十七、恩智浦FRDM-MCX947上的WDT看门狗实践**(何剑波) + +## 1. 开发环境 + +> ENV环境 + +## 2. 步骤说明 + +### 2.1 看门狗学习 + +#### 2.1.1 寄存器介绍 + +- Mode(MOD) + - bit6 DEBUG_EN + - 只能在芯片处于debug模式的时候才能用 + - bit5 Lock + - 目的是保护看门狗振荡器不被改变 + - bit4 + - 喂狗方式 + - 0的时候 可以随时改变TC值 + - 1的时候 只能 TV 小于 WARNINT 或者 WINDOW的时候才能改变 TC值 + - bit3 + - Warning中断标志位 + - bit2 + - 超时标志位 + - bit1 + - 超时是否复位芯片 + - bit0 + - 使能看门狗 +- Timer Constant(TC) + - 定时器数值 +- Feed Sequence(FEED) + - 先后写入 AAh和 55h后,会重新加载TC值 +- Timer Value(TV) + - 看门狗计数器 +- Warning Interrupt Compare Value(WARNINT) + - 产生中断的值 +- Window Compare Value(WINDOW) + - 复位看门狗的值 + +**注意事项**: + +A feed is correct when both of the following conditions are true: + +- A valid feed sequence completes, writing AAh followed by 55h to FEED[FEED]. +- The value of TV[COUNT] is not greater than the value of WINDOW[WINDOW]. + +### 2.2 代码实现 + +逻辑图 + +![逻辑图.jpg](Book_Picture/7fc5d935c21266dbbedf332713faa96b.jpg.webp) + +现象截图 + +![串口log.jpg](Book_Picture/060934c3053b7cd81675d46db692d0fa.jpg) + + + +### 2.3 开发资料 + +代码:https://gitee.com/he_jianbo/rttfor-mcxn947.git + +工程demo:https://github.com/RT-Thread/rt-thread.git + +RT-Thead手册:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/basic/basic?id=rt-thread-%e5%90%af%e5%8a%a8%e6%b5%81%e7%a8%8b + +NXP论坛:https://www.nxpic.org.cn/module/forum/forum-1326-1.html + +RTT论坛:https://club.rt-thread.org/index.html + + + +## 3. 原文连接 + +原文连接:https://club.rt-thread.org/ask/article/b20d16bdccbd173e.html + diff --git a/rt-thread-version/rt-thread-standard/tutorial/quick-start/frdm_mcxn947/quick-start.md b/rt-thread-version/rt-thread-standard/tutorial/quick-start/frdm_mcxn947/quick-start.md index 8797e77ea71bb2240908955767622337915500d7..5078341978e57e61bd1e5ca302c24a64a6fcea8f 100644 --- a/rt-thread-version/rt-thread-standard/tutorial/quick-start/frdm_mcxn947/quick-start.md +++ b/rt-thread-version/rt-thread-standard/tutorial/quick-start/frdm_mcxn947/quick-start.md @@ -73,3 +73,7 @@ msh > ## 继续学习 已完成 RT-Thread 快速上手!点击这里进行 [内核学习](../../kernel/kernel-video.md) 。 + +## 其他资料 + +[恩智浦FRDM-MCXN947开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/恩智浦FRDM-MCX974实践指南.md)