diff --git a/rt-thread-version/rt-thread-standard/_sidebar.md b/rt-thread-version/rt-thread-standard/_sidebar.md index 91064a748580e6da712e6d78c572c8202517baa2..dcc3ce4ae8a73bff4315e2cbe946b6500cdd38d3 100644 --- a/rt-thread-version/rt-thread-standard/_sidebar.md +++ b/rt-thread-version/rt-thread-standard/_sidebar.md @@ -196,6 +196,7 @@ - [PSoC™6开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/ifx-psoc6/PSoC6开发实践指南.md) - NXP-MCX系列 - [恩智浦FRDM-MCXN947开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/NXP-MCX/恩智浦FRDM-MCX974实践指南.md) + - [恩智浦FRDM-MCXN236开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/恩智浦FRDM-MCXN236实践指南.md) - 官方开发板 - [星火一号](/rt-thread-version/rt-thread-standard/hw-board/spark-1/spark-1.md) - [ART-PI](/rt-thread-version/rt-thread-standard/hw-board/art-pi/art-pi.md) diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8ec9e5c746932790560e75e3b27746e41dc317 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight1.png new file mode 100644 index 0000000000000000000000000000000000000000..27aad57ff502b3af1ca7e32d39faddd4beec9fce Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight2.png new file mode 100644 index 0000000000000000000000000000000000000000..546789a959d9770102bed2816c268de3b5d762c9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight3.png new file mode 100644 index 0000000000000000000000000000000000000000..2cfc00200bd05d1be2fa7b61d678f0d49036ebdb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight4.png new file mode 100644 index 0000000000000000000000000000000000000000..f1bfc324204eb64d926dba4453afe987428bf1fe Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight5.png new file mode 100644 index 0000000000000000000000000000000000000000..6a12877d8f273e876024b0259f1e7322e38359b9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight6.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e7b941f1b0cbc87031833c4df941af903b6bc767 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight6.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight7.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight7.png new file mode 100644 index 0000000000000000000000000000000000000000..52221276cc3b789129972027fd71bf7de0b30cbe Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/eight7.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/five.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/five.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c7063e98ef410a689abdb326517af636c92aba Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/five.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/four.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/four.png new file mode 100644 index 0000000000000000000000000000000000000000..24140b407c52fd026fd65a2e44ada77729422462 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/four.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/four1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/four1.png new file mode 100644 index 0000000000000000000000000000000000000000..daad87855b1e54d83332478827e2d5dcbc62550a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/four1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/four2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/four2.png new file mode 100644 index 0000000000000000000000000000000000000000..45ec6b9e6d16b705419b59631c66cb5e21a56724 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/four2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine.png new file mode 100644 index 0000000000000000000000000000000000000000..50648b9baeb177c2ba1482b9393b92c7610dc6b1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine1.png new file mode 100644 index 0000000000000000000000000000000000000000..e7be3767e909588b558bb0c390538710bef40e46 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine10.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cca267d746b96412c68df6d4ac67d4e149007e21 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine10.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine11.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine11.png new file mode 100644 index 0000000000000000000000000000000000000000..3a90b630ace2641a684b7ee85c4092ae41590e04 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine11.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine2.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d694a031b28944fc1254d67e9395524e0d9069 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine3.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f7ce111f138f70da1f3a9561598f6d658d304d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine4.png new file mode 100644 index 0000000000000000000000000000000000000000..0048005786d5c81e12ce817936374c1d11074699 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine5.png new file mode 100644 index 0000000000000000000000000000000000000000..d6e77910efbd4a26dc0f2679679f7a26d46dd699 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine6.png new file mode 100644 index 0000000000000000000000000000000000000000..d6e77910efbd4a26dc0f2679679f7a26d46dd699 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine7.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine7.png new file mode 100644 index 0000000000000000000000000000000000000000..3d0e9dacd2ead7909322cf58e52109ab7118e53b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine7.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine8.png new file mode 100644 index 0000000000000000000000000000000000000000..65a044f31ebf860ba8ecfbdff0b85bdf18aab858 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine9.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine9.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b4d271e5fda86778cdf2d7a95d7f3899740eb5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/nine9.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one.png new file mode 100644 index 0000000000000000000000000000000000000000..8964fae62743a6604e339ea04872230471004030 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one1.png new file mode 100644 index 0000000000000000000000000000000000000000..c4bdae8b6eeee4654b7ac6081d6bb12373e15faa Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one2.png new file mode 100644 index 0000000000000000000000000000000000000000..8bba3222170c181bd2f7dbfa1bc050f5595bda13 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one3.png new file mode 100644 index 0000000000000000000000000000000000000000..88009ee93258b9421daba08790472091683dcc3c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one4.png new file mode 100644 index 0000000000000000000000000000000000000000..79474dd34a1ee39498b5a140495e7f9205dcf5ae Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one5.png new file mode 100644 index 0000000000000000000000000000000000000000..b03991e70727b3621fc55699faeceb6bae686fac Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one6.png new file mode 100644 index 0000000000000000000000000000000000000000..325e63ec703c801995f4c4c4b3d621978981f0b2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one7.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one7.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4174f78d49cfc26af18ef6cbaaa470339ee171 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one7.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one8.png new file mode 100644 index 0000000000000000000000000000000000000000..799a6170070e579fcfcf89e6350d3ac170a84e36 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one9.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one9.png new file mode 100644 index 0000000000000000000000000000000000000000..7d229a613f60636f40b7657d12a443fc075e68d8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/one9.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven.png new file mode 100644 index 0000000000000000000000000000000000000000..1c16f479f4305e8f8274d85a2f2404d8cf866a2f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven1.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb6bfc723fd0f3b02e0ddbdc9a69333e7b8182d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven2.png new file mode 100644 index 0000000000000000000000000000000000000000..8763fcbaacb638481cbb1ef579929a631f59353c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven3.png new file mode 100644 index 0000000000000000000000000000000000000000..f5bd97839726847c69fc8225d46605a5cb18a379 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven4.png new file mode 100644 index 0000000000000000000000000000000000000000..a81f292810c75db176bb7a9ee09ff59447717e63 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven5.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3cd43a5cf6d10c4079548abef7d6a3fe03031f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven6.png new file mode 100644 index 0000000000000000000000000000000000000000..4f868dca6ffc7784f9be129403de8d49757b4926 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven7.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven7.png new file mode 100644 index 0000000000000000000000000000000000000000..064591f1dc43b8a53a581d2719e54999edf34fb2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven7.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven8.png new file mode 100644 index 0000000000000000000000000000000000000000..8e23b70f33709cfde7f72ab4ee368743e95774a6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/seven8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six.png new file mode 100644 index 0000000000000000000000000000000000000000..cdec5dd7f5e6ee2e2812c9e46f3e571ecf8b2b66 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six1.png new file mode 100644 index 0000000000000000000000000000000000000000..58601683e9fdb77325f0ba292a1d93c08392c101 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six2.png new file mode 100644 index 0000000000000000000000000000000000000000..da457b3d8ed6ae0e3d876252b9cf947a0bda01bb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six3.png new file mode 100644 index 0000000000000000000000000000000000000000..b565ef1d12fe622ad8af34a74fb10876472ada21 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six4.png new file mode 100644 index 0000000000000000000000000000000000000000..0811cd45b8468c0995702c091d96439cc649ac1a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/six4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/ten.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/ten.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19185c440e79d8deaee2177b93fb06be708f9a9e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/ten.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/ten1.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/ten1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14b65c1515dd41525304b033c7cc7a1a2145e8db Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/ten1.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/three.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/three.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e96c0776f7d00e8367ae2b9efa388e1be2b24d6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/three.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/three1.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/three1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5b7626852cabcf78a318e4f16851e06358e699da Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/three1.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/zero.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/zero.png new file mode 100644 index 0000000000000000000000000000000000000000..72117bde6fb4eb100cb4544a055f41d6dd5be8a9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/Book_Picture/zero.png differ diff --git "a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/\346\201\251\346\231\272\346\265\246FRDM-MCXN236\345\256\236\350\267\265\346\214\207\345\215\227.md" "b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/\346\201\251\346\231\272\346\265\246FRDM-MCXN236\345\256\236\350\267\265\346\214\207\345\215\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..d13774bfb4daed15364a54ee98e097bd7dc92cb2 --- /dev/null +++ "b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-N236/\346\201\251\346\231\272\346\265\246FRDM-MCXN236\345\256\236\350\267\265\346\214\207\345\215\227.md" @@ -0,0 +1,1263 @@ +# **恩智浦MCX N236开发实践指南** + +| **目录** | 作者 | +| -------------------------------------------- | ---------------------- | +| **零、实践指南说明** | **RT-Thread & 恩智浦** | +| **一、恩智浦MCX N236上的UART实践** | 盛建忠 | +| **二、恩智浦MCX N236上的GPIO实践** | Jisheng | +| **三、恩智浦MCX N236上的RTC实践** | Jisheng | +| **四、恩智浦MCX N236上的ADC实践** | andeyqi | +| **五、恩智浦MCX N236上的Flash实践** | andeyqi | +| **六、恩智浦MCX N236上的SPI实践** | 盛建忠 | +| **七、恩智浦MCX N236上的PWM实践** | 盛建忠 | +| **八、恩智浦MCX N236上的 IIC(软件) 实践** | andeyqi | +| **九、恩智浦MCX N236上的 IIC(硬件) 实践** | xinshuwei | +| **十、恩智浦MCX N236上的USB-D实践** | Jisheng | +| **FAQ** | **RT-Thread & 恩智浦** | + +# 《恩智浦MCX N236开发实践指南》 **零、实践指南说明** +## 硬件介绍 +1. 开发板描述: +NXP Semiconductors FRDM-MCXN236开发板提供基于MCX N236 MCU的低成本设计。NXP FRDM-MCXN236板集成了一个32位Arm® Cortex®-M33微控制器,用于工业和消费者物联网应用。 +NXP FRDM-MCXN236板将一个MCXN236与一个由Winbond提供的64Mbit外部串行闪存相结合。该板设有高速USB电路、一个 FXLS8974CFR3 加速度计传感器、 TJA1057GTK/3Z CAN PHY、 DA7212 音频编解码器(DNP)、DMIC传感器 SPK0641HT4H-1 、RGB LED、按钮和MCU-Link调试探头电路。该板与Arduino扩展板模块和微型总线排针兼容。此外,该板还支持与相机模块和恩智浦低成本LCD模块(PAR-LCD-S035)兼容的排针。 +2. 开发板外观如下图所示: +![alt text](Book_Picture/zero.png) +3. 该开发板常用 **板载资源** 如下: +* 微控制器 + * MCXN236 ARM Cortex-M33内核at150MHz + * 高达1MB双组闪存,带可选的完整ECC RAM + * SmartDMA加速器 + * QSPI闪存W25Q64(64Mbit) +* 连接性 + * HS USB-Type C连接器 + * SPI/I2C/UART连接器(mikroBUS、Pmod™ DNP) + * Wi-Fi®连接器(mikroBUS、Pmod DNP) + * TJA1057 CAN FD收发器 + * 音频辅助线路输入DNP + * 耳机输出插孔DNP +* 调试 + * 板载MCU链路调试器,带CMSIS-DAP + * JTAG/SWD连接器 +* 传感器 + * FXLS8974CFR3 3轴加速计 + * 可见光传感器 + * 数字麦克风SPK0641HT4H-1 +* 扩展选项 + * Arduino®排针 + * FRDM接头 + * FlexIO/LCD接头 + * SmartDMA/相机排针 + * Pmod DNP + * mikroBUS™ + * RGB用户LED、复位、ISP、唤醒按钮 + +开发板更多详细信息请参考 [**NXP官方网站**](https://www.nxp.com/part/FRDM-MCXN236) + +**我有疑问:**[**RT-Thread 官方论坛**](https://club.rt-thread.org/) + +# **一、恩智浦MCX N236 上的UART实践** (盛建忠) + ## 1.实验目的 + rt-thread中配置启动uart5 + ## 2. 步骤说明 + ### 2.1 查看原理 +通过调试,我们已经能够在debug模拟串口中打印信息。此次我们使用的N236型号单片机是在N947配置文件的基础上修改而来的。由于N236和N947均属于MCX N系列单片机,许多基本外设是相同的。因此,调试串口的引脚配置和外设设置基本上是一致的。以下是FRDM-MCXN236开发板中调试串口的具体信息: +TYPE-C接口连接到MCU-link(LPC55S69)。 +![alt text](Book_Picture/one.png) +然后连接到MCU_LINK_RX/TX引脚: +![alt text](Book_Picture/one1.png) +最后连接到N236的P1_9/P1_8,与N947是一致的: +![alt text](Book_Picture/one2.png) +### 2.2 env相关配置 +不过我们这次是使用一个全新的串口实现收发操作。 +env工具开启串口: +同样的操作,来到对应的bsp文件夹下右键打开env工具: +![alt text](Book_Picture/one3.png) +输入menuconfig 命令,回车: +![alt text](Book_Picture/one4.png) +进入配置界面Hardware Drivers Config—>On-chip Peripheral: +![alt text](Book_Picture/one5.png) +可以看到我们已经打开了串口2,串口4,串口5: +![alt text](Book_Picture/one6.png) +主要是我们在配置文件中已经定义了这几个串口,并且对应的N947工程都开启了,注意打开UART5: +![alt text](Book_Picture/one7.png) +通过对应的引脚查询,基本的引脚对应是正确的: +![alt text](Book_Picture/one8.png) +串口的驱动文件已经在drv_usart.c中,我们只需要写应用层代码就可以了: +```c +#define SAMPLE_UART5_NAME "uart5" /* 串口设备名称 */ +static rt_device_t serial_uart5; /* 串口设备句柄 */ +static struct rt_semaphore rx_sem; /* 用于接收消息的信号量 */ +struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初始化配置参数 */ +/* 接收数据回调函数 */ +static rt_err_t uart_input(rt_device_t dev,rt_size_t size)//接收数据回调(消息队列处理)函数 +{ + rt_sem_release(&rx_sem);//串口接收数据产生中断,调用该函数发送接收信号量 + return RT_EOK; +} +/* 串口处理线程函数 */ +static void serial_thread_entry(void* parameter) +{ + char ch; + /* 接收到信号量后处理串口数据 */ + while(1) + { + while(rt_device_read(serial_uart5,-1,&ch,1)!=1)//阻塞等待接收信号量,等到信号量后读取1个字节的数据 + rt_sem_take(&rx_sem,RT_WAITING_FOREVER); + rt_device_write(serial_uart5,0,&ch,1);//读取到的数据通过串口错位输出 + } +} +/* 串口主函数调用 */ +static int uart_int_sample(void) +{ + rt_err_t ret=RT_EOK; + char uart_name[RT_NAME_MAX]; + char str[] = "RT-Thread MCX N236 Uart5 Start!\n"; + rt_strncpy(uart_name,SAMPLE_UART5_NAME,RT_NAME_MAX); + serial_uart5=rt_device_find(uart_name);//查找串口设备 + if(!serial_uart5) + { + rt_kprintf("find %s failed!\n",uart_name); + return RT_ERROR; + } + rt_kprintf("start mq\n"); + rt_device_open(serial_uart5,RT_DEVICE_FLAG_INT_RX);//以轮询方式打开串口 + rt_sem_init(&rx_sem,"rx_sem",0,RT_IPC_FLAG_FIFO);//初始化信号量 + rt_device_set_rx_indicate(serial_uart5,uart_input);//设置接收回调(消息队列处理)函数 + rt_device_write(serial_uart5,0,str,(sizeof(str)-1));//发送字符串 + rt_thread_t thread=rt_thread_create("serial",serial_thread_entry,RT_NULL,1024,25,10);//创建串口处理线程 + if(thread!=RT_NULL) + { + rt_kprintf("start thread uart5\n"); + rt_thread_startup(thread); + } + else + ret=RT_ERROR; + return ret;//返回结果 +} +``` +## 3.实验结果 +效果如下,配置完成后通过Uart5发送字符串,并且通过串口5收到的数据原路返还: +![alt text](Book_Picture/one9.png) + +## 4.原文连接 +原文连接:https://club.rt-thread.org/ask/article/970c3647ea1d93c7.html +# **二、恩智浦MCX N236上的GPIO实践** (Jisheng) + +## 1. GPIO硬件概览 +MCXN236系列支持多达106根GPIO引脚(实际使用时板上不会有这么多引脚能够用作GPIO)。基本上,低速设备如SPI、UART、I2C、PWM、I2S的引脚都可以与GPIO复用。每根引脚的具体功能由PinMux决定,详细信息可参考NXP官方文档的Pinout章节,这里不再赘述。 +PinMux的命名具有规律性,文档中引脚的命名格式通常为Px_y,其中x可以是0,1,2,3,4,5,y则在0到23之间。当然,并不是每个组合都是有效的,例如P5_9这样的引脚并不存在,具体情况请参阅NXP的官方文档。将PinMux设置为复用功能中的第一个选项ALT0,即可将引脚配置为GPIO功能。 +## 2.1 GPIO输出实践 +根据原理图,有三个LED分别是红绿蓝色可由三根GPIO控制。其中红色色LED接P4_18,所以我们代码中> +有这样的定义 +```c +#define LEDB_PIN ((4*32)+18) +``` +为操作P4_18,我们还需要设置好pin的模式为GPIO输出: +```c +rt_pin_mode(LEDB_PIN, PIN_MODE_OUTPUT); +``` +点灯循环 +```c + while (1) + { + rt_pin_write(LEDB_PIN, PIN_HIGH); /* Set GPIO output 1 */ + rt_thread_mdelay(500); /* Delay 500mS */ + rt_pin_write(LEDB_PIN, PIN_LOW); /* Set GPIO output 0 */ + rt_thread_mdelay(500); /* Delay 500mS */ + } +``` +## 2.2 GPIO输入实践 +根据原理图,板载三个按钮分别是reset、isp、wakeup,其中reset和isp看起来有固定用途,软件可以 +玩玩wakeup按钮。原理图显示wakeup按钮接P0_20引脚,所以代码定义 +```c +#define BUTTON_PIN ((0*32)+20) +``` +为操作P0_20,我们需要设置pin的模式为输入,挂上且开启中断: +```c + rt_pin_mode(BUTTON_PIN, PIN_MODE_INPUT_PULLUP); + rt_pin_attach_irq(BUTTON_PIN, PIN_IRQ_MODE_FALLING, sw_pin_cb, RT_NULL); + rt_pin_irq_enable(BUTTON_PIN, 1); +``` +按一下按钮,回调函数就会被调用: +```c +static void sw_pin_cb(void *args) +{ + rt_kprintf("sw pressed\r\n"); +} + +``` +## 3.原文连接 +原文连接:https://club.rt-thread.org/ask/article/87fde2331072f7af.html + + +# **三、恩智浦MCX N236上的RTC实践** (Jisheng) +## 1.RTC硬件概览 +MCXN236系列集成了一个RTC且仅有一个,支持如下feature: +* 低功耗设计, 时间和日期计数器是所谓的interleaved,防止同时切换引起问题。 +* 年、月、星期几、天、小时、分钟和秒计数器都是独立的 +* 日历支持—独立的年、月和星期几计数器 +* 自动调整月份和闰年 +* 支持alarm中断和周期性中断 +* 硬件补偿的1 Hz时钟能应对针对温度变化或晶体特性导致的振荡器时钟频率变化 +* 16位CPU寄存器编程接口,可防止失控代码 +* 可选择输出缓冲的32.768kHZ或16.384 kHz时钟或补偿过后的1 Hz时钟。 +## 2. RT-Thread RTC实践 +RTC比较简单,经过对比MCXN236和MCXN947,它们RTC是兼容的,甚至寄存器基地址都一样,故而当前从MCXN947拷贝过来的bsp直接可以用。再结合RT-Thread现成的测试程序:components/drivers/rtc/rtc.c,基本上是配置编译烧录测试的过程,不用写什么代码,下面简单展示下 +## 2.1 menuconfig中选中RTC +```scon +scons --menuconfig +``` +```scon +Hardware Drivers Config ---> + On-chip Peripheral Drivers ---> + [] Enable RTC //这里选中它 +``` +如截图所示 +![alt text](Book_Picture/three.jpg) +## 3.实验结果 +编译烧录后,在msh中有一个date命令,无任何参数就是打印当前日期时间,加日期时间参数就是重新设置rtc。在FRDM-MCXN236开发板上执行几个测试date命令如截图所示,可以看到板子上电后RTC默认时间是Fri Jan 1 08:00:25 2112,用date命令设置后,每隔数秒再执行date命令可看到秒数在正常变化 +![alt text](Book_Picture/three1.jpg) +## 4.原文连接 +原文连接:https://club.rt-thread.org/ask/article/31759f26f7a04159.html + +# **四、恩智浦MCX N236上的ADC实践** (andeyqi) +## 1. 简介 +FRDM-MCXN236 的开发板,Rt-thread 官方的BSP 目录下还没有适配,我们可以在FRDM-MCXN947 的BSP 基础上更新SDK及简单的修改配置即可运行最小系统,最小系统的适配过程可以参考官方的bsp适配说明文档。 +## 2.ADC 验证 +## 2.1 ADC 验证硬件连接 +ADC测试使用P4_23(U12)引脚,通过ADC0的channel2进行验证。默认情况下,该引脚配置为浮空状态。我们可以将该引脚分别连接至开发板的3.3V和GND,以读取ADC值,从而验证ADC转换的结果是否正确。 +![alt text](Book_Picture/four.png) +该引脚对应于开发板的J8 PIN12引脚。可以通过导线将其分别连接至GND和P3V3,以验证ADC功能是否正常。 +![alt text](Book_Picture/four1.png) +## 2.2 ADC 驱动配置 +ADC硬件驱动可以使用MCXN947的驱动文件。我们只需在env环境中的menuconfig配置中启用ADC0驱动即可。 +![alt text](Book_Picture/four2.png) +在ADC的配置菜单下,还可以配置相应的通道(channel)。不过,这一配置项是否配置并不影响程序的运行,因为代码中未使用该配置项。 +更新配置后,在env环境下使用scons --target=iar生成测试的IAR工程。 +```env +(.venv) Administrator@7-2-1-0556-0 E:\rt-thread_github_andeyqi\bsp\nxp\mcx\mcxn\frdm-mcxn236 +# scons --target=iar +scons: Reading SConscript files ... +IAR Version: 0.0 +IAR project has generated successfully! +``` +## 2.3 ADC 驱动验证 +配置好工程后,就可以使用adc 组件的adc 测试命令来使用adc 设备驱动来验证ADC功能。 +将程序下载到板卡输入list device 发现adc0 设备已经注册到系统里,我们接下来可以使用adc 命令来操作adc0设备了。 +```msh +msh >list device +device type ref count +-------- -------------------- ---------- +pin Pin Device 0 +adc0 ADC Device 0 +uart5 Character Device 0 +uart4 Character Device 2 +uart2 Character Device 0 +``` +adc 命令的使用说明如下: +```msh +msh >adc +Usage: +adc probe - probe adc by name +adc read - read adc value on the channel +adc disable - disable adc channel +adc enable - enable adc channel +adc voltage - read voltage on the channel +``` +使用 adc probe adc0 来枚举操作adc0设备,运行成功如下 +```msh +msh >adc probe adc0 +probe adc0 success +msh > +``` +使用adc enable 2 使能adc0 channel2运行成功如下 +```msh +msh >adc enable 2 +adc0 channel 2 enables success +msh > +``` +使用adc read 2 读取浮空状态下adc 值 +```msh +msh >adc read 2 +adc0 channel 2 read value is 0x000001E1 +msh > +``` +将硬件连接至GND 读取 adc 结果 +```msh +msh >adc read 2 +adc0 channel 2 read value is 0x00000002 +``` +将硬件连接至P3.3V 读取 adc 结果 +```msh +msh >adc read 2 +adc0 channel 2 read value is 0x0000FFFB +``` +从上述的测试结果可知道,ADC 的功能是ok的符合预期的设想,连接至GND 读取的结果为0,连接至3.3V 读取的结果为0xffff. +## 3.原文连接 +原文连接:https://club.rt-thread.org/ask/article/b15d40745afaa9b8.html + +# **五、恩智浦MCX N236上的Flash实践** (andeyqi) +## 1.使用内部flash适配MTD NOR 设备驱动 +RT-thread 将常用的存储设备抽象成MTD(Memory Technology Device)设备驱动,MCXN236 的片内有1M的NOR flash,大部分都是空闲未使用状态,本次试验将使用后512K进行验证将这部分flash 通过RT-thread 的MTD nor 设备进行管理。 +## 2.添加flash驱动文件 +默认的link 文件是将所有的flash 空间划分给用户使用的,我们更新link 文件保留后512KB的空间用于MTD设备驱动管理,最终交给文件系统管理,按照如下修改方式释放后512KB的空间不使用。 +```c ++++ b/bsp/nxp/mcx/mcxn/frdm-mcxn236/board/linker_scripts/MCXN236_flash.icf +@@ -41,7 +41,7 @@ define symbol m_interrupts_start = 0x00000000; + define symbol m_interrupts_end = 0x000003FF; + define symbol m_text_start = 0x00000400; +-define symbol m_text_end = 0x000FFFFF; ++define symbol m_text_end = 0x0007FFFF; + define symbol m_data_start = 0x20000000; + define symbol m_data_end = 0x20037FFF; +diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.ewp b/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.ewp +``` +MTD NOR 设备通过结构体struct rt_mtd_nor_device 进行管理,包含了设备基类结构体,Flash 块大小,块起始地址,块结束地址,以及NOR 设备操作方法,定义如下: +```c +struct rt_mtd_nor_device +{ + struct rt_device parent; + rt_uint32_t block_size; /* The Block size in the flash */ + rt_uint32_t block_start; /* The start of available block*/ + rt_uint32_t block_end; /* The end of available block */ + /* operations interface */ + const struct rt_mtd_nor_driver_ops* ops; +}; +struct rt_mtd_nor_driver_ops +{ + rt_err_t (*read_id) (struct rt_mtd_nor_device* device); + rt_ssize_t (*read) (struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint8_t* data, rt_size_t length); + rt_ssize_t (*write) (struct rt_mtd_nor_device* device, rt_off_t offset, const rt_uint8_t* data, rt_size_t length); + rt_err_t (*erase_block)(struct rt_mtd_nor_device* device, rt_off_t offset, rt_size_t length); +}; +``` +以上配置信息主要包括nor flash 的每个block 的大小及起始块和结束块已经nor flash 分读id,读/写及块擦除的ops 信息,rt-thread 系统内已经集成了nor flash 的驱动框架,我们只要填充好上述结构体注册到系统内部即完成了rt-thread 的nor flash驱动适配。 + +我们要实现内部flash 的读写擦除接口,需要使用nxp的flash 驱动文件fsl_flash.c,该文件现在的bsp是美有集成到工程内部的,我们需要修改/bsp/nxp/mcx/mcxn/Libraries/MCXN947/SConscript 脚本文件添加驱动文件即对应的文件include路径,对应修改如下: +```c +index e9bab825e0..1fc44958cd 100644 +--- a/bsp/nxp/mcx/mcxn/Libraries/MCXN236/SConscript ++++ b/bsp/nxp/mcx/mcxn/Libraries/MCXN236/SConscript +@@ -2,7 +2,7 @@ Import('rtconfig') + from building import * + cwd = GetCurrentDir() +-path = [cwd + '/../CMSIS/Core/Include', cwd + '/MCXN236', cwd + '/MCXN236/drivers'] ++path = [cwd + '/../CMSIS/Core/Include', cwd + '/MCXN236', cwd + '/MCXN236/drivers',cwd + '/MCXN236/drivers/romapi/flash/'] + src = Split(''' + MCXN236/system_MCXN236.c + ''') +@@ -55,6 +55,7 @@ src += ['MCXN236/drivers/fsl_mrt.c'] + src += ['MCXN236/drivers/fsl_reset.c'] + src += ['MCXN236/drivers/fsl_spc.c'] + src += ['MCXN236/drivers/fsl_vref.c'] ++src += ['MCXN236/drivers/romapi/flash/src/fsl_flash.c'] + group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path) +``` +更新配置脚本文件后,env下使用scons —target=iar命令更新IAR工程,重新生成的IAR工程里已经包含了flash 驱动文件了。 +## 3.适配MTD设备驱动 +添加完依赖的驱动文件后,我们基于sdk的flash驱动文件适配MTD NOR 设备驱动需要底层适配的接口及参数配置。 + +使用fsl_flash.c 驱动库适配mtd nor flash read函数: +```c +rt_ssize_t mflash_read(struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint8_t* data, rt_size_t length) +{ + uint32_t dest; + struct mflash_mtd * p_mflash_mtd = (struct mflash_mtd *)device; + dest = p_mflash_mtd->mflash_start + offset; + if((dest + length) > (device->block_end*device->block_size)) + return 0; + for(uint32_t i=0; i < length; i++) + { + data[i] = *((__IO rt_uint8_t*)dest); + dest++; + } + return length; +} +``` +使用fsl_flash.c 驱动库适配mtd nor flash write函数: +```c +static flash_config_t g_flash_instance = {0}; +static uint32_t g_pflashBlockBase = 0; +static uint32_t g_pflashTotalSize = 0; +static uint32_t g_pflashSectorSize = 0; +static uint32_t g_pflashPageSize = 0; +struct mflash_mtd +{ + struct rt_mtd_nor_device mtd_device; + struct rt_mutex lock; + uint32_t mflash_start; + uint8_t page_size; + void * user_data; +}; +rt_ssize_t mlash_write(struct rt_mtd_nor_device* device, rt_off_t offset, const rt_uint8_t* data, rt_size_t length) +{ + status_t ret; + uint32_t dest; + struct mflash_mtd * p_mflash_mtd = (struct mflash_mtd *)device; + dest = p_mflash_mtd->mflash_start + offset; + if((dest + length) > (device->block_end*device->block_size)) + return 0; + for(uint32_t i = 0;i < length; i += 128) + { + ret = FLASH_Program(&g_flash_instance, dest, (uint8_t *)data, 128); + if(ret != kStatus_Success) + break; + } + return ret == kStatus_Success ? length : 0; +} +``` +使用fsl_flash.c 驱动库适配mtd nor flash erase函数: +```c +rt_err_t mflash_erase_block(struct rt_mtd_nor_device* device, rt_off_t offset, rt_size_t length) +{ + status_t ret; + uint32_t addr; + struct mflash_mtd * p_mflash_mtd = (struct mflash_mtd *)device; + addr = p_mflash_mtd->mflash_start + offset; + ret = FLASH_Erase(&g_flash_instance, addr, FSL_FEATURE_SYSCON_FLASH_SECTOR_SIZE_BYTES, kFLASH_ApiEraseKey); + return ret == kStatus_Success ? RT_EOK : -1; +} +``` +添加接口在driver 初始化阶段调用flash 初始化处理,配置flashblock信息,向系统注册mtd nor flash驱动 +```c +int rt_hw_mflash_init(void) +{ + static struct mflash_mtd mflash; + mflash.mtd_device.ops = &mflash_ops; + mflash.mtd_device.block_size = FSL_FEATURE_SYSCON_FLASH_SECTOR_SIZE_BYTES; + mflash.mtd_device.block_start = 64; + mflash.mtd_device.block_end = 127; + mflash.mflash_start = 64*FSL_FEATURE_SYSCON_FLASH_SECTOR_SIZE_BYTES; + mflash.page_size = FSL_FEATURE_SYSCON_FLASH_PAGE_SIZE_BYTES; + status_t result; + result = FLASH_Init(&g_flash_instance); + if (result != kStatus_Success) + return result; + result = FLASH_GetProperty(&g_flash_instance, kFLASH_PropertyPflashBlockBaseAddr, &g_pflashBlockBase); + if (result != kStatus_Success) + return result; + result = FLASH_GetProperty(&g_flash_instance, kFLASH_PropertyPflashSectorSize, &g_pflashSectorSize); + if (result != kStatus_Success) + return result; + result = FLASH_GetProperty(&g_flash_instance, kFLASH_PropertyPflashTotalSize, &g_pflashTotalSize); + if (result != kStatus_Success) + return result; + result = FLASH_GetProperty(&g_flash_instance, kFLASH_PropertyPflashPageSize, &g_pflashPageSize); + rt_mtd_nor_register_device("mflash",&mflash.mtd_device); + return RT_EOK; +} +INIT_DEVICE_EXPORT(rt_hw_mflash_init); +``` +flash 驱动依赖了mtd nor 驱动框架,在kconfig 文件内追加配置项目将mtd nor 驱动框架加入工程编译。 +```c +--- a/bsp/nxp/mcx/mcxn/frdm-mcxn236/board/Kconfig ++++ b/bsp/nxp/mcx/mcxn/frdm-mcxn236/board/Kconfig +@@ -19,6 +19,11 @@ menu "On-chip Peripheral Drivers" + select RT_USING_PIN + default y ++ config BSP_USING_MFLASH ++ select RT_USING_MTD_NOR ++ bool "Using mcxn236 mflash driver" ++ default n ++ + menuconfig BSP_USING_UART + bool "Enable UART" + default y +``` +然后在env 环境下使能BSP_USING_MFLASH 配置,并更新工程,此时mtd nor设备驱动就被加载到工程内部了。 +![alt text](Book_Picture/five.png) +烧写后输入list device 命令可以看到MTD 驱动已经被注册到系统内部了。 +```msh +msh >list device +device type ref count +-------- -------------------- ---------- +mflash MTD Device 0 +pin Pin Device 0 +uart5 Character Device 0 +uart4 Character Device 2 +uart2 Character Device 0 +``` +我们继续添加mflash 测试代码验证mtd 驱动接口,open 用于打开设备获取driver handler,write/read 分别用于读写flash 验证。 +```c +static void mflash(int argc,char *argv[]) +{ + static rt_device_t mtd = RT_NULL; + if(!strcmp(argv[1], "open")) + { + mtd = rt_device_find("mflash"); + if(!mtd) + rt_kprintf("rt find device failed.\n"); + else + rt_kprintf("rt find device ok.\n"); + } + else if(!strcmp(argv[1], "erase")) + { + rt_mtd_nor_erase_block((struct rt_mtd_nor_device*)mtd,0x00,8192); + } + else if(!strcmp(argv[1], "write")) + { + char * writetest = " hello world "; + rt_mtd_nor_write((struct rt_mtd_nor_device*)mtd,0,writetest,16); + } + else if(!strcmp(argv[1], "read")) + { + char readbuff[16]; + rt_mtd_nor_read((struct rt_mtd_nor_device*)mtd,0,readbuff,16); + rt_kprintf("read test data is %s \n",readbuff); + } +} +MSH_CMD_EXPORT(mflash, mflash mtd test); +``` +使用上面的测试命令输入mflash open、mflash write,mflash read 进行写入回读验证,测试命令写入的 +“ hello world “字符串已经被正常的读取回来了,说明法flash 的读写功能都是正常的。 +```msh +msh > +msh > +msh >mflash open +rt find device ok. +msh >mflash write +msh > +msh >mflash read +read test data is hello world +``` +## 4.原文链接 +原文链接:https://club.rt-thread.org/ask/article/ac463e45aa142da0.html + +# **六、恩智浦MCX N236上的SPI实践** (盛建忠) +## 1.实验目的 +本次测试进行SPI的loopback,可以看到根据NXP的LP_FLEXCOMM(Low-Power Flexible Communication Interface)模块当UART用,可以当SPI用,也可以当I2C用,我们在串口测试的是时候可以看到在 board 文件夹下的板级 Kconfig 文件中2/4/5暂时被分配给了串口,1/3/6初步分配给了SPI,我们本次进行SPI的loopback本来初步想通过SPI6实现,实际上在开发板上SPI6硬件连接着W25Q64,并没有引出,所以修改通过SPI3进行。 +## 2.实验步骤 +SPI3相应的引脚为 +* CS:P1_3 +* CLK:P1_1 +* MOSI:P1_0 +* MISO:P1_2 +对应的接口为FC1,注意要实现loopback请将MOSI:P1_0、MISO:P1_2连接上。 +## 2.1 打来evn工具 +![alt text](Book_Picture/six.png) +输入menuconfig 命令,进入配置界面Hardware Drivers Config-->On-chip Peripheral,打开SPI3: +![alt text](Book_Picture/six1.png) +返回到cmd界面输入scons —target=mdk5,生成新的工程: +![alt text](Book_Picture/six2.png) +## 2.1 修改代码编译后出现4个错误 +一个是缺少一个“}”,就在**static struct lpc_spi lpc_obj**中对应开启的SPI6处,添加上就好了; +一个是kDmaRequestMuxLpFlexcomm6Tx未定义,这个属于底层文件中的内容,针对N236的放在了MCXN236.h中了,添加头文件并添加: +```c +#define kDmaRequestMuxLpFlexcomm6Tx kDma0RequestMuxLpFlexcomm6Tx +#define kDmaRequestMuxLpFlexcomm6Rx kDma0RequestMuxLpFlexcomm6Rx +``` +编译后4个错误就都消失。 +## 2.2添加SPI的实例: +```c +#define SPI_NAME "spi30" +#define CS_PIN (1*32+3) +static struct rt_spi_device *spi_dev; +/* attach spi device */ +static int rt_spi_device_init(void) +{ + struct rt_spi_configuration cfg; + rt_hw_spi_device_attach("spi3", SPI_NAME, CS_PIN); + cfg.data_width = 8; + cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB | RT_SPI_NO_CS; + cfg.max_hz = 1 *1000 *1000; + spi_dev = (struct rt_spi_device *)rt_device_find(SPI_NAME); + if (RT_NULL == spi_dev) + { + rt_kprintf("spi sample run failed! can't find %s device!\n", SPI_NAME); + return -RT_ERROR; + } + rt_spi_configure(spi_dev, &cfg); + return RT_EOK; +} +INIT_APP_EXPORT(rt_spi_device_init); +/* spi loopback mode test case */ +static int spi_sample(int argc, char **argv) +{ + rt_uint8_t t_buf[32], r_buf[32]; + int i = 0; + static struct rt_spi_message msg1; + for (i = 0; i < sizeof(t_buf); i++) + { + t_buf[i] = i; + } + msg1.send_buf = &t_buf; + msg1.recv_buf = &r_buf; + msg1.length = sizeof(t_buf); + msg1.cs_take = 1; + msg1.cs_release = 1; + msg1.next = RT_NULL; + rt_spi_transfer_message(spi_dev, &msg1); + rt_kprintf("spi rbuf : "); + for (i = 0; i < sizeof(r_buf); i++) + { + rt_kprintf("%x ", r_buf[i]); + } + rt_kprintf("\nspi loopback mode test over!\n"); + return RT_EOK; +} +MSH_CMD_EXPORT(spi_sample, spi loopback test); +``` +## 3.实验结果 +![alt text](Book_Picture/six4.png) +## 4.注意事项 +在这里有几个注意的地方, +* 一个是loopback的实现实际上就是利用的SPI的自发自收,所以不要忘记硬件要将MOSI和MISO要连接上,不要连接错了。 +* 另外一个例程中带有spi_sample.c的例程,不管是自己写还是修改,在更换SPI通道重新生成keil工程的时候注意工程中是不是把spi_sample.c去掉了,去掉就添加一下,因为spi_sample.c中的INIT_APP_EXPORT等自动化的部分如果没有就不会编译,这样SPI的例程就不会添加进去了,对于工程来说是不会报错的,可是没有自动化初始化你就无法使用了。 + +## 5.原文链接 +原文链接:https://club.rt-thread.org/ask/article/558407e008aabc54.html + +# **七、恩智浦MCX N236上的PWM实践** (盛建忠) +## 1.实验目的 +rt-thread中配置启动PWM +## 2.实验步骤 +## 2.1 env配置 +输入menuconfig 命令,回车; +![alt text](Book_Picture/seven.png) +进入配置界面Hardware Drivers Config—>On-chip Peripheral; +![alt text](Book_Picture/seven1.png) +PWM的产生涉及到定时器和PWM,打开Timer+PWM+最后一项: +![alt text](Book_Picture/seven2.png) +返回到cmd界面输入scons —target=mdk5,生成新的工程: +![alt text](Book_Picture/seven3.png) +我们打开\borad\Kconfig可以看到如下: +![alt text](Book_Picture/seven4.png) +rt-thread目前还没有完全支持N236,所以我们需要根据N947去修改,部分引脚对应不同。 +## 2.2 硬件连接以及代码编写 +硬件连接: +![alt text](Book_Picture/seven5.png) +如上图,RGB-GREEN对应的引脚是P4_19,在pin_mux.c中把PORT4->PCR[19]解锁,注意在自定义生成的工程中FLEXIO也使用的了PORT4->PCR[17]~PORT4->PCR[19]引脚,根据实际需求进行配置,我们这里用作了LED的控制,就将对应的FLEXIO使用的代码屏蔽,添加PORT4->PCR[19]的初始化代码,注意PORT4->PCR[19]对应的是CT3_MAT3: +![alt text](Book_Picture/seven6.png) +我们在\borad\Kconfig中修改green对应的通道名: +![alt text](Book_Picture/seven7.png) +修改borad.c中的通道对应的GPIO配置: +```c +#if defined(BSP_USING_LEDG_PWM) && defined(BSP_USING_PWM) + PORT_SetPinMux(PORT4, 19, kPORT_MuxAlt4); +#endif +``` +main中添加如下代码: +```c +#define PWM_DEV_NAME "pwm3" /* PWM NAME */ +#define PWM_DEV_CHANNEL 3 /* PWM CHANNEL */ +struct rt_device_pwm *pwm_dev; /* PWM device */ +int pwmtest(void) +{ + rt_uint32_t period; + period = 1000000; /*??ns ???:1ms (1KHz)*/ + /* 查找设备 */ + pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME); + if (pwm_dev == RT_NULL) + { + rt_kprintf("pwm test run failed! can't find %s device!\n", PWM_DEV_NAME); + return RT_ERROR; + } + rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, period/3); + //rt_device_control(pwm_dev, PWM_CMD_ENABLE, &configuration); + rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL); + rt_kprintf("pwm start\r\n"); + return 0; +} +``` +## 3.实验结果 +![alt text](Book_Picture/seven8.png) +## 4.原文链接 +原文链接:https://club.rt-thread.org/ask/article/27f4fcdcb3ab633b.html + +# **八、恩智浦MCX N236上的 IIC(软件) 实践** (andeyqi) +## 1. 简介 +本文介绍如何在FRDM-MCXN236 开发板上通过GPIO 模拟的I2C,使用i2ctool 工具扫描总线上的挂载的节点,并通过使用i2ctool 读写板子上自带的FXLS8974 传感器寄存器信息。 +## 2.实验步骤 +## 2.1 I2C(软件)硬件配置 +FRDM-MCXN236 开发板上已经集成了个I2C传感器器件,本次的I2C 评测无需外接I2C设备直接使用板子自带的外设即可,板子上的I2C使用的是P4_0/P4_1(FLEXCOM2)接口,对应原理图如下: +![alt text](Book_Picture/eight.png) +## 2.2 I2C软件配置 +MCXNxxx 的bsp 驱动里只实现了硬件I2C的适配并没有适配软件GPIO模拟的I2C驱动实现,软件模拟的I2C 依赖pin 驱动,I2C的算法在rt-thread 中已经集成,我们只要实现依赖芯片相关的GPIO 配置即可,对应ops 定义如下 +```c +struct rt_i2c_bit_ops +{ + void *data; /* private data for lowlevel routines */ + void (*set_sda)(void *data, rt_int32_t state); + void (*set_scl)(void *data, rt_int32_t state); + rt_int32_t (*get_sda)(void *data); + rt_int32_t (*get_scl)(void *data); + void (*udelay)(rt_uint32_t us); + rt_uint32_t delay_us; /* scl and sda line delay */ + rt_uint32_t timeout; /* in tick */ + void (*pin_init)(void); + rt_bool_t i2c_pin_init_flag; +}; +``` +适配软件I2C的过程就是填充上述结构成员,并构造一个对象注册到系统即可 +set_sda/set_scl/get_sda/get_scl/udelay/pin_init 函数实现如下 +```c +/** + * @brief This function initializes the i2c pin. + * @param i2c + * @retval None + */ +static void mcxnxxx_i2c_gpio_init(struct mcxnxxx_i2c *i2c) +{ + struct mcxnxxx_soft_i2c_config* cfg = (struct mcxnxxx_soft_i2c_config*)i2c->ops.data; + rt_pin_mode(cfg->scl, PIN_MODE_OUTPUT_OD); + rt_pin_mode(cfg->sda, PIN_MODE_OUTPUT_OD); + rt_pin_write(cfg->scl, PIN_HIGH); + rt_pin_write(cfg->sda, PIN_HIGH); +} +/** + * @brief This function sets the sda pin. + * @param data, state + * @retval None + */ +static void mcxnxxx_set_sda(void *data, rt_int32_t state) +{ + struct mcxnxxx_soft_i2c_config* cfg = (struct mcxnxxx_soft_i2c_config*)data; + rt_pin_mode(cfg->sda, PIN_MODE_OUTPUT_OD); + if (state) + { + rt_pin_write(cfg->sda, PIN_HIGH); + } + else + { + rt_pin_write(cfg->sda, PIN_LOW); + } +} +/** + * @brief This function sets the scl pin. + * @param data, state + * @retval None + */ +static void mcxnxxx_set_scl(void *data, rt_int32_t state) +{ + struct mcxnxxx_soft_i2c_config* cfg = (struct mcxnxxx_soft_i2c_config*)data; + rt_pin_mode(cfg->scl, PIN_MODE_OUTPUT_OD); + if (state) + { + rt_pin_write(cfg->scl, PIN_HIGH); + } + else + { + rt_pin_write(cfg->scl, PIN_LOW); + } +} +/** + * @brief This function gets the sda pin state. + * @param data + * @retval None + */ +static rt_int32_t mcxnxxx_get_sda(void *data) +{ + struct mcxnxxx_soft_i2c_config* cfg = (struct mcxnxxx_soft_i2c_config*)data; + rt_pin_mode(cfg->sda, PIN_MODE_INPUT); + return rt_pin_read(cfg->sda); +} +/** + * @brief This function gets the scl pin state. + * @param data + * @retval None + */ +static rt_int32_t mcxnxxx_get_scl(void *data) +{ + struct mcxnxxx_soft_i2c_config* cfg = (struct mcxnxxx_soft_i2c_config*)data; + rt_pin_mode(cfg->scl,PIN_MODE_INPUT); + return rt_pin_read(cfg->scl); +} +/** + * @brief The time delay function. + * @param us + * @retval None + */ +static void mcxnxxx_udelay(rt_uint32_t us) +{ + rt_uint32_t frequency = CLOCK_GetCoreSysClkFreq(); + int i = (frequency/ 4000000 * us); + while(i) + { + i--; + } +} +static const struct rt_i2c_bit_ops mcxnxxx_bit_ops_default = +{ + .data = RT_NULL, + .set_sda = mcxnxxx_set_sda, + .set_scl = mcxnxxx_set_scl, + .get_sda = mcxnxxx_get_sda, + .get_scl = mcxnxxx_get_scl, + .udelay = mcxnxxx_udelay, + .delay_us = 1, + .timeout = 100 +}; +``` +注册上述的ops 函数到系统 +```c +/** + * @brief This function initializes the i2c pin. + * @param i2c + * @retval None + */ +static void mcxnxxx_i2c_gpio_init(struct mcxnxxx_i2c *i2c) +{ + struct mcxnxxx_soft_i2c_config* cfg = (struct mcxnxxx_soft_i2c_config*)i2c->ops.data; + rt_pin_mode(cfg->scl, PIN_MODE_OUTPUT_OD); + rt_pin_mode(cfg->sda, PIN_MODE_OUTPUT_OD); + rt_pin_write(cfg->scl, PIN_HIGH); + rt_pin_write(cfg->sda, PIN_HIGH); +} +/** + * @brief This function sets the sda pin. + * @param data, state + * @retval None + */ +static void mcxnxxx_set_sda(void *data, rt_int32_t state) +{ + struct mcxnxxx_soft_i2c_config* cfg = (struct mcxnxxx_soft_i2c_config*)data; + rt_pin_mode(cfg->sda, PIN_MODE_OUTPUT_OD); + if (state) + { + rt_pin_write(cfg->sda, PIN_HIGH); + } + else + { + rt_pin_write(cfg->sda, PIN_LOW); + } +} +/** + * @brief This function sets the scl pin. + * @param data, state + * @retval None + */ +static void mcxnxxx_set_scl(void *data, rt_int32_t state) +{ + struct mcxnxxx_soft_i2c_config* cfg = (struct mcxnxxx_soft_i2c_config*)data; + rt_pin_mode(cfg->scl, PIN_MODE_OUTPUT_OD); + if (state) + { + rt_pin_write(cfg->scl, PIN_HIGH); + } + else + { + rt_pin_write(cfg->scl, PIN_LOW); + } +} +/** + * @brief This function gets the sda pin state. + * @param data + * @retval None + */ +static rt_int32_t mcxnxxx_get_sda(void *data) +{ + struct mcxnxxx_soft_i2c_config* cfg = (struct mcxnxxx_soft_i2c_config*)data; + rt_pin_mode(cfg->sda, PIN_MODE_INPUT); + return rt_pin_read(cfg->sda); +} +/** + * @brief This function gets the scl pin state. + * @param data + * @retval None + */ +static rt_int32_t mcxnxxx_get_scl(void *data) +{ + struct mcxnxxx_soft_i2c_config* cfg = (struct mcxnxxx_soft_i2c_config*)data; + rt_pin_mode(cfg->scl,PIN_MODE_INPUT); + return rt_pin_read(cfg->scl); +} +/** + * @brief The time delay function. + * @param us + * @retval None + */ +static void mcxnxxx_udelay(rt_uint32_t us) +{ + rt_uint32_t frequency = CLOCK_GetCoreSysClkFreq(); + int i = (frequency/ 4000000 * us); + while(i) + { + i--; + } +} +static const struct rt_i2c_bit_ops mcxnxxx_bit_ops_default = +{ + .data = RT_NULL, + .set_sda = mcxnxxx_set_sda, + .set_scl = mcxnxxx_set_scl, + .get_sda = mcxnxxx_get_sda, + .get_scl = mcxnxxx_get_scl, + .udelay = mcxnxxx_udelay, + .delay_us = 1, + .timeout = 100 +}; +``` +基于mcxn236/board/Kconfig 更新配置添加softi2c 配置菜单 +```c +diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn236/board/Kconfig b/bsp/nxp/mcx/mcxn/frdm-mcxn236/board/Kconfig +index 93452d780e..44f287a0f2 100644 +--- a/bsp/nxp/mcx/mcxn/frdm-mcxn236/board/Kconfig ++++ b/bsp/nxp/mcx/mcxn/frdm-mcxn236/board/Kconfig +@@ -53,6 +53,28 @@ menu "On-chip Peripheral Drivers" + default y + endif ++ menuconfig BSP_USING_SW_I2C ++ bool "Enable I2C BUS (software simulation)" ++ default n ++ select RT_USING_I2C ++ select RT_USING_I2C_BITOPS ++ select RT_USING_PIN ++ if BSP_USING_SW_I2C ++ config BSP_USING_SW_I2C0 ++ bool "Enable soft I2C0" ++ default y ++ if BSP_USING_SW_I2C0 ++ config BSP_SW_I2C0_SCL_PIN ++ int "SWI2C0 scl pin number" ++ range 0 159 ++ default 129 ++ config BSP_SW_I2C0_SDA_PIN ++ int "SWI2C0 sda pin number" ++ range 0 159 ++ default 128 ++ endif ++ endif ++ +``` +修改Kconfig 后通过menuconfig 命令打开软件I2C配置 +![alt text](Book_Picture/eight1.png) +开启软件i2c后使用 “scons —target=iar” 生成工程烧写到板子内运行list device 命令发现swi2c0 bus 总线设备已经注册到系统内部了 +```msh +msh >list device +device type ref count +-------- -------------------- ---------- +swi2c0 I2C Bus 0 +pin Pin Device 0 +uart5 Character Device 0 +uart4 Character Device 2 +uart2 Character Device 0 +msh > +``` +## 2.3 I2C功能验证 +Rt-thread 有着丰富的组件资源,验证I2C 功能可以使用i2ctool 工具来测试I2C 总线通信状况,通过如下路径开启软件包。 +![alt text](Book_Picture/eight2.png) +配置完成后输入“ pkgs —update” 命令会通过网络下载源代码到本地,运行结果如下 +```msh +pkgs --update +[Use Github server - auto decision based on IP location] +Cloning into 'E:\rt-thread_github_andeyqi\bsp\nxp\mcx\mcxn\frdm-mcxn236\packages\rt_vsnprintf_full-latest'... +remote: Enumerating objects: 9, done. +remote: Counting objects: 100% (9/9), done. +remote: Compressing objects: 100% (9/9), done. +remote: Total 9 (delta 0), reused 6 (delta 0), pack-reused 0 +Receiving objects: 100% (9/9), 127.66 KiB | 375.00 KiB/s, done. +==============================> RT_VSNPRINTF_FULL latest is downloaded successfully. +Cloning into 'E:\rt-thread_github_andeyqi\bsp\nxp\mcx\mcxn\frdm-mcxn236\packages\i2c-tools-latest'... +remote: Enumerating objects: 18, done. +remote: Counting objects: 100% (18/18), done. +remote: Compressing objects: 100% (16/16), done. +remote: Total 18 (delta 0), reused 11 (delta 0), pack-reused 0 +Receiving objects: 100% (18/18), 2.00 MiB | 2.34 MiB/s, done. +==============================> I2C_TOOLS latest is downloaded successfully. +E:\rt-thread_github_andeyqi\bsp\nxp\mcx\mcxn\frdm-mcxn236\packages\rt_vsnprintf_full-latest +==============================> rt_vsnprintf_full update done +E:\rt-thread_github_andeyqi\bsp\nxp\mcx\mcxn\frdm-mcxn236\packages\i2c-tools-latest +==============================> i2c-tools update done +Operation completed successfully. + +``` +使用“scons —target=iar” 重新生成工程发现工程目录下已经加入了i2ctool 的源码了 +![alt text](Book_Picture/eight3.png) +编译发现i2ctool 源码是cpp 后缀的,会有如下编译错误 +![alt text](Book_Picture/eight4.png) +IAR 工程开启如下配置即可解决上述编译错误,默认配置编译器归把所有的文件按照c语言编译,配置修改为Auto自动根据文件扩展来识别文件为c或c++ +![alt text](Book_Picture/eight5.png) +## 3. 使用i2c tool 验证I2C功能 +加入i2ctool 工具后系统会集成i2c 命令,对应使用说明如下 +```msh +msh >i2c +--------------- +i2c tools help: +--------------- +i2c scan pin_sda pin_scl [start addr] [stop addr] +i2c read pin_sda pin_scl address register [len=1] +i2c write pin_sda pin_scl address [register] data_0 data_1 ... +``` +根据上面的原理图SCL 脚是P4_1 ,SDA 脚是P4_0 对应的引脚转换成PIN id 为129 和 128(对应公式为port*32+index) +输入 i2c scan 128 129 命令扫描i2c节点,发现扫描到0x18的节点,对应的为7bit 地址和板子上的I2C外设保持一致,说明软件I2C已经正常工作可以和芯片通信了。 +```msh +msh >i2c scan 128 129 + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F +00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- -- +20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +msh > +msh >i +``` +上述的测试是通过传入pin id 的方式来访问软件i2c,我们也可以通过访问总线的方式来访问i2c,修改i2ctool 配置关闭,重新生成IAR工程 +![alt text](Book_Picture/eight6.jpg) +此时就可以通过i2c 总线设备来访问i2c 总线设备了,访问方式如下 +```msh +msh >i2c +--------------- +i2c tools help: +--------------- +i2c scan bus_name [start addr] [stop addr] +i2c read bus_name address register [len=1] +i2c write bus_name address [register] data_0 data_1 ... +``` +此时输入 i2c scan swi2c0 命令检测到的节点存在状况和通过pin id 方式保持一致 +```c +msh >i2c scan swi2c0 + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F +00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- -- +20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +msh > +``` +使用i2c read 功能 +查看原理图板子上的I2C 连接的芯片为NXP 的 FXLS8974CF 12位数字物联网加速度计,我们查看手册芯片的WHO_AM_I 寄存器代表的产品ID,我们读取该寄存器数值看看是否和手册的0X86保持一致,芯片手册上寄存器描述如下: +![alt text](Book_Picture/eight7.png) +输入“i2c read swi2c0 24 19” 命令读取寄存器返回结果如下,和芯片手册的0x86保持一致,从而验证I2C 读取功能OK +```msh +msh >i2c read swi2c0 24 19 +[ 0x86 ] +``` +我们找个I2C可写入的寄存器,进行写入回读验证写功能,回读的数据和写入的一致说明通路都是ok的。 +```msh +msh >i2c read swi2c0 24 22 +[ 0x00 ] +msh >i2c write swi2c0 24 22 0xfb +msh >i2c read swi2c0 24 22 +[ 0xFB ] +msh > +``` +## 4.原文链接 +原文链接:https://club.rt-thread.org/ask/article/92cbd4db6b527336.html +# **九、恩智浦MCX N236上的 IIC(硬件) 实践** (xinshuwei) +## 1.简介 +本文主要基于NXP-FRDM-MCXN236实现硬件I2C 驱动SSD1306 实现屏幕显示 +## 2.开发板及芯片介绍 +开发板构成图如下: +![alt text](Book_Picture/nine.png) + +## 3. I2C 接口 +下面重点关注下要介绍的硬件I2C 接口 +![alt text](Book_Picture/nine2.png) +管脚复用关系的话使用官网的配置工具MCUXpresso Config Tools v15.1 ,比较方便,相关驱动代码可以自动生成, +![alt text](Book_Picture/nine3.png) +这里通过配置可知,主要使用的硬件的LP_FLEXCOMM2 即I2C2 ,由于默认的config内只有I2C1 I2C0,所以需要增加I2C,在board/kconfig 文件中,按下面方式添加I2C2 +``` config + menuconfig BSP_USING_I2C + config BSP_USING_I2C + bool "Enable I2C" + select RT_USING_I2C + default y + if BSP_USING_I2C + config BSP_USING_I2C0 + bool "Enable Flexcomm0 I2C" + default y + config BSP_USING_I2C1 + bool "Enable Flexcomm1 I2C" + default y + config BSP_USING_I2C2 + bool "Enable Flexcomm2 I2C" + default y + endif +``` +修改完成后,保存,使用scons —menuconfig 或者 scons —pyconfig 进行I2C 及I2C2 使能 + +drv_i2c.c 中相关代码都现成的 有I2C0 I2C1 I2C2 ,不需改动 + +IO_MUX 复选默认也选择了I2C 功能,这里也可以在board 中将MCUXpresso Config Tools 生成的配置代码进行再次配置,保证硬件I2C 功能开启 +```c + /* PORT4_0 (pin P1) is configured as FC2_P0 */ + PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_I2C2_SDA_PORT, BOARD_INITDEBUG_UARTPINS_I2C2_SDA_PIN, kPORT_MuxAlt2); + PORT4->PCR[0] = ((PORT4->PCR[0] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_IBE_MASK))) + /* Input Buffer Enable: Enables. */ + | PORT_PCR_IBE(PCR_IBE_ibe1)); + /* PORT4_1 (pin P2) is configured as FC2_P1 */ + PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_I2C2_SCK_PORT, BOARD_INITDEBUG_UARTPINS_I2C2_SCK_PIN, kPORT_MuxAlt2); + PORT4->PCR[1] = ((PORT4->PCR[1] & + /* Mask bits to zero which are setting */ + (~(PORT_PCR_IBE_MASK))) + /* Input Buffer Enable: Enables. */ + | PORT_PCR_IBE(PCR_IBE_ibe1)); +``` +配置完成后,在menuconfig 中使能I2C tools 功能,使用pkg-update 更新libirary 使用 scons —target=mdk5更新keil 工程,重新编译下载,编译过程中遇到报错 +![alt text](Book_Picture/nine4.png) +可以将配置中的-x assembler-with-cpp 进行删除就可解决,后来定位 print组件一开始未来进来导致,后续导入后,问题不复现 +![alt text](Book_Picture/nine5.png) +配置完成后,上电可以看到I2C2 已经正确注册 +![alt text](Book_Picture/nine7.png) +## 4. I2C 功能验证 +这里使用手边的SSD1306 12864单色显示屏进行验证 +pyconfig中使能SSD1306 库如下 +![alt text](Book_Picture/nine8.png) +如上面的步骤进行使用pkg-update 更新libirary 使用 scons —target=mdk5更新keil 工程,导入SSD1306库 +![alt text](Book_Picture/nine9.png) +两个ssd1306 头文件按上图将#include 及宏定义去掉 +然后进行编译烧录 +上电后,shell 里面输入ssd1306_TestAll +可以看到显示屏被驱动,循环进行显示 +![alt text](Book_Picture/nine10.jpg) +接线方法参考上图进行连接,屏幕成功被驱动起来 +使用板载的加速度计读取数据也能正常读取 +![alt text](Book_Picture/nine11.png) +### 5.原文链接 +原文链接: https://club.rt-thread.org/ask/article/67691025f6bfa633.html +# **十、恩智浦MCX N236上的USB-D实践** (Jisheng) +## 1. USB硬件概览 +MCXN236系列集成了一个USB2.0 High Speed的主控,支持OTG,并集成了一个USB2.0 High Speed兼容的 +PHY。USBHS主控有8个bidirectional endpoints,支持charger detection,并支持低功耗local/remote唤醒,控制器里自带DMA。USBHS主控和PHY在OD(Over Drive)、SD(Standard Drive)模式下可工作,在MD(Mid Drive)模式下不工作。主控在手册和官方SDk里也称为OTG1 port。 +## 2. MCXN236 RT-Thread usb协议栈选择考量 +RT-Thread其实有三个usb协议栈可选,分别是原RT-Thread自带的usb协议栈,目前已经移入components/legacy/usb/目录下;cherryusb,当前已成为RT-Thread默认usb协议栈,性能不错;tinyusb支持众多的mcu中的usb ip,反馈良好,使用广泛。 + +为完成测评其实笔者最简单省力的方法是照着大牛的测评路子 https://club.rt-thread.org/ask/article/b1d932d3dff1ca6a.html 稍许改下其代码即可使用,但有两原因笔者不想走这个思路测评:一想挑战一下自己,二这篇文章用的是原RT-Thread自带的usb协议栈,目前已经是legacy状态,也就是说长远来看要废弃。剩下的选择就是cherryusb和tinyusb了,按理应该选cherryusb,但笔者仔细阅读cherryusb和tinyusb源码发现目前cherryusb应该还不支持MCXN236的USB IP,给cherryusb增加MCXN236的支持工作量还是不小的,已远远超出测评范围;另一方面,tinyusb主线已经支持MCXN947,笔者非 +常喜欢这一点,根据上述章节的硬件概述,再阅读NXP官方MCXN947文档的USB章节,笔者基本肯定MCXN236的USBHS主控和MCXN947的USBHS主控是兼容的。注意:MCXN947还有一个USBFS的主控,但MCXN236芯片 +中没有这个控制器 +## 3. MCXN236 RT-Thread tinyusb移植 +慢着,不是说MCXN236的USBHS控制器和MCXN947的USBHS控制器兼容么,要移植做啥?原因在于tinyusb主线确实支持MCXN947,但RT-Thread的tinyusb包比较老了,所以需要一个和主线tinyusb的适配过程。整个适配过程包括主线tinyusb的修改和RT-Thread MCXN236板级适配。 +### 3.1.主线tinyusb的修改 +主要是修改tinyusb源码中rt-thread相关的SConscript和tusb_config.h,在此之前请先clone主线tinyusb。 +```git +git clone https://github.com/hathach/tinyusb.git +``` +修改之 +```c +diff --git a/lib/rt-thread/SConscript b/lib/rt-thread/SConscript +index 34399fd45..b248237db 100644 +--- a/lib/rt-thread/SConscript ++++ b/lib/rt-thread/SConscript +@@ -27,6 +27,9 @@ if GetDepend(["PKG_TINYUSB_DEVICE_ENABLE"]): + src += ["../../src/portable/renesas/rusb2/dcd_rusb2.c", + "../../src/portable/renesas/rusb2/rusb2_common.c"] ++ if GetDepend(["SOC_MCX"]): ++ src += ["../../src/portable/chipidea/ci_hs/dcd_ci_hs.c"] ++ + # Device class + if GetDepend(["PKG_TINYUSB_DEVICE_UVC"]): + src += ["../../src/class/video/video_device.c"] +diff --git a/lib/rt-thread/tusb_config.h b/lib/rt-thread/tusb_config.h +index 11dc21983..3b393bb33 100644 +--- a/lib/rt-thread/tusb_config.h ++++ b/lib/rt-thread/tusb_config.h +@@ -66,6 +66,8 @@ extern "C" { + #define CFG_TUSB_MCU OPT_MCU_RP2040 + #elif defined(SOC_FAMILY_RENESAS) + #define CFG_TUSB_MCU OPT_MCU_RAXXX ++#elif defined(SOC_MCX) ++#define CFG_TUSB_MCU OPT_MCU_MCXN9 + #else + #error "Not support for current MCU" + #endif +``` +### 3.2tinyusb芯片级与板级适配 +### 3.4 usb phy驱动 +主要是两个文件usb_phy.c和usb_phy.h,可从sdk中拷贝过来 +### 3.5 drv_tinyusb.c +主要做两件事 +1.实现usb的芯片和板级初始化相关的,代码如下 +```c +int tusb_board_init(void) +{ + // Port1 is High Speed + // Power + SPC0->ACTIVE_VDELAY = 0x0500; + /* Change the power DCDC to 1.8v (By default, DCDC is 1.8V), CORELDO to 1.1v (By default, CORELDO is 1.0V) */ + SPC0->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK; + SPC0->ACTIVE_CFG |= SPC_ACTIVE_CFG_DCDC_VDD_LVL(0x3) | SPC_ACTIVE_CFG_CORELDO_VDD_LVL(0x3) | + SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK | SPC_ACTIVE_CFG_DCDC_VDD_DS(0x2u); + /* Wait until it is done */ + while (SPC0->SC & SPC_SC_BUSY_MASK) {} + if (0u == (SCG0->LDOCSR & SCG_LDOCSR_LDOEN_MASK)) { + SCG0->TRIM_LOCK = 0x5a5a0001U; + SCG0->LDOCSR |= SCG_LDOCSR_LDOEN_MASK; + /* wait LDO ready */ + while (0U == (SCG0->LDOCSR & SCG_LDOCSR_VOUT_OK_MASK)); + } + SYSCON->AHBCLKCTRLSET[2] |= SYSCON_AHBCLKCTRL2_USB_HS_MASK | SYSCON_AHBCLKCTRL2_USB_HS_PHY_MASK; + SCG0->SOSCCFG &= ~(SCG_SOSCCFG_RANGE_MASK | SCG_SOSCCFG_EREFS_MASK); + /* xtal = 20 ~ 30MHz */ + SCG0->SOSCCFG = (1U << SCG_SOSCCFG_RANGE_SHIFT) | (1U << SCG_SOSCCFG_EREFS_SHIFT); + SCG0->SOSCCSR |= SCG_SOSCCSR_SOSCEN_MASK; + while (1) { + if (SCG0->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK) { + break; + } + } + // Clock + SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK | SYSCON_CLOCK_CTRL_CLKIN_ENA_FM_USBH_LPT_MASK; + CLOCK_EnableClock(kCLOCK_UsbHs); + CLOCK_EnableClock(kCLOCK_UsbHsPhy); + CLOCK_EnableUsbhsPhyPllClock(kCLOCK_Usbphy480M, 24000000U); + CLOCK_EnableUsbhsClock(); + // USB PHY +#if ((!(defined FSL_FEATURE_SOC_CCM_ANALOG_COUNT)) && (!(defined FSL_FEATURE_SOC_ANATOP_COUNT))) + USBPHY->TRIM_OVERRIDE_EN = 0x001fU; /* override IFR value */ +#endif + // Enable PHY support for Low speed device + LS via FS Hub + USBPHY->CTRL |= USBPHY_CTRL_SET_ENUTMILEVEL2_MASK | USBPHY_CTRL_SET_ENUTMILEVEL3_MASK; + // Enable all power for normal operation + USBPHY->PWD = 0; + // TX Timing + uint32_t phytx = USBPHY->TX; + phytx &= ~(USBPHY_TX_D_CAL_MASK | USBPHY_TX_TXCAL45DM_MASK | USBPHY_TX_TXCAL45DP_MASK); + phytx |= USBPHY_TX_D_CAL(0x04) | USBPHY_TX_TXCAL45DP(0x07) | USBPHY_TX_TXCAL45DM(0x07); + //phytx |= USBPHY_TX_D_CAL(0x0C) | USBPHY_TX_TXCAL45DP(0x06) | USBPHY_TX_TXCAL45DM(0x06); + USBPHY->TX = phytx; + return 0; +} +``` +2.中断的处理,代码如下 +```c +void USB1_HS_IRQHandler(void) +{ + rt_interrupt_enter(); +#ifdef PKG_TINYUSB_DEVICE_ENABLE + tud_int_handler(1); +#endif +#ifdef PKG_TINYUSB_HOST_ENABLE + tuh_int_handler(1); +#endif + rt_interrupt_leave(); +} +``` +### 3.6 hid_example.c与cdc_example.c +可从其它proj拷贝过来,比如vision board的proj +## 4.FRDM-MCXN236 USB实践 +虽然不用RT-Thread的tinyusb包,但需要用它引入的env。在目录bsp/nxp/mcx/mcxn/frdm-mcxn236执行 +```scons +scons --menuconfig +``` +```env +RT-Thread online packages ---> + system packages ---> + TinyUSB: an open source cross-platform USB stack for embedded system ---> +``` +这里请按图所示选择配置tinyusb +![alt text](Book_Picture/ten.jpg) +```scon + Using USB device ---> +``` +这里请按图配置USB device相关选项 +![alt text](Book_Picture/ten1.jpg) +注意这里不用下载RT-Thread的tinyusb包,而是在bsp/nxp/mcx/mcxn/frdm-mcxn236/packages/目录创建到已clone下来的主线tinyusb的软链接 +```config +ln -s PATH_TO_tinyusb . +``` +## 5.实验现象 +编译烧录后在msh下,会有hid_example和cdc_example两个命令可用,请用usb线缆连接FRDM-MCXN236开发板的另一USB端口和PC机USB端口,测试方法如下: +### 5.1hid_example +msh执行hid_example命令,PC主机鼠标画圆,并且PC主机上会敲入Win+R快捷键、notepad、回车和“This is RT-Thread TinyUSB demo.” +### 5.2cdc_example +请在PC机上打开串口终端软件,连接FRDM-N236开发板虚拟出来的ttyACM端口。msh执行cdc_example命令,PC串口终端中尝试输入一些字符,会看到输入的字符被回显。 +## 6.原文链接 +原文链接:https://club.rt-thread.org/ask/article/481edf0f89a18288.html \ No newline at end of file