diff --git a/rt-thread-version/rt-thread-standard/_sidebar.md b/rt-thread-version/rt-thread-standard/_sidebar.md index 51abda987048d62e82549ec936be1cba09861f7a..e6eb507a4fbc138ba8a955356c206c807a6d2de4 100644 --- a/rt-thread-version/rt-thread-standard/_sidebar.md +++ b/rt-thread-version/rt-thread-standard/_sidebar.md @@ -198,6 +198,7 @@ - [恩智浦FRDM-MCXN947开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/恩智浦FRDM-MCX974实践指南.md) - [恩智浦FRDM-MCXN236开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/恩智浦FRDM-MCXN236实践指南.md) - [恩智浦FRDM-MCXA153开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A153/恩智浦FRDM-MCXA153实践指南.md) + - [恩智浦FRDM-MCXA156开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/恩智浦FRDM-MCXA156实践指南.md) - 官方开发板 - [星火一号](/rt-thread-version/rt-thread-standard/hw-board/spark-1/spark-1.md) diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/0_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3d5ade61afd4034977b37c151e63e812dc5fb14e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/0_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/10_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/10_0.png new file mode 100644 index 0000000000000000000000000000000000000000..3cf971b649fdb9e0bbc92044b96de690b97d81a1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/10_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/10_1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/10_1.png new file mode 100644 index 0000000000000000000000000000000000000000..38bbb747559367760533a13236a83b25a28544c4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/10_1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_0.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5912656eb8c836d725ede2a811b84686c946dd Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_1.png new file mode 100644 index 0000000000000000000000000000000000000000..eabc6a59b6efd1a6dc00fb2c911aaab73c3e6e8a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9b308ed4cfbdbaef17dd11740c89dadee831a6ac Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_3.png new file mode 100644 index 0000000000000000000000000000000000000000..b65d84e69860b6648aca6d50cfb40e026da88968 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_4.png new file mode 100644 index 0000000000000000000000000000000000000000..b85cdd13e4b9e6dade2cce4c9544c4db061bd8bb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_5.png new file mode 100644 index 0000000000000000000000000000000000000000..5d80334aba82e658fc1a0379df6d4426a6fcee94 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_6.png new file mode 100644 index 0000000000000000000000000000000000000000..dc804e2d6e9d9b14f8f03178bb3a4b8c70c3796b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_7.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_7.png new file mode 100644 index 0000000000000000000000000000000000000000..da6190ae904a918619d996a4f584571cfa3d43d0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_7.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7af1811abdc5f246eab76dd19452d1ac5f8e020a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_9.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_9.png new file mode 100644 index 0000000000000000000000000000000000000000..7ffb087964c58ff0ffe46a8d22606ad89f7b3ec9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_9.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_a.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_a.png new file mode 100644 index 0000000000000000000000000000000000000000..8573ef806251f88f2136e634b11d2da377131378 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_a.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_b.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_b.png new file mode 100644 index 0000000000000000000000000000000000000000..8485f21e737601a459502aac504d10129011a323 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_b.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_c.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_c.png new file mode 100644 index 0000000000000000000000000000000000000000..a89d89c66fd423f1459fc344787c91fdefa320c4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_c.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_d.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_d.png new file mode 100644 index 0000000000000000000000000000000000000000..653d057fe0df1c771b2ec3eb4f3c91830a93606c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_d.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_e.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_e.png new file mode 100644 index 0000000000000000000000000000000000000000..8154828d67858710789f89666bf25437829c3848 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_e.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_f.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_f.png new file mode 100644 index 0000000000000000000000000000000000000000..23eccf6ae433e2cb13ecf857a1d07fe15ddc80a0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_f.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_g.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_g.png new file mode 100644 index 0000000000000000000000000000000000000000..f4017e4dad1a2f01d8a77687194bccdbf38ead74 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_g.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_h.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_h.png new file mode 100644 index 0000000000000000000000000000000000000000..446f9143578053e41e2dc56f4a2accef06de6907 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_h.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_i.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_i.png new file mode 100644 index 0000000000000000000000000000000000000000..57dd605249483aa15277174c44edbc1638f9a057 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/11_i.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0079dd4df2394b1da7bb4408fe5446479bbc56d0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_0_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9394cda799ad3cf1a6589342be0399c6f59d339e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_0_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_1.png new file mode 100644 index 0000000000000000000000000000000000000000..95ec2b0fc95815b706af62f42f11aac9a57d899b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_2.png new file mode 100644 index 0000000000000000000000000000000000000000..087bb10f8830604a9612ee09d2e8aefdc2a4b19b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_3.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7be7f1aa3436d0ca1e44335e488b37ec79fd51 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_4.png new file mode 100644 index 0000000000000000000000000000000000000000..262a1d83cf9d14aebc72ed97043a4bf8737bafe2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_5.png new file mode 100644 index 0000000000000000000000000000000000000000..c893342a15fda37ab688a23e07adf00be957694d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_6.png new file mode 100644 index 0000000000000000000000000000000000000000..62bf14b3aa3777d3222a2891a28f88fd62384ab0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_7.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_7.png new file mode 100644 index 0000000000000000000000000000000000000000..846ccb29f9a415534d6818439a751b303e84a7c0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_7.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_8.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbe0c947f8519be59eda64ff4a14330181cbf97 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_9.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_9.png new file mode 100644 index 0000000000000000000000000000000000000000..924c2bb294a68fe8ce4d7dd58caa6cf0725a37b8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_9.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_a.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_a.png new file mode 100644 index 0000000000000000000000000000000000000000..ef3f7b6ca6de8c55fbd1c3878f7b7f6f795f23b2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_a.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_b.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_b.png new file mode 100644 index 0000000000000000000000000000000000000000..786f96cb2f91390d94c2927f4030bd9576e8c5cf Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_b.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_c.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_c.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b082836d42dae87593f6fe45954be4f9267a08 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_c.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_d.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_d.png new file mode 100644 index 0000000000000000000000000000000000000000..141b3d0f0a082f51974feafd15bd9604e5ceb82f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_d.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_e.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_e.png new file mode 100644 index 0000000000000000000000000000000000000000..67037965fc43e7d974cca12f29e39e75a1c205b8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_e.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_f.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_f.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3e85d857d8e2f457b6c9cd92b94adbd98fbc86 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_f.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_g.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_g.png new file mode 100644 index 0000000000000000000000000000000000000000..426ed8a771caead094b5866d47e7a3057ba8c7ab Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/12_g.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b56f4a67c0538ce469af7e533a6fac4f2223fac9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_1.png new file mode 100644 index 0000000000000000000000000000000000000000..84d6ffef7a82eaa94aab96ee615a75ba53ef8b3c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6d908f793f83bd4674f4fba120dac11127f647 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_3.png new file mode 100644 index 0000000000000000000000000000000000000000..720d0ba03a5c942ea2debb75d37def4627c4b3dc Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_4.png new file mode 100644 index 0000000000000000000000000000000000000000..d383c9d1f7c07aeed4ba185b2bd38689901da21a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/13_4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/1_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..92b91b4d9ed370e948da38dcbe59014816c05ee5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/1_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/1_1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d90b35ca155490304a8ee701302db354b8c166f3 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/1_1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/1_2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/1_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1137926c08b755d917aca698c1aa6eb1e44f0694 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/1_2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_0.png new file mode 100644 index 0000000000000000000000000000000000000000..8160046bccdbb3e88abce20eb618f6a47ad8118b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a539337f1d28a68a301d3bf03d9bf498bd32c684 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_2.png new file mode 100644 index 0000000000000000000000000000000000000000..debeba2c2f30d500732d212aa640fcfc34a74cc6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a71a0fed85690cc460ee6b88b6505e0c5f77e7c7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_4.png new file mode 100644 index 0000000000000000000000000000000000000000..76aa3da2ed2fa5c3c2f753ae981ded86ccebf2ab Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_5.png new file mode 100644 index 0000000000000000000000000000000000000000..3af85b43599f407dfd7228eed3cbb04168704c6c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_6.png new file mode 100644 index 0000000000000000000000000000000000000000..9415224892671bf2cec716744cd85cff71186b15 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/2_6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a7c7e128edff0638513601547c84055ad12292 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_1.png new file mode 100644 index 0000000000000000000000000000000000000000..881ff1db79579cb87eb41cbd54bebfcbe46b6d36 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_2.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61117016baaf3e8055f6d2bb2df2437966a44c52 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_2.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_3.png new file mode 100644 index 0000000000000000000000000000000000000000..dea8794d08c40287baa12576fcc641ad90dcbc42 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_4.png new file mode 100644 index 0000000000000000000000000000000000000000..5766cdba24a8c600c4fe660ed9694a4cf14d9901 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_5.png new file mode 100644 index 0000000000000000000000000000000000000000..03c2ba5d7eedd85f951bf9f9a52031bd34e5c146 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_6.png new file mode 100644 index 0000000000000000000000000000000000000000..49c9849fdd88a1a8e27298ac2080f0f6056408f8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_0_6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..995d0b825f38935dff56fdd6a035c0dde00f3f8f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..141c2e3baa25636806ecb9bdcbb3bd8c54d8d92a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_2.png new file mode 100644 index 0000000000000000000000000000000000000000..bc060783e640bab113f6f4c53b8cbaaac1776c4e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_3.png new file mode 100644 index 0000000000000000000000000000000000000000..110851aa9355a79532664a1e8b99dcffa948df5e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_4.png new file mode 100644 index 0000000000000000000000000000000000000000..1691be2834ec056906218551b57471af7c860345 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_5.png new file mode 100644 index 0000000000000000000000000000000000000000..f50f4877eefa6f0cce7b39438c53f9672d3c1e1b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_6.png new file mode 100644 index 0000000000000000000000000000000000000000..416250c16283071e91a321e3fdc089365177123e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_7.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_7.png new file mode 100644 index 0000000000000000000000000000000000000000..d522442853c9303edfed0c376664340208e0bec8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_7.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_8.png new file mode 100644 index 0000000000000000000000000000000000000000..cae4aee2fd5c9ff5f1ab43ff1a83b75feb7c6690 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_9.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_9.png new file mode 100644 index 0000000000000000000000000000000000000000..2dd77f3d78514cb7e8f41637cc72b4921b44bd2a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_9.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_a.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_a.png new file mode 100644 index 0000000000000000000000000000000000000000..eddd1751331b197e7e96d0d7c81cf00e57845c85 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_a.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_b.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_b.png new file mode 100644 index 0000000000000000000000000000000000000000..a72940bc805620fb9c1cce0f96cb8b3f0aeb0403 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/3_1_b.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/4_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/4_0.png new file mode 100644 index 0000000000000000000000000000000000000000..cd1fb5486e5fb5bef8d09643570ebf91f59d2acc Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/4_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/4_1.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/4_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4d321c89935032c2086d10286615b51005950ad Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/4_1.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/4_2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/4_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3226382e54e37105af84626bf6c6642a69e4e085 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/4_2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/4_3.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/4_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32bb3b22bff5ae72f8b2ad544abcb38533a8f0f5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/4_3.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/5_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/5_0.png new file mode 100644 index 0000000000000000000000000000000000000000..7266404549ed61014801735c104cfb8155136e34 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/5_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/5_1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/5_1.png new file mode 100644 index 0000000000000000000000000000000000000000..505e07892b9ef7edb34e9b777a0fefb5e948b0e0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/5_1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_0.png new file mode 100644 index 0000000000000000000000000000000000000000..4837fa6f482678b8a3feaddbb56a16f5801ee6f2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6ba2686aae88c4f9a80cb4353f4ed5f4e5d50991 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_2.png new file mode 100644 index 0000000000000000000000000000000000000000..35384be5590b13ae8876acb1c349014203c35e8a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_3.png new file mode 100644 index 0000000000000000000000000000000000000000..393d3730b1e657ce21d7cd358784a3240ee4f7d2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_4.png new file mode 100644 index 0000000000000000000000000000000000000000..232020bb20cad63aaf489f16dbabb4d0897a0da6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_5.png new file mode 100644 index 0000000000000000000000000000000000000000..5483d9657c56e1de2128fc78343bec6ed0195e1a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_6.png new file mode 100644 index 0000000000000000000000000000000000000000..844f8bbdc2460efc461ad8ec638bdefdd7abbe43 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_7.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_7.png new file mode 100644 index 0000000000000000000000000000000000000000..ba9012d193844b0aa01ce2e2a9a255a40f4a692e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_7.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_8.png new file mode 100644 index 0000000000000000000000000000000000000000..5f199cbe125e631268a846bf02341e3a7594950f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_9.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_9.png new file mode 100644 index 0000000000000000000000000000000000000000..0fee811cf856422febbf76ef361585aa92f2edef Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_9.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_a.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_a.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5bd88e2738d8f580ad8a10989f600067cee12e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_a.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_b.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_b.png new file mode 100644 index 0000000000000000000000000000000000000000..13397291e3f1d849d73812b4acbbc405016b0fc6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_b.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_c.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_c.png new file mode 100644 index 0000000000000000000000000000000000000000..467f14cda65e16f8c4bfd7cd6eb8906f5e25149b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_c.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_d.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_d.png new file mode 100644 index 0000000000000000000000000000000000000000..37f00b1b82309d1d4968fcf28e9c8c273e4c96a7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_d.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_e.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..643639fe0544ffb51be9d5a7ae3e55e6fa90609d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/6_e.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..15314abdc5ff7dd659df3eb58df68b33e708b6d8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_1.png new file mode 100644 index 0000000000000000000000000000000000000000..baa5c80452278f6e7dda46c6e0331120ac113670 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_2.png new file mode 100644 index 0000000000000000000000000000000000000000..21861717bb05b7b1bcf15dd4605cb6ff4075affd Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_3.png new file mode 100644 index 0000000000000000000000000000000000000000..fda40ca12e5ed561283f4a31b85ca6618f4964c9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_4.png new file mode 100644 index 0000000000000000000000000000000000000000..5eff20958e0d364f523b711acb8f6f852da27c58 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_5.png new file mode 100644 index 0000000000000000000000000000000000000000..040086b6044108360c50dcb74c51c1cf516a2525 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_6.png new file mode 100644 index 0000000000000000000000000000000000000000..a80270a7e651b753b9da3d979432911215d00f4a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_7.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_7.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6624a2f43df0d08edc5c4bc6e6bfffdc158b98 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_7.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7d789db13ef7fed40885c3b99df85ba39d92f137 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_0_8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_0.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46526fa4808c1c144ba1224cdc367d53cad9465a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_0.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_1.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19e5c854897f87b8629398c4e2d60baba55969a7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_1.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_2.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2548d03949142826500d540c779fa219acfe2f44 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_2.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_3.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..523def692c63bff6f5fd6fc449e5ba5b9b44f4bc Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_3.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_4.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5b0b4d92ddd7e152b0f4cd341f3e321446412b60 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_4.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_5.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b17bccfbf05cb627b1d7a65cd61f5186a60f4ee Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_5.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_6.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8796d509dda24cebd2022f20d87738afd9e4709b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_6.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_7.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..39038790600ad189ea5174576bd5a7caf990573d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/figures/9_1_7.jpg differ diff --git "a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/\346\201\251\346\231\272\346\265\246FRDM-MCXA156\345\256\236\350\267\265\346\214\207\345\215\227.md" "b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/\346\201\251\346\231\272\346\265\246FRDM-MCXA156\345\256\236\350\267\265\346\214\207\345\215\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..388e9e08e07ed867626e5626f8ee7e318eb4cb7f --- /dev/null +++ "b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A156/\346\201\251\346\231\272\346\265\246FRDM-MCXA156\345\256\236\350\267\265\346\214\207\345\215\227.md" @@ -0,0 +1,1994 @@ +# 恩智浦FRDM-MCXA156开发实践指南 + +| **目录** | **作者** | +| ------------------------------------------------------------ | ---------------------- | +| **零、实践指南说明** | **RT-Thread & 恩智浦** | +| **一、恩智浦A156上的HWTimer实践** | **朱明明** | +| **二、恩智浦A156上的RW007实践** | **董策** | +| **三、恩智浦A156上的CAN实践** | **郜二强 & 赵亮** | +| **四、恩智浦A156上的ADC实践** | **李强** | +| **五、恩智浦A156上的RTC实践** | **刘协泉** | +| **六、恩智浦A156上的SPI实践** | **辛书伟** | +| **七、恩智浦A156上的GPIO实践** | **朱俊杰** | +| **八、恩智浦A156上的USB-HS实践** | **张国锋 & 张纪胜** | +| **九、恩智浦A156上的UART实践** | **王超** | +| **十、恩智浦A156上的PWM实践** | **曹显嵩** | +| **十一、恩智浦A156上的IIC(硬件)实践** | **点灯大师** | +| **十二、恩智浦A156上的P3T1755DPJ(温度传感器驱动,需制作成软件包)实践** | **吴艺彬** | +| **FAQ** | **RT-Thread & 恩智浦** | + +# 《恩智浦FRDM-MCXA156开发实践指南》 零、实践指南说明 + +## 硬件介绍 + +1. 开发板描述:FRDM-MCXA156 是一种紧凑且可扩展的开发板,专为 MCX A144/5/6 和 A154/5/6 系列 MCU 的快速原型开发而设计。它们提供了符合行业标准的引脚接口,便于访问 MCU 的 I/O 资源,并集成了开放标准的串行接口、外部闪存以及板载 MCU-Link 调试器。 通过 MCUXpresso 开发体验,还可使用额外的工具,如用于扩展板的扩展板集线器(Expansion Board Hub)和用于软件示例的应用代码集线器(Application Code Hub)。 + +2. 开发板外观如下图所示:![](figures/0_0.png) + +3. 该开发板常用**板载资源**如下 + +* 微控制器 + + * MCX A13x/14x/15x MCU搭载Arm® Cortex® M33内核 + * 1MB的闪存 + * 128KB的RAM + * 8 KB ECC, CAN-FD, FlexIO, FS USB, I3C, LPLUART, LPSPI, LPI2C, DMA and LDO + +* 连接性 + + * 具备 USB Type-C 连接器的 FS USB 端口,用于设备功能 + * 具备 USB Type-C 连接器的 HS USB 端口(用于板载 MCU-Link 调试器) + * CAN/I3C/SPI/I2C/UART 连接器(兼容 Arduino、PMOD/mikroBUS,DNP) + * Wi-Fi 连接器(兼容 Arduino、PMOD/mikroBUS,DNP) + +* 调试: + + - 板载 MCU-Link 调试器,支持 CMSIS-DAP + - JTAG/SWD 连接器 + +* 传感器: + + - P3T1755DPJ I3C/I²C 温度传感器 + +* 扩展选项: + + - Arduino® 接口 + - FRDM 接口 + - Pmod™ *DNP + - mikroBUS™ + - FlexIO/LCD 接口 + - FlexIO/摄像头接口 + + - RGB 用户 LED、复位、ISP、唤醒按钮 + + 开发板更多详细信息请参考 [**NXP官方网站**]([FRDM-MCXA156 Development Board using MCUXpresso | NXP 半导体](https://www.nxp.com.cn/design/design-center/development-boards-and-designs/FRDM-MCXA156)) + + **我有疑问:**[**RT-Thread 官方论坛**](https://gitee.com/link?target=https%3A%2F%2Fclub.rt-thread.org) + +# 一、恩智浦A156上的HWTimer实践(朱明明) + +## 1. 实验目的 + +MCXA156开发板上一共有4个CTimer定时器,每一路均支持捕获和输出模式 + +## 2. 步骤说明 + +### 2.1 使能CTIMER驱动 + +打开使能CTIMER驱动,保存配置退出menuconfig + +![](figures/1_0.png) + +### 2.2 更新软件包 + +拉取更新软件包,并导出MDK5工程,最后编译修改工程 + +* 拉取更新软件包:`pkgs —update` + + ![](figures/1_1.png) + +* 导出MDK5工程:`scons —target=mdk5` + + ![](figures/1_2.png) + +### 2.3 打开MDK5工程,添加测试例子 + +```c +define HWTIMER_DEV_NAME “timer0” + +tatic rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) +{ + rt_kprintf(“this is hwtimer timeout callback fucntion!\n”); + rt_kprintf(“tick is :%d !\n”, rt_tick_get()); + return 0; +} + +static int hwtimer_sample(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + rt_hwtimerval_t timeout_s; + rt_device_t hw_dev = RT_NULL; + rt_hwtimer_mode_t mode; + rt_uint32_t freq = 2000000; + + hw_dev = rt_device_find(HWTIMER_DEV_NAME); + if (hw_dev == RT_NULL) + { + rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + return RT_ERROR; + } + ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); + if (ret != RT_EOK) + { + rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + return ret; + } + rt_device_set_rx_indicate(hw_dev, timeout_cb); + rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq); + mode = HWTIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + if (ret != RT_EOK) + { + rt_kprintf("set mode failed! ret is :%d\n", ret); + return ret; + } + timeout_s.sec = 5; + timeout_s.usec = 0; + if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) + { + rt_kprintf("set timeout value failed\n"); + return RT_ERROR; + } + rt_thread_mdelay(3500); + rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); + rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec); + return ret; +} +MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); +``` + +## 3. 原文链接 + +原文连接:https://club.rt-thread.org/ask/article/e72ff3ba3445a31e.html + +# 二、恩智浦A156上的RW007实践(**董策**) + +## 1. 开发环境部署 + +### 1.1 工具链配置 + +#### 安装ENV工具 + +https://www.rt-thread.org/download.html#download-rt-thread-env-tool + +#### 同步源码仓库 + +https://github.com/RT-Thread/rt-thread.git +cd rt-thread/bsp/nxp/mcxa/mcxa156 + +## 2. 添加软件包 + +### 2.1 添加外设 + +![](figures/2_0.png) + +### 2.2 添加rw007软件包,不使用stm32例程 + +![](figures/2_1.png) + +### 2.3 配置rw007引脚 + +![](figures/2_2.png) + +根据原理图可知 + +![](figures/2_3.png) + +* SS:P2_6 = 2 * 32 + 6 = 70 → 16进制就是 `0x46` +* INT:P3_17 = 3 * 32 + 17 = 113 → 16进制就是 `0x71` +* RST:P1_15 = 1 * 32 + 15 = 47 → 16进制就是 `0x2F` + +## 3. 板子rework + +根据板子原理图可知R59 R60要接在2-3的位置 + +![](figures/2_4.png) + +## 4. 编译烧录 + +![](figures/2_5.png) + + *发生异常中断* + +### 解决办法 + +1. 调整 TCP/IP 线程栈大小 + * 配置项:`RT_LWIP_TCPTHREAD_STACKSIZE 4096` +2. 重新编译并烧录 + +3. 联网正常,`ping` 百度可通 + +![](figures/2_6.png) + +## 5. 原文链接 + +原文链接:https://club.rt-thread.org/ask/article/5bfff9e4aa96c114.html + +# 三、恩智浦A156上的CAN实践(郜二强 & 赵亮) + +## 1. MCAX-156 CAN总线(郜二强) + +### 1.1 FRDM-MCXA156 开发板介绍 + +![](figures/3_0_0.png) + +### 1.2 CAN总线 + +![](figures/3_0_1.png) + +### 1.3 物理接线 + +将CAN分析仪的CANH 和 CANL与板子上的CANH和CANL分别对应连接,由于板子上仅有一个2.54针座,因此需要寻找一个2.542pin胶壳进行连接。 +CAN分析仪如下图所示: + +![](figures/3_0_2.jpg) + +接线示意图如下: + +![](figures/3_0_3.png) + +### 1.3 操作步骤 + +RT-Thread Packes地址:https://gitee.com/rtthread/rt-thread ,使用gitee下载 +FRDM-CMXA BSP文件地址:F:\rt-thread-master\bsp\nxp\mcx\mcxa\frdm-mcxa156 +使用env工具打开 + +1. 使用menuconfig命令对工程进行配置: + +![](figures/3_0_4.png) + +![](figures/3_0_5.png) + +2. 配置完成后保存配置,使用构建工程 `scons --target=mdk5` + +​ 打开目录下的项目工程:`F:\rt-thread-master\bsp\nxp\mcx\mcxa\frdm-mcxa156` + +3. 使用该代码进行测试,编译烧录程序,进行测试。 + + 使用can_sample命令后发现设备打开失败,原因是,Rt-Thread官方还未对can进行配置驱动,由于制作drv驱动耗时较久,本文先使用NXP官方demo测试该开发板的CAN总线。 + +```c +#include +#include "rtdevice.h" +#define CAN_DEV_NAME "can1" // CAN 设备名称 +static struct rt_semaphore rx_sem; // 用于接收消息的信号量 +static rt_device_t can_dev; // CAN 设备句柄 +// 接收数据回调函数 +static rt_err_t can_rx_call(rt_device_t dev, rt_size_t size) +{ + // CAN 接收到数据后产生中断,调用此回调函数,然后发送接收信号量 + rt_sem_release(&rx_sem); + return RT_EOK; +} +static void can_rx_thread(void *parameter) +{ + int i; + rt_err_t res; + struct rt_can_msg rxmsg = {0}; + // 设置接收回调函数 + rt_device_set_rx_indicate(can_dev, can_rx_call); +#ifdef RT_CAN_USING_HDR + struct rt_can_filter_item items[5] = + { + RT_CAN_FILTER_ITEM_INIT(0x100, 0, 0, 0, 0x700, RT_NULL, RT_NULL), // std,match ID:0x100~0x1ff,hdr 为 - 1,设置默认过滤表 + RT_CAN_FILTER_ITEM_INIT(0x300, 0, 0, 0, 0x700, RT_NULL, RT_NULL), // std,match ID:0x300~0x3ff,hdr 为 - 1 + RT_CAN_FILTER_ITEM_INIT(0x211, 0, 0, 0, 0x7ff, RT_NULL, RT_NULL), // std,match ID:0x211,hdr 为 - 1 + RT_CAN_FILTER_STD_INIT(0x486, RT_NULL, RT_NULL), // std,match ID:0x486,hdr 为 - 1 + {0x555, 0, 0, 0, 0x7ff, 7,} // std,match ID:0x555,hdr 为 7,指定设置 7 号过滤表 + }; + struct rt_can_filter_config cfg = {5, 1, items}; // 一共有 5 个过滤表 + // 设置硬件过滤表 + res = rt_device_control(can_dev, RT_CAN_CMD_SET_FILTER, &cfg); + RT_ASSERT(res == RT_EOK); +#endif + res = RT_TRUE; + res = rt_device_control(can_dev, RT_CAN_CMD_START, &res); + while (1) + { + // hdr 值为 - 1,表示直接从 uselist 链表读取数据 + rxmsg.hdr_index = -1; + // 阻塞等待接收信号量 + rt_sem_take(&rx_sem, RT_WAITING_FOREVER); + // 从 CAN 读取一帧数据 + rt_device_read(can_dev, 0, &rxmsg, sizeof(rxmsg)); + // 打印数据 ID 及内容 + rt_kprintf("ID:%x", rxmsg.id); + for (i = 0; i < 8; i++) + { + rt_kprintf("%2x", rxmsg.data[i]); + } + rt_kprintf("\n"); + } +} +int can_sample(int argc, char *argv[]) +{ + struct rt_can_msg msg = {0}; + rt_err_t res; + rt_size_t size; + rt_thread_t thread; + char can_name[RT_NAME_MAX]; + if (argc == 2) + { + rt_strncpy(can_name, argv[1], RT_NAME_MAX); + } + else + { + rt_strncpy(can_name, CAN_DEV_NAME, RT_NAME_MAX); + } + // 查找 CAN 设备 + can_dev = rt_device_find(can_name); + if (!can_dev) + { + rt_kprintf("find %s failed!\n", can_name); + return -RT_ERROR; + } + // 初始化 CAN 接收信号量 + rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); + // 以中断接收及发送方式打开 CAN 设备 + res = rt_device_open(can_dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX); + RT_ASSERT(res == RT_EOK); + // 创建数据接收线程 + thread = rt_thread_create("can_rx", can_rx_thread, RT_NULL, 1024, 25, 10); + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + else + { + rt_kprintf("create can_rx thread failed!\n"); + } + msg.id = 0x78; // ID 为 0x78 + msg.ide = RT_CAN_STDID; // 标准格式 + msg.rtr = RT_CAN_DTR; // 数据帧 + msg.len = 8; // 数据长度为 8 + // 待发送的 8 字节数据 + msg.data[0] = 0x00; + msg.data[1] = 0x11; + msg.data[2] = 0x22; + msg.data[3] = 0x33; + msg.data[4] = 0x44; + msg.data[5] = 0x55; + msg.data[6] = 0x66; + msg.data[7] = 0x77; + // 发送一帧 CAN 数据 + size = rt_device_write(can_dev, 0, &msg, sizeof(msg)); + if (size == 0) + { + rt_kprintf("can dev write data failed!\n"); + } + return res; +} +MSH_CMD_EXPORT(can_sample, can device sample); +``` + +4. 运行结果 + ![](figures/3_0_6.png) + +测试过程中需要注意,必须如果使能CAN FD必须使用CAN FD盒子才能侦测到CAN数据,这也是汽车电子开发过程中经常遇到的。 + +### 1.4 原文链接 + +原文链接:https://club.rt-thread.org/ask/article/38ff670c9762945e.html + +## 2. 【FRDM-MCXA156 】CAN通讯(赵亮) + +### 2.1 MCXA156之CAN外设 + +FlexCAN是一种通信控制器,它根据ISO 11898-1:2015标准和CAN 2.0 Part B协议规范实现了CAN协议。CAN协议最初主要被设计为车辆串行数据总线,以满足车辆电磁干扰(EMI)环境中特定的实时处理和可靠运行要求。FlexCAN是CAN协议规范、灵活数据速率CAN(CAN FD)协议以及CAN 2.0 Part B协议的完整实现。它支持标准和扩展消息帧以及长有效载荷。关于该外设的详细介绍可参考MCXA156 RM参考手册。 + +### 2.2 硬件电路 + +参考板卡的原理图,是自带CAN IC TJA1057的,这方面的测试应用就直接使用外部CAN测试卡连接即可。如图所示: + +![](figures/3_1_0.png) + +### 2.3 开发环境 + +本次测试主要使用官方的bsp,毕竟官方框架都给搭好了,直接使用就可以了。开发环境为ENV和Keil5。 + +### 2.4 步骤说明 + +#### 2.4.1 添加源码 + +在使用bsp之前需要,需要在board/Kconfig 中增加使能CAN外设的代码,这样在env 的界面中才能出现。如下所示: + +``` +menuconfig BSP_USING_CAN + bool "Enable CAN" + select RT_USING_CAN + default n + if BSP_USING_CAN + config BSP_USING_CAN0 + bool "Enable CAN0" + default y + endif +``` + +关于这部分的编写,可以参考官方文档,这里是参考其他外设配置编写的。 + +#### 2.4.2 ENV配置 + +在bsp中打开ENV环境,右键选择ConEmu here,打开ENV界面如图所示: + +![](figures/3_1_1.png) + +输入menuconfig 指令,出现选项列表,如图所示: + +![](figures/3_1_2.png) + +选择RT-Thread Components—->,找到Device Drivers—->,选择Enable CAN如图所示: + +![](figures/3_1_3.png) + +退到主菜单,选择Hardware Drivers Config—->,选择On-chip Peripheral Drivers—->,选择Enable CAN,如图所示: + +![](figures/3_1_4.png) + +该板卡使用的是CAN0,选择Enable CAN0即可。 +这些配置完,退出菜单,在主界面中重新生成keil project,使用scons —target=mdk5,如图所示:![](figures/3_1_5.png) + +这样配置完就可以进入程序了。 + +#### 2.4.3 程序运行 + +打开项目文件,需要添加drv_can 驱动文件,右键项目名称,选择manage project items…,选择Drivers,增加文件即可,如图所示: + +![](figures/3_1_6.png) + +在main.c主函数中添加代码,可参考官方示例代码,这里需要注意,本板卡使用的外设是CAN0,代码如下: +参考如链接所示: +https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/can/can +编译无错误,Debug程序。打开CAN配套的测试软件,选择好接口和波特率。打开串口终端,如图所示: +![](figures/3_1_7.png) + +开始运行程序,在串口终端msh中输入can_sample,可以看到在CAN终端会接收到一帧数据。如图所示: + +![](figures/3_1_8.png) + + +在CAN终端发送一帧数据后,在串口终端可以接收到一帧数据,如图所示: + +![](figures/3_1_9.png) + +CAN的收发基本功能测试完成。 + +#### 2.4.4 出现的问题 + +在打开串口终端软件的时候,输入指令时,出现溢出,如图所示: + +![](figures/3_1_a.png) + +在这里需要在rtconfig.h中将idle任务值改大一点,如图所示: + +![](figures/3_1_b.png) + +### 2.5 资料汇总 + +**源码分享** +[frdm-mcxa156.zip](https://club.rt-thread.org/file_download/98ba71f30c503205) +将这部分源码解压缩后,替换掉bsp->nxp->mcx->mcxa里面的同名文件就可以正常调试了。 + +### 2.6 原文链接 + +原文链接:https://club.rt-thread.org/ask/article/5788bf8831d301f5.html + +# 四、恩智浦A156上的ADC实践(李强) + +​ 注:RT_STUDIO还不支持这个芯片,只能用env + +## 1. ADC引脚 + +![](figures/4_0.png) + +## 2. 操作配置 + +RT-Thread Packes地址:https://gitee.com/rtthread/rt-thread ,使用gitee下载 +FRDM-CMXA BSP文件地址:F:\rt-thread-master\bsp\nxp\mcx\mcxa\frdm-mcxa156 +使用env工具打开 + +1. 使用menuconfig命令对工程进行配置: + +![](figures/4_1.jpg) + +2. 安装keil芯片包,使用`scons —target=mdk5`来重新生成Keil工程 + 生成Keil工程文件名为 project.uvprojx, 双击 project.uvprojx 文件,打开 MDK5 工程,编译下载,现在只能观察到LED闪烁 + +3. 先使用官方MCUXpresso IDE 测试ADC + +![](figures/4_2.png) + +4. 能够通过VOFA显示正弦曲线 + +![](figures/4_3.jpg) + +## 3. 原文链接 + +原文链接:https://club.rt-thread.org/ask/article/70654de03aef459e.html + +# 五、恩智浦A156上的RTC实践(刘协泉) + +## 1. 前言 + +​ 之前朋友向我推送此板卡测评信息时,发现驱动列表中有好几个没有适配驱动的,首当其冲的便是rtc模块未适配,恰好最近也把rtt驱动框架层代码都梳理了一遍,整理出了一份适配驱动时的参考模板,便顺势申请了测评RTC模块。 + +   在获知申请通过后,第一时间跑到nxp官网去搜索资料,但搜索了几天,没找到任何提到mcxa156支持硬件rtc的资料,虽然后来在群里有群友提到可以用低功耗定时器作为RTC时钟源来适配硬件RTC框架,但个人感觉毕竟不是真正的RTC,无法做到断电的时间计时功能,还是觉得使用软件RTC更加合适些。原因为: + +1. 软件RTC基于rt_systick_get()接口,而此接口的基准时钟为systick,本身就可以保证时间的精度足够高。 +2. 唯一不足的是,软件定时器闹钟功能使用的是基于线程的软件定时器,在线程优先级不高的情况下,可能会出现ms级别的误差,但个人认为此误差在大部分场景下对用户无感,不算什么大问题。 +3. 低功耗定时器(LPTMR)毕竟属于定时器,虽然能够做到1s级别的滴答,但是无法实现硬件RTC最关键的断电计时功能,与其强行将该模块适配成RTC,倒不如直接将其与硬件定时器框架适配。 + +## 2. 配置过程 + +### 2.1 软件RTC使能 + +![](figures/5_0.png) + +  选择完毕后按Q键并选择Y保存退出。 + +### 2.2 生成工程 + +​ 在env环境下输入`scons —target=mdk5`后按回车生成新工程。 + +![](figures/5_1.png) + +### 2.3 代码修改 + +​ 在main.c中添加以下代码,以下代码的逻辑为:获取当前时间,并以当前时间的下一秒为闹铃开始时间启动闹钟,在闹钟中循环打印最新的时间节点。之所以这么操作,主要是考虑到这种操作既测试了闹钟功能,也能通过闹钟和直接获取当前时间接口获取的时间做对比,反向验证RTC计时功能和检验闹钟功能的误差。 + +```c +void user_alarm_callback(rt_alarm_t alarm, time_t timestamp) +{ + time_t now = (time_t)0; + struct timeval tv = { 0 }; + gettimeofday(&tv, RT_NULL); + now = tv.tv_sec; + rt_kprintf("local time: %.*s", 25U, ctime(&now)); +} +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; + 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); + } +} +MSH_CMD_EXPORT(alarm_sample,alarm sample); +``` + +## 3. 编译运行 + +​ 双击打开生成的project.uvprojx后点击rebuild按钮,编译固件后点击Load图标烧录至板卡中,之后短按板卡上的Reset按钮重启复位板卡。 + +## 4. 运行结果 + +```c +\ | / +- RT - Thread Operating System + / | \ 5.2.0 build Feb 23 2025 22:06:49 + 2006 - 2024 Copyright by RT-Thread team +using armclang, version: 6210000 +MCXA156 HelloWorld +msh > +msh > +msh > +msh >alr +msh >alar +alarm_sample +msh >alarm_sample +msh >local time: Mon Jan 1 08:00:11 2018 +local time: Mon Jan 1 08:00:12 2018 +local time: Mon Jan 1 08:00:13 2018 +local time: Mon Jan 1 08:00:14 2018 +local time: Mon Jan 1 08:00:15 2018 +local time: Mon Jan 1 08:00:16 2018 +local time: Mon Jan 1 08:00:17 2018 +local time: Mon Jan 1 08:00:18 2018 +local time: Mon Jan 1 08:00:19 2018 +local time: Mon Jan 1 08:00:20 2018 +local time: Mon Jan 1 08:00:21 2018 +local time: Mon Jan 1 08:00:22 2018 +local time: Mon Jan 1 08:00:23 2018 +local time: Mon Jan 1 08:00:24 2018 +local time: Mon Jan 1 08:00:25 2018 +local time: Mon Jan 1 08:00:26 2018 +local time: Mon Jan 1 08:00:27 2018 +local time: Mon Jan 1 08:00:28 2018 +local time: Mon Jan 1 08:00:29 2018 +local time: Mon Jan 1 08:00:30 2018 +local time: Mon Jan 1 08:00:31 2018 +local time: Mon Jan 1 08:00:32 2018 +local time: Mon Jan 1 08:00:33 2018 +local time: Mon Jan 1 08:00:34 2018 +local time: Mon Jan 1 08:00:35 2018 +local time: Mon Jan 1 08:00:36 2018 +local time: Mon Jan 1 08:00:37 2018 +local time: Mon Jan 1 08:00:38 2018 +local time: Mon Jan 1 08:00:39 2018 +local time: Mon Jan 1 08:00:40 2018 +local time: Mon Jan 1 08:00:41 2018 +local time: Mon Jan 1 08:00:42 2018 +local time: Mon Jan 1 08:00:43 2018 +local time: Mon Jan 1 08:00:44 2018 +local time: Mon Jan 1 08:00:45 2018 +local time: Mon Jan 1 08:00:46 2018 +local time: Mon Jan 1 08:00:47 2018 +local time: Mon Jan 1 08:00:48 2018 +local time: Mon Jan 1 08:00:49 2018 +local time: Mon Jan 1 08:00:50 2018 +local time: Mon Jan 1 08:00:51 2018 +local time: Mon Jan 1 08:00:52 2018 +local time: Mon Jan 1 08:00:53 2018 +local time: Mon Jan 1 08:00:54 2018 +local time: Mon Jan 1 08:00:55 2018 +local time: Mon Jan 1 08:00:56 2018 +local time: Mon Jan 1 08:00:57 2018 +local time: Mon Jan 1 08:00:58 2018 +local time: Mon Jan 1 08:00:59 2018 +local time: Mon Jan 1 08:01:00 2018 +``` + +​ 从结果上看,alarm功能已经启用,且通过后续打印看,每次读到的时间都和前一个时间差1s,不存在一样或者超过1s的情况,说明RTC最基础的计时功能已经正常,且软件定时器线程的优先级能够满足闹钟功能的使用。 + +## 5. 总结 + +​ 虽然这次很意外选中了硬件不支持的RTC功能,没法从0开始适配硬件RTC,但是在使用软件RTC的过程中,对之前软件RTC的错误理解进行了纠正(以前认为软件RTC需要支持`RT_DEVICE_CTRL_RTC_GET_TIME`和`RT_DEVICE_CTRL_RTC_SET_TIME`命令的设备才能正常工作,原因为看代码工具未将`RT_USING_SYSTEM_WORKQUEUE`包含部分灰掉,导致理解错误),加强了对软件RTC方面逻辑的理解。 +    后续计划,按照群友思路使用低功耗定时器适配硬件RTC框架,实现类似于软件RTC的功能,但此代码仅存放至个人github上rt-thread仓库下的mcxa156分支中,不主动合并至主线中,以免其他人以为支持硬件RTC而踩雷。 +    **目前使用lptmr方式实现的RTC驱动已经适配完,使用方法为关闭软件RTC,改为选择芯片下的RTC和闹钟功能,验证方法同软件RTC方法。** + +## 6. 原文链接 + +原文链接:https://club.rt-thread.org/ask/article/cd184629ecdad1c1.html + +# 六、恩智浦A156上的SPI实践(辛书伟) + +## 1. 引言 + +​ 本文介绍如何在NXP FRDM-MCXA156 开发板上配置和使用 RTT系统,通过硬件SPI进行OLED 驱动,引用u8g2 三方库进行界面显示及控制。 + +## 2. NXP FRDM-MCXA156 开发板 + +### 2.1 功能框图如下 + +![](figures/6_0.png) + +### 2.2 按键原理图 + +![](figures/6_1.png) + +### 2.3 LED + +![](figures/6_2.png) + +### 2.4 I3C + +![](figures/6_3.png) + +### 2.5 扩展口 + +![](figures/6_4.png) + +### 2.6 CAN USB + +![](figures/6_5.png) + +## 3. 上电点灯 + +```c +#define LED_PIN ((3*32)+0) +``` + +使用三色灯的蓝色,编译使用板载的DAPlink 下载,按rst 按键重启即可 + +## 4. ENV SPI 配置 + +此芯片支持2个spi,默认加载了SPI1 驱动,后续添加下SPI0 pinmux 设置,SPI0后续也可以使用起来,这里使用SPI1 进行测试验证 + +![](figures/6_6.png) + +1. 在rt-thread\bsp\nxp\mcx\mcxa\frdm-mcxa156 路径下打开env + 输入 `menuconfig` + +2. 选择最后一个Hardware Driver Config + + ![](figures/6_7.png) + +3. 选择on-chip Peripheral Drivers + + ![](figures/6_8.png) + +4. 使能spi 及spi1 + + ![](figures/6_9.png) + +5. 在最开始的菜单中选择 + online packages->multimedia packages->u8g2->legacy + 如下图进行配置 + + ![](figures/6_a.png) + +6. 版本使用c + 例子使用 ssd1306 SPI HW + + ![](figures/6_b.png) + +7. 输入 `pkgs --update ` 下载u8g2代码 + +8. 最后通过 `scons --target=mdk5`重新生成keil 工程即可 + +## 5. 硬件连接 + +按图进行连接及调整,默认Arduino 接口没有spi ,默认是PWM + +![](figures/6_c.png) + +如原理图所示,需要进行调整 + +![](figures/6_d.png) + +## 6. 代码修改 + +```c +#include +#include +#include +#include +// You may reference Drivers/drv_gpio.c for pinout +// In u8x8.h #define U8X8_USE_PINS +#define OLED_SPI_PIN_RES ((3*32) +17) +#define OLED_SPI_PIN_DC ((1*32) +15) +#define OLED_SPI_PIN_CS ((2*32) +6) +static void u8g2_ssd1306_12864_4wire_hw_spi_example(int argc,char *argv[]) +{ + u8g2_t u8g2; + // Initialization + u8g2_Setup_ssd1306_128x64_noname_f( &u8g2, U8G2_R0, u8x8_byte_rtthread_4wire_hw_spi, u8x8_gpio_and_delay_rtthread); + u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_CS, OLED_SPI_PIN_CS); + u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_DC, OLED_SPI_PIN_DC); + u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_RESET, OLED_SPI_PIN_RES); + u8g2_InitDisplay(&u8g2); + u8g2_SetPowerSave(&u8g2, 0); + // Draw Graphics + /* full buffer example, setup procedure ends in _f */ + u8g2_ClearBuffer(&u8g2); + u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr); + u8g2_DrawStr(&u8g2, 1, 18, "U8g2 on RT-Thread"); + u8g2_SendBuffer(&u8g2); + u8g2_SetFont(&u8g2, u8g2_font_wqy12_t_gb2312); + u8g2_DrawUTF8(&u8g2, 1, 40, "NXP MCXA156"); + u8g2_DrawUTF8(&u8g2, 1, 60, "硬件SPI测试"); + u8g2_SendBuffer(&u8g2); + /* + u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols); + u8g2_DrawGlyph(&u8g2, 112, 56, 0x2603 ); + u8g2_SendBuffer(&u8g2);*/ +} +MSH_CMD_EXPORT(u8g2_ssd1306_12864_4wire_hw_spi_example, hardware 4 wire spi ssd1306 sample); +``` + +指定 RES DC CS 管脚 +进行OLED 初始化 使能及显示 +这里注意要显示中文的话,此c 文件需要保存成utf8 编码格式,否则会显示乱码 + +## 7. 实际效果 + +![](figures/6_e.jpg) + +## 8. 原文链接 + +原文链接:https://club.rt-thread.org/ask/article/2fbf450b4bb03a1a.html + +# 七、恩智浦A156上的GPIO实践(朱俊杰) + +## 1. 实验目的 + +FRDM-MCXA156入门,搭载RTThread实时操作系统,点亮LED,并且针对rtthread的pin驱动进行一个介绍和使用。 + +## 2.操作步骤 + +1. 首先需要配置一下初始的开发环境:ENV2.0的版本,rtthread源码,在github下载即可,keil5。rtthread官网下的文档中心都有。 + 从github将rtthread的源码下载下来,使用压缩包下载,然后解压根据路径 + rt-thread-master\bsp\nxp\mcx\mcxa\frdm-mcxa156 找到这一个文件下的工程文件并且打开。 + +2. LED原理图: + +![](figures/6_2.png) + +3. 通过原理图可以看出,MCXA156的RGB三色灯是由P3_12,P3_13,P3_0组成的,因此只需要控制这三个引脚的高低电平就可以控制IO口驱动RGB三色灯。 + +4. 接下来,通过以下三个宏定义,来控制相应的引脚 + +```c +#define LED_R_PIN ((332)+12) //表示的是P3端口的12引脚 +#define LED_G_PIN ((332)+13) //表示的是P3端口的13引脚 +#define LED_B_PIN ((3*32)+0) //表示的是P3端口的0引脚 +``` + +5. 通过 `rt_pin_mode(LED_B_PIN, PIN_MODE_OUTPUT)`; 配置LED_B_PIN为输出模式 + 如果需要配置其它模式可以更改,例如 + PIN_MODE_INPUT 输入模式 + PIN_MODE_INPUT_PULLDOWN 下拉输入 + PIN_MODE_INPUT_PULLUP 上拉输入 + PIN_MODE_OUTPUT_OD 推挽输出 + +6. rtthread还提供了设备驱动的支持,在本例子中,通过访问PIN设备驱动,能够很快捷方便的操控PIN设备, + 例如通过 `rt_pin_write(rt_base_t pin, rt_base_t value)`和`rt_pin_read(rt_base_t pin, rt_base_t value)`,操控PIN设备的输出和读取。 + +7. `rt_pin_attach_irq(KEY0_PIN_NUM, PIN_IRQ_MODE_FALLING, beep_on, RT_NULL)`;可以设置引脚的中断触发模式.可以通过读取按键的上升沿和下降沿,识别按键是否按下,进行下一步操作等等的应用。例子二有相关PIN设备具体的实现 + +8. 例子一:通过控制LED灯,以每500ms进行三色切换LED灯 + + ```c + /* + * Copyright (c) 2006-2025, 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 "drv_pin.h" + #define LED_R_PIN ((3*32)+12) //红灯 + #define LED_G_PIN ((3*32)+13) //绿灯 + #define LED_B_PIN ((3*32)+0) //蓝灯 + int main(void) + { + rt_kprintf("MCXA156 HelloWorld\r\n"); + rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */ + rt_pin_mode(LED_G_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */ + rt_pin_mode(LED_B_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */ + rt_pin_write(LED_R_PIN, PIN_HIGH); //初始化LED红灯,为高电平,熄灭状态 + rt_pin_write(LED_G_PIN, PIN_HIGH); //初始化LED绿灯,为高电平,熄灭状态 + rt_pin_write(LED_B_PIN, PIN_HIGH); //初始化LED蓝灯,为高电平,熄灭状态 + while (1) + { + rt_pin_write(LED_R_PIN, PIN_LOW); + rt_thread_mdelay(500); + rt_pin_write(LED_R_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED_G_PIN, PIN_LOW); + rt_thread_mdelay(500); + rt_pin_write(LED_G_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED_B_PIN, PIN_LOW); + rt_thread_mdelay(500); + rt_pin_write(LED_B_PIN, PIN_HIGH); + rt_thread_mdelay(500); + } + } + // end file + ``` + +9. 例子二:通过使用SW_2,SW_3两个按键实现通过按键中断,进行三色灯的LED切换和清除所有LED灯。 + + ```c + /* + * Copyright (c) 2006-2025, 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 "drv_pin.h" + #define LED_R_PIN ((3*32)+12) + #define LED_G_PIN ((3*32)+13) + #define LED_B_PIN ((3*32)+0) + #define KEY2 ((1*32)+7) //P1_7 为SW2 + #define KEY3 (6) //P0_6 为SW3 + int k=1; + //打开LED红灯 + void LED_R_ON(void *args){ + rt_pin_write(LED_R_PIN, PIN_LOW); + } + //关闭LED红灯 + void LED_R_OFF(void *args){ + rt_pin_write(LED_R_PIN, PIN_HIGH); + } + //打开LED绿灯 + void LED_G_ON(void *args){ + rt_pin_write(LED_G_PIN, PIN_LOW); + } + //关闭LED绿灯 + void LED_G_OFF(void *args){ + rt_pin_write(LED_G_PIN, PIN_HIGH); + } + //打开LED蓝灯 + void LED_B_ON(void *args){ + rt_pin_write(LED_B_PIN, PIN_LOW); + } + //关闭LED蓝灯 + void LED_B_OFF(void *args){ + rt_pin_write(LED_B_PIN, PIN_HIGH); + } + //切换LED三色灯 + void LED_CONTROL(void *args){ + k++; + if(k>3){k=1;} + if(1==k){ + rt_pin_write(LED_R_PIN, PIN_LOW); + rt_pin_write(LED_G_PIN, PIN_HIGH); + rt_pin_write(LED_B_PIN, PIN_HIGH); + }else if(2==k){ + rt_pin_write(LED_R_PIN, PIN_HIGH); + rt_pin_write(LED_G_PIN, PIN_LOW); + rt_pin_write(LED_B_PIN, PIN_HIGH); + }else if(3==k){ + rt_pin_write(LED_R_PIN, PIN_HIGH); + rt_pin_write(LED_G_PIN, PIN_HIGH); + rt_pin_write(LED_B_PIN, PIN_LOW); + } + } + void LED_OFF(void *args){ + rt_pin_write(LED_R_PIN, PIN_HIGH); + rt_pin_write(LED_G_PIN, PIN_HIGH); + rt_pin_write(LED_B_PIN, PIN_HIGH); + } + int main(void) + { + k=1; + rt_kprintf("MCXA156 HelloWorld\r\n"); + rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */ + rt_pin_mode(LED_G_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */ + rt_pin_mode(LED_B_PIN, PIN_MODE_OUTPUT); /* Set GPIO as Output */ + rt_pin_mode(KEY3, PIN_MODE_INPUT_PULLUP); //设置按键3为输入上拉模式 + rt_pin_mode(KEY2, PIN_MODE_INPUT_PULLUP); //设置按键2为输入上拉模式 + rt_pin_write(LED_R_PIN, PIN_HIGH);//关闭LED红灯 + rt_pin_write(LED_G_PIN, PIN_HIGH);//关闭LED绿灯 + rt_pin_write(LED_B_PIN, PIN_HIGH);//关闭LED蓝灯 + //设置下降沿中断,采集到下降沿时触发中断,进入回调函数LED_R_ON + rt_pin_attach_irq(KEY2, PIN_IRQ_MODE_FALLING, LED_OFF, RT_NULL); + rt_pin_irq_enable(KEY2, PIN_IRQ_ENABLE); + //设置下降沿中断,采集到下降沿时触发中断,进入回调函数LED_R_OFF + rt_pin_attach_irq(KEY3, PIN_IRQ_MODE_FALLING, LED_CONTROL, RT_NULL); + rt_pin_irq_enable(KEY3, PIN_IRQ_ENABLE); + while (1) + { + } + } + ``` + +## 3. 原理图文件和版图文件 + +[SPF-90841.pdf](https://oss-club.rt-thread.org/uploads/20250228/fdad5cd58a7640c1b908df639c6ce155.pdf) + +[DNP-90841_A4.pdf](https://oss-club.rt-thread.org/uploads/20250228/66347211ba2c0c8bdc6f6b013c040c75.pdf) + +## 4. 原文链接 + +原文链接:https://club.rt-thread.org/ask/article/bf257c74ca37187a.html + +# 八、恩智浦A156上的USB-HS实践(张国锋 & 张纪胜) + +## 1. 使用CherryUSB开启虚拟串口尝试数据收发(张国锋) + +### 1.1 实验目的 + +FRDM-MCXA156使用cherryusb实现虚拟串口,通过串口可以发数据给虚拟串口 + +### 1.2 操作步骤 + +1. 打开env,来到bsp\nxp\mcx\mcxa\frdm-mcxa156目录下输入menuconfig回车 + + ![](figures/9_0_0.png) + +2. 打开device模式 + + ![](figures/9_0_1.png) + +3. 按照图片选项配置(其中USB Device Speed也可以用FS全速模式) + + ![](figures/9_0_2.png) + +4. 按下ESC返回,直到提示保存,按下Y + + 这样就配置好了 + + 输入scons —target=mdk5 + + 用keil打开该bsp下的project.uvprojx + + 虚拟串口发送数据到串口需要修改下代码 + + 来到cdc_acm_template.c,修改成以下函数代码(去掉原本的注释,换成红色部分的代码) + ![](figures/9_0_3.png) + + ![](figures/9_0_4.png) + +5. 然后来到cherryusb.c中 + +![](figures/9_0_5.png) + +6. 粘贴以下代码,这段实现的功能是让虚拟串口发送数据到终端串口(其中的buffer带了cache可能会有点问题,这里仅作为演示) + + ```c + #include + #include + #include "stdio.h" + #include "usb_dc.h" + #include "usb_config.h" + #include "usb_util.h" + #ifdef RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM + #define CDC_IN_EP 0x81 + #define CDC_OUT_EP 0x02 + #define CDC_INT_EP 0x83 + extern volatile bool ep_tx_busy_flag; + /* Register the EMAC device */ + static int rt_hw_stm32_cherryusb_cdc_init(void) + { + extern void cdc_acm_init(uint8_t busid, uintptr_t reg_base); + cdc_acm_init(0, 0x400A4000u); + return 0; + } + INIT_COMPONENT_EXPORT(rt_hw_stm32_cherryusb_cdc_init); + void cdc_acm_data_send(char *format, ...) + { + uint8_t str[2048]; + uint32_t str_len; + va_list arg; + va_start(arg, format); + vsprintf(str, format, arg); + va_end(arg); + str_len=strlen(str); + ep_tx_busy_flag = true; + usbd_ep_start_write(0, CDC_IN_EP, str, str_len); + while (ep_tx_busy_flag) { + } + } + static int cherry_usb_cdc_send(int argc, char *argv[]) + { + char str[100]; + if (argc == 2) + { + rt_strncpy(str, argv[1], 100); + rt_kprintf("%s",str); + extern void cdc_acm_data_send(char *format, ...); + cdc_acm_data_send("%s\r\n",str); + } + } + MSH_CMD_EXPORT(cherry_usb_cdc_send, send the cdc data for test) + #endif + ``` + +7. 按照图片的步骤编译烧写程序到板子上 + + ![](figures/9_0_6.png) + +8. 最后按下开发板的复位即可开始运行程序,板子上的USB FS就是虚拟串口,连接到电脑上 + +### 1.3 运行结果 + +将板子上的USB FS通过type-c线连接到电脑上,随着一声清脆的叮咚,就可以看到串口被正常识别到了![](figures/9_0_7.png) + +打开2个串口助手或者XCOM,一个选择板子的调试串口,一个选择虚拟串口 + +串口终端输入cherry_usb_cdc_send+文本可以发送数据到虚拟串口,反过来直接在虚拟串口发送文本也可以传到串口终端 + +可以看到两个串口助手之间可以互相传输数据![](figures/9_0_8.png) + +### 1.4 结语 + +在代码中可以这样调用虚拟串口打印数据,cdc_acm_data_send就类似于printf + +```c +extern void cdc_acm_data_send(char *format, ...); +cdc_acm_data_send("Hello World\r\n"); +``` + +### 1.5 原文链接 + +原文链接:https://club.rt-thread.org/ask/article/6551c9c1d88550b9.html + +## 2. CherryUSB与hid鼠标设备模仿(张纪胜) + +### 2.1 MCXA156 USB简介 + +MCXA156有一个全速(full speed)的USB模块,并集成了对应的USB 全速PHY,尤其重要的是只支持设备模式。板级上这个USB模块通过USB Type-C接出。请注意这板子有两USB Type-C口,一个是上文所述的MCU自身的USB接口,另一个是接的板载MCU-Link调试器(出厂默认是CMSIS-DAP兼容的固件),板上有清晰的丝印,注意下即可。 + +### 2.2 CherryUSB的移植适配 + +RT-Thread历史上一共曾有过三个USB协议栈,原自带Legacy USB协议栈、TinyUSB、CherryUSB,但在2024年已经统一切换成CherryUSB了。CherryUSB的适配其实也有固定套路:第一步准确找到USB对应的IP,因为CherryUSB的IP实现是作为一个port存在,复用即可。那么对于MCXA156 USB来说,它的IP应该是kinetis一类;第二步实现usb_dc_low_level_init()与usb_dc_low_level_deinit()函数,前者主要做USB相关的时钟、中断、甚至pinmux等一些初始化,而后者就是去初始化是前者的逆向操作,这一步可以观察下仓库里的code是不是已经有对应的glue代码,如果有修改即可,如果没有添加下对应代码。 + +### 2.3 USB HID设备的实践 + +模拟USB HID鼠标。 + +1. 修改bsp/nxp/mcx/mcxa/frdm-mcxa156/board/ports/cherryusb/cherryusb.c,加入以下代码: + + ```c + #ifdef RT_CHERRYUSB_DEVICE_TEMPLATE_HID_MOUSE + extern void hid_mouse_init(uint8_t busid, uintptr_t reg_base); + extern void hid_mouse_test(uint8_t busid); + static int rt_hw_mcxa156_cherryusb_hid_init(void) + { + hid_mouse_init(0, 0x400A4000u); + return 0; + } + INIT_COMPONENT_EXPORT(rt_hw_mcxa156_cherryusb_hid_init); + static int hid_example(int argc, char **argv) + { + hid_mouse_test(0); + return 0; + } + MSH_CMD_EXPORT(hid_example, USB hid example); + #endif + ``` + +调用hid_mouse_init()初始化一个USB HID鼠标,调用hid_mouse_test()做具体测试,可参见文末视频,代码基本是self-commented and explained,在CherryUSB的手册里也有对应的函数API介绍。 + +2. 然后在bsp/nxp/mcx/mcxa/frdm-mcxa156/目录下运行如下命令进入menuconfig配置界面 + + ``` + scons --menuconfig + ``` + +3. 配置主界面进RT-Thread Components + + ![](figures/9_1_0.jpg) + +4. 再进Device Drivers + + ![](figures/9_1_1.jpg) + +5. 选择最下面Using USB with CherryUSB + + ![](figures/9_1_2.jpg) + +6. 进入CherryUSB配置页面,这里选中Enable usb device mode + + ![](figures/9_1_3.jpg) + +7. 再Enter键进入USB Device模式配置,这里选中FS,IP选kinetis_mcx, 并Enable usb hid device, usb device template选hid_mouse + + ![](figures/9_1_4.jpg) + +8. 配置完毕,运行如下命令编译: + + ``` + scons -j8 + ``` + + ![](figures/9_1_5.jpg) + +9. 编译成功,在当前目录下也会有rtthread.bin文件生成,用如下pyocd命令即可烧录: + + ``` + pyocd load -e sector -t mcxa156vll rtthread.bin + ``` + + ![](figures/9_1_6.jpg) + +10. 在Finsh终端运行hid_example命令,会看到鼠标画圆 + + ![](figures/9_1_7.jpg) + +### 2.4 测试视频 + +https://www.bilibili.com/video/BV19dX9YUEGr/ + +### 2.5原文链接 + +原文链接:https://club.rt-thread.org/ask/article/04dfdcd4815f8d36.html + +# 九、恩智浦A156上的UART实践(王超) + +## 1. 实验目的 + +在 NXP FRDM-MCXA156 开发板上配置和使用 RT-Thread RTOS,并通过一个简单的串口通信 Demo 演示在该开发板上运行应用。 + +## 2. Demo实现 + +串口通信 Demo串口通信是嵌入式开发中最常见的操作之一。在RT_Thread上实现FRDM-MCXA156串口通信非常简单。以下是一个基于UART2的简单串口发送 Demo,用于测试开发板的串口功能。 + +1. 首先,打开rt-thread\bsp\nxp\mcx\mcxa\frdm-mcxa156\rtconfig.h文件,找到#define BSP_USING_UART0,在其下方添加#define BSP_USING_UART2 + + ```c + /* On-chip Peripheral Drivers */ + #define BSP_USING_PIN + #define BSP_USING_UART + #define BSP_USING_UART0 + #define BSP_USING_UART2 + /* end of On-chip Peripheral Drivers */ + ``` + +2. 然后需要进行引脚功能配置,这里需要参考官方数据手册,链接如下: + + [MCXAP100M96FS6.pdf](https://oss-club.rt-thread.org/uploads/20250224/c1854cf468b4512c76ed3914e70ddaa6.pdf) + +3. 打开rt-thread\bsp\nxp\mcx\mcxa\frdm-mcxa156\board\MCUX_Config\board\pin_mux.c文件,在BOARD_InitPins函数内添加如下配置,结合数据手册对于引脚的介绍,模仿BOARD_InitPins函数内Uart0配置即可; + + ``` + RESET_ReleasePeripheralReset(kLPUART2_RST_SHIFT_RSTn); + const port_pin_config_t p2_10_pin_config = { + kPORT_PullUp, + kPORT_LowPullResistor, + kPORT_FastSlewRate, + kPORT_PassiveFilterDisable, + kPORT_OpenDrainDisable, + kPORT_LowDriveStrength, + kPORT_NormalDriveStrength, + kPORT_MuxAlt3, // LPUART2 TXD + kPORT_InputBufferEnable, + kPORT_InputNormal, + kPORT_UnlockRegister + }; + PORT_SetPinConfig(PORT2, 10U, &p2_10_pin_config); // 配置为 LPUART2 TXD + const port_pin_config_t p2_11_pin_config = { + kPORT_PullUp, + kPORT_LowPullResistor, + kPORT_FastSlewRate, + kPORT_PassiveFilterDisable, + kPORT_OpenDrainDisable, + kPORT_LowDriveStrength, + kPORT_NormalDriveStrength, + kPORT_MuxAlt3, // LPUART2 RXD + kPORT_InputBufferEnable, + kPORT_InputNormal, + kPORT_UnlockRegister + }; + PORT_SetPinConfig(PORT2, 11U, &p2_11_pin_config); // 配置为 LPUART2 RXD + ``` + +4. uart_send_demo具体实现,在Applications目录下新建uart_demo.c添加如下代码: + + ```c + #include + #include + #include + /* 发送缓冲区 */ + #define TX_BUFFER "Hello from UART2!\r\n" + static void uart_send_demo(void) + { + rt_device_t uart_dev; + rt_size_t size; + /* 查找 UART2 设备 */ + uart_dev = rt_device_find("uart2"); + if (uart_dev == RT_NULL) + { + rt_kprintf("UART2 device not found!\n"); + return; + } + /* 打开 UART2 设备 */ + if (rt_device_open(uart_dev, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX) != RT_EOK) + { + rt_kprintf("Failed to open UART2 device!\n"); + return; + } + /* 发送数据 */ + size = rt_device_write(uart_dev, 0, TX_BUFFER, rt_strlen(TX_BUFFER)); + if (size == rt_strlen(TX_BUFFER)) + { + rt_kprintf("Data sent successfully!\n"); + } + else + { + rt_kprintf("Data sending failed!\n"); + } + /* 关闭 UART2 设备 */ + rt_device_close(uart_dev); + } + MSH_CMD_EXPORT(uart_send_demo, uart send); + ``` + +5. 接下来编译烧录,准备个USB转TTL模块,接入UART2引脚,参考官方提供的QuickStartGuide文件,以及开发板原理图文件,两份文件如下: + + QuickStartGuide: + [MCXA156QSG.pdf](https://oss-club.rt-thread.org/uploads/20250224/591f608a70d5a4dbf49817bccff6e098.pdf) + 开发板原理图: + [spf-90841_A4_a156.pdf](https://oss-club.rt-thread.org/uploads/20250224/a2d9be38d4d29cf715264a0baf2d3362.pdf) + + ![](figures/10_0.png) + +## 3. 功能测试 + +使用终端工具,示例使用的XSHELL,分别连接RT-Thread的MSH和USB转TTL模块,在MSH终端里输入uart_send_demo运行uart send示例,在UART_DEBUG页面里查看输出,如下所示: + +![](figures/10_1.png) + +功能测试成功! + +## 4. 总结 + +通过简单的串口通信 Demo,本示例展示了如何快速上手开发板,进行串口数据的发送和接收。无论是进行工业控制、物联网开发,还是其他嵌入式应用,NXP FRDM-MCXA156 和 RT-Thread 都为开发者提供了理想的开发平台。 + +## 5.原文链接 + +原文链接:https://club.rt-thread.org/ask/article/ab4e9d33f2423a7c.html + +# 十、恩智浦A156上的PWM实践(曹显嵩) + +## 1. 功能模块的硬件介绍 + +### 1.1 什么是pwm + +脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中 + +**主要参数:** + +* 频率 +* 占空比 + +### 1.2 频率 + +* 1秒种内信号从高电平到低电平再回到高电平的次数(一个周期),一秒钟pwm有多少个周期 +* 单位 Hz +* 表示方式:50Hz 100Hz +* 计算公式: + * T = 1/f +* 例子: + * 在50Hz下, 一个周期是20ms,一秒钟有50次pwm周期 + +### 1.3 占空比 + +* 一个脉冲周期内,高电平的时间与整个周期时间的比例 +* 单位 %(0%- 100%) + * 表示方式:20% + +![](figures/11_0.png) + +* 对部分参数进行解释 + + * 周期:一个脉冲信号的时间 + * 频率:1s内周期次数 + * 脉宽时间: 高电平时间 + * 占空比:脉宽时间占总周期的时间的比例 + * 于上图,脉宽时间占总周期时间的比例,就是占空比 + +* 例: + + * T=10ms ,脉宽时间为8ms, 低电平时间为2ms,求其占空比 + * 8/(8+2) = 80%;齐为为80%的占空比 + +### 1.4 pwm原理 + +* 引入面积等效原理: + * 等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量即指窄脉冲的面积。这里所说的效果基本相同,是指环节的输出响应波形基本相同(如图) + +![](figures/11_1.png) + +### 1.5 计数器对pwm输出的控制 + +PWM(Pulse Width Modulation , 脉冲宽度调制) 是一种对模拟信号电平进行数字编码的方法,通过不同频率的脉冲使用方波的占空比用来对一个具体模拟信号的电平进行编码,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替所需要波形的设备。 +![](figures/11_2.png) + +上图是一个简单的 PWM 原理示意图,假定定时器工作模式为向上计数,当计数值小于阈值时,则输出一种电平状态,比如高电平,当计数值大于阈值时则输出相反的电平状态,比如低电平。当计数值达到最大值是,计数器从0开始重新计数,又回到最初的电平状态。高电平持续时间(脉冲宽度)和周期时间的比值就是占空比,范围为0~100%。上图高电平的持续时间刚好是周期时间的一半,所以占空比为50%。 + +## 2. PWM模块使用示例 + +### 2.1 fsl层pwm测试 + +***本测试设置为1Khz频率,占空比每次循环递增,当>=100时,重新赋值占空比并递增*** + +[fsl pwm 测试视频](https://www.bilibili.com/video/BV1hp9tYgErT/?vd_source=d5ee3e266fe4d6633f3a89949e9f48bf) + +代码下载链接: + +> 项目百度网盘链接通过网盘分享的文件:frdm-mcxa156.zip +> 链接: https://pan.baidu.com/s/1zkcEqfNAly_hscGxh7iCVA?pwd=xwtt 提取码: xwtt +> —来自百度网盘超级会员v4的分享 + +#### 使用注意事项 + +##### 测试代码: + +```c +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#include "rtthread.h" +#include "board.h" +#include "fsl_pwm.h" +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* Definition for default PWM frequence in hz. */ +#ifndef APP_DEFAULT_PWM_FREQUENCY +#define APP_DEFAULT_PWM_FREQUENCY (1000UL) +#endif +#define BOARD_PWM_BASEADDR (FLEXPWM0) +#define PWM_SRC_CLK_FREQ (CLOCK_GetFreq(kCLOCK_BusClk)) +#define DEMO_PWM_CLOCK_DEVIDER (kPWM_Prescale_Divide_2) +#define DEMO_PWM_FAULT_LEVEL true +#define BOARD_LED_GPIO BOARD_LED_RED_GPIO +#define BOARD_LED_GPIO_PIN BOARD_LED_RED_GPIO_PIN +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/******************************************************************************* + * Variables + ******************************************************************************/ +/******************************************************************************* + * Code + ******************************************************************************/ +static void PWM_DRV_Init3PhPwm(void) +{ + uint16_t deadTimeVal; + pwm_signal_param_t pwmSignal[2]; + uint32_t pwmSourceClockInHz; + uint32_t pwmFrequencyInHz = APP_DEFAULT_PWM_FREQUENCY; + pwmSourceClockInHz = PWM_SRC_CLK_FREQ; + /* Set deadtime count, we set this to about 650ns */ + deadTimeVal = ((uint64_t)pwmSourceClockInHz * 650) / 1000000000; + pwmSignal[0].pwmChannel = kPWM_PwmA; + pwmSignal[0].level = kPWM_HighTrue; + pwmSignal[0].dutyCyclePercent = 50; /* 1 percent dutycycle */ + pwmSignal[0].deadtimeValue = deadTimeVal; + pwmSignal[0].faultState = kPWM_PwmFaultState0; + pwmSignal[0].pwmchannelenable = true; + pwmSignal[1].pwmChannel = kPWM_PwmB; + pwmSignal[1].level = kPWM_HighTrue; + /* Dutycycle field of PWM B does not matter as we are running in PWM A complementary mode */ + pwmSignal[1].dutyCyclePercent = 50; + pwmSignal[1].deadtimeValue = deadTimeVal; + pwmSignal[1].faultState = kPWM_PwmFaultState0; + pwmSignal[1].pwmchannelenable = true; + /*********** PWMA_SM0 - phase A, configuration, setup 2 channel as an example ************/ + PWM_SetupPwm(BOARD_PWM_BASEADDR, kPWM_Module_0, pwmSignal, 2, kPWM_SignedCenterAligned, pwmFrequencyInHz, + pwmSourceClockInHz); + /*********** PWMA_SM1 - phase B configuration, setup PWM A channel only ************/ +#ifdef DEMO_PWM_CLOCK_DEVIDER + PWM_SetupPwm(BOARD_PWM_BASEADDR, kPWM_Module_1, pwmSignal, 1, kPWM_SignedCenterAligned, pwmFrequencyInHz, + pwmSourceClockInHz / (1 << DEMO_PWM_CLOCK_DEVIDER)); +#else + PWM_SetupPwm(BOARD_PWM_BASEADDR, kPWM_Module_1, pwmSignal, 1, kPWM_SignedCenterAligned, pwmFrequencyInHz, + pwmSourceClockInHz); +#endif + /*********** PWMA_SM2 - phase C configuration, setup PWM A channel only ************/ +#ifdef DEMO_PWM_CLOCK_DEVIDER + PWM_SetupPwm(BOARD_PWM_BASEADDR, kPWM_Module_2, pwmSignal, 1, kPWM_SignedCenterAligned, pwmFrequencyInHz, + pwmSourceClockInHz / (1 << DEMO_PWM_CLOCK_DEVIDER)); +#else + PWM_SetupPwm(BOARD_PWM_BASEADDR, kPWM_Module_2, pwmSignal, 1, kPWM_SignedCenterAligned, pwmFrequencyInHz, + pwmSourceClockInHz); +#endif +} +/*! + * @brief Main function + */ +int pwm_demo(void) +{ + /* Structure of initialize PWM */ + pwm_config_t pwmConfig; + pwm_fault_param_t faultConfig; + uint32_t pwmVal = 4; + /* Board pin, clock, debug console init */ + rt_kprintf("FlexPWM driver example\n"); + /* + * pwmConfig.enableDebugMode = false; + * pwmConfig.enableWait = false; + * pwmConfig.reloadSelect = kPWM_LocalReload; + * pwmConfig.clockSource = kPWM_BusClock; + * pwmConfig.prescale = kPWM_Prescale_Divide_1; + * pwmConfig.initializationControl = kPWM_Initialize_LocalSync; + * pwmConfig.forceTrigger = kPWM_Force_Local; + * pwmConfig.reloadFrequency = kPWM_LoadEveryOportunity; + * pwmConfig.reloadLogic = kPWM_ReloadImmediate; + * pwmConfig.pairOperation = kPWM_Independent; + */ + PWM_GetDefaultConfig(&pwmConfig); +#ifdef DEMO_PWM_CLOCK_DEVIDER + pwmConfig.prescale = DEMO_PWM_CLOCK_DEVIDER; +#endif + /* Use full cycle reload */ + pwmConfig.reloadLogic = kPWM_ReloadPwmFullCycle; + /* PWM A & PWM B form a complementary PWM pair */ + pwmConfig.pairOperation = kPWM_ComplementaryPwmA; + pwmConfig.enableDebugMode = true; + /* Initialize submodule 0 */ + if (PWM_Init(BOARD_PWM_BASEADDR, kPWM_Module_0, &pwmConfig) == kStatus_Fail) + { + rt_kprintf("PWM initialization failed\n"); + return 1; + } + /* Initialize submodule 1, make it use same counter clock as submodule 0. */ + pwmConfig.clockSource = kPWM_Submodule0Clock; + pwmConfig.prescale = kPWM_Prescale_Divide_1; + pwmConfig.initializationControl = kPWM_Initialize_MasterSync; + if (PWM_Init(BOARD_PWM_BASEADDR, kPWM_Module_1, &pwmConfig) == kStatus_Fail) + { + rt_kprintf("PWM initialization failed\n"); + return 1; + } + /* Initialize submodule 2 the same way as submodule 1 */ + if (PWM_Init(BOARD_PWM_BASEADDR, kPWM_Module_2, &pwmConfig) == kStatus_Fail) + { + rt_kprintf("PWM initialization failed\n"); + return 1; + } + /* + * config->faultClearingMode = kPWM_Automatic; + * config->faultLevel = false; + * config->enableCombinationalPath = true; + * config->recoverMode = kPWM_NoRecovery; + */ + PWM_FaultDefaultConfig(&faultConfig); +#ifdef DEMO_PWM_FAULT_LEVEL + faultConfig.faultLevel = DEMO_PWM_FAULT_LEVEL; +#endif + /* Sets up the PWM fault protection */ + PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_0, &faultConfig); + PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_1, &faultConfig); + PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_2, &faultConfig); + PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_3, &faultConfig); + /* Set PWM fault disable mapping for submodule 0/1/2 */ + PWM_SetupFaultDisableMap(BOARD_PWM_BASEADDR, kPWM_Module_0, kPWM_PwmA, kPWM_faultchannel_0, + kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3); + PWM_SetupFaultDisableMap(BOARD_PWM_BASEADDR, kPWM_Module_1, kPWM_PwmA, kPWM_faultchannel_0, + kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3); + PWM_SetupFaultDisableMap(BOARD_PWM_BASEADDR, kPWM_Module_2, kPWM_PwmA, kPWM_faultchannel_0, + kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3); + /* + * Call the init function with demo configuration. + * Recommend to invoke API PWM_SetupPwm after PWM and fault configuration, because reference manual advises to + * set OUTEN register after other PWM configurations. But set OUTEN register before MCTRL register is okay. + */ + PWM_DRV_Init3PhPwm(); + /* Set the load okay bit for all submodules to load registers from their buffer */ + PWM_SetPwmLdok(BOARD_PWM_BASEADDR, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true); + /* Start the PWM generation from Submodules 0, 1 and 2 */ + PWM_StartTimer(BOARD_PWM_BASEADDR, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2); + while (1U) + { + /* Delay at least 100 PWM periods. */ + rt_thread_mdelay(500); + pwmVal = pwmVal + 4; + /* Reset the duty cycle percentage */ + if (pwmVal > 100) + { + pwmVal = 4; + } + /* Update duty cycles for all 3 PWM signals */ + PWM_UpdatePwmDutycycle(BOARD_PWM_BASEADDR, kPWM_Module_0, kPWM_PwmA, kPWM_SignedCenterAligned, pwmVal); + PWM_UpdatePwmDutycycle(BOARD_PWM_BASEADDR, kPWM_Module_1, kPWM_PwmA, kPWM_SignedCenterAligned, (pwmVal >> 1)); + PWM_UpdatePwmDutycycle(BOARD_PWM_BASEADDR, kPWM_Module_2, kPWM_PwmA, kPWM_SignedCenterAligned, (pwmVal >> 2)); + /* Set the load okay bit for all submodules to load registers from their buffer */ + PWM_SetPwmLdok(BOARD_PWM_BASEADDR, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true); + } +} +MSH_CMD_EXPORT(pwm_demo, pwm demo); +``` + +> **需要进行配置pin_mux,将p3_6引脚设置为FlexPWM0;不必在menuconfig里面使能pwm** + +* 于nxp的可视化配置中进行选用引脚 + + ![](figures/11_3.png) + +### 2.2 flexPwm与ctimer pwm + +#### rtthread pwm驱动框架层(flexPwm) + +> 采用软件包 [servo_g90](https://github.com/CXSforHPU/Servo_sg90/blob/master/readme.md) +> +> * 使用示波器进行测试时候发现程序的频率调节空间有限定。本想使用这次制作的servo_90软件包在50hz的频率下进行调整占空比来控制舵机,但是没能成功。也不算没有收获,在本次测评中贡献了一个软件包以及测试了此pwm在大于1kHz中有良好的表现。 + +##### rtthread pwm 驱动层 使用配置 + +> *于menuconfig里面对pwm进行使能* + +![](figures/11_4.png) + +##### 测试命令如下 + +``` +pwm probe pwm0 //使用pwm0 +pwm enable 0 //启动通道 +pwm set 0 周期 脉冲时间 // 注意,单位是ns +``` + +##### 外设性能指标 + +> 在此显示波形使用的示波器是老式的示波器 + +1. **频率设置50Hz** + + * 设置20ms周期,1.5ms脉冲时间; + + ![](figures/11_5.png) + + * 示波器反馈的波形 + + ![](figures/11_6.png) + +2. **频率设置 1Khz** + + * 设置1ms周期,0.5ms脉冲时间 + + ![](figures/11_7.png) + + * 示波器反馈的波形 + + ![](figures/11_8.png) + +3. **频率设置 10Khz** + + * 设置0.1ms周期,0.015ms脉冲时间 + + ![](figures/11_9.png) + + * 示波器反馈的波形 + + ![](figures/11_a.png) + +#### CTimer定时器 驱动 + +> *采用ctimer 进行控制pwm输出频率以及占空比* + +* 此测试在nxp的官方IDE中烧录测试 + + ![](figures/11_b.png) + +##### ctimer 输出pwm 使用配置 + +* 选取demo步骤如下 + + ![](figures/11_c.png) + + ![](figures/11_d.png) + + ![](figures/11_e.png) + +* 修改参数为想要的周期与占空比: + + ![](figures/11_f.png) + +##### 外设性能指标 + +* **设置50hz,50%占空比** + + ![](figures/11_g.png) + +* **设置1Khz,50%占空比** + + ![](figures/11_h.png) + +* **设置 10Khz,50%占空比** + + ![](figures/11_i.png) + +## 3. 原文链接 + +原文链接:https://club.rt-thread.org/ask/article/5023352276e77e61.html + +# 十一、恩智浦A156上的IIC(硬件)实践(点灯大师) + +## 1. 实现内容 + +使用硬件I2C驱动SSD1306模块,根据原理图选择P3_27(I2C3_SCL)、P3_28(I2C3_SDA)作为控制引脚,进行u8g2以及SSD1306驱动测试。 + +![](figures/12_0_0.png) + +![](figures/12_0.png) + +![](figures/12_1.png) + +## 2. 引脚配置 + +找到\RT-Thread\rt-thread\bsp\nxp\mcx\mcxa\frdm-mcxa156\board\MCUX_Config\board路径下的pin_mux.c,添加如下引脚配置代码,这里把BSP_USING_I2C3宏也加入,后面改一下Kconfig,就可以使用ENV工具自由配置了。 + +``` +#ifdef BSP_USING_I2C3 +/* LPI2C3 peripheral is released from reset */ + RESET_ReleasePeripheralReset(kLPI2C0_RST_SHIFT_RSTn); + const port_pin_config_t port3_28_pin51_config = {/* Internal pull-up resistor is enabled */ + .pullSelect = kPORT_PullUp, + /* Low internal pull resistor value is selected. */ + .pullValueSelect = kPORT_LowPullResistor, + /* Fast slew rate is configured */ + .slewRate = kPORT_FastSlewRate, + /* Passive input filter is disabled */ + .passiveFilterEnable = kPORT_PassiveFilterDisable, + /* Open drain output is disabled */ + .openDrainEnable = kPORT_OpenDrainDisable, + /* Low drive strength is configured */ + .driveStrength = kPORT_LowDriveStrength, + /* Normal drive strength is configured */ + .driveStrength1 = kPORT_NormalDriveStrength, + /* Pin is configured as LPI2C3_SDA */ + .mux = kPORT_MuxAlt2, + /* Digital input enabled */ + .inputBuffer = kPORT_InputBufferEnable, + /* Digital input is not inverted */ + .invertInput = kPORT_InputNormal, + /* Pin Control Register fields [15:0] are not locked */ + .lockRegister = kPORT_UnlockRegister}; + /* PORT3_28 (pin 51) is configured as LPI2C3_SCL */ + PORT_SetPinConfig(PORT3, 28U, &port3_28_pin51_config); + const port_pin_config_t port3_27_pin52_config = {/* Internal pull-up resistor is enabled */ + .pullSelect = kPORT_PullUp, + /* Low internal pull resistor value is selected. */ + .pullValueSelect = kPORT_LowPullResistor, + /* Fast slew rate is configured */ + .slewRate = kPORT_FastSlewRate, + /* Passive input filter is disabled */ + .passiveFilterEnable = kPORT_PassiveFilterDisable, + /* Open drain output is disabled */ + .openDrainEnable = kPORT_OpenDrainDisable, + /* Low drive strength is configured */ + .driveStrength = kPORT_LowDriveStrength, + /* Normal drive strength is configured */ + .driveStrength1 = kPORT_NormalDriveStrength, + /* Pin is configured as LPI2C3_SCL */ + .mux = kPORT_MuxAlt2, + /* Digital input enabled */ + .inputBuffer = kPORT_InputBufferEnable, + /* Digital input is not inverted */ + .invertInput = kPORT_InputNormal, + /* Pin Control Register fields [15:0] are not locked */ + .lockRegister = kPORT_UnlockRegister}; + /* PORT3_27 (pin 52) is configured as LPI2C3_SCL */ + PORT_SetPinConfig(PORT3, 27U, &port3_27_pin52_config); +#endif +``` + +同路径下的Kconfig增加I2C3的描述,如下图所示 + +![](figures/12_2.png) + +## 3. ENV配置 + +进入ENV后,输入menuconfig进入配置界面,首先在板级支持内容下,开启I2C3,如下图所示![](figures/12_3.png) + +然后在驱动框架下开启I2C设备 + +![](figures/12_4.png) + +启用U8G2驱动包以及其测试例程,如下图所示,这里选择I2C3作为驱动外设: + +![](figures/12_5.png) + +启用SSD1306驱动包以及其测试例程,如下图所示,这里同样选择I2C3作为驱动外设: + +![](figures/12_6.png) + +官方提供的drv_i2c驱动里只有一个I2C0的例子,简单补充下I2C3的内容,详细代码如下: + +``` +struct lpc_i2c_bus lpc_obj[] = +{ +#ifdef BSP_USING_I2C0 + { + .I2C = LPI2C0, + .baud = 100000U, + .clock_attach_id = kFRO12M_to_LPI2C0, + .clock_div_name = kCLOCK_DivLPI2C0, + .clock_src = kCLOCK_Fro12M, + .name = "i2c0", + }, +#endif +#ifdef BSP_USING_I2C3 + { + .I2C = LPI2C3, + .baud = 100000U, + .clock_attach_id = kFRO12M_to_LPI2C3, + .clock_div_name = kCLOCK_DivLPI2C3, + .clock_src = kCLOCK_Fro12M, + .name = "i2c3", + }, +#endif +}; +``` + +然后保存退出配置界面,使用pkgs —update指令获取驱动包,如下图所示 + +![](figures/12_7.png) + +最后使用scons —target=mdk5生成keil工程。 +打开工程,开始编译,会提示#include 不存在,详细的解决方法参照[RT-Thread-v4.1.1 ENV里使能SSD1306,需要包含_ansi.h头文件。找不到](https://club.rt-thread.org/ask/question/2da5e09a365aa04f.html)参照问题答复修改后即可编译通过。 +下载到开发板后开始测试。 + +## 4. 开始测试 + +连接到终端后,使用Table建可以看到u8g2以及SSD1306的测试代码内容,如下如所示 + +![](figures/12_8.png) + +使用list device指令可以看到I2C3已经注册成功 + +![](figures/12_9.png) + +首先测试u8g2的测试,在终端输入u8g2_ssd1306_12864_hw_i2c_example进行u8g2测试,可以看到屏幕上出现了RTTHREAD和😀 + +![](figures/12_a.png) + +![](figures/12_b.png) + +最后进行SSD1306的测试,在终端输入ssd1306_TestAll,即可开始一系列刷屏的测试。 + +![](figures/12_c.png) + +![](figures/12_d.png) + +![](figures/12_e.png) + +![](figures/12_f.png) + +![](figures/12_g.png) + +## 5. 原文链接 + +原文链接:https://club.rt-thread.org/ask/article/f01a956b678a7f99.html + +# 十二、恩智浦A156上的P3T1755DPJ(温度传感器驱动,需制作成软件包)实践(吴艺彬) + +## 1. 模块介绍 + +FRDM-MCXA156板载了P3T1755模块,P3T1755DP是精确的温度数字转换器,精度为±0.5°C,温度范围为–40°C到+125°C。它搭载了片上带隙温度传感器,采用模数转换技术,具有超温检测功能。温度寄存器始终存储12位二进制补码数据,温度分辨率为0.0625°C。P3T1755DP可配置为不同的工作模式:连续转换模式、单一转换模式或关闭模式。 + +该设备支持2线串行I3C(高达12.5MHz)和I²C(高达3.4MHz)作为通信接口。在I²C中,该设备最多支持4个目标地址和警报功能。在I3C中,该设备支持带内中断功能(IBI),使用同一总线报告警报中断。 + +由于RT-Thread目前还不支持I3C框架,所以只能暂时用I2C来读取。 + +## 2. 硬件连接 + +![](figures/13_0.png) + +由原理图可知,P3T1755所用到的引脚为P0_16(SDA)、P0_17(SCL)。由于当前RT-Thread 主仓中的FRDM-MCXA156都是最小的配置,所以我们要使能I2C和初始化IO口。 + +## 3. 配置过程 + +### 3.1 使能板载模块 + +![](figures/13_1.png) + +### 3.2 配置I2C引脚 + +添加在bsp\nxp\mcx\mcxa\frdm-mcxa156\board\MCUX_Config\board\pin_mux.c中的void BOARD_InitPins(void)函数中。 + +```c + /* LPI2C0 peripheral is released from reset */ + RESET_ReleasePeripheralReset(kLPI2C0_RST_SHIFT_RSTn); + const port_pin_config_t port0_16_pin83_config = {/* Internal pull-up resistor is enabled */ + .pullSelect = kPORT_PullUp, + /* Low internal pull resistor value is selected. */ + .pullValueSelect = kPORT_LowPullResistor, + /* Fast slew rate is configured */ + .slewRate = kPORT_FastSlewRate, + /* Passive input filter is disabled */ + .passiveFilterEnable = kPORT_PassiveFilterDisable, + /* Open drain output is disabled */ + .openDrainEnable = kPORT_OpenDrainDisable, + /* Low drive strength is configured */ + .driveStrength = kPORT_LowDriveStrength, + /* Normal drive strength is configured */ + .driveStrength1 = kPORT_NormalDriveStrength, + /* Pin is configured as LPI2C0_SDA */ + .mux = kPORT_MuxAlt2, + /* Digital input enabled */ + .inputBuffer = kPORT_InputBufferEnable, + /* Digital input is not inverted */ + .invertInput = kPORT_InputNormal, + /* Pin Control Register fields [15:0] are not locked */ + .lockRegister = kPORT_UnlockRegister}; + /* PORT0_16 (pin 83) is configured as LPI2C0_SDA */ + PORT_SetPinConfig(PORT0, 16U, &port0_16_pin83_config); + const port_pin_config_t port0_17_pin84_config = {/* Internal pull-up resistor is enabled */ + .pullSelect = kPORT_PullUp, + /* Low internal pull resistor value is selected. */ + .pullValueSelect = kPORT_LowPullResistor, + /* Fast slew rate is configured */ + .slewRate = kPORT_FastSlewRate, + /* Passive input filter is disabled */ + .passiveFilterEnable = kPORT_PassiveFilterDisable, + /* Open drain output is disabled */ + .openDrainEnable = kPORT_OpenDrainDisable, + /* Low drive strength is configured */ + .driveStrength = kPORT_LowDriveStrength, + /* Normal drive strength is configured */ + .driveStrength1 = kPORT_NormalDriveStrength, + /* Pin is configured as LPI2C0_SCL */ + .mux = kPORT_MuxAlt2, + /* Digital input enabled */ + .inputBuffer = kPORT_InputBufferEnable, + /* Digital input is not inverted */ + .invertInput = kPORT_InputNormal, + /* Pin Control Register fields [15:0] are not locked */ + .lockRegister = kPORT_UnlockRegister}; + /* PORT0_17 (pin 84) is configured as LPI2C0_SCL */ + PORT_SetPinConfig(PORT0, 17U, &port0_17_pin84_config); +``` + +## 4. 生成工程 + +``` +scons --target=mdk5 +``` + +## 5. 示例代码 + +* 不使用sensor框架 + + ```c + #include "P3T1755.h" + static void p3t1755_test(int argc, char *argv[]) + { + p3t1755_init(); + float temp = 0; + if (p3t1755_read_temp(&temp) == RT_EOK) + { + rt_kprintf("temp:%.2f\n", temp); + } + } + MSH_CMD_EXPORT(p3t1755_test, i2c p3t1755 sample); + ``` + +* 使用sensor 框架 + + * 使能sensor 框架 + + ![](figures/13_2.png) + + ```c + #include "nxp_p3t1755_sensor_v2.h" + static void p3t1755_sensor_test(void) + { + rt_device_t dev; + struct rt_sensor_data data; + struct rt_sensor_config config; + rt_hw_p3t1755_init("p3t1755",&config); + /* 查找传感器设备 */ + dev = rt_device_find("tm-p3t1755"); + /* 以只读及轮询模式打开传感器设备 */ + rt_device_open(dev, RT_DEVICE_FLAG_RDONLY); + if (rt_device_read(dev, 0, &data, 1) == 1) + { + rt_kprintf("temp: %.3f, timestamp:%5d\n", data.data.temp, data.timestamp); + } + rt_device_close(dev); + } + MSH_CMD_EXPORT(p3t1755_sensor_test, p3t1755 sensor test); + ``` + +## 6. 运行结果 + +![](figures/13_3.png) + +* 使用sensor框架 + +![](figures/13_4.png) + +## 7. 原文链接 + +原文链接:https://club.rt-thread.org/ask/article/0ec9f66680226b0f.html