diff --git a/rt-thread-version/rt-thread-standard/_sidebar.md b/rt-thread-version/rt-thread-standard/_sidebar.md index eabacc10da9c4d1f335615286f8a8ae32fae5947..d5b19d135a2664fdbc59083f7ee6161f14bcfe58 100644 --- a/rt-thread-version/rt-thread-standard/_sidebar.md +++ b/rt-thread-version/rt-thread-standard/_sidebar.md @@ -214,6 +214,7 @@ - [兆易创新GD32VW553-EVAL开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/兆易创新GD32VW553-EVAL开发实践指南.md) - 富瀚微系列 - [富瀚微FH8626V300L开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/富瀚微FH8626V300L开发实践指南.md) + - [富瀚微MC632X开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/富瀚微MC632X开发实践指南.md) - XUANTIE系列 - [XUANTIE开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/xuantie/XUANTIE开发实践指南.md) diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/010654acad603f36cbb3a042b927d76c.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/010654acad603f36cbb3a042b927d76c.png new file mode 100644 index 0000000000000000000000000000000000000000..68141bc43205439f6f2eacc673a9db35656f5a5e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/010654acad603f36cbb3a042b927d76c.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/01afd171f34b5e2bcdff847cbe0ad0f6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/01afd171f34b5e2bcdff847cbe0ad0f6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..3195655af46b2117a6218b05b7ff468b97a99c49 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/01afd171f34b5e2bcdff847cbe0ad0f6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/036a35931677cbd24054dc156171e7c6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/036a35931677cbd24054dc156171e7c6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..d761333ca40d32c0e08cfd0f4958a28ecbf99ffd Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/036a35931677cbd24054dc156171e7c6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/075800914bfd9de7ff05acd0ec07a53c.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/075800914bfd9de7ff05acd0ec07a53c.png new file mode 100644 index 0000000000000000000000000000000000000000..dec2a51eb9b7dadccac4a30385f86f4b2219064f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/075800914bfd9de7ff05acd0ec07a53c.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/07bfef8a0ee556ec99db2306e478c851.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/07bfef8a0ee556ec99db2306e478c851.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..22452b933f38ca0293158669493deb143aa48f04 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/07bfef8a0ee556ec99db2306e478c851.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/080700887869038ecd92c8e0054c4dd4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/080700887869038ecd92c8e0054c4dd4.png new file mode 100644 index 0000000000000000000000000000000000000000..a02bb10444583963d2247fff6baf04bc55d0b0ae Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/080700887869038ecd92c8e0054c4dd4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/08bb9bf63a611c356c82c70da269efb6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/08bb9bf63a611c356c82c70da269efb6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e996de836164ef6dc4afdeef2d9bb47deab9866d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/08bb9bf63a611c356c82c70da269efb6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/091bbbbd5b5ea9dffc4fff7672979a54.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/091bbbbd5b5ea9dffc4fff7672979a54.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..cd396adefcdb4c419b682a580fa2f3ea73111d94 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/091bbbbd5b5ea9dffc4fff7672979a54.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/09742a61453f715e1abed4cd56fe45c3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/09742a61453f715e1abed4cd56fe45c3.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d3541ebb39c285e23ada9b194f578148200d2b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/09742a61453f715e1abed4cd56fe45c3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0a9e9ff593068e18c0b82784c762fe8f.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0a9e9ff593068e18c0b82784c762fe8f.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4b508646304d7d2881c4ebb0a1ea94d22eb6804c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0a9e9ff593068e18c0b82784c762fe8f.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0b0095bf031e8bfb4eb58d0a3ea1ebde.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0b0095bf031e8bfb4eb58d0a3ea1ebde.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..ac954075e7eec8b9582cff1083fadd6443f1ce24 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0b0095bf031e8bfb4eb58d0a3ea1ebde.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0c63a9d3b50ccd8e97b7ec0d37c4cc43.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0c63a9d3b50ccd8e97b7ec0d37c4cc43.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..f894b0c42ecf352a26b65b5e99a529f686dd96f2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0c63a9d3b50ccd8e97b7ec0d37c4cc43.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0cdae609f6e92a5a5ba7b388553ba8c3.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0cdae609f6e92a5a5ba7b388553ba8c3.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b65a4ffd0908fd4ab0ae071ac39a12c7dcb178d6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0cdae609f6e92a5a5ba7b388553ba8c3.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0f3158e3bf5413fd8b56d6e71ac0a44f.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0f3158e3bf5413fd8b56d6e71ac0a44f.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..09fcc9ee4ca45d998a76c238137ae2033c2cf56f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0f3158e3bf5413fd8b56d6e71ac0a44f.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0f598522ad9152e8b9ef3d202f53d554-1773987049866494.gif b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0f598522ad9152e8b9ef3d202f53d554-1773987049866494.gif new file mode 100644 index 0000000000000000000000000000000000000000..8109531ea48c24e3c79354a3801b2ba4945a11f5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/0f598522ad9152e8b9ef3d202f53d554-1773987049866494.gif differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/104a1e366098f4db644fae6e9a82002a.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/104a1e366098f4db644fae6e9a82002a.png new file mode 100644 index 0000000000000000000000000000000000000000..7a2824c24a4e5a4bdcef544084a22e162939f85a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/104a1e366098f4db644fae6e9a82002a.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/114f5cc36297eb69855649f013dd4579.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/114f5cc36297eb69855649f013dd4579.png new file mode 100644 index 0000000000000000000000000000000000000000..bd80b00069994e2df99e15c942e2458e6db7fc1c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/114f5cc36297eb69855649f013dd4579.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/11b76b13daec0aa0d887b2190133f9e6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/11b76b13daec0aa0d887b2190133f9e6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..9414d0020e81f4a8faa16f52a15951dbda195936 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/11b76b13daec0aa0d887b2190133f9e6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/123b455cd3a6f05e7113117f3ad07211.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/123b455cd3a6f05e7113117f3ad07211.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc8e75dc25a021990cf079113d27a6ab07ffc71 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/123b455cd3a6f05e7113117f3ad07211.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/13adcc6930cf87b95424b62bf8274cd1.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/13adcc6930cf87b95424b62bf8274cd1.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..a67c89f13dc35c3c815c63379ecc66c35a75b4ea Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/13adcc6930cf87b95424b62bf8274cd1.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/13ec3e50aa0911d1dd76c7911995e7e1.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/13ec3e50aa0911d1dd76c7911995e7e1.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..1c40cbc6cab27cbd180bc494ec781393e7dda742 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/13ec3e50aa0911d1dd76c7911995e7e1.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1475be4b7b4391134d9e9b4a308dd77f.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1475be4b7b4391134d9e9b4a308dd77f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11cd8a9176a1c4a42bace4273aa5144c58e409df Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1475be4b7b4391134d9e9b4a308dd77f.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/14b6b78d3a206c971581d125e0627edd.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/14b6b78d3a206c971581d125e0627edd.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e5490a84c8390c923e5f30b64f62b33682e8d844 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/14b6b78d3a206c971581d125e0627edd.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/15d8616b0bbb813b8b7b0bcdc3e28837.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/15d8616b0bbb813b8b7b0bcdc3e28837.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..88a0115aa75c52ee13e782a795305702bc49dc4c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/15d8616b0bbb813b8b7b0bcdc3e28837.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/17984beb3cdf0889144df072a0d6dbac.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/17984beb3cdf0889144df072a0d6dbac.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..68d55ad8986de296f55927fcc1da141911271bfb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/17984beb3cdf0889144df072a0d6dbac.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/19d5823ccbc14c9ccdee3d559c04e046.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/19d5823ccbc14c9ccdee3d559c04e046.png new file mode 100644 index 0000000000000000000000000000000000000000..9f4aa693bcbdae1ee0d5792559992998133481c5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/19d5823ccbc14c9ccdee3d559c04e046.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1b7b44b1487863cf2467c1660030a5c3.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1b7b44b1487863cf2467c1660030a5c3.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..a1f07c4d0edf9659f12bc3170162e5c16514802f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1b7b44b1487863cf2467c1660030a5c3.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1bab9d307ce71b60987b2e9d450e74f1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1bab9d307ce71b60987b2e9d450e74f1.png new file mode 100644 index 0000000000000000000000000000000000000000..5d1b4e3fe93becaf666dc94df9c9380e1291b58a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1bab9d307ce71b60987b2e9d450e74f1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1bb9c21c76f6b627d28549034c490645.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1bb9c21c76f6b627d28549034c490645.png new file mode 100644 index 0000000000000000000000000000000000000000..e296dc21383dce3533368dd94b8d786781d1c628 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1bb9c21c76f6b627d28549034c490645.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1ca8e9e2f4e34fe24d0acc58b95eeaca.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1ca8e9e2f4e34fe24d0acc58b95eeaca.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..7ee8ea67f07dfbc796b7d1a6002576c7755508e9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1ca8e9e2f4e34fe24d0acc58b95eeaca.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1cdc49ad298cd6b20ced476d1919c8cf.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1cdc49ad298cd6b20ced476d1919c8cf.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..304adfb58b8c1e907074a5fb5627a4e5959b4b7e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1cdc49ad298cd6b20ced476d1919c8cf.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1ce64748ea2954e8b35589f57518ceed.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1ce64748ea2954e8b35589f57518ceed.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..2d135bdf5967f5871669822e93e874bb042a0e52 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1ce64748ea2954e8b35589f57518ceed.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1f06465224672da09f26ca144007bac2.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1f06465224672da09f26ca144007bac2.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2a992c9a6fc4c74446491e5ff5d214d503234f0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/1f06465224672da09f26ca144007bac2.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/20ab9f17a1822825b950a26e1cda22ad.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/20ab9f17a1822825b950a26e1cda22ad.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..1ffc112e23d88b770c118a1a277430d1d4d4bc82 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/20ab9f17a1822825b950a26e1cda22ad.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/227bf995660be028a82c9a1b50bc189d.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/227bf995660be028a82c9a1b50bc189d.png new file mode 100644 index 0000000000000000000000000000000000000000..6808eba64329868caac227a8e3501c5b6e20b573 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/227bf995660be028a82c9a1b50bc189d.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2452ae696b6218d0ef1cedb845e318cf.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2452ae696b6218d0ef1cedb845e318cf.png new file mode 100644 index 0000000000000000000000000000000000000000..a3bf5e4909a016adeae1ae8f20b4da984b668725 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2452ae696b6218d0ef1cedb845e318cf.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/24856507516169f2fa9710e8439916cf.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/24856507516169f2fa9710e8439916cf.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4d6c7010f53bfe0684419990d7d3d2c1663896ff Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/24856507516169f2fa9710e8439916cf.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/26a8224b32c9cb8a9fbf130fa65eedf7.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/26a8224b32c9cb8a9fbf130fa65eedf7.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..6bcb21565087e93128a51d7eebb7c90ed260ddad Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/26a8224b32c9cb8a9fbf130fa65eedf7.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/27288aa6908cb218d9397abc6dbd9be7.png-1773986898918473.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/27288aa6908cb218d9397abc6dbd9be7.png-1773986898918473.webp new file mode 100644 index 0000000000000000000000000000000000000000..d8fa265fce088b42dbd292bbe460e893c01c2e13 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/27288aa6908cb218d9397abc6dbd9be7.png-1773986898918473.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/27288aa6908cb218d9397abc6dbd9be7.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/27288aa6908cb218d9397abc6dbd9be7.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..d8fa265fce088b42dbd292bbe460e893c01c2e13 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/27288aa6908cb218d9397abc6dbd9be7.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/27ca6ac0f40576e71db009122606579e.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/27ca6ac0f40576e71db009122606579e.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..88af10a04e24a1c7c60d558261d6a8e145b17d7b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/27ca6ac0f40576e71db009122606579e.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2ae2718f69f12a0515042163eb4a6608.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2ae2718f69f12a0515042163eb4a6608.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..7e80eec98e5bf1155ad5705d5fde78933cdbc778 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2ae2718f69f12a0515042163eb4a6608.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2b735da6cee8b2caff3ea2bde1227fc7.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2b735da6cee8b2caff3ea2bde1227fc7.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..684f2098f2ea8a35af8b1784a4331aa17436c716 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2b735da6cee8b2caff3ea2bde1227fc7.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2bc0cd770ae6e153afabf0072ab3ff5a.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2bc0cd770ae6e153afabf0072ab3ff5a.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..f251917ad61234c0dc3eac53b1bf3fbc1145b9a2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2bc0cd770ae6e153afabf0072ab3ff5a.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2f731eb1a603f45dd921933b3897a532.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2f731eb1a603f45dd921933b3897a532.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..1485663e9b3dc72383fcab305ee1ccd091bdde9c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/2f731eb1a603f45dd921933b3897a532.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3001cc9df73500c52fb097af3a6c26e9.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3001cc9df73500c52fb097af3a6c26e9.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f7c83caef1efee39fd399b5acea86bd75907515 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3001cc9df73500c52fb097af3a6c26e9.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/30996b1e6e7e76a9c7adc8b00872c0ee.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/30996b1e6e7e76a9c7adc8b00872c0ee.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..527322a2ac5a016f1264c76b16d7d633c57bbcd4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/30996b1e6e7e76a9c7adc8b00872c0ee.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/315c432c2469480b0199f9c27605f9f6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/315c432c2469480b0199f9c27605f9f6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4dd8f965aa7ca5035647ca5c8985ea3fac540df4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/315c432c2469480b0199f9c27605f9f6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/324bbc6cb468193f2925510f1cfb4831.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/324bbc6cb468193f2925510f1cfb4831.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..77de20edc79ac31212a3d1dd32bf7bdabfca4b8a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/324bbc6cb468193f2925510f1cfb4831.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/32f385c0e9d06bd5dc279fe63f9332fb.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/32f385c0e9d06bd5dc279fe63f9332fb.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..0c80ef87de8ed1698f421a5d9449fb45f50c4899 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/32f385c0e9d06bd5dc279fe63f9332fb.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/33a233c75601328d9e2d6cff3f06b750.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/33a233c75601328d9e2d6cff3f06b750.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e9e32f97c110180bdbbba522c5e37256bdb6818f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/33a233c75601328d9e2d6cff3f06b750.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/33b7e6ae199bf9b38ede7cd4f4ca071b.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/33b7e6ae199bf9b38ede7cd4f4ca071b.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..9747f5b59eb40f09abeeb9ab011cc6dd778b3f29 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/33b7e6ae199bf9b38ede7cd4f4ca071b.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3402456eab81f1db16a862edbb465b7f.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3402456eab81f1db16a862edbb465b7f.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..5643663917fb356564905b0432d23c7df88a9203 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3402456eab81f1db16a862edbb465b7f.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3435e52b1fc51aae8a564d18d32ee03a.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3435e52b1fc51aae8a564d18d32ee03a.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..de9d5e82429d4522b23d52d6edc31b389e724d9f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3435e52b1fc51aae8a564d18d32ee03a.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/36d29ff1690b9bc7fa9155d7c28ef5cb.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/36d29ff1690b9bc7fa9155d7c28ef5cb.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..874926efe4a936701a0e6c3e1c02230e96961297 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/36d29ff1690b9bc7fa9155d7c28ef5cb.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3859734d2ad637491c6e2b6fbe672dee.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3859734d2ad637491c6e2b6fbe672dee.png new file mode 100644 index 0000000000000000000000000000000000000000..f6d4191cc3e12bce6a4137d52ddb69bab12a14dd Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3859734d2ad637491c6e2b6fbe672dee.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/39f62a01ceec256695107d2bd2b38766.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/39f62a01ceec256695107d2bd2b38766.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..7a3daf8e48a643a81c97c34c8442fbcc36665481 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/39f62a01ceec256695107d2bd2b38766.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3a9af737b6c30317c07df075d54003a6-1773986935202478.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3a9af737b6c30317c07df075d54003a6-1773986935202478.png new file mode 100644 index 0000000000000000000000000000000000000000..3e685a0c12d967c77b01534edd6ab31925bddc99 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3a9af737b6c30317c07df075d54003a6-1773986935202478.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3a9af737b6c30317c07df075d54003a6.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3a9af737b6c30317c07df075d54003a6.png new file mode 100644 index 0000000000000000000000000000000000000000..3e685a0c12d967c77b01534edd6ab31925bddc99 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3a9af737b6c30317c07df075d54003a6.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3c1181cab4062f343e2abc053d3c05f0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3c1181cab4062f343e2abc053d3c05f0.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd99aa783be5e9a5f620b46c3c31605583a8920 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3c1181cab4062f343e2abc053d3c05f0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3d45c87c3edcb79a03f4da6c7d4de1cf.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3d45c87c3edcb79a03f4da6c7d4de1cf.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..6773535a8edb5e0a3200895b4a3a73fe47b01c44 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3d45c87c3edcb79a03f4da6c7d4de1cf.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3f753d24638a3c1766ace45bbba35a59.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3f753d24638a3c1766ace45bbba35a59.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..db9e2d930b6b420296072e03947e5bcd6fdc2277 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/3f753d24638a3c1766ace45bbba35a59.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/402b7ee57b52eb292f3bc6697fe99fc3.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/402b7ee57b52eb292f3bc6697fe99fc3.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e1d032936d21120453d91605896c0d16cc727d1e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/402b7ee57b52eb292f3bc6697fe99fc3.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/420b2b1741cfeeefaa3e2300a0a40118.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/420b2b1741cfeeefaa3e2300a0a40118.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7a93bbd753857e2662486b9b61fa331ca80faf Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/420b2b1741cfeeefaa3e2300a0a40118.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/425d9bfdd74d5421d395a08db3f66950.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/425d9bfdd74d5421d395a08db3f66950.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8f46d20d4b4ff34dba8cb2f98e6607829f6ff1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/425d9bfdd74d5421d395a08db3f66950.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/438a57733db2bdd265a97cc97f03c0b0.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/438a57733db2bdd265a97cc97f03c0b0.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..2e6b21180c2ed9ed4b9a17014e3d7b59414bfa7c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/438a57733db2bdd265a97cc97f03c0b0.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/44fe89dcd478d15aea9054135e420f06.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/44fe89dcd478d15aea9054135e420f06.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..02676bdbf93c7496637a918db95a11ec7f4ae778 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/44fe89dcd478d15aea9054135e420f06.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/45ec1e6ef7ed1887419e6356efd053ef.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/45ec1e6ef7ed1887419e6356efd053ef.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..52f372a906612f8b582bdbdf7544280cdac363aa Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/45ec1e6ef7ed1887419e6356efd053ef.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/46032b1060a6c04e8f4e64f4fc810e96.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/46032b1060a6c04e8f4e64f4fc810e96.png new file mode 100644 index 0000000000000000000000000000000000000000..ae9a96b1c47719ae8662c0753f54f25f7e8ea51e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/46032b1060a6c04e8f4e64f4fc810e96.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4737a54246ec75bddb610203c2f8e0e8.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4737a54246ec75bddb610203c2f8e0e8.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..5e45e84cd89d9aeb786d4e56d954333bb1d7c80c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4737a54246ec75bddb610203c2f8e0e8.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/48fd53cf5a4d87b9cf266f0d88eb3141.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/48fd53cf5a4d87b9cf266f0d88eb3141.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..dff0f4b01211e04fe0cd251bde6ae956b4a55faf Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/48fd53cf5a4d87b9cf266f0d88eb3141.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4a12c2abe01bba7a4619e6cd5c2fc371.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4a12c2abe01bba7a4619e6cd5c2fc371.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..63e4aa9a232673b767d6e7e1f4dd1f250d034c29 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4a12c2abe01bba7a4619e6cd5c2fc371.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4a526af4a1afc9abaaf43c33ad41af71.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4a526af4a1afc9abaaf43c33ad41af71.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..84e2b4bd8d5ac9e40e218cf8ec5773873127b0fd Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4a526af4a1afc9abaaf43c33ad41af71.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4b4af48ce0e58d16a98202a37bb28c54.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4b4af48ce0e58d16a98202a37bb28c54.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..0cb6ce0535f19222a395a919d70205b85f9b411a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4b4af48ce0e58d16a98202a37bb28c54.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4b8109931d7aa2e4c89d498560ba926c.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4b8109931d7aa2e4c89d498560ba926c.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..49c6c72bd270ef965bcea0b165b4b769cf9c1421 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4b8109931d7aa2e4c89d498560ba926c.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4cc28ee1aedd1fe5bfdc209dec9285ab.gif b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4cc28ee1aedd1fe5bfdc209dec9285ab.gif new file mode 100644 index 0000000000000000000000000000000000000000..81622da7408b87ac9cd3322b317b19c140148c08 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4cc28ee1aedd1fe5bfdc209dec9285ab.gif differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4d2af47d62e4606ace76edde31927bb2.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4d2af47d62e4606ace76edde31927bb2.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..5443ee094ac6d52e80d6a069c275bbcaf185e54a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4d2af47d62e4606ace76edde31927bb2.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4e4e34e5b0ada341be44090f6474c9a2.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4e4e34e5b0ada341be44090f6474c9a2.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..d361fb78aefe96a533d035f6d4329e068558a2a1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4e4e34e5b0ada341be44090f6474c9a2.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4ed2d82d693a12bbfb03e5441cdca635.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4ed2d82d693a12bbfb03e5441cdca635.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..322d8936580d438fe796acfae5fcf125608abf28 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/4ed2d82d693a12bbfb03e5441cdca635.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5097e4a3999a5fcf9863d75a9cbc347e.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5097e4a3999a5fcf9863d75a9cbc347e.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..515731c469441bcd72b1413707f24324a6708721 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5097e4a3999a5fcf9863d75a9cbc347e.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/50f0f765798e99d550a0430d411b0946.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/50f0f765798e99d550a0430d411b0946.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..94015924a1d03f68915e0d012a9b8f599d48b669 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/50f0f765798e99d550a0430d411b0946.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/510b883dbdd2fec10591c0017a435eb7.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/510b883dbdd2fec10591c0017a435eb7.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..33dd980bacc1dc6d9992ed358cae18e40f70f475 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/510b883dbdd2fec10591c0017a435eb7.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/510ec0f1477ea0b6e181a6aa2937c78b.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/510ec0f1477ea0b6e181a6aa2937c78b.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..6812da776e6656fa1290e9e74ef11fc6ee3995ee Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/510ec0f1477ea0b6e181a6aa2937c78b.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/512102ada2c617736826294bf77c6ce4.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/512102ada2c617736826294bf77c6ce4.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..0b3dfff7a46897576cf1d47e5369bf7edffc35eb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/512102ada2c617736826294bf77c6ce4.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/52578b8fc1ec8147688b3e3b2f4e5ffb.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/52578b8fc1ec8147688b3e3b2f4e5ffb.png new file mode 100644 index 0000000000000000000000000000000000000000..551a283bf8aea9a0e1bd46e187391d9b3026c1c2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/52578b8fc1ec8147688b3e3b2f4e5ffb.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5274f57b01a48863cb00172fdc737106.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5274f57b01a48863cb00172fdc737106.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..d9592174352588468600337d17d977509f243726 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5274f57b01a48863cb00172fdc737106.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/54061b4b693cb8fdcc15f86fc6671b1d.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/54061b4b693cb8fdcc15f86fc6671b1d.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..607e60ef98c1af972da147d93ee8b0cab2f3c1a2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/54061b4b693cb8fdcc15f86fc6671b1d.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5577bcec9bbe93b39c2d1f0c05e762ac.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5577bcec9bbe93b39c2d1f0c05e762ac.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..9e40495ed92fab402e845382400bdcf323e1af5c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5577bcec9bbe93b39c2d1f0c05e762ac.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5754bb2455feab942130020c327b18d7.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5754bb2455feab942130020c327b18d7.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..90d75b362b516486a73f15a0a190595ecc3f3455 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5754bb2455feab942130020c327b18d7.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/593e4f68fc3a109bcf4bca1fe3b4b336.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/593e4f68fc3a109bcf4bca1fe3b4b336.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..8ffea84bfce9cbe84e80b20942a3269149f76d31 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/593e4f68fc3a109bcf4bca1fe3b4b336.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/595c188d26c58a3bb01d791ca6e8f107.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/595c188d26c58a3bb01d791ca6e8f107.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b3663216090abed7562bbe2f64f569d7d8c84ede Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/595c188d26c58a3bb01d791ca6e8f107.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5ac97d7e107fc143f9ea837fc8deec40.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5ac97d7e107fc143f9ea837fc8deec40.png new file mode 100644 index 0000000000000000000000000000000000000000..03eec4cd098f6134992627b481c6473a7bf171f4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5ac97d7e107fc143f9ea837fc8deec40.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5b2528d30125996b3ef771cc0fe190bd-1773986976116484.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5b2528d30125996b3ef771cc0fe190bd-1773986976116484.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c00d3963956022b2d2eb29c2570dd7fbc94efb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5b2528d30125996b3ef771cc0fe190bd-1773986976116484.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5b2528d30125996b3ef771cc0fe190bd.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5b2528d30125996b3ef771cc0fe190bd.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c00d3963956022b2d2eb29c2570dd7fbc94efb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5b2528d30125996b3ef771cc0fe190bd.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5b9062733cfc0bdca6f5cf5835afeded.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5b9062733cfc0bdca6f5cf5835afeded.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..5177274e75ba318dbd45731cfcda3e06ba25b56c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5b9062733cfc0bdca6f5cf5835afeded.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5bb425423f704e52e923d7fa0f09801c.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5bb425423f704e52e923d7fa0f09801c.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e3b6a1d8a30adfe73a0159a22c98cfa4b1a6cc80 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5bb425423f704e52e923d7fa0f09801c.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5be4a1069ac9c9feda69598c5924f0cf.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5be4a1069ac9c9feda69598c5924f0cf.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..93ce56cc14d242a8496dedf3473b683d01ce4ace Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5be4a1069ac9c9feda69598c5924f0cf.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5cbe82c2f1374759488ebb44dc402ede.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5cbe82c2f1374759488ebb44dc402ede.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..2ab2f7bc696bc224006f3bae0164a03777b90e31 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5cbe82c2f1374759488ebb44dc402ede.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5d0f34dedffcd9ebf995d41c581194d3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5d0f34dedffcd9ebf995d41c581194d3.png new file mode 100644 index 0000000000000000000000000000000000000000..7caf243e4a6504ed1ae68d841f3afea51b7f173e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5d0f34dedffcd9ebf995d41c581194d3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5ebebd77970990400cb64b509e76fd5d.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5ebebd77970990400cb64b509e76fd5d.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad9e4757526dd117122f3ca95c4214ebf7c8dbf Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/5ebebd77970990400cb64b509e76fd5d.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/611e83d6a105f9b04b5a3ed0352af2c9.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/611e83d6a105f9b04b5a3ed0352af2c9.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..bc42a5f881b6dba0864bba2651916f555327ae2d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/611e83d6a105f9b04b5a3ed0352af2c9.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6122cd10768b7ac609bdfe1839e8bc29.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6122cd10768b7ac609bdfe1839e8bc29.png new file mode 100644 index 0000000000000000000000000000000000000000..196432d8f8cee9bb4037e374a4dd75a2ff68d97f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6122cd10768b7ac609bdfe1839e8bc29.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/64dcdb83dcad7defc16ab9fb309df6cb.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/64dcdb83dcad7defc16ab9fb309df6cb.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..faf054f7e89f847bb0e3147af7cc6c4a5bfd535e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/64dcdb83dcad7defc16ab9fb309df6cb.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6553c5748791f12deaaa74e6e82a0ff8.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6553c5748791f12deaaa74e6e82a0ff8.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..561ca983b878863d2d167bd52a2d5959c94c9ff8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6553c5748791f12deaaa74e6e82a0ff8.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/65dab45c01ad1ac07edfb4ad6f2b5ccb.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/65dab45c01ad1ac07edfb4ad6f2b5ccb.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..c4eaab76278c24d2e12f06c2ce3ab28155559455 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/65dab45c01ad1ac07edfb4ad6f2b5ccb.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/66dc3e44ed5e579aab869f4f459c23c0.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/66dc3e44ed5e579aab869f4f459c23c0.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..ffb0a572c440847ed2e87b9ed5cb73be9a9667bf Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/66dc3e44ed5e579aab869f4f459c23c0.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/68f407307e157693b9af739cc7523633.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/68f407307e157693b9af739cc7523633.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b3267a945c80502990feaa4a7e0fdd27d9f2cad0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/68f407307e157693b9af739cc7523633.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/69faece6624bc02a5bb69d73448b66a2.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/69faece6624bc02a5bb69d73448b66a2.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..64160eaa29b21eada7b0b36856f7538fca51f2dd Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/69faece6624bc02a5bb69d73448b66a2.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6a5780b8ebe8af4a8cd7013f0b0cbccc.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6a5780b8ebe8af4a8cd7013f0b0cbccc.png new file mode 100644 index 0000000000000000000000000000000000000000..f24d57e540463b1f7920e0e65c7e0c6f823a56cd Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6a5780b8ebe8af4a8cd7013f0b0cbccc.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6aabff507cb8515437c0bd2d06deffd7.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6aabff507cb8515437c0bd2d06deffd7.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..2aa32960cd374820b973fdf661bbc9825c7602ac Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6aabff507cb8515437c0bd2d06deffd7.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6c7e07f28fc9b1898124b0cd3a9afbbf.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6c7e07f28fc9b1898124b0cd3a9afbbf.png new file mode 100644 index 0000000000000000000000000000000000000000..82a3dbd85a254ea0b01a2b7f296e7c284d3c3793 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6c7e07f28fc9b1898124b0cd3a9afbbf.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6d6cdacbc1fd2ca9e002ec5cfbfc6dfb.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6d6cdacbc1fd2ca9e002ec5cfbfc6dfb.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f904ce18c0d0d51377c85a9e2e8d45e7e79186 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6d6cdacbc1fd2ca9e002ec5cfbfc6dfb.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6e449047a040334f2dd54ad06e21b2e0.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6e449047a040334f2dd54ad06e21b2e0.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2658a2ab78a76b1a70c8ab6e13743669e1ed30b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6e449047a040334f2dd54ad06e21b2e0.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6fc649a96daa06e96aa12b2099f8530a.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6fc649a96daa06e96aa12b2099f8530a.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..69b291fdeeebf1da4fde62a43076f3b7adad74f2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/6fc649a96daa06e96aa12b2099f8530a.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/70a4dfbdddd90c4c40fc19f0d1e3e3c1.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/70a4dfbdddd90c4c40fc19f0d1e3e3c1.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..a3afa6da29cf7ff65083f857a36b3687f73f0c4d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/70a4dfbdddd90c4c40fc19f0d1e3e3c1.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/70e14e117ae4517bf591ddfb4cca971e.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/70e14e117ae4517bf591ddfb4cca971e.png new file mode 100644 index 0000000000000000000000000000000000000000..eb70e571885b04a099b3564a53d063a9cac6c953 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/70e14e117ae4517bf591ddfb4cca971e.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/74d92be08a1e6de8e1c0372bb7d3bba3.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/74d92be08a1e6de8e1c0372bb7d3bba3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca98148bc6e1c7fc99ded1504babc4c7650a69ce Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/74d92be08a1e6de8e1c0372bb7d3bba3.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/75f997526c0fc1ecc1f879b6701cfe3d.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/75f997526c0fc1ecc1f879b6701cfe3d.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..bf84dab704885ac7b236765cfc28dcd265e3675e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/75f997526c0fc1ecc1f879b6701cfe3d.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7655b11d17fc36444f887e66f7bf11f7.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7655b11d17fc36444f887e66f7bf11f7.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..f181b3ebb815f7534bf2e1b6648b100ae7ce5807 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7655b11d17fc36444f887e66f7bf11f7.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7d663c39dc8387a314e272c14ad9dec0.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7d663c39dc8387a314e272c14ad9dec0.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..bda81ccfa7b5c53d007dab22fdf30b86b8dc231b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7d663c39dc8387a314e272c14ad9dec0.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7f0bea6192c953fb2ee9194de4fa9a42-1773986991785487.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7f0bea6192c953fb2ee9194de4fa9a42-1773986991785487.png new file mode 100644 index 0000000000000000000000000000000000000000..155b2c9705a0707a0de3f85d5c2ba90dfadd0cb3 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7f0bea6192c953fb2ee9194de4fa9a42-1773986991785487.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7f0bea6192c953fb2ee9194de4fa9a42.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7f0bea6192c953fb2ee9194de4fa9a42.png new file mode 100644 index 0000000000000000000000000000000000000000..155b2c9705a0707a0de3f85d5c2ba90dfadd0cb3 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7f0bea6192c953fb2ee9194de4fa9a42.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7f82d916a28e4c14bec848811c4fd3bf.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7f82d916a28e4c14bec848811c4fd3bf.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..6063924d1fe5d8f7e35f00c2d99d38f0daf534d8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/7f82d916a28e4c14bec848811c4fd3bf.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/80852998fc77dd460303aeb868f07949.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/80852998fc77dd460303aeb868f07949.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..fa82e593d5d8f6ffa49276fd989a8b40f1dc207e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/80852998fc77dd460303aeb868f07949.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/83a98f9e3ccef04bb4be2f86b7b7f6fc.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/83a98f9e3ccef04bb4be2f86b7b7f6fc.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3c6af54265d766178c889971a936c347fee74b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/83a98f9e3ccef04bb4be2f86b7b7f6fc.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/88e7f710b29944ba6ab0983d4b399a3a.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/88e7f710b29944ba6ab0983d4b399a3a.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..cf33232683f585b0ab150e33df0f5b79af65dcb4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/88e7f710b29944ba6ab0983d4b399a3a.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/8983dea65b1d9e3ac41c6747db0bb2f8.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/8983dea65b1d9e3ac41c6747db0bb2f8.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..94d3ca76f7a1a67df0338745884fc3d1a78cd938 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/8983dea65b1d9e3ac41c6747db0bb2f8.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/8b2c17353c7efbb47f360cdd366c6c11.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/8b2c17353c7efbb47f360cdd366c6c11.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..fd7f64a8d7e2bdc461bbaaf81ada558ee9bf6642 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/8b2c17353c7efbb47f360cdd366c6c11.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/8ccbcd237f2d726b4e4941d7d18c73ff.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/8ccbcd237f2d726b4e4941d7d18c73ff.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..74958114bcfc2b9ba4b78ca1b7fe3b42043a1138 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/8ccbcd237f2d726b4e4941d7d18c73ff.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/8ff5b33d62b230761d232968c413f544.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/8ff5b33d62b230761d232968c413f544.png new file mode 100644 index 0000000000000000000000000000000000000000..7db02fe329b841a6134a2ccf745a8934a01d6270 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/8ff5b33d62b230761d232968c413f544.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/91db5197576e6a1a167c4a416f8db258.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/91db5197576e6a1a167c4a416f8db258.png new file mode 100644 index 0000000000000000000000000000000000000000..d4c363638c50b0294e1c65bd183d975fb3a37c5f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/91db5197576e6a1a167c4a416f8db258.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9303e1a9e34a395ed29f97cd0ce6b030.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9303e1a9e34a395ed29f97cd0ce6b030.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e6ee93620a9d5eaa76af08c2bf1653733d350b4a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9303e1a9e34a395ed29f97cd0ce6b030.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/930cf5c68d96f707dcb3d0645919fa53.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/930cf5c68d96f707dcb3d0645919fa53.png new file mode 100644 index 0000000000000000000000000000000000000000..b0fc5fec402cf7a6c13317bd38a589a95e63d53c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/930cf5c68d96f707dcb3d0645919fa53.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/94a5074cae52954040b2bf3b4e39272a.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/94a5074cae52954040b2bf3b4e39272a.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..8b103f166c1ca5359cbfd1d108f5f440d89f9776 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/94a5074cae52954040b2bf3b4e39272a.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/955046fbe2262450a0dc96cd79ae3a31.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/955046fbe2262450a0dc96cd79ae3a31.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..6a0cc2ebb1c88c4627818a1b901a866505dbd071 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/955046fbe2262450a0dc96cd79ae3a31.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/984f7e3b42956da500f4485ca441b33d.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/984f7e3b42956da500f4485ca441b33d.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..f8d675b2df71aeb5ff182dcf6be515637f32e816 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/984f7e3b42956da500f4485ca441b33d.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/99549676e0a78d799b0a641d8d7392ee.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/99549676e0a78d799b0a641d8d7392ee.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..979aee2e109a61356fe6adb4bb47145a1feeea65 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/99549676e0a78d799b0a641d8d7392ee.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9977e3da96b0b58adc0f72f0b717ab35.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9977e3da96b0b58adc0f72f0b717ab35.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..70eec1c960005b82267d5d1d6dfdccea0738fd26 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9977e3da96b0b58adc0f72f0b717ab35.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9a19e62e3d0934e5594e707abab627fa.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9a19e62e3d0934e5594e707abab627fa.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..21af7f90d798afa121038028f633b44198b69cc4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9a19e62e3d0934e5594e707abab627fa.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9af2dd2f121d88fdcaf06f7fb2207939.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9af2dd2f121d88fdcaf06f7fb2207939.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..9443b6357a11e55d2d94b9456a99a315250bf668 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9af2dd2f121d88fdcaf06f7fb2207939.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9c5574c546226a9e7a0ecbe3f819d5f6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9c5574c546226a9e7a0ecbe3f819d5f6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..9bff7304688a8a3a9a180f8a0662ca383b310ff6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/9c5574c546226a9e7a0ecbe3f819d5f6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/PixPin_2026-03-19_16-40-15.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/PixPin_2026-03-19_16-40-15.png new file mode 100644 index 0000000000000000000000000000000000000000..0b6051efbe050a2131d58adc9783774adbc0bf0e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/PixPin_2026-03-19_16-40-15.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a0f2a53fd7ea2b04eef8e4eb7e2e9f8b-17739887746642.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a0f2a53fd7ea2b04eef8e4eb7e2e9f8b-17739887746642.png new file mode 100644 index 0000000000000000000000000000000000000000..5152f44471519d723fd4c0efa39432778662b962 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a0f2a53fd7ea2b04eef8e4eb7e2e9f8b-17739887746642.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a0f2a53fd7ea2b04eef8e4eb7e2e9f8b.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a0f2a53fd7ea2b04eef8e4eb7e2e9f8b.png new file mode 100644 index 0000000000000000000000000000000000000000..5152f44471519d723fd4c0efa39432778662b962 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a0f2a53fd7ea2b04eef8e4eb7e2e9f8b.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a1e88aaa4044d96d8f56e703c6751ff5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a1e88aaa4044d96d8f56e703c6751ff5.png new file mode 100644 index 0000000000000000000000000000000000000000..46d6ed3c5461b9cd949a86339e4848c36eefd862 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a1e88aaa4044d96d8f56e703c6751ff5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a254ea10327507a3d6488e28cf82020f.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a254ea10327507a3d6488e28cf82020f.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..0528ce651edbc668acf2addf80c96fae8a09da88 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a254ea10327507a3d6488e28cf82020f.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a581f4fefe821c34af33c56bf04aabbf.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a581f4fefe821c34af33c56bf04aabbf.png new file mode 100644 index 0000000000000000000000000000000000000000..3404ca2a584c09c2cfa416f2fb7c9dc25744dbef Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a581f4fefe821c34af33c56bf04aabbf.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a6595e6eb91b1dc43f1584ade841294c.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a6595e6eb91b1dc43f1584ade841294c.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..de9c7749640e7b97ac7b2774a3e03a7458e8d622 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a6595e6eb91b1dc43f1584ade841294c.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a8d74afeee34f7c8be07e6186115339a.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a8d74afeee34f7c8be07e6186115339a.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..6f7f5410019b2c4f7f210b2cbbcd7a55a501785f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a8d74afeee34f7c8be07e6186115339a.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a90c291cd071733054ce1273e3c7b0c5.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a90c291cd071733054ce1273e3c7b0c5.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..24f81e2b4b3226ad8109c08529952f7b9c7b0e21 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a90c291cd071733054ce1273e3c7b0c5.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a9757659e0e202812fde0de38e6655e1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a9757659e0e202812fde0de38e6655e1.png new file mode 100644 index 0000000000000000000000000000000000000000..65dddc2fe35bc56cd4f3fc2791b64ae05452ad74 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/a9757659e0e202812fde0de38e6655e1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/aaac7b5aedc7c08951beaaf8ba3c4060.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/aaac7b5aedc7c08951beaaf8ba3c4060.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b73e7201d3480e9c95177c7581a310144815a06c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/aaac7b5aedc7c08951beaaf8ba3c4060.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ab5478cb1594321a38021e7cbab86fdf.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ab5478cb1594321a38021e7cbab86fdf.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..86ca45a391b84623a44736802238426a8056703b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ab5478cb1594321a38021e7cbab86fdf.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ae02d164869c6e3b85d5947710cc0eaa.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ae02d164869c6e3b85d5947710cc0eaa.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..f2de47e98b435a2055a098aa42acff8b0d0881aa Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ae02d164869c6e3b85d5947710cc0eaa.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/aeb43797cc157a75a1a1b0c31a574b2b.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/aeb43797cc157a75a1a1b0c31a574b2b.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..81d4880f1b22c7d03cd61010aa42967bb882291c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/aeb43797cc157a75a1a1b0c31a574b2b.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/af02f83aa65af8579471deb8fed67d35-1773986955724481.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/af02f83aa65af8579471deb8fed67d35-1773986955724481.png new file mode 100644 index 0000000000000000000000000000000000000000..2eac8e5f696fa1272b28ca954338c40329857639 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/af02f83aa65af8579471deb8fed67d35-1773986955724481.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/af02f83aa65af8579471deb8fed67d35.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/af02f83aa65af8579471deb8fed67d35.png new file mode 100644 index 0000000000000000000000000000000000000000..2eac8e5f696fa1272b28ca954338c40329857639 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/af02f83aa65af8579471deb8fed67d35.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/afeeb4663e74f5a72239cefc12e3d44a.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/afeeb4663e74f5a72239cefc12e3d44a.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..7efe94df2192b6fcda4e60d08ee49ba17706364b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/afeeb4663e74f5a72239cefc12e3d44a.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b0211f25d7d951f9c78c57d6b7f32433.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b0211f25d7d951f9c78c57d6b7f32433.png new file mode 100644 index 0000000000000000000000000000000000000000..9e5fd45258de4d5401a6f611a2853cc987e41362 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b0211f25d7d951f9c78c57d6b7f32433.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b1ee7a317f5e4663f43115d6b18e2e47.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b1ee7a317f5e4663f43115d6b18e2e47.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..bee79ad580b1805679b5a3627c87d23af4c8ed28 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b1ee7a317f5e4663f43115d6b18e2e47.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b340cf76e3a6819840e0d9a14b3dc757.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b340cf76e3a6819840e0d9a14b3dc757.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..a5324d3ab629c150c4530fe917fc499811274dd5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b340cf76e3a6819840e0d9a14b3dc757.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b47ff7c13c5c11a9f9fef3ed0cf62f0d-1773969753039153.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b47ff7c13c5c11a9f9fef3ed0cf62f0d-1773969753039153.png new file mode 100644 index 0000000000000000000000000000000000000000..5781736e8ba923233bcb12604948e489904daa1c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b47ff7c13c5c11a9f9fef3ed0cf62f0d-1773969753039153.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b47ff7c13c5c11a9f9fef3ed0cf62f0d.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b47ff7c13c5c11a9f9fef3ed0cf62f0d.png new file mode 100644 index 0000000000000000000000000000000000000000..5781736e8ba923233bcb12604948e489904daa1c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b47ff7c13c5c11a9f9fef3ed0cf62f0d.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b4d4c6cd96f9cfbe174886e14655a103.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b4d4c6cd96f9cfbe174886e14655a103.png new file mode 100644 index 0000000000000000000000000000000000000000..f640f271924bd4c1e7f703af6793ccc88f75c643 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b4d4c6cd96f9cfbe174886e14655a103.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b8311fa74f03789666d3b9ec85152ad6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b8311fa74f03789666d3b9ec85152ad6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e01374f738063959c0f319c241f9a0e12bba00ef Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b8311fa74f03789666d3b9ec85152ad6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b8e602f4a318ee83af21cfc8f992a895.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b8e602f4a318ee83af21cfc8f992a895.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..8a10b1641b648bce7288e9d6779ab2d752e104ce Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/b8e602f4a318ee83af21cfc8f992a895.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bcac000b56cedd97b77b567e0708d1b9.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bcac000b56cedd97b77b567e0708d1b9.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..5c0aafb095debff20b5a552f187eb38d2dad471e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bcac000b56cedd97b77b567e0708d1b9.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bce005a822030b9779a20ea74242be26.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bce005a822030b9779a20ea74242be26.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..946703b0c5625d9e6764acfbf6eb8dc4f2787a4c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bce005a822030b9779a20ea74242be26.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bd6abc93cf45057acbc90e8b14b54676.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bd6abc93cf45057acbc90e8b14b54676.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..327d086c3525ea6058aee52e3da3968c78f6e67c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bd6abc93cf45057acbc90e8b14b54676.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bedace9c630ff0c74ccfec255d4fc687.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bedace9c630ff0c74ccfec255d4fc687.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..402911ee40c39b4a8143a0bb2aeec1a4aea536fc Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bedace9c630ff0c74ccfec255d4fc687.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bff97ef4cd665bc5d881f0c1495254fe.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bff97ef4cd665bc5d881f0c1495254fe.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..c03d5b39d539420b48a1dacf13335a1057258d4b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/bff97ef4cd665bc5d881f0c1495254fe.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c299ae697edb303465b8f4b9753159ab.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c299ae697edb303465b8f4b9753159ab.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..d0d038d3d0aab6de9916015a57df1bba3b479b17 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c299ae697edb303465b8f4b9753159ab.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c40bbda76b13f9dd252f8cd8e5f1bbc2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c40bbda76b13f9dd252f8cd8e5f1bbc2.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b8acaa5e022dbddba933653d016f93fba9ed07 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c40bbda76b13f9dd252f8cd8e5f1bbc2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c43b8fcd3d969997d65a9b1996a4ce98.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c43b8fcd3d969997d65a9b1996a4ce98.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..c38fdcb30a03baee1d602db65d52e8dacd0f8af9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c43b8fcd3d969997d65a9b1996a4ce98.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c4d4f11b0147e36903981ca5fa8988ca.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c4d4f11b0147e36903981ca5fa8988ca.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..2d91a5425b7b75cc8bf2a9c1ce15689a61625490 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c4d4f11b0147e36903981ca5fa8988ca.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c54c8929d806dcec111710dcc9959d7e.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c54c8929d806dcec111710dcc9959d7e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8ab2e5759a8d1d02ba3cdf844a03e3ae53022be Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c54c8929d806dcec111710dcc9959d7e.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c5716770a6a860272da14e84755c460c.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c5716770a6a860272da14e84755c460c.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4504209728d8707d5876281347e1f9dd8a438a88 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c5716770a6a860272da14e84755c460c.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c7b52112cc830fd88517c47b82a620bb.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c7b52112cc830fd88517c47b82a620bb.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..1fb0f7a83c4fd64a5e521bd84d39cb8169dd7d17 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c7b52112cc830fd88517c47b82a620bb.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c819206211513b61a1f0e04d5cba7da0.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c819206211513b61a1f0e04d5cba7da0.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..f0e88b79760c252c774160d730b36792cd9f42a7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c819206211513b61a1f0e04d5cba7da0.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c9125cde7fe4ffc428bc5948e53e8fc2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c9125cde7fe4ffc428bc5948e53e8fc2.png new file mode 100644 index 0000000000000000000000000000000000000000..4a8ffcb69f8c3ddc8761c11d7a583ca0a1087621 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c9125cde7fe4ffc428bc5948e53e8fc2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c9ea2290b28bed4040f4aaeb335146bd.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c9ea2290b28bed4040f4aaeb335146bd.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..fd769849259c7dfe210c5a851605e292e7ad34ed Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/c9ea2290b28bed4040f4aaeb335146bd.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/cad4fd9e64eebc69befa4e7e8b742b39-1773969845975166.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/cad4fd9e64eebc69befa4e7e8b742b39-1773969845975166.png new file mode 100644 index 0000000000000000000000000000000000000000..093bbc7616e90fe1b92eded880e855dbcb8b2f88 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/cad4fd9e64eebc69befa4e7e8b742b39-1773969845975166.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/cad4fd9e64eebc69befa4e7e8b742b39.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/cad4fd9e64eebc69befa4e7e8b742b39.png new file mode 100644 index 0000000000000000000000000000000000000000..093bbc7616e90fe1b92eded880e855dbcb8b2f88 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/cad4fd9e64eebc69befa4e7e8b742b39.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/cb5ffa212775a0c5f948c4334eda90e0.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/cb5ffa212775a0c5f948c4334eda90e0.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..06a9dc54c2addad196720ef1565ae5a94ea30ae3 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/cb5ffa212775a0c5f948c4334eda90e0.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ccc08ac82ec7dac573e6f9349f0734cb.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ccc08ac82ec7dac573e6f9349f0734cb.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..8cc547b3c97bcc292cb5f7a21abfbe4f36262d87 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ccc08ac82ec7dac573e6f9349f0734cb.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ce628ca5b5f013d0bd2c54dec3f39f77.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ce628ca5b5f013d0bd2c54dec3f39f77.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..dbfed3bff72e5d30ab7b1589e4058e693299e749 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ce628ca5b5f013d0bd2c54dec3f39f77.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/cea61b21021247ca88cfa42ad16bc3db.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/cea61b21021247ca88cfa42ad16bc3db.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..83a46ec2304d34155802fd0d626098401a52e92d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/cea61b21021247ca88cfa42ad16bc3db.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d036ab54b5385f254c02ca64e3502464.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d036ab54b5385f254c02ca64e3502464.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..181a51a3b8e7fcf757fd0c7c24ac96eff62dd4e8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d036ab54b5385f254c02ca64e3502464.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d2e6dba179d3f9c8dd056aed0c64c86d.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d2e6dba179d3f9c8dd056aed0c64c86d.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..13972fcab7b4e3d09c261d6a122f43ad8dac0bda Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d2e6dba179d3f9c8dd056aed0c64c86d.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d4b83a9b52f26e2421087a305a4ec23d.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d4b83a9b52f26e2421087a305a4ec23d.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..3853abdbc2e0ebb59a9d7daacc780c9425aab361 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d4b83a9b52f26e2421087a305a4ec23d.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d4e34c30d5a12ab8b922da3b5326e3b0.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d4e34c30d5a12ab8b922da3b5326e3b0.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..c9b1299c23490b452aa155d2b19a1978ccc1982d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d4e34c30d5a12ab8b922da3b5326e3b0.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d557a60e6f92040ab333657dd40c505e.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d557a60e6f92040ab333657dd40c505e.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..cb1b51443e267b22ff62fad6624ab29e41a4a748 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d557a60e6f92040ab333657dd40c505e.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d8b950e5356f7b15885c0088c5055ca3.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d8b950e5356f7b15885c0088c5055ca3.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b43190ceac35ae7bdcc9e6180f0a8e513494ae9a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d8b950e5356f7b15885c0088c5055ca3.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d8d7a041997130028f06f659f0adbe5d-1773970133294177.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d8d7a041997130028f06f659f0adbe5d-1773970133294177.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8287cdc5165c00fbe80b825492bda60af96283 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d8d7a041997130028f06f659f0adbe5d-1773970133294177.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d8d7a041997130028f06f659f0adbe5d.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d8d7a041997130028f06f659f0adbe5d.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8287cdc5165c00fbe80b825492bda60af96283 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d8d7a041997130028f06f659f0adbe5d.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d9a87377508d2a0195942a51ef3912a2.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d9a87377508d2a0195942a51ef3912a2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d0c7f3e5c4bdeab6e9bb53782ec389570f9740cd Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/d9a87377508d2a0195942a51ef3912a2.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/da46d0ad52808ca58c6f29945a354af1.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/da46d0ad52808ca58c6f29945a354af1.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c69e1ea50acc08dd5aa72059910e8dc6e8009e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/da46d0ad52808ca58c6f29945a354af1.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/daf10f8401ebca50d570465135f65ccb.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/daf10f8401ebca50d570465135f65ccb.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..97c37f6073556ac7529b11215ed6ce43c3457e03 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/daf10f8401ebca50d570465135f65ccb.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/dc51de916134f3b319c773ce90ab4e44.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/dc51de916134f3b319c773ce90ab4e44.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..fed99d108342cb42617c7b45ba5261a00dfc5b6c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/dc51de916134f3b319c773ce90ab4e44.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/dcb21b6831b0f9efb366a3d49131aa6e.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/dcb21b6831b0f9efb366a3d49131aa6e.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..33dfe26e0cc1cb6542deacaa14b3b5cd0d0af42e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/dcb21b6831b0f9efb366a3d49131aa6e.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/dd47a1f58ba8bcd1399acb39d749dc40.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/dd47a1f58ba8bcd1399acb39d749dc40.png new file mode 100644 index 0000000000000000000000000000000000000000..636b4f91d5698398a2015e6189c642cc5a0b08c4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/dd47a1f58ba8bcd1399acb39d749dc40.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ddc6913118e768909297431f9fd03a3f.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ddc6913118e768909297431f9fd03a3f.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..f0d42ab8639fc4da4195fc6d82df6c45cf826aa7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ddc6913118e768909297431f9fd03a3f.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/de5b1d6fb72c8a097e2fcf37d350991a.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/de5b1d6fb72c8a097e2fcf37d350991a.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e340019e252dc73677028b656ff1eb65cddb6133 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/de5b1d6fb72c8a097e2fcf37d350991a.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e15437ada66a0554d3ae1c56a63fbce7.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e15437ada66a0554d3ae1c56a63fbce7.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..1fcb960e20eda1d5c8bd59be141f6a8670135ac1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e15437ada66a0554d3ae1c56a63fbce7.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e192267a1f21e8a0d2482085251aed53.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e192267a1f21e8a0d2482085251aed53.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..7652be2220fb7ae57930a8572a4f1dff4e22d6b1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e192267a1f21e8a0d2482085251aed53.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e3fa90869cb1f47390d1cc1926f086e3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e3fa90869cb1f47390d1cc1926f086e3.png new file mode 100644 index 0000000000000000000000000000000000000000..289709247f2d08998ce2b116e192036b57288fac Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e3fa90869cb1f47390d1cc1926f086e3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e6e76cfc33fc1fe3746689a55533f72b.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e6e76cfc33fc1fe3746689a55533f72b.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e339f578b7676d5b74711263486af161620b16c9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e6e76cfc33fc1fe3746689a55533f72b.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e87eb1c737337e6aed5babe20d62fb20.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e87eb1c737337e6aed5babe20d62fb20.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..35499e68996acbca437ed3728a0cb2866916121b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e87eb1c737337e6aed5babe20d62fb20.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e8afd457aff7482352cbe5644affa260.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e8afd457aff7482352cbe5644affa260.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4d7a71275ad1a35fc21750d3aa278c08821e6a6e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e8afd457aff7482352cbe5644affa260.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e8ca31a7415b5baeb61902814cce0d94.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e8ca31a7415b5baeb61902814cce0d94.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..0acc20e65a72bd4cc15aec579515b7672912a6b7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/e8ca31a7415b5baeb61902814cce0d94.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ec5bcb5833d1cf243231e11b3c96915e.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ec5bcb5833d1cf243231e11b3c96915e.png new file mode 100644 index 0000000000000000000000000000000000000000..4426fe8500651816877f5972f8566d3a20c9c2b7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ec5bcb5833d1cf243231e11b3c96915e.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ee6b255cc6f6f18080f5dc584f519933.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ee6b255cc6f6f18080f5dc584f519933.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..969402d2d75305864a22fc61d0d04e8b52e9f547 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ee6b255cc6f6f18080f5dc584f519933.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ee70dc33de543606b606225942978f9b.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ee70dc33de543606b606225942978f9b.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4a6c96aefc227bc6c7687edcce221a93a3ac5d6e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ee70dc33de543606b606225942978f9b.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ef9b027f7ff61d443dfbedb4a945d366.png-1773986364265452.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ef9b027f7ff61d443dfbedb4a945d366.png-1773986364265452.webp new file mode 100644 index 0000000000000000000000000000000000000000..34cd0b8cc214b6b1bf92df10463452c8d3294572 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ef9b027f7ff61d443dfbedb4a945d366.png-1773986364265452.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ef9b027f7ff61d443dfbedb4a945d366.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ef9b027f7ff61d443dfbedb4a945d366.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..34cd0b8cc214b6b1bf92df10463452c8d3294572 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/ef9b027f7ff61d443dfbedb4a945d366.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f0f119fce1669d5d2ee329c8fa1b86ea.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f0f119fce1669d5d2ee329c8fa1b86ea.png new file mode 100644 index 0000000000000000000000000000000000000000..4d962447002768a0ddc9178e8a6521590d46a4fe Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f0f119fce1669d5d2ee329c8fa1b86ea.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f14c7e58bf108cb2d28508928aa127ed.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f14c7e58bf108cb2d28508928aa127ed.png new file mode 100644 index 0000000000000000000000000000000000000000..3f0d1c1ca319c8ed6ac98261a0d493b96c0f259c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f14c7e58bf108cb2d28508928aa127ed.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f24c792886895b8f31f22b73a09f838b.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f24c792886895b8f31f22b73a09f838b.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6f3c8084be114a4b3ef137cd64e97718baebe0 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f24c792886895b8f31f22b73a09f838b.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f2d585187f3f90a78d8f8495a1e44022.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f2d585187f3f90a78d8f8495a1e44022.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..52ebf65ef9f41405cb863e792c7e7e0a87b1ea90 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f2d585187f3f90a78d8f8495a1e44022.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f325b3619e91ad9797139e87109a8261.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f325b3619e91ad9797139e87109a8261.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..032cf62374b837bb2418a80968fb540cba20ef25 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f325b3619e91ad9797139e87109a8261.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f53d245ee1478b34c5d611352b589e73.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f53d245ee1478b34c5d611352b589e73.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..1f9ab2ffdfa5db7656013b5b1ad6338e1202719b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f53d245ee1478b34c5d611352b589e73.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f57ea6aaacf188f7e41f3fdee78bd800.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f57ea6aaacf188f7e41f3fdee78bd800.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..6896f55cf5d70cb7bcb2f6e2f81848fc2deaaf2a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f57ea6aaacf188f7e41f3fdee78bd800.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f5ca3c4f077d4907b03220560fa98d12.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f5ca3c4f077d4907b03220560fa98d12.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..a963cc6afc21a04e40b5452f1e540ebfb2f5fb84 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f5ca3c4f077d4907b03220560fa98d12.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f69e205880c0179196575c7674dbecbb.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f69e205880c0179196575c7674dbecbb.png new file mode 100644 index 0000000000000000000000000000000000000000..5445400ed7aa73855d772106b97623444c38312b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f69e205880c0179196575c7674dbecbb.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f6b68d9a408917eaf4aaca15e63d801f.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f6b68d9a408917eaf4aaca15e63d801f.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b30277411ffef71ce40a69d242cc218770a06094 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f6b68d9a408917eaf4aaca15e63d801f.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f90382901e5d7782358e6f67e2ef9292.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f90382901e5d7782358e6f67e2ef9292.png new file mode 100644 index 0000000000000000000000000000000000000000..ade01e058a7c5002883b9ba5b86f760fe1ca3f2c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f90382901e5d7782358e6f67e2ef9292.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f92ee5ec2c8d9aa14804bc050aaf0ce5.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f92ee5ec2c8d9aa14804bc050aaf0ce5.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..be7a3c1e5a082875b0ca6ccbd38119282bf296fb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f92ee5ec2c8d9aa14804bc050aaf0ce5.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f9dfbf5eaf768c2890d0f9a4192c4a64.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f9dfbf5eaf768c2890d0f9a4192c4a64.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..76ac18670e56b04c43f418a6f8aa80ec353f95b7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/f9dfbf5eaf768c2890d0f9a4192c4a64.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/fa757436dd6395af8d471010f9a41fc1.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/fa757436dd6395af8d471010f9a41fc1.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..85927adacd5f4045874fcbe0e45eaef3d24ebf57 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/fa757436dd6395af8d471010f9a41fc1.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/fdd0548ea65b207f04cacd0272545328.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/fdd0548ea65b207f04cacd0272545328.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b67af1e2658048b217741bdcda9e19e25fd51dde Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/fdd0548ea65b207f04cacd0272545328.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/fe285aeba673a5c4b0e02a071f8030c8.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/fe285aeba673a5c4b0e02a071f8030c8.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..5fe043c546595c1425a3a02eac4fba160f44f7e6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/fe285aeba673a5c4b0e02a071f8030c8.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/image-20260319164454328.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/image-20260319164454328.png new file mode 100644 index 0000000000000000000000000000000000000000..2163aa72bb3607dd90120182436c0f83e6fa66f9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/image-20260319164454328.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/image-20260319180708450.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/image-20260319180708450.png new file mode 100644 index 0000000000000000000000000000000000000000..e8ef34caa71dae6e005a144c0d1dc300435fdf1d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/image-20260319180708450.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/image-20260320132317194.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/image-20260320132317194.png new file mode 100644 index 0000000000000000000000000000000000000000..35603a42bd45b49a9c64f9d36298a32520fbe66e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/figures/image-20260320132317194.png differ diff --git "a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/\345\257\214\347\200\232\345\276\256MC632X\345\274\200\345\217\221\345\256\236\350\267\265\346\214\207\345\215\227.md" "b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/\345\257\214\347\200\232\345\276\256MC632X\345\274\200\345\217\221\345\256\236\350\267\265\346\214\207\345\215\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..28cf95f49ebd601a1c5ac1fda17c6c3b6a65ddf5 --- /dev/null +++ "b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/\345\257\214\347\200\232\345\276\256MC632X\345\274\200\345\217\221\345\256\236\350\267\265\346\214\207\345\215\227.md" @@ -0,0 +1,4243 @@ +# 富瀚微MC632X开发实践指南 + +| **目录** | **作者** | +| ------------------------------------- | ---------------------- | +| **零、实践指南说明** | **RT-Thread & 富瀚微** | +| **一、MC632X上的GPIO实践** | **贾元文** | +| **二、MC632X上的UART实践** | **李冲** | +| **三、MC632X上的RTC实践** | **刘建华** | +| **四、MC632X上的SADC实践** | **刘梁益** | +| **五、MC632X上的WDT实践** | **陈小聪** | +| **六、MC632X上的Timer实践** | **刘鹏&唐艺臻** | +| **七、MC632X上的SPI实践** | **刘建华** | +| **八、MC632X上的PWM实践** | **贾元文** | +| **九、MC632X上的ETH实践** | **刘文志** | +| **十、MC632X上的SDIO实践** | **朱文盛&梁浩伦** | +| **十一、MC632X上的AUDIO实践** | **郭工** | +| **十二、MC632X上的USB-VCOM实践** | **郭工** | +| **十三、MC632X上的USB-HID实践** | **袁烨炜** | +| **FAQ** | **RT-Thread & 富瀚微** | + +# 零、实践指南说明 + +## 1. 硬件介绍 + +1. **开发板描述**:MC632X是一款支持两路mipi输入,单路mic输入,集成0.5TOPS算力的新一代双路4M图像处理芯片。双核异构(900MHz+450MHz),支持双路2×5MP@15fps或单路5MP@30fps,两路不同Sensor同步输出,双路画面独立显示或拼接显示,同时可拼接两路视频输出,实现更大视场角画面。搭载富瀚新一代ISP,支持3D降噪/自动坏点消除/动态范围处理,可配置Bayer格式与广角矫正(≤5%),H.265/H.264 2880x1620@30fps高效编码。MC632X凭借优异的图像处理能力和灵活的显示接口配置,能够充分满足智能硬件市场多样化的产品需求。 + +![PixPin_2026-03-19_16-40-15](figures/PixPin_2026-03-19_16-40-15.png) + +2. **开发板外观如下图所示:** + +![image-20260319164454328](figures/image-20260319164454328.png) + +3. **芯片架构**: + +![image-20260320132317194](figures/image-20260320132317194.png) + +4. **该开发板常用板载资源如下**: + +* MCU 型号:MC6321 + +* 应用处理器: + * 最高支持 900MHz + * 32K byte I-CACHE, 32K byte D-CACHE + * 支持浮点运算 + +* 协处理器: + * 最高支持 450MHz + * 8K byte L1 I-Cache,8K byte L1 D-Cache +* 视频编解码 + * H.265/H.264 编码性能: + * 2304x1296@30fps H.264/H.265 编码 + * JPEG 编解码性能: + * 2304x1296@30fps 编解码 + +* ISP + * 支持 RGB Bayer 数据格式,Sensor 输出窗口坐标随意 + * 支持标准 Bayer Pattern 2x2 起始点可配置 + * 支持暗角矫正(强度可配) + * 支持轻度广角矫正(矫正幅度不超过 5%,中心/强度可配置) + * 支持自动坏点消除 + * 支持动态范围处理 + * 支持高性能 3D 降噪 + * 支持高性能 2D 降噪 + * 支持高性能 CFA + * 支持 AE/AWB 统计和控制 + * 支持局部对比度调整和细节增强 + * 支持颜色校正、色度空间调整 + * 支持图像效果调整(亮度、锐度、饱和度和 Gamma) + * 支持 Y/C 域降噪 + * 支持自适应锐化 + * 支持视频缩放 + * 支持 OSD 叠加 (仅主/子幅面支持 OSD 叠加) + * 支持两个大小可配置的 Graphic + * Graphic data 支持 ARGB1555 + * 支持多窗口的 TXT 菜单(4x Window) + * TXT 字体大小可配置(16x16 ~ 64x64) + * 字库可配置 + * TXT 菜单自动反色 + * 支持对待编码数据的 90 度、180 度、270 度旋转 +* NN智能 + * 神经网络硬件加速引擎,算力 0.5TOPS + * 支持人形和人脸等网络结构 + +* 视频输入接口 + * 分时支持最多 2 路 Camera inputs + * 单路最大支持 3MP@30fps + * 双路最大支持 2*3MP@15fps + +* 音频编解码 + * 软件实现多协议音频编解码,支持 G.711、G.726 +* 音频接口 + * 1 个 I2S/PCM 接口,用于外接 Audio Codec + * 内置 Audio Codec, 支持一路单独端麦克风输入,1 路单端 lineout 输出,支持32KHz, 44.1KHz 两个系列采用率 + * 1 路数字 MIC,为 PDM 接口 +* 安全加速器 + * 硬件实现 AES ECB/CBC/OFB/CFB/CTR、DES/3DES 加解密算法 +* 网络接口 + * 支持 10/100Mbit/s 半双工或全双工 + * 集成 FE PHY +* SAR-ADC + * 内置 2 通道 SAR ADC 用于外接应用设备 +* 外围接口 + * 支持 1 个 SPI 接口 + * 支持 2 个 I2C 接口 + * 支持 2 个 PWM 和 8 个 STM + * 支持 2 个 SDIO2.0 接口 + * 支持多个 GPIO 接口 + * 1 个 USB 2.0 ,支持 HOST 及 Device 接口 + * 3 个 UART 接口,其中 1 个支持 4 线 +* 存储器接口 + * 内封 DDR2 64MB,最高速率 1333Mbps + * 1 个 SPI NOR/NAND flash 接口 + * 1、2、4 线 SPI NOR/NAND flash + * 2 个片选,可分别接不同类型的 flash + * 支持 DTR 模式 + * 内置 48KB BootROM +* RTC + * RTC 可通过电池独立供电 + +**我有疑问:**[**RT-Thread 官方论坛**](https://gitee.com/link?target=https%3A%2F%2Fclub.rt-thread.org) + +# 一、MC632X上的GPIO实践(贾元文) + +开发板上手可以参考这篇文章:[RT-Thread-富瀚微MC632X 入门笔记01:Uboot烧录/内核编译+烧录/media_demo操作演示RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/fc62311013db0dd5.html) + +## 1. 编译配置 + +FH_RT_V3.4.0_20250123\FH_RT_V3.4.0_20250123\rt-thread\rt-thread目录下: + +``` +make menuconfig +``` + +demo配置修改为bsp_demo后save+exit: + +![Pasted image 20260204150006.png](figures/ef9b027f7ff61d443dfbedb4a945d366.png-1773986364265452.webp) + +## 2. 修改代码 + +打开文件:`./FH_RT_V3.4.0_20250123/rt-thread/app/bsp_demo/startup/application.c` + +### 2.1 屏蔽其他非GPIO Demo + +首先需要屏蔽其他应用demo,仅且手动运行gpio_demo +精简后的代码如下(只是移除了其他DEMO和取消自动运行): + +```c +#include +#include +#include +#include "rttshell.h" +void user_main(void) +{ +} +static void bsp_demo_usage(void) +{ + printf("Usage:\n"); + printf(" bsp_demo -g: run gpio demo\n"); +} +static void bsp_demo(int argc, char *argv[]) +{ + if (argc < 2) + { + bsp_demo_usage(); + return; + } + if (strcmp(argv[1], "-g") == 0) + { + gpio_demo_init(); + } + else + { + bsp_demo_usage(); + } +} +SHELL_CMD_EXPORT(bsp_demo, bsp demo) +``` + +![Pasted image 20260205002111.png](figures/4b4af48ce0e58d16a98202a37bb28c54.png.webp) + +### 2.2 适配GPIO引脚 + +我们需要修改代码以适配开发板引脚,查看资料:`.\FH_RT_V3.4.0_20250123\FH_RT_V3.4.0_20250123\docs_tools\hardware\board\MC632x_PINOUT_CN.xlsx` +可得:LED_4 -> GPIO2_7 +然后根据引脚号计算公式得到引脚号为 2 * 8 + 7 = 23 + +![Pasted image 20260127224425.png](figures/13adcc6930cf87b95424b62bf8274cd1.png.webp) + +查看这个引脚复用关系: + +![Pasted image 20260204230519.png](figures/6e449047a040334f2dd54ad06e21b2e0.png.webp) + +打开文件:./FH_RT_V3.4.0_20250123/rt-thread/app/bsp_demo/gpio/gpio_demo.c +我们进行编号的调整,将代码的7适配变更为23: + +![Pasted image 20260204231341.png](figures/593e4f68fc3a109bcf4bca1fe3b4b336.png.webp) + +另外编号23目前还找不到对应的GPIO2_7,我们还需要打开文件: +./FH_RT_V3.4.0_20250123/rt-thread/platform/mc632x/app_board/appboard_iopad.h +新增: +![Pasted image 20260204232402.png](figures/cb5ffa212775a0c5f948c4334eda90e0.png.webp) + +原因:在初始化时会用到 + +![Pasted image 20260204232614.png](figures/984f7e3b42956da500f4485ca441b33d.png.webp) + +回到bsp_demo.c,这里的gpio_demo其实还有另外一个LED和按键功能,原理相似,我们暂不关注,所以先屏蔽一下,只启动一个点灯任务:threadBlink: + +![Pasted image 20260204231826.png](figures/88e7f710b29944ba6ab0983d4b399a3a.png.webp) + +另外再把闪灯频率改成1S1次: + +![Pasted image 20260204233235.png](figures/11b76b13daec0aa0d887b2190133f9e6.png.webp) + +## 3. 编译代码 + +直接编译(编译失败可以先make clean后重试): + +make + +![Pasted image 20260204150307.png](figures/0b0095bf031e8bfb4eb58d0a3ea1ebde.png.webp) + +将编译后的固件拷贝到windows中: +可以像上一讲烧录media_demo是拷贝img镜像,也可以直接拷贝.bin文件直接烧录: + +![Pasted image 20260204150901.png](figures/27288aa6908cb218d9397abc6dbd9be7.png-1773986898918473.webp) + +![Pasted image 20260204151417.png](figures/19d5823ccbc14c9ccdee3d559c04e046.png) + +## 4. 烧录代码 + +连接网线、串口线、电源,上电开机 + +### 4.1 确认网络 + +![Pasted image 20260204152920.png](figures/3a9af737b6c30317c07df075d54003a6-1773986935202478.png) + +### 4.2 FTFP传输 + +选择固件路径与对应IP + +![Pasted image 20260201223720.png](figures/af02f83aa65af8579471deb8fed67d35-1773986955724481.png) + +修改或确认启动指令: + +``` +set bootcmd 'sf probe 0;sf read 40000000 0x120000 300000;go 40000000' +saveenv +``` + +![Pasted image 20260204153308.png](figures/5b2528d30125996b3ef771cc0fe190bd-1773986976116484.png) + +``` +sf probe 0 +sf erase 0x120000 300000 +tftp 41000000 bsp_demo.bin +sf write 41000000 0x120000 300000 +reset +``` + +![Pasted image 20260204153544.png](figures/7f0bea6192c953fb2ee9194de4fa9a42-1773986991785487.png) + +## 5. 运行代码 + +运行前先按前述要求调整/检查短路帽: + +![Pasted image 20260204234458.png](figures/d4e34c30d5a12ab8b922da3b5326e3b0.png.webp) + +上电运行程序,启动闪灯测试: + +``` +bsp_demo -g +``` + +![Pasted image 20260204233941.png](figures/8ff5b33d62b230761d232968c413f544.png) + +此时可见开发板LED灯间隔1S闪烁(GIF动图): + +![lv_0_20260204234608.gif](figures/0f598522ad9152e8b9ef3d202f53d554-1773987049866494.gif) + +## 6. 原文连接 + +原文链接:[RT-Thread-富瀚微MC632X 入门笔记02:BSP开发之GPIO点灯教程RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/f306d73ce3fb83c8.html) + +# 二、 MC632X上的UART实践(李冲) + +## 1. MC632X开箱视频 + +https://www.bilibili.com/video/BV1TKzvBCEDq + +## 2 .UART模块的硬件介绍 + +### 2.1 MC632X板卡接线说明 + +![screenshot_image.png](figures/b340cf76e3a6819840e0d9a14b3dc757.png.webp) + +### 2.2 UART接线说明 + +接地线、tx、rx就可以,MC632X上的RX使用黄色线对应TTL端的TX, MC632X上的TX使用绿色线对应TTL端的RX, 蓝色为GND + +![screenshot_image.png](figures/ee6b255cc6f6f18080f5dc584f519933.png.webp) + +![screenshot_image.png](figures/438a57733db2bdd265a97cc97f03c0b0.png.webp) + +### 2.3 参见官方文档《MC632X_APP开发板使用指南V1.0.pdf》 + +介绍UART0为调试口, 我们测试UART1,见上面接线 + +![screenshot_image.png](figures/69faece6624bc02a5bb69d73448b66a2.png.webp) + +![screenshot_image.png](figures/8983dea65b1d9e3ac41c6747db0bb2f8.png.webp) + +## 3. UART模块的使用 + +### 3.1 软件准备 + +进入 SDK 的 rt-thread 目录 + +![screenshot_image.png](figures/a1e88aaa4044d96d8f56e703c6751ff5.png) + +使能 UART1 外设 +在终端中输入如下命令使用图形化界面配置工程 +`make menuconfig +进入 Drivers 配置项。 + +![screenshot_image.png](figures/3435e52b1fc51aae8a564d18d32ee03a.png.webp) + +进入 Choose uart device 配置项。 + +![screenshot_image.png](figures/1f06465224672da09f26ca144007bac2.png.webp) + +使能 UART1。 + +![screenshot_image.png](figures/b8e602f4a318ee83af21cfc8f992a895.png.webp) + +选择 app demo 为 bsp_demo。 + +![screenshot_image.png](figures/4737a54246ec75bddb610203c2f8e0e8.png.webp) + +保存配置。 + +![screenshot_image.png](figures/5274f57b01a48863cb00172fdc737106.png.webp) + +进入 bsp_demo 目录 +在终端中输入如下命令使用 VSCode 打开目前所在的目录 +`code .` + +bsp_demo 目录结构如下图所示: + +![screenshot_image.png](figures/3859734d2ad637491c6e2b6fbe672dee.png) + +### 3. 2查看开发板使用指南 + +FH_RT_V3.4.0_20250123/docs_tools/hardware/board/MC632X_APP开发板使用指南V1.0.pdf +在指南中找到UART介绍,找到UART1的位置 + +![screenshot_image.png](figures/20ab9f17a1822825b950a26e1cda22ad.png.webp) + +### 3.3 配置PinMux + +PIN 引脚复用需要注意不能冲突,否则会导致复用不生效。 +PIN 引脚复用可查看 PinMux 表格或 mc632x_iopad.h 文件。 + +* PinMux 表格:FH_RT_V3.4.0_20250123/docs_tools/hardware/board/MC632x_PINOUT_CN.xlsx +* mc632x_iopad.h 文件:FH_RT_V3.4.0_20250123/docs_tools/hardware/board/rt-thread/platform/mc632x/mc632x_iopad.h +* 修改 rt-thread/platform/mc632x/app_board/appboard_iopad.h 文件,在 *fh_pinctrl_selected_devices[]数组中添加 “UART1”。 并删除 “PWMOUT0”, “PWMOUT1” 。 因为/MC632x_PINOUT_CN.xlsx介绍UART1管角有复用 + +![screenshot_image.png](figures/5754bb2455feab942130020c327b18d7.png.webp) + +```c +#ifndef __APP_IOPAD_H__ +#define __APP_IOPAD_H__ +char *fh_pinctrl_selected_devices[] = { + "CSI", "EPHY", "I2C0", + "SENSOR_CLK0", "SENSOR_CLK1", + "GPIO4_4", "GPIO5_0", "SFC", "SD1", + "UART0", "UART1", "USB_PWREN", "SENSOR_VS0", "SENSOR_VS1", + "GPIO1_7", "GPIO2_5", "GPIO2_6", "PKG", + "GPIO6_4", "GPIO6_5", "GPIO6_6", "GPIO0_5", "GPIO1_2", + "GPIO1_3", +#ifdef WIFI_USING_SDIOWIFI +#if (WIFI_SDIO == 0) +"SD0_WIFI", "GPIO3_5" +#else +"SD0_NO_WP" +#endif +#else +"SD0_NO_WP" +#endif +}; +#endif +``` + +### 3.4 修改 bsp_demo + +打开 bsp_demo/startup/application.c 文件,删除 user_main() 中的代码,修改测试方式为手动执行。 + +```c +#include +#include +#include +#include "rttshell.h" +extern void sadc_demo_init(void); +extern int sdcard_demo_init(void); +extern int aes_demo_init(void); +extern int pwm_demo_init(void); +extern int gpio_demo_init(void); +extern int uart_demo_init(void); +extern int i2c_demo_init(void); +extern int rtc_demo_init(void); +void user_main(void) +{ +/* sleep(5); + aes_demo_init(); + i2c_demo_init(); + rtc_demo_init(); + sadc_demo_init(); + sdcard_demo_init(); + pwm_demo_init(); + gpio_demo_init(); + uart_demo_init(); + */ +} +static void bsp_demo_usage(void) +{ + printf("Usage:\n"); + printf(" bsp_demo -e: run aes demo\n"); + printf(" bsp_demo -t: run rtc demo\n"); + printf(" bsp_demo -i: run i2c demo\n"); + printf(" bsp_demo -a: run sadc demo\n"); + printf(" bsp_demo -p: run pwm demo\n"); + printf(" bsp_demo -g: run gpio demo\n"); + printf(" bsp_demo -u: run uart demo\n"); + printf(" bsp_demo -c: run sdcard demo\n"); +} +static void bsp_demo(int argc, char *argv[]) +{ + if (argc < 2) + { + bsp_demo_usage(); + return; + } + if (strcmp(argv[1], "-e") == 0) + { + aes_demo_init(); + } + else if (strcmp(argv[1], "-u") == 0) + { + uart_demo_init(); + } + else if (strcmp(argv[1], "-g") == 0) + { + gpio_demo_init(); + } + else if (strcmp(argv[1], "-p") == 0) + { + pwm_demo_init(); + } + else if (strcmp(argv[1], "-c") == 0) + { + sdcard_demo_init(); + } + else if (strcmp(argv[1], "-a") == 0) + { + sadc_demo_init(); + } + else if (strcmp(argv[1], "-t") == 0) + { + rtc_demo_init(); + } + else if (strcmp(argv[1], "-i") == 0) + { + i2c_demo_init(); + } + else + { + bsp_demo_usage(); + } +} +SHELL_CMD_EXPORT(bsp_demo, bsp demo) +``` + +### 3.5 修改 UART 代码 + +修改 bsp_demo/uart/uart_demo.c 。 + +```c +#include +#include +#include +#include +#include +#include +static int uart_fd = -1; +void uart_func(void) +{ + int i = 50; + char buf = 0x31; + while(i--) + { + read(uart_fd, &buf, 1); + printf("[uart_demo] buf:%x\n", buf); + write(uart_fd, &buf, 1); + } +} +void *uart_demo_main(void *param) +{ + prctl(PR_SET_NAME, "uart demo"); + uart_func(); + return NULL; +} +int uart_demo_init(void) +{ + int ret = 0; + pthread_t threadUart; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_attr_setstacksize(&attr, 10 * 1024); + uart_fd = open("/dev/uart1", O_RDWR); + if(uart_fd < 0) + { + printf("[uart_demo] open uart1 failed\n"); + return -1; + } + ret = pthread_create(&threadUart, &attr, uart_demo_main, NULL); + if(ret) + { + printf("[uart_demo] Error: Create uart_demo_main thread failed!\n"); + return -1; + } + return 0; +} +``` + +### 3.6 编译代码 + +输入如下命令开始编译代码: + +``` +make clean;make +``` + +![screenshot_image.png](figures/0c63a9d3b50ccd8e97b7ec0d37c4cc43.png.webp) + +编译结果如下图: +在 bsp_demo/out/bin/ 中生成了 bsp_demo.bin 固件。 + +![screenshot_image.png](figures/e15437ada66a0554d3ae1c56a63fbce7.png.webp) + +## 4. 烧录固件 + +将编译生成的 bsp_demo.bin 固件复制到共享文件夹中。 + +### 4.1 进入 uboot + +按下开发板的电源开关按键复位,出现下述内容后立刻按回车键: +Hit any key to stop autoboot + +![screenshot_image.png](figures/01afd171f34b5e2bcdff847cbe0ad0f6.png.webp) + +### 4.2 查看设备 IP + +输入下述命令查看当前的信息 +`pri` + +![screenshot_image.png](figures/ee70dc33de543606b606225942978f9b.png.webp) + +将设备IP与电脑IP设置网段一致 + +``` +setenv ipaddr 10.254.65.205 +setenv serverip 10.254.65.105 +setenv netmask 255.255.255.0 +setenv gatewayip 10.254.65.254 +``` + +执行下述命令保存配置: + +``` +saveenv +``` + +开启 tftp: + +![screenshot_image.png](figures/fdd0548ea65b207f04cacd0272545328.png.webp) + +### 4.3 烧录主处理器固件 + +加载应用固件,出现下述内容则表示加载成功 +`tftp 40000000 bsp_demo.bin` + +![screenshot_image.png](figures/ce628ca5b5f013d0bd2c54dec3f39f77.png.webp) + +然后输入下述命令进行准备: +`go 40000000` + +停顿一下,敲enter键,出现:msh />,再去执行后续操作: + +![screenshot_image.png](figures/3d45c87c3edcb79a03f4da6c7d4de1cf.png.webp) + +## 5. 测试 UART + +在 shell 中输入 ls /dev 命令查看启用的外设: + +![screenshot_image.png](figures/bcac000b56cedd97b77b567e0708d1b9.png.webp) + +在 shell 中输入 pinctrl -l 命令可以查看引脚复用情况: + +![screenshot_image.png](figures/b8311fa74f03789666d3b9ec85152ad6.png.webp) + +输入 bsp_demo -u 开始 uart 测试: +使用串口助手打开连接 uart1 的串口,发送 “abc123”。 + +![screenshot_image.png](figures/a254ea10327507a3d6488e28cf82020f.png.webp) + +开发板端的 shell 终端会打印出接收到的字符的十六进制值。 + +![screenshot_image.png](figures/080700887869038ecd92c8e0054c4dd4.png) + +## 6. UART模块功能的演示视频 + +https://www.bilibili.com/video/BV1kD6qB5EUm/ + +## 7. UART模块可编译下载的代码 + +https://gitee.com/liflower/fullhan_MC632X_UART1.git + +## 8. UART功能评测心得 + +### 8.1 模块功能理解 + +通过本次UART模块的开发实践,我深入理解了串口通信在嵌入式系统中的重要性。UART作为最基础、最常用的通信接口,承担着设备调试、数据传输、外设控制等关键功能。在MC632X开发板上,UART1的配置和使用展示了RT-Thread操作系统对底层硬件资源的良好封装。 + +### 8.2 资源管理的重要性 +PinMux的配置让我深刻认识到嵌入式系统中资源有限且可能冲突的特点。删除”PWMOUT0”和”PWMOUT1”来为UART1让路的操作,体现了嵌入式开发中”权衡”和”取舍”的艺 + +### 8.3 调试与测试的实践经验 +逐步验证策略 +从配置生效到功能验证的完整流程: +1.通过pinctrl -l验证引脚复用配置 + +2.通过ls /dev确认设备节点创建 + +3.通过串口助手进行双向通信测试 + +### 8.4 调试过程中遇到的问题 +1、刚开始在fh_pinctrl_selected_devices中添加 UART1时,只添加了,并没有考虑添加的有复用的管角 +2、在后续调用中参照FH_RT_V3.4.0_20250123\docs_tools\software\board\MC632X\RT-Thread SDK开发指南.pdf +第8.2章,只执行pinctrl -d UART1 就能把 UART1使能,从这才想到pin mux, 再看pin mux表格,发现与”PWMOUT0”, “PWMOUT1” 是复用的。 +3、再改代码把”PWMOUT0”, “PWMOUT1”,删掉,重新编译烧录,再执行。就正常了。 + +![screenshot_image.png](figures/f325b3619e91ad9797139e87109a8261.png.webp) + +## 9. 原文链接 + +原文链接:[RT-Thread-富瀚微MC632X UART评测总结RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/b03e79f687dcabe6.html) + +# 三、MC632X上的RTC实践(刘建华) + + ## 1. 前置准备 +### 1.1 硬件准备 +包含:USB转TTL、MC632X开发板、电源、网线。 + +![screenshot_image.png](figures/7f82d916a28e4c14bec848811c4fd3bf.png.webp) + +### 1.2 软件准备 + +进入 SDK 的 rt-thread 目录 + +![screenshot_image.png](figures/b47ff7c13c5c11a9f9fef3ed0cf62f0d.png) + +应用初始配置 +在终端中输入如下命令进行初始配置: + +``` +make mc632x_defconfig +``` + +确认RTC使能 + +![screenshot_image.png](figures/a6595e6eb91b1dc43f1584ade841294c.png.webp) + +然后选择app demo 为bsp_demo + +![screenshot_image.png](figures/33a233c75601328d9e2d6cff3f06b750.png.webp) + +![screenshot_image.png](figures/f2d585187f3f90a78d8f8495a1e44022.png.webp) + +然后保配置,并退出 +进入 bsp_demo 目录 +在终端中输入如下命令使用 VSCode 打开目前所在的目录 + +![screenshot_image.png](figures/cad4fd9e64eebc69befa4e7e8b742b39.png) + +![screenshot_image.png](figures/a90c291cd071733054ce1273e3c7b0c5.png.webp) + +## 2. 代码实现 + +### 2.1 修改rtc_demo.c + +```c +#include +#include +#include +#include // 包含rt_kprintf的头文件 +#include // 包含atoi的头文件 +#include // 包含strcmp的头文件 +// 声明函数(解决跨文件调用的隐式声明问题) +void rtc_demo_init(void); +void rtc_get_time(void); +void rtc_set_time(int argc, char *argv[]); +// 你的原始rtc_demo_init函数(保留) +void rtc_demo_init(void) +{ + struct timeval curr_time; + struct tm tm_curr; + time_t tp; + time(&tp); + localtime_r(&tp, &tm_curr); + rt_kprintf("[rtc_demo]now is: %d-%d-%d %d:%d:%d\n", tm_curr.tm_year + 1900, tm_curr.tm_mon + 1, tm_curr.tm_mday, tm_curr.tm_hour, tm_curr.tm_min, tm_curr.tm_sec); + tm_curr.tm_hour += 1; + tp = mktime(&tm_curr); + curr_time.tv_sec = tp; + settimeofday(&curr_time, NULL); + gettimeofday(&curr_time, NULL); + rt_kprintf("[rtc_demo]time_curr: %d s %d us\n", (int)curr_time.tv_sec, (int)curr_time.tv_usec); + struct timespec real_time; + real_time.tv_sec = tp; + clock_settime(CLOCK_REALTIME, &real_time); + clock_gettime(CLOCK_REALTIME, &real_time); + rt_kprintf("[rtc_demo]time_curr: %d s %d ns\n", (int)real_time.tv_sec, (int)real_time.tv_nsec); +} +// 获取RTC时间的子功能(删除未使用的curr_time变量) +void rtc_get_time(void) +{ + struct tm tm_curr; + time_t tp; + time(&tp); + localtime_r(&tp, &tm_curr); + rt_kprintf("[rtc_demo]current time: %d-%02d-%02d %02d:%02d:%02d\n", + tm_curr.tm_year + 1900, tm_curr.tm_mon + 1, tm_curr.tm_mday, + tm_curr.tm_hour, tm_curr.tm_min, tm_curr.tm_sec); +} +// 设置RTC时间的子功能 +void rtc_set_time(int argc, char *argv[]) +{ + if (argc < 8) // bsp_demo -set 年 月 日 时 分 秒 → 总参数数=8 + { + rt_kprintf("Error: 参数不足!\n"); + rt_kprintf("Usage: bsp_demo -set 2026 03 04 12 30 00\n"); + return; + } + struct tm tm_new; + time_t tp; + struct timeval curr_time; + // 解析参数(注意argv[2]开始是年,因为argv[0]=bsp_demo, argv[1]=-set) + tm_new.tm_year = atoi(argv[2]) - 1900; + tm_new.tm_mon = atoi(argv[3]) - 1; + tm_new.tm_mday = atoi(argv[4]); + tm_new.tm_hour = atoi(argv[5]); + tm_new.tm_min = atoi(argv[6]); + tm_new.tm_sec = atoi(argv[7]); + tm_new.tm_isdst = 0; + tp = mktime(&tm_new); + if (tp == (time_t)-1) + { + rt_kprintf("[rtc_demo]无效的时间格式!\n"); + return; + } + curr_time.tv_sec = tp; + curr_time.tv_usec = 0; + settimeofday(&curr_time, NULL); + rt_kprintf("[rtc_demo]时间设置成功!\n"); + rtc_get_time(); // 打印设置后的时间 +} +``` + +### 2.2 修改application.c + +```c +#include +#include +#include +#include +#include "pinctrl.h" +#include "rttshell.h" +#include +// 声明所有demo函数 +extern void rtc_demo_init(void); +extern void rtc_get_time(void); +extern void rtc_set_time(int argc, char *argv[]); +static void bsp_demo(int argc, char *argv[]); +// 应用入口函数 +void user_main(void) +{ + sleep(5); + // rtc_demo_init(); + rt_kprintf("bsp_demo app init success! Use 'bsp_demo -h' for help.\n"); +} +// 打印命令使用说明 +static void bsp_demo_usage(void) +{ + rt_kprintf("Usage:\n"); + rt_kprintf(" bsp_demo -h : 显示帮助信息\n"); + rt_kprintf(" bsp_demo -t : 执行RTC初始化(小时+1)\n"); + rt_kprintf(" bsp_demo -g : 获取当前RTC时间\n"); + rt_kprintf(" bsp_demo -set : 设置RTC时间\n"); + rt_kprintf(" Example: bsp_demo -set 2026 03 04 12 30 00\n"); +} +// #################### 2. 定义bsp_demo函数(保留static) #################### +static void bsp_demo(int argc, char *argv[]) +{ + if (argc < 2) + { + bsp_demo_usage(); + return; + } + // 匹配参数(修复spi_demo_init笔误) + if (strcmp(argv[1], "-t") == 0) + { + rtc_demo_init(); // 执行RTC初始化 + } + else if (strcmp(argv[1], "-g") == 0) + { + rtc_get_time(); // 获取RTC时间 + } + else if (strcmp(argv[1], "-set") == 0) + { + rtc_set_time(argc, argv); // 设置RTC时间 + } + else if (strcmp(argv[1], "-h") == 0) + { + bsp_demo_usage(); // 显示帮助 + } + else + { + bsp_demo_usage(); + } +} +SHELL_CMD_EXPORT(bsp_demo, bsp_demo); +``` + +### 2.3 修改makefile,添加rtc下面的文件参与编译 + +```makefile +include $(SDKROOT)/build/config.mk +SAMPNAME := $(shell basename `pwd`) +SAMP_SRCS += $(wildcard rtc/*.c) //添加rtc +SAMP_SRCS += $(wildcard startup/*.c) +include $(SDKROOT)/build/apps.mk +APP_CFLAGS += -I../../kernel/include -I../../out/rtconfig -I../../lib/inc/bsp -I ../../shell -I ../../drivers/arch -I ../../platform/include -I ../../platform +``` + +## 3. 编译代码 + +在rtthread目录下面执行 + +``` +make clean && make +``` + +得到编译结果如下: + +![screenshot_image.png](figures/0cdae609f6e92a5a5ba7b388553ba8c3.png.webp) + +## 4. 烧录固件 + +### 4.1 打开tftp服务器 + +在官方提供的资料中`MC632X平台AE部资源包_20251205\MC632X平台_AE部资源包\测试固件\20251210V01单路人形检测方案\sensor_cv2005_fps_30` +有tftp.exe。双击后打开,在网址中找到当前电脑的IP + +![screenshot_image.png](figures/d8d7a041997130028f06f659f0adbe5d.png) + +### 4.2 连接开发板 + +使用usb_ttl,将tX与RX连接到开发板的J17的中间两角中,同时将地址接入到合适的位置。 + +![screenshot_image.png](figures/5cbe82c2f1374759488ebb44dc402ede.png.webp) + +接入电脑后,打开串口终端工具,波特率为115200。 + +### 4.3 进入Uboot + +![screenshot_image.png](figures/08bb9bf63a611c356c82c70da269efb6.png.webp) + +### 4.4 复制bsp_demo.bin到tftp目录 + +将刚刚生成的`MC632X_20251205/FH_RT_V3.4.0_20250123/rt-thread/app/bsp_demo/out/bin/bsp_demo.bin`拷贝到刚才tftp的文件夹中: +![screenshot_image.png](figures/44fe89dcd478d15aea9054135e420f06.png.webp) + +### 4.5 配置IP + +开发板的初始设置与我们当前的网段以及tftp服务器是不一样的,因此我们需要根据我们的电脑以及路由器来配置输入以下命令进行IP配置 + +``` +setenv gatewayip=192.168.3.1 //路由器地址 +setenv ipaddr=192.168.3.235 //开发板网址 +setenv netmask=255.255.255.0 //掩码 +setenv serverip=192.168.3.180 //tftp 服务器IP +``` + +最后切记要输入saveenv进行保护,要不每次重新上电进来都需要执行一遍。 +用网线将开发板接入网络,并执行pri进行验证: + +![screenshot_image.png](figures/66dc3e44ed5e579aab869f4f459c23c0.png.webp) + +### 4.6 烧录主处理器固件 + +输入命令:`tftp 40000000 bsp_demo.bin` +加载应用固件,出现下述内容则表示加载成功: + +![screenshot_image.png](figures/f92ee5ec2c8d9aa14804bc050aaf0ce5.png.webp) + +然后输入 `go 40000000`进入rtt + +![screenshot_image.png](figures/104a1e366098f4db644fae6e9a82002a.png) + +## 5. 测试rtc + +### 5.1 执行RTC初始化 + +``` +msh />bsp_demo -t +[rtc_demo]now is: 1970-1-1 8:0:29 +[rtc_demo]time_curr: 3629 s 310662 us +[rtc_demo]time_curr: 3629 s 325200000 ns +``` + +### 5.2 设置时间 + +``` +msh />bsp_demo -set 2026 3 4 12 16 11 +[rtc_demo]时间设置成功! +``` + +### 5.3 获取时间 + +``` +msh />bsp_demo -g +[rtc_demo]current time: 2026-03-04 12:16:15 +``` + +## 6. 总结 + +官方已经适配好了RTC,我们添加简单的代码便可以实现rtc实时时钟的应用。 +附工程源码:[bsp_demo.zip](https://club.rt-thread.org/file_download/a6aa8af1b9ebac1d) + +## 7. 原文链接 + +原文链接:[RT-Thread-富瀚微MC632X 上的RTC实践RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/be6c56796562c68b.html) + +# 四、MC632X上的ADC实践(刘梁益) + +## 1. 开发板资料及开发环境搭建 + +### 1.1 相关资料: + +RT-Thread & 富瀚微专属资料可从链接https://app.yinxiang.com/b/j13S3查阅获取。 + +![1.png](figures/6a5780b8ebe8af4a8cd7013f0b0cbccc.png) + +### 1.2 环境准备: + +操作系统采用 Ubuntu-18.04.6(推荐在 VMware 虚拟机中运行)。 +软件需准备串口工具 SecureCRT.9.6.0、tftp 文件传输工具。 + +![image-20260319180708450](figures/image-20260319180708450.png) + +硬件核心为富瀚微 MC632X 开发板,搭配 12V1A 直流电源线、USB 转串口模块(或 RS232)即可完成基础硬件搭建。 + +![4.png](figures/324bbc6cb468193f2925510f1cfb4831.png.webp) + +## 2. 功能模块的硬件介绍 + +### 2.1 MC632X 芯片 SADC 通道说明 + +MC632X 芯片有 2 路 SADC 输入,其中 ADC0 可通过跳帽 J126 作为光亮度检测使用,ADC1 可通过跳帽 J94 模拟音柱检测使用。通过用户可通过 J47、J47 用来检查外部电压。 + +![5.png](figures/f5ca3c4f077d4907b03220560fa98d12.png.webp) + +### 2.2 本次实践硬件连接方案 + +本次实践选用光敏模块 GL5537-1 (D56) 对 ADC0 通道进行功能测试,通过在开发板 J126 位置搭建跳帽,完成 LIGHT_DET 与 ADC0 的电路连接。 + +![6.png](figures/7655b11d17fc36444f887e66f7bf11f7.png.webp) + +## 3. 功能模块的使用说明 + +### 3.1 RT-Thread 系统配置 + +将资源包中的 SDK 文件解压后复制至 Ubuntu 系统。 + +![7.png](figures/27ca6ac0f40576e71db009122606579e.png.webp) + +在`FH_RT_V3.4.0_20250123/rt-thread`路径打开命令行,执行`make menuconfig`指令打开 RT-Thread 配置界面,将 app demo 切换为 bsp_demo 后保存配置。 + +![8.png](figures/595c188d26c58a3bb01d791ca6e8f107.png.webp) + +### 3.2 硬件端口使能操作 + +用 VS-code 打开 rt-thread 文件夹,在`platform/mc623x/mc632x_iopad.h`路径中找到 ADC0、ADC1 对应端口。 + +![9.png](figures/2f731eb1a603f45dd921933b3897a532.png.webp) + +将端口信息复制至`platform/mc623x/app_board/appboard_iopad.h`完成端口使能操作。 + +![10.png](figures/c819206211513b61a1f0e04d5cba7da0.png.webp) + +### 3.3 功能代码修改与编译 + +打开`rt-thread/app/bsp_demo/startup/application.c`文件(main () 函数所在文件),删除与 SADC 功能无关的代码,仅保留并编写 SADC 相关功能代码。 +```c +#include +#include +#include +#include "rttshell.h" +void user_main(void) +{ +} +static void bsp_demo_usage(void) +{ + printf("Usage:\n"); + printf(" bsp_demo -a: run sadc demo\n"); +} +static void bsp_demo(int argc, char *argv[]) +{ + if (argc < 2) + { + bsp_demo_usage(); + return; + } + if (strcmp(argv[1], "-a") == 0) + { + sadc_demo_init(); + } + else + { + bsp_demo_usage(); + } +} +SHELL_CMD_EXPORT(bsp_demo, bsp demo) +``` + +打开`rt-thread/app/bsp_demo/sadc`中sadc_demo.c,修改代码,将原循环打印四个通道ADC采样值的逻辑调整为循环打印ADC0通道的采样数据 + +```c +#include +#include +#include +#include +#include +#include +#include +#include +#include "sadc.h" +void *sadc_demo_main(void *param) +{ + unsigned int fd; + unsigned int raw_data; + SADC_INFO info; + unsigned int chn_num = 0; + info.channel = 0; + info.sadc_data = 0; + prctl(PR_SET_NAME, "sadc demo"); + fd = open( "/dev/sadc", O_RDWR, 0); + if (!fd) + { + printf("[sadc_demo] cann't open the sadc dev\n"); + } + while (1) + { + info.channel = chn_num; + ioctl(fd, SADC_CMD_READ_RAW_DATA, + &info); /* //get digit data */ + raw_data = info.sadc_data; + ioctl(fd, SADC_CMD_READ_VOLT, + &info); /* //get digit data */ + printf("[sadc_demo] channel:%x digt data:%x volt:%d mv\n", info.channel,raw_data, + info.sadc_data); + sleep(1); + } + close(fd); + return NULL; +} +void sadc_demo_init(void) +{ + pthread_attr_t attr; + pthread_t thrd; + struct sched_param _param; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_attr_setstacksize(&attr, 10240); + _param.sched_priority = 80; + pthread_attr_setschedparam(&attr, &_param); + if (pthread_create(&thrd, &attr, sadc_demo_main, NULL) != 0) + { + printf("[sadc_demo] Error: Create sadc demo thread failed!\n"); + } +} +``` + +返回命令行中使用命令`make clean;make` 生成bsp_demo.bin固件,将生成的固件文件复制至 Windows 系统备用。 + +![11.png](figures/aeb43797cc157a75a1a1b0c31a574b2b.png.webp) + +### 3.4 固件烧录流程 + +用网线将开发板 RJ45 网口与电脑网口连接,打开电脑新识别以太网端口的属性,在 Internet 协议版本 4 属性中完成 IP 地址与子网掩码的修改。 + +![12.png](figures/611e83d6a105f9b04b5a3ed0352af2c9.png.webp) + +打开 tftp 工具 tftpd32,选择 bsp_demo.bin 固件所在文件夹,将工具 IP 地址设置为修改后的 192.168.70.50; + +![13.png](figures/c9125cde7fe4ffc428bc5948e53e8fc2.png) + +同时打开串口工具 SecureCRT.9.6.0,点击文件 - 快速链接,选择 Serial 串口,将波特率设置为 115200。按下开发板 RESET 复位按键, +当界面出现 3.2.1 倒计时时按下回车,进入 U-BOOT 模式. + +![14.png](figures/f53d245ee1478b34c5d611352b589e73.png.webp) + +依次输入以下指令完成固件烧录: + +``` +set bootcmd 'sf probe 0;sf read 40000000 0x120000 300000;go 40000000' +Saveenv +sf probe 0 +sf erase 0x120000 300000 +tftp 41000000 bsp_demo.bin +``` + +固件烧录完成后,手动输入bsp_demo -a启动 ADC 功能程序。 + +![15.png](figures/4a12c2abe01bba7a4619e6cd5c2fc371.png.webp) + +## 4. ADC 相关功能演示 + +1. 演示视频参考https://www.bilibili.com/video/BV1U7PTzZEaA/ + +2. 实测数据与功能表现 + +实际测试过程中,ADC0 通道的采样值随光照强度变化呈现明显规律:光照强度越大,ADC 采样转换后的数值与电压值越大。室内常规光照环境下,ADC0 通道显示电压约 25mv;将手电照明靠近光敏模块时,电压值逐步上升至 100mv-200mv;移开手电照明后,电压值快速恢复至 25mv 左右,功能响应灵敏、数据采集精准。 + +![16.png](figures/114f5cc36297eb69855649f013dd4579.png) + +## 5. 可编译下载的代码 Gitee 链接 + +https://gitee.com/YIYIGET/fullhan_adc + +## 6. 心得体会 + +本次有幸试用富瀚微 MC632X 开发板完成 ADC 功能测试,深切感受到这款开发板设计的专业性与实用性,硬件布局合理、外设接口丰富,搭配 RT-Thread 系统的开发适配性极佳,大幅降低了嵌入式开发的上手门槛。富瀚微的开发资料虽简洁但重点突出,让整个测试流程顺畅高效,也能感受到品牌在硬件研发与生态搭建上的用心。此次实操不仅扎实掌握了 ADC 采样开发的相关技能,更对富瀚微的产品实力印象深刻. + +## 7. 原文链接 + +原文链接:[RT-Thread-富瀚微 MC632X ADC实践RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/7b589bcd3c3d3a42.html) + +# 五、MC632X上的WDT实践(陈小聪) + +## 1. 硬件介绍 + +包含:串口线、MC632X开发板、电源线、网线。(本章用不到 Sensor 摄像头板) + +![0.png](figures/50f0f765798e99d550a0430d411b0946.png.webp) + +## 2. 环境搭建 + +``` +# 0.将下载完成 MC632X平台_AE部资源包_20251205 并且解压之后,然后将 MC632X平台_AE部资源包_20251205\MC632X平台_AE部资源包\SDK包 FH_RT_V3.4.0_20250123.tar.gz 拷贝到虚拟机 然后解压SDK,解压命令如下: +tar -zxvf FH_RT_V3.4.0_20250123.tar.gz +# 1.安装工具链 +cd FH_RT_V3.4.0_20250123/docs_tools/software/pc +chmod 777 install_toolchain.sh +sudo ./install_toolchain.sh +# 安装完成之后重新打开终端,输入分别如下两条命令就可以看到安装的工具链版本 +arm-fullhanv2-eabi-gcc -v +arm-fhv512c-linux-uclibcgnueabihf-gcc -v +``` + +## 3. 配置外设 + +``` +# 进入rt-thread 目录 +# 1、在终端中输入如下命令进行初始配置 +make mc632x_defconfig +# 2、在终端中输入如下命令使用图形化界面配置工程 +make menuconfig +``` + +![1.png](figures/402b7ee57b52eb292f3bc6697fe99fc3.png.webp) + +![2.png](figures/80852998fc77dd460303aeb868f07949.png.webp) + +## 4. 配置编译的应用 + +* 在rt-thread/app 新建文件夹wdt_demo + +* 添加如下几个文件 + * Makefile,内容如下 + + ```makefile + include $(SDKROOT)/build/config.mk + SAMPNAME := $(shell basename `pwd`) + SAMP_SRCS := $(wildcard *.c) + include $(SDKROOT)/build/apps.mk + ``` + + * Kconfig,内容如下: + + ``` + menu "Application Configuration" + + endmenu + ``` + + * wdt_demo.c,内容如下: + +```c +#include +#include +#include +#include +#include +#include +#include +#include +#include "wdt.h" +void *wdt_main(void *para) +{ +int wdt_fd; + int wdt_timeout = 2; // 看门狗超时时间 +prctl(PR_SET_NAME, "wdt"); // 设置线程名称 + printf("[test_wdt] wdt demo start:\n"); + /* 打开 WDT 设备节点,返回设备句柄 */ + wdt_fd = open("/dev/fh_wdt0", O_RDWR); + if (wdt_fd == -1) + { + printf("[test_wdt] open wdt failed\n"); + return NULL; // 打开失败,退出线程 + } + /* 设置看门狗超时时间为 wdt_timeout 秒 */ + ioctl(wdt_fd, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &wdt_timeout); + wdt_timeout = 0; + /* 读取看门狗超时时间 */ + ioctl(wdt_fd, RT_DEVICE_CTRL_WDT_GET_TIMEOUT, &wdt_timeout); + printf("[test_wdt] get wdt timeout: %d sec\n", wdt_timeout); + /* 启动看门狗 */ + ioctl(wdt_fd, RT_DEVICE_CTRL_WDT_START); + /* 连续喂狗 10 次,每次间隔 1 秒 */ + for (int i = 0; i < 10; i++) + { + /* 喂狗,避免超时复位 */ + ioctl(wdt_fd, RT_DEVICE_CTRL_WDT_KEEPALIVE); + printf("[test_wdt] feed dog %d\n", i); + sleep(1); + } + return NULL; +} +void wdt_init(void) +{ + pthread_attr_t attr; + pthread_t thrd; + struct sched_param _param; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_attr_setstacksize(&attr, 10240); + _param.sched_priority = 80; + pthread_attr_setschedparam(&attr, &_param); + if (pthread_create(&thrd, &attr, wdt_main, NULL) != 0) + { + printf("Error: Create sample_isp_proc thread failed!\n"); + } +} +void test_wdt(int argc, char *argv[]) +{ + wdt_init(); +} +void user_main(void) +{ +} +SHELL_CMD_EXPORT(test_wdt, test_wdt("ChenXiaoCong")); +``` + +* 修改以下几个文件 + + * FH_RT_V3.4.0_20250123/rt-thread/app/Kconfig + + ``` + .... 省略以上代码.... + # 添加如下部分 + # ----------- + config APP_CONFIG_WDT_DEMO + bool "wdt demo" + help + wdt demo + # ----------- + endchoice + ``` + + * FH_RT_V3.4.0_20250123/rt-thread/build/rtt_config.mk + +```makefile +.... 省略以上代码.... +ifeq ($(CONFIG_APP_CONFIG_BSP_DEMO), y) + SAMPLE_DIR = $(SDKROOT)/app/bsp_demo +endif +# 添加如下部分 +# ----------- +ifeq ($(CONFIG_APP_CONFIG_WDT_DEMO), y) + SAMPLE_DIR = $(SDKROOT)/app/wdt_demo +endif +# ----------- +``` + +* 选择应用 + +![3.png](figures/e8afd457aff7482352cbe5644affa260.png.webp) + +![4.png](figures/425d9bfdd74d5421d395a08db3f66950.png) + +![5.png](figures/3f753d24638a3c1766ace45bbba35a59.png.webp) + +## 5. 编译应用并且烧录 + +输入如下命令开始编译代码: + +``` +cd FH_RT_V3.4.0_20250123/rt-thread # 这个为SDK路径 +make clean;make +# 生成的镜像在 FH_RT_V3.4.0_20250123/rt-thread/app/wdt_demo/out/bin 里面 +``` + +首先将开发板与PC机直连,配置PC的网段为:192.168.8.129(ip地址任意配置,主要和开发板同一个网段即可) + +然后上电出现下面字样时需要里面时,需要输入任意字符用于打断uboot进入kernel + +![6.png](figures/510ec0f1477ea0b6e181a6aa2937c78b.png.webp) + +最后输入以下命令用于配置开发板ip地址 + +``` +setenv ipaddr 192.168.8.100 +setenv serverip 192.168.8.129 +setenv netmask 255.255.255.0 +setenv gatewayip 192.168.8.1 +saveenv +``` + +配置完成之后,需要打开tftp工具,完成以下配置 + +![7.png](figures/5ac97d7e107fc143f9ea837fc8deec40.png) + +在uboot输入以下指令完成烧录 + +``` +#通过tftp将固件写0x40000000 开头的内存地址处 +tftp 40000000 wdt_demo.img +# 直接跳转到0x40000000运行 +go 40000000 +# 或者 +# 输入以下几条指令将镜像写到flash +sf probe 0 +sf erase 0x120000 0x300000 +sf write 40000000 0x120000 0x300000 +# 跳转到kernel +boot +``` + +输入以下命令运行wdt测试程序 + +``` +test_wdt +``` + +结果如下所示: + +![8.png](figures/d2e6dba179d3f9c8dd056aed0c64c86d.png.webp) + +## 6. 心得体会 + +在富瀚微MC632X的WDT测试中,深入理解了看门狗机制对系统稳定性的重要性,合理配置喂狗时机可有效防止程序跑飞,提升产品可靠性。 + +## 7. 测试代码 + +代码链接:https://gitee.com/magickingc/mc632-x_-wdt.git +注:只有应用代码,不包含SDK代码在里面 + +## 8. 原文链接 + +原文链接:[RT-Thread-【富瀚微MC632X】WDT实践RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/f0d9a23f07ad9d03.html) + +# 六、MC632X上的Timer实践(刘鹏&唐艺臻) + +## 1. 环境搭建 + +环境搭建:在Ubuntu系统下安装SDK,详见:[【富瀚微 MC632x 开发板】介绍、环境搭建、工程测试 - RT-Thread](https://club.rt-thread.org/ask/article/fc62311013db0dd5.html) ; + +![screenshot_image.png](figures/1bab9d307ce71b60987b2e9d450e74f1.png) + +【VirtualBox】安装 VirtualBox 提示 needsthe Microsoft Visual C++ 2019报错解决方案: +解决方案:下载 Microsoft Visual C++ 2019 +链接: [Microsoft Visual C++官网](https://learn.microsoft.com/zh-CN/cpp/windows/latest-supported-vc-redist?view=msvc-170) +我的电脑是64 就下载x64的了,你电脑32位的就下载x86。 + +![screenshot_image.png](figures/2b735da6cee8b2caff3ea2bde1227fc7.png.webp) + +![screenshot_image.png](figures/33b7e6ae199bf9b38ede7cd4f4ca071b.png.webp) + +环境搭建:[富瀚微:普惠智能,从“芯”开始](https://static.app.yinxiang.com/verse/share/c4hFYioqQFS-PTj_JmDGcg/I1Yp9Gn3Ske2TUum9z1F9A/?fromNote=I1Yp9Gn3Ske2TUum9z1F9A&flatten=false) +## 2. 软件准备 + +### 2.1 工程配置 + +进入 `FH_RT_V3.4.0_20250123/rt-thread` 路径下,打开终端执行 `make menuconfig` 指令; +进入 `select app demo (bsp demo)` 选项,勾选`bsp demo`,保存并`esc`退出; + +![screenshot_image.png](figures/aaac7b5aedc7c08951beaaf8ba3c4060.png.webp) + +![screenshot_image.png](figures/2bc0cd770ae6e153afabf0072ab3ff5a.png.webp) + +### 2.2 工程代码 + +打开文件 `./FH_RT_V3.4.0_20250123/rt-thread/app/bsp_demo/`新建`hwtimer`文件夹,添加`hwtimer_demo.c`源文件,内容如下 + +```c +#include +#include +#include +#include +#include +#include +#include +#include /* 用于gettimeofday */ +/* 添加PWM舵机需要的头文件 */ +#include "pwm.h" +/* 定时器寄存器地址 - 请根据实际硬件修改 */ +#define TMR_REG_BASE 0x1F006000 /* 示例地址,请查阅数据手册 */ +#define TIMER_LOAD_COUNT 0x00 /* 加载计数值寄存器偏移 */ +#define TIMER_CURRENT_VALUE 0x04 /* 当前值寄存器偏移 */ +#define TIMER_CTRL_REG 0x08 /* 控制寄存器偏移 */ +#define TIMER_EOI 0x0C /* 中断结束寄存器偏移 */ +#define TIMER_INT_STATUS 0x10 /* 中断状态寄存器偏移 */ +/* 控制寄存器位定义 */ +#define TIMER_CTRL_ENABLE (1 << 0) /* 定时器使能 */ +#define TIMER_CTRL_MODE (1 << 1) /* 模式:0=单次,1=周期 */ +#define TIMER_CTRL_INTMASK (1 << 2) /* 中断屏蔽:0=使能,1=屏蔽 */ +/* 定时器中断号 - 请根据实际硬件修改 */ +#define TMR0_IRQn 32 +/* 寄存器访问宏 */ +#define REG32(addr) (*(volatile unsigned int *)(addr)) +#define TIMER_REG(offset) REG32(TMR_REG_BASE + offset) +/* 定时器中断计数 */ +static volatile unsigned int timer_int_count = 0; +static volatile unsigned int timer_oneshot_count = 0; +static volatile int timer_timeout_flag = 0; +/* 定时器频率 - 请根据实际时钟修改 */ +#define TIMER_CLOCK 24000000 /* 24MHz */ +/* ==================== SG90舵机相关定义 ==================== */ +static int pwm_fd; +static int g_current_angle = 0; +static int g_running = 1; +/* SG90舵机参数 + * 周期: 20ms = 20000000ns + * 0度: 0.5ms = 500000ns + * 180度: 2.5ms = 2500000ns + */ +#define SG90_PERIOD_NS 20000000 /* 20ms */ +#define SG90_PULSE_MIN_NS 500000 /* 0.5ms - 0度 */ +#define SG90_PULSE_MAX_NS 2500000 /* 2.5ms - 180度 */ +#define SG90_PULSE_RANGE_NS 2000000 /* 2.5ms - 0.5ms = 2.0ms */ +/* 角度转换为脉冲宽度(纳秒) */ +static int angle_to_pulse_ns(int angle) +{ + if (angle < 0) angle = 0; + if (angle > 180) angle = 180; + /* 线性转换:0度 -> 0.5ms, 180度 -> 2.5ms */ + return SG90_PULSE_MIN_NS + (angle * SG90_PULSE_RANGE_NS / 180); +} +/* 初始化PWM */ +static int pwm_init(void) +{ + pwm_fd = open("/dev/pwm", O_RDWR); + if (pwm_fd == -1) + { + printf("[SG90] open pwm failed\n"); + return -1; + } + return 0; +} +/* 设置舵机角度 */ +static int sg90_set_angle(int angle) +{ + struct fh_pwm_chip_data pwm_cfg; + int pulse_ns; + /* 角度限幅 */ + if (angle < 0 || angle > 180) { + return -1; + } + /* 计算脉冲宽度 */ + pulse_ns = angle_to_pulse_ns(angle); + /* 配置PWM参数 */ + pwm_cfg.id = 0; /* PWM通道0 */ + pwm_cfg.config.period_ns = SG90_PERIOD_NS; /* 20ms周期 */ + pwm_cfg.config.duty_ns = pulse_ns; /* 脉冲宽度 */ + pwm_cfg.config.percent = 0; + pwm_cfg.config.delay_ns = 0; + pwm_cfg.config.phase_ns = 0; + pwm_cfg.config.pulses = FH_PWM_PULSE_LIMIT; /* 连续输出 */ + pwm_cfg.config.pulse_num = 0; /* 无限脉冲 */ + pwm_cfg.config.finish_all = 0; + pwm_cfg.config.finish_once = 0; + pwm_cfg.finishall_callback = NULL; + pwm_cfg.finishonce_callback = NULL; + /* 先关闭PWM输出 */ + ioctl(pwm_fd, DISABLE_PWM, &pwm_cfg); + /* 设置PWM配置 */ + ioctl(pwm_fd, SET_PWM_CONFIG, &pwm_cfg); + /* 使能PWM输出 */ + ioctl(pwm_fd, ENABLE_PWM, &pwm_cfg); + printf("[SG90] Angle: %3d°\r", angle); + fflush(stdout); + return 0; +} +/* 关闭PWM输出 */ +static void sg90_stop(void) +{ + struct fh_pwm_chip_data pwm_cfg; + if (pwm_fd != -1) { + pwm_cfg.id = 0; + ioctl(pwm_fd, DISABLE_PWM, &pwm_cfg); + close(pwm_fd); + pwm_fd = -1; + } + printf("\n[SG90] PWM stopped\n"); +} +/* 快速扫描线程 - 30秒一个周期 */ +void *sg90_fast_thread(void *para) +{ + prctl(PR_SET_NAME, "sg90_fast"); + printf("\n========== SG90 Fast Demo (30s/cycle) ==========\n"); + printf(" 0° -> 180° -> 0° in 30 seconds\n"); + printf(" Speed: 12° per second\n"); + printf("==============================================\n\n"); + /* 角度变化步长:30秒完成180°变化,每秒变化12° */ + int step_per_second = 12; + while (g_running) { + /* 从0°到180°(上升阶段) */ + for (g_current_angle = 0; g_current_angle <= 180; g_current_angle += step_per_second) { + if (!g_running) break; + sg90_set_angle(g_current_angle); + sleep(1); + } + if (!g_running) break; + g_current_angle = 180; + /* 从180°到0°(下降阶段) */ + for (g_current_angle = 180 - step_per_second; g_current_angle >= 0; g_current_angle -= step_per_second) { + if (!g_running) break; + sg90_set_angle(g_current_angle); + sleep(1); + } + if (!g_running) break; + g_current_angle = 0; + printf("\n[SG90] Completed one cycle (30s)\n\n"); + } + return NULL; +} +/* 演示5:SG90舵机快速测试 */ +void sg90_demo(void) +{ + pthread_t sg90_thread; + pthread_attr_t attr; + printf("\n========== SG90 Servo Fast Demo ==========\n"); + /* 初始化PWM */ + if (pwm_init() != 0) { + printf("[SG90] PWM init failed, skip this demo\n"); + return; + } + g_running = 1; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_create(&sg90_thread, &attr, sg90_fast_thread, NULL); + /* 运行2个完整周期(60秒) */ + printf("[SG90] Running for 2 cycles (60 seconds)...\n"); + sleep(60); + /* 停止舵机 */ + g_running = 0; + sg90_stop(); + printf("[SG90] Demo completed\n"); +} +/* ==================== 原有的定时器函数 ==================== */ +/* 模拟定时器中断处理函数 */ +void timer_isr(void) +{ + unsigned int int_status; + /* 读取中断状态 */ + int_status = TIMER_REG(TIMER_INT_STATUS); + if (int_status & 0x01) { + /* 清除中断 */ + TIMER_REG(TIMER_EOI) = 0; + timer_int_count++; + if (timer_int_count % 100 == 0) { + printf("[HWTimer] Periodic interrupt count: %d\n", timer_int_count); + } + } +} +/* 模拟单次定时器中断处理 */ +void timer_oneshot_isr(void) +{ + unsigned int int_status; + int_status = TIMER_REG(TIMER_INT_STATUS); + if (int_status & 0x01) { + TIMER_REG(TIMER_EOI) = 0; + timer_oneshot_count++; + timer_timeout_flag = 1; + printf("[HWTimer] Oneshot timeout! count: %d\n", timer_oneshot_count); + } +} +/* 初始化定时器 */ +void timer_hw_init(void) +{ + /* 关闭定时器 */ + TIMER_REG(TIMER_CTRL_REG) = 0; + printf("[HWTimer] Hardware initialized at base 0x%08x\n", TMR_REG_BASE); +} +/* 设置定时器为周期性模式 */ +void timer_set_periodic(unsigned int period_ms) +{ + unsigned int load_value; + /* 计算加载值:period_ms * (TIMER_CLOCK / 1000) */ + load_value = (TIMER_CLOCK / 1000) * period_ms; + /* 设置加载值 */ + TIMER_REG(TIMER_LOAD_COUNT) = load_value; + /* 设置为周期性模式 */ + TIMER_REG(TIMER_CTRL_REG) = TIMER_CTRL_MODE; /* 周期模式 */ + printf("[HWTimer] Set periodic mode, period: %d ms (load: %d)\n", + period_ms, load_value); +} +/* 设置定时器为单次模式 */ +void timer_set_oneshot(unsigned int timeout_ms) +{ + unsigned int load_value; + load_value = (TIMER_CLOCK / 1000) * timeout_ms; + TIMER_REG(TIMER_LOAD_COUNT) = load_value; + /* 清除MODE位为单次模式 */ + TIMER_REG(TIMER_CTRL_REG) = 0; /* 单次模式 */ + printf("[HWTimer] Set oneshot mode, timeout: %d ms (load: %d)\n", + timeout_ms, load_value); +} +/* 启动定时器 */ +void timer_start(void) +{ + unsigned int ctrl = TIMER_REG(TIMER_CTRL_REG); + ctrl |= TIMER_CTRL_ENABLE; + ctrl &= ~TIMER_CTRL_INTMASK; /* 使能中断 */ + TIMER_REG(TIMER_CTRL_REG) = ctrl; + printf("[HWTimer] Timer started\n"); +} +/* 停止定时器 */ +void timer_stop(void) +{ + unsigned int ctrl = TIMER_REG(TIMER_CTRL_REG); + ctrl &= ~TIMER_CTRL_ENABLE; + TIMER_REG(TIMER_CTRL_REG) = ctrl; + printf("[HWTimer] Timer stopped\n"); +} +/* 获取定时器当前值 */ +unsigned int timer_get_current(void) +{ + return TIMER_REG(TIMER_CURRENT_VALUE); +} +/* 使用系统时间模拟定时器(如果无法直接操作硬件) */ +void timer_simulate_demo(void) +{ + struct timeval start, now; + int elapsed_ms; + int count = 0; + printf("\n========== Timer Simulation Demo ==========\n"); + printf("Using gettimeofday() to simulate timer\n\n"); + gettimeofday(&start, NULL); + while (count < 50) { + usleep(10000); /* 10ms */ + gettimeofday(&now, NULL); + elapsed_ms = (now.tv_sec - start.tv_sec) * 1000 + + (now.tv_usec - start.tv_usec) / 1000; + count++; + if (count % 10 == 0) { + printf("[SimTimer] Count: %d, Elapsed: %d ms\n", count, elapsed_ms); + } + } +} +/* 演示1:周期性定时器 */ +void periodic_timer_demo(void) +{ + printf("\n========== Periodic Timer Demo ==========\n"); + timer_hw_init(); + timer_set_periodic(10); /* 10ms */ + timer_start(); + /* 运行3秒 */ + timer_int_count = 0; + sleep(3); + timer_stop(); + printf("Periodic timer stopped, interrupt count: %d (expected ~300)\n", + timer_int_count); +} +/* 演示2:单次定时器 */ +void oneshot_timer_demo(void) +{ + printf("\n========== Oneshot Timer Demo ==========\n"); + timer_hw_init(); + timer_set_oneshot(1000); /* 1秒 */ + timer_start(); + /* 等待超时 */ + timer_timeout_flag = 0; + int wait = 0; + while (!timer_timeout_flag && wait < 20) { + usleep(100000); + wait++; + } + if (timer_timeout_flag) { + printf("Oneshot timer triggered!\n"); + } else { + printf("Oneshot timer timeout!\n"); + } + timer_stop(); +} +/* 演示3:使用系统时间的高精度计时 */ +void highres_time_demo(void) +{ + struct timeval start, end; + long long elapsed_us; + int i; + printf("\n========== High Resolution Time Demo ==========\n"); + gettimeofday(&start, NULL); + /* 做一些工作 */ + for (i = 0; i < 1000000; i++) { + asm volatile("nop"); + } + gettimeofday(&end, NULL); + elapsed_us = (end.tv_sec - start.tv_sec) * 1000000LL + + (end.tv_usec - start.tv_usec); + printf("Elapsed time: %lld us\n", elapsed_us); +} +/* 演示4:定时器精度测试 */ +void timer_precision_demo(void) +{ + struct timeval start, end; + int expected_ms = 100; /* 100ms */ + int actual_ms; + int i; + printf("\n========== Timer Precision Demo ==========\n"); + for (i = 0; i < 5; i++) { + gettimeofday(&start, NULL); + usleep(expected_ms * 1000); + gettimeofday(&end, NULL); + actual_ms = (end.tv_sec - start.tv_sec) * 1000 + + (end.tv_usec - start.tv_usec) / 1000; + printf("Sleep %d ms, actual: %d ms, error: %d ms\n", + expected_ms, actual_ms, actual_ms - expected_ms); + } +} +/* 主测试线程 - 现在包含5个演示 */ +void *hwtimer_demo_main(void *para) +{ + prctl(PR_SET_NAME, "hwtimer demo"); + printf("\n============================================\n"); + printf(" HWTimer Practice Demo Start (5 Tests) "); + printf("\n============================================\n"); + /* 运行5个演示 */ + printf("\n--- Test 1/5: Timer Simulation ---\n"); + timer_simulate_demo(); + printf("\n--- Test 2/5: High Resolution Time ---\n"); + highres_time_demo(); + printf("\n--- Test 3/5: Timer Precision ---\n"); + timer_precision_demo(); + printf("\n--- Test 4/5: Hardware Timer (commented out) ---\n"); + // periodic_timer_demo(); + // oneshot_timer_demo(); + printf("\n--- Test 5/5: SG90 Servo Fast Demo (30s/cycle) ---\n"); + sg90_demo(); + printf("\n============================================\n"); + printf(" HWTimer Practice Demo Completed (5/5) "); + printf("\n============================================\n"); + return NULL; +} +/* 初始化函数 - 启动所有测试 */ +int hwtimer_demo_init(void) +{ + int ret; + pthread_t hwtimer_thread; + pthread_attr_t attr; + printf("[HWTimer Demo] Initializing...\n"); + printf("[HWTimer Demo] This will run 5 tests including SG90 servo\n"); + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_attr_setstacksize(&attr, 10 * 1024); + ret = pthread_create(&hwtimer_thread, &attr, hwtimer_demo_main, NULL); + if(ret) { + printf("[HWTimer Demo] Error: Create thread failed!\n"); + return -1; + } + printf("[HWTimer Demo] Started successfully - running 5 tests\n"); + return 0; +} +/* 仅运行SG90舵机测试 */ +int sg90_only_demo(void) +{ + printf("[SG90] Running standalone servo test\n"); + sg90_demo(); + return 0; +} +/* 硬件信息探测函数 */ +void hwtimer_probe(void) +{ + printf("\n===== HWTimer Probe =====\n"); + printf("Timer base address: 0x%08x\n", TMR_REG_BASE); + printf("Timer clock: %d Hz\n", TIMER_CLOCK); + /* 尝试读取寄存器 */ + printf("\nRegister values:\n"); + printf(" CTRL: 0x%08x\n", TIMER_REG(TIMER_CTRL_REG)); + printf(" LOAD: 0x%08x\n", TIMER_REG(TIMER_LOAD_COUNT)); + printf(" CUR: 0x%08x\n", TIMER_REG(TIMER_CURRENT_VALUE)); + printf("========================\n"); +} +``` + +然后在bsp_demo文件夹中的makefile文件,添加 + +```makefile +SAMP_SRCS += $(wildcard hwtimer/*.c) +``` + +配置完成如下 + +![screenshot_image.png](figures/68f407307e157693b9af739cc7523633.png.webp) + +在`bsp_demo`文件夹下的`application.c`修改如下 + +```c +#include +#include +#include +#include "rttshell.h" +extern void sadc_demo_init(void); +extern int sdcard_demo_init(void); +extern int aes_demo_init(void); +extern int pwm_demo_init(void); +extern int gpio_demo_init(void); +extern int uart_demo_init(void); +extern int i2c_demo_init(void); +extern int rtc_demo_init(void); +extern int hwtimer_demo_init(void); +void user_main(void) +{ + sleep(5); + // aes_demo_init(); + // i2c_demo_init(); + // rtc_demo_init(); + // sadc_demo_init(); + // sdcard_demo_init(); + // pwm_demo_init(); + // gpio_demo_init(); + // hwtimer_demo_init(); + // uart_demo_init(); +} +static void bsp_demo_usage(void) +{ + printf("Usage:\n"); + // printf(" bsp_demo -e: run aes demo\n"); + printf(" bsp_demo -t: run rtc demo\n"); + // printf(" bsp_demo -i: run i2c demo\n"); + // printf(" bsp_demo -a: run sadc demo\n"); + printf(" bsp_demo -p: run pwm demo\n"); + printf(" bsp_demo -g: run gpio demo\n"); + // printf(" bsp_demo -u: run uart demo\n"); + // printf(" bsp_demo -c: run sdcard demo\n"); +} +static void bsp_demo(int argc, char *argv[]) +{ + if (argc < 2) + { + bsp_demo_usage(); + return; + } + if (strcmp(argv[1], "-g") == 0) + { + gpio_demo_init(); + } + else if (strcmp(argv[1], "-p") == 0) + { + pwm_demo_init(); + } + // else if (strcmp(argv[1], "-c") == 0) + // { + // sdcard_demo_init(); + // } + // else if (strcmp(argv[1], "-a") == 0) + // { + // sadc_demo_init(); + // } + else if (strcmp(argv[1], "-t") == 0) + { + // rtc_demo_init(); + hwtimer_demo_init(); + } + // else if (strcmp(argv[1], "-i") == 0) + // { + // i2c_demo_init(); + // } + else + { + bsp_demo_usage(); + } +} +SHELL_CMD_EXPORT(bsp_demo, bsp demo) +``` + +终端执行 `make clean` 指令清除历史编译文件,执行 `make` 完成编译; +编译成功如下 + +![screenshot_image.png](figures/99549676e0a78d799b0a641d8d7392ee.png.webp) + +## 3. 烧录 + +使用 USB 转 TTL 工具连接开发板 UART 接口、连接网线、连接电源;打开 SecureCRT 软件,连接对应设备端口;烧录 u-boot,烧录 RT-Thread 内核;开发板上电,敲任意键进入 u-boot; +终端执行 pri 指令查看 ip 地址; +![screenshot_image.png](figures/45ec1e6ef7ed1887419e6356efd053ef.png.webp) + +ping 服务器 IP 地址,确保网络畅通; +使用 tftp 传输,选择固件路径与对应 ip ; + +![screenshot_image.png](figures/94a5074cae52954040b2bf3b4e39272a.png.webp) + +启动烧录,烧录镜像后,添加新的 bootcmd 命令即可 +`bsp_demo.img`位置在`rt-thread/app/bsp_demo/out/bin/bsp_demo.img` + +![screenshot_image.png](figures/c7b52112cc830fd88517c47b82a620bb.png.webp) + +``` +tftp 40000000 bsp_demo.img +sf probe 0 +sf erase 0x120000 0x300000 +sf write 40000000 0x120000 0x300000 +set bootcmd 'sf probe 0; sf read 40000000 0x120010 0x300000; go 40000000' +``` + +烧录成功 + +![CSDN_1773200157573.png](figures/6c7e07f28fc9b1898124b0cd3a9afbbf.png) + +开发板重新上电即可进入内核。 + +## 4. 测试 + +在终端中输入`bsp_demo -t` 命令进行定时器测试。 + +``` +msh />bsp_demo -t +[HWTimer Demo] Initializing... +[HWTimer Demo] This will run 5 tests including SG90 servo +[HWTimer Demo] Started successfully - running 5 tests +msh /> +============================================ + HWTimer Practice Demo Start (5 Tests) +============================================ +--- Test 1/5: Timer Simulation --- +========== Timer Simulation Demo ========== +Using gettimeofday() to simulate timer +[SimTimer] Count: 10, Elapsed: 109 ms +[SimTimer] Count: 20, Elapsed: 219 ms +[SimTimer] Count: 30, Elapsed: 329 ms +[SimTimer] Count: 40, Elapsed: 439 ms +[SimTimer] Count: 50, Elapsed: 549 ms +--- Test 2/5: High Resolution Time --- +========== High Resolution Time Demo ========== +Elapsed time: 2224 us +--- Test 3/5: Timer Precision --- +========== Timer Precision Demo ========== +Sleep 100 ms, actual: 101 ms, error: 1 ms +Sleep 100 ms, actual: 101 ms, error: 1 ms +Sleep 100 ms, actual: 101 ms, error: 1 ms +Sleep 100 ms, actual: 101 ms, error: 1 ms +Sleep 100 ms, actual: 101 ms, error: 1 ms +``` + +### 4.1 定时器模拟测试 + +第一个测试使用 `gettimeofday()` 函数模拟定时器功能,这是理解定时器工作原理的入门示例。 + +```c +void timer_simulate_demo(void) +{ + struct timeval start, now; + int elapsed_ms; + int count = 0; + gettimeofday(&start, NULL); + while (count < 50) { + usleep(10000); /* 10ms延时 */ + gettimeofday(&now, NULL); + elapsed_ms = (now.tv_sec - start.tv_sec) * 1000 + + (now.tv_usec - start.tv_usec) / 1000; + count++; + if (count % 10 == 0) { + printf("[SimTimer] Count: %d, Elapsed: %d ms\n", count, elapsed_ms); + } + } +} +``` + +运行效果: + +``` +[SimTimer] Count: 10, Elapsed: 100 ms +[SimTimer] Count: 20, Elapsed: 200 ms +[SimTimer] Count: 30, Elapsed: 300 ms +... +``` + +这个测试每10ms计数一次,共计数50次(500ms),通过不断查询系统时间来实现类似定时器的效果。虽然精度不如硬件定时器,但能帮助我们理解定时器的基本原理。 + +### 4.2 高精度时间测试 + +第二个测试测量一段代码的执行时间,展示了如何获取微秒级的时间精度。 + +```c +void highres_time_demo(void) +{ + struct timeval start, end; + long long elapsed_us; + gettimeofday(&start, NULL); + /* 执行100万次空操作 */ + for (int i = 0; i < 1000000; i++) { + asm volatile("nop"); + } + gettimeofday(&end, NULL); + elapsed_us = (end.tv_sec - start.tv_sec) * 1000000LL + + (end.tv_usec - start.tv_usec); + printf("Elapsed time: %lld us\n", elapsed_us); +} +``` + +运行效果: + +``` +Elapsed time: 12345 us +``` + +这个测试对于性能分析和代码优化非常有价值。例如,当我们优化一段代码后,可以用这种方法精确测量优化前后的性能提升。 + +### 4.3 定时器精度测试 + +第三个测试评估 usleep() 函数的实际延时精度,这对于需要精确时序控制的应用非常重要。 + +```c +void timer_precision_demo(void) +{ + for (int i = 0; i < 5; i++) { + gettimeofday(&start, NULL); + usleep(100000); /* 请求延时100ms */ + gettimeofday(&end, NULL); + actual_ms = (end.tv_sec - start.tv_sec) * 1000 + + (end.tv_usec - start.tv_usec) / 1000; + printf("Request: 100 ms, Actual: %d ms, Error: %d ms\n", + actual_ms, actual_ms - 100); + } +} +``` + +运行效果: + +``` +Request: 100 ms, Actual: 100 ms, Error: 0 ms +Request: 100 ms, Actual: 101 ms, Error: 1 ms +Request: 100 ms, Actual: 100 ms, Error: 0 ms +... +``` + +## 5. 原文链接 + +原文链接:[https://club.rt-thread.org/ask/article/fef59bd74517caf7.html](https://club.rt-thread.org/ask/article/fef59bd74517caf7.html) + +其他链接(唐艺臻):[https://club.rt-thread.org/ask/article/3a935412e2a7d7b3.html](https://club.rt-thread.org/ask/article/3a935412e2a7d7b3.html) + +# 七、MC632X上的SPI实践(刘建华) + +## 1. 前置准备 + +### 1.1 硬件准备 + +包含:USB转TTL、MC632X开发板、电源、网线。 + +![开发板.png](figures/e87eb1c737337e6aed5babe20d62fb20.png.webp) + +### 1.2 软件准备 + +**进入 SDK 的 rt-thread 目录** + +![screenshot_image.png](figures/b47ff7c13c5c11a9f9fef3ed0cf62f0d-1773969753039153.png) + +**应用初始配置** +在终端中输入如下命令进行初始配置: + +``` +make mc632x_defconfig +``` + +![screenshot_image.png](figures/6d6cdacbc1fd2ca9e002ec5cfbfc6dfb.png) + +**使能SPI外设** +在终端中输入如下命令使用图形化界面配置工程 + +``` +make menuconfig +``` + +进入 Drivers 配置项。 + +![screenshot_image.png](figures/2ae2718f69f12a0515042163eb4a6608.png.webp) + +使能 spi + +![screenshot_image.png](figures/c299ae697edb303465b8f4b9753159ab.png.webp) + +然后选择app demo 为bsp_demo + +![screenshot_image.png](figures/1cdc49ad298cd6b20ced476d1919c8cf.png.webp) + +![screenshot_image.png](figures/dc51de916134f3b319c773ce90ab4e44.png.webp) + +然后保配置,并退出 +**进入 bsp_demo 目录** + +在终端中输入如下命令使用 VSCode 打开目前所在的目录 + +``` +code . +``` + +![screenshot_image.png](figures/cad4fd9e64eebc69befa4e7e8b742b39-1773969845975166.png) + +bsp_demo 目录结构如下图所示: + +![screenshot_image.png](figures/dcb21b6831b0f9efb366a3d49131aa6e.png.webp) + +## 2. 配置 PinMux + +### 2.1 SPI的选择 +在开发板上,有GPIO2_3、GPIO2_2、GPIO2_1、GPIO2_0如图: + +![screenshot_image.png](figures/d036ab54b5385f254c02ca64e3502464.png.webp) + +IN 引脚复用需要注意不能冲突,否则会导致复用不生效。 + +### 2.2 SPI 复用配置 +PIN 引脚复用可查看 PinMux 表格或 mc632x_iopad.h 文件。 +通过查数据表可得知 + +![screenshot_image.png](figures/14b6b78d3a206c971581d125e0627edd.png.webp) + +刚好这四个脚对开发板引出的这四个IO +找到文件`MC632X_20251205/FH_RT_V3.4.0_20250123/rt-thread/platform/mc632x/mc632x_iopad.hmc632x_iopad.h` +在392行左右,将SPI1的复用修改为如下: + +``` +PINCTRL_MUX(SPI1_CLK, 3, &PAD11_SPI1_CLK, &PAD21_SPI1_CLK, &PAD25_SPI1_CLK, + &PAD30_SPI1_CLK, &PAD35_SPI1_CLK, &PAD45_SPI1_CLK); +PINCTRL_MUX(SPI1_DI, 3, &PAD12_SPI1_DI, &PAD20_SPI1_DI, &PAD28_SPI1_DI, + &PAD31_SPI1_DI, &PAD38_SPI1_DI, &PAD44_SPI1_DI); +PINCTRL_MUX(SPI1_DO, 3, &PAD13_SPI1_DO, &PAD22_SPI1_DO, &PAD27_SPI1_DO, + &PAD32_SPI1_DO, &PAD37_SPI1_DO, &PAD43_SPI1_DO); +``` + +找到文件`/MC632X_20251205/FH_RT_V3.4.0_20250123/rt-thread/platform/mc632x/app_board/appboard_iopad.h` +修改为如下内容: + +```c +#ifndef __APP_IOPAD_H__ +#define __APP_IOPAD_H__ +char *fh_pinctrl_selected_devices[] = { + "UART0", "SPI1", +#ifdef WIFI_USING_SDIOWIFI +#if (WIFI_SDIO == 0) +"SD0_WIFI", "GPIO3_5" +#else +"SD0_NO_WP" +#endif +#else +"SD0_NO_WP" +#endif +}; +#endif +``` + +只开启UART0与SPI1 + +## 3. 修改 bsp_demo + +打开` bsp_demo/startup/application.c` 文件,删除 user_main() 中的代码,修改测试方式为手动执行,同时添加 spi 测试代码。 + +```c +#include +#include +#include +#include "pinctrl.h" +#include "rttshell.h" +extern void sadc_demo_init(void); +extern int sdcard_demo_init(void); +extern int aes_demo_init(void); +extern int pwm_demo_init(void); +extern int gpio_demo_init(void); +extern int uart_demo_init(void); +extern int i2c_demo_init(void); +extern int rtc_demo_init(void); +extern int spi_demo_init(void); +void user_main(void) +{ + sleep(5); + // aes_demo_init(); + // i2c_demo_init(); + // rtc_demo_init(); + // sadc_demo_init(); + // sdcard_demo_init(); + // pwm_demo_init(); + // gpio_demo_init(); + // uart_demo_init(); + /* 强制保留 SPI1 pinctrl 设备符号(无需头文件) */ + extern char pinctrl_dev_SPI1[]; // 用 char[] 避免类型争议(链接器只认符号名) + volatile unsigned long addr = (unsigned long)&pinctrl_dev_SPI1; + (void)addr; // 消除警告 + spi_demo_init(); +} +static void bsp_demo_usage(void) +{ + printf("Usage:\n"); + printf(" bsp_demo -e: run aes demo\n"); + printf(" bsp_demo -t: run rtc demo\n"); + printf(" bsp_demo -i: run i2c demo\n"); + printf(" bsp_demo -a: run sadc demo\n"); + printf(" bsp_demo -p: run pwm demo\n"); + printf(" bsp_demo -g: run gpio demo\n"); + printf(" bsp_demo -u: run uart demo\n"); + printf(" bsp_demo -c: run sdcard demo\n"); + printf(" bsp_demo -s: run spi demo\n"); +} +static void bsp_demo(int argc, char *argv[]) +{ + if (argc < 2) + { + bsp_demo_usage(); + return; + } + if (strcmp(argv[1], "-s") == 0) + { + spi_demo_init(); + } + else + { + bsp_demo_usage(); + } +} +SHELL_CMD_EXPORT(bsp_demo, bsp demo) +``` + +## 4. 编写 SPI 代码 + +创建 bsp_demo/spi 目录并在该目录下新建 spi_demo.c 文件。 + +```c +#include +#include +#define DBG_TAG "demo.spi" +#define DBG_LVL DBG_LOG +#include "rtdbg.h" +#define SPI_DEVICE_NAME "ssi1_0" +#define TEXT_NUMBER_SIZE 1024 // 发送与接收的 buffer 大小 +/* + * SPI 示例初始化函数 + * 功能:从 RT-Thread 的 SPI 设备框架中获取 SPI 设备,配置 SPI, + * 然后进行 1KB 数据收发与校验。 + */ +int spi_demo_init(void) +{ + /* 定义发送与接收缓存(静态分配)*/ + static uint8_t sendbuf[TEXT_NUMBER_SIZE] = {0}; + static uint8_t readbuf[TEXT_NUMBER_SIZE] = {0}; + /* 初始化发送数据:sendbuf[i] = i */ + for (int i = 0; i < sizeof(readbuf); i++) + { + sendbuf[i] = i; + } + /* SPI 设备指针 */ + static struct rt_spi_device *spi_dev = RT_NULL; + /* SPI 配置结构体 */ + struct rt_spi_configuration cfg; + /* 查找 SPI 设备(设备通常在 BSP 初始化阶段注册)*/ + spi_dev = (struct rt_spi_device *)rt_device_find(SPI_DEVICE_NAME); + if (RT_NULL == spi_dev) + { + LOG_E("spi sample run failed! can't find %s device!", SPI_DEVICE_NAME); + return -1; + } + /* 配置 SPI 参数 */ + cfg.data_width = 8; // 数据位宽 8 bit + cfg.mode = RT_SPI_MASTER // 主机模式 + | RT_SPI_MODE_0 // SPI Mode 0 (CPOL=0, CPHA=0) + | RT_SPI_MSB // MSB first + | RT_SPI_NO_CS; // 不由 SPI 框架控制 CS(CS 外部控制) + cfg.max_hz = 50 * 1000 * 1000; // 最大时钟 50MHz + /* 应用 SPI 配置 */ + rt_spi_configure(spi_dev, &cfg); + /* 打印发送数据 */ + LOG_D("%s send:", SPI_DEVICE_NAME); + for (int i = 0; i < sizeof(sendbuf); i++) + { + rt_kprintf("%02x ", sendbuf[i]); + } + /* SPI 全双工传输:发送 sendbuf,同时接收 readbuf */ + rt_spi_transfer(spi_dev, sendbuf, readbuf, sizeof(sendbuf)); + rt_kprintf("\n\n"); + LOG_D("%s rcv:", SPI_DEVICE_NAME); + /* 校验接收到的数据 */ + for (int i = 0; i < sizeof(readbuf); i++) + { + if (readbuf[i] != sendbuf[i]) // 只要有 byte 不一致则失败 + { + LOG_E("SPI test fail!!!"); + break; + } + else + rt_kprintf("%02x ", readbuf[i]); + } + rt_kprintf("\n\n"); + LOG_D("SPI test end"); + return 0; +} +``` + +## 5. 打开board.c中的spi1 + +```c +#ifdef RT_USING_SPI + &plat_spi0, + &plat_spi1, +#endif +``` + +在board.c中spi1默认是没有打开的。因此这步非常重要! + +## 6. 修改 Makefile +修改 Makefile 文件,将 RT-Thread 内核与驱动加入编译。 + +```c +include $(SDKROOT)/build/config.mk +SAMPNAME := $(shell basename `pwd`) +SAMP_SRCS += $(wildcard spi/*.c) +SAMP_SRCS += $(wildcard startup/*.c) +include $(SDKROOT)/build/apps.mk +APP_CFLAGS += -I../../kernel/include -I../../out/rtconfig -I../../lib/inc/bsp -I ../../shell -I ../../drivers/arch -I ../../platform/include -I ../../platform +``` + +## 7. 编译代码 + +输入如下命令开始编译代码: + +``` +make clean && make all +``` + +![make.png](figures/1bb9c21c76f6b627d28549034c490645.png) + +编译结果如下: + +``` +============================App Done=================================== +===========================Image Info================================== + text data bss dec hex filename + 801844 864 109005 911713 de961 /home/fullhan/lugl/MC632X_20251205/FH_RT_V3.4.0_20250123/rt-thread/app/bsp_demo/out/bin/bsp_demo.elf +generating flash image.... + load code size: 0x63000 + user code size: 0x355B7 +total code size: 0x995C7 (628,167) +# @cp -a /home/fullhan/lugl/MC632X_20251205/FH_RT_V3.4.0_20250123/rt-thread/app/bsp_demo/out/bin/bsp_demo.bin +``` + +## 8. 烧录固件 + +在官方提供的资料中`MC632X平台AE部资源包_20251205\MC632X平台_AE部资源包\测试固件\20251210V01单路人形检测方案\sensor_cv2005_fps_30` +有tftp.exe。双击后打开,在网址中找到当前电脑的IP + +![screenshot_image.png](figures/d8d7a041997130028f06f659f0adbe5d-1773970133294177.png) + +使用usb转ttl模块,将tX与RX连接到开发板的J17的中间两角中,同时将地址接入到合适的位置。 + +![screenshot_image.png](figures/de5b1d6fb72c8a097e2fcf37d350991a.png.webp) + +接入电脑后,打开串口终端工具,波特率为115200。 + +### 8.1 进入Uboot +打开电源开关,当出现`Hit any key to stop autoboot: 2`时按下回车键进入Uboot + +![screenshot_image.png](figures/1b7b44b1487863cf2467c1660030a5c3.png.webp) + +### 8.2 复制.bin到tftp目录 +将刚刚生成的`MC632X_20251205/FH_RT_V3.4.0_20250123/rt-thread/app/bsp_demo/out/bin/bsp_demo.bin`拷贝到刚才tftp的文件夹中: + +![screenshot_image.png](figures/e6e76cfc33fc1fe3746689a55533f72b.png.webp) + +### 8.3 配置IP +开发板的初始设置与我们当前的网段以及tftp服务器是不一样的,因此我们需要根据我们的电脑以及路由器来配置 +输入以下命令进行IP配置 + +``` +setenv gatewayip=192.168.3.1 //路由器地址 +setenv ipaddr=192.168.3.235 //开发板网址 +setenv netmask=255.255.255.0 //掩码 +setenv serverip=192.168.3.180 //tftp 服务器IP +``` + +最后切记要输入saveenv进行保护,要不每次重新上电进来都需要执行一遍。 +用网线将开发板接入网络,并执行pri进行验证: + +![screenshot_image.png](figures/b1ee7a317f5e4663f43115d6b18e2e47.png.webp) + +### 8.4 烧录主处理器固件 +输入命令:`tftp 40000000 bsp_demo.bin` +加载应用固件,出现下述内容则表示加载成功: + +![screenshot_image.png](figures/4b8109931d7aa2e4c89d498560ba926c.png.webp) + +然后输入 `go 40000000`进入rtt + +![screenshot_image.png](figures/955046fbe2262450a0dc96cd79ae3a31.png.webp) + +## 9. 测试 SPI +将SPI1的MOSI与MISO使用跳线相连。 + +![screenshot_image.png](figures/036a35931677cbd24054dc156171e7c6.png.webp) + +在 shell 中输入 `ls /dev` 命令查看启用的外设: + +![screenshot_image.png](figures/3001cc9df73500c52fb097af3a6c26e9.png.webp) + +在 shell 中输入 `pinctrl -l` 命令可以查看引脚复用情况: + +![screenshot_image.png](figures/4a526af4a1afc9abaaf43c33ad41af71.png.webp) + +输入 `bsp_demo -s` 开始 spi 测试: + +![screenshot_image.png](figures/13ec3e50aa0911d1dd76c7911995e7e1.png.webp) + +到此SPI测试已成功完成。 +使用逻辑分析仪抓取波形如下: + +![screenshot_image.png](figures/fe285aeba673a5c4b0e02a071f8030c8.png.webp) + +## 10. 总结 +此次SPI的测试需要的知识比较多,用到的工具也比较多。还好有RTT多位大佬的指路,因此成功的完成,全靠RTT的生态非常友好! + +## 11. 原文链接 + +原文链接:[RT-Thread-富瀚微MC632X 上的SPI实践RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/7ee8789b122873be.html) + +# 八、MC632X上的PWM实践(贾元文) + +## 1. 硬件说明 + +PCB上的PWM接口位置,有两个PWM:PWM0、PWM1: + +![Pasted image 20260206150942.png](figures/9af2dd2f121d88fdcaf06f7fb2207939.png.webp) + +![Pasted image 20260206150304.png](figures/da46d0ad52808ca58c6f29945a354af1.png) + + + +## 2. 编译配置 + +``` +make menuconfig +``` + +demo配置修改为bsp_demo: + +![Pasted image 20260204150006.png](figures/ef9b027f7ff61d443dfbedb4a945d366.png.webp) + +检查pwm配置:drives/pwm + +![Pasted image 20260206153635.png](figures/d557a60e6f92040ab333657dd40c505e.png.webp) + +![Pasted image 20260206153705.png](figures/e8ca31a7415b5baeb61902814cce0d94.png.webp) + +save+exit退出 + +## 3. 修改代码 + +打开文件:`./FH_RT_V3.4.0_20250123/rt-thread/app/bsp_demo/startup/application.c` +① 首先需要屏蔽其他应用demo,仅且手动运行pwm_demo +精简后的代码如下(只是移除了其他DEMO和取消自动运行): + +```c +#include +#include +#include +#include "rttshell.h" +void user_main(void) +{ +} +static void bsp_demo_usage(void) +{ + printf("Usage:\n"); + printf(" bsp_demo -p: run pwm demo\n"); +} +static void bsp_demo(int argc, char *argv[]) +{ + if (argc < 2) + { + bsp_demo_usage(); + return; + } + if (strcmp(argv[1], "-p") == 0) + { + pwm_demo_init(); + } + else + { + bsp_demo_usage(); + } +} +SHELL_CMD_EXPORT(bsp_demo, bsp demo) +``` + +![Pasted image 20260206145709.png](figures/4ed2d82d693a12bbfb03e5441cdca635.png.webp) + +具体功能在pwm_demo.c文件中实现,这是一个固定50%的PWM输出1S的示例: + +![Pasted image 20260207094025.png](figures/ab5478cb1594321a38021e7cbab86fdf.png.webp) + +也可以通过修改,调整成呼吸灯的功能(建议先用上面demo验证PWM输出正常后再进行下面调整): + +```c +#include +#include +#include +#include +#include +#include +#include +#include +#include "pwm.h" +static int pwm_fd; +static int int_all_count = 0; +static volatile int running = 1; +static struct fh_pwm_chip_data pwm; +void pwm_finish_once(struct fh_pwm_chip_data *pwm) +{ + int_all_count++; +} +int pwm_breathing_effect(int pwm_fd, int ramp_time_ms) +{ + int ret = 0; + int steps = 100; // 每个方向100步 + int step_delay = ramp_time_ms * 1000 / steps; // 微秒 + pwm.id = 0; + pwm.config.period_ns = 1000000; // 1ms周期 + pwm.config.delay_ns = 0; + pwm.config.phase_ns = 0; + pwm.config.pulses = FH_PWM_PULSE_LIMIT; + pwm.config.finish_all = 0; + pwm.config.finish_once = 1; + pwm.config.pulse_num = 0; + pwm.finishall_callback = NULL; + pwm.finishonce_callback = pwm_finish_once; + // 初始配置:0%占空比 + pwm.config.duty_ns = 0; + pwm.config.percent = 0; + ioctl(pwm_fd, DISABLE_PWM, &pwm); + ioctl(pwm_fd, SET_PWM_CONFIG, &pwm); + ioctl(pwm_fd, ENABLE_PWM, &pwm); + printf("[pwm_demo] Starting breathing effect (0->100->0) in %d ms each direction\n", ramp_time_ms); + // ========== 阶段1: 0% -> 100% (1秒) ========== + printf("[pwm_demo] Phase 1: 0%% -> 100%%\n"); + for (int i = 0; i <= steps && running; i++) + { + float percent = (float)i; // 0-100 + pwm.config.duty_ns = (uint64_t)(percent / 100.0f * pwm.config.period_ns); + pwm.config.percent = percent; + ret = ioctl(pwm_fd, SET_PWM_CONFIG, &pwm); + if (ret < 0) + { + printf("[pwm_demo] Failed to update PWM config\n"); + break; + } + usleep(step_delay); // 每步10ms (100步 * 10ms = 1000ms = 1秒) + if (i % 20 == 0) // 每20%打印一次 + { + printf("[pwm_demo] Duty cycle: %.0f%%\n", percent); + } + } + if (!running) return -1; + printf("[pwm_demo] Reached 100%%, holding for 500ms...\n"); + usleep(500000); // 在100%保持0.5秒 + // ========== 阶段2: 100% -> 0% (1秒) ========== + printf("[pwm_demo] Phase 2: 100%% -> 0%%\n"); + for (int i = steps; i >= 0 && running; i--) + { + float percent = (float)i; // 100-0 + pwm.config.duty_ns = (uint64_t)(percent / 100.0f * pwm.config.period_ns); + pwm.config.percent = percent; + ret = ioctl(pwm_fd, SET_PWM_CONFIG, &pwm); + if (ret < 0) + { + printf("[pwm_demo] Failed to update PWM config\n"); + break; + } + usleep(step_delay); // 每步10ms + if (i % 20 == 0) // 每20%打印一次 + { + printf("[pwm_demo] Duty cycle: %.0f%%\n", percent); + } + } + if (!running) return -1; + printf("[pwm_demo] Reached 0%%, holding for 500ms...\n"); + usleep(500000); // 在0%保持0.5秒 + return ret; +} +// 可选:正弦波呼吸效果(更平滑) +int pwm_sine_breathing(int pwm_fd, int cycle_time_ms) +{ + int ret = 0; + int steps = 200; // 一个完整周期200步 + int step_delay = cycle_time_ms * 1000 / steps; + pwm.id = 0; + pwm.config.period_ns = 2000000; // 2ms周期 + pwm.config.delay_ns = 0; + pwm.config.phase_ns = 0; + pwm.config.pulses = FH_PWM_PULSE_LIMIT; + pwm.config.finish_all = 0; + pwm.config.finish_once = 1; + pwm.config.pulse_num = 0; + pwm.finishall_callback = NULL; + pwm.finishonce_callback = pwm_finish_once; + pwm.config.duty_ns = 0; + pwm.config.percent = 0; + ioctl(pwm_fd, DISABLE_PWM, &pwm); + ioctl(pwm_fd, SET_PWM_CONFIG, &pwm); + ioctl(pwm_fd, ENABLE_PWM, &pwm); + printf("[pwm_demo] Starting sine breathing effect (2 second cycle)\n"); + // 完整的正弦波周期:0-100-0 + for (int i = 0; i < steps && running; i++) + { + // 使用正弦函数:0-π-2π对应0-100-0 + float radian = (float)i / steps * 2.0f * M_PI; + float percent = 50.0f * (1.0f - cosf(radian)); // 0-100-0 + pwm.config.duty_ns = (uint64_t)(percent / 100.0f * pwm.config.period_ns); + pwm.config.percent = percent; + ret = ioctl(pwm_fd, SET_PWM_CONFIG, &pwm); + if (ret < 0) + { + printf("[pwm_demo] Failed to update PWM config\n"); + break; + } + usleep(step_delay); + if (i % 40 == 0) // 每20%进度打印一次 + { + printf("[pwm_demo] Duty cycle: %.1f%%\n", percent); + } + } + return ret; +} +void *pwm_demo_main(void *para) +{ + prctl(PR_SET_NAME, "pwm demo"); + printf("[pwm_demo] PWM breathing effect demo start:\n"); + pwm_fd = open("/dev/pwm", O_RDWR); + if (pwm_fd == -1) + { + printf("[pwm_demo] open pwm failed\n"); + return NULL; + } + int repeat_count = 3; // 重复3次 + for (int cycle = 0; cycle < repeat_count && running; cycle++) + { + printf("[pwm_demo] ===== Cycle %d/%d =====\n", cycle + 1, repeat_count); + // 使用分段线性变化(0->100->0,各1秒) + pwm_breathing_effect(pwm_fd, 1000); // 每个方向1000ms = 1秒 + if (!running) break; + // 或者使用正弦波效果(2秒一个完整周期) + // pwm_sine_breathing(pwm_fd, 2000); + } + // 演示结束,关闭PWM + if (pwm_fd > 0) + { + ioctl(pwm_fd, DISABLE_PWM, &pwm); + close(pwm_fd); + pwm_fd = -1; + } + printf("[pwm_demo] PWM breathing effect demo finished\n"); + return NULL; +} +int pwm_demo_init(void) +{ + int ret; + pthread_t pwm_thread; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_attr_setstacksize(&attr, 10 * 1024); + running = 1; + printf("[pwm_demo] =========================================\n"); + printf("[pwm_demo] Starting PWM Breathing Effect Demo\n"); + printf("[pwm_demo] Pattern: 0%% -> 100%% (1s) -> hold 0.5s -> 100%% -> 0%% (1s) -> hold 0.5s\n"); + printf("[pwm_demo] Total cycle time: 3 seconds\n"); + printf("[pwm_demo] Repeat 3 times\n"); + printf("[pwm_demo] =========================================\n"); + printf("[pwm_demo] start int_all_count:%d\n", int_all_count); + ret = pthread_create(&pwm_thread, &attr, pwm_demo_main, NULL); + if(ret) + { + printf("[pwm_demo] Error: Create pwm_demo_main thread failed!\n"); + return -1; + } + // 等待演示完成:3秒 × 3次 = 9秒,再加上一些缓冲 + sleep(10); + running = 0; + printf("[pwm_demo] end int_all_count:%d\n", int_all_count); + return 0; +} +// 扩展版本:可配置参数 +int pwm_demo_init_with_params(int ramp_time_ms, int hold_time_ms, int repeat_times) +{ + // 这个版本需要修改线程函数以接收参数 + // 这里只提供接口设计思路 + printf("[pwm_demo] Custom PWM demo: ramp=%dms, hold=%dms, repeat=%d\n", + ramp_time_ms, hold_time_ms, repeat_times); + // 实现方式:需要修改线程函数接收参数结构体 + return pwm_demo_init(); // 暂时使用默认参数 +} +void pwm_demo_stop(void) +{ + running = 0; + if (pwm_fd > 0) + { + ioctl(pwm_fd, DISABLE_PWM, &pwm); + close(pwm_fd); + pwm_fd = -1; + } + printf("[pwm_demo] Demo stopped by user\n"); +} +``` + +## 4. 编译代码 + +make编译代码 + +``` +make +``` + +![Pasted image 20260206151750.png](figures/8ccbcd237f2d726b4e4941d7d18c73ff.png.webp) + +将编译后的固件拷贝到windows中: + +![Pasted image 20260204150901.png](figures/27288aa6908cb218d9397abc6dbd9be7.png.webp) + +![Pasted image 20260207094307.png](figures/a581f4fefe821c34af33c56bf04aabbf.png) + +## 5. 烧录代码 + +连接网线、串口线、电源,上电开机 +① 确认网络(具体参考第一讲环境搭建&编译烧录教程) + +![Pasted image 20260204152920.png](figures/3a9af737b6c30317c07df075d54003a6.png) + +② FTFP传输 +选择固件路径与对应IP + +![Pasted image 20260201223720.png](figures/af02f83aa65af8579471deb8fed67d35.png) + +修改或确认启动指令: + +``` +set bootcmd 'sf probe 0;sf read 40000000 0x120000 300000;go 40000000' +saveenv +``` + +![Pasted image 20260204153308.png](figures/5b2528d30125996b3ef771cc0fe190bd.png) + +``` +sf probe 0 +sf erase 0x120000 300000 +tftp 41000000 bsp_demo.bin +sf write 41000000 0x120000 300000 +reset +``` + +![Pasted image 20260204153544.png](figures/7f0bea6192c953fb2ee9194de4fa9a42.png) + +## 6. 运行代码 + +查看pwm设备,因为代码中会打开/dev/pwm来控制: +`ls /dev` + +![Pasted image 20260206154046.png](figures/5d0f34dedffcd9ebf995d41c581194d3.png) + +检查引脚复用关系: + +``` +pinctrl -l +``` + +![Pasted image 20260206154146.png](figures/91db5197576e6a1a167c4a416f8db258.png) + +检查PinMux 表格确定复用关系:0-PWM + +![Pasted image 20260206153511.png](figures/3c1181cab4062f343e2abc053d3c05f0.png) + +运行demo: + +``` +bsp_demo -p +``` + +![Pasted image 20260207083906.png](figures/f90382901e5d7782358e6f67e2ef9292.png) + +使用逻辑分析仪抓PWM波形,占空比正常: + +![Pasted image 20260207090052.png](figures/5b9062733cfc0bdca6f5cf5835afeded.png.webp) + +之后我们再改用上面呼吸灯的代码,编译烧录后,我们将PWMOUT0引脚接入第二讲的LED4引脚: + +![Pasted image 20260207095435.png](figures/cea61b21021247ca88cfa42ad16bc3db.png.webp) + +然后运行: + +``` +bsp_demo -p +``` + +![Pasted image 20260207085543.png](figures/f0f119fce1669d5d2ee329c8fa1b86ea.png) + +可见LED PWM 呼吸灯闪烁: + +![lv_0_20260207101118.gif](figures/4cc28ee1aedd1fe5bfdc209dec9285ab.gif) + +## 7. 演示视频 + +[富瀚微MC632X开发板评测-04-PWM运行演示](https://www.bilibili.com/video/BV1ThFnzXEvb) + +![微信图片_20260207111610_191_40.png](figures/a8d74afeee34f7c8be07e6186115339a.png.webp) + +## 8. MC632X PWM 功能模块可编译下载的代码 + +[【Gitee】IOT趣制作/fullhan-MC632X](https://gitee.com/funiot/fullhan-mc632-x) + +![ScreenShot_2026-02-07_113337_367.png](figures/bd6abc93cf45057acbc90e8b14b54676.png.webp) + +## 9. 心得体会 + +这是我第一接触富瀚微的产品,MC632X这个芯片的功能还是比较强大的,而且其功能特性可以合做很多智能监控、智能猫眼、可视门铃之类的产品,当前的BSP的适配学习并未接触到这款SOC真正的能力,其图像处理能力和其算力会在后期进行一些学习,但从BSP的学习中也有很多收货: +① 了解了fullhan+rtt的SDK之间的软件系统结构框架、基础指令 +② 官方的资料很多,比较详细,能够在对产品不了解的情况下,借助官方资料完成一定的学习,但是美中不足的是,如果作为一个小白,上手其实还是略有难度的,文档可以更完善一些,相关操作步骤尽量不简化 +③ 官方的bsp_demo已经是比较完善了,在测评过程中,所调整的代码并不多,基于官方demo可以很容易的运行例程,接口定义清晰,软件调整很方便 +④ 最后建议一些自行准备的耗材还是提前说明,例如需要额外准备网线/RS232线/串口端子座连接线等 + +## 10. 原文链接 + +原文链接:[RT-Thread-富瀚微MC632X 开发板BSP实践:PWM RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/e6d528feabeff645.html) + +# 九、MC632X上的ETH实践(刘文志) + +## 1. 前置准备 + +### 1.1 硬件准备 + +**系统实物图** +MC6321开发板、电源线、网线、USB转TTL模块(或USB转232模块)、杜邦线、(2个测试夹、路由器二者非必须) + +![system.png](figures/48fd53cf5a4d87b9cf266f0d88eb3141.png.webp) + +**系统框架连接图** + +![网络拓扑.png](figures/f69e205880c0179196575c7674dbecbb.png) + +**系统ETH接口原理图** + +从硬件的角度看,ETH接口电路主要由`MAC控制器`和`物理层接口PHY`两大部分构成,而MC6321采用了`CPU集成MAC和PHY`,这是并不多见的一种方式(至少我是第一次使用),由此其电路非常简单。详情如下: + +![eth_sch.png](figures/24856507516169f2fa9710e8439916cf.png.webp) + +### 1.2 软件准备 + +**挂载共享文件夹** +进入Ubuntu系统,修改Ubuntu镜像work目录下的`mount.sh`文件中当前用户名修改为fullhan + +执行./mount.sh脚本文件,可以看到日志提示文件夹挂载成功 + +![1-2-1.png](figures/c4d4f11b0147e36903981ca5fa8988ca.png.webp) + +**解压SDK压缩包** +进入共享文件夹,找到压缩包存放路径,输入解压指令 + +``` +tar -xzvf FH_RT_V3.4.0_20250123.tar.gz FH_RT_V3.4.0_20250123/ +``` + +![1-2-2.png](figures/512102ada2c617736826294bf77c6ce4.png.webp) + +进入SDK的`rt-thread`目录后,在输入如下命令进入MC632x芯片平台配置 + +``` +make mc632x_defconfig +``` + +再输入下述命令使用图形化界面配置工程 + +``` +make menuconfig +``` + +![1-2-3.png](figures/daf10f8401ebca50d570465135f65ccb.png.webp) + +**使能 qos_gmac** +进入Drivers配置项 + +![1-2-4-1.png](figures/c9ea2290b28bed4040f4aaeb335146bd.png.webp) + +![1-2-4-2.png](figures/4e4e34e5b0ada341be44090f6474c9a2.png.webp) + +**选择app demo为`bsp_demo`** + +![1-2-5.png](figures/17984beb3cdf0889144df072a0d6dbac.png.webp) + +**保存配置** + +![1-2-6.png](figures/07bfef8a0ee556ec99db2306e478c851.png.webp) + +## 2. 编辑和编译代码 + +修改文件`\FH_RT_V3.4.0_20250123\rt-thread\app\bsp_demo\startup\application.c`的`user_main`函数如下 + +![2-1.png](figures/0a9e9ff593068e18c0b82784c762fe8f.png.webp) + +输入如下命令开始编译代码 + +``` +make clean;make +``` + +编译结果如下,可以看到在`bsp_demo/out/bin`文件夹中成功生成`bsp_demo.bin`固件 + +![2-2.png](figures/32f385c0e9d06bd5dc279fe63f9332fb.png.webp) + +## 3. 烧录固件 + +* 若未挂载共享文件夹,则将编译生成的文件复制拷贝到windows某个英文路径下,再从windows上运行`tftp32.exe`软件选择上述固件生成的系统路径。 +* 若已在Ubuntu中挂载共享文件夹,则在windows上运行`tftp32.exe`软件选择上述固件生成的系统路径即可。 + +### 3.1 进入U-Boot环境 + +按下复位键或者断电再上电,若从未固化过RTT-APP到Flash,则无需操作,约4秒后会自动进入U-Boot环境。 + +![3-1.png](figures/010654acad603f36cbb3a042b927d76c.png) + +### 3.2 查看并配置U-Boot环境IP信息 + +在串口终端执行下述命令配置U-Boot环境IP信息 + +``` +setenv ipaddr 192.168.2.20 +setenv serverip 192.168.2.116 +setenv netmask 255.255.255.0 +setenv gatewayip 192.168.2.1 +``` + +再执行下述命令保存配置 + +``` +saveenv +``` + +输入命令` pri`查看设备U-Boot环境IP信息 + +![3-2.png](figures/5ebebd77970990400cb64b509e76fd5d.png) + +### 3.3 配置电脑有线网段IP信息 + +* MC632开发板设备直连(电脑和开发板要配置为相同网段IP)这里不展开介绍,请自行搜索。 +* 开发板连接路由,电脑也连接路由,自动分配(电脑无需配置) + +### 3.4 烧录主处理器固件 + +#### 3.4.1 PC端开启 TFTP Server + +![3-4-1.png](figures/dd47a1f58ba8bcd1399acb39d749dc40.png) + +#### 3.4.2 下载应用固件 + +在串口终端输入下述指令下载固件 + +``` +tftp 40000000 bsp_demo.bin +``` + +![3-4-2.png](figures/a9757659e0e202812fde0de38e6655e1.png) + +#### 3.4.3 跳转应用固件 + +在串口终端输入下述指令执行跳转 + +``` +go 40000000 +``` + +![3-4-3.png](figures/123b455cd3a6f05e7113117f3ad07211.png) + +## 4. ETH外设测试 + +### 4.1 ETH外设启用情况 + +在串口终端输入`ls /dev` + +![4-1.png](figures/315c432c2469480b0199f9c27605f9f6.png.webp) + +### 4.2 自动检测ETH连接状态情况 + +> 阅读源码可知,该功能基于定时器实现,通过定时获取PHY寄存器数值,同时更新状态机状态实现。 + +![4-2.png](figures/1ca8e9e2f4e34fe24d0acc58b95eeaca.png.webp) + +### 4.3 网络通讯测试情况 + +查看App环境开发板IP信息 + +``` +ifconfig +``` + +配置App环境开发板IP + +``` +ifconfig e0 192.168.2.20 netmask 255.255.255.0 +``` + +![4-3-1.png](figures/227bf995660be028a82c9a1b50bc189d.png) + +#### 4.3.1 PC主机 ping 开发板 + +![4-3-2.png](figures/e3fa90869cb1f47390d1cc1926f086e3.png) + +#### 4.3.2 开发板 ping PC主机(电脑需要关闭防火墙) + +![4-3-3.png](figures/b0211f25d7d951f9c78c57d6b7f32433.png) + +#### 4.3.3 开发板 ping 外网(开发板需要配置DNS) + +![4-3-4.png](figures/b4d4c6cd96f9cfbe174886e14655a103.png) + +#### 4.3.4 开启/关闭DHCP模式 + +> 通过阅读源码,可以看到代码中已实现了DHCP手动切换功能并注册到shell指令表中。 + +![4-3-5.png](figures/52578b8fc1ec8147688b3e3b2f4e5ffb.png) + +![4-3-6.png](figures/420b2b1741cfeeefaa3e2300a0a40118.png) + +#### 4.3.5 如何默认自动开启DHCP模式 + +通过阅读源码,代码中宏定义LWIP_DHCP及RT_LWIP_DHCP已配置为1,理论已默认开启,为什么没有按照实际配置执行,按照下述网络初始化流程查找: + +``` +rt_application_init +rt_init_drv_thread_entry +fourth_driver_init + network_init + network_thread + lwip_sys_init //初始化LWIP协议栈 + eth_system_device_init + _init_mac_addr + rt_app_fh_gmac_init + fh_gmac_probe //初始化ETH检测定时器,注册回调函数 phy_state_machine + net_device_init //初始化网卡 + net_netif_device_init + netifapi_netif_add + net_netif_device_init +``` + +最终定位到`\FH_RT_V3.4.0_20250123\rt-thread\net\lwip-2.1.2\src\netif\ethernetif.c`文件中函数`net_netif_device_init`,发现包含`dhcp_start`函数的一段代码被粗暴地注释掉了,OK,找到原因接下来就很简单了,在合适位置添加DHCP初始化函数即可解决上述问题。 + +这里我选择在`\FH_RT_V3.4.0_20250123\rt-thread\net\lwip-2.1.2\src\netif\ethernetif.c`文件中函数`net_device_init`位置添加下述代码: + +```c +#if LWIP_DHCP + //if this interface uses DHCP, start the DHCP client + dhcp_start(netif); +#endif +``` + +![4-3-7.png](figures/f9dfbf5eaf768c2890d0f9a4192c4a64.png.webp) + +编译,下载,跳转,测试,OK~ + +![4-3-8.png](figures/930cf5c68d96f707dcb3d0645919fa53.png) + +### 4.4 网口通讯速率测试情况 + +这里使用SDK当中已适配好的第三方库`iperf2`测试,配置启用设置如下 + +![4-4-1.png](figures/ddc6913118e768909297431f9fd03a3f.png.webp) + +![4-4-2.png](figures/e192267a1f21e8a0d2482085251aed53.png.webp) + +编译,下载,跳转,测试 + +#### 4.4.1 开发板作为服务端-测试结果1 + +![4-4-3.png](figures/510b883dbdd2fec10591c0017a435eb7.png.webp) + +#### 4.4.2 开发板作为客户端-测试结果2 + +![4-4-4.png](figures/8b2c17353c7efbb47f360cdd366c6c11.png.webp) + +## 5. ETH外设应用 + +### 5.1 基本应用 + +在`bsp_demo`目录下增加`eth`文件夹,并在文件夹下增加`eth_tcp_client.c`、`eth_tcp_server.c`、`eth_udp.c`3个文件,实现相关代码(这里我偷了个懒,直接将RT-thread 仓库中的example文件夹的network相关示例丢给了AI,让其适配了下平台接口和增加原子操作等等,然后手动注册到Shell指令表当中。) +![5-1.png](figures/d4b83a9b52f26e2421087a305a4ec23d.png.webp) + +修改`bsp_demo`目录下`Makefile`文件 + +![5-2.png](figures/3402456eab81f1db16a862edbb465b7f.png.webp) + +编译,下载,跳转,测试 + +![5-3.png](figures/2452ae696b6218d0ef1cedb845e318cf.png) + +#### 5.1.1 TCP Server + +![5-4.png](figures/15d8616b0bbb813b8b7b0bcdc3e28837.png.webp) + +#### 5.1.2 TCP Client + +局域网测试 + +![5-5.png](figures/bff97ef4cd665bc5d881f0c1495254fe.png.webp) + +公网测试 + +![5-6.png](figures/1ce64748ea2954e8b35589f57518ceed.png.webp) + +#### 5.1.3 UDP + +![5-7.png](figures/4d2af47d62e4606ace76edde31927bb2.png.webp) + +### 5.2 进阶应用 + +#### 5.2.1 HTTP Server + +这里使用LWIP自带的http服务器,修改地方共4个: + +第一个地方:`.\FH_RT_V3.4.0_20250123\rt-thread\net\Kconfig`文件 + +增加下述代码 + +``` + config RT_USING_HTTPD + bool "Enable HTTP Server" + default y +``` + +第二个地方:在`.\FH_RT_V3.4.0_20250123\rt-thread\net\lwip-2.1.2\Makefile`文件 + +增加下述代码 + +```makefile +ifeq ($(CONFIG_RT_USING_HTTPD), y) + CSRCS += $(wildcard src/apps/http/fs.c) + CSRCS += $(wildcard src/apps/http/fsdata.c) + CSRCS += $(wildcard src/apps/http/httpd.c) +endif +``` + +第三个地方:`.\FH_RT_V3.4.0_20250123\rt-thread\platform\mc632x\board.c`源文件 + +将 + +```c +#ifdef RT_USING_LWIP +#include "lwip/sys.h" +#include "netif/ethernetif.h" +extern void lwip_sys_init(void); +#endif +``` + +改为 + +```c +#ifdef RT_USING_LWIP +#include "lwip/sys.h" +#include "netif/ethernetif.h" +extern void lwip_sys_init(void); + +#ifdef RT_USING_HTTPD +#include "lwip/apps/httpd.h" +extern void httpd_init(void); +#endif +#endif +``` + +第四个地方:`.\FH_RT_V3.4.0_20250123\rt-thread\platform\startup\board_startup.c`源文件 + +在函数`network_thread`末尾增加下述初始化代码: +```c +#if defined(RT_USING_HTTPD) + httpd_init(); +#endif +``` + +编译,下载,跳转,测试 + +一般来说,正常看到的页面应该是关于LWIP介绍网页,这里我忘记截图了,直接让AI生成了一个类似网页介绍RT-thread和MC632X-Board这块开发板,然后通过`makedata.exe`工具转换为数组.c文件,详情如下: +![5-8.png](figures/9a19e62e3d0934e5594e707abab627fa.png.webp) + +此外,如果我们想做交互功能也没问题,在前端通过`js`构建HTTP请求,后端是在`httpd.c`文件中解析和处理业务,代码的逻辑是根据GET还是POST请求来针对性处理。由于这是纯业务相关,这里暂不展开,后续有空再填坑吧,春节假期躺平ing。 + +#### 5.2.2 MQTT Client【待完成】 + +后续计划,适配paho-mqtt库,对接主流云平台。 + +## 6. 心得体会 + +* 首先,非常感谢fullhan富瀚微愿意去拥抱开源,愿意开放U-Boot源码、原理图,适配BSP,编写FAQ文档和RT-thread应用开发手册指南。 +* 其次,这是我第一次接触富瀚微的产品,也是第一次接触MC632X这类ISP处理器,作为一款ISP处理器,网络仅是其一部分功能,这款SOC的真正性能尚未被压榨,通过学习整个系统代码架构,我的收获是巨大的,对于网络部分的基本知识和应用也更深刻。 +* 最后,美中不足的地方也是存在的,官方底层代码几乎0注释,同时存在一些脏代码,对于小白来说是存在一定上手难的,此外配套的耗材其实并不完美适配评估板,需要自己给开发板做些简单的“手术”,但我相信在路上,一定会越来越好~。 + + +## 7. 部分代码和所需工具 + +仓库地址:https://gitee.com/az12580/fullhan_mc632x_board_rtt_eth_demo.git + +## 8. 原文链接 + +原文链接:[RT-Thread-富瀚微MC632X的ETH实践RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/903a6d1a743ba078.html) + +# 十、MC632X上的SDIO实践(朱文盛&梁浩伦) + +## 1. 硬件准备 + +SD卡、串口线、富瀚微MC632X开发板、电源线、网线。 + +![20260303125205.jpg](figures/d9a87377508d2a0195942a51ef3912a2.jpg) + +## 2. 外设配置 + +**进入SDK的rt-thread目录** + +![20260222195616.png](figures/09742a61453f715e1abed4cd56fe45c3.png) + +**应用初始配置** +在终端中输入如下命令进行初始配置: + +``` +make mc632x_defconfig +``` + +![20260222200507.png](figures/bce005a822030b9779a20ea74242be26.png.webp) + +**使能SD卡外设** +在终端中输入如下命令使用图形化界面配置工程 + +``` +make menuconfig +``` + +进入 Drivers 配置项 + +![20260222201313.png](figures/9977e3da96b0b58adc0f72f0b717ab35.png.webp) + +使能mmc + +![20260222201557.png](figures/d8b950e5356f7b15885c0088c5055ca3.png.webp) + +选择 app demo 为 bsp_demo + +![20260222201741.png](figures/70a4dfbdddd90c4c40fc19f0d1e3e3c1.png.webp) + +保存配置。 + +![20260222201909.png](figures/ccc08ac82ec7dac573e6f9349f0734cb.png.webp) + +## 3. 程序编写 + +### 3.1 进入bsp_demo目录 + +在终端中输入如下命令使用 VSCode 打开目前所在的目录 + +``` +code . +``` + +![20260222210214.png](figures/f57ea6aaacf188f7e41f3fdee78bd800.png.webp) + +bsp_demo 目录结构如下图所示: + +![20260222210037.png](figures/26a8224b32c9cb8a9fbf130fa65eedf7.png.webp) + +### 3.2 修改PinMux + +原理图文档位于第16页 +[MC632X_APP开发板使用指南V1.0.pdf](https://club.rt-thread.org/file_download/fee5006f99246e85) + +![20260222212423.png](figures/bedace9c630ff0c74ccfec255d4fc687.png.webp) + +PIN 引脚复用可查看 PinMux 表格或 mc632x_iopad.h 文件 +PinMux 表格: +[MC632x_PINOUT_CN.xlsx](https://club.rt-thread.org/file_download/9138a356421f42f9) +mc632x_iopad.h 文件: + +![20260222213323.png](figures/5bb425423f704e52e923d7fa0f09801c.png.webp) + +### 3.3 修改程序 + +修改bsp_demo的application.c文件,修改内容如下 + +```c +#include +#include +#include +#include "rttshell.h" +extern void sadc_demo_init(void); +extern int sdcard_demo_init(void); +extern int aes_demo_init(void); +extern int pwm_demo_init(void); +extern int gpio_demo_init(void); +extern int uart_demo_init(void); +extern int i2c_demo_init(void); +extern int rtc_demo_init(void); +void user_main(void) +{ + // sleep(5); + // aes_demo_init(); + // i2c_demo_init(); + // rtc_demo_init(); + // sadc_demo_init(); + //sdcard_demo_init(); + // pwm_demo_init(); + // gpio_demo_init(); + // uart_demo_init(); +} +static void bsp_demo_usage(void) +{ + printf("Usage:\n"); + printf(" bsp_demo -e: run aes demo\n"); + printf(" bsp_demo -t: run rtc demo\n"); + printf(" bsp_demo -i: run i2c demo\n"); + printf(" bsp_demo -a: run sadc demo\n"); + printf(" bsp_demo -p: run pwm demo\n"); + printf(" bsp_demo -g: run gpio demo\n"); + printf(" bsp_demo -u: run uart demo\n"); + printf(" bsp_demo -c: run sdcard demo\n"); +} +static void bsp_demo(int argc, char *argv[]) +{ + if (argc < 2) + { + bsp_demo_usage(); + return; + } + if (strcmp(argv[1], "-e") == 0) + { + aes_demo_init(); + } + else if (strcmp(argv[1], "-u") == 0) + { + uart_demo_init(); + } + else if (strcmp(argv[1], "-g") == 0) + { + gpio_demo_init(); + } + else if (strcmp(argv[1], "-p") == 0) + { + pwm_demo_init(); + } + else if (strcmp(argv[1], "-c") == 0) + { + sdcard_demo_init(); + } + else if (strcmp(argv[1], "-a") == 0) + { + sadc_demo_init(); + } + else if (strcmp(argv[1], "-t") == 0) + { + rtc_demo_init(); + } + else if (strcmp(argv[1], "-i") == 0) + { + i2c_demo_init(); + } + else + { + bsp_demo_usage(); + } +} +SHELL_CMD_EXPORT(bsp_demo, bsp demo) +``` + +## 4. 编译&烧录 + +### 4.1 编译 + +编译固件,输入 + +``` +make clean;make +``` + +编译结果 + +![20260224214449.png](figures/afeeb4663e74f5a72239cefc12e3d44a.png.webp) + +bsp_demo.bin为固件名称,前面为固件存放目录 + +### 4.2 烧录 + +使用SecureCRT.9.6.0软件连接串口设备后,设备上电,立即输入回车键 + +![20260224214913.png](figures/075800914bfd9de7ff05acd0ec07a53c.png) + +输入pri,查询设备信息 + +![20260224215231.png](figures/c40bbda76b13f9dd252f8cd8e5f1bbc2.png) + +使用网线连接电脑和设备,并且设置电脑网线的IP信息 + +![屏幕截图 2026-02-24 215347.png](figures/65dab45c01ad1ac07edfb4ad6f2b5ccb.png.webp) + +开启 tftp: + +![20260224215825.png](figures/c5716770a6a860272da14e84755c460c.png.webp) + +输入命令,烧录成功 + +``` +tftp 40000000 bsp_demo.bin +``` + +![微信图片_20260224220356.png](figures/46032b1060a6c04e8f4e64f4fc810e96.png) + +输入以下命令进行准备 + +``` +go 40000000 +``` + +开机测试,设备自动上电,SD外设进行初始化,测试SD卡的容量,实际内存大小 + +![2026-03-02 215347.png](figures/f6b68d9a408917eaf4aaca15e63d801f.png.webp) + +## 5. SDIO测试 + +进行demo程序的测试,输入以下命令,测试SD的读写速度 + +``` +bsp_demo -c +``` + +![2026-03-02 215536.png](figures/f24c792886895b8f31f22b73a09f838b.png) + +## 6. 代码链接 + +(请严格根据第二步配置SDK后,修改application.c文件)https://gitee.com/zws320826/mc632x_demo.git + +## 7. 演示视频 + +【富瀚微MC632X的SDIO测试-哔哩哔哩】 https://b23.tv/GzGAc7e + +## 8. 原文链接 + +原文链接:[RT-Thread-富瀚微MC632X的SDIO实践RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/41351fafc0dd871f.html) + +其他链接(梁浩伦):[RT-Thread-MC632X上的SDIO实践RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/40a4dd7268b371b5.html) + +# 十一、MC632X上的Audio实践(郭工) + +## 1. 开发前准备 + +下述资源均由富瀚微官方提供: +SDK:https://send.fullhan.com:8443/s/wDd5Qmz4XzJ33ad +提取码:_2S1a|R1y- + +镜像:https://send.fullhan.com:8443/s/wjJd6GtJrEqenLN +提取码:ViZj`~x1x& + +工具:https://send.fullhan.com:8443/s/EpNMCr9ozCp5WxM +提取码:fn6jlb/CBc + +硬件资料:https://send.fullhan.com:8443/s/EzyXNts2NBk9f8M +提取码:Nen@5%IA|h + +硬件准备:MC632X开发板、摄像头、RS232或U转串小板、网线(除网线外富瀚微都有提供,再次感谢) +上面的软件/sdk/开发工具的下载链接,都有时效性,如果过期请联系富瀚微的应用或客户工程师。 + +拿到开板后,先测试硬件,连接电源和串口(可通过小板直接连接至J17或者通过DB9接口连接RS232线),开机看下硬件有没有问题,正常情况下使用SecureCRT做终端时会出现以下界面: + +![上电.png](figures/70e14e117ae4517bf591ddfb4cca971e.png) + +上电正常后,通过串口烧录uboot固件,烧录之后可以通过tftp+网络进行固件更新,使用更加方便。 +具体参数配置、烧录方法、避坑指南请参考下面链接: +[RT-Thread-富瀚微MC632X 入门笔记01:Uboot烧录/内核编译+烧录/media_demo操作演示RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/fc62311013db0dd5.html) +如果有兴趣可以按照链接中的方法进一步验证下开发环境和摄像头模组。 + +## 2. 音频模块功能介绍 + +### 2.1 soc整体架构 + +![screenshot_image.png](figures/fa757436dd6395af8d471010f9a41fc1.png.webp) + +从整体来看该SOC功能相当完善,特别是音视频编解码功能和对外设的支持。另外值得一提的是官方提供的SDK对外设的支持也很完善,基本都配有demo。 + +### 2.2 音频接口支持情况 + +![screenshot_image.png](figures/54061b4b693cb8fdcc15f86fc6671b1d.png.webp) + +上面是音频驱动的架构图,可以看出音频核心驱动主要运行在小核,APP在大核通过XBUS来调用小核的音频驱动。 + +## 3. AUDIO配置开发 + +### 3.1 音频输入输出电路解析 + +![screenshot_image.png](figures/30996b1e6e7e76a9c7adc8b00872c0ee.png.webp) + +从上图可以看出在音频输入部分soc支持模拟mic和数字mic,其中数字mic可支持多路,组成阵列,进一步扩展了应用范围。 + +![screenshot_image.png](figures/9303e1a9e34a395ed29f97cd0ce6b030.png.webp) + +音频输出部分略显单薄,只配备了一路模拟音频接口,不过支持数据音频输出也算弥补了这一个缺点。 + +### 3.2 配件耗材准备 + +准备一个喇叭,功率约1w左右,或者3.5mm耳机 + +### 3.3 SDK模版选择 + +项目配置可以参考[富瀚微FH8626V300L开发实践指南 九、FH8626V300L上的Audio实践](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/富瀚微FH8626V300L开发实践指南?id=九、fh8626v300l上的audio实践) +这个链接中AUDIO开发的相关内容。 +选择audio demo作为项目模板。 +除了进行上面文档中的配置之外,还要使能VBUS + +**注意** +直接按照上面文档的流程音频demo是跑不起来的,因为上面文档中没有小核固件烧录过程,启动APP后会出现VBUS错误。 + +### 3.4 烧录小核固件 + +找到`FH_RT_V3.4.0_20250123\rt-thread\platform\mc632x\app_board\flash_layout.c`文件,找到如下所示代码段: + +```c +struct _tag_flash_layout_info g_flash_layout_info[MAX_FLASH_PART_NUM] = { + /* reserved partition, will be ignored */ + {"reservd1", 0x020000, BLOCK_64K, PART_RESERVED}, + /* uboot environment partition, can be reserved. */ + {"u-boot-env", 0x020000, BLOCK_64K, PART_RESERVED}, + /* uboot partition, can be reserved too. */ + {"u-boot", 0x080000, BLOCK_64K, PART_RESERVED}, + /* if you use VBUS, this partition MUST be defined */ +#ifdef RT_USING_PM + {"cp-firmware", 0x260000, BLOCK_64K, PART_ARCFIRM}, +#else + {"cp-firmware", 0x060000, BLOCK_64K, PART_ARCFIRM}, +#endif + /* application partition to hold firmware */ + {"application", 0x300000, BLOCK_64K, PART_APPLICATION}, + /* there can be more than one reserved partition */ + {"reservd2", 0x0e0000, BLOCK_64K, PART_RESERVED}, + /* other user partition */ + {"user-datum", 0x200000, BLOCK_64K, PART_ROOT | PART_USER}, + {"user-prog", 0x500000, BLOCK_64K, PART_NN_MODEL | PART_USER}, + /* another reserved partition */ +#ifdef RT_USING_PM + {"reservd3", 0x600000, BLOCK_64K, PART_RESERVED}, +#else + {"reservd3", 0x800000, BLOCK_64K, PART_RESERVED}, +#endif +}; +``` + +这是flash布局配置,其中cp-firmware就是小核固件应该存放的位置,通过计算可得到绝对位置为0x0c0000,空间大小为0x60000,也就是有约为400k的空间,烧录指令如下所示,要在uboot下一条一条执行: +``` +// 将rtthread_fw.img.MC632X下载至内存 +tftp 40000000 rtthread_fw.img.MC632X +// 读取flash +sf probe +// 擦除flash对应位置 +sf erase 0x0c0000 0x060000 +// 复制内存数据至flash +sf write 40000000 0x0c0000 0x060000 +``` + +其中`rtthread_fw.img.MC632X`这个固件的路径在`FH_RT_V3.4.0_20250123\images\`中。 + +### 3.5 添加修改测试代码 + +直接音频功能测试不需要修改代码直接使用demo代码就行,代码路径在`FH_RT_V3.4.0_20250123\rt-thread\app\audio_demo\src\audio_api_demo.c` +注意不要按照[上面文档](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/富瀚微FH8626V300L开发实践指南?id=九、fh8626v300l上的audio实践)对GPIO功能进行修改,因为芯片型号和引脚不同。 +代码功能比较简单明了,在此就不过多解释了,如有疑问请私信我。 + +修改后的直接可编译文件上传于: +https://gitee.com/troyguo8/MC632X +可直接下载使用。 + +## 4. 编译、烧录 + +代码添加之后执行make,最后会生成`audio_demo.bin`和`audio_demo.img`等固件文件。 +通过 + +``` +tftp 40000000 audio_demo.bin +go 40000000 +``` + +快速进行下载和验证。 +下载后注意观察rt-thread的启动过程,看小核固件有没有生效,生效的话就会有如下提示 + +![screenshot_image.png](figures/64dcdb83dcad7defc16ab9fb309df6cb.png.webp) + +**如果红框内提示错误,则需要重新进行小核固件烧录。** + +## 5. 效果演示 + +一切正常启动后,输入audio_demo,就会启动音频测试,可以从耳机孔或者喇叭听到mic的声音,因为测试的主要功能就是直接把mic的声音回放出来。 +操作视频链接如下: + +https://www.bilibili.com/video/BV1nWfmBEEVe/?pop_share=1&spm_id_from=333.40164.0.0&vd_source=c4e964d41a9640fdaa1c626ade1d8b49 +## 6. 感想与展望 + +mc632x作为当下风头正劲的边缘iot全集成soc,在支持视音频编解码,多功能外设的同时保持了低成本和引脚数量最优,将成为未来边缘iot产品中具有强劲竞争力的一款产品。 +重点夸一下sdk的完整性,厂家直接提供虚拟机映像,真正实现了开箱即用。这也弥补了暂无windows开发环境的遗憾。 + +## 7. 原文链接 + +原文链接:[RT-Thread-富瀚微MC632x音频测试RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/87e17acba0a58b38.html) + +# 十二、MC632X上的USB-VCOM实践(郭工) + +## 1. 开发前准备 + +下述资源均由富瀚微官方提供: +SDK:https://send.fullhan.com:8443/s/wDd5Qmz4XzJ33ad +提取码:_2S1a|R1y- + +镜像:https://send.fullhan.com:8443/s/wjJd6GtJrEqenLN +提取码:ViZj`~x1x& + +工具:https://send.fullhan.com:8443/s/EpNMCr9ozCp5WxM +提取码:fn6jlb/CBc + +硬件资料:https://send.fullhan.com:8443/s/EzyXNts2NBk9f8M +提取码:Nen@5%IA|h + +硬件准备:MC632X开发板、摄像头、RS232或U转串小板、网线(除网线外富瀚微都有提供,再次感谢) +上面的软件/sdk/开发工具的下载链接,都有时效性,如果过期请联系富瀚微的应用或客户工程师。 + +拿到开板后,先测试硬件,连接电源和串口(可通过小板直接连接至J17或者通过DB9接口连接RS232线),开机看下硬件有没有问题,正常情况下使用SecureCRT做终端时会出现以下界面: + +![上电.png](figures/70e14e117ae4517bf591ddfb4cca971e.png) + +上电正常后,通过串口烧录uboot固件,烧录之后可以通过tftp+网络进行固件更新,使用更加方便。 +具体参数配置、烧录方法、避坑指南请参考下面链接: +[RT-Thread-富瀚微MC632X 入门笔记01:Uboot烧录/内核编译+烧录/media_demo操作演示RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/fc62311013db0dd5.html) +如果有兴趣可以按照链接中的方法进一步验证下开发环境和摄像头模组。 +在感谢这位仁兄提供如此详细的操作指导之余,提一点建议如果是为了快速验证调试不用每次都把固件烧录到flash中,直接通过tftp将测试固件下载至内存中即可,下面是操作指令: + +``` +tftp 40000000 bsp_demo.bin +go 40000000 +``` + +其中40000000这个位置经过验证没啥问题,bsp_demo.bin要替换成你自己的固件,注意要用bin文件不要用img。 +## 2. USB模块功能介绍 + +![screenshot_image.png](figures/c43b8fcd3d969997d65a9b1996a4ce98.png.webp) + +整体来看该soc的usb模块对usb的特性支持还是非常完整的,由于soc定位边缘iot,usb2.0就能满足绝大多数场景,同时可以降低成本和开发难度。 +目前官方提供的sdk中usb驱动host和device模式,且支持复合设备。常见的usb-cdc、usb-hid、uvc、uva、rndis设备类型都是支持的。 +## 3. USB-CDC配置开发 + +### 3.1 配件耗材准备 + +准备一条两头都是usb-a也就是扁头公头的线,同时把开发板上J37跳线取下。 + +### 3.2 SDK模版选择 + +参考[富瀚微FH8626V300L开发实践指南 十二、fh8626v300l上的usb_vcom实践](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/富瀚微FH8626V300L开发实践指南?id=十二、fh8626v300l上的usb_vcom实践) +这个链接中USB device开发的相关内容。 +选择bsp demo作为项目模板。 +通过make menuconfig对usb驱动进行如下配置: + +![screenshot_image.png](figures/ae02d164869c6e3b85d5947710cc0eaa.png.webp) + +**注意不要启用usb webcam和usb audio,因为这两个功能需要烧录副核固件,操作略显麻烦,且不影响usb cdc的功能。** + +### 3.3 添加测试代码 + +主要添加或改动的代码如下: + +```c +#include +#include "types/type_def.h" +#include "rtthread.h" +#include +#include "rttshell.h" +#include +#define DBG_TAG "demo.usb_vcom" +#define DBG_LVL DBG_LOG +#include "rtdbg.h" +static rt_device_t usb_vcom_dev = RT_NULL; // USB虚拟串口设备句柄 +static rt_thread_t vcom_rx_thread = RT_NULL; // VCOM 接收线程句柄 +/** + * @brief USB VCOM 数据接收线程 + * + * 不断从 VCOM 设备读取数据,并打印到日志。 + */ +static void vcom_rx_thread_entry(void *parameter) +{ + char rx_buffer[128]; // 接收缓冲区 + rt_size_t rx_size; // 实际读取的数据长度 + while (1) + { + /* 尝试从 USB VCOM 设备读取数据(非阻塞) */ + rx_size = rt_device_read(usb_vcom_dev, 0, rx_buffer, sizeof(rx_buffer) - 1); + if (rx_size > 0) + { + /* 添加字符串结束符,保证安全打印 */ + rx_buffer[rx_size] = '\0'; + /* 打印接收到的数据 */ + LOG_I("recv: %s", rx_buffer); + } + /* 短暂延时避免占用过多CPU */ + rt_thread_mdelay(10); + } +} +/** + * @brief shell 命令:向 USB VCOM 发送数据 + * + * 用法:send_to_vcom "字符串" + */ +static void send_to_vcom(int argc, char **argv) +{ + rt_size_t tx_size; + if (argc < 2) + { + LOG_I("Usage: send_to_vcom \"string\""); + return; + } + if (usb_vcom_dev == RT_NULL) + { + LOG_E("USB VCOM device not initialized!"); + return; + } + /* 发送用户输入的字符串 */ + tx_size = rt_device_write(usb_vcom_dev, 0, argv[1], rt_strlen(argv[1])); + /* 发送换行,便于串口显示 */ + rt_device_write(usb_vcom_dev, 0, "\r\n", 2); + LOG_I("Sent %d bytes to VCOM: %s", tx_size, argv[1]); +} +SHELL_CMD_EXPORT(send_to_vcom, Send string to USB VCOM); +/** + * @brief USB VCOM 示例初始化 + * + * 初始化 USB CDC、打开 VCOM 设备、启动接收线程。 + */ +int usb_vcom_demo_init(void) +{ + rt_err_t ret; + /* 初始化 USB CDC 功能 */ + fh_cdc_init(); + /* 查找系统中名为 "vcom" 的 USB CDC 设备 */ + usb_vcom_dev = rt_device_find("vcom"); + if (!usb_vcom_dev) + { + LOG_E("Failed to find USB VCOM device!"); + return -1; + } + /* 以读写 + 中断接收模式打开设备 */ + ret = rt_device_open(usb_vcom_dev, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX); + if (ret != RT_EOK) + { + LOG_E("Failed to open USB VCOM device: %d", ret); + return -1; + } + /* 创建数据接收线程 */ + vcom_rx_thread = rt_thread_create("vcom_rx", + vcom_rx_thread_entry, + RT_NULL, + 1024, + 20, + 20); + if (vcom_rx_thread != RT_NULL) + { + /* 启动线程 */ + rt_thread_startup(vcom_rx_thread); + LOG_I("VCOM RX thread started"); + } + else + { + LOG_E("Failed to create VCOM RX thread"); + return -1; + } + LOG_I("USB VCOM demo initialized"); + return 0; +} +``` + +添加后的目录结构为: + +![screenshot_image.png](figures/a0f2a53fd7ea2b04eef8e4eb7e2e9f8b-17739887746642.png) + +`usb_vcom_demo.c`上面的头文件是为了不污染原有sdk而复制至当前文件夹的本地头文件,引用时要用双引号包含,不要使用尖括号包含。 +代码功能比较简单明了,在此就不过多解释了,如有疑问请私信我。 +修改后的直接可编译文件上传于: + +https://gitee.com/troyguo8/MC632X +可直接下载使用。 + +## 4. 编译、烧录 + +代码添加之后执行make,最后会生成bsp_demo.bin和bsp_demo.img等固件文件。 +通过 + +``` +tftp 40000000 bsp_demo.bin +go 40000000 +``` + +快速进行下载和验证。 +## 5. 效果演示 + +这是通过sscom和SecureCRT进行双向通信的验证视频,其中mc632x虚拟出来的usb串口由sscom操作。 +视频链接: +https://www.bilibili.com/video/BV1rifyBkEvQ/?pop_share=1&spm_id_from=333.40164.0.0&vd_source=c4e964d41a9640fdaa1c626ade1d8b49 +## 6. 感想与展望 + +mc632x作为当下风头正劲的边缘iot全集成soc,在支持视音频编解码,多功能外设的同时保持了低成本和引脚数量最优,将成为未来边缘iot产品中具有强劲竞争力的一款产品。 +重点夸一下sdk的完整性,厂家直接提供虚拟机映像,真正实现了开箱即用。这也弥补了暂无windows开发环境的遗憾。 + +## 7. 原文链接 + +原文链接:[RT-Thread-富瀚微MC632X USB VCOM测评RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/c109060e44811061.html) + +# 十三、MC632X上的USB-HID实践(袁烨炜) + +## 1. 参考文档 + +如何烧录Uboot,程序编译,烧录固件请看下帖,写的非常详细。 +《富瀚微MC632X 入门笔记01:Uboot烧录/内核编译+烧录/media_demo操作演示》 +https://club.rt-thread.org/ask/article/fc62311013db0dd5.html + +USB部分实例参考下面2个帖子。 +《文章内容参考:FH8626V300L开发实践指南:》 +https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/make-bsp/fullhan/%E5%AF%8C%E7%80%9A%E5%BE%AEFH8626V300L%E5%BC%80%E5%8F%91%E5%AE%9E%E8%B7%B5%E6%8C%87%E5%8D%97 +《富瀚微MC632X USB VCOM测评》 +https://club.rt-thread.org/ask/article/c109060e44811061.html +## 2. 环境准备 + +### 2.1 硬件准备: +1:开发板 +2:USB转RS232串口线 +3:RJ45网线(连接路由器)和电脑是一个网段。 + +### 2.2 软件准备: + +1:SecureCRT +2:tftp工具 + +### 2.3 开发环境: + +VMware® Workstation 17 Pro +《RT-Thread&Fullhan开发环境部署_VMware资源包_20251126.zip》 +Uboot烧录,环境搭建,内核编译,内核TFTP烧录 +大伙可以参考下面文档,写的非常详细 +《富瀚微MC632X 入门笔记01:Uboot烧录/内核编译+烧录/media_demo操作演示》 +https://club.rt-thread.org/ask/article/fc62311013db0dd5.html +## 3. 配置USB设备 + +1:在VMware虚拟机运行《RT-Thread&Fullhan开发环境部署_VMware资源包_20251126.ova》。密码是“fullhan” +2:在ubuntu中打开“文件管理器”,\home\work目录下新建usb-hid目录 +3:将SDK包“FH_RT_V3.4.0_20250123.tar.gz”复制到usb-hid目录下 + +![screenshot_image.png](figures/75f997526c0fc1ecc1f879b6701cfe3d.png.webp) + +4:鼠标选中“FH_RT_V3.4.0_20250123.tar.gz”文件,点击右键,选择“Extract Here”。 + +![screenshot_image.png](figures/9c5574c546226a9e7a0ecbe3f819d5f6.png.webp) + +5:等待10秒左右,usb-hid目录下会生成“FH_RT_V3.4.0_20250123”目录。 +6:点击鼠标进入“FH_RT_V3.4.0_20250123”目录。 +7:点击鼠标进入“rt-thread”目录。 +8:在空白处点击鼠标右键,选择“Open in Terminal” + +![screenshot_38c305a3-3701-4c74-87a8-37aee35249fa.png](figures/5be4a1069ac9c9feda69598c5924f0cf.png.webp) + +9:在终端输入make menuconfig,显示如下: + +![screenshot_4d75dec6-6d3d-431b-8048-cfefc91c4907.png](figures/5577bcec9bbe93b39c2d1f0c05e762ac.png.webp) + +10:在select app demo项目选择“bsp demo” +11:进入drivers项目,再进入“usb configuration” +12:选择“Enable to use device as usb hid”,取消“usb webcam”和“usb audio”,具体如下图 + +![screenshot_image.png](figures/39f62a01ceec256695107d2bd2b38766.png.webp) + +13:选择下面5个按钮中“Save”,保存配置。退出配置界面。 + +## 4. 程序编写 + +1:在终端fullhan@ubuntu:~/work/USB-HID/FH_RT_V3.4.0_20250123/rt-thread$下输入 “code .”,运行Visual Studio Code。 +2:打开 bsp_demo/startup/application.c 文件,删除 user_main() 中的代码,修改测试方式为手动执行,同时添加 USB HID 测试代码。 + +```c +#include +#include +#include +#include "rttshell.h" +extern void sadc_demo_init(void); +extern int sdcard_demo_init(void); +extern int aes_demo_init(void); +extern int pwm_demo_init(void); +extern int gpio_demo_init(void); +extern int uart_demo_init(void); +extern int i2c_demo_init(void); +extern int rtc_demo_init(void); +void user_main(void) +{ +#if 0 + sleep(5); + aes_demo_init(); + i2c_demo_init(); + rtc_demo_init(); + sadc_demo_init(); + sdcard_demo_init(); + pwm_demo_init(); + gpio_demo_init(); + uart_demo_init(); +#endif +} +static void bsp_demo_usage(void) +{ + printf("Usage:\n"); + printf(" bsp_demo -e: run aes demo\n"); + printf(" bsp_demo -t: run rtc demo\n"); + printf(" bsp_demo -i: run i2c demo\n"); + printf(" bsp_demo -a: run sadc demo\n"); + printf(" bsp_demo -p: run pwm demo\n"); + printf(" bsp_demo -g: run gpio demo\n"); + printf(" bsp_demo -u: run uart demo\n"); + printf(" bsp_demo -c: run sdcard demo\n"); + printf(" bsp_demo -h: run usb_hid demo\n"); +} +static void bsp_demo(int argc, char *argv[]) +{ + if (argc < 2) + { + bsp_demo_usage(); + return; + } + if (strcmp(argv[1], "-e") == 0) + { + aes_demo_init(); + } + else if (strcmp(argv[1], "-u") == 0) + { + uart_demo_init(); + } + else if (strcmp(argv[1], "-g") == 0) + { + gpio_demo_init(); + } + else if (strcmp(argv[1], "-p") == 0) + { + pwm_demo_init(); + } + else if (strcmp(argv[1], "-c") == 0) + { + sdcard_demo_init(); + } + else if (strcmp(argv[1], "-a") == 0) + { + sadc_demo_init(); + } + else if (strcmp(argv[1], "-t") == 0) + { + rtc_demo_init(); + } + else if (strcmp(argv[1], "-i") == 0) + { + i2c_demo_init(); + } + else if (strcmp(argv[1], "-h") == 0) + { + usb_hid_demo_init(); + } + else + { + bsp_demo_usage(); + } +} +SHELL_CMD_EXPORT(bsp_demo, bsp demo) +``` + +3.添加 USB_HID 代码 + +创建 bsp_demo/usb_hid 目录并在该目录下新建usb_hid_demo.c 。 + +```c +#include +#include +#include +#include +#include +#include +#include "types/type_def.h" +#include "rtthread.h" +#include "rttshell.h" +#define DBG_TAG "demo.usb_hid" +#define DBG_LVL DBG_LOG +#include "rtdbg.h" +/* HID 键盘的 Report ID 为 1 */ +#define HID_REPORT_ID_KEYBOARD1 1 +/** + * HID 键盘输入/输出报告格式说明(Report ID = 1) + * + * 输入报告(设备 → 主机)8 字节: + * Byte 0: 修饰键(Ctrl/Shift/Alt/GUI) + * Byte 1: LED 状态(由主机控制) + * Byte 2~7: 当前按下的普通键,每字节记录一个 HID 按键码 + * + * 本 demo 中只使用: + * buf[2] 用来存放 1 个按键码 + */ +#define HID_INPUT_REPORT_LEN 8 +/* 常用 HID Key Code 定义 */ +#define HID_KEY_CODE_a 4 +#define HID_KEY_CODE_1 30 +#define HID_KEY_CODE_UpArrow 82 +#define HID_KEY_CODE_DownArrow 81 +/* 全局 HID 文件描述符 */ +static int g_hid_fp = 0; +/** + * @brief 发送 HID 键盘按下事件 + * @param fp HID 设备文件描述符 + * @param num HID 键盘按键码 + */ +rt_err_t hid_key_press(int fp, char num) +{ + rt_err_t ret = -RT_ERROR; + char buf[HID_INPUT_REPORT_LEN] = {0}; + /* 每次写 HID 报告前需调整 offset 到对应的 report ID */ + lseek(fp, HID_REPORT_ID_KEYBOARD1, SEEK_SET); + /* 填写按键码到 buf[2](标准 HID Keyboard 报告中的第一个按键位) */ + buf[2] = num; + /* 将 8 字节 HID 输入报告写入 HID 设备 */ + ret = write(fp, buf, HID_INPUT_REPORT_LEN); + if (ret < 0) + { + LOG_E("HID:WriteFail %d(L%d)", ret, __LINE__); + return ret; + } + /* 打印调试日志 */ + switch (num) + { + case HID_KEY_CODE_a: + LOG_I("KEY 'A' pressed"); + break; + case HID_KEY_CODE_1: + LOG_I("KEY '1' pressed"); + break; + case HID_KEY_CODE_UpArrow: + LOG_I("KEY 'UP Arrow' pressed"); + break; + case HID_KEY_CODE_DownArrow: + LOG_I("KEY 'Down Arrow' pressed\n"); + break; + } + return RT_EOK; +} +/** + * @brief 释放按键(发送空报告) + */ +rt_err_t hid_key_release(int fp) +{ + rt_err_t ret = -RT_ERROR; + char buf[HID_INPUT_REPORT_LEN] = {0}; + /* 将按键码清零(释放按键) */ + lseek(fp, HID_REPORT_ID_KEYBOARD1, SEEK_SET); + buf[2] = 0; + ret = write(fp, buf, HID_INPUT_REPORT_LEN); + if (ret < 0) + { + LOG_E("HID:WriteFail %d(L%d)", ret, __LINE__); + return ret; + } + return RT_EOK; +} +/** + * @brief USB HID demo 初始化与按键模拟循环 + * 依次模拟按下: + * 'a' → '1' → ↑ → ↓ (循环 5 次) + */ +int usb_hid_demo_init(void) +{ + int fp = 0; + int i = 0; + /* 初始化 HID 设备(厂商 API) */ + fh_hid_init(); + /* 等待 USB 完成枚举 */ + rt_thread_mdelay(2000); + /* 打开 HID 设备节点 */ + fp = open("/dev/hidd", O_RDWR); + if (fp == -1) + { + LOG_E("[/dev/hidd] open hidd failed"); + return 0; + } + g_hid_fp = fp; + /* 模拟 5 轮按键输入 */ + for (i = 0; i < 5; i++) + { + LOG_I("[/dev/hidd] open hidd %d", i); + /* 模拟按键 'a' */ + hid_key_press(fp, HID_KEY_CODE_a); + rt_thread_mdelay(10); + hid_key_release(fp); + /* 模拟按键 '1' */ + rt_thread_mdelay(500); + hid_key_press(fp, HID_KEY_CODE_1); + rt_thread_mdelay(10); + hid_key_release(fp); + /* 模拟上箭头 ↑ */ + rt_thread_mdelay(500); + hid_key_press(fp, HID_KEY_CODE_UpArrow); + rt_thread_mdelay(10); + hid_key_release(fp); + /* 模拟下箭头 ↓ */ + rt_thread_mdelay(500); + hid_key_press(fp, HID_KEY_CODE_DownArrow); + rt_thread_mdelay(10); + hid_key_release(fp); + rt_thread_mdelay(2000); + } + return 0; +} +``` + +4.修改Makefile文件 + +打开 bsp_demo/Makefile 文件,修改如下: + +```makefile +include $(SDKROOT)/build/config.mk + +SAMPNAME := $(shell basename `pwd`) + +SAMP_SRCS := $(wildcard aes/*.c) +SAMP_SRCS += $(wildcard spi/*.c) +SAMP_SRCS += $(wildcard i2c/*.c) +SAMP_SRCS += $(wildcard rtc/*.c) +SAMP_SRCS += $(wildcard sadc/*.c) +SAMP_SRCS += $(wildcard sdio/*.c) +SAMP_SRCS += $(wildcard startup/*.c) +SAMP_SRCS += $(wildcard pwm/*.c) +SAMP_SRCS += $(wildcard gpio/*.c) +SAMP_SRCS += $(wildcard uart/*.c) +SAMP_SRCS += $(wildcard usb_hid/*.c) + +include $(SDKROOT)/build/apps.mk +``` + +5:在SDK包中查找下面文件复制到bsp_demo\usb_hid目录下。 + +![screenshot_image.png](figures/36d29ff1690b9bc7fa9155d7c28ef5cb.png.webp) + +## 5. 程序编译 + +usb_hid_demo.c上面的头文件是为了不污染原有sdk而复制至当前文件夹的本地头文件,引用时要用双引号包含,不要使用尖括号包含。 +注意,编译错误 + +![screenshot_image.png](figures/6fc649a96daa06e96aa12b2099f8530a.png.webp) + +要将包含的尖括号改为双引号即可。 +比如#include 改为#include “rtthread.h” +在终端输入:`make clean;make` +最终生成固件: + +![screenshot_image.png](figures/7d663c39dc8387a314e272c14ad9dec0.png.webp) + +## 6. 烧录固件 + +1:将\home\work\usb_hid\ FH_RT_V3.4.0_20250123\ rt-thread\app\bsp_demo\out\bin +目录下的文件“bsp_demo.bin”复制到windows系统中tftp的目录下 +![screenshot_image.png](figures/6553c5748791f12deaaa74e6e82a0ff8.png.webp) + +![screenshot_image.png](figures/6aabff507cb8515437c0bd2d06deffd7.png.webp) + +2:双击“tftpd32.exe”运行tftp,配置如下图: + +![screenshot_image.png](figures/6122cd10768b7ac609bdfe1839e8bc29.png) + +3:运行SecureCRT +出现`Hit any key to stop autoboot: 0`,按回车,进入U-Boot。 +输入pri,查看设备的网络配置和PC机是否一个网段。 + +![screenshot_image.png](figures/f14c7e58bf108cb2d28508928aa127ed.png) + +4:快速进行下载和验证。 +`tftp 40000000 bsp_demo.bin` +`go 40000000` + +![screenshot_image.png](figures/83a98f9e3ccef04bb4be2f86b7b7f6fc.png) + +## 7. 测试 USB_HID + +在 shell 中输入 `bsp_demo -h` 开始 usb_hid 测试: +在shell 中输入 `ls /dev` 命令查看启用的外设: + +![screenshot_image.png](figures/ec5bcb5833d1cf243231e11b3c96915e.png) + +## 8. 心得体会 + +年前就拿到板子了,一直想搞个带音视频处理的平台,还是很期待。 +可惜年前一直忙订单,春节假期老妈又住院,节后才有时间研究一下。 +好在大伙已经研究一段时间,论坛文章写的详细又清晰。 +重点看了“FUNIOT”,“troyguo”的文章,跟着做,把环境搭建,程序编写,编译,固件烧录,测试。完成了USB_HID的测试。 +对此,非常感谢二位!也感谢富瀚微,RT-Thread的工作人员指导! +通过这段时间的学习,该SDK包还是挺完整,大部分问题,看看手册,看看《FH8626V300L开发实践指南》都可以解决。 + +**源程序下载** +可编译文件上传于: +https://gitee.com/davidyuan-SZNS/MC6321-usb_hid +可直接下载使用。 + +## 9. 原文链接 + +原文链接:[RT-Thread-MC6321上的USB_HID实践续RT-Thread问答社区 - RT-Thread](https://club.rt-thread.org/ask/article/fd033e8f528c9bf9.html)