diff --git a/rt-thread-version/rt-thread-standard/_sidebar.md b/rt-thread-version/rt-thread-standard/_sidebar.md index 677cb1989935c7e52463aa9e47def7247097a8d8..0a6a2922876c3e223e33fdd89c3e6aeb705bc2f7 100644 --- a/rt-thread-version/rt-thread-standard/_sidebar.md +++ b/rt-thread-version/rt-thread-standard/_sidebar.md @@ -210,6 +210,7 @@ - [恩智浦FRDM-MCXA346开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/MCX-A346/恩智浦FRDM-MCXA346实践指南.md) - 兆易创新GD32系列 - [兆易创新GD32F527I-EVAL开发实践指南](/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/兆易创新GD32F527I-EVAL开发实践指南.md) + - [兆易创新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) diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/017076ab25361ccc52a2f58ed329a745.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/017076ab25361ccc52a2f58ed329a745.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..5da147560ce1b50f496e978b95009926eddfd338 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/017076ab25361ccc52a2f58ed329a745.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/03e47ae64556315ff2b7e12978d36031.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/03e47ae64556315ff2b7e12978d36031.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..6d67e869483278b9a58fc9ea0df9618b981cc190 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/03e47ae64556315ff2b7e12978d36031.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/05995f75c40d2d2d353869c21e43a5ee.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/05995f75c40d2d2d353869c21e43a5ee.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..9077bdde24557e6253a577861cde99ba0be23ccb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/05995f75c40d2d2d353869c21e43a5ee.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/06256cd5abc41b834ecb3df50802bd88.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/06256cd5abc41b834ecb3df50802bd88.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..ee195ac07606384b451aad778cda14306d865054 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/06256cd5abc41b834ecb3df50802bd88.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/07138723bfdb3a430fd4854ed9a64fa6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/07138723bfdb3a430fd4854ed9a64fa6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4c27212da8d7357a98cbe845eb2f2e6692b64e9c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/07138723bfdb3a430fd4854ed9a64fa6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/094dbcac18fe6b65ef772c88d8abf32a.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/094dbcac18fe6b65ef772c88d8abf32a.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..ee7bea5cdb274657098aab8013a028b3c85b9132 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/094dbcac18fe6b65ef772c88d8abf32a.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/0c2f93f91eba087228535d813321a6e8.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/0c2f93f91eba087228535d813321a6e8.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e1af73f30831eeaaa11313700c3779c23310f781 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/0c2f93f91eba087228535d813321a6e8.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/0c9d63122b9330dd9c028afb8b85b56b.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/0c9d63122b9330dd9c028afb8b85b56b.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..98dcb28172e0436fdc1f56931f7073ddca152424 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/0c9d63122b9330dd9c028afb8b85b56b.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/0e833de9167e0e58146c9b51e7b784f9.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/0e833de9167e0e58146c9b51e7b784f9.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..67d4a11613bfe3a398670dc72661bee373619ee2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/0e833de9167e0e58146c9b51e7b784f9.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/144221.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/144221.png new file mode 100644 index 0000000000000000000000000000000000000000..f420d2295e645eae5e97da6e942ce2a4a11df0b1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/144221.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/144329.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/144329.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f05e7a152df0c3ea4a253415d0f1030a261946 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/144329.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/14bf39bfdfe61b09eab93aa97c731b72.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/14bf39bfdfe61b09eab93aa97c731b72.png new file mode 100644 index 0000000000000000000000000000000000000000..05860b5610ea84fa4e999562a73a53ef694d056d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/14bf39bfdfe61b09eab93aa97c731b72.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/18ae7c6366d647cc8e63ab50edf1d8ae.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/18ae7c6366d647cc8e63ab50edf1d8ae.png new file mode 100644 index 0000000000000000000000000000000000000000..22edddd54a04df2bda49fffe0dc0f1c2ea0cd33a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/18ae7c6366d647cc8e63ab50edf1d8ae.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2026-03-03 143906.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2026-03-03 143906.png new file mode 100644 index 0000000000000000000000000000000000000000..1ece12965b38ac95bed56c5cc2384320a7d539e2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2026-03-03 143906.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/202602061831043.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/202602061831043.png new file mode 100644 index 0000000000000000000000000000000000000000..b61add79884ae10a43af1eef85a07324376d465b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/202602061831043.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/202602061831045.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/202602061831045.png new file mode 100644 index 0000000000000000000000000000000000000000..d2423ae4b44dfea15ec396e717b4a0ece9dcb6d7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/202602061831045.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/202602061831046.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/202602061831046.png new file mode 100644 index 0000000000000000000000000000000000000000..a83e79f74839fa38ed0cb27dfc213cda81e3af18 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/202602061831046.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/202602061831047.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/202602061831047.png new file mode 100644 index 0000000000000000000000000000000000000000..198e5ed5f3859256731e7391801f1c473169b84a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/202602061831047.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/21db7b08c91dadd856d45ad1e2a70312.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/21db7b08c91dadd856d45ad1e2a70312.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..d93a80715c64749283c29f8d8d17784e682a401f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/21db7b08c91dadd856d45ad1e2a70312.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2504a8545d09f5db418be764982a853b.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2504a8545d09f5db418be764982a853b.png new file mode 100644 index 0000000000000000000000000000000000000000..45d970c62268fa6e748e14ed76c1525eb226a816 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2504a8545d09f5db418be764982a853b.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2b1c66cf1644780bca0579f14f0bdc0e.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2b1c66cf1644780bca0579f14f0bdc0e.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..d2c615979a6d37d427ef283ab77fd2c075c741b8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2b1c66cf1644780bca0579f14f0bdc0e.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2b8ab9ba225ef429a80a00d1b81c2c2b.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2b8ab9ba225ef429a80a00d1b81c2c2b.png new file mode 100644 index 0000000000000000000000000000000000000000..785131a9817725d45dd16e960959e90eac009242 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2b8ab9ba225ef429a80a00d1b81c2c2b.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2c45ddc9af8c456bac2e2e57ac54c957.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2c45ddc9af8c456bac2e2e57ac54c957.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a0c28e54f1a1153ec509acc2e7f4fe2e1e3912 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2c45ddc9af8c456bac2e2e57ac54c957.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2c613bd066041d569a76f61b81f423cd.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2c613bd066041d569a76f61b81f423cd.png new file mode 100644 index 0000000000000000000000000000000000000000..f1dd89db802b69113f574e912e4ec224a585d617 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2c613bd066041d569a76f61b81f423cd.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2dd7a381ca55a74110218785bfa5ffe4.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2dd7a381ca55a74110218785bfa5ffe4.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..3ed1c34da851fc42f15c699b91fa01eba764caa4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2dd7a381ca55a74110218785bfa5ffe4.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2e2fa63a798502a036262cda175291b9.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2e2fa63a798502a036262cda175291b9.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..a3cbf9fb339ba778ad11e7e03f269c1faa5121f8 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/2e2fa63a798502a036262cda175291b9.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/37fb8e5cfc5b505bb8fb8d87845ceee5.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/37fb8e5cfc5b505bb8fb8d87845ceee5.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..a65969c9b7121afe062fc86fd2b12667fd89c68f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/37fb8e5cfc5b505bb8fb8d87845ceee5.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/3c23d3a704e37c7beedd6193c9d1a3b8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/3c23d3a704e37c7beedd6193c9d1a3b8.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec4e99a0946b105fb087d4c939181497e1ae8f1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/3c23d3a704e37c7beedd6193c9d1a3b8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/3db3e50c8742f0688f84f7eccbc98096.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/3db3e50c8742f0688f84f7eccbc98096.png new file mode 100644 index 0000000000000000000000000000000000000000..46858409d8a9e0d5046124c332b54889a09cd551 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/3db3e50c8742f0688f84f7eccbc98096.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/3e8eb3403b639c0a03d3a0c84fa91c80.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/3e8eb3403b639c0a03d3a0c84fa91c80.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..ea78a8f986180d9a9d859bfdd6cf7c7cf5ae09c5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/3e8eb3403b639c0a03d3a0c84fa91c80.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/40aa4e41c1e2b0743d35415980c25193.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/40aa4e41c1e2b0743d35415980c25193.png new file mode 100644 index 0000000000000000000000000000000000000000..c7021cd4e839b575e2f58d021d011c79229fcd7e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/40aa4e41c1e2b0743d35415980c25193.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/48306cfa0a6fcb23a953305ea078e365.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/48306cfa0a6fcb23a953305ea078e365.png new file mode 100644 index 0000000000000000000000000000000000000000..ba1748479240341c151ca19cfdf9a722880db6f9 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/48306cfa0a6fcb23a953305ea078e365.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/50d2981c1ae0f1fd4d0cac8d556bb568.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/50d2981c1ae0f1fd4d0cac8d556bb568.png new file mode 100644 index 0000000000000000000000000000000000000000..24389e3f80b7eb869ff7bc76be07e63004c3a695 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/50d2981c1ae0f1fd4d0cac8d556bb568.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/57bb7053ea8d3b2a3232607290aa4913.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/57bb7053ea8d3b2a3232607290aa4913.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e60d6cb2277139502564b07b8f0dde64dadf8f48 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/57bb7053ea8d3b2a3232607290aa4913.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/595b4ea3b9f2c808f8867992b98a440b.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/595b4ea3b9f2c808f8867992b98a440b.png new file mode 100644 index 0000000000000000000000000000000000000000..b485c5fde51cb3a4ed290e201a5c37e1685247d4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/595b4ea3b9f2c808f8867992b98a440b.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/5ff551fa7757ccce3c9e9cacc6936e25.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/5ff551fa7757ccce3c9e9cacc6936e25.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..8040b873bcc50fd06784170fc7f6ad1d94860f35 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/5ff551fa7757ccce3c9e9cacc6936e25.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/60c737333fe65844f23150c640bb7701.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/60c737333fe65844f23150c640bb7701.png new file mode 100644 index 0000000000000000000000000000000000000000..2dcdf6c501ae900895e843a1f83e96ca0ed7bb64 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/60c737333fe65844f23150c640bb7701.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/61953894d0cee584a729601bccadf5fd.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/61953894d0cee584a729601bccadf5fd.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..9922c50936fe494c508394338f5b5a114b640cbe Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/61953894d0cee584a729601bccadf5fd.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/6272b9eb82e1e643d265f74bc497e794.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/6272b9eb82e1e643d265f74bc497e794.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4bb68669df4083fe2b2e130d15b48e49e5a0686c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/6272b9eb82e1e643d265f74bc497e794.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/6437e28f4dbbed7af5a1352f9af84ea9.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/6437e28f4dbbed7af5a1352f9af84ea9.png new file mode 100644 index 0000000000000000000000000000000000000000..6aedec975834541d5758715a2738e0b544794bd3 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/6437e28f4dbbed7af5a1352f9af84ea9.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/66db69f87f662fdef77b28dd46072ec6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/66db69f87f662fdef77b28dd46072ec6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..fc316eee794c259e80cf42a06196c3b04b360ca4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/66db69f87f662fdef77b28dd46072ec6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/695345267a02e7ff295bb69240260a58.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/695345267a02e7ff295bb69240260a58.png new file mode 100644 index 0000000000000000000000000000000000000000..7bfe2e384506e6e20fedfa423567b25397e11b71 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/695345267a02e7ff295bb69240260a58.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/698b3864dc275476621fbf1e30aace74.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/698b3864dc275476621fbf1e30aace74.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..859d0e7301a6e7c78ba6c9e75ec60a08cacaf674 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/698b3864dc275476621fbf1e30aace74.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/6c1a776c140a421d445d4d64379e0de8.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/6c1a776c140a421d445d4d64379e0de8.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b983a68d9487d76a588eb1497122dab262cada9d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/6c1a776c140a421d445d4d64379e0de8.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/6e083f589ca0b393668b72f5ecfe4dc7.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/6e083f589ca0b393668b72f5ecfe4dc7.png new file mode 100644 index 0000000000000000000000000000000000000000..0d9b5e3829fd2d2f7643674040c51cfb542649ee Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/6e083f589ca0b393668b72f5ecfe4dc7.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/70775bd960ba804dc7749cb843d5f106.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/70775bd960ba804dc7749cb843d5f106.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..284de35b76ba51ba53f37d18667491c0e3815236 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/70775bd960ba804dc7749cb843d5f106.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/70833d5a2747b0f114266f9c0d897102.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/70833d5a2747b0f114266f9c0d897102.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..1ada679ea8950622621fd3b421bfee21f3596428 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/70833d5a2747b0f114266f9c0d897102.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/75a7e8461fa99fa8f89db061ff3e9a58.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/75a7e8461fa99fa8f89db061ff3e9a58.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e2749256a3f7f3fa04e77a634927b249ec6c8e52 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/75a7e8461fa99fa8f89db061ff3e9a58.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/761f2d1e6cf36ba89bcd2b491a84c18d.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/761f2d1e6cf36ba89bcd2b491a84c18d.png new file mode 100644 index 0000000000000000000000000000000000000000..47f7b13cc1335001f7f54dbf80e439eb0fa9aac3 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/761f2d1e6cf36ba89bcd2b491a84c18d.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7849be9e714e13a3dee60db77fe6030f.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7849be9e714e13a3dee60db77fe6030f.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..09c1ced388215e8b764701dc19405582a49d7c86 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7849be9e714e13a3dee60db77fe6030f.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7960566c9bb5b95e8ccb31902c8e2b82.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7960566c9bb5b95e8ccb31902c8e2b82.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..e0bf959f16c756b7da84a8179afdc063f0a34128 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7960566c9bb5b95e8ccb31902c8e2b82.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7a77083455db1c15a383f2acbd6a38a3.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7a77083455db1c15a383f2acbd6a38a3.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..0e1690173bae01dd78ea6807d47a928a9d0124ff Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7a77083455db1c15a383f2acbd6a38a3.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7f27229bc27e8e19809bc815edd57a17.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7f27229bc27e8e19809bc815edd57a17.png new file mode 100644 index 0000000000000000000000000000000000000000..b3cb4497bce82eff05a81867f724223382754aa4 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7f27229bc27e8e19809bc815edd57a17.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7f293851892852025cc131e6662493a2.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7f293851892852025cc131e6662493a2.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbeef89a5cc31577e390985f60163bafe950648 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/7f293851892852025cc131e6662493a2.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/8088df36acfb1f853a6f0d50c1e03842.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/8088df36acfb1f853a6f0d50c1e03842.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..541cfeaa4f416cddd7b5bc9f1b83a196ccf161ac Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/8088df36acfb1f853a6f0d50c1e03842.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/8401afe5435ae10e914e17655bec9f80.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/8401afe5435ae10e914e17655bec9f80.png new file mode 100644 index 0000000000000000000000000000000000000000..707a1bc41dbdc37cf6f0b9ee8688c1f24537bca5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/8401afe5435ae10e914e17655bec9f80.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/8994905f6bcd1324abd9c0c2c5e83d10.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/8994905f6bcd1324abd9c0c2c5e83d10.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..acf0b24afca3a1873d995bb6a7184abc4b9bbe96 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/8994905f6bcd1324abd9c0c2c5e83d10.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/8c22b5927e85cb15839271ffca40365d.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/8c22b5927e85cb15839271ffca40365d.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..ab6913f08978da2e4ea8927c6732009d74b7897a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/8c22b5927e85cb15839271ffca40365d.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/90a8fdac25794797a4561553fa31f769.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/90a8fdac25794797a4561553fa31f769.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..7ac0b17f914a5091e73881e774f8d649f9eb580c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/90a8fdac25794797a4561553fa31f769.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/93e732cbfb800047c29534e1e8f9121e.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/93e732cbfb800047c29534e1e8f9121e.png new file mode 100644 index 0000000000000000000000000000000000000000..2c298fad6ab6ec4c13ac8b2ee0a7842f3793a044 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/93e732cbfb800047c29534e1e8f9121e.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/94149ad140104595de97d5aa5abddb30.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/94149ad140104595de97d5aa5abddb30.png new file mode 100644 index 0000000000000000000000000000000000000000..c6d14d2e3c2c520c952d6ca3ab7448ba7ed27b92 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/94149ad140104595de97d5aa5abddb30.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/9556167785e92bd2fbfb45e09546afe4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/9556167785e92bd2fbfb45e09546afe4.png new file mode 100644 index 0000000000000000000000000000000000000000..f9487e059f83631426fe6da4d9aa8abe5d0fce3c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/9556167785e92bd2fbfb45e09546afe4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/9c7423647e81e63fdad12a02c76c02b6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/9c7423647e81e63fdad12a02c76c02b6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..af557b1b7d3b81bea5b621de479b165f3e5aa51b Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/9c7423647e81e63fdad12a02c76c02b6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/9ccf050ac7cf830af1d22a17a8e56d72.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/9ccf050ac7cf830af1d22a17a8e56d72.png new file mode 100644 index 0000000000000000000000000000000000000000..4c05d6e6a2fb0699da6d3c9e9893010f3bba0701 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/9ccf050ac7cf830af1d22a17a8e56d72.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/9cf7586693b0254ca48b81d48796bdd3.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/9cf7586693b0254ca48b81d48796bdd3.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e35c65f05fc77b392aa8688faddb946f1aa401 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/9cf7586693b0254ca48b81d48796bdd3.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/BSP_USING_WLAN.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/BSP_USING_WLAN.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c3e7bf02b052a4674bb7b0423586a526acdbf3 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/BSP_USING_WLAN.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/a1c3ee0b386df6de09ca4f87e5ab2ce9.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/a1c3ee0b386df6de09ca4f87e5ab2ce9.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f6efb218386f98ef0abab2201483fa4b6bb7466 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/a1c3ee0b386df6de09ca4f87e5ab2ce9.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/a5e6c36fb20a7d3108be0eb7d76865a6.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/a5e6c36fb20a7d3108be0eb7d76865a6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..26b555c01bff8da5f67e921c4aa1eb345ae2b36d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/a5e6c36fb20a7d3108be0eb7d76865a6.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/a8a88b48541281670f4fd49ca0b5b5a6.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/a8a88b48541281670f4fd49ca0b5b5a6.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..6fd479ed4cb461befa33c81b56a28b68a0d6d612 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/a8a88b48541281670f4fd49ca0b5b5a6.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/aca15fbbbdd23250e189717bb9bbe1a3.jpg.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/aca15fbbbdd23250e189717bb9bbe1a3.jpg.webp new file mode 100644 index 0000000000000000000000000000000000000000..a692310ab4dd3437a0578e7fa790e14c5225f77f Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/aca15fbbbdd23250e189717bb9bbe1a3.jpg.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ae07f3deb1cece85540e96de9e537572.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ae07f3deb1cece85540e96de9e537572.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..836507286ab945ab38b151c31ad52d0cd5f9a86e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ae07f3deb1cece85540e96de9e537572.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b1a2fcb58435f471e46543b22cf10fd0.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b1a2fcb58435f471e46543b22cf10fd0.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..f9f5338dc8022a991ed8eced11b2fa96c2d99357 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b1a2fcb58435f471e46543b22cf10fd0.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b41197cf9e1d1fbcb23e846fcd3a98b8.jpg b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b41197cf9e1d1fbcb23e846fcd3a98b8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1496752a2608caa8780e44b0d8575ec318e3590 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b41197cf9e1d1fbcb23e846fcd3a98b8.jpg differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b49af3b61050adf7c38fc01bc50a49c5.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b49af3b61050adf7c38fc01bc50a49c5.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..497b76fa91e7fa430e811c682d430f50df5d67b5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b49af3b61050adf7c38fc01bc50a49c5.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b550bcdeda27dff9814df98f06296316.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b550bcdeda27dff9814df98f06296316.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..ea0b5aa9a4e280216d5fc461422374f19afaead6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b550bcdeda27dff9814df98f06296316.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b6fd0633d1cc526f1d99a958fb46ab22.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b6fd0633d1cc526f1d99a958fb46ab22.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..dd32ad4752677e00d06cf1a3b4224358db0ce089 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b6fd0633d1cc526f1d99a958fb46ab22.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b7c4f21f5ca03a65f468bd88a11fe554.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b7c4f21f5ca03a65f468bd88a11fe554.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..313cc13cd4b305d6c3af8b9881b3a0009a82eab7 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b7c4f21f5ca03a65f468bd88a11fe554.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b84ca96f375e2ed2d8d6ab3c37bbe042.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b84ca96f375e2ed2d8d6ab3c37bbe042.png new file mode 100644 index 0000000000000000000000000000000000000000..ee27af12738e0932d7c0250a82005d314167c340 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b84ca96f375e2ed2d8d6ab3c37bbe042.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b9075e7ad62ff14df073d31ea71482f8.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b9075e7ad62ff14df073d31ea71482f8.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbe764b66a768d2e18786ca4ec695af7cb3e077 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/b9075e7ad62ff14df073d31ea71482f8.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/c80409341b33be1bb75285b636fd6a87.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/c80409341b33be1bb75285b636fd6a87.png new file mode 100644 index 0000000000000000000000000000000000000000..fbffb2dd3ab2936dab80c28246ddc28f955751f6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/c80409341b33be1bb75285b636fd6a87.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/c8dbdeabe2d9e4e0a759e68a61db07b4.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/c8dbdeabe2d9e4e0a759e68a61db07b4.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..577d43c79f0ae895636388685c6572205c06fd5c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/c8dbdeabe2d9e4e0a759e68a61db07b4.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ca0c657fad12ffe8541e4b00217b344f.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ca0c657fad12ffe8541e4b00217b344f.png new file mode 100644 index 0000000000000000000000000000000000000000..de84cba5d70ff3347ed842bc71ebf75319bebbc2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ca0c657fad12ffe8541e4b00217b344f.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/cd13938857bcbbaabd80e7bd71820468.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/cd13938857bcbbaabd80e7bd71820468.png new file mode 100644 index 0000000000000000000000000000000000000000..05d922b2cdf0e77190a1d22c728401c4ea3138d3 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/cd13938857bcbbaabd80e7bd71820468.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/d1b77bd12591468e4e76f034190508b0.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/d1b77bd12591468e4e76f034190508b0.png new file mode 100644 index 0000000000000000000000000000000000000000..9648078eb4486910537bcbaa8210a156e8de1637 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/d1b77bd12591468e4e76f034190508b0.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/d7278d9388ef91ce1f5de7ae4313b3a5.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/d7278d9388ef91ce1f5de7ae4313b3a5.png new file mode 100644 index 0000000000000000000000000000000000000000..59f35cdeba02f44e5d7998877dae749bef982e05 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/d7278d9388ef91ce1f5de7ae4313b3a5.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/db0a30661db508031f25946724066b84.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/db0a30661db508031f25946724066b84.png new file mode 100644 index 0000000000000000000000000000000000000000..a565c808de7d34d1903cbfc7a400bb51beb12207 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/db0a30661db508031f25946724066b84.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/df19f64e00736ff166240a0ff8622932.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/df19f64e00736ff166240a0ff8622932.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..ef7ef1424861ab0499580dbec48b83f61d476cb6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/df19f64e00736ff166240a0ff8622932.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e1ac5210caab2e43d3c3bd2b4eacf083.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e1ac5210caab2e43d3c3bd2b4eacf083.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..be32c6e32002a5bdf0a7a6dd39f7bcd6de4f1d2e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e1ac5210caab2e43d3c3bd2b4eacf083.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e1f843b8f5c07fc81280f3826d0dd1df.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e1f843b8f5c07fc81280f3826d0dd1df.png new file mode 100644 index 0000000000000000000000000000000000000000..0c30c75df44d0921477f6d16fd9bdca631cbc34c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e1f843b8f5c07fc81280f3826d0dd1df.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e5e6573278a61f0403152f02ccc8f0d2.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e5e6573278a61f0403152f02ccc8f0d2.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..5e7368547623979b5cf0049d8394a46b2022c36a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e5e6573278a61f0403152f02ccc8f0d2.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e64d8183984d8c36791548fde8dbcd61.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e64d8183984d8c36791548fde8dbcd61.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..b517d130b5c5cf2c45c9035cdb8d5e512050ef2d Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e64d8183984d8c36791548fde8dbcd61.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e94f976992de94a77a4f7f8c28e3fe16.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e94f976992de94a77a4f7f8c28e3fe16.png new file mode 100644 index 0000000000000000000000000000000000000000..a1127ce02623d3b1f6442cf4fcfc79310bc23faa Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e94f976992de94a77a4f7f8c28e3fe16.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e97290b2e4d2fa41b5b115a1f91852cf.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e97290b2e4d2fa41b5b115a1f91852cf.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..f9529afd73d64e1e1f32aaba137344c70eca53fa Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/e97290b2e4d2fa41b5b115a1f91852cf.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ec5e10216037e11f3526d086f50cb325.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ec5e10216037e11f3526d086f50cb325.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..ae60565af39d4e1d8ebbf5cbcfe5e2bbec7fcfac Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ec5e10216037e11f3526d086f50cb325.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ed160840c7d0e863cc16c74ae34b5db2.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ed160840c7d0e863cc16c74ae34b5db2.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..f0c3129669a3130d5252048911de8a657d4d6c24 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ed160840c7d0e863cc16c74ae34b5db2.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/edfc69b3ade170a1f4ff3d7ff0f33db9.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/edfc69b3ade170a1f4ff3d7ff0f33db9.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..67f579aeb0c17675b7e2148cf551c07fdd7c3dec Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/edfc69b3ade170a1f4ff3d7ff0f33db9.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ef2453c175fd3f0b6c0c2df4781ede26.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ef2453c175fd3f0b6c0c2df4781ede26.png new file mode 100644 index 0000000000000000000000000000000000000000..67e8c50dee34f9c20ec1fa58531db1d235e48f63 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ef2453c175fd3f0b6c0c2df4781ede26.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/f2721ffdf70f7502a38441f1cc8b75c2.png.webp b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/f2721ffdf70f7502a38441f1cc8b75c2.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..931272d5eea62863b6155ee2a185c331cca42619 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/f2721ffdf70f7502a38441f1cc8b75c2.png.webp differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/f29b117b0f658d7e8d53fcf7de7b1f74.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/f29b117b0f658d7e8d53fcf7de7b1f74.png new file mode 100644 index 0000000000000000000000000000000000000000..19b585cac9eb829f8bb78ec4384c485aa3c21e96 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/f29b117b0f658d7e8d53fcf7de7b1f74.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/f6325454c45340a3a7765c7dd2fa54c4.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/f6325454c45340a3a7765c7dd2fa54c4.png new file mode 100644 index 0000000000000000000000000000000000000000..8517f7658b47d71cd98ad0ca1b35d92bf1edbfdf Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/f6325454c45340a3a7765c7dd2fa54c4.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/fb2a41f2ee8e91bc7e6e6012ae44a197.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/fb2a41f2ee8e91bc7e6e6012ae44a197.png new file mode 100644 index 0000000000000000000000000000000000000000..72770534f6a45f70a0928fcfdb18a1be70833272 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/fb2a41f2ee8e91bc7e6e6012ae44a197.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/fe06e7b2d2bef3cb24983470adeb162c.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/fe06e7b2d2bef3cb24983470adeb162c.png new file mode 100644 index 0000000000000000000000000000000000000000..bd7704b9700e567b1bf05f8adbf92fad0d0bc8bb Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/fe06e7b2d2bef3cb24983470adeb162c.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/fe255c9841d93688e72b4042cbcd858f.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/fe255c9841d93688e72b4042cbcd858f.png new file mode 100644 index 0000000000000000000000000000000000000000..6168faae7c3e0f9fd257c0f32fd0eec7aa6b6033 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/fe255c9841d93688e72b4042cbcd858f.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ff92c43805221610d23492b3d1556a69.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ff92c43805221610d23492b3d1556a69.png new file mode 100644 index 0000000000000000000000000000000000000000..e73c0be898a1ed0daedfc5d53317ab957ad94931 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/ff92c43805221610d23492b3d1556a69.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/gd32vw553.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/gd32vw553.png new file mode 100644 index 0000000000000000000000000000000000000000..39b3dcc0b7d1998d3df2c36c9d369ae22ba123e6 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/gd32vw553.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205145545039.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205145545039.png new file mode 100644 index 0000000000000000000000000000000000000000..74771fd72615b1f5d33b1cd5b2d0acd77c20111c Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205145545039.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205145806668.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205145806668.png new file mode 100644 index 0000000000000000000000000000000000000000..7d07b8e16d7f0849846091ff002e5fcdadab6a99 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205145806668.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205145856756.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205145856756.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa71d961f9d405033050b605fc205e1d0878e1 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205145856756.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205150826393.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205150826393.png new file mode 100644 index 0000000000000000000000000000000000000000..0b1013b891894ba0984cb7c09ea8d927e258150a Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205150826393.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205151251937.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205151251937.png new file mode 100644 index 0000000000000000000000000000000000000000..655a6e3dcfa96030a344669a9862bc6ff75b08d2 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205151251937.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205151356304.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205151356304.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b4067fe17b1a398031721bd98daabcdcc80474 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205151356304.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205151644687.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205151644687.png new file mode 100644 index 0000000000000000000000000000000000000000..d02bcab0fe25a6357d50e32f5ec841883259d5fc Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205151644687.png differ diff --git a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205151712234.png b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205151712234.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc38bea834c7c5a5fc329f74010f8d65b5b283e Binary files /dev/null and b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/figures/image-20260205151712234.png differ diff --git "a/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/\345\205\206\346\230\223\345\210\233\346\226\260GD32VW553-EVAL\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/gd32/\345\205\206\346\230\223\345\210\233\346\226\260GD32VW553-EVAL\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..36657067611c80238b23239724ac0f4d154d2164 --- /dev/null +++ "b/rt-thread-version/rt-thread-standard/tutorial/make-bsp/gd32/\345\205\206\346\230\223\345\210\233\346\226\260GD32VW553-EVAL\345\274\200\345\217\221\345\256\236\350\267\265\346\214\207\345\215\227.md" @@ -0,0 +1,2447 @@ +# 《兆易创新GD32VW553I-EVAL开发实践指南》 + +| **目录** | **作者** | +| ------------------------------- | ------------------------ | +| **零、实践指南说明** | **RT-Thread & 兆易创新** | +| **一、GD32VW553上的UART实践** | **张海涛** | +| **二、GD32VW553上的WDG实践** | **张国庆** | +| **三 、GD32VW553上的I2C实践** | **yefeng&曹显嵩** | +| **四、GD32VW553上的TIMER实践** | **车佳&张海良** | +| **五、GD32VW553上的PWM实践** | **吴艺彬** | +| **六、GD32VW553上的SPI实践** | **李金磊** | +| **七、GD32VW553上的WIFI实践** | **兆易创新 & 吴艺彬** | +| **FAQ** | **RT-Thread & 兆易创新** | + +# 零、GD32VW553I-EVAL开发实践指南说明 + +## 硬件介绍 + +1. GD32VW553H_EVAL是兆易创新推出的一款GD32VW系列的评估板,用于测评VW553芯片及MINI模组的Wi-Fi和BLE各项无线性能。 + +![GD32VW553-EVAL](figures/gd32vw553.png) + +- GD32VW553系列双模无线MCU,支持Wi-Fi 6及Bluetooth LE 5.2无线连接 +- 集成了高达4MB Flash及320KB SRAM,另有32KB可配置指令高速缓存(I-Cache),大幅提升了CPU处理效率 +- 不仅具备出色的无线性能,芯片还配置了丰富的通用有线接口,包含3个U(S)ART、2个I2C、1个SPI以及1个四线制QSPI等, 以及多达29个可编程 GPIO 管脚 +- 内置2个32位通用定时器、2个16位通用定时器、4个16位基本定时器、1个PWM高级定时器和1个12位ADC +- 供电电压1.8V - 3.6V,并提供了85℃ - 105℃宽温选择,以满足工控互联、照明设备以及插座面板等高温场景应用所需 + +面向实时处理和高效通信需求,GD32VW553系列MCU采用了全新的开源指令集架构RISC-V处理器内核,主频可达160MHz,还配备了高级DSP硬件加速器、双精度浮点单元(FPU)以及指令扩展接口等资源,以出色的微架构设计实现了极佳的能效比,并提供了灵活的可扩展性。 + +**我有疑问:**[**RT-Thread 官方论坛**](https://gitee.com/link?target=https%3A%2F%2Fclub.rt-thread.org) + +# 一、GD32VW553上的UART实践(张海涛) + +## 1. 开发环境搭建 + +### 1.1 软件下载链接 + +1. RTThread 环境:[https://github.com/RT-Thread/rt-thread/tree/master/bsp/gd32/risc-v/gd32vw553h-eval](https://github.com/RT-Thread/rt-thread/tree/master/bsp/gd32/risc-v/gd32vw553h-eval) + + 1.1. 方案一:可以使用git工具直接拉取RT-Thread整包:git clone [https://github.com/RT-Thread/rt-thread.git](https://github.com/RT-Thread/rt-thread.git) + + 1.2. 方案二:可以直接从git界面下载zip整包,本地解压; + + ![8faa6348-b4b4-4015-8d54-47f47bb813c2.png](figures/094dbcac18fe6b65ef772c88d8abf32a.png.webp) + +1. RT-Thread ENV工具:[https://www.rt-thread.org/download.html#download-rt-thread-env-tool](https://www.rt-thread.org/download.html#download-rt-thread-env-tool) + ![16ce0160-83b0-4d79-aa46-23692f3e4f7b.png](figures/0e833de9167e0e58146c9b51e7b784f9.png.webp) + +1. 编译器工具链:[https://www.gigadevice.com.cn/product/mcu/mcus-product-selector/gd32vw553hmq6](https://www.gigadevice.com.cn/product/mcu/mcus-product-selector/gd32vw553hmq6) + ![87e9205f-dfb5-4dea-a41f-57136b436772.png](figures/57bb7053ea8d3b2a3232607290aa4913.png.webp) + +1. 固件烧录工具GD32AllInOneProgrammer:[https://www.gd32mcu.com/cn/download?kw=GD32+All-In-One+Programmer&lan=cn](https://www.gd32mcu.com/cn/download?kw=GD32+All-In-One+Programmer&lan=cn) + ![fe3132c8-de06-4c5c-97ee-7d6a5b696c69.png](figures/7849be9e714e13a3dee60db77fe6030f.png.webp) + +### 1.2 环境配置 + +#### 1.2.1 RT-Thread ENV工具配置 + +1. 将1.1->第3小节:链接中下载的文件拷贝至工作文件夹(此处为笔者习惯,仅供参考,可跳过); + ![27556bd0-66d7-4116-961d-2093ad8e37b2-1.png](figures/50d2981c1ae0f1fd4d0cac8d556bb568.png) + +1. 打开路径中的exe文件运行RT-Thread ENV工具,此时该文件会自动配置Windows下的环境变量; + ![4f4d5748-ee68-466d-b544-39f315d6eeb9.png](figures/fe06e7b2d2bef3cb24983470adeb162c.png) + +> 此处需要注意输出文件中包含的环境变量的设置,当我们解压并使用后,再次移动软件位置时,记得将环境变量同步更改,否则可能会报错,无法找到pkgs指令;若是不会修改环境变量,最简单的解决方案就是删除当前的ENV整包,然后在需要安装的位置重新解压,并运行即可; + +1. 当软件环境配置完成后,分别运行pkgs —upgrade、pkgs —update,此时观察仓库可以发现仓库中增加了packages文件夹,里面包含了gd32的lib库; + + ![5c34874526680a619ac7f0fa04a1042c.png](figures/fe255c9841d93688e72b4042cbcd858f.png) + ![image-1.png](figures/ca0c657fad12ffe8541e4b00217b344f.png) + +#### 1.2.2 GD32编译链环境搭建 + +1. 对于任意一款芯片的编译肯定都需要适配交叉编译工具链,一般这部分厂商都有提供,本次需要将交叉编译工具集成到RT-Thread的环境中; +2. 由于在第一章1.1已经下载好了编译器工具链,首先需要选择一个自己想要放置编译链的地方解压工具链; +3. 然后在RT ENV环境下运行下面命令,注意:PTAH=后面跟着的路径需要改为自己的路径,下方指令不可直接复制粘贴使用!下方指令不可直接复制粘贴使用!下方指令不可直接复制粘贴使用! + + 1. `set RTT_EXEC_PATH=E:\GD32\GD32VW5\GD32EmbeddedBuilder_v1.5.4_Rel\Tools\RISC-V Embedded GCC\8.2.0-2.2-20190521-0004\bin` + +4. 运行完成后,在gd32vw553h-eval的目录下直接执行scons -j128编译即可; + + > 记得一定要在\\rt-thread-master\\bsp\\gd32\\risc-v\\gd32vw553h-eval,这个目录下执行,其中j后面跟着的数字是指使用几个核进行编译,可根据自己的电脑实际性能调整; + +5. 编译完成后既可以看到文件夹中多了rtthread.bin文件,该文件就是后面需要下载到板卡的二进制文件; + +### 1.3 固件烧录(直接按照git中完成) + +1. 固件烧录需要使用上述的第一章1.1中下载的GD32AllInOneProgrammer软件,烧录说明位于烧录软件下的Doc文件夹,或在线搜索使用方法,下述是烧录的示例: + ![image-2.png](figures/ed160840c7d0e863cc16c74ae34b5db2.png.webp) + +> 需要注意的是使用上述软件烧录时需要将boot1置为高电平,烧录结束后重新设置为低电平,手动调整板载的boot跳线帽。 + +1. 运行结果:烧录完毕后,使用串口连接自己的串口终端软件,即可通过串口与开发板交互; + +### 1.4 测评结论 + +GD32这款板子在环境搭建上相对还是比较简单的,基本可以无脑跟着Git中的指引一步步完成开发环境的搭建,无需开发者到处寻找资料;同时搭建开发环境所需的软件包也比较集中,且容易获取; + +## 2. VSCode软件调试环境搭建 + +### 2.1 调试环境搭建 + +1. 配置VSCode调试环境,首先在第一章中已经下载好了《GD32EmbeddedBuilder》,调试环境配置时需要用到该文件夹中的Tools; + ![image-3.png](figures/f6325454c45340a3a7765c7dd2fa54c4.png) + +2. 其次在BSP根目录下执行下述命令,生成VSCode工程所需文件。 + + ```bash + scons --target=vs + ``` + +3. 在VSCode安装扩展插件Cortex-Debug,版本v1.4.4。 + +4. 完成上述工作后,点击运行和调试选项,创建一个launch.json配置文件,配置文件示例如下: + + ```json + { + "version": "0.2.0", + "configurations": + [ + { + "name": "Cortex Debug", + "cwd": "${workspaceFolder}", + "executable": "${workspaceFolder}/rtthread.elf", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "serverpath": "E:/GD32/GD32VW5/Tools/GD32EmbeddedBuilder_v1.5.2.30854/Tools/OpenOCD/xpack-openocd-0.11.0-3/bin/openocd", + "configFiles": + [ + "${workspaceFolder}/openocd_gdlink.cfg" + ], + "runToEntryPoint": "main", + "showDevDebugOutput": "raw", + "toolchainPrefix": "E:/GD32/GD32VW5/Tools/GD32EmbeddedBuilder_v1.5.2.30854/Tools/RISC-V Embedded GCC/8.2.0-2.2-20190521-0004/bin/riscv-none-embed" + } + ] + } + ``` + + > 这里需要注意如果你的${workspaceFolder}工作空间不是当前的路径,可以自行将${workspaceFolder}相关的路径改为自己launch.json的绝对路径/相对路径使用; + + 上述文件中的部分字段需要根据用户环境进行修改,格式需与示例一致: + + > “serverpath”:该字段需要改为用户的openocd所在路径,openocd工具位于GD32EmbeddedBuilder工具包中。 + > + > “toolchainPrefix”:该字段需修改为用户的工具链所在路径,工具链位于GD32EmbeddedBuilder工具包中。 + +1. 完成上述配置后即可点击调试选项进行调试,调试时boot管脚均置为低电平即可,调试时同样会进行固件下载。 + +### 2.2 调试环境测试 + +1. 在工程界面点击Cortex Debug,即可进入调节界面; + ![image-4.png](figures/b6fd0633d1cc526f1d99a958fb46ab22.png.webp) + +1. 在调试界面可以查看变量值、暂停后可以查看当前任务的调用栈情况,同时也支持在vscode界面进行断点操作、单步调试、Reset等; + ![image-5.png](figures/3e8eb3403b639c0a03d3a0c84fa91c80.png.webp) + +### 2.3 测评结论 + +整体来说调试环境搭建非常简单,但是调试界面相对于keil、esp-idf、劳德巴赫等其他环境较为简陋,不过功能完全足够开发者使用; + +## 3. 芯片资源 - Uart + +芯片采用RISC-V架构处理器,适用于低能耗、小面积的嵌入式应用,具有简单的动态分支预测、指令预取缓冲区和I-cache等多种高效微架构特点。 + +### 3.1 Uart分布 + +![image-6.png](figures/edfc69b3ade170a1f4ff3d7ff0f33db9.png.webp) + +根据芯片架构示意图可以看到,芯片共有三路串口,其中UART2挂载在APB2总线上,USART0和UART1挂载在APB1上;这里需要注意我们在使用不同Uart时,需要初始化对应的总线时钟; + +### 3.2 存储 + +RISC-V处理器采用哈弗架构,可以使用单独的总线来提取指令和加载/存储数据。程序存储器,数据存储器,寄存器和I/O端口组织在同一线性4GB(32位芯片)地址空间内。具体的存储器映射表可以查看《GD32VW55x_用户手册_Rev1.4.pdf》第1.3节; + +Uart地址空间 +USART0:0x4000 4800 - 0x4000 4BFF +UART1:0x4000 4400 - 0x4000 47FF +UART2:0x4001 1000 - 0x4001 13FF + +Ram段 +![image-7.png](figures/3c23d3a704e37c7beedd6193c9d1a3b8.png) + +代码段 +![image-8.png](figures/f2721ffdf70f7502a38441f1cc8b75c2.png.webp) +![image-9.png](figures/2504a8545d09f5db418be764982a853b.png) + +> 1. 其中我们主要关注和使用较多的就是主存储0x0800 0000 - 0x083F FFFF和0x0BF4 0000 - 0x0BF7 FFFF ROM区间; +> 2. 根据芯片的引导配置章节可以看出,该芯片将Bootload、secure boot分别放在了ROM段0x0BF40000、0x0BF46000作为起始地址,本地代码一般放在了起始地址0x08000000的主存储区; + +### 3.3 USART 模块内部框图 + +![image-10.png](figures/a1c3ee0b386df6de09ca4f87e5ab2ce9.png.webp) + +1. 从模块内部框图可以看出,Uart的读写操作主要都是在读/写缓冲区完成,用户可以通过CPU在串口传输完成后直接读取读缓冲区的内容,或像写缓冲区写入数据,配置控制/状态寄存器及中断完成Uart的读写操作; +2. 从图中同样可以看到该芯片Uart支持DMA直接将缓冲区数据搬入/出; +3. 读写缓冲区分别对应Uart的数据接受/发送寄存器,同时FIFO的控制/状态获取,主要依赖于FIFO控制和状态寄存器; +4. 同时芯片支持硬件流控功能,可通过nCTS和nRTS引脚来实现。通过将USART_CTL2寄存器中RTSEN位置1来使能RTS流控,将USART_CTL2寄存器中CTSEN位置1来使能CTS流控。 + ![image-11.png](figures/2c45ddc9af8c456bac2e2e57ac54c957.png) +5. GD32vw553 引脚映射关系 + ![image-16.png](figures/2b1c66cf1644780bca0579f14f0bdc0e.png.webp) + +测试阶段暂时将PA2/3作为UART1的收发引脚,PA6/7作为UART2的收发引脚; + +## 4. UART功能调试 + +### 4.1 测试环境 + +1. Demo中仅使能了UART0一路串口,首先需要测试3路串口是否均可使用,可以在RTT的menuconfig中将UART1/2使能; +2. 使能后会出现宏定义相关的报错,此时需要修改drv_usart.c文件,由于GD32vw55x的另外两路都是UART,drv中写死的USART宏并不适用,临时改为UART1/UART2,重新编译可成功编译; + ![image-12.png](figures/b7c4f21f5ca03a65f468bd88a11fe554.png.webp) +3. 单步调试查看调用栈,可以发现在程序启动后会首先调用board.c中的rt_hw_board_init,另外在rt_hw_board_init中已经初始化了board.c UART数组中的所有串口,我们可以在后续直接测试UART1/2的功能; + ![image-13.png](figures/fb2a41f2ee8e91bc7e6e6012ae44a197.png) +4. RTT中main其实只是一个Task,并不像裸机开发那样时start.s跳转出的首个函数; + ![image-14.png](figures/40aa4e41c1e2b0743d35415980c25193.png) +5. 我们可以在main task中调用uart API发送/接收数据; + ![image-17.png](figures/3db3e50c8742f0688f84f7eccbc98096.png) + +### 4.2 测试代码 + +```c +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-06-04 BruceOu first implementation + * 2025-07-10 WangShun fix for GD32VW553H_EVAL + * 2026-01-21 HaitaoZhang fix for GD32VW553H_EVAL Uart1 and Uart2 + */ +#include +#include +#include +#include +/* LED1 pin: PA4 */ +#define LED1_PIN GET_PIN(A, 4) +/* Command termination character */ +#define DATA_CMD_END '\0' +/* Maximum length of a single data packet */ +#define ONE_DATA_MAXLEN 20 +/* Semaphore for UART1 receive synchronization */ +static struct rt_semaphore g_rx_sem_uart1; +/* Handle for UART1 device */ +static rt_device_t g_serial_uart1; +/* Function declarations for UART receive indication callbacks and data parsing */ +/* UART1 receive indication callback function */ +static rt_err_t uart1_recv_indication(rt_device_t dev, rt_size_t size); +/* UART2 receive indication callback function */ +static rt_err_t uart2_recv_indication(rt_device_t dev, rt_size_t size); +/* Data parsing thread function */ +static void data_parsing(void); +/** + * Main function - entry point of the application + * Initializes UART devices, configures LED, and runs the main loop + */ +int main(void) +{ + rt_device_t p_uart1_dev = RT_NULL; /* Handle for UART1 device */ + rt_device_t p_uart2_dev = RT_NULL; /* Handle for UART2 device */ + /* Find and initialize UART1 device */ + p_uart1_dev = rt_device_find("uart1"); + if (RT_NULL == p_uart1_dev) + { + rt_kprintf("uart1 not found\n"); + } + else + { + g_serial_uart1 = p_uart1_dev; /* Assign UART1 device handle to global variable */ + rt_sem_init(&g_rx_sem_uart1, "rx_sem", 0, RT_IPC_FLAG_FIFO); + rt_device_open(p_uart1_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_INT_RX); + rt_device_set_rx_indicate(p_uart1_dev, uart1_recv_indication); /* Set receive callback for UART1 */ + rt_device_write(p_uart1_dev, 0, "Hello, UART1!\n", 14); + } + /* Find and initialize UART2 device */ + p_uart2_dev = rt_device_find("uart2"); + if (RT_NULL == p_uart2_dev) + { + rt_kprintf("uart2 not found\n"); + } + else + { + rt_device_open(p_uart2_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_INT_RX); + rt_device_set_rx_indicate(p_uart2_dev, uart2_recv_indication); /* Set receive callback for UART2 */ + rt_device_write(p_uart2_dev, 0, "Hello, UART2!\n", 14); + } + /* Configure LED1 pin as output */ + rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); + rt_thread_t thread = rt_thread_create("serial", (void (*)(void *parameter))data_parsing, RT_NULL, 1024, 25, 10); + if (thread != RT_NULL) + { + rt_thread_startup(thread); + } + /* Main application loop - blink LED and send messages via UARTs */ + while (1) + { + uint8_t data[18]; + /* Toggle LED state with 500ms delay */ + rt_pin_write(LED1_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED1_PIN, PIN_LOW); + rt_thread_mdelay(500); + // /* Send identification messages to both UARTs */ + rt_device_write(p_uart1_dev, 0, "UART1: GD32VW553H\n", 19); + rt_device_write(p_uart2_dev, 0, "UART2: GD32VW553H\n", 19); + } + return RT_EOK; +} +/** + * UART1 receive indication callback function + * Called when UART1 receives data + * @param dev: pointer to the UART1 device + * @param size: size of received data + * @return RT_EOK on success + */ +static rt_err_t uart1_recv_indication(rt_device_t dev, rt_size_t size) +{ + if (size > 0) + { + rt_sem_release(&g_rx_sem_uart1); + } + return RT_EOK; +} +/** + * UART2 receive indication callback function + * Called when UART2 receives data + * @param dev: pointer to the UART2 device + * @param size: size of received data + * @return RT_EOK on success + */ +static rt_err_t uart2_recv_indication(rt_device_t dev, rt_size_t size) +{ + /* Print a message indicating UART2 has received data */ + rt_kprintf("uart2 recv data\n"); + return RT_EOK; +} +/* Data parsing thread function - handles received UART data */ +static void data_parsing(void) +{ + char ch; + char data[ONE_DATA_MAXLEN]; /* Buffer to store received data packet */ + static char i = 0; /* Index for data buffer */ + while (1) + { /* Infinite loop to continuously parse incoming data */ + /* Wait for data to be available in the UART receive buffer */ + while (rt_device_read(g_serial_uart1, 0, &ch, 1) == 0) + { + /* Reset semaphore and wait for indication from UART interrupt */ + rt_sem_control(&g_rx_sem_uart1, RT_IPC_CMD_RESET, RT_NULL); + rt_sem_take(&g_rx_sem_uart1, RT_WAITING_FOREVER); + } + /* Check if received character is command termination */ + /* Process command termination */ + if(ch == DATA_CMD_END) + { + data[i++] = '\0'; /* Null terminate the received data string */ + rt_kprintf("data=%s\r\n",data); /* Print received data */ + i = 0; /* Reset buffer index */ + continue; /* Continue to next iteration */ + } + /* Prevent buffer overflow by limiting index */ + i = (i >= ONE_DATA_MAXLEN-1) ? ONE_DATA_MAXLEN-1 : i; + data[i++] = ch; /* Store received character in buffer */ + } +} +``` + +### 4.3 Tx/Rx 功能测试结果 + +由下图可以看到UART1/2均可正常使用,且中断可被正常触发; +![image20.png](figures/c80409341b33be1bb75285b636fd6a87.png) +依然是上述代码,将Uart2的Tx接入Uart1的Rx,可以看到打印如下: +![image20.png](figures/c80409341b33be1bb75285b636fd6a87.png) +同理可测Uart2的接收功能; + +## 5. 原文链接 + +原文链接:[RT-Thread问答社区 -GD32vw53h 开发板(Uart功能)测评 - 完整版](https://club.rt-thread.org/ask/article/d27dbcb686e677a9.html) + +# 二、GD32VW553上的WDG实践(张国庆) + +[代码链接](https://github.com/RT-Thread/rt-thread/pull/11181) + +## 1. 背景介绍 + +1. GD32VW553系列双模无线MCU,主频可达160MHz,用了全新的开源指令集架构RISC-V处理器内核,是本土RISC-V IP厂商 NucleiSys N307内核, + + +- 支持Wi-Fi 6及Bluetooth LE 5.2无线连接, +- 集成了高达4MB Flash及320KB SRAM, +- 32KB可配置指令高速缓存(I-Cache),大幅提升了CPU处理效率。 +- 芯片还配置了丰富的通用有线接口,包含3个U(S)ART、2个I2C、1个SPI以及1个四线制QSPI等, 以及多达29个可编程 GPIO 管脚。内置2个32位通用定时器、2个16位通用定时器、4个16位基本定时器、1个PWM高级定时器和1个12位ADC。 +- 供电电压1.8V - 3.6V,并提供了85℃ - 105℃宽温选择,以满足工控互联、照明设备以及插座面板等高温场景应用所需。 +- 还配备了高级DSP硬件加速器、双精度浮点单元(FPU)以及指令扩展接口等资源,以出色的微架构设计实现了极佳的能效比,并提供了灵活的可扩展性 + +![screenshot_image-20260206225923094.png](figures/6272b9eb82e1e643d265f74bc497e794.png.webp) + +## 2. 环境搭建 + +分支更新,如果仓库上面没有GD32VW553系列文件夹,需要先pull一下,然后就可见了 + +![screenshot_image-20260203225726711.png](figures/14bf39bfdfe61b09eab93aa97c731b72.png) + +可以看到gd32vw553h-eval文件夹 + +![screenshot_image-20260203225800599.png](figures/6437e28f4dbbed7af5a1352f9af84ea9.png) + +pkgs —upgrade 运行失败(考虑更换成github网址即可) + +![screenshot_image-20260203230535946.png](figures/db0a30661db508031f25946724066b84.png) + +pkgs —update + +![screenshot_image-20260203231011691.png](figures/8401afe5435ae10e914e17655bec9f80.png) + +需要update pakage(env环境中的包) + +![screenshot_image-20260203233309724.png](figures/f29b117b0f658d7e8d53fcf7de7b1f74.png) + +然后成功pkgs —update + +![screenshot_image-20260203233339106.png](figures/d7278d9388ef91ce1f5de7ae4313b3a5.png) + +编译前需要设置riscv 工具链的环境变量 + +1. `set RTT_EXEC_PATH=D:\Software\RISCV-GCC\riscv-none-embed-gcc\bin` + +然后即可成功编译 + +![screenshot_image-20260203233620033.png](figures/b84ca96f375e2ed2d8d6ab3c37bbe042.png) + +### 2.1 GD Link烧录 + +与Jflash 烧录方式很相似, + +- 选择Target,然后Connect +- 选择bin文件,或者将bin文件拖到窗口 +- 点击Target下面的program即可烧录 +- 烧录完成下面即可看到 + +![screenshot_image-20260203233656722.png](figures/9ccf050ac7cf830af1d22a17a8e56d72.png) + +链接日志和烧录日志如下: + +```powershell +[23:27:41] Show initial information and software information here. +[23:28:07] Connected successfully! +[23:28:07] Getting option successfully! +[23:28:07] AA 0E 00 00 FF FF FF FF FF 03 00 00 FF 03 00 00 +[23:28:24] Please open the file to program first! +[23:28:37] DisConnected successfully! +[23:28:45] Connected successfully! +[23:28:45] Getting option successfully! +[23:28:45] AA 0E 00 00 FF FF FF FF FF 03 00 00 FF 03 00 00 +[23:35:18] Load File... +[23:35:21] Path of file opened:D:/Workspace/DesignProject/rt-thread/bsp/gd32/risc-v/gd32vw553h-eval/rtthread.bin +[23:35:21] Flash Type: Inner Flash; Checksum value is 0x72CF93 +[23:35:28] Starting programming: +[23:35:28] Erasing.... +[23:35:30] -----Erasing complete! +[23:35:30] Reset MCU.... +[23:35:30] -----Reset MCU complete! +[23:35:30] Downloading data.... +[23:35:34] -----Downloading data complete! +[23:35:34] Programming and Verification Successfully! +``` + +### 2.2 JTAG烧录 + +![screenshot_495687f855315033cb17256440ea6810.jpg](figures/aca15fbbbdd23250e189717bb9bbe1a3.jpg.webp) + +通过连接日志:可以看到采用的是NucleiSys N307 系列内核 + +```powershell +Connecting ... + - Connecting via USB to probe/ programmer device 0 + - Probe/ Programmer firmware: J-Link V11 compiled Apr 27 2041 16:36:21 + - Probe/ Programmer S/N: 50120677 + - Device "GD32VW553HMQ7" selected. + - Target interface speed: 4000 kHz (Fixed) + - VTarget = 3.270V + - InitTarget() start + - TotalIRLen = 10, IRPrint = 0x0021 + - JTAG chain detection found 2 devices: + - #0 Id: 0x10307A6D, IRLen: 05, NucleiSys N307 (RISC-V TAP) + - #1 Id: 0x790007A3, IRLen: 05, GD32 Boundary Scan + - InitTarget() end - Took 17.2ms + - TotalIRLen = 10, IRPrint = 0x0021 + - JTAG chain detection found 2 devices: + - #0 Id: 0x10307A6D, IRLen: 05, NucleiSys N307 (RISC-V TAP) + - #1 Id: 0x790007A3, IRLen: 05, GD32 Boundary Scan + - Assuming RISC-V TAP with DTM setup + - Debug architecture: + - RISC-V debug: 0.13 + - AddrBits: 7 + - DataBits: 32 + - IdleClks: 7 + - Memory access: + - Via system bus: Yes (8/16/32-bit accesses are supported) + - Via ProgBuf: Yes (2 ProgBuf entries) + - Via abstract command (AAM): May be tried as last resort + - DataBuf: 4 entries + - autoexec[0] implemented: Yes + - Detected: RV32 core + - RISC-V: The connected J-Link (S/N 50120677) uses an old firmware module V0 with known problems / limitations. + - Temp. halting CPU for for feature detection... + - HW instruction/data BPs: 8 + - Support set/clr BPs while running: No + - HW data BPs trigger before execution of inst + - CSR access via abs. commands: Yes + - Compressed instruction support: Yes + - Feature detection done. Restarting core... + - BG memory access support: Via SBA + - Executing init sequence ... + - Initialized successfully + - Target interface speed: 4000 kHz (Fixed) + - Found 2 JTAG devices. Core ID: 0x10307A6D (None) + - Connected successfully +WARNING: Supply voltage too low or too high, disconnecting target! VTarget = 0.000V +``` + +烧录过程 + +![screenshot_image-20260203234556249.png](figures/695345267a02e7ff295bb69240260a58.png) + +```powershell +Programming target (66964 bytes, 1 range) ... + - Connecting ... + - Connected successfully + - Checking if selected data fits into selected flash sectors. + - Start of determining flash info (Bank 0 @ 0x08000000) + - End of determining flash info + - Flash bank info: + - 1024 * 4 KB @ 0x08000000 + - Start of preparing flash programming + - End of preparing flash programming + - Start of determining dirty areas in flash cache + - End of determining dirty areas + - CPU speed could not be measured. + - Start of flash programming + - Programming range 0x08000000 - 0x08007FFF ( 8 Sectors, 32 KB) + - Programming range 0x08008000 - 0x0800FFFF ( 8 Sectors, 32 KB) + - Programming range 0x08010000 - 0x08010FFF ( 1 Sector, 4 KB) + - End of flash programming + - Flash programming performed for 1 range (69632 bytes) + - 0x8000000 - 0x8010FFF ( 17 Sectors, 68 KB) + - Start of restoring + - End of restoring + - Target programmed successfully - Completed after 3.494 sec +``` + +![screenshot_image-20260203235651972.png](figures/7f27229bc27e8e19809bc815edd57a17.png) + +## 3. WDGT功能介绍 + +分为free watch dog timer和window watch dog timer + +FWDG功能介绍如下 + +- 时钟输入IRC,32KHZ +- 分频系统,4/8/16等 +- 12 Bit 向下计数器, 递减到0之后则会产生复位, +- 更新重加载寄存器数据,则会更新到counter,后续依次递减。 + +![screenshot_image-20260205225804787.png](figures/70833d5a2747b0f114266f9c0d897102.png.webp) + +根据时钟频率和分频系数,可以得到如下的超时时间 + +- 举例介绍:32K时钟频率,分频32,则分频后时钟1KHZ,Counter计数器12bit,最大4095,所以最大计数4095ms。 + +![screenshot_image-20260205225832304.png](figures/ec5e10216037e11f3526d086f50cb325.png.webp) + +WWDG功能介绍如下 + +- 时钟来源PCLK,且经过4096分频,然后可以再进行分频1/2/4/8 +- 其计数器为7Bit,向下计数器,如果计数到0x3F,则引起reset +- 可设置窗口阈值,计数器大于窗口阈值时,更新计数器会产生reset + +![screenshot_image-20260205225905514.png](figures/df19f64e00736ff166240a0ff8622932.png.webp) + +具体的Reset的框图如下: + +- 第一次复位时因为递减计数到0x3F, +- 第二次复位时没有在窗口期内更新Count。 +- 第一次write CNT在WIN值之下,即不会引起复位 + +![screenshot_image-20260205225957753.png](figures/2e2fa63a798502a036262cda175291b9.png.webp) + +超时时间如下 + +![screenshot_image-20260205230033939.png](figures/9c7423647e81e63fdad12a02c76c02b6.png.webp) + +## 4. 使用说明 + +首先由于KConfig里面没有WDT菜单,因此需要增加WDT菜单 + +```kotlin + menuconfig BSP_USING_WDT + bool "Enable WDT" + default n + select RT_USING_WDT + if BSP_USING_WDT + config BSP_USING_FWDT + bool "Enable FWDT" + default y + config BSP_USING_WWDT + bool "Enable WWDT" + default n + endif +``` + +之后可以通过菜单去选择WDT,选择完成之后,可以增加相应的宏,从开开启相关功能 + +第一步选择 Hardware Drivers Config + +![screenshot_image-20260203234721844.png](figures/761f2d1e6cf36ba89bcd2b491a84c18d.png) + +第二步选择 On-chip Peripheral Drivers + +![screenshot_image-20260203234751566.png](figures/2b8ab9ba225ef429a80a00d1b81c2c2b.png) + +第三步 Enable WDT + +![screenshot_image-20260206224139040.png](figures/e94f976992de94a77a4f7f8c28e3fe16.png) + +开启WWDT测试 + +![screenshot_image-20260206224203748.png](figures/9cf7586693b0254ca48b81d48796bdd3.png) + +同时使能日志 + +![screenshot_image-20260204232906040.png](figures/48306cfa0a6fcb23a953305ea078e365.png)) + +正常WDT驱动代码如下 + +- 区分FWDT和WWDT +- 通过宏可以配置使能哪种看门狗 +- 不可同时使能,同时使能则只能使用FWDT +- 驱动代码相对简单,流程如下:配置分频值,使能看门狗,喂狗。 + +```c +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-02-04 Yixizhang first version + */ +#include +#include +#ifdef RT_USING_WDT +#if defined(BSP_USING_FWDT) + #define HW_WDGT_DEV_NAME "fwdgt" +#elif defined(BSP_USING_WWDT) + #define HW_WDGT_DEV_NAME "wwdgt" +#endif +#define DBG_TAG "wdt" +#define DBG_LVL DBG_LOG +#include +struct gd32_wdt_obj +{ + rt_watchdog_t watchdog; + rt_uint16_t is_start; +}; +static struct gd32_wdt_obj gd32_wdt; +static struct rt_watchdog_ops ops; +static rt_err_t wdt_init(rt_watchdog_t *wdt) +{ + LOG_D("wdt init success."); + return RT_EOK; +} +static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg) +{ + rt_uint32_t time_sec; + rt_uint32_t time_msec; + rt_uint32_t wdgt_count; + rt_uint32_t window_value; + switch (cmd) + { + /* feed the watchdog */ + case RT_DEVICE_CTRL_WDT_KEEPALIVE: +#if defined(BSP_USING_FWDT) + fwdgt_counter_reload(); +#elif defined(BSP_USING_WWDT) + wwdgt_counter_update(0x70); + LOG_D("wdt update success."); +#endif + break; + case RT_DEVICE_CTRL_WDT_SET_TIMEOUT: +#if defined(BSP_USING_FWDT) + /* set timeout sec*/ + time_sec = *(rt_uint32_t*)arg; + wdgt_count = 32*1000/32*time_sec; + ErrStatus res = fwdgt_prescaler_value_config(FWDGT_PSC_DIV32); + res = fwdgt_reload_value_config(wdgt_count); + LOG_D("timeout=%d sec,count=%d res=%d ", time_sec, wdgt_count, res); +#elif defined(BSP_USING_WWDT) + /* set timeout ms */ + window_value = 0x7F; + time_msec = *(rt_uint32_t*)arg; + wdgt_count = (rt_uint32_t)((float)((float)1/0.78)*time_msec) + 0x3F; + wwdgt_config(wdgt_count, window_value, WWDGT_CFG_PSC_DIV8); + LOG_D("timeout=%d msec,count=%d ", time_msec, wdgt_count); +#endif + break; + case RT_DEVICE_CTRL_WDT_START: +#if defined(BSP_USING_FWDT) + fwdgt_enable(); +#elif defined(BSP_USING_WWDT) + wwdgt_enable(); +#endif + LOG_D("wdt control enable success."); + break; + default: + LOG_W("This command is not supported."); + return -RT_ERROR; + } + return RT_EOK; +} +int rt_wdt_init(void) +{ + rcu_periph_clock_enable(RCU_WWDGT); + gd32_wdt.is_start = 0; + ops.init = &wdt_init; + ops.control = &wdt_control; + gd32_wdt.watchdog.ops = &ops; + /* register watchdog device */ + if (rt_hw_watchdog_register(&gd32_wdt.watchdog, HW_WDGT_DEV_NAME, RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK) + { + LOG_E("wdt device register failed."); + return -RT_ERROR; + } + LOG_D(" wdt device register success."); + return RT_EOK; +} +INIT_BOARD_EXPORT(rt_wdt_init); +``` + +FWDT功能测试 + +- free wdgt 时钟频率为32K,分频32之后,时钟为1KHZ,设置4s超时,Counter为4000 +- 间隔4s左右,没有喂狗,会复位 + +```c +int fwdt_test_sample() +{ + rt_err_t ret = RT_EOK; + rt_device_t hw_dev = RT_NULL; + rt_ubase_t time_out_sec = 4; + hw_dev = rt_device_find(HW_WDGT_DEV_NAME); + LOG_D("find fwdt device success,device=%x",hw_dev); + if (hw_dev == RT_NULL) + { + LOG_D("hwtimer sample run failed! can't find %s device!", HW_WDGT_DEV_NAME); + return -RT_ERROR; + } + ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); + LOG_D("open fwdt device success"); + if (ret != RT_EOK) + { + LOG_D("open %s device failed!", HW_WDGT_DEV_NAME); + return ret; + } + ret = rt_device_control(hw_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &time_out_sec); + if (ret != RT_EOK) + { + LOG_D("control %s device failed!", HW_WDGT_DEV_NAME); + return ret; + } + rt_device_control(hw_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL); + rt_device_control(hw_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL); +} +MSH_CMD_EXPORT(fwdt_test_sample, fwdt timeout 4 sec reset) +``` + +![screenshot_image-20260206224851355.png](figures/ff92c43805221610d23492b3d1556a69.png) + +日志记录如下:有时间戳 + +![screenshot_image-20260206225002437.png](figures/7f293851892852025cc131e6662493a2.png) + +WWDT功能测试 + +- 其时钟频率较大,则计数值小,复位时间更加精准 +- 测试40ms复位 + +```c +int wwdt_test_sample() +{ + rt_err_t ret = RT_EOK; + rt_device_t hw_dev = RT_NULL; + rt_ubase_t time_out_msec = 40; + hw_dev = rt_device_find(HW_WDGT_DEV_NAME); + LOG_D("find wwdt device success,device=%x",hw_dev); + if (hw_dev == RT_NULL) + { + LOG_D("hwtimer sample run failed! can't find %s device!", HW_WDGT_DEV_NAME); + return -RT_ERROR; + } + ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); + LOG_D("open wwdt device success"); + if (ret != RT_EOK) + { + LOG_D("open %s device failed!", HW_WDGT_DEV_NAME); + return ret; + } + ret = rt_device_control(hw_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &time_out_msec); + if (ret != RT_EOK) + { + LOG_D("control %s device failed!", HW_WDGT_DEV_NAME); + return ret; + } + rt_device_control(hw_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL); + rt_device_control(hw_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL); +} +MSH_CMD_EXPORT(wwdt_test_sample, wwdt timeout 40 msec reset) +``` + +测试结果如下: + +![screenshot_image-20260206225213117.png](figures/9556167785e92bd2fbfb45e09546afe4.png) + +如果正常时间内喂狗,则不会复位。 + +![screenshot_image-20260206003919907.png](figures/cd13938857bcbbaabd80e7bd71820468.png) + +## 5. 心得体会 + +- 通过这次GD32 RISC-V开发板的评估,我熟悉新增RTT menuconfig的配置,进一步深入了RTT外设的driver编写 +- GD32 GD32VW553H_EVAL评估板相当不错,窗口看门狗的时效性很高, +- 同时也发现了其FWDT的一个问题,在配置完reload值之后,即可更新FWDT_CTL无效,还是从最大0xFFF递减,只有过了一段时间再reload,才可以正常,这个需要找GD32的技术支持问一下 +- switch case里面不能定义变量,这个RISC-V编译器的参数支持的C语言版本也太老了吧 + +![screenshot_image-20260205020502007.png](figures/c8dbdeabe2d9e4e0a759e68a61db07b4.png.webp) + +![screenshot_image-20260205012459023.png](figures/d1b77bd12591468e4e76f034190508b0.png) + +## 6. 原文链接 + +原文链接:[RT-Thread问答社区 -RT-Thread 基于 GD32VW553H_EVAL 的WDT 功能实践指南](https://club.rt-thread.org/ask/article/ed704e84606461fc.html) + +# 三、GD32VW553上的I2C实践(yefeng&曹显嵩) + +## 1. 前言 + +几天前从RT-Thread公众号留意到兆易创新和RT-Thread合作在做一款GD32VW553的开发板评测活动,于是在兆易创新官网查了一下GD32VW553这个系列的芯片功能,是一颗基于risc-v内核的无线Soc微控制器,有wifi和蓝牙通讯功能。之前一直使用ARM内核的产品,就申请一个评测机会,感谢兆易创新和RT-Thread提供的评测开发板。 +评测项目分模块进行,我选择了硬件i2c功能,看看gd32vw553这个系列芯片的i2c功能是否好用。 + +## 2. 硬件介绍 + +I2C概念就不多做介绍啦,做嵌入式开发的小伙伴都不陌生,专门处理板上芯片级短距离通讯一种总线。不了解i2c总线的可以看看文末链接“I2C-bus specification and user manual” + +### 2.1 I2C外设模块数量 + +从数据手册设备信息可以看到GD32VW553全系列都提供了2个I2C外设,都挂在了APB1总线上面。虽然I2C外设是一种总线设备,可以在一条总线挂很多器件,但为了通讯的及时性和干扰问题,I2C外设越多越好,但2路基本能适应和满足大多数传感器及其他小型显示器使用场景。 +![screenshot_image.png](figures/37fb8e5cfc5b505bb8fb8d87845ceee5.png.webp) +![screenshot_image.png](figures/0c9d63122b9330dd9c028afb8b85b56b.png.webp) + +### 2.2 I2C外设功能介绍 + +GD32VW553系列的i2c功能还是非常全面的,通讯速率支持(100K,400K,1M),主从支持,批量数据搬运(DMA),唤醒,硬件校验(PEC)这些常用的功能都是支持的,在适配i2c驱动的时候发现有一个重载模式(reload),这个非常好用,可以连续传输超过255字节的数据。 + +### 2.3 基本功能 + +- 支持7位和10位地址,支持广播 +- 支持主机、从机功能 +- 支持标准(100KHz)、快速(400Khz)、高速(1MHz)通讯速率 +- 支持DMA功能 +- 兼容SMBus 3.0 +- 支持睡眠模式唤醒 +- 支持PEC校验 + +### 2.4 方框图 + + +![screenshot_image.png](figures/e97290b2e4d2fa41b5b115a1f91852cf.png.webp) + +## 3. 使用说明 + +### 3.1 硬件使用介绍 + +GD32VW553H-EVAL开发板上面板载了一颗EEPROM 24C02存储芯片,从原理图看挂在I2C0引脚(PA2,PA3)上面。如下图所示: +![screenshot_image.png](figures/75a7e8461fa99fa8f89db061ff3e9a58.png.webp) +![screenshot_image.png](figures/07138723bfdb3a430fd4854ed9a64fa6.png.webp) + +### 3.2 配置rt-thread的I2C驱动 + +- 使用文件资源管理器,进入目录`rt-thread\bsp\gd32\risc-v\gd32vw553h-eval`,在目录空白处点击右键选择`ConEmu Here`,打开rt-thread的env环境命令行。 + ![screenshot_image.png](figures/2dd7a381ca55a74110218785bfa5ffe4.png.webp) + ![screenshot_image.png](figures/e1ac5210caab2e43d3c3bd2b4eacf083.png.webp) + +- 使用`pkgs --update`命令下载gd32vw553的标准驱动库,在当前目录下的`\packages\gd32-riscv-series-latest`会下载好gd32vw553的标准驱动库文件 + ![screenshot_image.png](figures/61953894d0cee584a729601bccadf5fd.png.webp) + ![screenshot_image.png](figures/8088df36acfb1f853a6f0d50c1e03842.png.webp) + +- 输入`menuconfig`命令并按回车,进入配置rt-thread配置界面,通过光标控制箭头、Enter、ESC、空格等按键选择i2c0驱动和i2c0引脚】、 + + ```c + Hardware Drivers Config ---> + On-chip Peripheral Drivers ---> + Enable Hardware I2C ---> + Enable Hardware I2C0 + Select I2C0 pins (SCL=PA2, SDA=PA3) ---> + (100) I2C0 clock frequency(KHz) + ``` + +![screenshot_image.png](figures/b49af3b61050adf7c38fc01bc50a49c5.png.webp) + +**提醒:退出时记得保存config** + +- 输入`scons`编译,然后下载(下载方法参考文末【环境搭建】),连接串口终端,输入`list device`查看设备列表 + +![screenshot_image.png](figures/e5e6573278a61f0403152f02ccc8f0d2.png.webp) + +## 4. 功能演示 + +### 4.1 板载EEPROM测试 + +- 通过menuconfig配置,下载支持包at24cxxx库文件,此库文件提供了at24cxx 系列 EEPROM 基本功能 + +```c +菜单路径: +RT-Thread online packages-> + peripheral libraries and drivers-> + at24cxx: eeprom at24cxx driver library. ---> +``` + +![screenshot_image.png](figures/a8a88b48541281670f4fd49ca0b5b5a6.png.webp) + +- ENV环境使用`pkgs --update`命令下载eeprom库文件![screenshot_image.png](figures/b1a2fcb58435f471e46543b22cf10fd0.png.webp) + +- 找到eeprom库文件里面的`at24cxx.c`文件,在里面定义`PKG_AT24CXX_FINSH`宏开启串口终端的eeprom操作命令 + +![screenshot_image.png](figures/90a8fdac25794797a4561553fa31f769.png.webp) + +- 使用`scons`命令编译、下载,打开串口终端,输入Tab键并按回车查看支持的命令列表,已经出现at24cxx的测试命令 + +![screenshot_image.png](figures/0c2f93f91eba087228535d813321a6e8.png.webp) + +- 输入`at24cxx`并按回车,会列出使用方法 + +![screenshot_image.png](figures/698b3864dc275476621fbf1e30aace74.png.webp) + +- `at24cxx probe ` 使用指定的i2c设备名称初始化at24cxx设备 + 例如:`at24cxx probe i2c0` + `at24cxx write` 对at24cxx设备进行写操作 + `at24cxx read` 对at24cxx设备进行读操作 + +![screenshot_image.png](figures/21db7b08c91dadd856d45ad1e2a70312.png.webp) + +### 4.2 SSD1306 OLED显示屏测试 + +- 通过menuconfig配置,下载支持包ssd1306 oled显示屏库文件,此库文件提供了对SSD1306 OLED显示屏的测试和控制API功能 + + ```c# + RT-Thread online packages-> + peripheral libraries and drivers-> + ssd1306: OLEDs based on SSD1306, SH1106, SH1107 and SSD1309 driver ---> + ``` + +![screenshot_image.png](figures/05995f75c40d2d2d353869c21e43a5ee.png.webp) + +设备名使用`i2c0`,并开启示例`ssd1306 sample` + +![screenshot_image.png](figures/18ae7c6366d647cc8e63ab50edf1d8ae.png) + +- ENV环境使用`pkgs --update`命令下载SSD1306 OLED的库文件 + +![screenshot_image.png](figures/60c737333fe65844f23150c640bb7701.png) + +说明:如果更新不成功,可以取消上面的at24cxx库,询问是否删除的时候选择“Y”,再重新更新一次就能成功 + +- 使用`scons`命令编译、下载,打开串口终端,输入`Tab`键并按回车查看支持的命令列表,已经出现ssd1306 oled的测试命令 + +![screenshot_image.png](figures/b550bcdeda27dff9814df98f06296316.png.webp) + +- 输入测试命令`ssd1306_TestAll`就能完成i2c驱动ssd1306显示屏的测试 + +![screenshot_image.png](figures/e64d8183984d8c36791548fde8dbcd61.png.webp) + +![screenshot_image.png](figures/03e47ae64556315ff2b7e12978d36031.png.webp) + +Blibli视频链接: +[【使用gd32vw553开发板驱动SSD1306显示屏示例-哔哩哔哩】](https://b23.tv/yXc7MlA "【使用gd32vw553开发板驱动SSD1306显示屏示例-哔哩哔哩】") + +## 5. 代码 + +[https://gitee.com/nes6502/practice-of-i2c-on-gd32vw55x](https://gitee.com/nes6502/practice-of-i2c-on-gd32vw55x) + +## 6. 心得体会 + +1. 无论是主机发送还是从机接收都必须先配置地址和传输方向,再开启START条件(从机地址会自动发送)。 +2. Reload模式可以一次传输无限长度的数据,不用重复产生START条件,无论读、写连续的大量数据块都很方便。 +3. 传输数据超过255字节时,要启用Reload模式,reload模式的配置必须在传输字节配置之后配置,否则传输完成后状态异常。 +4. 手册中I2C1时钟配置不明确,从 datasheet和参考手册中只看到I2C0的时钟源选择,I2C1未提及,但是从方框图看到I2C0和I2C1都是挂在外设1总线上,实测I2C1时钟是来自APB1的时钟源。 + +![screenshot_image.png](figures/7960566c9bb5b95e8ccb31902c8e2b82.png.webp) + +## 7. 其他链接 + +1. I2C-bus specification and user manual + [https://www.nxp.com/docs/en/user-guide/UM10204.pdf](https://www.nxp.com/docs/en/user-guide/UM10204.pdf) +2. GD32VW553官方资料下载: + [https://www.gigadevice.com.cn/product/mcu/wireless-mcus/gd32vw553-series](https://www.gigadevice.com.cn/product/mcu/wireless-mcus/gd32vw553-series) +3. 环境搭建 + [https://github.com/RT-Thread/rt-thread/tree/master/bsp/gd32/risc-v/gd32vw553h-eval](https://github.com/RT-Thread/rt-thread/tree/master/bsp/gd32/risc-v/gd32vw553h-eval) + +(—END—) + +## 8. 原文链接 + +原文链接:[RT-Thread问答社区 -RT-Thread 基于 【开发板评测】GD32VW55x上的I2C实践](https://club.rt-thread.org/ask/article/128fb1b9d55d206b.html) + +其它链接(曹显嵩):[RT-Thread问答社区 -RT-Thread 基于 【开发板评测】【GD32VW553】 at24c02外设使用介绍](https://club.rt-thread.org/ask/article/4a487b18a6b9b170.html) + +# 四、GD32VW553上的TIM实践(车佳&张海良) + +## 1. 概述 + +🟢本驱动已经过测试MCU所有的定时器,TIM0、TIM1、TIM2、TIM5、TIM15、TIM16,全部工作正常 +🟢官方的RTT内核移植存在问题,原因是中断嵌套导致,解决办法有2种,一种是不开启中断抢占(推荐),另一种就是不使用中断向量表,所有的中断使用同一个入口地址 + +* * * + +1. 驱动代码 + [https://gitee.com/chejia12/gd32-vw553](https://gitee.com/chejia12/gd32-vw553) +2. 嵌套问题 + [GD32VW553中断嵌套的问题](https://club.rt-thread.org/ask/article/0008e46a76f5d5d7.html) + +## 2. 驱动的应用开发 + +硬件定时器一般有 2 种工作模式,定时器模式和计数器模式,**我们这里需要实现定时器的定时功能** + +**定时器模式:**对内部脉冲信号计数。 + +定时器设备2层框架框架内部会**自动处理硬件定时器超时的问题** + +### 2.1 APP-API + +应用程序通过 RT-Thread 提供的 I/O 设备管理接口来访问硬件定时器设备,相关接口如下所示: + +| **函数** | **描述** | +| ----------------------------------- | ------------------------------------------------------------ | +| rt_device_find() | 查找定时器设备 | +| rt_device_open() | 以读写方式打开定时器设备 | +| rt_device_set_rx_indicate() | 设置超时回调函数 | +| rt_device_control() | 控制定时器设备,可以设置定时模式(单次/周期)/计数频率,或者停止定时器 | +| rt_device_write() | 设置定时器超时值,定时器随即启动 | +| rt_device_read() | 获取定时器当前值 | +| rt_device_close() | 关闭定时器设备 | + +### 2.2 控制定时器设备 + +通过命令控制字,应用程序可以对硬件定时器设备进行配置,通过如下函数完成; + +1. `rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg);` + +| **参数** | **描述** | +| -------------- | ------------------ | +| dev | 设备句柄 | +| cmd | 命令控制字 | +| arg | 控制的参数 | +| **返回** | —— | +| RT_EOK | 函数执行成功 | +| -RT_ENOSYS | 执行失败,dev 为空 | +| 其他错误码 | 执行失败 | + +硬件定时器设备支持的命令控制字如下所示: + +**这里重要了解定时器的设置的是频率,不是周期** + +| **控制字** | **描述** | +| --------------------------- | ------------------------------------------------------------ | +| HWTIMER_CTRL_FREQ_SET | **设置计数频率**(若未设置该项,默认为1Mhz 或 支持的最小计数频率) | +| HWTIMER_CTRL_STOP | 停止定时器 | +| HWTIMER_CTRL_INFO_GET | 获取定时器特征信息 | +| HWTIMER_CTRL_MODE_SET | 设置定时器模式**单次 周期性(**若未设置,默认是HWTIMER_MODE_ONESHOT) | + +### 2.3 APP示例代码 + +示例代码的主要步骤如下: + +1. 首先根据定时器设备名称 “timer0” 查找设备获取设备句柄。 + +2. 以读写方式打开设备 “timer0” 。 + +3. 设置定时器超时回调函数。 + +4. 设置定时器模式为周期性定时器,并设置超时时间为 5 秒,此时定时器启动。 + +5. 延时 3500ms 后读取定时器时间,读取到的值会以秒和微秒的形式显示。 + + ```c + /* + * 程序清单:这是一个 hwtimer 设备使用例程 + * 例程导出了 hwtimer_sample 命令到控制终端 + * 命令调用格式:hwtimer_sample + * 程序功能:硬件定时器超时回调函数周期性的打印当前tick值,2次tick值之差换算为时间等同于定时时间值。 + */ + #include + #include + #define HWTIMER_DEV_NAME "timer0" /* 定时器名称 */ + /* 定时器超时回调函数 */ + static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) + { + rt_kprintf("this is hwtimer timeout callback function!\n"); + rt_kprintf("tick is :%d !\n", rt_tick_get()); + return 0; + } + static int hwtimer_sample(int argc, char *argv[]) + { + rt_err_t ret = RT_EOK; + rt_hwtimerval_t timeout_s; /* 定时器超时值 */ + rt_device_t hw_dev = RT_NULL; /* 定时器设备句柄 */ + rt_hwtimer_mode_t mode; /* 定时器模式 */ + rt_uint32_t freq = 10000; /* 计数频率 */ + /* 查找定时器设备 */ + hw_dev = rt_device_find(HWTIMER_DEV_NAME); + if (hw_dev == RT_NULL) + { + rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + return RT_ERROR; + } + /* 以读写方式打开设备 */ + ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); + if (ret != RT_EOK) + { + rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + return ret; + } + /* 设置超时回调函数 */ + rt_device_set_rx_indicate(hw_dev, timeout_cb); + /* 设置计数频率(若未设置该项,默认为1Mhz 或 支持的最小计数频率) */ + rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq); + /* 设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)*/ + mode = HWTIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + if (ret != RT_EOK) + { + rt_kprintf("set mode failed! ret is :%d\n", ret); + return ret; + } + /* 设置定时器超时值为5s并启动定时器 */ + timeout_s.sec = 5; /* 秒 */ + timeout_s.usec = 0; /* 微秒 */ + if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) + { + rt_kprintf("set timeout value failed\n"); + return RT_ERROR; + } + /* 延时3500ms */ + rt_thread_mdelay(3500); + /* 读取定时器当前值 */ + rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); + rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec); + return ret; + } + /* 导出到 msh 命令列表中 */ + MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); + ``` + + + +## 3. 定时器驱动框架学习 + +### 3.1 数据结构 + +#### 3.1.1 时间结构 + +这个结构用于框架层和app层的时间定义与驱动无关 + +```c +/* Time Value */ +typedef struct rt_hwtimerval +{ + rt_int32_t sec; /* 秒second */ + rt_int32_t usec; /* 微秒 microsecond */ +} rt_hwtimerval_t; +``` + +#### 3.2 定时器的结构特点定义 + +```c +/* Timer Feature Information */ +struct rt_hwtimer_info +{ + rt_int32_t maxfreq; /*最大的工作频率 the maximum count frequency timer support */ + rt_int32_t minfreq; /*最小工作频率 the minimum count frequency timer support */ + rt_uint32_t maxcnt; /* 最大计数counter maximum value */ + rt_uint8_t cntmode; /* 工作模式(向上/向下)count mode (inc/dec) */ +}; +``` + +#### 3.3 定时器驱动接口 + +这个接口很重要,一款新的芯片需要实现这写接口函数 + +```c +struct rt_hwtimer_ops +{ + void (*init)(struct rt_hwtimer_device *timer, rt_uint32_t state); + rt_err_t (*start)(struct rt_hwtimer_device *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode); + void (*stop)(struct rt_hwtimer_device *timer); + rt_uint32_t (*count_get)(struct rt_hwtimer_device *timer); + rt_err_t (*control)(struct rt_hwtimer_device *timer, rt_uint32_t cmd, void *args); +}; +``` + +#### 3.4 定时器数据结构 + +```c +typedef struct rt_hwtimer_device +{ + struct rt_device parent; + const struct rt_hwtimer_ops *ops; + const struct rt_hwtimer_info *info; + rt_int32_t freq; /* 用户设置工作频率counting frequency set by the user */ + rt_int32_t overflow; /* 定时器溢出timer overflows */ + float period_sec; + rt_int32_t cycles; /* 溢出计数,重载值how many times will generate a timeout event after overflow */ + rt_int32_t reload; /*循环周期 reload cycles(using in period mode) */ + rt_hwtimer_mode_t mode; /*单次/周期模式 timing mode(oneshot/period) */ +} rt_hwtimer_t; +``` + +### 3.2 枚举 + +与控制相关的指令枚举 + +```c +typedef enum +{ + HWTIMER_CTRL_FREQ_SET = RT_DEVICE_CTRL_BASE(Timer) + 0x01, /* 1.设置定时器工作频率set the count frequency */ + HWTIMER_CTRL_STOP = RT_DEVICE_CTRL_BASE(Timer) + 0x02, /* 2.停止定时器stop timer */ + HWTIMER_CTRL_INFO_GET = RT_DEVICE_CTRL_BASE(Timer) + 0x03, /* 3.获取定时器的一些特征信息get a timer feature information */ + HWTIMER_CTRL_MODE_SET = RT_DEVICE_CTRL_BASE(Timer) + 0x04 /* 4.设置定时器的工作模式 Setting the timing mode(oneshot/period) */ +} rt_hwtimer_ctrl_t; +``` + +工作模式枚举: + +```c +/* Timing Mode */ +typedef enum +{ + HWTIMER_MODE_ONESHOT = 0x01,/*单次模式*/ + HWTIMER_MODE_PERIOD/*周期模式*/ +} rt_hwtimer_mode_t; +``` + +### 3.3 API + +注册一个定时器,这个api用于注册一个新的定时器设备到设备驱动框架中 + +```c +/** + * @brief 注册一个硬件定时器驱动 + * + * @param timer 注册定时句柄 + * @param name 定时器名称 + * @param user_data 用户数据 + * @return rt_err_t + */ +rt_err_t rt_device_hwtimer_register(rt_hwtimer_t *timer, const char *name, void *user_data); +``` + +## 4. 设计基于GD32VW553的驱动框架 + +关于芯片的定时器 + +![screenshot_image.png](figures/8c22b5927e85cb15839271ffca40365d.png.webp) + +根据硬件添加定时器配置 + +> board\\Kconfig + +```kotlin +menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + config BSP_USING_TIM0 + bool "Enable TIM0" + default n + config BSP_USING_TIM1 + bool "Enable TIM1" + default n + config BSP_USING_TIM2 + bool "Enable TIM2" + default n + config BSP_USING_TIM5 + bool "Enable TIM5" + default n + config BSP_USING_TIM15 + bool "Enable TIM15" + default n + config BSP_USING_TIM16 + bool "Enable TIM16" + default n + endif +``` + +![screenshot_image.png](figures/06256cd5abc41b834ecb3df50802bd88.png.webp) + +> menuconfig + +![screenshot_image.png](figures/017076ab25361ccc52a2f58ed329a745.png.webp) +时钟树 + +![screenshot_image.png](figures/ae07f3deb1cece85540e96de9e537572.png.webp) + +创建一个定时器驱动文件 + +> libraries\\gd32_drivers\\SConscript + +将文件添加到构建系统中(官方bsp已经添加了) + +> libraries\\gd32_drivers\\SConscript + +```c +# add timer drivers. +if GetDepend('RT_USING_HWTIMER'): + src += ['drv_hwtimer.c'] +``` + +使能rtt自带的日志调试,方便调试 + +![screenshot_image.png](figures/7a77083455db1c15a383f2acbd6a38a3.png.webp) + +## 5. 硬件定时器的驱动设计 + +### 5.1 驱动代码 + +> libraries\\gd32_drivers\\drv_hwtimer.c + +```c +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026/01/19 1085582540@qq.com first version + */ +#include +#ifdef BSP_USING_TIM +#define DBG_LEVEL DBG_LOG +#define LOG_TAG "drv.tim" +#include +#include +#include +#define TIMER_INPUT_CLOCK (160 * 1000 * 1000) +#ifndef TIM_DEV_INFO_CONFIG +#define TIM_DEV_INFO_CONFIG \ + { \ + .maxfreq = 10*1000*1000, \ + .minfreq = 1000, \ + .maxcnt = 0xFFFF, \ + .cntmode = HWTIMER_CNTMODE_UP, \ + } +#endif /* TIM_DEV_INFO_CONFIG */ +enum +{ +#ifdef BSP_USING_TIM0 + TIM0_INDEX, +#endif +#ifdef BSP_USING_TIM1 + TIM1_INDEX, +#endif +#ifdef BSP_USING_TIM2 + TIM2_INDEX, +#endif +#ifdef BSP_USING_TIM5 + TIM5_INDEX, +#endif +#ifdef BSP_USING_TIM15 + TIM15_INDEX, +#endif +#ifdef BSP_USING_TIM16 + TIM16_INDEX, +#endif +}; +struct gd32vw5_hwtimer +{ + rt_hwtimer_t time_device;//timer object + uint32_t timer_periph; // timer base address + IRQn_Type irq;//time irq + char *name;//timer name +}; +static struct gd32vw5_hwtimer gd32vw5_hwtimer_obj[] = + { +#ifdef BSP_USING_TIM0 + { + .timer_periph = TIMER0, + .irq = TIMER0_UP_IRQn, + .name = "tim0", + }, +#endif +#ifdef BSP_USING_TIM1 + { + .timer_periph = TIMER1, + .irq = TIMER1_IRQn, + .name = "tim1", + }, +#endif +#ifdef BSP_USING_TIM2 + { + .timer_periph = TIMER2, + .irq = TIMER2_IRQn, + .name = "tim2", + }, +#endif +#ifdef BSP_USING_TIM5 + { + .timer_periph = TIMER5, + .irq = TIMER5_IRQn, + .name = "tim5", + }, +#endif +#ifdef BSP_USING_TIM15 + { + .timer_periph = TIMER15, + .irq = TIMER15_IRQn, + .name = "tim15", + }, +#endif +#ifdef BSP_USING_TIM16 + { + .timer_periph = TIMER16, + .irq = TIMER16_IRQn, + .name = "tim16", + }, +#endif +}; +/** + * @brief enable timer clock + * + * @param htim_base + */ +static void gd32vw5_tim_enable_clock(uint32_t timer_periph) +{ + // set timer clock source prescaler + rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4); + // enable timer rcc + if (timer_periph == TIMER0) + { + rcu_periph_clock_enable(RCU_TIMER0); + } + else if (timer_periph == TIMER1) + { + rcu_periph_clock_enable(RCU_TIMER1); + } + else if (timer_periph == TIMER2) + { + rcu_periph_clock_enable(RCU_TIMER2); + } + else if (timer_periph == TIMER5) + { + rcu_periph_clock_enable(RCU_TIMER5); + } + else if (timer_periph == TIMER15) + { + rcu_periph_clock_enable(RCU_TIMER15); + } + else if (timer_periph == TIMER16) + { + rcu_periph_clock_enable(RCU_TIMER16); + } +} +/** + * @brief nvic enable + * + * @param gdhwtimer + */ +static void enable_nvic_group(const struct gd32vw5_hwtimer *gdhwtimer) +{ + eclic_irq_disable(gdhwtimer->irq); +} +/** + * @brief init timer + * 1.set default period and prescaler + * 2.enable timer update interrupt + * + * @param timer + * @param state + */ +static void gd_timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +{ + uint32_t prescaler_value = 0; + timer_parameter_struct timer_initpara; + const struct gd32vw5_hwtimer *gdhwtimer = RT_NULL; + gdhwtimer = rt_container_of(timer, struct gd32vw5_hwtimer, time_device); // 得到定时器的对象 + RT_ASSERT(gdhwtimer); + LOG_I("%s init", gdhwtimer->name); + if (state) + { + //enable clk + gd32vw5_tim_enable_clock(gdhwtimer->timer_periph); + //restore timer + timer_deinit(gdhwtimer->timer_periph); + enable_nvic_group(gdhwtimer); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER2 configuration */ + timer_initpara.prescaler = TIMER_INPUT_CLOCK / 10000 - 1; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 10000 - 1; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_init(gdhwtimer->timer_periph, &timer_initpara); + /* clear update interrupt bit */ + timer_interrupt_flag_clear(gdhwtimer->timer_periph, TIMER_INT_FLAG_UP); + /* enable the TIMER update interrupt */ + timer_interrupt_enable(gdhwtimer->timer_periph, TIMER_INT_UP); + // if(gdhwtimer->timer_periph == TIMER0) + // { + // timer_auto_reload_shadow_enable(TIMER0); + // } + /* disable a TIMER */ + timer_disable(gdhwtimer->timer_periph); + } + else + { + timer_deinit(gdhwtimer->timer_periph); + timer_disable(gdhwtimer->timer_periph); + } +} +/** + * @brief enable timer + * 1.clean counter + * 2.set period + * 3.timer enable + * 3.timer interrupt enable + * @param timer + * @param t + * @param opmode + * @return rt_err_t + */ +static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode) +{ + rt_err_t result = RT_EOK; + RT_ASSERT(timer != RT_NULL); + const struct gd32vw5_hwtimer *gdhwtimer = RT_NULL; + gdhwtimer = rt_container_of(timer, struct gd32vw5_hwtimer, time_device); // 得到定时器的对象 + RT_ASSERT(gdhwtimer); + timer_autoreload_value_config(gdhwtimer->timer_periph, cnt - 1); + timer_counter_value_config(gdhwtimer->timer_periph, 0); + timer_enable(gdhwtimer->timer_periph); + eclic_irq_enable(gdhwtimer->irq, 0, 1); + LOG_I("TIM start period: %d prescaler: %d", cnt, 1 + timer_prescaler_read(gdhwtimer->timer_periph)); + return result; +} +/** + * @brief stop timer + * 1.close timer + * 2.disable interrupt + * 3.clean time counter + * @param timer + */ +static void timer_stop(rt_hwtimer_t *timer) +{ + RT_ASSERT(timer != RT_NULL); + const struct gd32vw5_hwtimer *gdhwtimer = RT_NULL; + gdhwtimer = rt_container_of(timer, struct gd32vw5_hwtimer, time_device); // 得到定时器的对象 + RT_ASSERT(gdhwtimer); + LOG_I("%s stop", gdhwtimer->name); + timer_disable(gdhwtimer->timer_periph); + eclic_irq_disable(gdhwtimer->irq); + timer_counter_value_config(gdhwtimer->timer_periph, 0); +} +/** + * @brief hwtimer_control + * 1.repair the timer prescaler + * @param timer + * @param cmd + * @param arg + * @return rt_err_t + */ +static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +{ + rt_err_t result = -RT_ERROR; + rt_uint32_t freq = 0; + rt_uint32_t prescaler_value = 0; + RT_ASSERT(timer != RT_NULL); + const struct gd32vw5_hwtimer *gdhwtimer = RT_NULL; + gdhwtimer = rt_container_of(timer, struct gd32vw5_hwtimer, time_device); // get timer object + RT_ASSERT(gdhwtimer); + RT_ASSERT(arg != RT_NULL); + switch (cmd) + { + case HWTIMER_CTRL_FREQ_SET: + { + /* set timer frequency */ + freq = *((rt_uint32_t *)arg); + /*set prescaler*/ + timer_prescaler_config(gdhwtimer->timer_periph, TIMER_INPUT_CLOCK / freq - 1, TIMER_PSC_RELOAD_NOW); + LOG_I("freq :%d; prescaler: %d", freq, TIMER_INPUT_CLOCK / freq); + result = RT_EOK; + } + break; + default: + { + result = -RT_EINVAL; + } + break; + } + return result; +} +/** + * @brief get timer counter + * + * @param timer:handler + * @return rt_uint32_t return cnt value + */ +static rt_uint32_t gd_timer_counter_get(rt_hwtimer_t *timer) +{ + rt_uint32_t cnt; + RT_ASSERT(timer != RT_NULL); + const struct gd32vw5_hwtimer *gdhwtimer = RT_NULL; + gdhwtimer = rt_container_of(timer, struct gd32vw5_hwtimer, time_device); // 得到定时器的对象 + RT_ASSERT(gdhwtimer); + LOG_I("%s init", gdhwtimer->name); + cnt = timer_counter_read(gdhwtimer->timer_periph); + return cnt; +} +static const struct rt_hwtimer_info _info = TIM_DEV_INFO_CONFIG; +static const struct rt_hwtimer_ops _ops = + { + .init = gd_timer_init, + .start = timer_start, + .stop = timer_stop, + .count_get = gd_timer_counter_get, + .control = timer_ctrl, +}; +/** + * @brief gd32vw5 time isr + * + * @param gdhwtimer handler + */ +void gd32_timer_isr(struct gd32vw5_hwtimer *gdhwtimer) +{ + if (SET == timer_interrupt_flag_get(gdhwtimer->timer_periph, TIMER_INT_UP)) + { + /* clear channel 0 interrupt bit */ + timer_interrupt_flag_clear(gdhwtimer->timer_periph, TIMER_INT_UP); + rt_device_hwtimer_isr(&gdhwtimer->time_device); + } +} +#ifdef BSP_USING_TIM0 +void TIMER0_UP_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + gd32_timer_isr(gd32vw5_hwtimer_obj + TIM0_INDEX); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM1 +void TIMER1_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + gd32_timer_isr(gd32vw5_hwtimer_obj + TIM1_INDEX); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM2 +void TIMER2_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + gd32_timer_isr(gd32vw5_hwtimer_obj + TIM2_INDEX); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM5 +void TIMER5_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + gd32_timer_isr(gd32vw5_hwtimer_obj + TIM5_INDEX); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM15 +void TIMER15_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + gd32_timer_isr(gd32vw5_hwtimer_obj + TIM15_INDEX); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM16 +void TIMER16_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + gd32_timer_isr(gd32vw5_hwtimer_obj + TIM16_INDEX); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +/** + * @brief register hwtimer + * + * @return int RT_EOK: register ok;-RT_ERROR:-RT_ERROR fail + */ +static int gd32vw5_hwtimer_init(void) +{ + int i = 0; + int result = RT_EOK; + for (i = 0; i < sizeof(gd32vw5_hwtimer_obj) / sizeof(gd32vw5_hwtimer_obj[0]); i++) + { + gd32vw5_hwtimer_obj[i].time_device.info = &_info; + gd32vw5_hwtimer_obj[i].time_device.ops = &_ops; + if (rt_device_hwtimer_register(&gd32vw5_hwtimer_obj[i].time_device, + gd32vw5_hwtimer_obj[i].name, gd32vw5_hwtimer_obj + i) == RT_EOK) + { + LOG_D("%s register success", gd32vw5_hwtimer_obj[i].name); + } + else + { + LOG_E("%s register failed", gd32vw5_hwtimer_obj[i].name); + result = -RT_ERROR; + } + } + return result; +} +INIT_BOARD_EXPORT(gd32vw5_hwtimer_init); +#endif /* BSP_USING_TIM */ +``` + +测试代码 + +```c +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-06-04 BruceOu first implementation + * 2025-07-10 WangShun fix for GD32VW553H_EVAL + */ +#include +#include +#include +#include +#include +/* LED1 ~ LED3 pin: PA4 PA5 PA6 */ +#define LED1_PIN GET_PIN(A, 4) + uint32_t cnt = 0; +// 全局信号量 +static rt_mailbox_t box=0; +rt_timer_t tim=0; +#include +#include +#define HWTIMER_DEV_NAME "tim2" /* 定时器名称 */ +/* 定时器超时回调函数 */ +static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) +{ + // rt_kprintf("this is hwtimer timeout callback function!\n"); + rt_base_t tick= rt_tick_get(); + if(box) + { + rt_mb_send(box, tick); + } + return 0; +} +void timeout(void*param) +{ + rt_base_t tick= rt_tick_get(); + rt_mb_send(box, tick); +} +int main(void) +{ + rt_kprintf("Hello GD32VW553H\n"); + LOG_I("APB1 =%d APB2 =%d",rcu_clock_freq_get(CK_APB1),rcu_clock_freq_get(CK_APB2)); + // 初始化 + box =rt_mb_create("mb",5,RT_IPC_FLAG_FIFO); + tim=rt_timer_create("tim",timeout,RT_NULL,50,RT_TIMER_FLAG_PERIODIC|RT_TIMER_FLAG_HARD_TIMER); + RT_ASSERT(box); + RT_ASSERT(tim); + // rt_timer_start(tim); + /* set LED1 pin mode to output */ + rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); + rt_base_t last = 0; + rt_base_t tick = 0; + while (1) + { + if (RT_EOK == rt_mb_recv(box, &tick,RT_WAITING_FOREVER)) // ✅ 在线程中等待) + { + rt_kprintf("tick is :%d cnt %d!\n", tick - last,cnt); + last = tick; + } + // rt_thread_mdelay(1000); + // printf("tick %d \n",rt_tick_get()); + } + return RT_EOK; +} +/* + * 程序清单:这是一个 hwtimer 设备使用例程 + * 例程导出了 hwtimer_sample 命令到控制终端 + * 命令调用格式:hwtimer_sample + * 程序功能:硬件定时器超时回调函数周期性的打印当前tick值,2次tick值之差换算为时间等同于定时时间值。 + */ +static int hwtimer_sample(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + rt_hwtimerval_t timeout_s; /* 定时器超时值 */ + rt_device_t hw_dev = RT_NULL; /* 定时器设备句柄 */ + rt_hwtimer_mode_t mode; /* 定时器模式 */ + rt_uint32_t freq = 10000; /* 计数频率 */ + /* 查找定时器设备 */ + hw_dev = rt_device_find(HWTIMER_DEV_NAME); + if (hw_dev == RT_NULL) + { + rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + return RT_ERROR; + } + /* 以读写方式打开设备 */ + ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); + if (ret != RT_EOK) + { + rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + return ret; + } + /* 设置超时回调函数 */ + rt_device_set_rx_indicate(hw_dev, timeout_cb); + /* 设置计数频率(若未设置该项,默认为1Mhz 或 支持的最小计数频率) */ + // rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq); + /* 设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)*/ + mode = HWTIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + if (ret != RT_EOK) + { + rt_kprintf("set mode failed! ret is :%d\n", ret); + return ret; + } + /* 设置定时器超时值为5s并启动定时器 */ + timeout_s.sec = 0; /* 秒 */ + timeout_s.usec = 50000; /* 微秒 */ + if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) + { + rt_kprintf("set timeout value failed\n"); + return RT_ERROR; + } + /* 延时3500ms */ + rt_thread_mdelay(3500); + /* 读取定时器当前值 */ + rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); + rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec); + return ret; +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); +``` + +### 5.2 测试结果 + +![screenshot_image.png](figures/5ff551fa7757ccce3c9e9cacc6936e25.png.webp) + +## 6. 原文链接 + +原文链接:[RT-Thread问答社区 -RT-Thread GD32VW553硬件定时器驱动设计](https://club.rt-thread.org/ask/article/0e4c0e549bf6bd34.html) + +其它链接(张海良):[RT-Thread问答社区 -RT-Thread 【开发板评测】GD32VW553上的HWTIMER实践](https://club.rt-thread.org/ask/article/453454b9c7d32b59.html) + +# 五、GD32VW553上的PWM实践(吴艺彬) + +## 1. PWM 简介 + +PWM(Pulse Width Modulation)通过在固定周期内调整高电平持续时间来改变占空比,常用于电机调速、LED 亮度控制、音频与电源控制等场景。 + +## 2. 准备工作 + +搭建rt-thread的编程环境,可以参考 +[https://club.rt-thread.org/ask/article/dd4b615adc409793.html](https://club.rt-thread.org/ask/article/dd4b615adc409793.html) + +GD32VW553H-EVAL的环境搭建参对应目录下面的readme文件。 + +## 3. 使能PWM + +打开ENV menuconfig 进入板载外设使能PWM + +![image-20260206182907236](figures/202602061831043.png) + +## 4. 输出引脚 + +可以在drv_pwm.c中查看具体的引脚,当然也可以通过官方手册PWM输出通道对应的GPIO修改下面的引脚映射 + +![image-20260206182447798](figures/202602061831045.png) + +## 5. 使用方法(MSH 命令) + +本文的测试输出引脚为PA9。 + +以下命令在板端串口 `msh` 终端执行: + +1. 探测 PWM 设备 + `pwm probe pwm0` +2. 设置通道 1 的周期与脉宽 + `pwm set 1 50000 25000` + 说明:单位为纳秒,周期 50000 ns(50 us)对应 20 kHz;脉宽 25000 ns 占空比约 50%。 +3. 使能 PWM 输出 + `pwm enable 1` +4. 停止 PWM 输出 + `pwm disable 1` + +## 6. 使用方法(RT-Thread API) + +示例代码如下: + +```c +/* + * 程序清单:这是一个 PWM 设备使用例程 + * 例程导出了 pwm_led_sample 命令到控制终端 + * 命令调用格式:pwm_led_sample + * 程序功能:通过 PWM 设备控制 LED 灯的亮度,可以看到LED不停的由暗变到亮,然后又从亮变到暗。 + */ + +#include +#include + +#define PWM_DEV_NAME "pwm0" /* PWM设备名称 */ +#define PWM_DEV_CHANNEL 1 /* PWM通道 */ + +struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */ + +static int pwm_led_sample(int argc, char *argv[]) +{ + rt_uint32_t period, pulse, dir; + + period = 500000; /* 周期为0.5ms,单位为纳秒ns */ + dir = 1; /* PWM脉冲宽度值的增减方向 */ + pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */ + + /* 查找设备 */ + pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME); + if (pwm_dev == RT_NULL) + { + rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME); + return RT_ERROR; + } + + /* 设置PWM周期和脉冲宽度默认值 */ + rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); + /* 使能设备 */ + rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL); + + while (1) + { + rt_thread_mdelay(50); + if (dir) + { + pulse += 5000; /* 从0值开始每次增加5000ns */ + } + else + { + pulse -= 5000; /* 从最大值开始每次减少5000ns */ + } + if (pulse >= period) + { + dir = 0; + } + if (0 == pulse) + { + dir = 1; + } + + /* 设置PWM周期和脉冲宽度 */ + rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); + } +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(pwm_led_sample, pwm sample); +``` + +## 7. 测试结果 + +![msh](figures/202602061831046.png) + +![波形](figures/202602061831047.png) + +## 8. 结论 + +GD32VW553H-EVAL 的 PWM 驱动在 RT-Thread 下工作稳定,使用 MSH 命令即可完成快速验证,API 调用也很直接。配置周期与脉宽后,输出频率与占空比与设定一致,适合作为电机控制、调光与定时输出的基础功能 + +## 9. 原文链接 + +原文链接:[RT-Thread问答社区 -RT-Thread GD32VW553H-EVAL PWM 测评报告](https://club.rt-thread.org/ask/article/d84d06b332d8debd.html) + +# 六、GD32VW553上的SPI实践(李金磊) + +## 1. 序章 + +2025年年底,报名了RTT公众号上GD和RTT合作的一款GD32VW553开发板的评测活动,怀着试试看的心理随便报名了一下,结果令人惊讶的是,居然真的入围了本次测评活动!本人之前一直使用的是ARM核芯片,包含A核和M核。评测活动一如既往的按模块进行,我选择了硬件SPI功能,连接了一块TFT-LCD屏幕,想来看看GD32VW553这个无线系列芯片的SPI功能是否强大好用。最后,感谢GD和RTT提供的评测开发板。 + +## 2. 硬件介绍 + +### 2.1 开发板介绍 + +![实物图.PNG](figures/70775bd960ba804dc7749cb843d5f106.png.webp) +GD32VW553H-EVAL 评估板使用 GD32VW553H 作为主控制器。评估板使用GD-Link Mini USB接口提供5V电源。提供包括扩展引脚在内的以及 Reset,Boot,Tamper/Wakeup KEY,LED,ADC,I2C,SPI_LCD, IFRP,USART 转 USB 接口等外设资源。 + +### 2.2 芯片介绍 + +GD32VW553系列是兆易创新推出的支持Wi-Fi 6及BLE 5.2无线连接的无线系列MCU,集成的2.4GHz Wi-Fi 6射频模块采用IEEE 802.11ax标准,并向下兼容IEEE 802.11b/g/n标准,可以适用于不同的网络环境。片上集成的Bluetooth LE 5.2射频模块,能够以最新的蓝牙规范延长通信距离、提高吞吐量、增强安全性和节省电能。面向实时处理和高效通信需求,GD32VW553系列MCU采用了全新的开源指令集架构RISC-V处理器内核,主频可达160MHz。集成了高达4MB Flash及320KB SRAM,另有32KB可配置指令高速缓存(I-Cache),大幅提升了CPU处理效率。不仅具备出色的无线性能,芯片还配置了丰富的通用有线接口。GD32VW553还具备多重安全特性以简化高性能无线设备的安全连接和管理,从而进一步提升系统安全强度。供电电压1.8V~3.6V,并提供了85℃~105℃宽温选择,以满足工控互联、照明设备以及插座面板等高温场景应用所需。 +由此可见,该芯片的性能还是非常强大的,足以满足各类无线应用。 +兆易创新提供免费的GD32VW55x系列Wi-Fi&BLE SDK软件开发框架,配套GD32 Embedded Builder图形化工具,支持可视化配置和代码生成。该SDK集成RTOS、硬件驱动、网络协议栈及主流物联网通信协议,并提供丰富的API文档和应用笔记,可显著提升开发效率,确保开发者能够轻松构建高性能、低功耗的无线连接应用。 +![芯片外设表.PNG](figures/66db69f87f662fdef77b28dd46072ec6.png.webp) + +### 2.3 SPI接口介绍 + +SPI是串行外设接口的缩写,是一种高速的,全双工,同步的通信总线。由于SPI高速和同步的特性,使其成为嵌入式系统和小型设备中使用最广泛的几种通信接口之一。 +SPI接口通常由一个主设备(Master)和一个或多个从设备(Slave)组成。主设备控制通信的时序和数据传输,而从设备根据主设备的指令进行响应。SPI通信基于全双工传输方式,主设备和从设备可以同时发送和接收数据。 +SPI通信中的数据传输通过四根线实现: +SCLK(Serial Clock):时钟线,由主设备产生,并控制数据的传输速度。不同的设备支持的最 +高时钟频率不同,两个设备之间通讯时,通讯速率受限于低速设备。 +MOSI(Master Output Slave Input):主设备输出线,负责将数据从主设备发送到从设备。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。 +MISO(Master Input Slave Output):主设备输入线,负责将数据从从设备发送到主设备。 +SS(Slave Select):从设备选择线,用于选择特定的从设备与主设备进行通信。当有多个从设备时,上面的三条线是共同使用的,而 NSS 则是用来区分多个不同的设备,当主机需要选择某个从设备时,使用 NSS 信号线来寻址,把该从设备的 NSS 信号线设置为低电平,则该从设备被选择,片选有效,然后主机与被选择的从设备开始通讯。 +![时钟图.JPG](figures/a5e6c36fb20a7d3108be0eb7d76865a6.jpg) +![SPI个数.JPG](figures/b41197cf9e1d1fbcb23e846fcd3a98b8.jpg) +从数据手册设备信息可以看到GD32VW553全系列只有提供1个SPI外设,挂在了APB2总线上面。SPI外设最大速率为40MHz,可以满足大部分需求。 +![SPI框图.PNG](figures/94149ad140104595de97d5aa5abddb30.png) +芯片SPI基本功能 +◼ 具有全双工、半双工和单工模式的主从操作; +◼ 16位宽度,独立的发送和接收缓冲区; +◼ 8位或16位数据帧格式; +◼ 低位在前或高位在前的数据位顺序; +◼ 软件和硬件NSS管理; +◼ 硬件CRC计算、发送和校验; +◼ 发送和接收支持DMA模式; +◼ 支持SPI TI模式; +SPI外设功能总结 +GD32VW553系列的SPI功能还是非常全面的,通讯速率最大40M,主从都支持,批量数据搬运(DMA),唤醒,硬件校验(CRC)这些常用的功能都是支持的。 + +### 2.4 SPI TFT LCD模块介绍 + +ILI9341是一款分辨率为240x320分辨率的a-TFT液晶显示单片SOC驱动,由720通道源驱动、320通道门驱动、172800字节GRAM (240RGBx320点位图形显示数据)和电源电路组成。 +ILI9341支持并行8-/9-/16-/18位数据总线MCU接口,6-/16-/18位数据总线RGB接口和3 /4线串行外围接口SPI通讯。通过窗口地址函数可以在内部GRAM中指定运动图像的区域。 +开发板上使用SPI接口与LCD模块通信。 +![LCD引脚.PNG](figures/b9075e7ad62ff14df073d31ea71482f8.png) + +## 3. 使用说明 + +### 3.1 硬件原理图 + +GD32VW553H-EVAL开发板上面板载了一块2.2寸TFT显示屏。如下图所示: +![LCD原理图.PNG](figures/93e732cbfb800047c29534e1e8f9121e.png) + +### 3.2 配置rt-thread的SPI驱动 + +使用文件资源管理器,进入目录rt-thread\\bsp\\gd32\\risc-v\\gd32vw553h-eval,在目录空白处点击右键选择ConEmu Here,打开rt-thread的env环境命令行。 +![ENV.PNG](figures/6c1a776c140a421d445d4d64379e0de8.png.webp) +使用pkgs —update命令下载gd32vw553的标准驱动库,在当前目录下的\\packages\\gd32-riscv-series-latest会下载好gd32vw553的标准驱动库文件。 +![Update.PNG](figures/8994905f6bcd1324abd9c0c2c5e83d10.png.webp) +![驱动文件夹.PNG](figures/6e083f589ca0b393668b72f5ecfe4dc7.png) +输入menuconfig命令并按回车,进入配置rt-thread配置界面,通过光标控制箭头、Enter、ESC、空格等按键选择使能SPI。 + +1. `Hardware Drivers Config --->` +2. `On-chip Peripheral Drivers --->` +3. `Enable SPI Bus --->` +4. `Enable SPI0 Bus` + +![menuconfig配置.PNG](figures/e1f843b8f5c07fc81280f3826d0dd1df.png) +![menuconfig配置2.PNG](figures/595b4ea3b9f2c808f8867992b98a440b.png) +退出时按Y即可保存config +然后输入scons编译,然后使用串口下载,然后连接串口终端,输入list device查看设备列表 +![器件表.PNG](figures/2c613bd066041d569a76f61b81f423cd.png) + +### 3.3 编写LCD驱动 + +下面将通过修改GD原厂DEMO例程的方式来实现点屏 +新建BSP文件夹,里面新增bsp_lcd.c和bsp_lcd.h +代码如下: + +```c +#include "bsp_lcd.h" +_lcd_dev lcddev; +static struct rt_spi_device *lcd_dev; +static void Lcd_reset(void) +{ + LCD_RST_CLR; + DELAY(100); + LCD_RST_SET; + DELAY(50); +} +static void Lcd_wr_reg(uint8_t reg) +{ + LCD_DC_CLR; + rt_spi_send(lcd_dev, ®, 1); + LCD_DC_SET; +} +static void Lcd_wr_data(uint8_t data) +{ + rt_spi_send(lcd_dev, &data, 1); +} +static void Lcd_wr_data_16bit(uint16_t data) +{ + uint8_t buf[2]; + buf[0] = data >> 8; + buf[1] = data & 0xff; + Lcd_wr_data(buf[0]); + Lcd_wr_data(buf[1]); +} +void Lcd_setwindows(uint16_t xStar, uint16_t yStar, uint16_t xEnd, uint16_t yEnd) +{ + LCD_CS_CLR; + /* write the register address 0x2A */ + Lcd_wr_reg(0x2A); + Lcd_wr_data_16bit(xStar); + Lcd_wr_data_16bit(xEnd); + /* write the register address 0x2B */ + Lcd_wr_reg(0x2B); + Lcd_wr_data_16bit(yStar); + Lcd_wr_data_16bit(yEnd); + /* write the register address 0x2C */ + Lcd_wr_reg(0x2C); + LCD_CS_SET; +} +void Lcd_clear(uint16_t Color) +{ + unsigned int i, m; + uint8_t* buf = (uint8_t*)rt_malloc(80); + struct rt_spi_message msg; + for (i = 0; i < 40; i++) + { + buf[2 * i] = Color >> 8; + buf[2 * i + 1] = Color & 0xff; + } + Lcd_setwindows(0, 0, lcddev.width - 1, lcddev.height - 1); + LCD_DC_SET; + LCD_CS_CLR; + for (i = 0; i < lcddev.height; i++) + { + for (m = 0; m < lcddev.width;) + { + m += 40; + msg.send_buf = buf; + msg.recv_buf = RT_NULL; + msg.length = 80; + msg.cs_take = 0; + msg.cs_release = 0; + msg.next = 0; + rt_spi_transfer_message(lcd_dev, &msg); + } + } + LCD_CS_SET; + rt_free(buf); +} +void lcd_fill_array_spi(uint16_t Xstart, uint16_t Ystart, uint16_t Xend, uint16_t Yend, void *Image) +{ + rt_uint32_t size = 0; + size = (Xend - Xstart + 1) * (Yend - Ystart + 1) * 2; + Lcd_setwindows(Xstart, Ystart, Xend, Yend); + LCD_DC_SET; + rt_spi_send(lcd_dev, Image, size); +} +static void Lcd_cmd_init(void) +{ + LCD_CS_CLR; + Lcd_reset(); + /* write the register address 0xCB */ + Lcd_wr_reg(0xCB); + Lcd_wr_data(0x39); + Lcd_wr_data(0x2C); + Lcd_wr_data(0x00); + Lcd_wr_data(0x34); + Lcd_wr_data(0x02); + /* write the register address 0xCF */ + Lcd_wr_reg(0xCF); + Lcd_wr_data(0x00); + Lcd_wr_data(0XC1); + Lcd_wr_data(0X30); + /* write the register address 0xE8 */ + Lcd_wr_reg(0xE8); + Lcd_wr_data(0x85); + Lcd_wr_data(0x00); + Lcd_wr_data(0x78); + /* write the register address 0xEA */ + Lcd_wr_reg(0xEA); + Lcd_wr_data(0x00); + Lcd_wr_data(0x00); + /* write the register address 0xED */ + Lcd_wr_reg(0xED); + Lcd_wr_data(0x64); + Lcd_wr_data(0x03); + Lcd_wr_data(0X12); + Lcd_wr_data(0X81); + /* write the register address 0xF7 */ + Lcd_wr_reg(0xF7); + Lcd_wr_data(0x20); + /* power control VRH[5:0] */ + Lcd_wr_reg(0xC0); + Lcd_wr_data(0x23); + /* power control SAP[2:0];BT[3:0] */ + Lcd_wr_reg(0xC1); + Lcd_wr_data(0x10); + /* vcm control */ + Lcd_wr_reg(0xC5); + Lcd_wr_data(0x3e); + Lcd_wr_data(0x28); + /* vcm control2 */ + Lcd_wr_reg(0xC7); + Lcd_wr_data(0x86); + Lcd_wr_reg(0x36); + Lcd_wr_data(0x48); + /* write the register address 0x3A */ + Lcd_wr_reg(0x3A); + Lcd_wr_data(0x55); + /* write the register address 0xB1 */ + Lcd_wr_reg(0xB1); + Lcd_wr_data(0x00); + Lcd_wr_data(0x18); + /* display function control */ + Lcd_wr_reg(0xB6); + Lcd_wr_data(0x08); + Lcd_wr_data(0x82); + Lcd_wr_data(0x27); + /* 3gamma function disable */ + Lcd_wr_reg(0xF2); + Lcd_wr_data(0x00); + /* gamma curve selected */ + Lcd_wr_reg(0x26); + Lcd_wr_data(0x01); + /* set gamma */ + Lcd_wr_reg(0xE0); + Lcd_wr_data(0x0F); + Lcd_wr_data(0x31); + Lcd_wr_data(0x2B); + Lcd_wr_data(0x0C); + Lcd_wr_data(0x0E); + Lcd_wr_data(0x08); + Lcd_wr_data(0x4E); + Lcd_wr_data(0xF1); + Lcd_wr_data(0x37); + Lcd_wr_data(0x07); + Lcd_wr_data(0x10); + Lcd_wr_data(0x03); + Lcd_wr_data(0x0E); + Lcd_wr_data(0x09); + Lcd_wr_data(0x00); + /* set gamma */ + Lcd_wr_reg(0XE1); + Lcd_wr_data(0x00); + Lcd_wr_data(0x0E); + Lcd_wr_data(0x14); + Lcd_wr_data(0x03); + Lcd_wr_data(0x11); + Lcd_wr_data(0x07); + Lcd_wr_data(0x31); + Lcd_wr_data(0xC1); + Lcd_wr_data(0x48); + Lcd_wr_data(0x08); + Lcd_wr_data(0x0F); + Lcd_wr_data(0x0C); + Lcd_wr_data(0x31); + Lcd_wr_data(0x36); + Lcd_wr_data(0x0F); + /* exit sleep */ + Lcd_wr_reg(0x11); + DELAY(120); + /* display on */ + Lcd_wr_reg(0x29); + Lcd_wr_reg(0x2c); + LCD_CS_SET; +} +static void Lcd_pin_init(void) +{ + rt_pin_mode(LCD_DC_PIN, PIN_MODE_OUTPUT); + rt_pin_mode(LCD_RES_PIN, PIN_MODE_OUTPUT); + rt_pin_mode(LCD_CS_PIN, PIN_MODE_OUTPUT); +} +static void Lcd_init(void) +{ + Lcd_pin_init(); + lcddev.width=LCD_WIDTH; + lcddev.height=LCD_HEIGHT; + Lcd_reset(); /* LCD Hardware Reset */ + DELAY(120); /* Delay 120ms */ + Lcd_cmd_init(); /* lcd init */ +} +rt_err_t spi_device_attach(const char *bus_name, const char *device_name, rt_base_t cs_pin) +{ + RT_ASSERT(bus_name != RT_NULL); + RT_ASSERT(device_name != RT_NULL); + rt_err_t result = RT_EOK; + struct rt_spi_device *spi_device; + /* attach the device to spi bus*/ + spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device)); + RT_ASSERT(spi_device != RT_NULL); + result = rt_spi_bus_attach_device_cspin(spi_device, device_name, bus_name, cs_pin, RT_NULL); + if (RT_EOK != result) + { + LOG_E("%s attach to %s failed, %d\n", device_name, bus_name, result); + } + else + { + LOG_I("%s attach to %s done", device_name, bus_name); + } + return result; +} +rt_err_t spi_lcd_init(uint32_t freq) +{ + rt_err_t res = RT_EOK; + spi_device_attach(LCD_SPI_BUS_NAME, LCD_SPI_DEVICE_NAME, LCD_CS_PIN); + lcd_dev = (struct rt_spi_device *)rt_device_find(LCD_SPI_DEVICE_NAME); + if (lcd_dev != RT_NULL) + { + struct rt_spi_configuration spi_config; + spi_config.data_width = 8; + spi_config.max_hz = freq * 1000 * 1000; + spi_config.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; + rt_spi_configure(lcd_dev, &spi_config); + } + else + { + res = -RT_ERROR; + } + Lcd_init(); + Lcd_clear(WHITE); + return res; +} +``` + + + +### 3.4 编写测试代码 + +在main.c中添加测试代码,如下: + +```c +static uint16_t color_array[] = +{ + WHITE, BLACK, BLUE, BRED, + GRED, GBLUE, RED, YELLOW +}; +static int lcd_spi_test(void) +{ + uint8_t index = 0; + for (index = 0; index < sizeof(color_array) / sizeof(color_array[0]); index++) + { + Lcd_clear(color_array[index]); + LOG_I("lcd clear color: %#x", color_array[index]); + DELAY(200); + } + return RT_EOK; +} +MSH_CMD_EXPORT(lcd_spi_test, lcd will fill color => you need init lcd first); +``` + +然后使用scons命令编译、下载,打开串口终端,输入Tab键并按回车查看支持的命令列表,已经出现lcd的测试命令 +![命令.PNG](figures/ef2453c175fd3f0b6c0c2df4781ede26.png) +这样就可以执行刷屏测试。 + +### 3.5 代码链接 + +[https://gitee.com/GrandTopAlfa/gd32-vw553h-spi-lcd/tree/master/](https://gitee.com/GrandTopAlfa/gd32-vw553h-spi-lcd/tree/master/) + +### 3.6 Bilibili视频链接 + +[https://www.bilibili.com/video/BV1bPFQzrEpz](https://www.bilibili.com/video/BV1bPFQzrEpz) + +## 4. 测评体会 + +1.起初不知道TFT驱动芯片的型号,在官方文档里面没有查到这方面信息,花费了点时间查询后,发现应该是ILI9341驱动芯片。官方可以在开发板资料中添加一下这方面的信息。 +2.编写LCD驱动时,刷屏操作需要注意代码的执行效率,才能正常刷新屏幕,否则刷屏速度会非常慢。 + +## 5. 参考资料链接 + +GD32VW553官方资料下载: +[https://www.gigadevice.com.cn/product/mcu/wireless-mcus/gd32vw553-series](https://www.gigadevice.com.cn/product/mcu/wireless-mcus/gd32vw553-series) +环境搭建: +[https://github.com/RT-Thread/rt-thread/tree/master/bsp/gd32/risc-v/gd32vw553h-eval](https://github.com/RT-Thread/rt-thread/tree/master/bsp/gd32/risc-v/gd32vw553h-eval) +RTT SPI驱动参考: +[https://bbs.eeworld.com.cn/thread-1247691-1-1.html](https://bbs.eeworld.com.cn/thread-1247691-1-1.html) + +## 6. 原文链接 + +原文链接:[RT-Thread问答社区 -RT-Thread GD32VW553H-EVAL SPI+LCD 测评](https://club.rt-thread.org/ask/article/05e6ab3f27bf430d.html) + +# 七、GD32VW553上的WIFI实践(吴艺彬) + +## 1. WIFI使用 + +使用ENV,menuconfig,修改和使能下面的配置 + +### 1.1 修改 RT_NAME_MAX为24 + +![GD32VW553-EVAL](figures/image-20260205145545039.png) + + + +### 1.2 使能 BSP_USING_WLAN + +![GD32VW553-EVAL](figures/BSP_USING_WLAN.png) + +### 1.3 修改LWIP的版本为V2.1.2 + +![GD32VW553-EVAL](figures/image-20260205145806668.png) + +### 1.4 关闭 RT_WLAN_PROT_ENABLE + +![GD32VW553-EVAL](figures/image-20260205145856756.png) + + + +进行编译 scons -jx ,下载。 + +![GD32VW553-EVAL](figures/image-20260205150826393.png) + +可以使用help查看wifi指令,下面演示连接wifi以及ping + +![GD32VW553-EVAL](figures/image-20260205151251937.png) + +## 2. 使用NETDEV + +使能 RT_USING_NETDEV + +![GD32VW553-EVAL](figures/image-20260205151356304.png) + +## 3. 编译下载 + +### 3.1 wifi 连接以及ping + +![GD32VW553-EVAL](figures/image-20260205151712234.png) + +### 3.2 ifconfig + +![GD32VW553-EVAL](figures/image-20260205151644687.png) +