Răsfoiți Sursa

Merge pull request #2238 from armink/lts-v3.1.x

Sync from master latest version.
Bernard Xiong 7 ani în urmă
părinte
comite
dfebb30c91
100 a modificat fișierele cu 1612 adăugiri și 172 ștergeri
  1. 23 25
      .github/PULL_REQUEST_TEMPLATE.md
  2. 19 1
      .travis.yml
  3. 3 3
      bsp/allwinner_tina/Kconfig
  4. 4 4
      bsp/amebaz/Kconfig
  5. 1 1
      bsp/amebaz/SConstruct
  6. 3 3
      bsp/asm9260t/Kconfig
  7. 3 3
      bsp/at91sam9260/Kconfig
  8. 4 4
      bsp/beaglebone/Kconfig
  9. 3 3
      bsp/ck802/Kconfig
  10. 3 3
      bsp/dm365/Kconfig
  11. 3 3
      bsp/gd32303e-eval/Kconfig
  12. 1 1
      bsp/gd32303e-eval/SConstruct
  13. 4 4
      bsp/gd32450z-eval/Kconfig
  14. 1 1
      bsp/gd32450z-eval/SConstruct
  15. 3 3
      bsp/gkipc/Kconfig
  16. 3 3
      bsp/hifive1/Kconfig
  17. 4 4
      bsp/imx6sx/cortex-a9/Kconfig
  18. 3 3
      bsp/imx6ul/Kconfig
  19. 4 3
      bsp/imxrt/imxrt1050-ArchMix/Kconfig
  20. 1 1
      bsp/imxrt/imxrt1050-ArchMix/SConstruct
  21. 4 3
      bsp/imxrt/imxrt1050-evk/Kconfig
  22. 1 1
      bsp/imxrt/imxrt1050-evk/SConstruct
  23. 4 3
      bsp/imxrt1052-evk/Kconfig
  24. 3 3
      bsp/imxrt1052-evk/SConstruct
  25. 3 3
      bsp/lpc408x/Kconfig
  26. 0 1
      bsp/lpc54114-lite/.config
  27. 3 3
      bsp/lpc54114-lite/Kconfig
  28. 1 1
      bsp/lpc54114-lite/SConstruct
  29. 0 1
      bsp/lpc54114-lite/rtconfig.h
  30. 3 3
      bsp/lpc54608-LPCXpresso/Kconfig
  31. 3 3
      bsp/lpc824/SConstruct
  32. 3 3
      bsp/ls1cdev/Kconfig
  33. 3 3
      bsp/mb9bf500r/SConstruct
  34. 3 3
      bsp/mb9bf506r/SConstruct
  35. 3 3
      bsp/mb9bf618s/SConstruct
  36. 3 3
      bsp/nuvoton_m05x/Kconfig
  37. 3 3
      bsp/nuvoton_m487/Kconfig
  38. 1 0
      bsp/nuvoton_m487/README.md
  39. 2 1
      bsp/nuvoton_m487/driver/SConscript
  40. 0 2
      bsp/nuvoton_m487/driver/board.c
  41. 2 17
      bsp/nuvoton_m487/driver/board.h
  42. 733 0
      bsp/nuvoton_m487/driver/drv_emac.c
  43. 126 0
      bsp/nuvoton_m487/driver/drv_emac.h
  44. 4 9
      bsp/nuvoton_m487/driver/drv_uart.c
  45. 15 0
      bsp/nuvoton_m487/nuc487_flash.sct
  46. 1 1
      bsp/nuvoton_m487/rtconfig.py
  47. 3 3
      bsp/nuvoton_nuc472/SConstruct
  48. 3 3
      bsp/qemu-vexpress-a9/Kconfig
  49. 3 3
      bsp/qemu-vexpress-gemini/Kconfig
  50. 5 4
      bsp/qemu-vexpress-gemini/SConstruct
  51. 3 3
      bsp/raspi2/Kconfig
  52. 5 4
      bsp/realview-a8/SConstruct
  53. 3 3
      bsp/simulator/Kconfig
  54. 39 0
      bsp/stm32/README.md
  55. 280 0
      bsp/stm32/docs/STM32系列BSP制作教程.md
  56. 87 0
      bsp/stm32/docs/STM32系列BSP外设驱动使用教程.md
  57. 98 0
      bsp/stm32/docs/STM32系列外设驱动添加指南.md
  58. 63 0
      bsp/stm32/docs/STM32系列驱动介绍.md
  59. BIN
      bsp/stm32/docs/figures/CubeMX_1.png
  60. BIN
      bsp/stm32/docs/figures/CubeMX_2.png
  61. BIN
      bsp/stm32/docs/figures/CubeMX_3.png
  62. BIN
      bsp/stm32/docs/figures/CubeMX_4.png
  63. BIN
      bsp/stm32/docs/figures/CubeMX_5.png
  64. BIN
      bsp/stm32/docs/figures/Kconfig.png
  65. BIN
      bsp/stm32/docs/figures/Kconfig2.png
  66. BIN
      bsp/stm32/docs/figures/Peripheral.png
  67. BIN
      bsp/stm32/docs/figures/SConscript.png
  68. BIN
      bsp/stm32/docs/figures/board_1.png
  69. BIN
      bsp/stm32/docs/figures/board_2.png
  70. BIN
      bsp/stm32/docs/figures/board_h.png
  71. BIN
      bsp/stm32/docs/figures/bsp_template_dir.png
  72. BIN
      bsp/stm32/docs/figures/complise.png
  73. BIN
      bsp/stm32/docs/figures/config.png
  74. BIN
      bsp/stm32/docs/figures/config1.png
  75. BIN
      bsp/stm32/docs/figures/config2.png
  76. BIN
      bsp/stm32/docs/figures/config3.png
  77. BIN
      bsp/stm32/docs/figures/config4.png
  78. BIN
      bsp/stm32/docs/figures/config5.png
  79. BIN
      bsp/stm32/docs/figures/copy.png
  80. BIN
      bsp/stm32/docs/figures/cube_spi3.png
  81. BIN
      bsp/stm32/docs/figures/cubemx.png
  82. BIN
      bsp/stm32/docs/figures/exit.png
  83. BIN
      bsp/stm32/docs/figures/frame.png
  84. BIN
      bsp/stm32/docs/figures/i2c_device.png
  85. BIN
      bsp/stm32/docs/figures/link_icf.png
  86. BIN
      bsp/stm32/docs/figures/link_lds.png
  87. BIN
      bsp/stm32/docs/figures/linker_scripts.png
  88. BIN
      bsp/stm32/docs/figures/linkscripts_change.png
  89. BIN
      bsp/stm32/docs/figures/menuconfig.png
  90. BIN
      bsp/stm32/docs/figures/menuconfig_1.png
  91. BIN
      bsp/stm32/docs/figures/menuconfig_2.png
  92. BIN
      bsp/stm32/docs/figures/menuconfig_3.png
  93. BIN
      bsp/stm32/docs/figures/menuconfig_4.png
  94. BIN
      bsp/stm32/docs/figures/menuconfig_apolo.png
  95. BIN
      bsp/stm32/docs/figures/on_chip_config.png
  96. BIN
      bsp/stm32/docs/figures/open_cubemx.png
  97. BIN
      bsp/stm32/docs/figures/rt_device.png
  98. BIN
      bsp/stm32/docs/figures/run_flash.png
  99. BIN
      bsp/stm32/docs/figures/run_spi3.png
  100. BIN
      bsp/stm32/docs/figures/save.png

+ 23 - 25
.github/PULL_REQUEST_TEMPLATE.md

@@ -1,35 +1,33 @@
-### Summary of this Pull Request (PR) 拉取/合并请求的简述  
+## 拉取/合并请求描述:(PR description)
 
 
-**Add description here.** **请在这里加入描述**
+[
+这段方括号里的内容是您必须填写并替换掉的,否则PR不可能被合并。方括号外面的内容不需要修改,但请仔细阅读。
+The content in this square bracket must be filled in and replaced, otherwise PR can not be merged. The contents outside square brackets need not be changed, but please read them carefully.
 
 
-### Intent for your PR 拉取/合并请求的目的  
+请在这里填写您的PR描述,可以包括以下之一的内容:为什么提交这份PR;解决的问题是什么,你的解决方案是什么;
+Please fill in your PR description here, which can include one of the following items: why to submit this PR; what is the problem solved and what is your solution;
 
 
-Choose one (Mandatory): 必须选择一项  
+并确认并列出已经在什么情况或板卡上进行了测试。
+And confirm in which case or board have been tested.
+]
 
 
-- [ ] This PR is for a code-review and is intended to get feedback 本拉取/合并请求是一个草稿版本  
-- [ ] This PR is mature, and ready to be integrated into the repo 本拉取/合并请求是一个成熟版本  
+以下的内容请在提交PR后,一项项进行check,没问题后逐条在页面上打钩。
+The following contents should be checked item by item after submitted PR, and ticked on the browser one by one after no problem.
 
 
-### Reviewers (Mandatory): 代码审阅者(必须指定)
+### 当前拉取/合并请求的状态 Intent for your PR
 
 
-(@<github.com username(s)> Ex: @user1, @user2)  
+必须选择一项 Choose one (Mandatory):
 
 
-### Code Quality: 代码质量  
+- [ ] 本拉取/合并请求是一个草稿版本 This PR is for a code-review and is intended to get feedback
+- [ ] 本拉取/合并请求是一个成熟版本 This PR is mature, and ready to be integrated into the repo
 
 
-As part of this pull request, I've considered the following:  
-我在这个拉取/合并请求中已经考虑了:
+### 代码质量 Code Quality:
 
 
-- [ ] Already check the difference between PR and old code 已经仔细查看过代码改动的对比
-- [ ] Style guide is adhered to, including spacing, naming and other style 代码风格正确,包括缩进空格,命名及其他风格
-- [ ] All redundant code is removed and cleaned up 没有垃圾代码,代码尽量精简,不包含`#if 0`代码,不包含已经被注释了的代码
-- [ ] All modifications are justified and not affect other components or BSP 所有变更均有原因及合理的,并且不会影响到其他软件组件代码或BSP
-- [ ] I've commented appropriately where code is tricky 对难懂代码均提供对应的注释
-- [ ] Code in this PR is of high quality 本拉取/合并请求代码是高质量的
+我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
 
 
-### Testing:代码测试
-
-I've tested the code using the following test programs (provide list here):  
-我已经在如下场合跑过对应的测试:  
-
-- [ ] application 1
-- [ ] application 2
-- [ ] ...(add others here)
+- [ ] 已经仔细查看过代码改动的对比 Already check the difference between PR and old code
+- [ ] 代码风格正确,包括缩进空格,命名及其他风格 Style guide is adhered to, including spacing, naming and other style
+- [ ] 没有垃圾代码,代码尽量精简,不包含`#if 0`代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up
+- [ ] 所有变更均有原因及合理的,并且不会影响到其他软件组件代码或BSP All modifications are justified and not affect other components or BSP
+- [ ] 对难懂代码均提供对应的注释 I've commented appropriately where code is tricky
+- [ ] 本拉取/合并请求代码是高质量的 Code in this PR is of high quality

+ 19 - 1
.travis.yml

@@ -80,7 +80,25 @@ env:
   - RTT_BSP='stm32f429-disco' RTT_TOOL_CHAIN='sourcery-arm' 
   - RTT_BSP='stm32f429-disco' RTT_TOOL_CHAIN='sourcery-arm' 
   - RTT_BSP='stm32l475-iot-disco' RTT_TOOL_CHAIN='sourcery-arm' 
   - RTT_BSP='stm32l475-iot-disco' RTT_TOOL_CHAIN='sourcery-arm' 
   - RTT_BSP='stm32l476-nucleo' RTT_TOOL_CHAIN='sourcery-arm' 
   - RTT_BSP='stm32l476-nucleo' RTT_TOOL_CHAIN='sourcery-arm' 
-  - RTT_BSP='stm32h743-nucleo' RTT_TOOL_CHAIN='sourcery-arm' 
+  - RTT_BSP='stm32h743-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f091-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f103-atk-nano' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f103-dofly-lyc8' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f103-fire-arbitrary' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f103-hw100k-ibox' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f407-atk-explorer' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f407-st-discovery' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f411-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f429-armfly-v6' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f429-atk-apollo' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f429-fire-challenger' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f446-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f746-st-disco' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f767-atk-apollo' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f767-fire-challenger' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32f767-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32l432-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm'
+  - RTT_BSP='stm32/stm32l475-atk-pandora' RTT_TOOL_CHAIN='sourcery-arm'
 #  - RTT_BSP='taihu' RTT_TOOL_CHAIN='sourcery-ppc'
 #  - RTT_BSP='taihu' RTT_TOOL_CHAIN='sourcery-ppc'
 #  - RTT_BSP='upd70f3454' # iar
 #  - RTT_BSP='upd70f3454' # iar
 #  - RTT_BSP='x86' # x86
 #  - RTT_BSP='x86' # x86

+ 3 - 3
bsp/allwinner_tina/Kconfig

@@ -1,11 +1,11 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
@@ -13,7 +13,7 @@ config $RTT_DIR
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # example : default "F:/git_repositories/rt-thread"
 # example : default "F:/git_repositories/rt-thread"
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 4 - 4
bsp/amebaz/Kconfig

@@ -1,11 +1,11 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
@@ -13,12 +13,12 @@ config $RTT_DIR
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # example : default "F:/git_repositories/rt-thread"
 # example : default "F:/git_repositories/rt-thread"
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"
     
     
-config $ENV_DIR
+config ENV_DIR
     string
     string
     option env="ENV_ROOT"
     option env="ENV_ROOT"
     default "/"
     default "/"

+ 1 - 1
bsp/amebaz/SConstruct

@@ -27,7 +27,7 @@ env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 if rtconfig.PLATFORM == 'iar':
 if rtconfig.PLATFORM == 'iar':
     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(ARFLAGS = [''])
     env.Replace(ARFLAGS = [''])
-    env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 3 - 3
bsp/asm9260t/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 3 - 3
bsp/at91sam9260/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 4 - 4
bsp/beaglebone/Kconfig

@@ -1,11 +1,11 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
@@ -13,12 +13,12 @@ config $RTT_DIR
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # example: default "F:/git_repositories/rt-thread"
 # example: default "F:/git_repositories/rt-thread"
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"
     
     
-config $ENV_DIR
+config ENV_DIR
     string
     string
     option env="ENV_ROOT"
     option env="ENV_ROOT"
     default "/"
     default "/"

+ 3 - 3
bsp/ck802/Kconfig

@@ -1,11 +1,11 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
@@ -13,7 +13,7 @@ config $RTT_DIR
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # example : default "F:/git_repositories/rt-thread"
 # example : default "F:/git_repositories/rt-thread"
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 3 - 3
bsp/dm365/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 3 - 3
bsp/gd32303e-eval/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 1 - 1
bsp/gd32303e-eval/SConstruct

@@ -27,7 +27,7 @@ env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 if rtconfig.PLATFORM == 'iar':
 if rtconfig.PLATFORM == 'iar':
     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(ARFLAGS = [''])
     env.Replace(ARFLAGS = [''])
-    env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 4 - 4
bsp/gd32450z-eval/Kconfig

@@ -1,19 +1,19 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
-    default: "../.."
+    default "../.."
     
     
 # you can change the RTT_ROOT default: "rt-thread"
 # you can change the RTT_ROOT default: "rt-thread"
 # example : default "F:/git_repositories/rt-thread"
 # example : default "F:/git_repositories/rt-thread"
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 1 - 1
bsp/gd32450z-eval/SConstruct

@@ -27,7 +27,7 @@ env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 if rtconfig.PLATFORM == 'iar':
 if rtconfig.PLATFORM == 'iar':
     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(ARFLAGS = [''])
     env.Replace(ARFLAGS = [''])
-    env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 3 - 3
bsp/gkipc/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 3 - 3
bsp/hifive1/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 4 - 4
bsp/imx6sx/cortex-a9/Kconfig

@@ -1,11 +1,11 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../../.."
     default "../../.."
@@ -13,12 +13,12 @@ config $RTT_DIR
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # example: default "F:/git_repositories/rt-thread"
 # example: default "F:/git_repositories/rt-thread"
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"
     
     
-config $ENV_DIR
+config ENV_DIR
     string
     string
     option env="ENV_ROOT"
     option env="ENV_ROOT"
     default "/"
     default "/"

+ 3 - 3
bsp/imx6ul/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 4 - 3
bsp/imxrt/imxrt1050-ArchMix/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../../.."
     default "../../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"
@@ -284,6 +284,7 @@ endmenu
     config RT_USING_RTC_HP
     config RT_USING_RTC_HP
         bool "Using hp rtc"
         bool "Using hp rtc"
         select RT_USING_RTC
         select RT_USING_RTC
+        select RT_USING_LIBC
         default n 
         default n 
 #endmenu
 #endmenu
 
 

+ 1 - 1
bsp/imxrt/imxrt1050-ArchMix/SConstruct

@@ -35,7 +35,7 @@ env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 if rtconfig.PLATFORM == 'iar':
 if rtconfig.PLATFORM == 'iar':
     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(ARFLAGS = [''])
     env.Replace(ARFLAGS = [''])
-    env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 4 - 3
bsp/imxrt/imxrt1050-evk/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../../.."
     default "../../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"
@@ -445,6 +445,7 @@ endmenu
     config RT_USING_RTC_HP
     config RT_USING_RTC_HP
         bool "Using hp rtc"
         bool "Using hp rtc"
         select RT_USING_RTC
         select RT_USING_RTC
+        select RT_USING_LIBC
         default n 
         default n 
 #endmenu
 #endmenu
 
 

+ 1 - 1
bsp/imxrt/imxrt1050-evk/SConstruct

@@ -35,7 +35,7 @@ env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 if rtconfig.PLATFORM == 'iar':
 if rtconfig.PLATFORM == 'iar':
     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(ARFLAGS = [''])
     env.Replace(ARFLAGS = [''])
-    env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 4 - 3
bsp/imxrt1052-evk/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"
@@ -444,6 +444,7 @@ endmenu
     config RT_USING_RTC_HP
     config RT_USING_RTC_HP
         bool "Using hp rtc"
         bool "Using hp rtc"
         select RT_USING_RTC
         select RT_USING_RTC
+        select RT_USING_LIBC
         default n 
         default n 
 #endmenu
 #endmenu
 
 

+ 3 - 3
bsp/imxrt1052-evk/SConstruct

@@ -34,9 +34,9 @@ else:
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 
 
 if rtconfig.PLATFORM == 'iar':
 if rtconfig.PLATFORM == 'iar':
-	env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
-	env.Replace(ARFLAGS = [''])
-	env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
+    env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
+    env.Replace(ARFLAGS = [''])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 3 - 3
bsp/lpc408x/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Project Configuration"
 mainmenu "RT-Thread Project Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 0 - 1
bsp/lpc54114-lite/.config

@@ -385,6 +385,5 @@ CONFIG_BSP_USING_SPI2=y
 # Select i2c bus drivers
 # Select i2c bus drivers
 #
 #
 CONFIG_BSP_USING_I2C4=y
 CONFIG_BSP_USING_I2C4=y
-CONFIG_BSP_USING_ROMFS=y
 CONFIG_BSP_USING_SDCARD=y
 CONFIG_BSP_USING_SDCARD=y
 CONFIG_BSP_USING_SPIFLASH=y
 CONFIG_BSP_USING_SPIFLASH=y

+ 3 - 3
bsp/lpc54114-lite/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 1 - 1
bsp/lpc54114-lite/SConstruct

@@ -28,7 +28,7 @@ env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 if rtconfig.PLATFORM == 'iar':
 if rtconfig.PLATFORM == 'iar':
     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(ARFLAGS = [''])
     env.Replace(ARFLAGS = [''])
-    env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 0 - 1
bsp/lpc54114-lite/rtconfig.h

@@ -192,7 +192,6 @@
 /* Select i2c bus drivers */
 /* Select i2c bus drivers */
 
 
 #define BSP_USING_I2C4
 #define BSP_USING_I2C4
-#define BSP_USING_ROMFS
 #define BSP_USING_SDCARD
 #define BSP_USING_SDCARD
 #define BSP_USING_SPIFLASH
 #define BSP_USING_SPIFLASH
 
 

+ 3 - 3
bsp/lpc54608-LPCXpresso/Kconfig

@@ -1,11 +1,11 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
@@ -13,7 +13,7 @@ config $RTT_DIR
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # example : default "F:/git_repositories/rt-thread"
 # example : default "F:/git_repositories/rt-thread"
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 3 - 3
bsp/lpc824/SConstruct

@@ -22,9 +22,9 @@ env = Environment(tools = ['mingw'],
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 
 
 if rtconfig.PLATFORM == 'iar':
 if rtconfig.PLATFORM == 'iar':
-	env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
-	env.Replace(ARFLAGS = [''])
-	env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
+    env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
+    env.Replace(ARFLAGS = [''])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 3 - 3
bsp/ls1cdev/Kconfig

@@ -1,17 +1,17 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
     
     
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 3 - 3
bsp/mb9bf500r/SConstruct

@@ -20,9 +20,9 @@ env = Environment(tools = ['mingw'],
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 
 
 if rtconfig.PLATFORM == 'iar':
 if rtconfig.PLATFORM == 'iar':
-	env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
-	env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
-	env.Replace(ARFLAGS = '')
+    env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
+    env.Replace(ARFLAGS = [''])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 3 - 3
bsp/mb9bf506r/SConstruct

@@ -20,9 +20,9 @@ env = Environment(tools = ['mingw'],
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 
 
 if rtconfig.PLATFORM == 'iar':
 if rtconfig.PLATFORM == 'iar':
-	env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
-	env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
-	env.Replace(ARFLAGS = '')
+    env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
+    env.Replace(ARFLAGS = [''])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 3 - 3
bsp/mb9bf618s/SConstruct

@@ -20,9 +20,9 @@ env = Environment(tools = ['mingw'],
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 
 
 if rtconfig.PLATFORM == 'iar':
 if rtconfig.PLATFORM == 'iar':
-	env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
-	env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
-	env.Replace(ARFLAGS = '')
+    env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
+    env.Replace(ARFLAGS = [''])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 3 - 3
bsp/nuvoton_m05x/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 3 - 3
bsp/nuvoton_m487/Kconfig

@@ -1,11 +1,11 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
@@ -13,7 +13,7 @@ config $RTT_DIR
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # you can change the RTT_ROOT default "../.." to your rtthread_root,
 # example : default "F:/git_repositories/rt-thread"
 # example : default "F:/git_repositories/rt-thread"
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 1 - 0
bsp/nuvoton_m487/README.md

@@ -42,6 +42,7 @@
 | 驱动 | 支持情况  |  备注  |
 | 驱动 | 支持情况  |  备注  |
 | ------ | ----  | :------:  |
 | ------ | ----  | :------:  |
 | UART | 支持 | UART0|
 | UART | 支持 | UART0|
+| EMAC | 支持 | EH0|
 
 
 ### 4.1 IO在板级支持包中的映射情况
 ### 4.1 IO在板级支持包中的映射情况
 
 

+ 2 - 1
bsp/nuvoton_m487/driver/SConscript

@@ -1,4 +1,4 @@
-# RT-Thread building script for component
+# RT-Thread building script for component
 
 
 from building import *
 from building import *
 
 
@@ -6,6 +6,7 @@ cwd     = GetCurrentDir()
 src     = Split('''
 src     = Split('''
 board.c
 board.c
 drv_uart.c
 drv_uart.c
+drv_emac.c
 ''')
 ''')
 CPPPATH = [cwd]
 CPPPATH = [cwd]
 
 

+ 0 - 2
bsp/nuvoton_m487/driver/board.c

@@ -8,9 +8,7 @@
  * 2018-11-16    bluebear233   first version
  * 2018-11-16    bluebear233   first version
  */
  */
 
 
-#include <rtconfig.h>
 #include <rtthread.h>
 #include <rtthread.h>
-#include <rthw.h>
 #include "NuMicro.h"
 #include "NuMicro.h"
 #include "drv_uart.h"
 #include "drv_uart.h"
 #include "board.h"
 #include "board.h"

+ 2 - 17
bsp/nuvoton_m487/driver/board.h

@@ -15,22 +15,7 @@
 #define SRAM_SIZE         (160)
 #define SRAM_SIZE         (160)
 #define SRAM_END          (0x20000000 + SRAM_SIZE * 1024)
 #define SRAM_END          (0x20000000 + SRAM_SIZE * 1024)
 
 
-#define RT_UART_485_MODE      1
-#define RT_UART_FLOW_CTS_CTRL 2
-#define RT_UART_FLOW_RTS_CTRL 3
-#define RT_UART_CLEAR_BUF     4
-
-void rt_hw_pdma_init(void);
-void rt_hw_uart_handle(void);
-void rt_hw_sc_init(void);
-void rt_hw_usart_init(void);
-void rt_hw_uusart_init(void);
-void rt_hw_io_init(void);
-void phy_error_led(void);
-
-unsigned char *eth_get_default_mac(void);
-void eth_set_mac(const unsigned char * mac);
-void wdt_reload(void);
-unsigned int get_uid(void);
+void rt_hw_board_init(void);
+void rt_hw_cpu_reset(void);
 
 
 #endif /* BOARD_H_ */
 #endif /* BOARD_H_ */

+ 733 - 0
bsp/nuvoton_m487/driver/drv_emac.c

@@ -0,0 +1,733 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2019-1-20      bluebear233  first version
+ */
+
+#include <rtthread.h>
+
+#ifdef RT_USING_LWIP
+#include "NuMicro.h"
+#include "drv_emac.h"
+#include <netif/ethernetif.h>
+#include <netif/etharp.h>
+#include <lwip/icmp.h>
+#include "lwipopts.h"
+
+#define ETH_DEBUG
+//#define ETH_RX_DUMP
+//#define ETH_TX_DUMP
+
+#ifdef ETH_DEBUG
+#define ETH_TRACE         rt_kprintf
+#else
+#define ETH_TRACE(...)
+#endif /* ETH_DEBUG */
+
+
+#if defined(ETH_RX_DUMP) ||  defined(ETH_TX_DUMP)
+static void packet_dump(const char * msg, const struct pbuf* p)
+{
+    rt_uint32_t i;
+    rt_uint8_t *ptr = p->payload;
+
+    ETH_TRACE("%s %d byte\n", msg, p->tot_len);
+
+    for(i=0; i<p->tot_len; i++)
+    {
+        if( (i%8) == 0 )
+        {
+            ETH_TRACE("  ");
+        }
+        if( (i%16) == 0 )
+        {
+            ETH_TRACE("\r\n");
+        }
+        ETH_TRACE("%02x ",*ptr);
+        ptr++;
+    }
+    ETH_TRACE("\n\n");
+}
+#endif /* dump */
+
+#define ETH_TRIGGER_RX()    EMAC->RXST = 0
+#define ETH_TRIGGER_TX()    EMAC->TXST = 0
+#define ETH_ENABLE_TX()     EMAC->CTL |= EMAC_CTL_TXON
+#define ETH_ENABLE_RX()     EMAC->CTL |= EMAC_CTL_RXON
+#define ETH_DISABLE_TX()    EMAC->CTL &= ~EMAC_CTL_TXON
+#define ETH_DISABLE_RX()    EMAC->CTL &= ~EMAC_CTL_RXON
+
+#define EMAC_DMARXDESC_CRCEIF_Msk (1ul << 17)
+
+#define ETH_TID_STACK 256
+
+static rt_uint8_t volatile phy_speed = 0;
+static rt_uint8_t eth_addr[6];
+static struct eth_device eth;
+static struct rt_semaphore eth_sem;
+static struct rt_thread eth_tid;
+static rt_uint32_t eth_stack[ETH_TID_STACK / 4];
+static struct eth_descriptor volatile *cur_tx_desc_ptr, *cur_rx_desc_ptr, *fin_tx_desc_ptr;
+static struct eth_descriptor rx_desc[RX_DESCRIPTOR_NUM];
+static struct eth_descriptor tx_desc[TX_DESCRIPTOR_NUM];
+
+static rt_uint32_t rx_buf[RX_DESCRIPTOR_NUM][PACKET_BUFFER_SIZE];
+static rt_uint32_t tx_buf[TX_DESCRIPTOR_NUM][PACKET_BUFFER_SIZE];
+
+
+static void mdio_write(rt_uint8_t addr, rt_uint8_t reg, rt_uint16_t val)
+{
+    EMAC->MIIMDAT = val;
+    EMAC->MIIMCTL = (addr << EMAC_MIIMCTL_PHYADDR_Pos) | reg | EMAC_MIIMCTL_BUSY_Msk | EMAC_MIIMCTL_WRITE_Msk | EMAC_MIIMCTL_MDCON_Msk;
+
+    while (EMAC->MIIMCTL & EMAC_MIIMCTL_BUSY_Msk);
+}
+
+static rt_uint16_t mdio_read(rt_uint8_t addr, rt_uint8_t reg)
+{
+    EMAC->MIIMCTL = (addr << EMAC_MIIMCTL_PHYADDR_Pos) | reg | EMAC_MIIMCTL_BUSY_Msk | EMAC_MIIMCTL_MDCON_Msk;
+    while (EMAC->MIIMCTL & EMAC_MIIMCTL_BUSY_Msk);
+
+    return EMAC->MIIMDAT;
+}
+
+static void init_tx_desc(void)
+{
+    rt_uint32_t i;
+
+    cur_tx_desc_ptr = fin_tx_desc_ptr = &tx_desc[0];
+
+    for(i = 0; i < TX_DESCRIPTOR_NUM; i++) 
+    {
+        tx_desc[i].status1 = TXFD_PADEN | TXFD_CRCAPP | TXFD_INTEN;
+        tx_desc[i].buf = (rt_uint8_t*)tx_buf[i];
+        tx_desc[i].status2 = 0;
+        tx_desc[i].next = &tx_desc[(i + 1) % TX_DESCRIPTOR_NUM];
+    }
+    EMAC->TXDSA = (unsigned int)&tx_desc[0];
+    return;
+}
+
+static void init_rx_desc(void)
+{
+    rt_uint32_t i;
+
+    cur_rx_desc_ptr = &rx_desc[0];
+
+    for(i = 0; i < RX_DESCRIPTOR_NUM; i++)
+    {
+        rx_desc[i].status1 = OWNERSHIP_EMAC;
+        rx_desc[i].buf = (rt_uint8_t*)rx_buf[i];
+        rx_desc[i].status2 = 0;
+        rx_desc[i].next = &rx_desc[(i + 1) % RX_DESCRIPTOR_NUM];
+    }
+    EMAC->RXDSA = (unsigned int)&rx_desc[0];
+    return;
+}
+
+static void add_mac_addr(const rt_uint8_t *addr)
+{
+    rt_uint32_t *EMAC_CAMxM;
+    rt_uint32_t *EMAC_CAMxL;
+    rt_uint8_t index = 0;
+    rt_uint8_t mac[6];
+
+    for(; index < 13; index ++)
+    {
+        EMAC_CAMxM = (rt_uint32_t *)((rt_uint32_t)&EMAC->CAM0M + (index * 8));
+        EMAC_CAMxL = (rt_uint32_t *)((rt_uint32_t)&EMAC->CAM0L + (index * 8));
+
+        mac[0] = (*EMAC_CAMxM >> 24) & 0xff;
+        mac[1] = (*EMAC_CAMxM >> 16) & 0xff;
+        mac[2] = (*EMAC_CAMxM >> 8) & 0xff;
+        mac[3] = (*EMAC_CAMxM) & 0xff;
+        mac[4] = (*EMAC_CAMxL >> 24) & 0xff;
+        mac[5] = (*EMAC_CAMxL >> 16) & 0xff;
+
+        if(memcmp(mac, addr, sizeof(mac)) == 0)
+        {
+            return;
+        }
+
+        if(*EMAC_CAMxM == 0 && *EMAC_CAMxL == 0)
+        {
+            break;
+        }
+    }
+
+    RT_ASSERT(index < 13)
+
+    *EMAC_CAMxM  = (addr[0] << 24) |
+                  (addr[1] << 16) |
+                  (addr[2] << 8) |
+                  addr[3];
+
+    *EMAC_CAMxL = (addr[4] << 24) |
+                  (addr[5] << 16);
+
+    EMAC->CAMEN |= (1 << index);
+}
+
+void EMAC_init()
+{
+    // Reset MAC
+    EMAC->CTL = EMAC_CTL_RST_Msk;
+    while(EMAC->CTL & EMAC_CTL_RST_Msk);
+
+    init_tx_desc();
+    init_rx_desc();
+
+    EMAC->CAMCTL = EMAC_CAMCTL_CMPEN_Msk | EMAC_CAMCTL_ABP_Msk;
+    add_mac_addr(eth_addr);
+
+    EMAC->CTL |= EMAC_CTL_STRIPCRC_Msk | EMAC_CTL_RXON_Msk | EMAC_CTL_TXON_Msk | EMAC_CTL_RMIIEN_Msk;
+    EMAC->INTEN = EMAC_INTEN_RXIEN_Msk |
+                   EMAC_INTEN_RXGDIEN_Msk |
+                   EMAC_INTEN_RDUIEN_Msk |
+                   EMAC_INTEN_RXBEIEN_Msk |
+                   EMAC_INTEN_TXIEN_Msk |
+                   EMAC_INTEN_TXBEIEN_Msk;
+
+    /* Limit the max receive frame length to 1514 + 4 */
+    EMAC->MRFL = PACKET_BUFFER_SIZE;
+    EMAC->RXST = 0;  // trigger Rx
+}
+
+void EMAC_Reinit(void)
+{
+    rt_uint32_t EMAC_CAMxM[13];
+    rt_uint32_t EMAC_CAMxL[13];
+    rt_uint32_t EMAC_CAMEN;
+
+    EMAC_CAMEN = EMAC->CAMEN;
+    for(rt_uint8_t index = 0 ; index < 13; index ++)
+    {
+        rt_uint32_t *CAMxM = (rt_uint32_t *)((rt_uint32_t)&EMAC->CAM0M + (index * 8));
+        rt_uint32_t *CAMxL = (rt_uint32_t *)((rt_uint32_t)&EMAC->CAM0L + (index * 8));
+
+        EMAC_CAMxM[index] = *CAMxM;
+        EMAC_CAMxL[index] = *CAMxL;
+    }
+
+    EMAC_init();
+
+    for(rt_uint8_t index = 0 ; index < 13; index ++)
+    {
+        rt_uint32_t *CAMxM = (rt_uint32_t *)((rt_uint32_t)&EMAC->CAM0M + (index * 8));
+        rt_uint32_t *CAMxL = (rt_uint32_t *)((rt_uint32_t)&EMAC->CAM0L + (index * 8));
+
+        *CAMxM = EMAC_CAMxM[index];
+        *CAMxL = EMAC_CAMxL[index];
+    }
+    EMAC->CAMEN = EMAC_CAMEN;
+
+    phy_speed = 0;
+}
+
+void ETH_halt(void)
+{
+    EMAC->CTL &= ~(EMAC_CTL_RXON_Msk | EMAC_CTL_TXON_Msk);
+}
+
+__inline static rt_uint8_t *emac_get_tx_buf(void)
+{
+    if(cur_tx_desc_ptr->status1 & OWNERSHIP_EMAC)
+    {
+        return(RT_NULL);
+    }
+    else
+    {
+        return(cur_tx_desc_ptr->buf);
+    }
+}
+
+__inline static void ETH_trigger_tx(rt_uint16_t length)
+{
+    struct eth_descriptor volatile *desc;
+    
+    cur_tx_desc_ptr->status2 = (unsigned int)length;
+    desc = cur_tx_desc_ptr->next;    // in case TX is transmitting and overwrite next pointer before we can update cur_tx_desc_ptr
+    cur_tx_desc_ptr->status1 |= OWNERSHIP_EMAC;
+    cur_tx_desc_ptr = desc;
+}
+
+#if LWIP_IPV4 && LWIP_IGMP
+static err_t igmp_mac_filter( struct netif *netif, const ip4_addr_t *ip4_addr, u8_t action )
+{
+    rt_uint8_t mac[6];
+    const uint8_t *p = (const uint8_t *)ip4_addr;
+
+    mac[0] = 0x01;
+    mac[1] = 0x00;
+    mac[2] = 0x5E;
+    mac[3] = *(p+1) & 0x7F;
+    mac[4] = *(p+2);
+    mac[5] = *(p+3);
+
+    add_mac_addr(mac);
+
+    if(1)
+    {
+        rt_kprintf("%s %s %s ", __FUNCTION__, (action==NETIF_ADD_MAC_FILTER)?"add":"del", ip4addr_ntoa(ip4_addr));
+        rt_kprintf("%02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
+    }
+
+    return 0;
+}
+#endif /* LWIP_IPV4 && LWIP_IGMP */
+
+/*
+ * M480 EMAC Driver for RT-Thread
+ * Change Logs:
+ * Date           Author       Notes
+ * 2017-12-31     Bluebear233  first implementation
+ */
+void EMAC_RX_IRQHandler(void)
+{
+    /* enter interrupt */
+    rt_interrupt_enter();
+    
+    unsigned int status = EMAC->INTSTS;
+
+    if(status & EMAC_INTSTS_RDUIF_Msk)
+    {
+        EMAC->INTEN &= ~(EMAC_INTEN_RDUIEN_Msk | EMAC_INTEN_RXGDIEN_Msk);
+        eth_device_ready(&eth);
+    }
+    else if(status & EMAC_INTSTS_RXGDIF_Msk)
+    {
+        EMAC->INTEN &= ~EMAC_INTEN_RXGDIEN_Msk;
+        eth_device_ready(&eth);
+    }
+
+    if(status & EMAC_INTSTS_RXBEIF_Msk)
+    {
+        ETH_TRACE("Reinit Rx EMAC\n");
+        EMAC->INTSTS = EMAC_INTSTS_RXBEIF_Msk;
+        EMAC_Reinit();
+    }
+
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+
+void EMAC_TX_IRQHandler(void)
+{
+    rt_interrupt_enter();
+
+    unsigned int status = EMAC->INTSTS;
+
+    if(status & EMAC_INTSTS_TXCPIF_Msk)
+    {
+        EMAC->INTEN &= ~EMAC_INTEN_TXCPIEN_Msk;
+        rt_sem_release(&eth_sem);
+    }
+
+    if(status & EMAC_INTSTS_TXBEIF_Msk)
+    {
+        ETH_TRACE("Reinit Tx EMAC\n");
+        EMAC->INTSTS = EMAC_INTSTS_TXBEIF_Msk;
+        EMAC_Reinit();
+    }
+
+    rt_interrupt_leave();
+}
+
+#define PHY_LINK_MASK       (1<<0)
+#define PHY_10FULL_MASK     (1<<1)
+#define PHY_100FULL_MASK    (1<<2)
+#define PHY_10HALF_MASK     (1<<3)
+#define PHY_100HALF_MASK    (1<<4)
+
+#define PHY_ANLPA_DR100_TX_FULL   (1UL << 8UL)
+#define PHY_ANLPA_DR100_TX_HALF   (1UL << 7UL)
+#define PHY_ANLPA_DR10_TX_FULL    (1UL << 6UL)
+#define PHY_ANLPA_DR10_TX_HALF    (1UL << 5UL)
+
+void eth_entry(void *param)
+{
+    uint8_t phy_addr = 0xFF;
+    uint8_t phy_speed_new = 0;
+
+    /* phy search */
+    {
+        rt_uint32_t i;
+        rt_uint16_t temp;
+
+        for(i=0; i<=0x1F; i++)
+        {
+            temp = mdio_read(i, 0x02);
+            if( temp != 0xFFFF )
+            {
+                phy_addr = i;
+                break;
+            }
+        }
+    } /* phy search */
+
+    if(phy_addr == 0xFF)
+    {
+        ETH_TRACE("phy not probe!\n");
+        return;
+    }
+    else
+    {
+        ETH_TRACE("found a phy, address:0x%02X\n", phy_addr);
+    }
+
+    /* RESET PHY */
+    mdio_write(phy_addr, MII_BMCR, BMCR_RESET);
+    while (1)
+    {
+        rt_thread_delay(RT_TICK_PER_SECOND);
+
+        rt_uint16_t reg = mdio_read(phy_addr, MII_BMCR);
+        if ((reg & BMCR_RESET) == 0)
+        {
+            break;
+        }
+    }
+
+    mdio_write(phy_addr, MII_ADVERTISE, ADVERTISE_CSMA |
+               ADVERTISE_10HALF |
+               ADVERTISE_10FULL |
+               ADVERTISE_100HALF |
+               ADVERTISE_100FULL);
+    {
+        uint16_t reg = mdio_read(phy_addr, MII_BMCR);
+        mdio_write(phy_addr, MII_BMCR, reg | BMCR_ANRESTART);
+    }
+
+    while(1)
+    {
+        uint16_t status = mdio_read(phy_addr, MII_BMSR);
+        phy_speed_new = 0;
+
+        if((status & (BMSR_ANEGCAPABLE | BMSR_LSTATUS)) == (BMSR_ANEGCAPABLE | BMSR_LSTATUS))
+        {
+            phy_speed_new = PHY_LINK_MASK;
+
+            status = mdio_read(phy_addr, MII_LPA);
+
+            if(status & PHY_ANLPA_DR100_TX_FULL)
+            {
+                phy_speed_new |= PHY_100FULL_MASK;
+            }
+            else if(status & PHY_ANLPA_DR100_TX_HALF)
+            {
+                phy_speed_new |= PHY_100HALF_MASK;
+            }
+            else if(status & PHY_ANLPA_DR10_TX_FULL)
+            {
+                phy_speed_new |= PHY_10FULL_MASK;
+            }
+            else if(status & PHY_ANLPA_DR10_TX_HALF)
+            {
+                phy_speed_new |= PHY_10HALF_MASK;
+            }
+        }
+
+        /* linkchange */
+        if(phy_speed_new != phy_speed)
+        {
+            if(phy_speed_new & PHY_LINK_MASK)
+            {
+                ETH_TRACE("link up ");
+
+                if(phy_speed_new & PHY_100FULL_MASK)
+                {
+                    ETH_TRACE("100Mbps full-duplex\n");
+                    EMAC->CTL |= (EMAC_CTL_OPMODE_Msk | EMAC_CTL_FUDUP_Msk);
+                }
+                else if(phy_speed_new & PHY_100HALF_MASK)
+                {
+                    ETH_TRACE("100Mbps half-duplex\n");
+                    EMAC->CTL = (EMAC->CTL & ~EMAC_CTL_FUDUP_Msk) | EMAC_CTL_OPMODE_Msk;
+                }
+                else if(phy_speed_new & PHY_10FULL_MASK)
+                {
+                    ETH_TRACE("10Mbps full-duplex\n");
+                    EMAC->CTL = (EMAC->CTL & ~EMAC_CTL_OPMODE_Msk) | EMAC_CTL_FUDUP_Msk;
+                }
+                else
+                {
+                    ETH_TRACE("10Mbps half-duplex\n");
+                    EMAC->CTL &= ~(EMAC_CTL_OPMODE_Msk | EMAC_CTL_FUDUP_Msk);
+                }
+
+                /* send link up. */
+                eth_device_linkchange(&eth, RT_TRUE);
+            } /* link up. */
+            else
+            {
+                ETH_TRACE("link down\r\n");
+
+                /* send link down. */
+                eth_device_linkchange(&eth, RT_FALSE);
+            } /* link down. */
+
+            phy_speed = phy_speed_new;
+        } /* linkchange */
+
+        rt_thread_delay(RT_TICK_PER_SECOND);
+    } /* while(1) */
+}
+
+static rt_err_t rt_m480_emac_init(rt_device_t dev)
+{
+    /* Unlock protected registers */
+    SYS_UnlockReg();
+
+    CLK_EnableModuleClock(EMAC_MODULE);
+
+    // Configure MDC clock rate to HCLK / (127 + 1) = 1.5 MHz if system is running at 192 MHz
+    CLK_SetModuleClock(EMAC_MODULE, 0, CLK_CLKDIV3_EMAC(127));
+
+    // Configure RMII pins
+//    SYS->GPA_MFPL |= SYS_GPA_MFPL_PA6MFP_EMAC_RMII_RXERR | SYS_GPA_MFPL_PA7MFP_EMAC_RMII_CRSDV;
+    SYS->GPA_MFPL |= SYS_GPA_MFPL_PA7MFP_EMAC_RMII_CRSDV;
+    SYS->GPC_MFPL |= SYS_GPC_MFPL_PC6MFP_EMAC_RMII_RXD1 | SYS_GPC_MFPL_PC7MFP_EMAC_RMII_RXD0;
+    SYS->GPC_MFPH |= SYS_GPC_MFPH_PC8MFP_EMAC_RMII_REFCLK;
+    SYS->GPE_MFPH |= SYS_GPE_MFPH_PE8MFP_EMAC_RMII_MDC |
+                     SYS_GPE_MFPH_PE9MFP_EMAC_RMII_MDIO |
+                     SYS_GPE_MFPH_PE10MFP_EMAC_RMII_TXD0 |
+                     SYS_GPE_MFPH_PE11MFP_EMAC_RMII_TXD1 |
+                     SYS_GPE_MFPH_PE12MFP_EMAC_RMII_TXEN;
+
+    // Enable high slew rate on all RMII TX output pins
+    PE->SLEWCTL = (GPIO_SLEWCTL_HIGH << GPIO_SLEWCTL_HSREN10_Pos) |
+                  (GPIO_SLEWCTL_HIGH << GPIO_SLEWCTL_HSREN11_Pos) |
+                  (GPIO_SLEWCTL_HIGH << GPIO_SLEWCTL_HSREN12_Pos);
+
+        /* Lock protected registers */
+    SYS_LockReg();
+
+    EMAC_init();
+
+    NVIC_SetPriority(EMAC_TX_IRQn, 1);
+    NVIC_EnableIRQ(EMAC_TX_IRQn);
+    NVIC_SetPriority(EMAC_RX_IRQn, 1);
+    NVIC_EnableIRQ(EMAC_RX_IRQn);
+
+    rt_sem_init(&eth_sem, "eth_sem", 0, RT_IPC_FLAG_FIFO);
+
+    rt_thread_init(&eth_tid, "eth", eth_entry, RT_NULL, eth_stack, sizeof(eth_stack), RT_THREAD_PRIORITY_MAX - 2, 10);
+
+    rt_thread_startup(&eth_tid);
+
+
+#if LWIP_IPV4 && LWIP_IGMP
+    netif_set_igmp_mac_filter(eth.netif, igmp_mac_filter);
+#endif /* LWIP_IPV4 && LWIP_IGMP */
+    
+    return RT_EOK;
+}
+
+static rt_err_t rt_m480_emac_open(rt_device_t dev, rt_uint16_t oflag)
+{
+    return RT_EOK;
+}
+
+static rt_err_t rt_m480_emac_close(rt_device_t dev)
+{
+    return RT_EOK;
+}
+
+static rt_size_t rt_m480_emac_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
+{
+    rt_set_errno(-RT_ENOSYS);
+    return 0;
+}
+
+static rt_size_t rt_m480_emac_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
+{
+    rt_set_errno(-RT_ENOSYS);
+    return 0;
+}
+
+static rt_err_t rt_m480_emac_control(rt_device_t dev, int cmd, void *args)
+{
+    switch(cmd)
+    {
+    case NIOCTL_GADDR:
+        /* get mac address */
+        if(args) rt_memcpy(args, eth_addr, 6);
+        else return -RT_ERROR;
+
+        break;
+
+    default :
+        break;
+    }
+
+    return RT_EOK;
+}
+
+rt_err_t rt_m480_emac_tx(rt_device_t dev, struct pbuf* p)
+{
+    struct pbuf* q;
+    rt_uint32_t offset;
+    rt_uint8_t *buf;
+
+    buf = emac_get_tx_buf();
+
+    /* get free tx buffer */
+    if(buf == RT_NULL)
+    {
+        rt_sem_control(&eth_sem, RT_IPC_CMD_RESET, 0);
+
+        EMAC->INTSTS = EMAC_INTSTS_TXCPIF_Msk;
+        EMAC->INTEN |= EMAC_INTEN_TXCPIEN_Msk;
+
+        do{
+            rt_sem_take(&eth_sem, 1);
+
+            buf = emac_get_tx_buf();
+        }while(buf == RT_NULL);
+    }
+
+
+    offset = 0;
+    for (q = p; q != NULL; q = q->next)
+    {
+        rt_uint8_t* ptr;
+        rt_uint32_t len;
+
+        len = q->len;
+        ptr = q->payload;
+
+        // todo 优化复制
+        memcpy(&buf[offset], ptr, len);
+
+        offset += len;
+    }
+
+
+#ifdef ETH_TX_DUMP
+    packet_dump("TX dump", p);
+#endif
+
+    ETH_trigger_tx(offset);
+
+    if(EMAC->INTSTS & EMAC_INTSTS_TDUIF_Msk)
+    {
+        EMAC->INTSTS = EMAC_INTSTS_TDUIF_Msk;
+        ETH_TRIGGER_TX();
+    }
+
+    /* Return SUCCESS */
+    return RT_EOK;
+}
+
+struct pbuf *rt_m480_emac_rx(rt_device_t dev)
+{
+    unsigned int status;
+    struct pbuf* p;
+
+    /* init p pointer */
+    p = RT_NULL;
+
+start:
+    status = cur_rx_desc_ptr->status1;
+
+    if(status & OWNERSHIP_EMAC)
+    {
+        goto end;
+    }
+
+    if ((status & RXFD_RXGD) && !(status & EMAC_DMARXDESC_CRCEIF_Msk))
+    {
+        p = pbuf_alloc(PBUF_RAW, status & 0xFFFF, PBUF_RAM);
+        if (p != RT_NULL)
+        {
+            RT_ASSERT(p->next == RT_NULL);
+
+            const char * from = (const char *)(cur_rx_desc_ptr->buf);
+
+            // todo 优化复制
+            memcpy(p->payload, from, p->len);
+        }
+    }
+
+#ifdef ETH_RX_DUMP
+    packet_dump("RX dump", p);
+#endif /* ETH_RX_DUMP */
+
+    cur_rx_desc_ptr->status1 = OWNERSHIP_EMAC;
+    cur_rx_desc_ptr = cur_rx_desc_ptr->next;
+
+    if(p == RT_NULL)
+    {
+        goto start;
+    }
+
+    return p;
+    
+end:
+    if(!(EMAC->INTEN & EMAC_INTEN_RDUIEN_Msk))
+    {
+        EMAC->INTSTS = (EMAC_INTSTS_RDUIF_Msk | EMAC_INTSTS_RXGDIF_Msk);
+        EMAC->INTEN |= (EMAC_INTEN_RDUIEN_Msk | EMAC_INTEN_RXGDIEN_Msk);
+
+        ETH_TRIGGER_RX();
+    }
+    else
+    {
+        EMAC->INTSTS = EMAC_INTSTS_RXGDIF_Msk;
+        EMAC->INTEN |= EMAC_INTEN_RXGDIEN_Msk;
+    }
+    
+    return RT_NULL;
+}
+
+static void rt_hw_m480_emac_register(char *dev_name)
+{
+    rt_uint32_t value = 0;
+
+    SYS_UnlockReg();
+    FMC_Open();
+
+    for (rt_uint8_t i = 0; i < 3; i++)
+    {
+        value += FMC_ReadUID(i);
+    }
+
+    FMC_Close();
+    SYS_LockReg();
+
+    eth_addr[0] = 0x00;
+    eth_addr[1] = 0x00;
+    eth_addr[2] = 0x00;
+    eth_addr[3] = (value >> 16) & 0xff;
+    eth_addr[4] = (value >> 8) & 0xff;
+    eth_addr[5] = (value) & 0xff;
+
+    eth.parent.init       = rt_m480_emac_init;
+    eth.parent.open       = rt_m480_emac_open;
+    eth.parent.close      = rt_m480_emac_close;
+    eth.parent.read       = rt_m480_emac_read;
+    eth.parent.write      = rt_m480_emac_write;
+    eth.parent.control    = rt_m480_emac_control;
+    eth.parent.user_data  = RT_NULL;
+
+    eth.eth_rx     = rt_m480_emac_rx;
+    eth.eth_tx     = rt_m480_emac_tx;
+
+    /* register eth device */
+    eth_device_init(&eth, dev_name);
+}
+
+static int rt_hw_nuc487_emac_init(void)
+{
+    rt_hw_m480_emac_register("eh0");
+
+    return RT_EOK;
+}
+
+INIT_APP_EXPORT(rt_hw_nuc487_emac_init);
+#endif
+

+ 126 - 0
bsp/nuvoton_m487/driver/drv_emac.h

@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2016 Nuvoton Technology Corp.
+ * Description:   M480 EMAC driver header file
+ */
+#include "NuMicro.h"
+#ifndef  _M480_ETH_
+#define  _M480_ETH_
+
+/* Generic MII registers. */
+
+#define MII_BMCR            0x00        /* Basic mode control register */
+#define MII_BMSR            0x01        /* Basic mode status register  */
+#define MII_PHYSID1         0x02        /* PHYS ID 1                   */
+#define MII_PHYSID2         0x03        /* PHYS ID 2                   */
+#define MII_ADVERTISE       0x04        /* Advertisement control reg   */
+#define MII_LPA             0x05        /* Link partner ability reg    */
+#define MII_EXPANSION       0x06        /* Expansion register          */
+#define MII_DCOUNTER        0x12        /* Disconnect counter          */
+#define MII_FCSCOUNTER      0x13        /* False carrier counter       */
+#define MII_NWAYTEST        0x14        /* N-way auto-neg test reg     */
+#define MII_RERRCOUNTER     0x15        /* Receive error counter       */
+#define MII_SREVISION       0x16        /* Silicon revision            */
+#define MII_RESV1           0x17        /* Reserved...                 */
+#define MII_LBRERROR        0x18        /* Lpback, rx, bypass error    */
+#define MII_PHYADDR         0x19        /* PHY address                 */
+#define MII_RESV2           0x1a        /* Reserved...                 */
+#define MII_TPISTATUS       0x1b        /* TPI status for 10mbps       */
+#define MII_NCONFIG         0x1c        /* Network interface config    */
+
+/* Basic mode control register. */
+#define BMCR_RESV               0x007f  /* Unused...                   */
+#define BMCR_CTST               0x0080  /* Collision test              */
+#define BMCR_FULLDPLX           0x0100  /* Full duplex                 */
+#define BMCR_ANRESTART          0x0200  /* Auto negotiation restart    */
+#define BMCR_ISOLATE            0x0400  /* Disconnect DP83840 from MII */
+#define BMCR_PDOWN              0x0800  /* Powerdown the DP83840       */
+#define BMCR_ANENABLE           0x1000  /* Enable auto negotiation     */
+#define BMCR_SPEED100           0x2000  /* Select 100Mbps              */
+#define BMCR_LOOPBACK           0x4000  /* TXD loopback bits           */
+#define BMCR_RESET              0x8000  /* Reset the DP83840           */
+
+/* Basic mode status register. */
+#define BMSR_ERCAP              0x0001  /* Ext-reg capability          */
+#define BMSR_JCD                0x0002  /* Jabber detected             */
+#define BMSR_LSTATUS            0x0004  /* Link status                 */
+#define BMSR_ANEGCAPABLE        0x0008  /* Able to do auto-negotiation */
+#define BMSR_RFAULT             0x0010  /* Remote fault detected       */
+#define BMSR_ANEGCOMPLETE       0x0020  /* Auto-negotiation complete   */
+#define BMSR_RESV               0x07c0  /* Unused...                   */
+#define BMSR_10HALF             0x0800  /* Can do 10mbps, half-duplex  */
+#define BMSR_10FULL             0x1000  /* Can do 10mbps, full-duplex  */
+#define BMSR_100HALF            0x2000  /* Can do 100mbps, half-duplex */
+#define BMSR_100FULL            0x4000  /* Can do 100mbps, full-duplex */
+#define BMSR_100BASE4           0x8000  /* Can do 100mbps, 4k packets  */
+
+/* Advertisement control register. */
+#define ADVERTISE_SLCT          0x001f  /* Selector bits               */
+#define ADVERTISE_CSMA          0x0001  /* Only selector supported     */
+#define ADVERTISE_10HALF        0x0020  /* Try for 10mbps half-duplex  */
+#define ADVERTISE_10FULL        0x0040  /* Try for 10mbps full-duplex  */
+#define ADVERTISE_100HALF       0x0080  /* Try for 100mbps half-duplex */
+#define ADVERTISE_100FULL       0x0100  /* Try for 100mbps full-duplex */
+#define ADVERTISE_100BASE4      0x0200  /* Try for 100mbps 4k packets  */
+#define ADVERTISE_RESV          0x1c00  /* Unused...                   */
+#define ADVERTISE_RFAULT        0x2000  /* Say we can detect faults    */
+#define ADVERTISE_LPACK         0x4000  /* Ack link partners response  */
+#define ADVERTISE_NPAGE         0x8000  /* Next page bit               */
+
+#define RX_DESCRIPTOR_NUM 4    // Max Number of Rx Frame Descriptors
+#define TX_DESCRIPTOR_NUM 2    // Max number of Tx Frame Descriptors
+
+#define PACKET_BUFFER_SIZE  1520
+
+#define CONFIG_PHY_ADDR     1
+
+
+// Frame Descriptor's Owner bit
+#define OWNERSHIP_EMAC 0x80000000  // 1 = EMAC
+//#define OWNERSHIP_CPU 0x7fffffff  // 0 = CPU
+
+
+
+// Rx Frame Descriptor Status
+#define RXFD_RXGD    0x00100000  // Receiving Good Packet Received
+#define RXFD_RTSAS   0x00800000  // RX Time Stamp Available 
+
+
+// Tx Frame Descriptor's Control bits
+#define TXFD_TTSEN    0x08    // Tx Time Stamp Enable
+#define TXFD_INTEN    0x04    // Interrupt Enable
+#define TXFD_CRCAPP   0x02    // Append CRC
+#define TXFD_PADEN    0x01    // Padding Enable
+
+// Tx Frame Descriptor Status
+#define TXFD_TXCP    0x00080000  // Transmission Completion
+#define TXFD_TTSAS   0x08000000  // TX Time Stamp Available
+
+// Tx/Rx buffer descriptor structure
+struct eth_descriptor;
+struct eth_descriptor
+{
+    uint32_t  status1;
+    uint8_t *buf;
+    uint32_t  status2;
+    struct eth_descriptor *next;
+#ifdef TIME_STAMPING
+    u32_t backup1;
+    u32_t backup2;
+    u32_t reserved1;
+    u32_t reserved2;
+#endif
+};
+
+#ifdef TIME_STAMPING
+
+#define ETH_TS_ENABLE() do{EMAC->TSCTL = EMAC_TSCTL_TSEN_Msk;}while(0)
+#define ETH_TS_START() do{EMAC->TSCTL |= (EMAC_TSCTL_TSMODE_Msk | EMAC_TSCTL_TSIEN_Msk);}while(0)
+s32_t ETH_settime(u32_t sec, u32_t nsec);
+s32_t ETH_gettime(u32_t *sec, u32_t *nsec);
+s32_t ETH_updatetime(u32_t neg, u32_t sec, u32_t nsec);
+s32_t ETH_adjtimex(int ppm);
+void ETH_setinc(void);
+
+#endif
+
+#endif  /* _M480_ETH_ */

+ 4 - 9
bsp/nuvoton_m487/driver/drv_uart.c

@@ -315,11 +315,6 @@ static rt_err_t usart_control(struct rt_serial_device *serial,
         }
         }
         break;
         break;
 // TODO 完善DMA接口
 // TODO 完善DMA接口
-//    case RT_DEVICE_FLAG_DMA_TX:
-//        USART_DMACmd(dev->usart_base, USART_DMAReq_Tx, ENABLE);
-//        stm32_uart_tx_dma_configure(dev, RT_TRUE);
-//        stm32_uart_tx_dma_nvic(dev, RT_TRUE);
-//        break;
     default:
     default:
         RT_ASSERT(0)
         RT_ASSERT(0)
         ;
         ;
@@ -365,9 +360,9 @@ static int usart_receive(struct rt_serial_device *serial)
 /**
 /**
  * @brief 串口设备注册
  * @brief 串口设备注册
  * @param uart           : UART设备结构体
  * @param uart           : UART设备结构体
- * @param uart_base      : STM32 UART外设基地址
- * @param name           : STM32 UART设备名
- * @param tx_dma_channel : STM32 UART TX的DMA通道基地址(可选)
+ * @param uart_base      : UART外设基地址
+ * @param name           : UART设备名
+ * @param tx_dma_channel : UART TX的DMA通道基地址(可选)
  */
  */
 static void rt_hw_uart_register(usart_t usart, UART_T * uart_base, char *name)
 static void rt_hw_uart_register(usart_t usart, UART_T * uart_base, char *name)
 {
 {
@@ -402,4 +397,4 @@ int rt_hw_uart_init(void)
 #endif
 #endif
 
 
     return 0;
     return 0;
-}
+}

+ 15 - 0
bsp/nuvoton_m487/nuc487_flash.sct

@@ -0,0 +1,15 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x00000000 0x00080000  {    ; load region size_region
+  ER_IROM1 0x00000000 0x00080000  {  ; load address = execution address
+   *.o (RESET, +First)
+   *(InRoot$$Sections)
+   .ANY (+RO)
+  }
+  RW_IRAM1 0x20000000 0x00028000  {  ; RW data
+   .ANY (+RW +ZI)
+  }
+}
+

+ 1 - 1
bsp/nuvoton_m487/rtconfig.py

@@ -3,7 +3,7 @@ import os
 # toolchains options
 # toolchains options
 ARCH='arm'
 ARCH='arm'
 CPU='cortex-m4'
 CPU='cortex-m4'
-CROSS_TOOL='gcc'
+CROSS_TOOL='keil'
 
 
 if os.getenv('RTT_CC'):
 if os.getenv('RTT_CC'):
 	CROSS_TOOL = os.getenv('RTT_CC')
 	CROSS_TOOL = os.getenv('RTT_CC')

+ 3 - 3
bsp/nuvoton_nuc472/SConstruct

@@ -20,9 +20,9 @@ env = Environment(tools = ['mingw'],
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 
 
 if rtconfig.PLATFORM == 'iar':
 if rtconfig.PLATFORM == 'iar':
-	env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
-	env.Replace(ARFLAGS = [''])
-	env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map'])
+    env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
+    env.Replace(ARFLAGS = [''])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 3 - 3
bsp/qemu-vexpress-a9/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Project Configuration"
 mainmenu "RT-Thread Project Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 3 - 3
bsp/qemu-vexpress-gemini/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Project Configuration"
 mainmenu "RT-Thread Project Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 5 - 4
bsp/qemu-vexpress-gemini/SConstruct

@@ -13,11 +13,12 @@ from building import *
 TARGET = 'rtthread-vexpress.' + rtconfig.TARGET_EXT
 TARGET = 'rtthread-vexpress.' + rtconfig.TARGET_EXT
 
 
 env = Environment(tools = ['mingw'],
 env = Environment(tools = ['mingw'],
-	AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
-	CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
-	AR = rtconfig.AR, ARFLAGS = '-rc',
-	LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
+    AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
+    CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
+    AR = rtconfig.AR, ARFLAGS = '-rc',
+    LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
+env['ASCOM'] = env['ASPPCOM']
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 3 - 3
bsp/raspi2/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Project Configuration"
 mainmenu "RT-Thread Project Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 5 - 4
bsp/realview-a8/SConstruct

@@ -13,11 +13,12 @@ from building import *
 TARGET = 'rtthread-realview.' + rtconfig.TARGET_EXT
 TARGET = 'rtthread-realview.' + rtconfig.TARGET_EXT
 
 
 env = Environment(tools = ['mingw'],
 env = Environment(tools = ['mingw'],
-	AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
-	CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
-	AR = rtconfig.AR, ARFLAGS = '-rc',
-	LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
+    AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
+    CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
+    AR = rtconfig.AR, ARFLAGS = '-rc',
+    LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
 env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
+env['ASCOM'] = env['ASPPCOM']
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 3 - 3
bsp/simulator/Kconfig

@@ -1,16 +1,16 @@
 mainmenu "RT-Thread Configuration"
 mainmenu "RT-Thread Configuration"
 
 
-config $BSP_DIR
+config BSP_DIR
     string
     string
     option env="BSP_ROOT"
     option env="BSP_ROOT"
     default "."
     default "."
 
 
-config $RTT_DIR
+config RTT_DIR
     string
     string
     option env="RTT_ROOT"
     option env="RTT_ROOT"
     default "../.."
     default "../.."
 
 
-config $PKGS_DIR
+config PKGS_DIR
     string
     string
     option env="PKGS_ROOT"
     option env="PKGS_ROOT"
     default "packages"
     default "packages"

+ 39 - 0
bsp/stm32/README.md

@@ -0,0 +1,39 @@
+# STM32 BSP 说明
+
+STM32 系列 BSP 目前支持情况如下表所示:
+
+| BSP 文件夹名称       | 开发板名称                 |
+|:------------------------- |:-------------------------- |
+| **F0 系列** |  |
+| [stm32f091-st-nucleo](stm32f091-st-nucleo) | ST 官方 stm32f091-nucleo 开发板 |
+| **F1 系列** |  |
+| [stm32f103-atk-nano](stm32f103-atk-nano)        | 正点原子 F103 NANO 开发板  |
+| [stm32f103-dofly-lyc8](stm32f103-dofly-lyc8) | 德飞莱 STM32F103 开发板 |
+| [stm32f103-fire-arbitrary](stm32f103-fire-arbitrary/)  | 野火 F103 霸道开发板     |
+| [stm32f103-hw100k-ibox](stm32f103-hw100k-ibox) | STM32F103 硬件十万个为什么 iBox 开发板 |
+| **F4 系列** |  |
+| [stm32f407-st-discovery](stm32f407-st-discovery) | ST 官方 stm32f407-discovery 开发板 |
+| [stm32f407-atk-explorer](stm32f407-atk-explorer) | 正点原子 F407 探索者开发板 |
+| [stm32f411-st-nucleo](stm32f411-st-nucleo/) | ST 官方 STM32F411-Nucleo-64 开发板 |
+| [stm32f429-atk-apollo](stm32f429-atk-apollo)      | 正点原子 F429 阿波罗开发板 |
+| [stm32f429-fire-challenger](stm32f429-fire-challenger/) | 野火 F429 挑战者开发板     |
+| [stm32f429-armfly-v6](stm32f429-armfly-v6) | 安富莱 f429-v6 开发板 |
+| [stm32f446-st-nucleo](stm32f446-st-nucleo) | ST 官方 stm32f446-nucleo 开发板 |
+| **F7 系列** |  |
+| [stm32f746-st-disco](stm32f746-st-disco) | ST 官方 STM32F746-discovery 开发板 |
+| [stm32f767-atk-apollo](stm32f767-atk-apollo) | 正点原子 F767 阿波罗开发板 |
+| [stm32f767-fire-challenger](stm32f767-fire-challenger/) | 野火 F767 挑战者开发板 |
+| [stm32f767-st-nucleo](stm32f767-st-nucleo) | ST 官方 STM32F767-nucleo 开发板 |
+| **L4 系列** |  |
+| [stm32l432-st-nucleo](stm32l432-st-nucleo) | ST 官方 STM32L432-nucleo 开发板 |
+| [stm32l475-atk-pandora](stm32l475-atk-pandora/) | 正点原子 L475 潘多拉 IoT 开发板    |
+
+可以通过阅读相应 BSP 下的 README 来快速上手,如果想要使用 BSP 更多功能可参考 docs 文件夹下提供的说明文档,如下表所示:
+
+| **BSP 使用教程** | **简介**                                          |
+|:-------------------- |:------------------------------------------------- |
+| [外设驱动使用教程](docs/STM32系列BSP外设驱动使用教程.md) | 讲解 BSP 上更多外设驱动的使用方法 |
+| [外设驱动介绍与应用](docs/STM32系列驱动介绍.md) | 讲解 STM32 系列 BSP 驱动的支持情况,以及如何利用驱动框架开发应用程序 |
+| **BSP 制作与提交** | **简介**                                     |
+| [BSP 制作教程](docs/STM32系列BSP制作教程.md) | 讲解 STM32 系列 BSP 的制作方法,以及在制作 BSP 和提交 BSP 时应当遵守的规范,视频教程请观看 :[《RT-Thread STM32 系列 BSP 制作视频教程》](https://url.cn/5qqxJMU?sf=uri) |
+| [外设驱动添加指南](docs/STM32系列外设驱动添加指南.md) | 讲解 BSP 添加更多设备驱动的方法 |

+ 280 - 0
bsp/stm32/docs/STM32系列BSP制作教程.md

@@ -0,0 +1,280 @@
+# STM32 系列 BSP 制作教程
+
+为了让广大开发者更好、更方便地使用 BSP 进行开发,RT-Thread 开发团队重新整理了现有的 STM32 系列的 BSP,推出了新的 BSP 框架。新的 BSP 框架在易用性、移植便利性、驱动完整性、代码规范性等方面都有较大提升,在新的 BSP 框架下进行开发,可以大大提高应用的开发效率。
+
+和 RT-Thread 以往提供的 BSP 不同,在新的 BSP 文件夹中将不会包含固件库、外设驱动等可以被多个 BSP 引用的代码文件。而是将这些通用的文件统一存放在 Library 文件夹中,通过在特定 BSP 中引用这些文件的方式,来包含 BSP 中所需的库文件或者驱动文件。这种方式不仅大大提高了代码复用率,降低了 BSP 的维护成本,而且可以更方便地给开发者提供更丰富的驱动文件,让开发者可以更容易地找到自己需要的资源。
+
+新的 BSP 框架还引入了 CubeMX 工具,可以使用该工具来对 BSP 中使用的外设引脚进行配置。CubeMX 工具提供了图形化的配置界面,这种图形化的配置方式对开发者来说更加直观,不仅可以让开发者灵活地配置 BSP 中使用的资源,并且可以让开发者对资源的使用情况一目了然。
+
+新 BSP 框架的主要特性如下:
+
+- 提供多系列 BSP 模板,大大降低新 BSP 的添加难度;
+- 每个 BSP 都配有齐全的驱动文件,开发者可以方便地使用所有驱动;
+- 开发者可以使用 CubeMX 工具对 BSP 进行图形化配置;
+
+## 1. BSP 框架介绍 
+
+BSP 框架结构如下图所示:
+
+![BSP 框架图](./figures/frame.png)
+
+每一个 STM32 系列的 BSP 由三部分组成,分别是通用库、BSP 模板和特定开发板 BSP,下面的表格以 F1 系列 BSP 为例介绍这三个部分:
+
+|项目|文件夹|说明|
+| - | - | :-- |
+| 通用库 | stm32/libraries | 用于存放 HAL 库以及基于 HAL 库的多系列通用外设驱动文件 |
+| F1 系列 BSP 工程模板 | stm32/libraries/templates/stm32f10x | F1系列 BSP 模板,可以通过修改该模板制作更多 F1系列 BSP |
+| 特定开发板 BSP | stm32/stm32f103-atk-nano | 在 BSP 模板的基础上修改而成 |
+
+## 2. 知识准备
+
+制作一个 BSP 的过程就是构建一个新系统的过程,因此想要制作出好用的 BSP,要对 RT-Thread 系统的构建过程有一定了解,需要的知识准备如下所示:
+
+- 掌握  stm32 系列 BSP 的使用方法
+
+  了解 BSP 的使用方法,可以阅读 [BSP 说明文档](../README.md) 中使用教程表格内的文档。了解外设驱动的添加方法可以参考《外设驱动添加指南》。
+
+- 了解 scons 工程构建方法
+
+  RT-Thread 使用 scons 作为系统的构建工具,因此了解 scons 的常用命令对制作新 BSP 是基本要求。
+
+- 了解设备驱动框架
+
+  在 RT-Thread 系统中,应用程序通过设备驱动框架来操作硬件,因此了解设备驱动框架,对添加 BSP 驱动是很重要的。
+
+- 了解 kconfig 语法
+
+  RT-Thread 系统通过 menuconfig 的方式进行配置,而 menuconfig 中的选项是由 kconfig 文件决定的,因此想要对 RT-Thread 系统进行配置,需要对 kconfig 语法有一定了解。
+
+- 熟悉 CubeMX 工具的使用
+
+  在新的 stm32 系列 BSP 中利用了 CubeMX 工具对底层硬件进行配置,因此需要了解 CubeMX 工具的使用方法。
+
+## 3. BSP 制作方法
+
+本节以制作正点原子 `stm32f103-atk-nano` 开发板的 BSP 为例,讲解如何为一个新的开发板添加 BSP。
+
+BSP 的制作过程分为如下五个步骤:
+
+1. 复制通用模板
+2. 使用 CubeMX 工具配置工程
+3. 修改 BSP 中的 Kconfig 文件
+4. 修改构建工程相关文件
+5. 重新生成工程
+
+在接下来的章节中将会详细介绍这五个步骤,帮助开发者快速创建所需要的 BSP。
+
+### 3.1 复制通用模板
+制作新 BSP 的第一步是复制一份同系列的 BSP 模板作为基础,通过对 BSP 模板的修改来获得新 BSP。目前提供的 BSP 模板系列如下表所示:
+
+| 工程模板 | 说明 |
+| ------- | ---- |
+| libraries/templates/stm32f0xx | F0 系列 BSP 模板 |
+| libraries/templates/stm32f10x | F1 系列 BSP 模板 |
+| libraries/templates/stm32f4xx | F4 系列 BSP 模板 |
+| libraries/templates/stm32f7xx | F7 系列 BSP 模板 |
+| libraries/templates/stm32l4xx | L4 系列 BSP 模板 |
+
+本次示例所用的 F1 系列 BSP 模板文件夹结构如下所示:
+
+![F1 系列 BSP 模板文件夹内容](figures/bsp_template_dir.png)
+
+本次制作的 BSP 为 F1 系列,因此拷贝模板文件夹下的 `stm32f10x` 文件夹,并将该文件夹的名称改为 `stm32f103-atk-nano` ,如下图所示:
+
+![复制通用模板](./figures/copy.png)
+
+在接下来的 BSP 的制作过程中,将会修改 board 文件夹内的配置文件,将 F1 系列的 BSP 模板变成一个适用于正点原子 `stm32f103-atk-nano` 开发板的 BSP ,下表总结了 board 文件夹中需要修改的内容:
+
+| 项目 | 需要修改的内容说明 |
+|-------------|-------------------------------------------------------|
+| CubeMX_Config (文件夹)| CubeMX 工程 |
+| linker_scripts (文件夹)| BSP 特定的链接脚本 |
+|board.c/h | 系统时钟、GPIO 初始化函数、芯片存储器大小 |
+| Kconfig | 芯片型号、系列、外设资源 |
+| SConscript | 芯片启动文件、目标芯片型号 |
+
+### 3.2 使用 CubeMX 配置工程
+
+在制作 BSP 的第二步,需要创建一个基于目标芯片的 CubeMX 工程。默认的 CubeMX 工程在 **CubeMX_Config** 文件夹中,双击打开 `CubeMX_Config.ioc` 工程,如下图所示:
+
+![open_cubemx](figures/open_cubemx.png)
+
+在 CubeMX 工程中将芯片型号为修改芯片型号为 STM32F103RBTx 。
+
+#### 3.2.1 生成 CubeMX 工程
+
+配置系统时钟、外设引脚等,步骤如下图所示:
+
+1. 打开外部时钟、设置下载方式、打开串口外设(注意只需要选择串口外设引脚即可,无需配置其他参数):
+
+![配置芯片引脚](./figures/CubeMX_1.png)
+
+2. 配置系统时钟:
+
+![配置系统时钟](./figures/CubeMX_2.png)
+
+3. 设置项目名称,并在指定地址重新生成 CubeMX 工程:
+
+![生成对应的配置代码](./figures/CubeMX_4.png)
+
+最终 CubeMX 生成的工程目录结构如下图所示:
+
+![CubeMX 图7](./figures/CubeMX_5.png)
+
+#### 3.2.2 拷贝初始化函数
+
+在 **board.c** 文件中存放了函数 `SystemClock_Config()` ,该函数负责初始化系统时钟。当使用 CubeMX 工具对系统时钟重新配置的时候,需要更新这个函数。
+
+该函数由 CubeMX 工具生成,默认存放在`board/CubeMX_Config/Src/main.c` 文件中。但是该文件并没有被包含到我们的工程中,因此需要将这个函数从 main.c 中拷贝到 board.c 文件中。在整个 BSP 的制作过程中,这个函数是唯一要要拷贝的函数,该函数内容如下所示:
+
+![board_1](./figures/board_1.png)
+
+在 **board.h** 文件中配置了 FLASH 和 RAM 的相关参数,这个文件中需要修改的是 `STM32_FLASH_SIZE` 和 `STM32_SRAM_SIZE` 这两个宏控制的参数。本次制作的 BSP 所用的 STM32F103RBTx 芯片的 flash 大小为 128k,ram 的大小为 20k,因此对该文件作出如下的修改:
+
+![修改 board.h](./figures/board_h.png)
+
+### 3.3 修改 Kconfig 选项
+
+在本小节中修改 `board/Kconfig` 文件的内容有如下两点:
+
+- 芯片型号和系列
+- BSP 上的外设支持选项
+
+芯片型号和系列的修改如下表所示:
+
+| 宏定义             | 意义     | 格式               |
+| ------------------ | -------- | ------------------ |
+| SOC_STM32F103RB    | 芯片型号 | SOC_STM32xxx       |
+| SOC_SERIES_STM32F1 | 芯片系列 | SOC_SERIES_STM32xx |
+
+关于 BSP 上的外设支持选项,一个初次提交的 BSP 仅仅需要支持 GPIO 驱动和串口驱动即可,因此在配置选项中只需保留这两个驱动配置项,如下图所示:
+
+![修改 Kconfig](./figures/Kconfig.png)
+
+### 3.4 修改工程构建相关文件
+接下来需要修改用于构建工程相关的文件。
+
+#### 3.4.1 修改链接脚本
+**linker_scripts** 链接文件如下图所示:
+
+![需要修改的链接脚本](./figures/linker_scripts.png)
+
+下面以 MDK 使用的链接脚本 link.sct 为例,演示如何修改链接脚本:
+
+![linkscripts_change](figures/linkscripts_change.png)
+
+本次制作 BSP 使用的芯片为 STM32F103RB,FLASH 为 128k,因此修改 LR_IROM1 和 ER_IROM1 的参数为 0x00020000。RAM 的大小为20k, 因此修改 RW_IRAM1 的参数为 0x00005000。这样的修改方式在一般的应用下就够用了,后续如果有特殊要求,则需要按照链接脚本的语法来根据需求修改。
+
+其他两个链接脚本的文件分别为 iar 使用的 link.icf 和 gcc 编译器使用的 link.lds,修改的方式也是类似的,如下图所示:
+
+- link.icf 修改内容
+
+  ![link_icf](figures/link_icf.png)
+
+- link.lds 修改内容
+
+  ![link_lds](figures/link_lds.png)
+
+
+####  3.4.2 修改构建脚本
+
+**SConscript** 脚本决定 MDK/IAR 工程的生成以及编译过程中要添加文件。
+
+在这一步中需要修改芯片型号以及芯片启动文件的地址,修改内容如下图所示:
+
+![修改启动文件和芯片型号](./figures/SConscript.png)
+
+注意:如果在文件夹中找不到相应系列的 .s 文件,可能是多个系列的芯片重用了相同的启动文件,此时可以在 CubeMX 中生成目标芯片的工程,查看使用了哪个启动文件,然后再修改启动文件名。
+
+#### 3.4.3 修改工程模板
+
+**template** 文件是生成 MDK/IAR 工程的模板文件,通过修改该文件可以设置工程中使用的芯片型号以及下载方式。MDK4/MDK5/IAR 的工程模板文件,如下图所示:
+
+![MDK/IAR 工程模板](./figures/template_1.png)
+
+下面以 MDK5 模板的修改为例,介绍如何修改模板配置:
+
+![选择芯片型号](./figures/template_2.png)
+
+修改程序下载方式:
+
+![配置下载方式](./figures/template_3.png)
+
+### 3.5 重新生成工程
+
+重新生成工程需要使用 env 工具。
+
+#### 3.5.1 重新生成 rtconfig.h 文件
+
+在 env 界面输入命令 menuconfig 对工程进行配置,并生成新的 rtconfig.h 文件。如下图所示:
+
+![输入menuconfig进入配置界面](./figures/menuconfig_1.png)
+
+![选择要打开的外设](./figures/menuconfig_2.png)
+
+#### 3.5.2 重新 MDK/IAR 工程
+下面以重新生成 MDK 工程为例,介绍如何重新生成 BSP 工程。
+
+使用 env 工具输入命令 `scons --target=mdk5` 重新生成工程,如下图所示:
+
+![重新生成 BSP 工程](./figures/menuconfig_3.png)
+
+重新生成工程成功:
+
+![重新生成 BSP 工程](./figures/menuconfig_4.png)
+
+到这一步为止,新的 BSP 就可以使用了。
+
+接下来我们可以分别使用命令 `scons --target=mdk4` 和 `scons --target=iar`,来更新 mdk4 和 iar 的工程,使得该 BSP 变成一个完整的,可以提交到 GitHub 的 BSP。
+
+感谢每一位贡献代码的开发者,RT-Thread 将与你一同成长。
+
+## 4. 规范
+
+本章节介绍 RT-Thread STM32 系列 BSP 制作与提交时应当遵守的规范 。开发人员在 BSP 制作完成后,可以根据本规范提出的检查点对制作的 BSP 进行检查,确保 BSP 在提交前有较高的质量 。
+
+### 1. BSP 制作规范
+
+STM32 BSP 的制作规范主要分为 3 个方面:工程配置,ENV 配置和 IDE 配置。在已有的 STM32 系列 BSP 的模板中,已经根据下列规范对模板进行配置。在制作新 BSP 的过程中,拷贝模板进行修改时,需要注意的是不要修改这些默认的配置。BSP 制作完成后,需要对新制作的 BSP 进行功能测试,功能正常后再进行代码提交。
+
+下面将详细介绍 BSP 的制作规范。
+
+#### 工程配置
+
+- 遵从RT-Thread 编码规范,代码注释风格统一
+- main 函数功能保持一致
+  - 如果有 LED 的话,main 函数里**只放一个**  LED 1HZ 闪烁的程序
+- 在 `rt_hw_board_init` 中需要完成堆的初始化:调用 `rt_system_heap_init`
+- 默认只初始化 GPIO 驱动和 FinSH 对应的串口驱动,不使用 DMA
+- 当使能板载外设驱动时,应做到不需要修改代码就能编译下载使用
+- 提交前应检查 gcc/mdk/iar 三种编译器直接编译或者重新生成后编译是否成功
+- 使用 dist 功能对 BSP 进行发布,检查使用 dist 命令生成的工程是否可以正常使用
+
+#### ENV 配置
+
+- 系统心跳统一设置为 1000(宏:RT_TICK_PER_SECOND)
+- BSP 中需要打开调试选项中的断言(宏:RT_DEBUG)
+- 系统空闲线程栈大小统一设置为 256(宏:IDLE_THREAD_STACK_SIZE)
+- 开启组件自动初始化(宏:RT_USING_COMPONENTS_INIT)
+- 需要开启 user main 选项(宏:RT_USING_USER_MAIN)
+- 默认关闭 libc(宏:RT_USING_LIBC)
+- FinSH 默认只使用 MSH 模式(宏:FINSH_USING_MSH_ONLY)
+
+#### IDE 配置
+
+- 使能下载代码后自动运行
+- 使能 C99 支持
+- 使能 One ELF Setion per Function(MDK)
+- keil/iar 生成的临时文件分别放到build下的 keil/iar 文件夹下
+- mdk/gcc/iar 生成 bin 文件名字统一成 rtthread.bin
+
+### 2. BSP 提交规范
+
+- 提交前请认真修改 BSP 的 README.md 文件,README.md 文件的外设支持表单只填写 BSP 支持的外设,可参考其他 BSP 填写。查看文档[《STM32系列驱动介绍》](./STM32系列驱动介绍.md)了解驱动分类。
+- 提交 BSP 分为 2 个阶段提交:
+  - 第一阶段:基础 BSP 包括串口驱动和 GPIO 驱动,能运行 FinSH 控制台。完成 MDK4、MDK5 、IAR 和 GCC 编译器支持,如果芯片不支持某款编译器(比如MDK4)可以不用做。 BSP 的 README.md 文件需要填写第二阶段要完成的驱动。
+  - 第二阶段:完成板载外设驱动支持,所有板载外设使用 menuconfig 配置后就能直接使用。若开发板没有板载外设,则此阶段可以不用完成。不同的驱动也要分开提交,方便 review 和合并。
+- 只提交 BSP 必要的文件,删除无关的中间文件,能够提交的文件请对照其他 BSP。
+- 提交 stm32 不同系列的 Library 库时,请参考 f1/f4 系列的 HAL 库,删除多余库文件
+- 提交前要对 BSP 进行编译测试,确保在不同编译器下编译正常
+- 提交前要对 BSP 进行功能测试,确保 BSP 的在提交前符合工程配置章节中的要求

+ 87 - 0
bsp/stm32/docs/STM32系列BSP外设驱动使用教程.md

@@ -0,0 +1,87 @@
+# BSP 外设驱动使用教程
+
+## 简介
+
+本文档是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。
+
+主要包括以下内容:
+
+1. 如何使用开发板上更多的板载资源
+2. 如何使用更多的片上资源
+3. 如何添加更多片上资源选项
+
+## 前提要求
+
+- 学会如何使用 ENV 工具,参考:[RT-Thread env 工具用户手册](https://www.rt-thread.org/document/site/rtthread-development-guide/rtthread-tool-manual/env/env-user-manual/)
+
+## 如何使用更多的板载资源
+
+开发板上一般有很多板载资源,如 Flash、SD卡、以太网等,但是 BSP 工程默认没有开启这些外设驱动。RT-Thread 提供了 ENV 工具来开启或关闭 BSP 的外设驱动。下面以在正点原子阿波罗 F429 开发板上开启 SPI Flash 驱动为例,一步步的展示如何使用 ENV 工具对 BSP 进行配置。
+
+### 1)打开配置工具
+
+在目录 `rt-thread\bsp\stm32\stm32f429-atk-apollo` 下打开 menuconfig 配置界面。
+
+![打开 menuconfig](figures/menuconfig_apolo.png)
+
+打开的配置工具界面如下所示:
+
+![RT-Thread 配置菜单](figures/config1.png)
+
+通过键盘上的上下键移动光标,选中 `Hardware Drivers Config`然后按回车键进入硬件驱动配置菜单。
+
+### 2)进入硬件驱动配置菜单
+
+在硬件配置菜单里有三个选项,分别是 **板载外设配置菜单**、**片上外设配置菜单**和**扩展模块配置菜单**,按回车键进入板载外设配置菜单。
+
+![硬件驱动 配置菜单](figures/config2.png)
+
+### 3)在板载外设配置菜单里开启 SPI Flash 选项
+
+![板载外设 配置菜单](figures/spi_flash.png)
+
+### 4)保存退出
+
+然后右移光标选中 Save 按回车键保存,然后按 Esc 键退出配置工具。
+
+![保存退出](figures/save.png)
+
+### 5)更新软件包
+
+输入命令 `pkgs --update` 使软件包配置生效。
+
+![1543477036034](figures/update.png)
+
+### 6)生成 MDK5 工程
+
+输入命令 `scons --target=mdk5 -s` 重新生成 MDK5 的工程。
+
+![1543477194829](figures/scons_mdk5.png)
+
+### 7)编译下载
+
+打开生成的 MDK5 工程文件,编译并下载。
+
+![1543478492157](figures/complise.png)
+
+### 8)查看运行结果
+
+程序运行后,输入命令 `list_device` 可以看到名为 W25Q256 的块设备,此时 `SPI Flash` 设备已经可以使用了。
+
+![1543478742034](figures/run_flash.png)
+
+## 如何使用更多的片上资源
+
+如果想要使用除了当前支持的片上资源(GPIO 和 UART1),又不想开启板载资源的支持,可以通过直接配置 **片上外设配置菜单** 的方式,使用更多片上资源。
+
+配置方法和上一章节介绍的 **如何使用更多的板载资源的配置方法** 一样,只是本次需要进入 `片上外设配置菜单`。
+
+![1543481275711](figures/on_chip_config.png)
+
+配置完成后重新生成工程,编译下载,在 FinSH 控制台输入 `list_device` 命令,可以看到 I2C1 总线已经启用。
+
+![i2c_device](figures/i2c_device.png)
+
+## 总结
+
+当开发者需要使用未开启的外设时,只要在 ENV 工具中使能相关的外设即可,重新生成的工程中就会添加对应的驱动文件。开发者就可以利用 RT-Thread 提供的驱动开快速开发应用了。

+ 98 - 0
bsp/stm32/docs/STM32系列外设驱动添加指南.md

@@ -0,0 +1,98 @@
+# STM32 系列外设驱动添加指南
+
+## 1. 简介
+
+本文档是为需要给现有的 STM32 BSP 添加更多外设驱动的开发者准备的。通过阅读本文,开发者可以按照自己的实际情况给现有 BSP 添加自己需要的驱动。
+
+## 2. 前提要求
+
+- 熟练使用 ENV 工具,参考:[RT-Thread env 工具用户手册](https://www.rt-thread.org/document/site/rtthread-development-guide/rtthread-tool-manual/env/env-user-manual/)
+- 熟悉 Kconfig 语法
+- 熟悉 STM32CubeMX 工具
+- 对 RT-Thread 设备驱动框架有一定了解
+
+## 3. 如何添加更多的外设驱动选项
+
+本章节以添加片上外设驱动为例,讲解如何为 BSP 添加更多可用驱动。如果想使用的片上外设是 `片上外设配置菜单` 里没有的,就需要开发者自己添加了。下面我们将演示如何为 stm32f429-atk-apollo BSP 添加 SPI3 驱动。
+
+> 没有安装 stm32cubemx 软件的可以访问 STM32cube中文网:<http://www.stm32cube.com/> ,在 `资源下载` 里下载 stm32cubemx 软件。
+
+阿波罗 BSP 默认只支持 SPI1、SPI2 和 SPI5,是不支持 SPI3 的。开发者如果需要使用 SPI3,则需要自己添加。
+
+![spi_config](figures/spi_config.png)
+
+添加 SPI3 的外设支持需要以下几步:
+
+### 1)打开 STM32CubeMX 工程
+
+打开 BSP 的 STM32CubeMX 配置文件。
+
+![1543486779576](figures/cubemx.png)
+
+### 2)按原理图配置 SPI3 的引脚,并生成代码
+
+按图示顺序配置 SPI3,并生成代码。
+
+![1543487684698](figures/cube_spi3.png)
+
+> 为 BSP 添加驱动时,STM32CubeMX 工具可以快速的完成**使能外设**和**配置管脚**的工作。而外设初始化,中断配置,DMA配置等等则由 RT-Thread 提供的驱动文件来完成。也就是说,虽然 STM32CubeMX 生成了多个文件用来初始化外设,但 RT-Thread 只使用了 STM32CubeMX  生成的 `stm32fxx_hal_msp.c` 文件和 `stm32fxx_hal_conf.h` 文件。
+>
+> 对于不同的外设驱动,通过 STM32CubeMX 工具配置的内容也不一样。开发者可以参考本文档的附录 CubeMX 配置说明章节来了解不同外设的配置方法。
+
+### 3)修改 Kconfig 文件
+
+打开 board 文件夹下的 Konfig 文件,拷贝 SPI2 的配置项,并重命名 SPI2 为 SPI3。
+
+![1543542657074](figures/Kconfig2.png)
+
+### 4)重新配置工程
+
+经过上一步的修改,此时重新打开 ENV 工具,在 menuconfig 中就会出现添加的 SPI3 的配置项。
+
+![1543543081284](figures/config5.png)
+
+### 5)生成工程,检查驱动文件
+
+使用 ENV 重新生成工程并打开,检查原有驱动文件是否支持新添加的驱动(查看是否有新驱动的配置文件,中断函数,DMA配置和中断函数等等),如不支持,需参考现有驱动添加相关的代码。
+
+![spi_code](figures/spi_code.png)
+
+### 6)编译下载
+
+检查完工程后,编译下载到开发板,程序会自动开始运行。输入 `list_device` 命令,可以看到 spi3 总线已经注册到内核,说明驱动已经添加成功。
+
+![1543543446786](figures/run_spi3.png)
+
+
+## 4. 注意事项
+
+- 部分驱动如果没有适配 BSP 所属的 STM32 系列,请等待 RT-Thread 团队更新。
+  - 驱动文件对 STM32 系列的支持情况可以查看 [STM32系列驱动介绍文档](STM32系列驱动介绍文档.md)。
+- 对于驱动文件或文档说明,有任何建议或者意见,欢迎反馈到 [RT_Thread GitHub](https://github.com/RT-Thread/rt-thread) 网站或 [RT-Thread 官方论坛](https://www.rt-thread.org/qa/forum.php)。
+
+## 5. 附录
+
+### 5.1 CubeMX配置说明
+
+本小节介绍 stm32 系列的 BSP 是如何利用 CubeMX 工具对 BSP 进行配置的。
+
+就像文档中提到的那样,stm32 系列的 BSP 只利用了  CubeMX 工具生成的  `stm32XXxx_hal_conf.h` 和 `stm32XXxx_hal_msp.c` 文件。在 HAL 库中, `stm32XXxx_hal_conf.h` 文件里提供的宏开关会决定 HAL 库将哪些外设驱动添加到工程中。 而`stm32XXxx_hal_msp.c` 文件中则存放了在 CubeMX 工具中开启的外设驱动的配置代码。
+
+### 5.2 外设配置总结
+
+当开发者想要在 BSP 中添加更多驱动时,需要使用 CubeMX 工具来配置这些外设。对于绝大多数驱动的配置,只需要在工具中使能相应的外设即可。但是对于一些复杂的外设,则需要更多的配置内容。下表展示了不同驱动在 CubeMX 工具配置步骤的总结:
+
+| 序号 | 驱动     | CubeMx 工程中的配置情况(**加粗部分为必做步骤**)            |
+| :--: | :------- | :----------------------------------------------------------- |
+|  1   | GPIO     | 无需任何操作                                                 |
+|  2   | UART     | **开启该外设** ,然后配置所需要的引脚(或者使用默认引脚)    |
+|  3   | SPI      | **开启该外设** ,然后配置所需要的引脚(或者使用默认引脚)    |
+|  4   | I2C      | 依赖于PIN 驱动,无需任何操作                                 |
+|  5   | TIMER    | **使能 internal Clock 时钟**                                 |
+|  7   | PWM      | **首先使能 internal Clock 时钟,然后为 channelx 选项选择PWM Generation CHx,** 最后配置所需要的引脚(或者使用默认引脚) |
+|  8   | ADC      | **开启该外设,然后选择使用的通道**                           |
+|  9   | RTC      | **开启该外设,然后在时钟树状图里将 RTC 选择为 LSE 时钟**     |
+|  10  | Watchdog | **开启该外设**                                               |
+|  11  | EMAC     | **配置 ETH 外设的工作模式(一般为 RMII 模式)**              |
+|  12  | SDRAM    | **需要根据板载的 SDRAM 型号配置片选脚,地址线,数据线等**    |
+

+ 63 - 0
bsp/stm32/docs/STM32系列驱动介绍.md

@@ -0,0 +1,63 @@
+#  外设驱动介绍与应用
+
+在 RT-Thread 实时操作系统中,各种各样的设备驱动是通过一套  I/O 设备管理框架来管理的。设备管理框架给上层应用提供了一套标准的设备操作 API,开发者通过调用这些标准设备操作 API,可以高效地完成和底层硬件外设的交互。设备管理框架的结构如下图所示:
+
+![rt_device](figures/rt_device.png)
+
+使用 I/O 设备管理框架开发应用程序,有如下优点:
+
+- 使用同一套标准的 API 开发应用程序,使应用程序具有更好的移植性
+- 底层驱动的升级和修改不会影响到上层代码
+- 驱动和应用程序相互独立,方便多个开发者协同开发
+
+## 1. 驱动分类介绍
+
+本小节介绍 BSP 提供的不同类别驱动的概念,对一个 BSP 而言,有如下三类驱动:
+
+- **板载外设驱动**:指 MCU 之外,开发板上外设,例如 TF 卡、以太网和 LCD 等
+- **片上外设驱动**:指 MCU 芯片上的外设,例如硬件定时器、ADC 和看门狗等
+- **扩展模块驱动**:指可以通过扩展接口或者杜邦线连接的开发板的模块,例如 ESP8266 模块
+
+这三种外设的示意图如下所示:
+
+![Peripheral](figures/Peripheral.png)
+
+## 2. 外设驱动的使用方法
+
+当前 RT-Thread 提供的驱动库已经支持 STM32 多个系列的 BSP。点击下表中的驱动名称,即可跳转到对应驱动框架的介绍文档。开发者可以通过阅读相关资料,了解如何在应用开发中通过设备驱动框架来使用这些外设驱动。
+
+### 2.1 片上外设
+
+| 序号 | 驱动                                                         | 简介                                             |
+| ---- | ------------------------------------------------------------ | ------------------------------------------------ |
+| 1    | [GPIO](https://www.rt-thread.org/document/site/rtthread-application-note/driver/gpio/an0002-rtthread-driver-gpio/) | 操作 GPIO 管脚                                   |
+| 2    | UART                                                         | 通过串口收发数据                                 |
+| 3    | soft I2C                                                     | 通过软件 I2C 收发数据                            |
+| 4    | SPI                                                          | 通过 SPI 收发数据                                |
+| 5    | ADC                                                          | 测量管脚上的模拟量                               |
+| 6    | SDIO                                                         | 通过 SDIO 读写数据                               |
+| 7    | TIMER                                                        | 使用硬件定时器实现测量时间和定时执行回调函数功能 |
+| 8    | PWM                                                          | 在特定的管脚输出 PWM 波形                        |
+| 9    | RTC                                                          | 设置和读取时间                                   |
+| 10   | WDT                                                          | 看门狗驱动                                       |
+| 11   | QSPI                                                         | 通过 SPI(1、2、4线) 收发数据                   |
+
+### 2.2 板载外设
+
+| 序号 | 驱动    | 简介                                    |
+| ---- | ------- | --------------------------------------- |
+| 1    | SD      | 适用于 SPI 接口或 SDIO 接口的 SD(TF) 卡 |
+| 2    | ETH PHY | 以太网                                  |
+| 3    | USB PHY | USB                                     |
+| 4    | LCD     | 显示屏                                  |
+
+### 2.3 扩展模块
+
+| 序号 | 驱动     | 简介                   |
+| ---- | -------- | ---------------------- |
+| 1    | ESP8266  | 串口转 WIFI 模块       |
+| 2    | ENC28J60 | SPI 接口的以太网控制器 |
+
+### 2.4 驱动示例代码
+
+在 RT-Thread 的 `examples\test` 目录下,有 RT-Thread 提供的基于不同外设驱动的示例代码。在 env 工具中开启 BSP 中要测试的驱动,并将 `examples\test` 中对应的驱动框架测试文件加入工程,即可快速测试 BSP 中提供的驱动。

BIN
bsp/stm32/docs/figures/CubeMX_1.png


BIN
bsp/stm32/docs/figures/CubeMX_2.png


BIN
bsp/stm32/docs/figures/CubeMX_3.png


BIN
bsp/stm32/docs/figures/CubeMX_4.png


BIN
bsp/stm32/docs/figures/CubeMX_5.png


BIN
bsp/stm32/docs/figures/Kconfig.png


BIN
bsp/stm32/docs/figures/Kconfig2.png


BIN
bsp/stm32/docs/figures/Peripheral.png


BIN
bsp/stm32/docs/figures/SConscript.png


BIN
bsp/stm32/docs/figures/board_1.png


BIN
bsp/stm32/docs/figures/board_2.png


BIN
bsp/stm32/docs/figures/board_h.png


BIN
bsp/stm32/docs/figures/bsp_template_dir.png


BIN
bsp/stm32/docs/figures/complise.png


BIN
bsp/stm32/docs/figures/config.png


BIN
bsp/stm32/docs/figures/config1.png


BIN
bsp/stm32/docs/figures/config2.png


BIN
bsp/stm32/docs/figures/config3.png


BIN
bsp/stm32/docs/figures/config4.png


BIN
bsp/stm32/docs/figures/config5.png


BIN
bsp/stm32/docs/figures/copy.png


BIN
bsp/stm32/docs/figures/cube_spi3.png


BIN
bsp/stm32/docs/figures/cubemx.png


BIN
bsp/stm32/docs/figures/exit.png


BIN
bsp/stm32/docs/figures/frame.png


BIN
bsp/stm32/docs/figures/i2c_device.png


BIN
bsp/stm32/docs/figures/link_icf.png


BIN
bsp/stm32/docs/figures/link_lds.png


BIN
bsp/stm32/docs/figures/linker_scripts.png


BIN
bsp/stm32/docs/figures/linkscripts_change.png


BIN
bsp/stm32/docs/figures/menuconfig.png


BIN
bsp/stm32/docs/figures/menuconfig_1.png


BIN
bsp/stm32/docs/figures/menuconfig_2.png


BIN
bsp/stm32/docs/figures/menuconfig_3.png


BIN
bsp/stm32/docs/figures/menuconfig_4.png


BIN
bsp/stm32/docs/figures/menuconfig_apolo.png


BIN
bsp/stm32/docs/figures/on_chip_config.png


BIN
bsp/stm32/docs/figures/open_cubemx.png


BIN
bsp/stm32/docs/figures/rt_device.png


BIN
bsp/stm32/docs/figures/run_flash.png


BIN
bsp/stm32/docs/figures/run_spi3.png


BIN
bsp/stm32/docs/figures/save.png


Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff