Browse Source

Merge pull request #5115 from yanmowudi/master

update lib
Bernard Xiong 3 years ago
parent
commit
4f7d4247de
100 changed files with 15659 additions and 11632 deletions
  1. 312 75
      bsp/swm320-lq100/.config
  2. 3 5
      bsp/swm320-lq100/Kconfig
  3. 17 18
      bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/arm_common_tables.h
  4. 31 31
      bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/arm_const_structs.h
  5. 530 555
      bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/arm_math.h
  6. 361 380
      bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cm0.h
  7. 373 394
      bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cm0plus.h
  8. 762 778
      bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cm3.h
  9. 869 886
      bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cm4.h
  10. 1001 1018
      bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cm7.h
  11. 163 165
      bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cmFunc.h
  12. 200 210
      bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cmInstr.h
  13. 514 381
      bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cmSimd.h
  14. 716 109
      bsp/swm320-lq100/Libraries/CMSIS/DeviceSupport/SWM320.h
  15. 87 87
      bsp/swm320-lq100/Libraries/CMSIS/DeviceSupport/startup/arm/startup_SWM320.s
  16. 55 19
      bsp/swm320-lq100/Libraries/CMSIS/DeviceSupport/startup/iar/startup_SWM320.s
  17. 106 40
      bsp/swm320-lq100/Libraries/CMSIS/DeviceSupport/system_SWM320.c
  18. 12 8
      bsp/swm320-lq100/Libraries/CMSIS/DeviceSupport/system_SWM320.h
  19. 34 31
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_adc.c
  20. 10 16
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_adc.h
  21. 94 178
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_can.c
  22. 59 66
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_can.h
  23. 15 16
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_crc.c
  24. 15 18
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_crc.h
  25. 55 53
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_dma.c
  26. 10 13
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_dma.h
  27. 55 55
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_exti.c
  28. 11 13
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_exti.h
  29. 59 59
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_flash.c
  30. 12 2
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_flash.h
  31. 173 75
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_gpio.c
  32. 15 10
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_gpio.h
  33. 100 31
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_i2c.c
  34. 16 12
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_i2c.h
  35. 58 170
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_lcd.c
  36. 52 78
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_lcd.h
  37. 71 58
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_norflash.c
  38. 15 20
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_norflash.h
  39. 15 16
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_port.c
  40. 415 423
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_port.h
  41. 26 26
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_pwm.c
  42. 162 156
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_rtc.c
  43. 25 28
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_rtc.h
  44. 314 124
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_sdio.c
  45. 105 103
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_sdio.h
  46. 82 24
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_sdram.c
  47. 68 10
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_sdram.h
  48. 271 175
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_spi.c
  49. 38 33
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_spi.h
  50. 56 0
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_sram.c
  51. 29 0
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_sram.h
  52. 139 79
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_timr.c
  53. 20 14
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_timr.h
  54. 223 199
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_uart.c
  55. 34 39
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_uart.h
  56. 48 47
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_wdt.c
  57. 9 10
      bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_wdt.h
  58. 22 28
      bsp/swm320-lq100/README.md
  59. 4 1
      bsp/swm320-lq100/SConscript
  60. 7 6
      bsp/swm320-lq100/SConstruct
  61. 548 8
      bsp/swm320-lq100/applications/main.c
  62. 275 138
      bsp/swm320-lq100/drivers/Kconfig
  63. 31 35
      bsp/swm320-lq100/drivers/SConscript
  64. 40 14
      bsp/swm320-lq100/drivers/board.c
  65. 30 13
      bsp/swm320-lq100/drivers/board.h
  66. 217 0
      bsp/swm320-lq100/drivers/drv_adc.c
  67. 71 0
      bsp/swm320-lq100/drivers/drv_adc.h
  68. 226 0
      bsp/swm320-lq100/drivers/drv_crypto.c
  69. 40 0
      bsp/swm320-lq100/drivers/drv_crypto.h
  70. 342 413
      bsp/swm320-lq100/drivers/drv_gpio.c
  71. 22 3
      bsp/swm320-lq100/drivers/drv_gpio.h
  72. 190 196
      bsp/swm320-lq100/drivers/drv_hwtimer.c
  73. 88 3
      bsp/swm320-lq100/drivers/drv_hwtimer.h
  74. 0 70
      bsp/swm320-lq100/drivers/drv_i2c.c
  75. 0 16
      bsp/swm320-lq100/drivers/drv_i2c.h
  76. 0 77
      bsp/swm320-lq100/drivers/drv_iwg.c
  77. 0 16
      bsp/swm320-lq100/drivers/drv_iwg.h
  78. 27 0
      bsp/swm320-lq100/drivers/drv_log.h
  79. 33 78
      bsp/swm320-lq100/drivers/drv_nor_flash.c
  80. 7 0
      bsp/swm320-lq100/drivers/drv_nor_flash.h
  81. 176 133
      bsp/swm320-lq100/drivers/drv_pwm.c
  82. 151 3
      bsp/swm320-lq100/drivers/drv_pwm.h
  83. 99 111
      bsp/swm320-lq100/drivers/drv_rtc.c
  84. 6 3
      bsp/swm320-lq100/drivers/drv_rtc.h
  85. 664 0
      bsp/swm320-lq100/drivers/drv_sdio.c
  86. 42 0
      bsp/swm320-lq100/drivers/drv_sdio.h
  87. 197 0
      bsp/swm320-lq100/drivers/drv_soft_i2c.c
  88. 51 0
      bsp/swm320-lq100/drivers/drv_soft_i2c.h
  89. 154 135
      bsp/swm320-lq100/drivers/drv_spi.c
  90. 62 9
      bsp/swm320-lq100/drivers/drv_spi.h
  91. 29 25
      bsp/swm320-lq100/drivers/drv_sram.c
  92. 8 0
      bsp/swm320-lq100/drivers/drv_sram.h
  93. 170 146
      bsp/swm320-lq100/drivers/drv_uart.c
  94. 103 4
      bsp/swm320-lq100/drivers/drv_uart.h
  95. 88 0
      bsp/swm320-lq100/drivers/drv_wdt.c
  96. 31 0
      bsp/swm320-lq100/drivers/drv_wdt.h
  97. 37 0
      bsp/swm320-lq100/keilkill.bat
  98. 10 10
      bsp/swm320-lq100/project.ewd
  99. 2231 2289
      bsp/swm320-lq100/project.ewp
  100. 10 10
      bsp/swm320-lq100/project.eww

+ 312 - 75
bsp/swm320-lq100/.config

@@ -7,19 +7,27 @@
 # RT-Thread Kernel
 # RT-Thread Kernel
 #
 #
 CONFIG_RT_NAME_MAX=8
 CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
 # CONFIG_RT_USING_SMP is not set
 # CONFIG_RT_USING_SMP is not set
 CONFIG_RT_ALIGN_SIZE=4
 CONFIG_RT_ALIGN_SIZE=4
 # CONFIG_RT_THREAD_PRIORITY_8 is not set
 # CONFIG_RT_THREAD_PRIORITY_8 is not set
 CONFIG_RT_THREAD_PRIORITY_32=y
 CONFIG_RT_THREAD_PRIORITY_32=y
 # CONFIG_RT_THREAD_PRIORITY_256 is not set
 # CONFIG_RT_THREAD_PRIORITY_256 is not set
 CONFIG_RT_THREAD_PRIORITY_MAX=32
 CONFIG_RT_THREAD_PRIORITY_MAX=32
-CONFIG_RT_TICK_PER_SECOND=100
+CONFIG_RT_TICK_PER_SECOND=1000
 CONFIG_RT_USING_OVERFLOW_CHECK=y
 CONFIG_RT_USING_OVERFLOW_CHECK=y
 CONFIG_RT_USING_HOOK=y
 CONFIG_RT_USING_HOOK=y
 CONFIG_RT_USING_IDLE_HOOK=y
 CONFIG_RT_USING_IDLE_HOOK=y
 CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
 CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
 CONFIG_IDLE_THREAD_STACK_SIZE=256
 CONFIG_IDLE_THREAD_STACK_SIZE=256
 # CONFIG_RT_USING_TIMER_SOFT is not set
 # CONFIG_RT_USING_TIMER_SOFT is not set
+
+#
+# kservice optimization
+#
+# CONFIG_RT_KSERVICE_USING_STDLIB is not set
+# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set
+# CONFIG_RT_USING_ASM_MEMCPY is not set
 CONFIG_RT_DEBUG=y
 CONFIG_RT_DEBUG=y
 CONFIG_RT_DEBUG_COLOR=y
 CONFIG_RT_DEBUG_COLOR=y
 # CONFIG_RT_DEBUG_INIT_CONFIG is not set
 # CONFIG_RT_DEBUG_INIT_CONFIG is not set
@@ -48,10 +56,12 @@ CONFIG_RT_USING_MESSAGEQUEUE=y
 #
 #
 CONFIG_RT_USING_MEMPOOL=y
 CONFIG_RT_USING_MEMPOOL=y
 CONFIG_RT_USING_MEMHEAP=y
 CONFIG_RT_USING_MEMHEAP=y
+CONFIG_RT_USING_MEMHEAP_AUTO_BINDING=y
 # CONFIG_RT_USING_NOHEAP is not set
 # CONFIG_RT_USING_NOHEAP is not set
-CONFIG_RT_USING_SMALL_MEM=y
+# CONFIG_RT_USING_SMALL_MEM is not set
 # CONFIG_RT_USING_SLAB is not set
 # CONFIG_RT_USING_SLAB is not set
-# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set
+CONFIG_RT_USING_MEMHEAP_AS_HEAP=y
+# CONFIG_RT_USING_USERHEAP is not set
 # CONFIG_RT_USING_MEMTRACE is not set
 # CONFIG_RT_USING_MEMTRACE is not set
 CONFIG_RT_USING_HEAP=y
 CONFIG_RT_USING_HEAP=y
 
 
@@ -64,7 +74,12 @@ CONFIG_RT_USING_DEVICE=y
 CONFIG_RT_USING_CONSOLE=y
 CONFIG_RT_USING_CONSOLE=y
 CONFIG_RT_CONSOLEBUF_SIZE=128
 CONFIG_RT_CONSOLEBUF_SIZE=128
 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
-CONFIG_RT_VER_NUM=0x40000
+# CONFIG_RT_PRINTF_LONGLONG is not set
+CONFIG_RT_VER_NUM=0x40004
+CONFIG_ARCH_ARM=y
+CONFIG_RT_USING_CPU_FFS=y
+CONFIG_ARCH_ARM_CORTEX_M=y
+CONFIG_ARCH_ARM_CORTEX_M4=y
 # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
 # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
 
 
 #
 #
@@ -84,53 +99,67 @@ CONFIG_RT_MAIN_THREAD_PRIORITY=10
 # Command shell
 # Command shell
 #
 #
 CONFIG_RT_USING_FINSH=y
 CONFIG_RT_USING_FINSH=y
+CONFIG_RT_USING_MSH=y
+CONFIG_FINSH_USING_MSH=y
 CONFIG_FINSH_THREAD_NAME="tshell"
 CONFIG_FINSH_THREAD_NAME="tshell"
+CONFIG_FINSH_THREAD_PRIORITY=20
+CONFIG_FINSH_THREAD_STACK_SIZE=4096
 CONFIG_FINSH_USING_HISTORY=y
 CONFIG_FINSH_USING_HISTORY=y
 CONFIG_FINSH_HISTORY_LINES=5
 CONFIG_FINSH_HISTORY_LINES=5
 CONFIG_FINSH_USING_SYMTAB=y
 CONFIG_FINSH_USING_SYMTAB=y
+CONFIG_FINSH_CMD_SIZE=80
+CONFIG_MSH_USING_BUILT_IN_COMMANDS=y
 CONFIG_FINSH_USING_DESCRIPTION=y
 CONFIG_FINSH_USING_DESCRIPTION=y
 # CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
 # CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
-CONFIG_FINSH_THREAD_PRIORITY=20
-CONFIG_FINSH_THREAD_STACK_SIZE=4096
-CONFIG_FINSH_CMD_SIZE=80
 # CONFIG_FINSH_USING_AUTH is not set
 # CONFIG_FINSH_USING_AUTH is not set
-CONFIG_FINSH_USING_MSH=y
-CONFIG_FINSH_USING_MSH_DEFAULT=y
-# CONFIG_FINSH_USING_MSH_ONLY is not set
 CONFIG_FINSH_ARG_MAX=10
 CONFIG_FINSH_ARG_MAX=10
 
 
 #
 #
 # Device virtual file system
 # Device virtual file system
 #
 #
 # CONFIG_RT_USING_DFS is not set
 # CONFIG_RT_USING_DFS is not set
+# CONFIG_RT_DFS_ELM_USE_LFN_0 is not set
+# CONFIG_RT_DFS_ELM_USE_LFN_1 is not set
+# CONFIG_RT_DFS_ELM_USE_LFN_2 is not set
+# CONFIG_RT_DFS_ELM_USE_LFN_3 is not set
+# CONFIG_RT_DFS_ELM_LFN_UNICODE_0 is not set
+# CONFIG_RT_DFS_ELM_LFN_UNICODE_1 is not set
+# CONFIG_RT_DFS_ELM_LFN_UNICODE_2 is not set
+# CONFIG_RT_DFS_ELM_LFN_UNICODE_3 is not set
 
 
 #
 #
 # Device Drivers
 # Device Drivers
 #
 #
 CONFIG_RT_USING_DEVICE_IPC=y
 CONFIG_RT_USING_DEVICE_IPC=y
 CONFIG_RT_PIPE_BUFSZ=512
 CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
 CONFIG_RT_USING_SERIAL=y
 CONFIG_RT_USING_SERIAL=y
+CONFIG_RT_USING_SERIAL_V1=y
+# CONFIG_RT_USING_SERIAL_V2 is not set
 # CONFIG_RT_SERIAL_USING_DMA is not set
 # CONFIG_RT_SERIAL_USING_DMA is not set
+CONFIG_RT_SERIAL_RB_BUFSZ=64
 # CONFIG_RT_USING_CAN is not set
 # CONFIG_RT_USING_CAN is not set
-CONFIG_RT_USING_HWTIMER=y
+# CONFIG_RT_USING_HWTIMER is not set
 # CONFIG_RT_USING_CPUTIME is not set
 # CONFIG_RT_USING_CPUTIME is not set
 # CONFIG_RT_USING_I2C is not set
 # CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY is not set
 CONFIG_RT_USING_PIN=y
 CONFIG_RT_USING_PIN=y
 # CONFIG_RT_USING_ADC is not set
 # CONFIG_RT_USING_ADC is not set
-CONFIG_RT_USING_PWM=y
+# CONFIG_RT_USING_DAC is not set
+# CONFIG_RT_USING_PWM is not set
 # CONFIG_RT_USING_MTD_NOR is not set
 # CONFIG_RT_USING_MTD_NOR is not set
 # CONFIG_RT_USING_MTD_NAND is not set
 # CONFIG_RT_USING_MTD_NAND is not set
-# CONFIG_RT_USING_MTD is not set
 # CONFIG_RT_USING_PM is not set
 # CONFIG_RT_USING_PM is not set
 # CONFIG_RT_USING_RTC is not set
 # CONFIG_RT_USING_RTC is not set
 # CONFIG_RT_USING_SDIO is not set
 # CONFIG_RT_USING_SDIO is not set
 # CONFIG_RT_USING_SPI is not set
 # CONFIG_RT_USING_SPI is not set
 # CONFIG_RT_USING_WDT is not set
 # CONFIG_RT_USING_WDT is not set
 # CONFIG_RT_USING_AUDIO is not set
 # CONFIG_RT_USING_AUDIO is not set
-
-#
-# Using WiFi
-#
+# CONFIG_RT_USING_SENSOR is not set
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
 # CONFIG_RT_USING_WIFI is not set
 # CONFIG_RT_USING_WIFI is not set
 
 
 #
 #
@@ -142,8 +171,11 @@ CONFIG_RT_USING_PWM=y
 #
 #
 # POSIX layer and C standard library
 # POSIX layer and C standard library
 #
 #
-# CONFIG_RT_USING_LIBC is not set
+CONFIG_RT_USING_LIBC=y
 # CONFIG_RT_USING_PTHREADS is not set
 # CONFIG_RT_USING_PTHREADS is not set
+CONFIG_RT_LIBC_USING_TIME=y
+# CONFIG_RT_USING_MODULE is not set
+CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8
 
 
 #
 #
 # Network
 # Network
@@ -155,14 +187,14 @@ CONFIG_RT_USING_PWM=y
 # CONFIG_RT_USING_SAL is not set
 # CONFIG_RT_USING_SAL is not set
 
 
 #
 #
-# light weight TCP/IP stack
+# Network interface device
 #
 #
-# CONFIG_RT_USING_LWIP is not set
+# CONFIG_RT_USING_NETDEV is not set
 
 
 #
 #
-# Modbus master and slave stack
+# light weight TCP/IP stack
 #
 #
-# CONFIG_RT_USING_MODBUS is not set
+# CONFIG_RT_USING_LWIP is not set
 
 
 #
 #
 # AT commands
 # AT commands
@@ -177,10 +209,16 @@ CONFIG_RT_USING_PWM=y
 #
 #
 # Utilities
 # Utilities
 #
 #
-# CONFIG_RT_USING_LOGTRACE is not set
 # CONFIG_RT_USING_RYM is not set
 # CONFIG_RT_USING_RYM is not set
 # CONFIG_RT_USING_ULOG is not set
 # CONFIG_RT_USING_ULOG is not set
 # CONFIG_RT_USING_UTEST is not set
 # CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_RT_LINK is not set
+# CONFIG_RT_USING_LWP is not set
+
+#
+# RT-Thread Utestcases
+#
+# CONFIG_RT_USING_UTESTCASES is not set
 
 
 #
 #
 # RT-Thread online packages
 # RT-Thread online packages
@@ -189,13 +227,20 @@ CONFIG_RT_USING_PWM=y
 #
 #
 # IoT - internet of things
 # IoT - internet of things
 #
 #
+# CONFIG_PKG_USING_LORAWAN_DRIVER is not set
 # CONFIG_PKG_USING_PAHOMQTT is not set
 # CONFIG_PKG_USING_PAHOMQTT is not set
+# CONFIG_PKG_USING_UMQTT is not set
 # CONFIG_PKG_USING_WEBCLIENT is not set
 # CONFIG_PKG_USING_WEBCLIENT is not set
 # CONFIG_PKG_USING_WEBNET is not set
 # CONFIG_PKG_USING_WEBNET is not set
 # CONFIG_PKG_USING_MONGOOSE is not set
 # CONFIG_PKG_USING_MONGOOSE is not set
+# CONFIG_PKG_USING_MYMQTT is not set
+# CONFIG_PKG_USING_KAWAII_MQTT is not set
+# CONFIG_PKG_USING_BC28_MQTT is not set
 # CONFIG_PKG_USING_WEBTERMINAL is not set
 # CONFIG_PKG_USING_WEBTERMINAL is not set
 # CONFIG_PKG_USING_CJSON is not set
 # CONFIG_PKG_USING_CJSON is not set
 # CONFIG_PKG_USING_JSMN is not set
 # CONFIG_PKG_USING_JSMN is not set
+# CONFIG_PKG_USING_LIBMODBUS is not set
+# CONFIG_PKG_USING_FREEMODBUS is not set
 # CONFIG_PKG_USING_LJSON is not set
 # CONFIG_PKG_USING_LJSON is not set
 # CONFIG_PKG_USING_EZXML is not set
 # CONFIG_PKG_USING_EZXML is not set
 # CONFIG_PKG_USING_NANOPB is not set
 # CONFIG_PKG_USING_NANOPB is not set
@@ -213,11 +258,16 @@ CONFIG_RT_USING_PWM=y
 # Wiced WiFi
 # Wiced WiFi
 #
 #
 # CONFIG_PKG_USING_WLAN_WICED is not set
 # CONFIG_PKG_USING_WLAN_WICED is not set
+# CONFIG_PKG_USING_RW007 is not set
 # CONFIG_PKG_USING_COAP is not set
 # CONFIG_PKG_USING_COAP is not set
 # CONFIG_PKG_USING_NOPOLL is not set
 # CONFIG_PKG_USING_NOPOLL is not set
 # CONFIG_PKG_USING_NETUTILS is not set
 # CONFIG_PKG_USING_NETUTILS is not set
+# CONFIG_PKG_USING_CMUX is not set
+# CONFIG_PKG_USING_PPP_DEVICE is not set
 # CONFIG_PKG_USING_AT_DEVICE is not set
 # CONFIG_PKG_USING_AT_DEVICE is not set
+# CONFIG_PKG_USING_ATSRV_SOCKET is not set
 # CONFIG_PKG_USING_WIZNET is not set
 # CONFIG_PKG_USING_WIZNET is not set
+# CONFIG_PKG_USING_ZB_COORDINATOR is not set
 
 
 #
 #
 # IoT Cloud
 # IoT Cloud
@@ -226,7 +276,39 @@ CONFIG_RT_USING_PWM=y
 # CONFIG_PKG_USING_GAGENT_CLOUD is not set
 # CONFIG_PKG_USING_GAGENT_CLOUD is not set
 # CONFIG_PKG_USING_ALI_IOTKIT is not set
 # CONFIG_PKG_USING_ALI_IOTKIT is not set
 # CONFIG_PKG_USING_AZURE is not set
 # CONFIG_PKG_USING_AZURE is not set
-# CONFIG_PKG_USING_TENCENT_IOTKIT is not set
+# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set
+# CONFIG_PKG_USING_JIOT-C-SDK is not set
+# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set
+# CONFIG_PKG_USING_JOYLINK is not set
+# CONFIG_PKG_USING_NIMBLE is not set
+# CONFIG_PKG_USING_OTA_DOWNLOADER is not set
+# CONFIG_PKG_USING_IPMSG is not set
+# CONFIG_PKG_USING_LSSDP is not set
+# CONFIG_PKG_USING_AIRKISS_OPEN is not set
+# CONFIG_PKG_USING_LIBRWS is not set
+# CONFIG_PKG_USING_TCPSERVER is not set
+# CONFIG_PKG_USING_PROTOBUF_C is not set
+# CONFIG_PKG_USING_DLT645 is not set
+# CONFIG_PKG_USING_QXWZ is not set
+# CONFIG_PKG_USING_SMTP_CLIENT is not set
+# CONFIG_PKG_USING_ABUP_FOTA is not set
+# CONFIG_PKG_USING_LIBCURL2RTT is not set
+# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set
+# CONFIG_PKG_USING_AGILE_TELNET is not set
+# CONFIG_PKG_USING_NMEALIB is not set
+# CONFIG_PKG_USING_AGILE_JSMN is not set
+# CONFIG_PKG_USING_PDULIB is not set
+# CONFIG_PKG_USING_BTSTACK is not set
+# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set
+# CONFIG_PKG_USING_WAYZ_IOTKIT is not set
+# CONFIG_PKG_USING_MAVLINK is not set
+# CONFIG_PKG_USING_RAPIDJSON is not set
+# CONFIG_PKG_USING_BSAL is not set
+# CONFIG_PKG_USING_AGILE_MODBUS is not set
+# CONFIG_PKG_USING_AGILE_FTP is not set
+# CONFIG_PKG_USING_EMBEDDEDPROTO is not set
+# CONFIG_PKG_USING_RT_LINK_HW is not set
 
 
 #
 #
 # security packages
 # security packages
@@ -234,6 +316,8 @@ CONFIG_RT_USING_PWM=y
 # CONFIG_PKG_USING_MBEDTLS is not set
 # CONFIG_PKG_USING_MBEDTLS is not set
 # CONFIG_PKG_USING_libsodium is not set
 # CONFIG_PKG_USING_libsodium is not set
 # CONFIG_PKG_USING_TINYCRYPT is not set
 # CONFIG_PKG_USING_TINYCRYPT is not set
+# CONFIG_PKG_USING_TFM is not set
+# CONFIG_PKG_USING_YD_CRYPTO is not set
 
 
 #
 #
 # language packages
 # language packages
@@ -241,12 +325,23 @@ CONFIG_RT_USING_PWM=y
 # CONFIG_PKG_USING_LUA is not set
 # CONFIG_PKG_USING_LUA is not set
 # CONFIG_PKG_USING_JERRYSCRIPT is not set
 # CONFIG_PKG_USING_JERRYSCRIPT is not set
 # CONFIG_PKG_USING_MICROPYTHON is not set
 # CONFIG_PKG_USING_MICROPYTHON is not set
+# CONFIG_PKG_USING_PIKASCRIPT is not set
 
 
 #
 #
 # multimedia packages
 # multimedia packages
 #
 #
 # CONFIG_PKG_USING_OPENMV is not set
 # CONFIG_PKG_USING_OPENMV is not set
 # CONFIG_PKG_USING_MUPDF is not set
 # CONFIG_PKG_USING_MUPDF is not set
+# CONFIG_PKG_USING_STEMWIN is not set
+# CONFIG_PKG_USING_WAVPLAYER is not set
+# CONFIG_PKG_USING_TJPGD is not set
+# CONFIG_PKG_USING_PDFGEN is not set
+# CONFIG_PKG_USING_HELIX is not set
+# CONFIG_PKG_USING_AZUREGUIX is not set
+# CONFIG_PKG_USING_TOUCHGFX2RTT is not set
+# CONFIG_PKG_USING_NUEMWIN is not set
+# CONFIG_PKG_USING_MP3PLAYER is not set
+# CONFIG_PKG_USING_TINYJPEG is not set
 
 
 #
 #
 # tools packages
 # tools packages
@@ -255,120 +350,262 @@ CONFIG_RT_USING_PWM=y
 # CONFIG_PKG_USING_EASYFLASH is not set
 # CONFIG_PKG_USING_EASYFLASH is not set
 # CONFIG_PKG_USING_EASYLOGGER is not set
 # CONFIG_PKG_USING_EASYLOGGER is not set
 # CONFIG_PKG_USING_SYSTEMVIEW is not set
 # CONFIG_PKG_USING_SYSTEMVIEW is not set
+# CONFIG_PKG_USING_SEGGER_RTT is not set
 # CONFIG_PKG_USING_RDB is not set
 # CONFIG_PKG_USING_RDB is not set
 # CONFIG_PKG_USING_QRCODE is not set
 # CONFIG_PKG_USING_QRCODE is not set
 # CONFIG_PKG_USING_ULOG_EASYFLASH is not set
 # CONFIG_PKG_USING_ULOG_EASYFLASH is not set
+# CONFIG_PKG_USING_ULOG_FILE is not set
+# CONFIG_PKG_USING_LOGMGR is not set
+# CONFIG_PKG_USING_ADBD is not set
+# CONFIG_PKG_USING_COREMARK is not set
+# CONFIG_PKG_USING_DHRYSTONE is not set
+# CONFIG_PKG_USING_MEMORYPERF is not set
+# CONFIG_PKG_USING_NR_MICRO_SHELL is not set
+# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set
+# CONFIG_PKG_USING_LUNAR_CALENDAR is not set
+# CONFIG_PKG_USING_BS8116A is not set
+# CONFIG_PKG_USING_GPS_RMC is not set
+# CONFIG_PKG_USING_URLENCODE is not set
+# CONFIG_PKG_USING_UMCN is not set
+# CONFIG_PKG_USING_LWRB2RTT is not set
+# CONFIG_PKG_USING_CPU_USAGE is not set
+# CONFIG_PKG_USING_GBK2UTF8 is not set
+# CONFIG_PKG_USING_VCONSOLE is not set
+# CONFIG_PKG_USING_KDB is not set
+# CONFIG_PKG_USING_WAMR is not set
+# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set
+# CONFIG_PKG_USING_LWLOG is not set
+# CONFIG_PKG_USING_ANV_TRACE is not set
+# CONFIG_PKG_USING_ANV_MEMLEAK is not set
+# CONFIG_PKG_USING_ANV_TESTSUIT is not set
+# CONFIG_PKG_USING_ANV_BENCH is not set
+# CONFIG_PKG_USING_DEVMEM is not set
+# CONFIG_PKG_USING_REGEX is not set
+# CONFIG_PKG_USING_MEM_SANDBOX is not set
+# CONFIG_PKG_USING_SOLAR_TERMS is not set
+# CONFIG_PKG_USING_GAN_ZHI is not set
 
 
 #
 #
 # system packages
 # system packages
 #
 #
+
+#
+# acceleration: Assembly language or algorithmic acceleration packages
+#
+# CONFIG_PKG_USING_RT_MEMCPY_CM is not set
+# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set
+# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set
+# CONFIG_PKG_USING_QFPLIB_M3 is not set
+
+#
+# Micrium: Micrium software products porting for RT-Thread
+#
+# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set
+# CONFIG_PKG_USING_UCOSII_WRAPPER is not set
+# CONFIG_PKG_USING_UC_CRC is not set
+# CONFIG_PKG_USING_UC_CLK is not set
+# CONFIG_PKG_USING_UC_COMMON is not set
+# CONFIG_PKG_USING_UC_MODBUS is not set
 # CONFIG_PKG_USING_GUIENGINE is not set
 # CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON is not set
 # CONFIG_PKG_USING_CAIRO is not set
 # CONFIG_PKG_USING_CAIRO is not set
 # CONFIG_PKG_USING_PIXMAN is not set
 # CONFIG_PKG_USING_PIXMAN is not set
-# CONFIG_PKG_USING_LWEXT4 is not set
 # CONFIG_PKG_USING_PARTITION is not set
 # CONFIG_PKG_USING_PARTITION is not set
 # CONFIG_PKG_USING_FAL is not set
 # CONFIG_PKG_USING_FAL is not set
+# CONFIG_PKG_USING_FLASHDB is not set
 # CONFIG_PKG_USING_SQLITE is not set
 # CONFIG_PKG_USING_SQLITE is not set
 # CONFIG_PKG_USING_RTI is not set
 # CONFIG_PKG_USING_RTI is not set
 # CONFIG_PKG_USING_LITTLEVGL2RTT is not set
 # CONFIG_PKG_USING_LITTLEVGL2RTT is not set
 # CONFIG_PKG_USING_CMSIS is not set
 # CONFIG_PKG_USING_CMSIS is not set
 # CONFIG_PKG_USING_DFS_YAFFS is not set
 # CONFIG_PKG_USING_DFS_YAFFS is not set
 # CONFIG_PKG_USING_LITTLEFS is not set
 # CONFIG_PKG_USING_LITTLEFS is not set
+# CONFIG_PKG_USING_DFS_JFFS2 is not set
+# CONFIG_PKG_USING_DFS_UFFS is not set
+# CONFIG_PKG_USING_LWEXT4 is not set
+# CONFIG_PKG_USING_THREAD_POOL is not set
+# CONFIG_PKG_USING_ROBOTS is not set
+# CONFIG_PKG_USING_EV is not set
+# CONFIG_PKG_USING_SYSWATCH is not set
+# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set
+# CONFIG_PKG_USING_PLCCORE is not set
+# CONFIG_PKG_USING_RAMDISK is not set
+# CONFIG_PKG_USING_MININI is not set
+# CONFIG_PKG_USING_QBOOT is not set
+# CONFIG_PKG_USING_PPOOL is not set
+# CONFIG_PKG_USING_OPENAMP is not set
+# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set
+# CONFIG_PKG_USING_LPM is not set
+# CONFIG_PKG_USING_TLSF is not set
+# CONFIG_PKG_USING_EVENT_RECORDER is not set
+# CONFIG_PKG_USING_ARM_2D is not set
+# CONFIG_PKG_USING_WCWIDTH is not set
 
 
 #
 #
 # peripheral libraries and drivers
 # peripheral libraries and drivers
 #
 #
+# CONFIG_PKG_USING_SENSORS_DRIVERS is not set
 # CONFIG_PKG_USING_REALTEK_AMEBA is not set
 # CONFIG_PKG_USING_REALTEK_AMEBA is not set
 # CONFIG_PKG_USING_SHT2X is not set
 # CONFIG_PKG_USING_SHT2X is not set
-# CONFIG_PKG_USING_AHT10 is not set
-# CONFIG_PKG_USING_AP3216C is not set
+# CONFIG_PKG_USING_SHT3X is not set
+# CONFIG_PKG_USING_AS7341 is not set
 # CONFIG_PKG_USING_STM32_SDIO is not set
 # CONFIG_PKG_USING_STM32_SDIO is not set
 # CONFIG_PKG_USING_ICM20608 is not set
 # CONFIG_PKG_USING_ICM20608 is not set
 # CONFIG_PKG_USING_U8G2 is not set
 # CONFIG_PKG_USING_U8G2 is not set
 # CONFIG_PKG_USING_BUTTON is not set
 # CONFIG_PKG_USING_BUTTON is not set
-# CONFIG_PKG_USING_MPU6XXX is not set
 # CONFIG_PKG_USING_PCF8574 is not set
 # CONFIG_PKG_USING_PCF8574 is not set
+# CONFIG_PKG_USING_SX12XX is not set
+# CONFIG_PKG_USING_SIGNAL_LED is not set
+# CONFIG_PKG_USING_LEDBLINK is not set
+# CONFIG_PKG_USING_LITTLED is not set
+# CONFIG_PKG_USING_LKDGUI is not set
+# CONFIG_PKG_USING_NRF5X_SDK is not set
+# CONFIG_PKG_USING_NRFX is not set
+# CONFIG_PKG_USING_WM_LIBRARIES is not set
 # CONFIG_PKG_USING_KENDRYTE_SDK is not set
 # CONFIG_PKG_USING_KENDRYTE_SDK is not set
+# CONFIG_PKG_USING_INFRARED is not set
+# CONFIG_PKG_USING_AGILE_BUTTON is not set
+# CONFIG_PKG_USING_AGILE_LED is not set
+# CONFIG_PKG_USING_AT24CXX is not set
+# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set
+# CONFIG_PKG_USING_AD7746 is not set
+# CONFIG_PKG_USING_PCA9685 is not set
+# CONFIG_PKG_USING_I2C_TOOLS is not set
+# CONFIG_PKG_USING_NRF24L01 is not set
+# CONFIG_PKG_USING_TOUCH_DRIVERS is not set
+# CONFIG_PKG_USING_MAX17048 is not set
+# CONFIG_PKG_USING_RPLIDAR is not set
+# CONFIG_PKG_USING_AS608 is not set
+# CONFIG_PKG_USING_RC522 is not set
+# CONFIG_PKG_USING_WS2812B is not set
+# CONFIG_PKG_USING_EMBARC_BSP is not set
+# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set
+# CONFIG_PKG_USING_MULTI_RTIMER is not set
+# CONFIG_PKG_USING_MAX7219 is not set
+# CONFIG_PKG_USING_BEEP is not set
+# CONFIG_PKG_USING_EASYBLINK is not set
+# CONFIG_PKG_USING_PMS_SERIES is not set
+# CONFIG_PKG_USING_CAN_YMODEM is not set
+# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set
+# CONFIG_PKG_USING_QLED is not set
+# CONFIG_PKG_USING_PAJ7620 is not set
+# CONFIG_PKG_USING_AGILE_CONSOLE is not set
+# CONFIG_PKG_USING_LD3320 is not set
+# CONFIG_PKG_USING_WK2124 is not set
+# CONFIG_PKG_USING_LY68L6400 is not set
+# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_SSD1306 is not set
+# CONFIG_PKG_USING_QKEY is not set
+# CONFIG_PKG_USING_RS485 is not set
+# CONFIG_PKG_USING_NES is not set
+# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set
+# CONFIG_PKG_USING_VDEVICE is not set
+# CONFIG_PKG_USING_SGM706 is not set
+# CONFIG_PKG_USING_STM32WB55_SDK is not set
+# CONFIG_PKG_USING_RDA58XX is not set
+# CONFIG_PKG_USING_LIBNFC is not set
+# CONFIG_PKG_USING_MFOC is not set
+# CONFIG_PKG_USING_TMC51XX is not set
+# CONFIG_PKG_USING_TCA9534 is not set
+# CONFIG_PKG_USING_KOBUKI is not set
+# CONFIG_PKG_USING_ROSSERIAL is not set
+# CONFIG_PKG_USING_MICRO_ROS is not set
+# CONFIG_PKG_USING_MCP23008 is not set
+# CONFIG_PKG_USING_BLUETRUM_SDK is not set
+
+#
+# AI packages
+#
+# CONFIG_PKG_USING_LIBANN is not set
+# CONFIG_PKG_USING_NNOM is not set
+# CONFIG_PKG_USING_ONNX_BACKEND is not set
+# CONFIG_PKG_USING_ONNX_PARSER is not set
+# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set
+# CONFIG_PKG_USING_ELAPACK is not set
+# CONFIG_PKG_USING_ULAPACK is not set
+# CONFIG_PKG_USING_QUEST is not set
+# CONFIG_PKG_USING_NAXOS is not set
 
 
 #
 #
 # miscellaneous packages
 # miscellaneous packages
 #
 #
+
+#
+# samples: kernel and components samples
+#
+# CONFIG_PKG_USING_KERNEL_SAMPLES is not set
+# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set
+# CONFIG_PKG_USING_NETWORK_SAMPLES is not set
+# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set
+
+#
+# entertainment: terminal games and other interesting software packages
+#
+# CONFIG_PKG_USING_CMATRIX is not set
+# CONFIG_PKG_USING_SL is not set
+# CONFIG_PKG_USING_CAL is not set
+# CONFIG_PKG_USING_ACLOCK is not set
+# CONFIG_PKG_USING_THREES is not set
+# CONFIG_PKG_USING_2048 is not set
+# CONFIG_PKG_USING_SNAKE is not set
+# CONFIG_PKG_USING_TETRIS is not set
+# CONFIG_PKG_USING_DONUT is not set
 # CONFIG_PKG_USING_LIBCSV is not set
 # CONFIG_PKG_USING_LIBCSV is not set
 # CONFIG_PKG_USING_OPTPARSE is not set
 # CONFIG_PKG_USING_OPTPARSE is not set
 # CONFIG_PKG_USING_FASTLZ is not set
 # CONFIG_PKG_USING_FASTLZ is not set
 # CONFIG_PKG_USING_MINILZO is not set
 # CONFIG_PKG_USING_MINILZO is not set
 # CONFIG_PKG_USING_QUICKLZ is not set
 # CONFIG_PKG_USING_QUICKLZ is not set
+# CONFIG_PKG_USING_LZMA is not set
 # CONFIG_PKG_USING_MULTIBUTTON is not set
 # CONFIG_PKG_USING_MULTIBUTTON is not set
+# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
 # CONFIG_PKG_USING_CANFESTIVAL is not set
 # CONFIG_PKG_USING_CANFESTIVAL is not set
 # CONFIG_PKG_USING_ZLIB is not set
 # CONFIG_PKG_USING_ZLIB is not set
+# CONFIG_PKG_USING_MINIZIP is not set
 # CONFIG_PKG_USING_DSTR is not set
 # CONFIG_PKG_USING_DSTR is not set
 # CONFIG_PKG_USING_TINYFRAME is not set
 # CONFIG_PKG_USING_TINYFRAME is not set
-
-#
-# samples: kernel and components samples
-#
-# CONFIG_PKG_USING_KERNEL_SAMPLES is not set
-# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set
-# CONFIG_PKG_USING_NETWORK_SAMPLES is not set
-# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set
+# CONFIG_PKG_USING_KENDRYTE_DEMO is not set
+# CONFIG_PKG_USING_DIGITALCTRL is not set
+# CONFIG_PKG_USING_UPACKER is not set
+# CONFIG_PKG_USING_UPARAM is not set
 # CONFIG_PKG_USING_HELLO is not set
 # CONFIG_PKG_USING_HELLO is not set
-CONFIG_SOC_SWM320VET7=y
+# CONFIG_PKG_USING_VI is not set
+# CONFIG_PKG_USING_KI is not set
+# CONFIG_PKG_USING_ARMv7M_DWT is not set
+# CONFIG_PKG_USING_VT100 is not set
+# CONFIG_PKG_USING_UKAL is not set
+# CONFIG_PKG_USING_CRCLIB is not set
+# CONFIG_PKG_USING_LWGPS is not set
+# CONFIG_PKG_USING_STATE_MACHINE is not set
+# CONFIG_PKG_USING_MCURSES is not set
+# CONFIG_PKG_USING_COWSAY is not set
+# CONFIG_PKG_USING_TERMBOX is not set
 
 
 #
 #
 # Hardware Drivers Config
 # Hardware Drivers Config
 #
 #
+CONFIG_SOC_SWM320=y
 
 
 #
 #
 # On-chip Peripheral Drivers
 # On-chip Peripheral Drivers
 #
 #
-CONFIG_BSP_USING_GPIO=y
-# CONFIG_BSP_USING_WDT is not set
-
-#
-# UART Drivers
-#
+CONFIG_BSP_USING_UART=y
 CONFIG_BSP_USING_UART0=y
 CONFIG_BSP_USING_UART0=y
 # CONFIG_BSP_USING_UART1 is not set
 # CONFIG_BSP_USING_UART1 is not set
 # CONFIG_BSP_USING_UART2 is not set
 # CONFIG_BSP_USING_UART2 is not set
 # CONFIG_BSP_USING_UART3 is not set
 # CONFIG_BSP_USING_UART3 is not set
-
-#
-# SPI Drivers
-#
-# CONFIG_BSP_USING_SPI0 is not set
-# CONFIG_BSP_USING_SPI1 is not set
-
-#
-# I2C Drivers
-#
+CONFIG_BSP_USING_GPIO=y
+# CONFIG_BSP_USING_ADC is not set
+# CONFIG_BSP_USING_TIM is not set
 # CONFIG_BSP_USING_I2C is not set
 # CONFIG_BSP_USING_I2C is not set
-
-#
-# PWM Drivers
-#
-# CONFIG_BSP_USING_PWM0 is not set
-# CONFIG_BSP_USING_PWM1 is not set
-# CONFIG_BSP_USING_PWM2 is not set
-# CONFIG_BSP_USING_PWM3 is not set
-
-#
-# RTC Drivers
-#
+# CONFIG_BSP_USING_PWM is not set
 # CONFIG_BSP_USING_RTC is not set
 # CONFIG_BSP_USING_RTC is not set
-
-#
-# HWtimer Drivers
-#
-# CONFIG_BSP_USING_HWTIMER0 is not set
-# CONFIG_BSP_USING_HWTIMER1 is not set
-# CONFIG_BSP_USING_HWTIMER2 is not set
-# CONFIG_BSP_USING_HWTIMER3 is not set
-# CONFIG_BSP_USING_HWTIMER4 is not set
-# CONFIG_BSP_USING_HWTIMER5 is not set
+# CONFIG_BSP_USING_SPI is not set
+# CONFIG_BSP_USING_WDT is not set
+# CONFIG_BSP_USING_CRC is not set
 
 
 #
 #
 # Onboard Peripheral Drivers
 # Onboard Peripheral Drivers
 #
 #
+# CONFIG_BSP_USING_SDIO is not set
 # CONFIG_BSP_USING_EXT_SRAM is not set
 # CONFIG_BSP_USING_EXT_SRAM is not set
 # CONFIG_BSP_USING_NOR_FLASH is not set
 # CONFIG_BSP_USING_NOR_FLASH is not set
 
 

+ 3 - 5
bsp/swm320-lq100/Kconfig

@@ -17,11 +17,9 @@ config PKGS_DIR
 
 
 source "$RTT_DIR/Kconfig"
 source "$RTT_DIR/Kconfig"
 source "$PKGS_DIR/Kconfig"
 source "$PKGS_DIR/Kconfig"
+source "drivers/Kconfig"
 
 
-config SOC_SWM320VET7
+config SOC_SWM320
     bool
     bool
-    select RT_USING_COMPONENTS_INIT
-    select RT_USING_USER_MAIN
+    select ARCH_ARM_CORTEX_M4
     default y
     default y
-
-source "drivers/Kconfig"

+ 17 - 18
bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/arm_common_tables.h

@@ -2,12 +2,12 @@
 * Copyright (C) 2010-2014 ARM Limited. All rights reserved.
 * Copyright (C) 2010-2014 ARM Limited. All rights reserved.
 *
 *
 * $Date:        31. July 2014
 * $Date:        31. July 2014
-* $Revision: 	V1.4.4
+* $Revision:    V1.4.4
 *
 *
-* Project: 	    CMSIS DSP Library
-* Title:	    arm_common_tables.h
+* Project:      CMSIS DSP Library
+* Title:        arm_common_tables.h
 *
 *
-* Description:	This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions
+* Description:  This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions
 *
 *
 * Target Processor: Cortex-M4/Cortex-M3
 * Target Processor: Cortex-M4/Cortex-M3
 *
 *
@@ -85,14 +85,13 @@ extern const float32_t twiddleCoef_rfft_1024[1024];
 extern const float32_t twiddleCoef_rfft_2048[2048];
 extern const float32_t twiddleCoef_rfft_2048[2048];
 extern const float32_t twiddleCoef_rfft_4096[4096];
 extern const float32_t twiddleCoef_rfft_4096[4096];
 
 
-
 /* floating-point bit reversal tables */
 /* floating-point bit reversal tables */
-#define ARMBITREVINDEXTABLE__16_TABLE_LENGTH ((uint16_t)20  )
-#define ARMBITREVINDEXTABLE__32_TABLE_LENGTH ((uint16_t)48  )
-#define ARMBITREVINDEXTABLE__64_TABLE_LENGTH ((uint16_t)56  )
-#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208 )
-#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440 )
-#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448 )
+#define ARMBITREVINDEXTABLE__16_TABLE_LENGTH ((uint16_t)20)
+#define ARMBITREVINDEXTABLE__32_TABLE_LENGTH ((uint16_t)48)
+#define ARMBITREVINDEXTABLE__64_TABLE_LENGTH ((uint16_t)56)
+#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208)
+#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440)
+#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448)
 #define ARMBITREVINDEXTABLE1024_TABLE_LENGTH ((uint16_t)1800)
 #define ARMBITREVINDEXTABLE1024_TABLE_LENGTH ((uint16_t)1800)
 #define ARMBITREVINDEXTABLE2048_TABLE_LENGTH ((uint16_t)3808)
 #define ARMBITREVINDEXTABLE2048_TABLE_LENGTH ((uint16_t)3808)
 #define ARMBITREVINDEXTABLE4096_TABLE_LENGTH ((uint16_t)4032)
 #define ARMBITREVINDEXTABLE4096_TABLE_LENGTH ((uint16_t)4032)
@@ -108,13 +107,13 @@ extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE2048_TABLE_LENG
 extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE4096_TABLE_LENGTH];
 extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE4096_TABLE_LENGTH];
 
 
 /* fixed-point bit reversal tables */
 /* fixed-point bit reversal tables */
-#define ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH ((uint16_t)12  )
-#define ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH ((uint16_t)24  )
-#define ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH ((uint16_t)56  )
-#define ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH ((uint16_t)112 )
-#define ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH ((uint16_t)240 )
-#define ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH ((uint16_t)480 )
-#define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992 )
+#define ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH ((uint16_t)12)
+#define ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH ((uint16_t)24)
+#define ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH ((uint16_t)56)
+#define ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH ((uint16_t)112)
+#define ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH ((uint16_t)240)
+#define ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH ((uint16_t)480)
+#define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992)
 #define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984)
 #define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984)
 #define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032)
 #define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032)
 
 

+ 31 - 31
bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/arm_const_structs.h

@@ -2,12 +2,12 @@
 * Copyright (C) 2010-2014 ARM Limited. All rights reserved.
 * Copyright (C) 2010-2014 ARM Limited. All rights reserved.
 *
 *
 * $Date:        31. July 2014
 * $Date:        31. July 2014
-* $Revision: 	V1.4.4
+* $Revision:    V1.4.4
 *
 *
-* Project: 	    CMSIS DSP Library
-* Title:	    arm_const_structs.h
+* Project:      CMSIS DSP Library
+* Title:        arm_const_structs.h
 *
 *
-* Description:	This file has constant structs that are initialized for
+* Description:  This file has constant structs that are initialized for
 *              user convenience.  For example, some can be given as
 *              user convenience.  For example, some can be given as
 *              arguments to the arm_cfft_f32() function.
 *              arguments to the arm_cfft_f32() function.
 *
 *
@@ -46,34 +46,34 @@
 #include "arm_math.h"
 #include "arm_math.h"
 #include "arm_common_tables.h"
 #include "arm_common_tables.h"
 
 
-   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16;
-   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32;
-   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64;
-   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128;
-   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256;
-   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512;
-   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024;
-   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048;
-   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096;
+extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16;
+extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32;
+extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64;
+extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128;
+extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256;
+extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512;
+extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024;
+extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048;
+extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096;
 
 
-   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16;
-   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32;
-   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64;
-   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128;
-   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256;
-   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512;
-   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024;
-   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048;
-   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096;
+extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16;
+extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32;
+extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64;
+extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128;
+extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256;
+extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512;
+extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024;
+extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048;
+extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096;
 
 
-   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16;
-   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32;
-   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64;
-   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128;
-   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256;
-   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512;
-   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024;
-   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048;
-   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096;
+extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16;
+extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32;
+extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64;
+extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128;
+extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256;
+extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512;
+extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024;
+extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048;
+extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096;
 
 
 #endif
 #endif

File diff suppressed because it is too large
+ 530 - 555
bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/arm_math.h


+ 361 - 380
bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cm0.h

@@ -1,4 +1,4 @@
-/**************************************************************************//**
+/**************************************************************************/ /**
  * @file     core_cm0.h
  * @file     core_cm0.h
  * @brief    CMSIS Cortex-M0 Core Peripheral Access Layer Header File
  * @brief    CMSIS Cortex-M0 Core Peripheral Access Layer Header File
  * @version  V4.00
  * @version  V4.00
@@ -34,16 +34,16 @@
    POSSIBILITY OF SUCH DAMAGE.
    POSSIBILITY OF SUCH DAMAGE.
    ---------------------------------------------------------------------------*/
    ---------------------------------------------------------------------------*/
 
 
-
-#if defined ( __ICCARM__ )
- #pragma system_include  /* treat file as system include file for MISRA check */
+#if defined(__ICCARM__)
+#pragma system_include /* treat file as system include file for MISRA check */
 #endif
 #endif
 
 
 #ifndef __CORE_CM0_H_GENERIC
 #ifndef __CORE_CM0_H_GENERIC
 #define __CORE_CM0_H_GENERIC
 #define __CORE_CM0_H_GENERIC
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
- extern "C" {
+extern "C"
+{
 #endif
 #endif
 
 
 /** \page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions
 /** \page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions
@@ -59,7 +59,6 @@
      Function-like macros are used to allow more efficient code.
      Function-like macros are used to allow more efficient code.
  */
  */
 
 
-
 /*******************************************************************************
 /*******************************************************************************
  *                 CMSIS definitions
  *                 CMSIS definitions
  ******************************************************************************/
  ******************************************************************************/
@@ -68,85 +67,84 @@
  */
  */
 
 
 /*  CMSIS CM0 definitions */
 /*  CMSIS CM0 definitions */
-#define __CM0_CMSIS_VERSION_MAIN  (0x04)                                   /*!< [31:16] CMSIS HAL main version   */
-#define __CM0_CMSIS_VERSION_SUB   (0x00)                                   /*!< [15:0]  CMSIS HAL sub version    */
-#define __CM0_CMSIS_VERSION       ((__CM0_CMSIS_VERSION_MAIN << 16) | \
-                                    __CM0_CMSIS_VERSION_SUB          )     /*!< CMSIS HAL version number         */
+#define __CM0_CMSIS_VERSION_MAIN (0x04) /*!< [31:16] CMSIS HAL main version   */
+#define __CM0_CMSIS_VERSION_SUB (0x00)  /*!< [15:0]  CMSIS HAL sub version    */
+#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | \
+                             __CM0_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number         */
+
+#define __CORTEX_M (0x00) /*!< Cortex-M Core                    */
+
+#if defined(__CC_ARM)
+#define __ASM __asm       /*!< asm keyword for ARM Compiler          */
+#define __INLINE __inline /*!< inline keyword for ARM Compiler       */
+#define __STATIC_INLINE static __inline
+
+#elif defined(__GNUC__)
+#define __ASM __asm     /*!< asm keyword for GNU Compiler          */
+#define __INLINE inline /*!< inline keyword for GNU Compiler       */
+#define __STATIC_INLINE static inline
+
+#elif defined(__ICCARM__)
+#define __ASM __asm     /*!< asm keyword for IAR Compiler          */
+#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
+#define __STATIC_INLINE static inline
+
+#elif defined(__TMS470__)
+#define __ASM __asm /*!< asm keyword for TI CCS Compiler       */
+#define __STATIC_INLINE static inline
+
+#elif defined(__TASKING__)
+#define __ASM __asm     /*!< asm keyword for TASKING Compiler      */
+#define __INLINE inline /*!< inline keyword for TASKING Compiler   */
+#define __STATIC_INLINE static inline
+
+#elif defined(__CSMC__)
+#define __packed
+#define __ASM _asm      /*!< asm keyword for COSMIC Compiler      */
+#define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler   */
+#define __STATIC_INLINE static inline
 
 
-#define __CORTEX_M                (0x00)                                   /*!< Cortex-M Core                    */
-
-
-#if   defined ( __CC_ARM )
-  #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler          */
-  #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler       */
-  #define __STATIC_INLINE  static __inline
+#endif
 
 
-#elif defined ( __GNUC__ )
-  #define __ASM            __asm                                      /*!< asm keyword for GNU Compiler          */
-  #define __INLINE         inline                                     /*!< inline keyword for GNU Compiler       */
-  #define __STATIC_INLINE  static inline
+/** __FPU_USED indicates whether an FPU is used or not.
+    This core does not support an FPU at all
+*/
+#define __FPU_USED 0
 
 
-#elif defined ( __ICCARM__ )
-  #define __ASM            __asm                                      /*!< asm keyword for IAR Compiler          */
-  #define __INLINE         inline                                     /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
-  #define __STATIC_INLINE  static inline
+#if defined(__CC_ARM)
+#if defined __TARGET_FPU_VFP
+#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+#endif
 
 
-#elif defined ( __TMS470__ )
-  #define __ASM            __asm                                      /*!< asm keyword for TI CCS Compiler       */
-  #define __STATIC_INLINE  static inline
+#elif defined(__GNUC__)
+#if defined(__VFP_FP__) && !defined(__SOFTFP__)
+#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+#endif
 
 
-#elif defined ( __TASKING__ )
-  #define __ASM            __asm                                      /*!< asm keyword for TASKING Compiler      */
-  #define __INLINE         inline                                     /*!< inline keyword for TASKING Compiler   */
-  #define __STATIC_INLINE  static inline
+#elif defined(__ICCARM__)
+#if defined __ARMVFP__
+#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+#endif
 
 
-#elif defined ( __CSMC__ )
-  #define __packed
-  #define __ASM            _asm                                      /*!< asm keyword for COSMIC Compiler      */
-  #define __INLINE         inline                                    /*use -pc99 on compile line !< inline keyword for COSMIC Compiler   */
-  #define __STATIC_INLINE  static inline
+#elif defined(__TMS470__)
+#if defined __TI__VFP_SUPPORT____
+#warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+#endif
 
 
+#elif defined(__TASKING__)
+#if defined __FPU_VFP__
+#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
 #endif
 #endif
 
 
-/** __FPU_USED indicates whether an FPU is used or not.
-    This core does not support an FPU at all
-*/
-#define __FPU_USED       0
-
-#if defined ( __CC_ARM )
-  #if defined __TARGET_FPU_VFP
-    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
-  #endif
-
-#elif defined ( __GNUC__ )
-  #if defined (__VFP_FP__) && !defined(__SOFTFP__)
-    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
-  #endif
-
-#elif defined ( __ICCARM__ )
-  #if defined __ARMVFP__
-    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
-  #endif
-
-#elif defined ( __TMS470__ )
-  #if defined __TI__VFP_SUPPORT____
-    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
-  #endif
-
-#elif defined ( __TASKING__ )
-  #if defined __FPU_VFP__
-    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
-  #endif
-
-#elif defined ( __CSMC__ )		/* Cosmic */
-  #if ( __CSMC__ & 0x400)		// FPU present for parser
-    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
-  #endif
+#elif defined(__CSMC__) /* Cosmic */
+#if (__CSMC__ & 0x400)  // FPU present for parser
+#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+#endif
 #endif
 #endif
 
 
-#include <stdint.h>                      /* standard types definitions                      */
-#include <core_cmInstr.h>                /* Core Instruction Access                         */
-#include <core_cmFunc.h>                 /* Core Function Access                            */
+#include <stdint.h>       /* standard types definitions                      */
+#include <core_cmInstr.h> /* Core Instruction Access                         */
+#include <core_cmFunc.h>  /* Core Function Access                            */
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }
@@ -160,25 +158,26 @@
 #define __CORE_CM0_H_DEPENDANT
 #define __CORE_CM0_H_DEPENDANT
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
- extern "C" {
+extern "C"
+{
 #endif
 #endif
 
 
 /* check device defines and use defaults */
 /* check device defines and use defaults */
 #if defined __CHECK_DEVICE_DEFINES
 #if defined __CHECK_DEVICE_DEFINES
-  #ifndef __CM0_REV
-    #define __CM0_REV               0x0000
-    #warning "__CM0_REV not defined in device header file; using default!"
-  #endif
-
-  #ifndef __NVIC_PRIO_BITS
-    #define __NVIC_PRIO_BITS          2
-    #warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
-  #endif
-
-  #ifndef __Vendor_SysTickConfig
-    #define __Vendor_SysTickConfig    0
-    #warning "__Vendor_SysTickConfig not defined in device header file; using default!"
-  #endif
+#ifndef __CM0_REV
+#define __CM0_REV 0x0000
+#warning "__CM0_REV not defined in device header file; using default!"
+#endif
+
+#ifndef __NVIC_PRIO_BITS
+#define __NVIC_PRIO_BITS 2
+#warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
+#endif
+
+#ifndef __Vendor_SysTickConfig
+#define __Vendor_SysTickConfig 0
+#warning "__Vendor_SysTickConfig not defined in device header file; using default!"
+#endif
 #endif
 #endif
 
 
 /* IO definitions (access restrictions to peripheral registers) */
 /* IO definitions (access restrictions to peripheral registers) */
@@ -190,18 +189,16 @@
     \li for automatic generation of peripheral register debug information.
     \li for automatic generation of peripheral register debug information.
 */
 */
 #ifdef __cplusplus
 #ifdef __cplusplus
-  #define   __I     volatile             /*!< Defines 'read only' permissions                 */
+#define __I volatile /*!< Defines 'read only' permissions                 */
 #else
 #else
-  #define   __I     volatile const       /*!< Defines 'read only' permissions                 */
+#define __I volatile const /*!< Defines 'read only' permissions                 */
 #endif
 #endif
-#define     __O     volatile             /*!< Defines 'write only' permissions                */
-#define     __IO    volatile             /*!< Defines 'read / write' permissions              */
-
-/*@} end of group Cortex_M0 */
-
+#define __O volatile  /*!< Defines 'write only' permissions                */
+#define __IO volatile /*!< Defines 'read / write' permissions              */
 
 
+    /*@} end of group Cortex_M0 */
 
 
-/*******************************************************************************
+    /*******************************************************************************
  *                 Register Abstraction
  *                 Register Abstraction
   Core Register contain:
   Core Register contain:
   - Core Register
   - Core Register
@@ -209,275 +206,268 @@
   - Core SCB Register
   - Core SCB Register
   - Core SysTick Register
   - Core SysTick Register
  ******************************************************************************/
  ******************************************************************************/
-/** \defgroup CMSIS_core_register Defines and Type Definitions
+    /** \defgroup CMSIS_core_register Defines and Type Definitions
     \brief Type definitions and defines for Cortex-M processor based devices.
     \brief Type definitions and defines for Cortex-M processor based devices.
 */
 */
 
 
-/** \ingroup    CMSIS_core_register
+    /** \ingroup    CMSIS_core_register
     \defgroup   CMSIS_CORE  Status and Control Registers
     \defgroup   CMSIS_CORE  Status and Control Registers
     \brief  Core Register type definitions.
     \brief  Core Register type definitions.
   @{
   @{
  */
  */
 
 
-/** \brief  Union type to access the Application Program Status Register (APSR).
+    /** \brief  Union type to access the Application Program Status Register (APSR).
  */
  */
-typedef union
-{
-  struct
-  {
+    typedef union
+    {
+        struct
+        {
 #if (__CORTEX_M != 0x04)
 #if (__CORTEX_M != 0x04)
-    uint32_t _reserved0:27;              /*!< bit:  0..26  Reserved                           */
+            uint32_t _reserved0 : 27; /*!< bit:  0..26  Reserved                           */
 #else
 #else
-    uint32_t _reserved0:16;              /*!< bit:  0..15  Reserved                           */
-    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags        */
-    uint32_t _reserved1:7;               /*!< bit: 20..26  Reserved                           */
+        uint32_t _reserved0 : 16; /*!< bit:  0..15  Reserved                           */
+        uint32_t GE : 4;          /*!< bit: 16..19  Greater than or Equal flags        */
+        uint32_t _reserved1 : 7;  /*!< bit: 20..26  Reserved                           */
 #endif
 #endif
-    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag          */
-    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag       */
-    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag          */
-    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag           */
-    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag       */
-  } b;                                   /*!< Structure used for bit  access                  */
-  uint32_t w;                            /*!< Type      used for word access                  */
-} APSR_Type;
-
-
-/** \brief  Union type to access the Interrupt Program Status Register (IPSR).
+            uint32_t Q : 1; /*!< bit:     27  Saturation condition flag          */
+            uint32_t V : 1; /*!< bit:     28  Overflow condition code flag       */
+            uint32_t C : 1; /*!< bit:     29  Carry condition code flag          */
+            uint32_t Z : 1; /*!< bit:     30  Zero condition code flag           */
+            uint32_t N : 1; /*!< bit:     31  Negative condition code flag       */
+        } b;                /*!< Structure used for bit  access                  */
+        uint32_t w;         /*!< Type      used for word access                  */
+    } APSR_Type;
+
+    /** \brief  Union type to access the Interrupt Program Status Register (IPSR).
  */
  */
-typedef union
-{
-  struct
-  {
-    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number                   */
-    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved                           */
-  } b;                                   /*!< Structure used for bit  access                  */
-  uint32_t w;                            /*!< Type      used for word access                  */
-} IPSR_Type;
-
-
-/** \brief  Union type to access the Special-Purpose Program Status Registers (xPSR).
+    typedef union
+    {
+        struct
+        {
+            uint32_t ISR : 9;         /*!< bit:  0.. 8  Exception number                   */
+            uint32_t _reserved0 : 23; /*!< bit:  9..31  Reserved                           */
+        } b;                          /*!< Structure used for bit  access                  */
+        uint32_t w;                   /*!< Type      used for word access                  */
+    } IPSR_Type;
+
+    /** \brief  Union type to access the Special-Purpose Program Status Registers (xPSR).
  */
  */
-typedef union
-{
-  struct
-  {
-    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number                   */
+    typedef union
+    {
+        struct
+        {
+            uint32_t ISR : 9; /*!< bit:  0.. 8  Exception number                   */
 #if (__CORTEX_M != 0x04)
 #if (__CORTEX_M != 0x04)
-    uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved                           */
+            uint32_t _reserved0 : 15; /*!< bit:  9..23  Reserved                           */
 #else
 #else
-    uint32_t _reserved0:7;               /*!< bit:  9..15  Reserved                           */
-    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags        */
-    uint32_t _reserved1:4;               /*!< bit: 20..23  Reserved                           */
+        uint32_t _reserved0 : 7;  /*!< bit:  9..15  Reserved                           */
+        uint32_t GE : 4;          /*!< bit: 16..19  Greater than or Equal flags        */
+        uint32_t _reserved1 : 4;  /*!< bit: 20..23  Reserved                           */
 #endif
 #endif
-    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0)          */
-    uint32_t IT:2;                       /*!< bit: 25..26  saved IT state   (read 0)          */
-    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag          */
-    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag       */
-    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag          */
-    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag           */
-    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag       */
-  } b;                                   /*!< Structure used for bit  access                  */
-  uint32_t w;                            /*!< Type      used for word access                  */
-} xPSR_Type;
-
-
-/** \brief  Union type to access the Control Registers (CONTROL).
+            uint32_t T : 1;  /*!< bit:     24  Thumb bit        (read 0)          */
+            uint32_t IT : 2; /*!< bit: 25..26  saved IT state   (read 0)          */
+            uint32_t Q : 1;  /*!< bit:     27  Saturation condition flag          */
+            uint32_t V : 1;  /*!< bit:     28  Overflow condition code flag       */
+            uint32_t C : 1;  /*!< bit:     29  Carry condition code flag          */
+            uint32_t Z : 1;  /*!< bit:     30  Zero condition code flag           */
+            uint32_t N : 1;  /*!< bit:     31  Negative condition code flag       */
+        } b;                 /*!< Structure used for bit  access                  */
+        uint32_t w;          /*!< Type      used for word access                  */
+    } xPSR_Type;
+
+    /** \brief  Union type to access the Control Registers (CONTROL).
  */
  */
-typedef union
-{
-  struct
-  {
-    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */
-    uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used                   */
-    uint32_t FPCA:1;                     /*!< bit:      2  FP extension active flag           */
-    uint32_t _reserved0:29;              /*!< bit:  3..31  Reserved                           */
-  } b;                                   /*!< Structure used for bit  access                  */
-  uint32_t w;                            /*!< Type      used for word access                  */
-} CONTROL_Type;
-
-/*@} end of group CMSIS_CORE */
-
-
-/** \ingroup    CMSIS_core_register
+    typedef union
+    {
+        struct
+        {
+            uint32_t nPRIV : 1;       /*!< bit:      0  Execution privilege in Thread mode */
+            uint32_t SPSEL : 1;       /*!< bit:      1  Stack to be used                   */
+            uint32_t FPCA : 1;        /*!< bit:      2  FP extension active flag           */
+            uint32_t _reserved0 : 29; /*!< bit:  3..31  Reserved                           */
+        } b;                          /*!< Structure used for bit  access                  */
+        uint32_t w;                   /*!< Type      used for word access                  */
+    } CONTROL_Type;
+
+    /*@} end of group CMSIS_CORE */
+
+    /** \ingroup    CMSIS_core_register
     \defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)
     \defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)
     \brief      Type definitions for the NVIC Registers
     \brief      Type definitions for the NVIC Registers
   @{
   @{
  */
  */
 
 
-/** \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).
+    /** \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).
  */
  */
-typedef struct
-{
-  __IO uint32_t ISER[1];                 /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */
-       uint32_t RESERVED0[31];
-  __IO uint32_t ICER[1];                 /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register          */
-       uint32_t RSERVED1[31];
-  __IO uint32_t ISPR[1];                 /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register           */
-       uint32_t RESERVED2[31];
-  __IO uint32_t ICPR[1];                 /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register         */
-       uint32_t RESERVED3[31];
-       uint32_t RESERVED4[64];
-  __IO uint32_t IP[8];                   /*!< Offset: 0x300 (R/W)  Interrupt Priority Register              */
-}  NVIC_Type;
-
-/*@} end of group CMSIS_NVIC */
-
-
-/** \ingroup  CMSIS_core_register
+    typedef struct
+    {
+        __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */
+        uint32_t RESERVED0[31];
+        __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register          */
+        uint32_t RSERVED1[31];
+        __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register           */
+        uint32_t RESERVED2[31];
+        __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register         */
+        uint32_t RESERVED3[31];
+        uint32_t RESERVED4[64];
+        __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W)  Interrupt Priority Register              */
+    } NVIC_Type;
+
+    /*@} end of group CMSIS_NVIC */
+
+    /** \ingroup  CMSIS_core_register
     \defgroup CMSIS_SCB     System Control Block (SCB)
     \defgroup CMSIS_SCB     System Control Block (SCB)
     \brief      Type definitions for the System Control Block Registers
     \brief      Type definitions for the System Control Block Registers
   @{
   @{
  */
  */
 
 
-/** \brief  Structure type to access the System Control Block (SCB).
+    /** \brief  Structure type to access the System Control Block (SCB).
  */
  */
-typedef struct
-{
-  __I  uint32_t CPUID;                   /*!< Offset: 0x000 (R/ )  CPUID Base Register                                   */
-  __IO uint32_t ICSR;                    /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register                  */
-       uint32_t RESERVED0;
-  __IO uint32_t AIRCR;                   /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register      */
-  __IO uint32_t SCR;                     /*!< Offset: 0x010 (R/W)  System Control Register                               */
-  __IO uint32_t CCR;                     /*!< Offset: 0x014 (R/W)  Configuration Control Register                        */
-       uint32_t RESERVED1;
-  __IO uint32_t SHP[2];                  /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED   */
-  __IO uint32_t SHCSR;                   /*!< Offset: 0x024 (R/W)  System Handler Control and State Register             */
-} SCB_Type;
+    typedef struct
+    {
+        __I uint32_t CPUID; /*!< Offset: 0x000 (R/ )  CPUID Base Register                                   */
+        __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register                  */
+        uint32_t RESERVED0;
+        __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register      */
+        __IO uint32_t SCR;   /*!< Offset: 0x010 (R/W)  System Control Register                               */
+        __IO uint32_t CCR;   /*!< Offset: 0x014 (R/W)  Configuration Control Register                        */
+        uint32_t RESERVED1;
+        __IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED   */
+        __IO uint32_t SHCSR;  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register             */
+    } SCB_Type;
 
 
 /* SCB CPUID Register Definitions */
 /* SCB CPUID Register Definitions */
-#define SCB_CPUID_IMPLEMENTER_Pos          24                                             /*!< SCB CPUID: IMPLEMENTER Position */
-#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */
+#define SCB_CPUID_IMPLEMENTER_Pos 24                                    /*!< SCB CPUID: IMPLEMENTER Position */
+#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
 
 
-#define SCB_CPUID_VARIANT_Pos              20                                             /*!< SCB CPUID: VARIANT Position */
-#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */
+#define SCB_CPUID_VARIANT_Pos 20                               /*!< SCB CPUID: VARIANT Position */
+#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
 
 
-#define SCB_CPUID_ARCHITECTURE_Pos         16                                             /*!< SCB CPUID: ARCHITECTURE Position */
-#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */
+#define SCB_CPUID_ARCHITECTURE_Pos 16                                    /*!< SCB CPUID: ARCHITECTURE Position */
+#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
 
 
-#define SCB_CPUID_PARTNO_Pos                4                                             /*!< SCB CPUID: PARTNO Position */
-#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */
+#define SCB_CPUID_PARTNO_Pos 4                                 /*!< SCB CPUID: PARTNO Position */
+#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
 
 
-#define SCB_CPUID_REVISION_Pos              0                                             /*!< SCB CPUID: REVISION Position */
-#define SCB_CPUID_REVISION_Msk             (0xFUL << SCB_CPUID_REVISION_Pos)              /*!< SCB CPUID: REVISION Mask */
+#define SCB_CPUID_REVISION_Pos 0                                 /*!< SCB CPUID: REVISION Position */
+#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */
 
 
 /* SCB Interrupt Control State Register Definitions */
 /* SCB Interrupt Control State Register Definitions */
-#define SCB_ICSR_NMIPENDSET_Pos            31                                             /*!< SCB ICSR: NMIPENDSET Position */
-#define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */
+#define SCB_ICSR_NMIPENDSET_Pos 31                               /*!< SCB ICSR: NMIPENDSET Position */
+#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */
 
 
-#define SCB_ICSR_PENDSVSET_Pos             28                                             /*!< SCB ICSR: PENDSVSET Position */
-#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */
+#define SCB_ICSR_PENDSVSET_Pos 28                              /*!< SCB ICSR: PENDSVSET Position */
+#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */
 
 
-#define SCB_ICSR_PENDSVCLR_Pos             27                                             /*!< SCB ICSR: PENDSVCLR Position */
-#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */
+#define SCB_ICSR_PENDSVCLR_Pos 27                              /*!< SCB ICSR: PENDSVCLR Position */
+#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */
 
 
-#define SCB_ICSR_PENDSTSET_Pos             26                                             /*!< SCB ICSR: PENDSTSET Position */
-#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */
+#define SCB_ICSR_PENDSTSET_Pos 26                              /*!< SCB ICSR: PENDSTSET Position */
+#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */
 
 
-#define SCB_ICSR_PENDSTCLR_Pos             25                                             /*!< SCB ICSR: PENDSTCLR Position */
-#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */
+#define SCB_ICSR_PENDSTCLR_Pos 25                              /*!< SCB ICSR: PENDSTCLR Position */
+#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */
 
 
-#define SCB_ICSR_ISRPREEMPT_Pos            23                                             /*!< SCB ICSR: ISRPREEMPT Position */
-#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */
+#define SCB_ICSR_ISRPREEMPT_Pos 23                               /*!< SCB ICSR: ISRPREEMPT Position */
+#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */
 
 
-#define SCB_ICSR_ISRPENDING_Pos            22                                             /*!< SCB ICSR: ISRPENDING Position */
-#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */
+#define SCB_ICSR_ISRPENDING_Pos 22                               /*!< SCB ICSR: ISRPENDING Position */
+#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */
 
 
-#define SCB_ICSR_VECTPENDING_Pos           12                                             /*!< SCB ICSR: VECTPENDING Position */
-#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */
+#define SCB_ICSR_VECTPENDING_Pos 12                                    /*!< SCB ICSR: VECTPENDING Position */
+#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */
 
 
-#define SCB_ICSR_VECTACTIVE_Pos             0                                             /*!< SCB ICSR: VECTACTIVE Position */
-#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos)           /*!< SCB ICSR: VECTACTIVE Mask */
+#define SCB_ICSR_VECTACTIVE_Pos 0                                    /*!< SCB ICSR: VECTACTIVE Position */
+#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */
 
 
 /* SCB Application Interrupt and Reset Control Register Definitions */
 /* SCB Application Interrupt and Reset Control Register Definitions */
-#define SCB_AIRCR_VECTKEY_Pos              16                                             /*!< SCB AIRCR: VECTKEY Position */
-#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */
+#define SCB_AIRCR_VECTKEY_Pos 16                                  /*!< SCB AIRCR: VECTKEY Position */
+#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */
 
 
-#define SCB_AIRCR_VECTKEYSTAT_Pos          16                                             /*!< SCB AIRCR: VECTKEYSTAT Position */
-#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */
+#define SCB_AIRCR_VECTKEYSTAT_Pos 16                                      /*!< SCB AIRCR: VECTKEYSTAT Position */
+#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */
 
 
-#define SCB_AIRCR_ENDIANESS_Pos            15                                             /*!< SCB AIRCR: ENDIANESS Position */
-#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */
+#define SCB_AIRCR_ENDIANESS_Pos 15                               /*!< SCB AIRCR: ENDIANESS Position */
+#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */
 
 
-#define SCB_AIRCR_SYSRESETREQ_Pos           2                                             /*!< SCB AIRCR: SYSRESETREQ Position */
-#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */
+#define SCB_AIRCR_SYSRESETREQ_Pos 2                                  /*!< SCB AIRCR: SYSRESETREQ Position */
+#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */
 
 
-#define SCB_AIRCR_VECTCLRACTIVE_Pos         1                                             /*!< SCB AIRCR: VECTCLRACTIVE Position */
-#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */
+#define SCB_AIRCR_VECTCLRACTIVE_Pos 1                                    /*!< SCB AIRCR: VECTCLRACTIVE Position */
+#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */
 
 
 /* SCB System Control Register Definitions */
 /* SCB System Control Register Definitions */
-#define SCB_SCR_SEVONPEND_Pos               4                                             /*!< SCB SCR: SEVONPEND Position */
-#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */
+#define SCB_SCR_SEVONPEND_Pos 4                              /*!< SCB SCR: SEVONPEND Position */
+#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */
 
 
-#define SCB_SCR_SLEEPDEEP_Pos               2                                             /*!< SCB SCR: SLEEPDEEP Position */
-#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */
+#define SCB_SCR_SLEEPDEEP_Pos 2                              /*!< SCB SCR: SLEEPDEEP Position */
+#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */
 
 
-#define SCB_SCR_SLEEPONEXIT_Pos             1                                             /*!< SCB SCR: SLEEPONEXIT Position */
-#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */
+#define SCB_SCR_SLEEPONEXIT_Pos 1                                /*!< SCB SCR: SLEEPONEXIT Position */
+#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */
 
 
 /* SCB Configuration Control Register Definitions */
 /* SCB Configuration Control Register Definitions */
-#define SCB_CCR_STKALIGN_Pos                9                                             /*!< SCB CCR: STKALIGN Position */
-#define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */
+#define SCB_CCR_STKALIGN_Pos 9                             /*!< SCB CCR: STKALIGN Position */
+#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */
 
 
-#define SCB_CCR_UNALIGN_TRP_Pos             3                                             /*!< SCB CCR: UNALIGN_TRP Position */
-#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */
+#define SCB_CCR_UNALIGN_TRP_Pos 3                                /*!< SCB CCR: UNALIGN_TRP Position */
+#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */
 
 
 /* SCB System Handler Control and State Register Definitions */
 /* SCB System Handler Control and State Register Definitions */
-#define SCB_SHCSR_SVCALLPENDED_Pos         15                                             /*!< SCB SHCSR: SVCALLPENDED Position */
-#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */
-
-/*@} end of group CMSIS_SCB */
+#define SCB_SHCSR_SVCALLPENDED_Pos 15                                  /*!< SCB SHCSR: SVCALLPENDED Position */
+#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */
 
 
+    /*@} end of group CMSIS_SCB */
 
 
-/** \ingroup  CMSIS_core_register
+    /** \ingroup  CMSIS_core_register
     \defgroup CMSIS_SysTick     System Tick Timer (SysTick)
     \defgroup CMSIS_SysTick     System Tick Timer (SysTick)
     \brief      Type definitions for the System Timer Registers.
     \brief      Type definitions for the System Timer Registers.
   @{
   @{
  */
  */
 
 
-/** \brief  Structure type to access the System Timer (SysTick).
+    /** \brief  Structure type to access the System Timer (SysTick).
  */
  */
-typedef struct
-{
-  __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
-  __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */
-  __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */
-  __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */
-} SysTick_Type;
+    typedef struct
+    {
+        __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
+        __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */
+        __IO uint32_t VAL;  /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */
+        __I uint32_t CALIB; /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */
+    } SysTick_Type;
 
 
 /* SysTick Control / Status Register Definitions */
 /* SysTick Control / Status Register Definitions */
-#define SysTick_CTRL_COUNTFLAG_Pos         16                                             /*!< SysTick CTRL: COUNTFLAG Position */
-#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */
+#define SysTick_CTRL_COUNTFLAG_Pos 16                                  /*!< SysTick CTRL: COUNTFLAG Position */
+#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */
 
 
-#define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */
-#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */
+#define SysTick_CTRL_CLKSOURCE_Pos 2                                   /*!< SysTick CTRL: CLKSOURCE Position */
+#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
 
 
-#define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */
-#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */
+#define SysTick_CTRL_TICKINT_Pos 1                                 /*!< SysTick CTRL: TICKINT Position */
+#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
 
 
-#define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */
-#define SysTick_CTRL_ENABLE_Msk            (1UL << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */
+#define SysTick_CTRL_ENABLE_Pos 0                                /*!< SysTick CTRL: ENABLE Position */
+#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */
 
 
 /* SysTick Reload Register Definitions */
 /* SysTick Reload Register Definitions */
-#define SysTick_LOAD_RELOAD_Pos             0                                             /*!< SysTick LOAD: RELOAD Position */
-#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos)        /*!< SysTick LOAD: RELOAD Mask */
+#define SysTick_LOAD_RELOAD_Pos 0                                       /*!< SysTick LOAD: RELOAD Position */
+#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */
 
 
 /* SysTick Current Register Definitions */
 /* SysTick Current Register Definitions */
-#define SysTick_VAL_CURRENT_Pos             0                                             /*!< SysTick VAL: CURRENT Position */
-#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick VAL: CURRENT Mask */
+#define SysTick_VAL_CURRENT_Pos 0                                       /*!< SysTick VAL: CURRENT Position */
+#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */
 
 
 /* SysTick Calibration Register Definitions */
 /* SysTick Calibration Register Definitions */
-#define SysTick_CALIB_NOREF_Pos            31                                             /*!< SysTick CALIB: NOREF Position */
-#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */
+#define SysTick_CALIB_NOREF_Pos 31                               /*!< SysTick CALIB: NOREF Position */
+#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */
 
 
-#define SysTick_CALIB_SKEW_Pos             30                                             /*!< SysTick CALIB: SKEW Position */
-#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */
+#define SysTick_CALIB_SKEW_Pos 30                              /*!< SysTick CALIB: SKEW Position */
+#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */
 
 
-#define SysTick_CALIB_TENMS_Pos             0                                             /*!< SysTick CALIB: TENMS Position */
-#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL << SysTick_CALIB_TENMS_Pos)        /*!< SysTick CALIB: TENMS Mask */
+#define SysTick_CALIB_TENMS_Pos 0                                       /*!< SysTick CALIB: TENMS Position */
+#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_CALIB_TENMS_Pos) /*!< SysTick CALIB: TENMS Mask */
 
 
 /*@} end of group CMSIS_SysTick */
 /*@} end of group CMSIS_SysTick */
 
 
-
 /** \ingroup  CMSIS_core_register
 /** \ingroup  CMSIS_core_register
     \defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)
     \defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)
     \brief      Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR)
     \brief      Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR)
@@ -487,7 +477,6 @@ typedef struct
  */
  */
 /*@} end of group CMSIS_CoreDebug */
 /*@} end of group CMSIS_CoreDebug */
 
 
-
 /** \ingroup    CMSIS_core_register
 /** \ingroup    CMSIS_core_register
     \defgroup   CMSIS_core_base     Core Definitions
     \defgroup   CMSIS_core_base     Core Definitions
     \brief      Definitions for base addresses, unions, and structures.
     \brief      Definitions for base addresses, unions, and structures.
@@ -495,20 +484,17 @@ typedef struct
  */
  */
 
 
 /* Memory mapping of Cortex-M0 Hardware */
 /* Memory mapping of Cortex-M0 Hardware */
-#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */
-#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address              */
-#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address                 */
-#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */
-
-#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct           */
-#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct       */
-#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct          */
+#define SCS_BASE (0xE000E000UL)            /*!< System Control Space Base Address */
+#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address              */
+#define NVIC_BASE (SCS_BASE + 0x0100UL)    /*!< NVIC Base Address                 */
+#define SCB_BASE (SCS_BASE + 0x0D00UL)     /*!< System Control Block Base Address */
 
 
+#define SCB ((SCB_Type *)SCB_BASE)             /*!< SCB configuration struct           */
+#define SysTick ((SysTick_Type *)SysTick_BASE) /*!< SysTick configuration struct       */
+#define NVIC ((NVIC_Type *)NVIC_BASE)          /*!< NVIC configuration struct          */
 
 
 /*@} */
 /*@} */
 
 
-
-
 /*******************************************************************************
 /*******************************************************************************
  *                Hardware Abstraction Layer
  *                Hardware Abstraction Layer
   Core Function Interface contains:
   Core Function Interface contains:
@@ -519,8 +505,6 @@ typedef struct
 /** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
 /** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
 */
 */
 
 
-
-
 /* ##########################   NVIC functions  #################################### */
 /* ##########################   NVIC functions  #################################### */
 /** \ingroup  CMSIS_Core_FunctionInterface
 /** \ingroup  CMSIS_Core_FunctionInterface
     \defgroup CMSIS_Core_NVICFunctions NVIC Functions
     \defgroup CMSIS_Core_NVICFunctions NVIC Functions
@@ -530,36 +514,33 @@ typedef struct
 
 
 /* Interrupt Priorities are WORD accessible only under ARMv6M                   */
 /* Interrupt Priorities are WORD accessible only under ARMv6M                   */
 /* The following MACROS handle generation of the register offset and byte masks */
 /* The following MACROS handle generation of the register offset and byte masks */
-#define _BIT_SHIFT(IRQn)         (  (((uint32_t)(IRQn)       )    &  0x03) * 8 )
-#define _SHP_IDX(IRQn)           ( ((((uint32_t)(IRQn) & 0x0F)-8) >>    2)     )
-#define _IP_IDX(IRQn)            (   ((uint32_t)(IRQn)            >>    2)     )
+#define _BIT_SHIFT(IRQn) ((((uint32_t)(IRQn)) & 0x03) * 8)
+#define _SHP_IDX(IRQn) (((((uint32_t)(IRQn)&0x0F) - 8) >> 2))
+#define _IP_IDX(IRQn) (((uint32_t)(IRQn) >> 2))
 
 
-
-/** \brief  Enable External Interrupt
+    /** \brief  Enable External Interrupt
 
 
     The function enables a device-specific interrupt in the NVIC interrupt controller.
     The function enables a device-specific interrupt in the NVIC interrupt controller.
 
 
     \param [in]      IRQn  External interrupt number. Value cannot be negative.
     \param [in]      IRQn  External interrupt number. Value cannot be negative.
  */
  */
-__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
-{
-  NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
-}
+    __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
+    {
+        NVIC->ISER[0] = (1 << ((uint32_t)(IRQn)&0x1F));
+    }
 
 
-
-/** \brief  Disable External Interrupt
+    /** \brief  Disable External Interrupt
 
 
     The function disables a device-specific interrupt in the NVIC interrupt controller.
     The function disables a device-specific interrupt in the NVIC interrupt controller.
 
 
     \param [in]      IRQn  External interrupt number. Value cannot be negative.
     \param [in]      IRQn  External interrupt number. Value cannot be negative.
  */
  */
-__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
-{
-  NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
-}
+    __STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
+    {
+        NVIC->ICER[0] = (1 << ((uint32_t)(IRQn)&0x1F));
+    }
 
 
-
-/** \brief  Get Pending Interrupt
+    /** \brief  Get Pending Interrupt
 
 
     The function reads the pending register in the NVIC and returns the pending bit
     The function reads the pending register in the NVIC and returns the pending bit
     for the specified interrupt.
     for the specified interrupt.
@@ -569,37 +550,34 @@ __STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
     \return             0  Interrupt status is not pending.
     \return             0  Interrupt status is not pending.
     \return             1  Interrupt status is pending.
     \return             1  Interrupt status is pending.
  */
  */
-__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
-{
-  return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0));
-}
+    __STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
+    {
+        return ((uint32_t)((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn)&0x1F))) ? 1 : 0));
+    }
 
 
-
-/** \brief  Set Pending Interrupt
+    /** \brief  Set Pending Interrupt
 
 
     The function sets the pending bit of an external interrupt.
     The function sets the pending bit of an external interrupt.
 
 
     \param [in]      IRQn  Interrupt number. Value cannot be negative.
     \param [in]      IRQn  Interrupt number. Value cannot be negative.
  */
  */
-__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
-{
-  NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
-}
-
+    __STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
+    {
+        NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn)&0x1F));
+    }
 
 
-/** \brief  Clear Pending Interrupt
+    /** \brief  Clear Pending Interrupt
 
 
     The function clears the pending bit of an external interrupt.
     The function clears the pending bit of an external interrupt.
 
 
     \param [in]      IRQn  External interrupt number. Value cannot be negative.
     \param [in]      IRQn  External interrupt number. Value cannot be negative.
  */
  */
-__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
-{
-  NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */
-}
-
+    __STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
+    {
+        NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn)&0x1F)); /* Clear pending interrupt */
+    }
 
 
-/** \brief  Set Interrupt Priority
+    /** \brief  Set Interrupt Priority
 
 
     The function sets the priority of an interrupt.
     The function sets the priority of an interrupt.
 
 
@@ -608,18 +586,21 @@ __STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
     \param [in]      IRQn  Interrupt number.
     \param [in]      IRQn  Interrupt number.
     \param [in]  priority  Priority to set.
     \param [in]  priority  Priority to set.
  */
  */
-__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
-{
-  if(IRQn < 0) {
-    SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
-        (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
-  else {
-    NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
-        (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
-}
-
-
-/** \brief  Get Interrupt Priority
+    __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
+    {
+        if (IRQn < 0)
+        {
+            SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
+                                       (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn));
+        }
+        else
+        {
+            NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
+                                      (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn));
+        }
+    }
+
+    /** \brief  Get Interrupt Priority
 
 
     The function reads the priority of an interrupt. The interrupt
     The function reads the priority of an interrupt. The interrupt
     number can be positive to specify an external (device specific)
     number can be positive to specify an external (device specific)
@@ -630,36 +611,38 @@ __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
     \return             Interrupt Priority. Value is aligned automatically to the implemented
     \return             Interrupt Priority. Value is aligned automatically to the implemented
                         priority bits of the microcontroller.
                         priority bits of the microcontroller.
  */
  */
-__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
-{
-
-  if(IRQn < 0) {
-    return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for Cortex-M0 system interrupts */
-  else {
-    return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for device specific interrupts  */
-}
+    __STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
+    {
 
 
+        if (IRQn < 0)
+        {
+            return ((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn)) & 0xFF) >> (8 - __NVIC_PRIO_BITS)));
+        } /* get priority for Cortex-M0 system interrupts */
+        else
+        {
+            return ((uint32_t)(((NVIC->IP[_IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn)) & 0xFF) >> (8 - __NVIC_PRIO_BITS)));
+        } /* get priority for device specific interrupts  */
+    }
 
 
-/** \brief  System Reset
+    /** \brief  System Reset
 
 
     The function initiates a system reset request to reset the MCU.
     The function initiates a system reset request to reset the MCU.
  */
  */
-__STATIC_INLINE void NVIC_SystemReset(void)
-{
-  __DSB();                                                     /* Ensure all outstanding memory accesses included
+    __STATIC_INLINE void NVIC_SystemReset(void)
+    {
+        __DSB(); /* Ensure all outstanding memory accesses included
                                                                   buffered write are completed before reset */
                                                                   buffered write are completed before reset */
-  SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |
-                 SCB_AIRCR_SYSRESETREQ_Msk);
-  __DSB();                                                     /* Ensure completion of memory access */
-  while(1);                                                    /* wait until reset */
-}
+        SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
+                      SCB_AIRCR_SYSRESETREQ_Msk);
+        __DSB(); /* Ensure completion of memory access */
+        while (1)
+            ; /* wait until reset */
+    }
 
 
-/*@} end of CMSIS_Core_NVICFunctions */
+    /*@} end of CMSIS_Core_NVICFunctions */
 
 
-
-
-/* ##################################    SysTick function  ############################################ */
-/** \ingroup  CMSIS_Core_FunctionInterface
+    /* ##################################    SysTick function  ############################################ */
+    /** \ingroup  CMSIS_Core_FunctionInterface
     \defgroup CMSIS_Core_SysTickFunctions SysTick Functions
     \defgroup CMSIS_Core_SysTickFunctions SysTick Functions
     \brief      Functions that configure the System.
     \brief      Functions that configure the System.
   @{
   @{
@@ -667,7 +650,7 @@ __STATIC_INLINE void NVIC_SystemReset(void)
 
 
 #if (__Vendor_SysTickConfig == 0)
 #if (__Vendor_SysTickConfig == 0)
 
 
-/** \brief  System Tick Configuration
+    /** \brief  System Tick Configuration
 
 
     The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
     The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
     Counter is in free running mode to generate periodic interrupts.
     Counter is in free running mode to generate periodic interrupts.
@@ -682,25 +665,23 @@ __STATIC_INLINE void NVIC_SystemReset(void)
     must contain a vendor-specific implementation of this function.
     must contain a vendor-specific implementation of this function.
 
 
  */
  */
-__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
-{
-  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */
-
-  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
-  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
-  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
-  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
-                   SysTick_CTRL_TICKINT_Msk   |
-                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
-  return (0);                                                  /* Function successful */
-}
+    __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
+    {
+        if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)
+            return (1); /* Reload value impossible */
+
+        SysTick->LOAD = ticks - 1;                                   /* set reload register */
+        NVIC_SetPriority(SysTick_IRQn, (1 << __NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
+        SysTick->VAL = 0;                                            /* Load the SysTick Counter Value */
+        SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
+                        SysTick_CTRL_TICKINT_Msk |
+                        SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
+        return (0);                              /* Function successful */
+    }
 
 
 #endif
 #endif
 
 
-/*@} end of CMSIS_Core_SysTickFunctions */
-
-
-
+    /*@} end of CMSIS_Core_SysTickFunctions */
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }

File diff suppressed because it is too large
+ 373 - 394
bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cm0plus.h


File diff suppressed because it is too large
+ 762 - 778
bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cm3.h


File diff suppressed because it is too large
+ 869 - 886
bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cm4.h


File diff suppressed because it is too large
+ 1001 - 1018
bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cm7.h


+ 163 - 165
bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cmFunc.h

@@ -1,4 +1,4 @@
-/**************************************************************************//**
+/**************************************************************************/ /**
  * @file     core_cmFunc.h
  * @file     core_cmFunc.h
  * @brief    CMSIS Cortex-M Core Function Access Header File
  * @brief    CMSIS Cortex-M Core Function Access Header File
  * @version  V4.00
  * @version  V4.00
@@ -34,22 +34,20 @@
    POSSIBILITY OF SUCH DAMAGE.
    POSSIBILITY OF SUCH DAMAGE.
    ---------------------------------------------------------------------------*/
    ---------------------------------------------------------------------------*/
 
 
-
 #ifndef __CORE_CMFUNC_H
 #ifndef __CORE_CMFUNC_H
 #define __CORE_CMFUNC_H
 #define __CORE_CMFUNC_H
 
 
-
 /* ###########################  Core Function Access  ########################### */
 /* ###########################  Core Function Access  ########################### */
 /** \ingroup  CMSIS_Core_FunctionInterface
 /** \ingroup  CMSIS_Core_FunctionInterface
     \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
     \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
   @{
   @{
  */
  */
 
 
-#if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
+#if defined(__CC_ARM) /*------------------RealView Compiler -----------------*/
 /* ARM armcc specific functions */
 /* ARM armcc specific functions */
 
 
 #if (__ARMCC_VERSION < 400677)
 #if (__ARMCC_VERSION < 400677)
-  #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
+#error "Please use ARM Compiler Toolchain V4.0.677 or later!"
 #endif
 #endif
 
 
 /* intrinsic void __enable_irq();     */
 /* intrinsic void __enable_irq();     */
@@ -63,11 +61,10 @@
  */
  */
 __STATIC_INLINE uint32_t __get_CONTROL(void)
 __STATIC_INLINE uint32_t __get_CONTROL(void)
 {
 {
-  register uint32_t __regControl         __ASM("control");
-  return(__regControl);
+    register uint32_t __regControl __ASM("control");
+    return (__regControl);
 }
 }
 
 
-
 /** \brief  Set Control Register
 /** \brief  Set Control Register
 
 
     This function writes the given value to the Control Register.
     This function writes the given value to the Control Register.
@@ -76,11 +73,10 @@ __STATIC_INLINE uint32_t __get_CONTROL(void)
  */
  */
 __STATIC_INLINE void __set_CONTROL(uint32_t control)
 __STATIC_INLINE void __set_CONTROL(uint32_t control)
 {
 {
-  register uint32_t __regControl         __ASM("control");
-  __regControl = control;
+    register uint32_t __regControl __ASM("control");
+    __regControl = control;
 }
 }
 
 
-
 /** \brief  Get IPSR Register
 /** \brief  Get IPSR Register
 
 
     This function returns the content of the IPSR Register.
     This function returns the content of the IPSR Register.
@@ -89,11 +85,10 @@ __STATIC_INLINE void __set_CONTROL(uint32_t control)
  */
  */
 __STATIC_INLINE uint32_t __get_IPSR(void)
 __STATIC_INLINE uint32_t __get_IPSR(void)
 {
 {
-  register uint32_t __regIPSR          __ASM("ipsr");
-  return(__regIPSR);
+    register uint32_t __regIPSR __ASM("ipsr");
+    return (__regIPSR);
 }
 }
 
 
-
 /** \brief  Get APSR Register
 /** \brief  Get APSR Register
 
 
     This function returns the content of the APSR Register.
     This function returns the content of the APSR Register.
@@ -102,11 +97,10 @@ __STATIC_INLINE uint32_t __get_IPSR(void)
  */
  */
 __STATIC_INLINE uint32_t __get_APSR(void)
 __STATIC_INLINE uint32_t __get_APSR(void)
 {
 {
-  register uint32_t __regAPSR          __ASM("apsr");
-  return(__regAPSR);
+    register uint32_t __regAPSR __ASM("apsr");
+    return (__regAPSR);
 }
 }
 
 
-
 /** \brief  Get xPSR Register
 /** \brief  Get xPSR Register
 
 
     This function returns the content of the xPSR Register.
     This function returns the content of the xPSR Register.
@@ -115,11 +109,10 @@ __STATIC_INLINE uint32_t __get_APSR(void)
  */
  */
 __STATIC_INLINE uint32_t __get_xPSR(void)
 __STATIC_INLINE uint32_t __get_xPSR(void)
 {
 {
-  register uint32_t __regXPSR          __ASM("xpsr");
-  return(__regXPSR);
+    register uint32_t __regXPSR __ASM("xpsr");
+    return (__regXPSR);
 }
 }
 
 
-
 /** \brief  Get Process Stack Pointer
 /** \brief  Get Process Stack Pointer
 
 
     This function returns the current value of the Process Stack Pointer (PSP).
     This function returns the current value of the Process Stack Pointer (PSP).
@@ -128,11 +121,10 @@ __STATIC_INLINE uint32_t __get_xPSR(void)
  */
  */
 __STATIC_INLINE uint32_t __get_PSP(void)
 __STATIC_INLINE uint32_t __get_PSP(void)
 {
 {
-  register uint32_t __regProcessStackPointer  __ASM("psp");
-  return(__regProcessStackPointer);
+    register uint32_t __regProcessStackPointer __ASM("psp");
+    return (__regProcessStackPointer);
 }
 }
 
 
-
 /** \brief  Set Process Stack Pointer
 /** \brief  Set Process Stack Pointer
 
 
     This function assigns the given value to the Process Stack Pointer (PSP).
     This function assigns the given value to the Process Stack Pointer (PSP).
@@ -141,11 +133,10 @@ __STATIC_INLINE uint32_t __get_PSP(void)
  */
  */
 __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
 __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
 {
 {
-  register uint32_t __regProcessStackPointer  __ASM("psp");
-  __regProcessStackPointer = topOfProcStack;
+    register uint32_t __regProcessStackPointer __ASM("psp");
+    __regProcessStackPointer = topOfProcStack;
 }
 }
 
 
-
 /** \brief  Get Main Stack Pointer
 /** \brief  Get Main Stack Pointer
 
 
     This function returns the current value of the Main Stack Pointer (MSP).
     This function returns the current value of the Main Stack Pointer (MSP).
@@ -154,11 +145,10 @@ __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
  */
  */
 __STATIC_INLINE uint32_t __get_MSP(void)
 __STATIC_INLINE uint32_t __get_MSP(void)
 {
 {
-  register uint32_t __regMainStackPointer     __ASM("msp");
-  return(__regMainStackPointer);
+    register uint32_t __regMainStackPointer __ASM("msp");
+    return (__regMainStackPointer);
 }
 }
 
 
-
 /** \brief  Set Main Stack Pointer
 /** \brief  Set Main Stack Pointer
 
 
     This function assigns the given value to the Main Stack Pointer (MSP).
     This function assigns the given value to the Main Stack Pointer (MSP).
@@ -167,11 +157,10 @@ __STATIC_INLINE uint32_t __get_MSP(void)
  */
  */
 __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
 __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
 {
 {
-  register uint32_t __regMainStackPointer     __ASM("msp");
-  __regMainStackPointer = topOfMainStack;
+    register uint32_t __regMainStackPointer __ASM("msp");
+    __regMainStackPointer = topOfMainStack;
 }
 }
 
 
-
 /** \brief  Get Priority Mask
 /** \brief  Get Priority Mask
 
 
     This function returns the current state of the priority mask bit from the Priority Mask Register.
     This function returns the current state of the priority mask bit from the Priority Mask Register.
@@ -180,11 +169,10 @@ __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
  */
  */
 __STATIC_INLINE uint32_t __get_PRIMASK(void)
 __STATIC_INLINE uint32_t __get_PRIMASK(void)
 {
 {
-  register uint32_t __regPriMask         __ASM("primask");
-  return(__regPriMask);
+    register uint32_t __regPriMask __ASM("primask");
+    return (__regPriMask);
 }
 }
 
 
-
 /** \brief  Set Priority Mask
 /** \brief  Set Priority Mask
 
 
     This function assigns the given value to the Priority Mask Register.
     This function assigns the given value to the Priority Mask Register.
@@ -193,28 +181,25 @@ __STATIC_INLINE uint32_t __get_PRIMASK(void)
  */
  */
 __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
 __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
 {
 {
-  register uint32_t __regPriMask         __ASM("primask");
-  __regPriMask = (priMask);
+    register uint32_t __regPriMask __ASM("primask");
+    __regPriMask = (priMask);
 }
 }
 
 
-
-#if       (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
+#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
 
 
 /** \brief  Enable FIQ
 /** \brief  Enable FIQ
 
 
     This function enables FIQ interrupts by clearing the F-bit in the CPSR.
     This function enables FIQ interrupts by clearing the F-bit in the CPSR.
     Can only be executed in Privileged modes.
     Can only be executed in Privileged modes.
  */
  */
-#define __enable_fault_irq                __enable_fiq
-
+#define __enable_fault_irq __enable_fiq
 
 
 /** \brief  Disable FIQ
 /** \brief  Disable FIQ
 
 
     This function disables FIQ interrupts by setting the F-bit in the CPSR.
     This function disables FIQ interrupts by setting the F-bit in the CPSR.
     Can only be executed in Privileged modes.
     Can only be executed in Privileged modes.
  */
  */
-#define __disable_fault_irq               __disable_fiq
-
+#define __disable_fault_irq __disable_fiq
 
 
 /** \brief  Get Base Priority
 /** \brief  Get Base Priority
 
 
@@ -222,13 +207,12 @@ __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
 
 
     \return               Base Priority register value
     \return               Base Priority register value
  */
  */
-__STATIC_INLINE uint32_t  __get_BASEPRI(void)
+__STATIC_INLINE uint32_t __get_BASEPRI(void)
 {
 {
-  register uint32_t __regBasePri         __ASM("basepri");
-  return(__regBasePri);
+    register uint32_t __regBasePri __ASM("basepri");
+    return (__regBasePri);
 }
 }
 
 
-
 /** \brief  Set Base Priority
 /** \brief  Set Base Priority
 
 
     This function assigns the given value to the Base Priority register.
     This function assigns the given value to the Base Priority register.
@@ -237,11 +221,10 @@ __STATIC_INLINE uint32_t  __get_BASEPRI(void)
  */
  */
 __STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
 __STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
 {
 {
-  register uint32_t __regBasePri         __ASM("basepri");
-  __regBasePri = (basePri & 0xff);
+    register uint32_t __regBasePri __ASM("basepri");
+    __regBasePri = (basePri & 0xff);
 }
 }
 
 
-
 /** \brief  Get Fault Mask
 /** \brief  Get Fault Mask
 
 
     This function returns the current value of the Fault Mask register.
     This function returns the current value of the Fault Mask register.
@@ -250,11 +233,10 @@ __STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
  */
  */
 __STATIC_INLINE uint32_t __get_FAULTMASK(void)
 __STATIC_INLINE uint32_t __get_FAULTMASK(void)
 {
 {
-  register uint32_t __regFaultMask       __ASM("faultmask");
-  return(__regFaultMask);
+    register uint32_t __regFaultMask __ASM("faultmask");
+    return (__regFaultMask);
 }
 }
 
 
-
 /** \brief  Set Fault Mask
 /** \brief  Set Fault Mask
 
 
     This function assigns the given value to the Fault Mask register.
     This function assigns the given value to the Fault Mask register.
@@ -263,14 +245,13 @@ __STATIC_INLINE uint32_t __get_FAULTMASK(void)
  */
  */
 __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
 __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
 {
 {
-  register uint32_t __regFaultMask       __ASM("faultmask");
-  __regFaultMask = (faultMask & (uint32_t)1);
+    register uint32_t __regFaultMask __ASM("faultmask");
+    __regFaultMask = (faultMask & (uint32_t)1);
 }
 }
 
 
 #endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
 #endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
 
 
-
-#if       (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07)
+#if (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07)
 
 
 /** \brief  Get FPSCR
 /** \brief  Get FPSCR
 
 
@@ -281,14 +262,13 @@ __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
 __STATIC_INLINE uint32_t __get_FPSCR(void)
 __STATIC_INLINE uint32_t __get_FPSCR(void)
 {
 {
 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
-  register uint32_t __regfpscr         __ASM("fpscr");
-  return(__regfpscr);
+    register uint32_t __regfpscr __ASM("fpscr");
+    return (__regfpscr);
 #else
 #else
-   return(0);
+    return (0);
 #endif
 #endif
 }
 }
 
 
-
 /** \brief  Set FPSCR
 /** \brief  Set FPSCR
 
 
     This function assigns the given value to the Floating Point Status/Control register.
     This function assigns the given value to the Floating Point Status/Control register.
@@ -298,15 +278,14 @@ __STATIC_INLINE uint32_t __get_FPSCR(void)
 __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
 __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
 {
 {
 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
-  register uint32_t __regfpscr         __ASM("fpscr");
-  __regfpscr = (fpscr);
+    register uint32_t __regfpscr __ASM("fpscr");
+    __regfpscr = (fpscr);
 #endif
 #endif
 }
 }
 
 
 #endif /* (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07) */
 #endif /* (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07) */
 
 
-
-#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
+#elif defined(__GNUC__) /*------------------ GNU Compiler ---------------------*/
 /* GNU gcc specific functions */
 /* GNU gcc specific functions */
 
 
 /** \brief  Enable IRQ Interrupts
 /** \brief  Enable IRQ Interrupts
@@ -314,257 +293,277 @@ __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
   This function enables IRQ interrupts by clearing the I-bit in the CPSR.
   This function enables IRQ interrupts by clearing the I-bit in the CPSR.
   Can only be executed in Privileged modes.
   Can only be executed in Privileged modes.
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
+__attribute__((always_inline)) __STATIC_INLINE void __enable_irq(void)
 {
 {
-  __ASM volatile ("cpsie i" : : : "memory");
+    __ASM volatile("cpsie i"
+                   :
+                   :
+                   : "memory");
 }
 }
 
 
-
 /** \brief  Disable IRQ Interrupts
 /** \brief  Disable IRQ Interrupts
 
 
   This function disables IRQ interrupts by setting the I-bit in the CPSR.
   This function disables IRQ interrupts by setting the I-bit in the CPSR.
   Can only be executed in Privileged modes.
   Can only be executed in Privileged modes.
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
+__attribute__((always_inline)) __STATIC_INLINE void __disable_irq(void)
 {
 {
-  __ASM volatile ("cpsid i" : : : "memory");
+    __ASM volatile("cpsid i"
+                   :
+                   :
+                   : "memory");
 }
 }
 
 
-
 /** \brief  Get Control Register
 /** \brief  Get Control Register
 
 
     This function returns the content of the Control Register.
     This function returns the content of the Control Register.
 
 
     \return               Control Register value
     \return               Control Register value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_CONTROL(void)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("MRS %0, control" : "=r" (result) );
-  return(result);
+    __ASM volatile("MRS %0, control"
+                   : "=r"(result));
+    return (result);
 }
 }
 
 
-
 /** \brief  Set Control Register
 /** \brief  Set Control Register
 
 
     This function writes the given value to the Control Register.
     This function writes the given value to the Control Register.
 
 
     \param [in]    control  Control Register value to set
     \param [in]    control  Control Register value to set
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control)
+__attribute__((always_inline)) __STATIC_INLINE void __set_CONTROL(uint32_t control)
 {
 {
-  __ASM volatile ("MSR control, %0" : : "r" (control) : "memory");
+    __ASM volatile("MSR control, %0"
+                   :
+                   : "r"(control)
+                   : "memory");
 }
 }
 
 
-
 /** \brief  Get IPSR Register
 /** \brief  Get IPSR Register
 
 
     This function returns the content of the IPSR Register.
     This function returns the content of the IPSR Register.
 
 
     \return               IPSR Register value
     \return               IPSR Register value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_IPSR(void)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
-  return(result);
+    __ASM volatile("MRS %0, ipsr"
+                   : "=r"(result));
+    return (result);
 }
 }
 
 
-
 /** \brief  Get APSR Register
 /** \brief  Get APSR Register
 
 
     This function returns the content of the APSR Register.
     This function returns the content of the APSR Register.
 
 
     \return               APSR Register value
     \return               APSR Register value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_APSR(void)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("MRS %0, apsr" : "=r" (result) );
-  return(result);
+    __ASM volatile("MRS %0, apsr"
+                   : "=r"(result));
+    return (result);
 }
 }
 
 
-
 /** \brief  Get xPSR Register
 /** \brief  Get xPSR Register
 
 
     This function returns the content of the xPSR Register.
     This function returns the content of the xPSR Register.
 
 
     \return               xPSR Register value
     \return               xPSR Register value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_xPSR(void)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("MRS %0, xpsr" : "=r" (result) );
-  return(result);
+    __ASM volatile("MRS %0, xpsr"
+                   : "=r"(result));
+    return (result);
 }
 }
 
 
-
 /** \brief  Get Process Stack Pointer
 /** \brief  Get Process Stack Pointer
 
 
     This function returns the current value of the Process Stack Pointer (PSP).
     This function returns the current value of the Process Stack Pointer (PSP).
 
 
     \return               PSP Register value
     \return               PSP Register value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSP(void)
 {
 {
-  register uint32_t result;
+    register uint32_t result;
 
 
-  __ASM volatile ("MRS %0, psp\n"  : "=r" (result) );
-  return(result);
+    __ASM volatile("MRS %0, psp\n"
+                   : "=r"(result));
+    return (result);
 }
 }
 
 
-
 /** \brief  Set Process Stack Pointer
 /** \brief  Set Process Stack Pointer
 
 
     This function assigns the given value to the Process Stack Pointer (PSP).
     This function assigns the given value to the Process Stack Pointer (PSP).
 
 
     \param [in]    topOfProcStack  Process Stack Pointer value to set
     \param [in]    topOfProcStack  Process Stack Pointer value to set
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
+__attribute__((always_inline)) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
 {
 {
-  __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp");
+    __ASM volatile("MSR psp, %0\n"
+                   :
+                   : "r"(topOfProcStack)
+                   : "sp");
 }
 }
 
 
-
 /** \brief  Get Main Stack Pointer
 /** \brief  Get Main Stack Pointer
 
 
     This function returns the current value of the Main Stack Pointer (MSP).
     This function returns the current value of the Main Stack Pointer (MSP).
 
 
     \return               MSP Register value
     \return               MSP Register value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSP(void)
 {
 {
-  register uint32_t result;
+    register uint32_t result;
 
 
-  __ASM volatile ("MRS %0, msp\n" : "=r" (result) );
-  return(result);
+    __ASM volatile("MRS %0, msp\n"
+                   : "=r"(result));
+    return (result);
 }
 }
 
 
-
 /** \brief  Set Main Stack Pointer
 /** \brief  Set Main Stack Pointer
 
 
     This function assigns the given value to the Main Stack Pointer (MSP).
     This function assigns the given value to the Main Stack Pointer (MSP).
 
 
     \param [in]    topOfMainStack  Main Stack Pointer value to set
     \param [in]    topOfMainStack  Main Stack Pointer value to set
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
+__attribute__((always_inline)) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
 {
 {
-  __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp");
+    __ASM volatile("MSR msp, %0\n"
+                   :
+                   : "r"(topOfMainStack)
+                   : "sp");
 }
 }
 
 
-
 /** \brief  Get Priority Mask
 /** \brief  Get Priority Mask
 
 
     This function returns the current state of the priority mask bit from the Priority Mask Register.
     This function returns the current state of the priority mask bit from the Priority Mask Register.
 
 
     \return               Priority Mask value
     \return               Priority Mask value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PRIMASK(void)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("MRS %0, primask" : "=r" (result) );
-  return(result);
+    __ASM volatile("MRS %0, primask"
+                   : "=r"(result));
+    return (result);
 }
 }
 
 
-
 /** \brief  Set Priority Mask
 /** \brief  Set Priority Mask
 
 
     This function assigns the given value to the Priority Mask Register.
     This function assigns the given value to the Priority Mask Register.
 
 
     \param [in]    priMask  Priority Mask
     \param [in]    priMask  Priority Mask
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
+__attribute__((always_inline)) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
 {
 {
-  __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
+    __ASM volatile("MSR primask, %0"
+                   :
+                   : "r"(priMask)
+                   : "memory");
 }
 }
 
 
-
-#if       (__CORTEX_M >= 0x03)
+#if (__CORTEX_M >= 0x03)
 
 
 /** \brief  Enable FIQ
 /** \brief  Enable FIQ
 
 
     This function enables FIQ interrupts by clearing the F-bit in the CPSR.
     This function enables FIQ interrupts by clearing the F-bit in the CPSR.
     Can only be executed in Privileged modes.
     Can only be executed in Privileged modes.
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void)
+__attribute__((always_inline)) __STATIC_INLINE void __enable_fault_irq(void)
 {
 {
-  __ASM volatile ("cpsie f" : : : "memory");
+    __ASM volatile("cpsie f"
+                   :
+                   :
+                   : "memory");
 }
 }
 
 
-
 /** \brief  Disable FIQ
 /** \brief  Disable FIQ
 
 
     This function disables FIQ interrupts by setting the F-bit in the CPSR.
     This function disables FIQ interrupts by setting the F-bit in the CPSR.
     Can only be executed in Privileged modes.
     Can only be executed in Privileged modes.
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void)
+__attribute__((always_inline)) __STATIC_INLINE void __disable_fault_irq(void)
 {
 {
-  __ASM volatile ("cpsid f" : : : "memory");
+    __ASM volatile("cpsid f"
+                   :
+                   :
+                   : "memory");
 }
 }
 
 
-
 /** \brief  Get Base Priority
 /** \brief  Get Base Priority
 
 
     This function returns the current value of the Base Priority register.
     This function returns the current value of the Base Priority register.
 
 
     \return               Base Priority register value
     \return               Base Priority register value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_BASEPRI(void)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
-  return(result);
+    __ASM volatile("MRS %0, basepri_max"
+                   : "=r"(result));
+    return (result);
 }
 }
 
 
-
 /** \brief  Set Base Priority
 /** \brief  Set Base Priority
 
 
     This function assigns the given value to the Base Priority register.
     This function assigns the given value to the Base Priority register.
 
 
     \param [in]    basePri  Base Priority value to set
     \param [in]    basePri  Base Priority value to set
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value)
+__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI(uint32_t value)
 {
 {
-  __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory");
+    __ASM volatile("MSR basepri, %0"
+                   :
+                   : "r"(value)
+                   : "memory");
 }
 }
 
 
-
 /** \brief  Get Fault Mask
 /** \brief  Get Fault Mask
 
 
     This function returns the current value of the Fault Mask register.
     This function returns the current value of the Fault Mask register.
 
 
     \return               Fault Mask register value
     \return               Fault Mask register value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FAULTMASK(void)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
-  return(result);
+    __ASM volatile("MRS %0, faultmask"
+                   : "=r"(result));
+    return (result);
 }
 }
 
 
-
 /** \brief  Set Fault Mask
 /** \brief  Set Fault Mask
 
 
     This function assigns the given value to the Fault Mask register.
     This function assigns the given value to the Fault Mask register.
 
 
     \param [in]    faultMask  Fault Mask value to set
     \param [in]    faultMask  Fault Mask value to set
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
+__attribute__((always_inline)) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
 {
 {
-  __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory");
+    __ASM volatile("MSR faultmask, %0"
+                   :
+                   : "r"(faultMask)
+                   : "memory");
 }
 }
 
 
 #endif /* (__CORTEX_M >= 0x03) */
 #endif /* (__CORTEX_M >= 0x03) */
 
 
-
-#if       (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07)
+#if (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07)
 
 
 /** \brief  Get FPSCR
 /** \brief  Get FPSCR
 
 
@@ -572,52 +571,52 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t
 
 
     \return               Floating Point Status/Control register value
     \return               Floating Point Status/Control register value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FPSCR(void)
 {
 {
 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
-  uint32_t result;
-
-  /* Empty asm statement works as a scheduling barrier */
-  __ASM volatile ("");
-  __ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
-  __ASM volatile ("");
-  return(result);
+    uint32_t result;
+
+    /* Empty asm statement works as a scheduling barrier */
+    __ASM volatile("");
+    __ASM volatile("VMRS %0, fpscr"
+                   : "=r"(result));
+    __ASM volatile("");
+    return (result);
 #else
 #else
-   return(0);
+    return (0);
 #endif
 #endif
 }
 }
 
 
-
 /** \brief  Set FPSCR
 /** \brief  Set FPSCR
 
 
     This function assigns the given value to the Floating Point Status/Control register.
     This function assigns the given value to the Floating Point Status/Control register.
 
 
     \param [in]    fpscr  Floating Point Status/Control value to set
     \param [in]    fpscr  Floating Point Status/Control value to set
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
+__attribute__((always_inline)) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
 {
 {
 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
-  /* Empty asm statement works as a scheduling barrier */
-  __ASM volatile ("");
-  __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");
-  __ASM volatile ("");
+    /* Empty asm statement works as a scheduling barrier */
+    __ASM volatile("");
+    __ASM volatile("VMSR fpscr, %0"
+                   :
+                   : "r"(fpscr)
+                   : "vfpcc");
+    __ASM volatile("");
 #endif
 #endif
 }
 }
 
 
 #endif /* (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07) */
 #endif /* (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07) */
 
 
-
-#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
+#elif defined(__ICCARM__) /*------------------ ICC Compiler -------------------*/
 /* IAR iccarm specific functions */
 /* IAR iccarm specific functions */
 #include <cmsis_iar.h>
 #include <cmsis_iar.h>
 
 
-
-#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
+#elif defined(__TMS470__) /*---------------- TI CCS Compiler ------------------*/
 /* TI CCS specific functions */
 /* TI CCS specific functions */
 #include <cmsis_ccs.h>
 #include <cmsis_ccs.h>
 
 
-
-#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
+#elif defined(__TASKING__) /*------------------ TASKING Compiler --------------*/
 /* TASKING carm specific functions */
 /* TASKING carm specific functions */
 /*
 /*
  * The CMSIS functions have been implemented as intrinsics in the compiler.
  * The CMSIS functions have been implemented as intrinsics in the compiler.
@@ -625,8 +624,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fps
  * Including the CMSIS ones.
  * Including the CMSIS ones.
  */
  */
 
 
-
-#elif defined ( __CSMC__ ) /*------------------ COSMIC Compiler -------------------*/
+#elif defined(__CSMC__) /*------------------ COSMIC Compiler -------------------*/
 /* Cosmic specific functions */
 /* Cosmic specific functions */
 #include <cmsis_csm.h>
 #include <cmsis_csm.h>
 
 

+ 200 - 210
bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cmInstr.h

@@ -1,4 +1,4 @@
-/**************************************************************************//**
+/**************************************************************************/ /**
  * @file     core_cmInstr.h
  * @file     core_cmInstr.h
  * @brief    CMSIS Cortex-M Core Instruction Access Header File
  * @brief    CMSIS Cortex-M Core Instruction Access Header File
  * @version  V4.00
  * @version  V4.00
@@ -34,54 +34,47 @@
    POSSIBILITY OF SUCH DAMAGE.
    POSSIBILITY OF SUCH DAMAGE.
    ---------------------------------------------------------------------------*/
    ---------------------------------------------------------------------------*/
 
 
-
 #ifndef __CORE_CMINSTR_H
 #ifndef __CORE_CMINSTR_H
 #define __CORE_CMINSTR_H
 #define __CORE_CMINSTR_H
 
 
-
 /* ##########################  Core Instruction Access  ######################### */
 /* ##########################  Core Instruction Access  ######################### */
 /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
 /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
   Access to dedicated instructions
   Access to dedicated instructions
   @{
   @{
 */
 */
 
 
-#if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
+#if defined(__CC_ARM) /*------------------RealView Compiler -----------------*/
 /* ARM armcc specific functions */
 /* ARM armcc specific functions */
 
 
 #if (__ARMCC_VERSION < 400677)
 #if (__ARMCC_VERSION < 400677)
-  #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
+#error "Please use ARM Compiler Toolchain V4.0.677 or later!"
 #endif
 #endif
 
 
-
 /** \brief  No Operation
 /** \brief  No Operation
 
 
     No Operation does nothing. This instruction can be used for code alignment purposes.
     No Operation does nothing. This instruction can be used for code alignment purposes.
  */
  */
-#define __NOP                             __nop
-
+#define __NOP __nop
 
 
 /** \brief  Wait For Interrupt
 /** \brief  Wait For Interrupt
 
 
     Wait For Interrupt is a hint instruction that suspends execution
     Wait For Interrupt is a hint instruction that suspends execution
     until one of a number of events occurs.
     until one of a number of events occurs.
  */
  */
-#define __WFI                             __wfi
-
+#define __WFI __wfi
 
 
 /** \brief  Wait For Event
 /** \brief  Wait For Event
 
 
     Wait For Event is a hint instruction that permits the processor to enter
     Wait For Event is a hint instruction that permits the processor to enter
     a low-power state until one of a number of events occurs.
     a low-power state until one of a number of events occurs.
  */
  */
-#define __WFE                             __wfe
-
+#define __WFE __wfe
 
 
 /** \brief  Send Event
 /** \brief  Send Event
 
 
     Send Event is a hint instruction. It causes an event to be signaled to the CPU.
     Send Event is a hint instruction. It causes an event to be signaled to the CPU.
  */
  */
-#define __SEV                             __sev
-
+#define __SEV __sev
 
 
 /** \brief  Instruction Synchronization Barrier
 /** \brief  Instruction Synchronization Barrier
 
 
@@ -89,24 +82,21 @@
     so that all instructions following the ISB are fetched from cache or
     so that all instructions following the ISB are fetched from cache or
     memory, after the instruction has been completed.
     memory, after the instruction has been completed.
  */
  */
-#define __ISB()                           __isb(0xF)
-
+#define __ISB() __isb(0xF)
 
 
 /** \brief  Data Synchronization Barrier
 /** \brief  Data Synchronization Barrier
 
 
     This function acts as a special kind of Data Memory Barrier.
     This function acts as a special kind of Data Memory Barrier.
     It completes when all explicit memory accesses before this instruction complete.
     It completes when all explicit memory accesses before this instruction complete.
  */
  */
-#define __DSB()                           __dsb(0xF)
-
+#define __DSB() __dsb(0xF)
 
 
 /** \brief  Data Memory Barrier
 /** \brief  Data Memory Barrier
 
 
     This function ensures the apparent order of the explicit memory operations before
     This function ensures the apparent order of the explicit memory operations before
     and after the instruction, without ensuring their completion.
     and after the instruction, without ensuring their completion.
  */
  */
-#define __DMB()                           __dmb(0xF)
-
+#define __DMB() __dmb(0xF)
 
 
 /** \brief  Reverse byte order (32 bit)
 /** \brief  Reverse byte order (32 bit)
 
 
@@ -115,8 +105,7 @@
     \param [in]    value  Value to reverse
     \param [in]    value  Value to reverse
     \return               Reversed value
     \return               Reversed value
  */
  */
-#define __REV                             __rev
-
+#define __REV __rev
 
 
 /** \brief  Reverse byte order (16 bit)
 /** \brief  Reverse byte order (16 bit)
 
 
@@ -128,8 +117,8 @@
 #ifndef __NO_EMBEDDED_ASM
 #ifndef __NO_EMBEDDED_ASM
 __attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
 __attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
 {
 {
-  rev16 r0, r0
-  bx lr
+    rev16 r0, r0
+                  bx lr
 }
 }
 #endif
 #endif
 
 
@@ -143,12 +132,11 @@ __attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(u
 #ifndef __NO_EMBEDDED_ASM
 #ifndef __NO_EMBEDDED_ASM
 __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)
 __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)
 {
 {
-  revsh r0, r0
-  bx lr
+    revsh r0, r0
+                  bx lr
 }
 }
 #endif
 #endif
 
 
-
 /** \brief  Rotate Right in unsigned value (32 bit)
 /** \brief  Rotate Right in unsigned value (32 bit)
 
 
     This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
     This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
@@ -157,8 +145,7 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
     \param [in]    value  Number of Bits to rotate
     \param [in]    value  Number of Bits to rotate
     \return               Rotated value
     \return               Rotated value
  */
  */
-#define __ROR                             __ror
-
+#define __ROR __ror
 
 
 /** \brief  Breakpoint
 /** \brief  Breakpoint
 
 
@@ -168,10 +155,9 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
     \param [in]    value  is ignored by the processor.
     \param [in]    value  is ignored by the processor.
                    If required, a debugger can use it to store additional information about the breakpoint.
                    If required, a debugger can use it to store additional information about the breakpoint.
  */
  */
-#define __BKPT(value)                       __breakpoint(value)
+#define __BKPT(value) __breakpoint(value)
 
 
-
-#if       (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
+#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
 
 
 /** \brief  Reverse bit order of value
 /** \brief  Reverse bit order of value
 
 
@@ -180,8 +166,7 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
     \param [in]    value  Value to reverse
     \param [in]    value  Value to reverse
     \return               Reversed value
     \return               Reversed value
  */
  */
-#define __RBIT                            __rbit
-
+#define __RBIT __rbit
 
 
 /** \brief  LDR Exclusive (8 bit)
 /** \brief  LDR Exclusive (8 bit)
 
 
@@ -190,8 +175,7 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
     \param [in]    ptr  Pointer to data
     \param [in]    ptr  Pointer to data
     \return             value of type uint8_t at (*ptr)
     \return             value of type uint8_t at (*ptr)
  */
  */
-#define __LDREXB(ptr)                     ((uint8_t ) __ldrex(ptr))
-
+#define __LDREXB(ptr) ((uint8_t)__ldrex(ptr))
 
 
 /** \brief  LDR Exclusive (16 bit)
 /** \brief  LDR Exclusive (16 bit)
 
 
@@ -200,8 +184,7 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
     \param [in]    ptr  Pointer to data
     \param [in]    ptr  Pointer to data
     \return        value of type uint16_t at (*ptr)
     \return        value of type uint16_t at (*ptr)
  */
  */
-#define __LDREXH(ptr)                     ((uint16_t) __ldrex(ptr))
-
+#define __LDREXH(ptr) ((uint16_t)__ldrex(ptr))
 
 
 /** \brief  LDR Exclusive (32 bit)
 /** \brief  LDR Exclusive (32 bit)
 
 
@@ -210,8 +193,7 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
     \param [in]    ptr  Pointer to data
     \param [in]    ptr  Pointer to data
     \return        value of type uint32_t at (*ptr)
     \return        value of type uint32_t at (*ptr)
  */
  */
-#define __LDREXW(ptr)                     ((uint32_t ) __ldrex(ptr))
-
+#define __LDREXW(ptr) ((uint32_t)__ldrex(ptr))
 
 
 /** \brief  STR Exclusive (8 bit)
 /** \brief  STR Exclusive (8 bit)
 
 
@@ -222,8 +204,7 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
     \return          0  Function succeeded
     \return          0  Function succeeded
     \return          1  Function failed
     \return          1  Function failed
  */
  */
-#define __STREXB(value, ptr)              __strex(value, ptr)
-
+#define __STREXB(value, ptr) __strex(value, ptr)
 
 
 /** \brief  STR Exclusive (16 bit)
 /** \brief  STR Exclusive (16 bit)
 
 
@@ -234,8 +215,7 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
     \return          0  Function succeeded
     \return          0  Function succeeded
     \return          1  Function failed
     \return          1  Function failed
  */
  */
-#define __STREXH(value, ptr)              __strex(value, ptr)
-
+#define __STREXH(value, ptr) __strex(value, ptr)
 
 
 /** \brief  STR Exclusive (32 bit)
 /** \brief  STR Exclusive (32 bit)
 
 
@@ -246,16 +226,14 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
     \return          0  Function succeeded
     \return          0  Function succeeded
     \return          1  Function failed
     \return          1  Function failed
  */
  */
-#define __STREXW(value, ptr)              __strex(value, ptr)
-
+#define __STREXW(value, ptr) __strex(value, ptr)
 
 
 /** \brief  Remove the exclusive lock
 /** \brief  Remove the exclusive lock
 
 
     This function removes the exclusive lock which is created by LDREX.
     This function removes the exclusive lock which is created by LDREX.
 
 
  */
  */
-#define __CLREX                           __clrex
-
+#define __CLREX __clrex
 
 
 /** \brief  Signed Saturate
 /** \brief  Signed Saturate
 
 
@@ -265,8 +243,7 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
     \param [in]    sat  Bit position to saturate to (1..32)
     \param [in]    sat  Bit position to saturate to (1..32)
     \return             Saturated value
     \return             Saturated value
  */
  */
-#define __SSAT                            __ssat
-
+#define __SSAT __ssat
 
 
 /** \brief  Unsigned Saturate
 /** \brief  Unsigned Saturate
 
 
@@ -276,8 +253,7 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
     \param [in]    sat  Bit position to saturate to (0..31)
     \param [in]    sat  Bit position to saturate to (0..31)
     \return             Saturated value
     \return             Saturated value
  */
  */
-#define __USAT                            __usat
-
+#define __USAT __usat
 
 
 /** \brief  Count leading zeros
 /** \brief  Count leading zeros
 
 
@@ -286,8 +262,7 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
     \param [in]  value  Value to count the leading zeros
     \param [in]  value  Value to count the leading zeros
     \return             number of leading zeros in value
     \return             number of leading zeros in value
  */
  */
-#define __CLZ                             __clz
-
+#define __CLZ __clz
 
 
 /** \brief  Rotate Right with Extend (32 bit)
 /** \brief  Rotate Right with Extend (32 bit)
 
 
@@ -299,12 +274,11 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(in
 #ifndef __NO_EMBEDDED_ASM
 #ifndef __NO_EMBEDDED_ASM
 __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
 __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
 {
 {
-  rrx r0, r0
-  bx lr
+    rrx r0, r0
+                bx lr
 }
 }
 #endif
 #endif
 
 
-
 /** \brief  LDRT Unprivileged (8 bit)
 /** \brief  LDRT Unprivileged (8 bit)
 
 
     This function executes a Unprivileged LDRT instruction for 8 bit value.
     This function executes a Unprivileged LDRT instruction for 8 bit value.
@@ -312,8 +286,7 @@ __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint3
     \param [in]    ptr  Pointer to data
     \param [in]    ptr  Pointer to data
     \return             value of type uint8_t at (*ptr)
     \return             value of type uint8_t at (*ptr)
  */
  */
-#define __LDRBT(ptr)                      ((uint8_t )  __ldrt(ptr))
-
+#define __LDRBT(ptr) ((uint8_t)__ldrt(ptr))
 
 
 /** \brief  LDRT Unprivileged (16 bit)
 /** \brief  LDRT Unprivileged (16 bit)
 
 
@@ -322,8 +295,7 @@ __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint3
     \param [in]    ptr  Pointer to data
     \param [in]    ptr  Pointer to data
     \return        value of type uint16_t at (*ptr)
     \return        value of type uint16_t at (*ptr)
  */
  */
-#define __LDRHT(ptr)                      ((uint16_t)  __ldrt(ptr))
-
+#define __LDRHT(ptr) ((uint16_t)__ldrt(ptr))
 
 
 /** \brief  LDRT Unprivileged (32 bit)
 /** \brief  LDRT Unprivileged (32 bit)
 
 
@@ -332,8 +304,7 @@ __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint3
     \param [in]    ptr  Pointer to data
     \param [in]    ptr  Pointer to data
     \return        value of type uint32_t at (*ptr)
     \return        value of type uint32_t at (*ptr)
  */
  */
-#define __LDRT(ptr)                       ((uint32_t ) __ldrt(ptr))
-
+#define __LDRT(ptr) ((uint32_t)__ldrt(ptr))
 
 
 /** \brief  STRT Unprivileged (8 bit)
 /** \brief  STRT Unprivileged (8 bit)
 
 
@@ -342,8 +313,7 @@ __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint3
     \param [in]  value  Value to store
     \param [in]  value  Value to store
     \param [in]    ptr  Pointer to location
     \param [in]    ptr  Pointer to location
  */
  */
-#define __STRBT(value, ptr)               __strt(value, ptr)
-
+#define __STRBT(value, ptr) __strt(value, ptr)
 
 
 /** \brief  STRT Unprivileged (16 bit)
 /** \brief  STRT Unprivileged (16 bit)
 
 
@@ -352,8 +322,7 @@ __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint3
     \param [in]  value  Value to store
     \param [in]  value  Value to store
     \param [in]    ptr  Pointer to location
     \param [in]    ptr  Pointer to location
  */
  */
-#define __STRHT(value, ptr)               __strt(value, ptr)
-
+#define __STRHT(value, ptr) __strt(value, ptr)
 
 
 /** \brief  STRT Unprivileged (32 bit)
 /** \brief  STRT Unprivileged (32 bit)
 
 
@@ -362,101 +331,93 @@ __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint3
     \param [in]  value  Value to store
     \param [in]  value  Value to store
     \param [in]    ptr  Pointer to location
     \param [in]    ptr  Pointer to location
  */
  */
-#define __STRT(value, ptr)                __strt(value, ptr)
+#define __STRT(value, ptr) __strt(value, ptr)
 
 
 #endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
 #endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
 
 
-
-#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
+#elif defined(__GNUC__) /*------------------ GNU Compiler ---------------------*/
 /* GNU gcc specific functions */
 /* GNU gcc specific functions */
 
 
 /* Define macros for porting to both thumb1 and thumb2.
 /* Define macros for porting to both thumb1 and thumb2.
  * For thumb1, use low register (r0-r7), specified by constrant "l"
  * For thumb1, use low register (r0-r7), specified by constrant "l"
  * Otherwise, use general registers, specified by constrant "r" */
  * Otherwise, use general registers, specified by constrant "r" */
-#if defined (__thumb__) && !defined (__thumb2__)
-#define __CMSIS_GCC_OUT_REG(r) "=l" (r)
-#define __CMSIS_GCC_USE_REG(r) "l" (r)
+#if defined(__thumb__) && !defined(__thumb2__)
+#define __CMSIS_GCC_OUT_REG(r) "=l"(r)
+#define __CMSIS_GCC_USE_REG(r) "l"(r)
 #else
 #else
-#define __CMSIS_GCC_OUT_REG(r) "=r" (r)
-#define __CMSIS_GCC_USE_REG(r) "r" (r)
+#define __CMSIS_GCC_OUT_REG(r) "=r"(r)
+#define __CMSIS_GCC_USE_REG(r) "r"(r)
 #endif
 #endif
 
 
 /** \brief  No Operation
 /** \brief  No Operation
 
 
     No Operation does nothing. This instruction can be used for code alignment purposes.
     No Operation does nothing. This instruction can be used for code alignment purposes.
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void)
+__attribute__((always_inline)) __STATIC_INLINE void __NOP(void)
 {
 {
-  __ASM volatile ("nop");
+    __ASM volatile("nop");
 }
 }
 
 
-
 /** \brief  Wait For Interrupt
 /** \brief  Wait For Interrupt
 
 
     Wait For Interrupt is a hint instruction that suspends execution
     Wait For Interrupt is a hint instruction that suspends execution
     until one of a number of events occurs.
     until one of a number of events occurs.
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void)
+__attribute__((always_inline)) __STATIC_INLINE void __WFI(void)
 {
 {
-  __ASM volatile ("wfi");
+    __ASM volatile("wfi");
 }
 }
 
 
-
 /** \brief  Wait For Event
 /** \brief  Wait For Event
 
 
     Wait For Event is a hint instruction that permits the processor to enter
     Wait For Event is a hint instruction that permits the processor to enter
     a low-power state until one of a number of events occurs.
     a low-power state until one of a number of events occurs.
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void)
+__attribute__((always_inline)) __STATIC_INLINE void __WFE(void)
 {
 {
-  __ASM volatile ("wfe");
+    __ASM volatile("wfe");
 }
 }
 
 
-
 /** \brief  Send Event
 /** \brief  Send Event
 
 
     Send Event is a hint instruction. It causes an event to be signaled to the CPU.
     Send Event is a hint instruction. It causes an event to be signaled to the CPU.
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void)
+__attribute__((always_inline)) __STATIC_INLINE void __SEV(void)
 {
 {
-  __ASM volatile ("sev");
+    __ASM volatile("sev");
 }
 }
 
 
-
 /** \brief  Instruction Synchronization Barrier
 /** \brief  Instruction Synchronization Barrier
 
 
     Instruction Synchronization Barrier flushes the pipeline in the processor,
     Instruction Synchronization Barrier flushes the pipeline in the processor,
     so that all instructions following the ISB are fetched from cache or
     so that all instructions following the ISB are fetched from cache or
     memory, after the instruction has been completed.
     memory, after the instruction has been completed.
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void)
+__attribute__((always_inline)) __STATIC_INLINE void __ISB(void)
 {
 {
-  __ASM volatile ("isb");
+    __ASM volatile("isb");
 }
 }
 
 
-
 /** \brief  Data Synchronization Barrier
 /** \brief  Data Synchronization Barrier
 
 
     This function acts as a special kind of Data Memory Barrier.
     This function acts as a special kind of Data Memory Barrier.
     It completes when all explicit memory accesses before this instruction complete.
     It completes when all explicit memory accesses before this instruction complete.
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void)
+__attribute__((always_inline)) __STATIC_INLINE void __DSB(void)
 {
 {
-  __ASM volatile ("dsb");
+    __ASM volatile("dsb");
 }
 }
 
 
-
 /** \brief  Data Memory Barrier
 /** \brief  Data Memory Barrier
 
 
     This function ensures the apparent order of the explicit memory operations before
     This function ensures the apparent order of the explicit memory operations before
     and after the instruction, without ensuring their completion.
     and after the instruction, without ensuring their completion.
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void)
+__attribute__((always_inline)) __STATIC_INLINE void __DMB(void)
 {
 {
-  __ASM volatile ("dmb");
+    __ASM volatile("dmb");
 }
 }
 
 
-
 /** \brief  Reverse byte order (32 bit)
 /** \brief  Reverse byte order (32 bit)
 
 
     This function reverses the byte order in integer value.
     This function reverses the byte order in integer value.
@@ -464,19 +425,20 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void)
     \param [in]    value  Value to reverse
     \param [in]    value  Value to reverse
     \return               Reversed value
     \return               Reversed value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV(uint32_t value)
 {
 {
 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
-  return __builtin_bswap32(value);
+    return __builtin_bswap32(value);
 #else
 #else
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
-  return(result);
+    __ASM volatile("rev %0, %1"
+                   : __CMSIS_GCC_OUT_REG(result)
+                   : __CMSIS_GCC_USE_REG(value));
+    return (result);
 #endif
 #endif
 }
 }
 
 
-
 /** \brief  Reverse byte order (16 bit)
 /** \brief  Reverse byte order (16 bit)
 
 
     This function reverses the byte order in two unsigned short values.
     This function reverses the byte order in two unsigned short values.
@@ -484,15 +446,16 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value
     \param [in]    value  Value to reverse
     \param [in]    value  Value to reverse
     \return               Reversed value
     \return               Reversed value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
-  return(result);
+    __ASM volatile("rev16 %0, %1"
+                   : __CMSIS_GCC_OUT_REG(result)
+                   : __CMSIS_GCC_USE_REG(value));
+    return (result);
 }
 }
 
 
-
 /** \brief  Reverse byte order in signed short value
 /** \brief  Reverse byte order in signed short value
 
 
     This function reverses the byte order in a signed short value with sign extension to integer.
     This function reverses the byte order in a signed short value with sign extension to integer.
@@ -500,19 +463,20 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t val
     \param [in]    value  Value to reverse
     \param [in]    value  Value to reverse
     \return               Reversed value
     \return               Reversed value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value)
+__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value)
 {
 {
 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
-  return (short)__builtin_bswap16(value);
+    return (short)__builtin_bswap16(value);
 #else
 #else
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
-  return(result);
+    __ASM volatile("revsh %0, %1"
+                   : __CMSIS_GCC_OUT_REG(result)
+                   : __CMSIS_GCC_USE_REG(value));
+    return (result);
 #endif
 #endif
 }
 }
 
 
-
 /** \brief  Rotate Right in unsigned value (32 bit)
 /** \brief  Rotate Right in unsigned value (32 bit)
 
 
     This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
     This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
@@ -521,12 +485,11 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value
     \param [in]    value  Number of Bits to rotate
     \param [in]    value  Number of Bits to rotate
     \return               Rotated value
     \return               Rotated value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
 {
 {
-  return (op1 >> op2) | (op1 << (32 - op2)); 
+    return (op1 >> op2) | (op1 << (32 - op2));
 }
 }
 
 
-
 /** \brief  Breakpoint
 /** \brief  Breakpoint
 
 
     This function causes the processor to enter Debug state.
     This function causes the processor to enter Debug state.
@@ -535,10 +498,9 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1,
     \param [in]    value  is ignored by the processor.
     \param [in]    value  is ignored by the processor.
                    If required, a debugger can use it to store additional information about the breakpoint.
                    If required, a debugger can use it to store additional information about the breakpoint.
  */
  */
-#define __BKPT(value)                       __ASM volatile ("bkpt "#value)
-
+#define __BKPT(value) __ASM volatile("bkpt " #value)
 
 
-#if       (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
+#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
 
 
 /** \brief  Reverse bit order of value
 /** \brief  Reverse bit order of value
 
 
@@ -547,15 +509,16 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1,
     \param [in]    value  Value to reverse
     \param [in]    value  Value to reverse
     \return               Reversed value
     \return               Reversed value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-   __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
-   return(result);
+    __ASM volatile("rbit %0, %1"
+                   : "=r"(result)
+                   : "r"(value));
+    return (result);
 }
 }
 
 
-
 /** \brief  LDR Exclusive (8 bit)
 /** \brief  LDR Exclusive (8 bit)
 
 
     This function executes a exclusive LDR instruction for 8 bit value.
     This function executes a exclusive LDR instruction for 8 bit value.
@@ -563,22 +526,26 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t valu
     \param [in]    ptr  Pointer to data
     \param [in]    ptr  Pointer to data
     \return             value of type uint8_t at (*ptr)
     \return             value of type uint8_t at (*ptr)
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr)
+__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr)
 {
 {
     uint32_t result;
     uint32_t result;
 
 
 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
-   __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) );
+    __ASM volatile("ldrexb %0, %1"
+                   : "=r"(result)
+                   : "Q"(*addr));
 #else
 #else
     /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
     /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
        accepted by assembler. So has to use following less efficient pattern.
        accepted by assembler. So has to use following less efficient pattern.
     */
     */
-   __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
+    __ASM volatile("ldrexb %0, [%1]"
+                   : "=r"(result)
+                   : "r"(addr)
+                   : "memory");
 #endif
 #endif
-   return ((uint8_t) result);    /* Add explicit type cast here */
+    return ((uint8_t)result); /* Add explicit type cast here */
 }
 }
 
 
-
 /** \brief  LDR Exclusive (16 bit)
 /** \brief  LDR Exclusive (16 bit)
 
 
     This function executes a exclusive LDR instruction for 16 bit values.
     This function executes a exclusive LDR instruction for 16 bit values.
@@ -586,22 +553,26 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uin
     \param [in]    ptr  Pointer to data
     \param [in]    ptr  Pointer to data
     \return        value of type uint16_t at (*ptr)
     \return        value of type uint16_t at (*ptr)
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)
+__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)
 {
 {
     uint32_t result;
     uint32_t result;
 
 
 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
-   __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) );
+    __ASM volatile("ldrexh %0, %1"
+                   : "=r"(result)
+                   : "Q"(*addr));
 #else
 #else
     /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
     /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
        accepted by assembler. So has to use following less efficient pattern.
        accepted by assembler. So has to use following less efficient pattern.
     */
     */
-   __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
+    __ASM volatile("ldrexh %0, [%1]"
+                   : "=r"(result)
+                   : "r"(addr)
+                   : "memory");
 #endif
 #endif
-   return ((uint16_t) result);    /* Add explicit type cast here */
+    return ((uint16_t)result); /* Add explicit type cast here */
 }
 }
 
 
-
 /** \brief  LDR Exclusive (32 bit)
 /** \brief  LDR Exclusive (32 bit)
 
 
     This function executes a exclusive LDR instruction for 32 bit values.
     This function executes a exclusive LDR instruction for 32 bit values.
@@ -609,15 +580,16 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile ui
     \param [in]    ptr  Pointer to data
     \param [in]    ptr  Pointer to data
     \return        value of type uint32_t at (*ptr)
     \return        value of type uint32_t at (*ptr)
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr)
 {
 {
     uint32_t result;
     uint32_t result;
 
 
-   __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
-   return(result);
+    __ASM volatile("ldrex %0, %1"
+                   : "=r"(result)
+                   : "Q"(*addr));
+    return (result);
 }
 }
 
 
-
 /** \brief  STR Exclusive (8 bit)
 /** \brief  STR Exclusive (8 bit)
 
 
     This function executes a exclusive STR instruction for 8 bit values.
     This function executes a exclusive STR instruction for 8 bit values.
@@ -627,15 +599,16 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile ui
     \return          0  Function succeeded
     \return          0  Function succeeded
     \return          1  Function failed
     \return          1  Function failed
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
 {
 {
-   uint32_t result;
+    uint32_t result;
 
 
-   __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
-   return(result);
+    __ASM volatile("strexb %0, %2, %1"
+                   : "=&r"(result), "=Q"(*addr)
+                   : "r"((uint32_t)value));
+    return (result);
 }
 }
 
 
-
 /** \brief  STR Exclusive (16 bit)
 /** \brief  STR Exclusive (16 bit)
 
 
     This function executes a exclusive STR instruction for 16 bit values.
     This function executes a exclusive STR instruction for 16 bit values.
@@ -645,15 +618,16 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t val
     \return          0  Function succeeded
     \return          0  Function succeeded
     \return          1  Function failed
     \return          1  Function failed
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
 {
 {
-   uint32_t result;
+    uint32_t result;
 
 
-   __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
-   return(result);
+    __ASM volatile("strexh %0, %2, %1"
+                   : "=&r"(result), "=Q"(*addr)
+                   : "r"((uint32_t)value));
+    return (result);
 }
 }
 
 
-
 /** \brief  STR Exclusive (32 bit)
 /** \brief  STR Exclusive (32 bit)
 
 
     This function executes a exclusive STR instruction for 32 bit values.
     This function executes a exclusive STR instruction for 32 bit values.
@@ -663,26 +637,27 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t va
     \return          0  Function succeeded
     \return          0  Function succeeded
     \return          1  Function failed
     \return          1  Function failed
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
 {
 {
-   uint32_t result;
+    uint32_t result;
 
 
-   __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
-   return(result);
+    __ASM volatile("strex %0, %2, %1"
+                   : "=&r"(result), "=Q"(*addr)
+                   : "r"(value));
+    return (result);
 }
 }
 
 
-
 /** \brief  Remove the exclusive lock
 /** \brief  Remove the exclusive lock
 
 
     This function removes the exclusive lock which is created by LDREX.
     This function removes the exclusive lock which is created by LDREX.
 
 
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void)
+__attribute__((always_inline)) __STATIC_INLINE void __CLREX(void)
 {
 {
-  __ASM volatile ("clrex" ::: "memory");
+    __ASM volatile("clrex" ::
+                       : "memory");
 }
 }
 
 
-
 /** \brief  Signed Saturate
 /** \brief  Signed Saturate
 
 
     This function saturates a signed value.
     This function saturates a signed value.
@@ -691,13 +666,15 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void)
     \param [in]    sat  Bit position to saturate to (1..32)
     \param [in]    sat  Bit position to saturate to (1..32)
     \return             Saturated value
     \return             Saturated value
  */
  */
-#define __SSAT(ARG1,ARG2) \
-({                          \
-  uint32_t __RES, __ARG1 = (ARG1); \
-  __ASM ("ssat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
-  __RES; \
- })
-
+#define __SSAT(ARG1, ARG2)                   \
+    (                                        \
+        {                                    \
+            uint32_t __RES, __ARG1 = (ARG1); \
+            __ASM("ssat %0, %1, %2"          \
+                  : "=r"(__RES)              \
+                  : "I"(ARG2), "r"(__ARG1)); \
+            __RES;                           \
+        })
 
 
 /** \brief  Unsigned Saturate
 /** \brief  Unsigned Saturate
 
 
@@ -707,13 +684,15 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void)
     \param [in]    sat  Bit position to saturate to (0..31)
     \param [in]    sat  Bit position to saturate to (0..31)
     \return             Saturated value
     \return             Saturated value
  */
  */
-#define __USAT(ARG1,ARG2) \
-({                          \
-  uint32_t __RES, __ARG1 = (ARG1); \
-  __ASM ("usat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
-  __RES; \
- })
-
+#define __USAT(ARG1, ARG2)                   \
+    (                                        \
+        {                                    \
+            uint32_t __RES, __ARG1 = (ARG1); \
+            __ASM("usat %0, %1, %2"          \
+                  : "=r"(__RES)              \
+                  : "I"(ARG2), "r"(__ARG1)); \
+            __RES;                           \
+        })
 
 
 /** \brief  Count leading zeros
 /** \brief  Count leading zeros
 
 
@@ -722,15 +701,16 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void)
     \param [in]  value  Value to count the leading zeros
     \param [in]  value  Value to count the leading zeros
     \return             number of leading zeros in value
     \return             number of leading zeros in value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value)
+__attribute__((always_inline)) __STATIC_INLINE uint8_t __CLZ(uint32_t value)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) );
-   return ((uint8_t) result);    /* Add explicit type cast here */
+    __ASM volatile("clz %0, %1"
+                   : "=r"(result)
+                   : "r"(value));
+    return ((uint8_t)result); /* Add explicit type cast here */
 }
 }
 
 
-
 /** \brief  Rotate Right with Extend (32 bit)
 /** \brief  Rotate Right with Extend (32 bit)
 
 
     This function moves each bit of a bitstring right by one bit. The carry input is shifted in at the left end of the bitstring.
     This function moves each bit of a bitstring right by one bit. The carry input is shifted in at the left end of the bitstring.
@@ -738,15 +718,16 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value)
     \param [in]    value  Value to rotate
     \param [in]    value  Value to rotate
     \return               Rotated value
     \return               Rotated value
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RRX(uint32_t value)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
-  return(result);
+    __ASM volatile("rrx %0, %1"
+                   : __CMSIS_GCC_OUT_REG(result)
+                   : __CMSIS_GCC_USE_REG(value));
+    return (result);
 }
 }
 
 
-
 /** \brief  LDRT Unprivileged (8 bit)
 /** \brief  LDRT Unprivileged (8 bit)
 
 
     This function executes a Unprivileged LDRT instruction for 8 bit value.
     This function executes a Unprivileged LDRT instruction for 8 bit value.
@@ -754,22 +735,26 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RRX(uint32_t value
     \param [in]    ptr  Pointer to data
     \param [in]    ptr  Pointer to data
     \return             value of type uint8_t at (*ptr)
     \return             value of type uint8_t at (*ptr)
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *addr)
+__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *addr)
 {
 {
     uint32_t result;
     uint32_t result;
 
 
 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
-   __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*addr) );
+    __ASM volatile("ldrbt %0, %1"
+                   : "=r"(result)
+                   : "Q"(*addr));
 #else
 #else
     /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
     /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
        accepted by assembler. So has to use following less efficient pattern.
        accepted by assembler. So has to use following less efficient pattern.
     */
     */
-   __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
+    __ASM volatile("ldrbt %0, [%1]"
+                   : "=r"(result)
+                   : "r"(addr)
+                   : "memory");
 #endif
 #endif
-   return ((uint8_t) result);    /* Add explicit type cast here */
+    return ((uint8_t)result); /* Add explicit type cast here */
 }
 }
 
 
-
 /** \brief  LDRT Unprivileged (16 bit)
 /** \brief  LDRT Unprivileged (16 bit)
 
 
     This function executes a Unprivileged LDRT instruction for 16 bit values.
     This function executes a Unprivileged LDRT instruction for 16 bit values.
@@ -777,22 +762,26 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDRBT(volatile uint
     \param [in]    ptr  Pointer to data
     \param [in]    ptr  Pointer to data
     \return        value of type uint16_t at (*ptr)
     \return        value of type uint16_t at (*ptr)
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *addr)
+__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *addr)
 {
 {
     uint32_t result;
     uint32_t result;
 
 
 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
-   __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*addr) );
+    __ASM volatile("ldrht %0, %1"
+                   : "=r"(result)
+                   : "Q"(*addr));
 #else
 #else
     /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
     /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
        accepted by assembler. So has to use following less efficient pattern.
        accepted by assembler. So has to use following less efficient pattern.
     */
     */
-   __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
+    __ASM volatile("ldrht %0, [%1]"
+                   : "=r"(result)
+                   : "r"(addr)
+                   : "memory");
 #endif
 #endif
-   return ((uint16_t) result);    /* Add explicit type cast here */
+    return ((uint16_t)result); /* Add explicit type cast here */
 }
 }
 
 
-
 /** \brief  LDRT Unprivileged (32 bit)
 /** \brief  LDRT Unprivileged (32 bit)
 
 
     This function executes a Unprivileged LDRT instruction for 32 bit values.
     This function executes a Unprivileged LDRT instruction for 32 bit values.
@@ -800,15 +789,16 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDRHT(volatile uin
     \param [in]    ptr  Pointer to data
     \param [in]    ptr  Pointer to data
     \return        value of type uint32_t at (*ptr)
     \return        value of type uint32_t at (*ptr)
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *addr)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *addr)
 {
 {
     uint32_t result;
     uint32_t result;
 
 
-   __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*addr) );
-   return(result);
+    __ASM volatile("ldrt %0, %1"
+                   : "=r"(result)
+                   : "Q"(*addr));
+    return (result);
 }
 }
 
 
-
 /** \brief  STRT Unprivileged (8 bit)
 /** \brief  STRT Unprivileged (8 bit)
 
 
     This function executes a Unprivileged STRT instruction for 8 bit values.
     This function executes a Unprivileged STRT instruction for 8 bit values.
@@ -816,12 +806,13 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDRT(volatile uint
     \param [in]  value  Value to store
     \param [in]  value  Value to store
     \param [in]    ptr  Pointer to location
     \param [in]    ptr  Pointer to location
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *addr)
+__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *addr)
 {
 {
-   __ASM volatile ("strbt %1, %0" : "=Q" (*addr) : "r" ((uint32_t)value) );
+    __ASM volatile("strbt %1, %0"
+                   : "=Q"(*addr)
+                   : "r"((uint32_t)value));
 }
 }
 
 
-
 /** \brief  STRT Unprivileged (16 bit)
 /** \brief  STRT Unprivileged (16 bit)
 
 
     This function executes a Unprivileged STRT instruction for 16 bit values.
     This function executes a Unprivileged STRT instruction for 16 bit values.
@@ -829,12 +820,13 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __STRBT(uint8_t value, v
     \param [in]  value  Value to store
     \param [in]  value  Value to store
     \param [in]    ptr  Pointer to location
     \param [in]    ptr  Pointer to location
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *addr)
+__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *addr)
 {
 {
-   __ASM volatile ("strht %1, %0" : "=Q" (*addr) : "r" ((uint32_t)value) );
+    __ASM volatile("strht %1, %0"
+                   : "=Q"(*addr)
+                   : "r"((uint32_t)value));
 }
 }
 
 
-
 /** \brief  STRT Unprivileged (32 bit)
 /** \brief  STRT Unprivileged (32 bit)
 
 
     This function executes a Unprivileged STRT instruction for 32 bit values.
     This function executes a Unprivileged STRT instruction for 32 bit values.
@@ -842,25 +834,24 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __STRHT(uint16_t value,
     \param [in]  value  Value to store
     \param [in]  value  Value to store
     \param [in]    ptr  Pointer to location
     \param [in]    ptr  Pointer to location
  */
  */
-__attribute__( ( always_inline ) ) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *addr)
+__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *addr)
 {
 {
-   __ASM volatile ("strt %1, %0" : "=Q" (*addr) : "r" (value) );
+    __ASM volatile("strt %1, %0"
+                   : "=Q"(*addr)
+                   : "r"(value));
 }
 }
 
 
 #endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
 #endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
 
 
-
-#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
+#elif defined(__ICCARM__) /*------------------ ICC Compiler -------------------*/
 /* IAR iccarm specific functions */
 /* IAR iccarm specific functions */
 #include <cmsis_iar.h>
 #include <cmsis_iar.h>
 
 
-
-#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
+#elif defined(__TMS470__) /*---------------- TI CCS Compiler ------------------*/
 /* TI CCS specific functions */
 /* TI CCS specific functions */
 #include <cmsis_ccs.h>
 #include <cmsis_ccs.h>
 
 
-
-#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
+#elif defined(__TASKING__) /*------------------ TASKING Compiler --------------*/
 /* TASKING carm specific functions */
 /* TASKING carm specific functions */
 /*
 /*
  * The CMSIS functions have been implemented as intrinsics in the compiler.
  * The CMSIS functions have been implemented as intrinsics in the compiler.
@@ -868,8 +859,7 @@ __attribute__( ( always_inline ) ) __STATIC_INLINE void __STRT(uint32_t value, v
  * Including the CMSIS ones.
  * Including the CMSIS ones.
  */
  */
 
 
-
-#elif defined ( __CSMC__ ) /*------------------ COSMIC Compiler -------------------*/
+#elif defined(__CSMC__) /*------------------ COSMIC Compiler -------------------*/
 /* Cosmic specific functions */
 /* Cosmic specific functions */
 #include <cmsis_csm.h>
 #include <cmsis_csm.h>
 
 

+ 514 - 381
bsp/swm320-lq100/Libraries/CMSIS/CoreSupport/core_cmSimd.h

@@ -1,4 +1,4 @@
-/**************************************************************************//**
+/**************************************************************************/ /**
  * @file     core_cmSimd.h
  * @file     core_cmSimd.h
  * @brief    CMSIS Cortex-M SIMD Header File
  * @brief    CMSIS Cortex-M SIMD Header File
  * @version  V4.00
  * @version  V4.00
@@ -34,661 +34,794 @@
    POSSIBILITY OF SUCH DAMAGE.
    POSSIBILITY OF SUCH DAMAGE.
    ---------------------------------------------------------------------------*/
    ---------------------------------------------------------------------------*/
 
 
-
-#if defined ( __ICCARM__ )
- #pragma system_include  /* treat file as system include file for MISRA check */
+#if defined(__ICCARM__)
+#pragma system_include /* treat file as system include file for MISRA check */
 #endif
 #endif
 
 
 #ifndef __CORE_CMSIMD_H
 #ifndef __CORE_CMSIMD_H
 #define __CORE_CMSIMD_H
 #define __CORE_CMSIMD_H
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
- extern "C" {
+extern "C"
+{
 #endif
 #endif
 
 
-
-/*******************************************************************************
+    /*******************************************************************************
  *                Hardware Abstraction Layer
  *                Hardware Abstraction Layer
  ******************************************************************************/
  ******************************************************************************/
 
 
-
-/* ###################  Compiler specific Intrinsics  ########################### */
-/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
+    /* ###################  Compiler specific Intrinsics  ########################### */
+    /** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
   Access to dedicated SIMD instructions
   Access to dedicated SIMD instructions
   @{
   @{
 */
 */
 
 
-#if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
+#if defined(__CC_ARM) /*------------------RealView Compiler -----------------*/
 /* ARM armcc specific functions */
 /* ARM armcc specific functions */
-#define __SADD8                           __sadd8
-#define __QADD8                           __qadd8
-#define __SHADD8                          __shadd8
-#define __UADD8                           __uadd8
-#define __UQADD8                          __uqadd8
-#define __UHADD8                          __uhadd8
-#define __SSUB8                           __ssub8
-#define __QSUB8                           __qsub8
-#define __SHSUB8                          __shsub8
-#define __USUB8                           __usub8
-#define __UQSUB8                          __uqsub8
-#define __UHSUB8                          __uhsub8
-#define __SADD16                          __sadd16
-#define __QADD16                          __qadd16
-#define __SHADD16                         __shadd16
-#define __UADD16                          __uadd16
-#define __UQADD16                         __uqadd16
-#define __UHADD16                         __uhadd16
-#define __SSUB16                          __ssub16
-#define __QSUB16                          __qsub16
-#define __SHSUB16                         __shsub16
-#define __USUB16                          __usub16
-#define __UQSUB16                         __uqsub16
-#define __UHSUB16                         __uhsub16
-#define __SASX                            __sasx
-#define __QASX                            __qasx
-#define __SHASX                           __shasx
-#define __UASX                            __uasx
-#define __UQASX                           __uqasx
-#define __UHASX                           __uhasx
-#define __SSAX                            __ssax
-#define __QSAX                            __qsax
-#define __SHSAX                           __shsax
-#define __USAX                            __usax
-#define __UQSAX                           __uqsax
-#define __UHSAX                           __uhsax
-#define __USAD8                           __usad8
-#define __USADA8                          __usada8
-#define __SSAT16                          __ssat16
-#define __USAT16                          __usat16
-#define __UXTB16                          __uxtb16
-#define __UXTAB16                         __uxtab16
-#define __SXTB16                          __sxtb16
-#define __SXTAB16                         __sxtab16
-#define __SMUAD                           __smuad
-#define __SMUADX                          __smuadx
-#define __SMLAD                           __smlad
-#define __SMLADX                          __smladx
-#define __SMLALD                          __smlald
-#define __SMLALDX                         __smlaldx
-#define __SMUSD                           __smusd
-#define __SMUSDX                          __smusdx
-#define __SMLSD                           __smlsd
-#define __SMLSDX                          __smlsdx
-#define __SMLSLD                          __smlsld
-#define __SMLSLDX                         __smlsldx
-#define __SEL                             __sel
-#define __QADD                            __qadd
-#define __QSUB                            __qsub
-
-#define __PKHBT(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0x0000FFFFUL) |  \
-                                           ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL)  )
-
-#define __PKHTB(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0xFFFF0000UL) |  \
-                                           ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL)  )
-
-#define __SMMLA(ARG1,ARG2,ARG3)          ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \
-                                                      ((int64_t)(ARG3) << 32)      ) >> 32))
-
-
-#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
+#define __SADD8 __sadd8
+#define __QADD8 __qadd8
+#define __SHADD8 __shadd8
+#define __UADD8 __uadd8
+#define __UQADD8 __uqadd8
+#define __UHADD8 __uhadd8
+#define __SSUB8 __ssub8
+#define __QSUB8 __qsub8
+#define __SHSUB8 __shsub8
+#define __USUB8 __usub8
+#define __UQSUB8 __uqsub8
+#define __UHSUB8 __uhsub8
+#define __SADD16 __sadd16
+#define __QADD16 __qadd16
+#define __SHADD16 __shadd16
+#define __UADD16 __uadd16
+#define __UQADD16 __uqadd16
+#define __UHADD16 __uhadd16
+#define __SSUB16 __ssub16
+#define __QSUB16 __qsub16
+#define __SHSUB16 __shsub16
+#define __USUB16 __usub16
+#define __UQSUB16 __uqsub16
+#define __UHSUB16 __uhsub16
+#define __SASX __sasx
+#define __QASX __qasx
+#define __SHASX __shasx
+#define __UASX __uasx
+#define __UQASX __uqasx
+#define __UHASX __uhasx
+#define __SSAX __ssax
+#define __QSAX __qsax
+#define __SHSAX __shsax
+#define __USAX __usax
+#define __UQSAX __uqsax
+#define __UHSAX __uhsax
+#define __USAD8 __usad8
+#define __USADA8 __usada8
+#define __SSAT16 __ssat16
+#define __USAT16 __usat16
+#define __UXTB16 __uxtb16
+#define __UXTAB16 __uxtab16
+#define __SXTB16 __sxtb16
+#define __SXTAB16 __sxtab16
+#define __SMUAD __smuad
+#define __SMUADX __smuadx
+#define __SMLAD __smlad
+#define __SMLADX __smladx
+#define __SMLALD __smlald
+#define __SMLALDX __smlaldx
+#define __SMUSD __smusd
+#define __SMUSDX __smusdx
+#define __SMLSD __smlsd
+#define __SMLSDX __smlsdx
+#define __SMLSLD __smlsld
+#define __SMLSLDX __smlsldx
+#define __SEL __sel
+#define __QADD __qadd
+#define __QSUB __qsub
+
+#define __PKHBT(ARG1, ARG2, ARG3) (((((uint32_t)(ARG1))) & 0x0000FFFFUL) | \
+                                   ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL))
+
+#define __PKHTB(ARG1, ARG2, ARG3) (((((uint32_t)(ARG1))) & 0xFFFF0000UL) | \
+                                   ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL))
+
+#define __SMMLA(ARG1, ARG2, ARG3) ((int32_t)((((int64_t)(ARG1) * (ARG2)) + \
+                                              ((int64_t)(ARG3) << 32)) >>  \
+                                             32))
+
+#elif defined(__GNUC__) /*------------------ GNU Compiler ---------------------*/
 /* GNU gcc specific functions */
 /* GNU gcc specific functions */
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("sadd8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("qadd8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("shadd8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uadd8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uqadd8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uhadd8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("ssub8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("qsub8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("shsub8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("usub8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uqsub8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uhsub8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("sadd16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("qadd16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("shadd16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uadd16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uqadd16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uhadd16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("ssub16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("qsub16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("shsub16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("usub16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uqsub16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uhsub16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("sasx %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("qasx %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("shasx %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uasx %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uqasx %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uhasx %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("ssax %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("qsax %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("shsax %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("usax %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uqsax %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uhsax %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("usad8 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
-  return(result);
+    __ASM volatile("usada8 %0, %1, %2, %3"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2), "r"(op3));
+    return (result);
 }
 }
 
 
-#define __SSAT16(ARG1,ARG2) \
-({                          \
-  uint32_t __RES, __ARG1 = (ARG1); \
-  __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
-  __RES; \
- })
+#define __SSAT16(ARG1, ARG2)                 \
+    (                                        \
+        {                                    \
+            uint32_t __RES, __ARG1 = (ARG1); \
+            __ASM("ssat16 %0, %1, %2"        \
+                  : "=r"(__RES)              \
+                  : "I"(ARG2), "r"(__ARG1)); \
+            __RES;                           \
+        })
 
 
-#define __USAT16(ARG1,ARG2) \
-({                          \
-  uint32_t __RES, __ARG1 = (ARG1); \
-  __ASM ("usat16 %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
-  __RES; \
- })
+#define __USAT16(ARG1, ARG2)                 \
+    (                                        \
+        {                                    \
+            uint32_t __RES, __ARG1 = (ARG1); \
+            __ASM("usat16 %0, %1, %2"        \
+                  : "=r"(__RES)              \
+                  : "I"(ARG2), "r"(__ARG1)); \
+            __RES;                           \
+        })
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1));
-  return(result);
+    __ASM volatile("uxtb16 %0, %1"
+                   : "=r"(result)
+                   : "r"(op1));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("uxtab16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1));
-  return(result);
+    __ASM volatile("sxtb16 %0, %1"
+                   : "=r"(result)
+                   : "r"(op1));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("sxtab16 %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD  (uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUAD(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("smuad %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUADX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("smuadx %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLAD(uint32_t op1, uint32_t op2, uint32_t op3)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
-  return(result);
+    __ASM volatile("smlad %0, %1, %2, %3"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2), "r"(op3));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLADX(uint32_t op1, uint32_t op2, uint32_t op3)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
-  return(result);
+    __ASM volatile("smladx %0, %1, %2, %3"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2), "r"(op3));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc)
+__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALD(uint32_t op1, uint32_t op2, uint64_t acc)
 {
 {
-  union llreg_u{
-    uint32_t w32[2];
-    uint64_t w64;
-  } llr;
-  llr.w64 = acc;
+    union llreg_u
+    {
+        uint32_t w32[2];
+        uint64_t w64;
+    } llr;
+    llr.w64 = acc;
 
 
-#ifndef __ARMEB__   // Little endian
-  __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
-#else               // Big endian
-  __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
+#ifndef __ARMEB__ // Little endian
+    __ASM volatile("smlald %0, %1, %2, %3"
+                   : "=r"(llr.w32[0]), "=r"(llr.w32[1])
+                   : "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1]));
+#else             // Big endian
+    __ASM volatile("smlald %0, %1, %2, %3"
+                   : "=r"(llr.w32[1]), "=r"(llr.w32[0])
+                   : "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0]));
 #endif
 #endif
 
 
-  return(llr.w64);
+    return (llr.w64);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc)
+__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALDX(uint32_t op1, uint32_t op2, uint64_t acc)
 {
 {
-  union llreg_u{
-    uint32_t w32[2];
-    uint64_t w64;
-  } llr;
-  llr.w64 = acc;
+    union llreg_u
+    {
+        uint32_t w32[2];
+        uint64_t w64;
+    } llr;
+    llr.w64 = acc;
 
 
-#ifndef __ARMEB__   // Little endian
-  __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
-#else               // Big endian
-  __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
+#ifndef __ARMEB__ // Little endian
+    __ASM volatile("smlaldx %0, %1, %2, %3"
+                   : "=r"(llr.w32[0]), "=r"(llr.w32[1])
+                   : "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1]));
+#else             // Big endian
+    __ASM volatile("smlaldx %0, %1, %2, %3"
+                   : "=r"(llr.w32[1]), "=r"(llr.w32[0])
+                   : "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0]));
 #endif
 #endif
 
 
-  return(llr.w64);
+    return (llr.w64);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD  (uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSD(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("smusd %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSDX(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("smusdx %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSD(uint32_t op1, uint32_t op2, uint32_t op3)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
-  return(result);
+    __ASM volatile("smlsd %0, %1, %2, %3"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2), "r"(op3));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSDX(uint32_t op1, uint32_t op2, uint32_t op3)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
-  return(result);
+    __ASM volatile("smlsdx %0, %1, %2, %3"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2), "r"(op3));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc)
+__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLD(uint32_t op1, uint32_t op2, uint64_t acc)
 {
 {
-  union llreg_u{
-    uint32_t w32[2];
-    uint64_t w64;
-  } llr;
-  llr.w64 = acc;
+    union llreg_u
+    {
+        uint32_t w32[2];
+        uint64_t w64;
+    } llr;
+    llr.w64 = acc;
 
 
-#ifndef __ARMEB__   // Little endian
-  __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
-#else               // Big endian
-  __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
+#ifndef __ARMEB__ // Little endian
+    __ASM volatile("smlsld %0, %1, %2, %3"
+                   : "=r"(llr.w32[0]), "=r"(llr.w32[1])
+                   : "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1]));
+#else             // Big endian
+    __ASM volatile("smlsld %0, %1, %2, %3"
+                   : "=r"(llr.w32[1]), "=r"(llr.w32[0])
+                   : "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0]));
 #endif
 #endif
 
 
-  return(llr.w64);
+    return (llr.w64);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc)
+__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLDX(uint32_t op1, uint32_t op2, uint64_t acc)
 {
 {
-  union llreg_u{
-    uint32_t w32[2];
-    uint64_t w64;
-  } llr;
-  llr.w64 = acc;
+    union llreg_u
+    {
+        uint32_t w32[2];
+        uint64_t w64;
+    } llr;
+    llr.w64 = acc;
 
 
-#ifndef __ARMEB__   // Little endian
-  __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) );
-#else               // Big endian
-  __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) );
+#ifndef __ARMEB__ // Little endian
+    __ASM volatile("smlsldx %0, %1, %2, %3"
+                   : "=r"(llr.w32[0]), "=r"(llr.w32[1])
+                   : "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1]));
+#else             // Big endian
+    __ASM volatile("smlsldx %0, %1, %2, %3"
+                   : "=r"(llr.w32[1]), "=r"(llr.w32[0])
+                   : "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0]));
 #endif
 #endif
 
 
-  return(llr.w64);
+    return (llr.w64);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL  (uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SEL(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("sel %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("qadd %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2)
 {
 {
-  uint32_t result;
+    uint32_t result;
 
 
-  __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
-  return(result);
+    __ASM volatile("qsub %0, %1, %2"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2));
+    return (result);
 }
 }
 
 
-#define __PKHBT(ARG1,ARG2,ARG3) \
-({                          \
-  uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
-  __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2), "I" (ARG3)  ); \
-  __RES; \
- })
+#define __PKHBT(ARG1, ARG2, ARG3)                             \
+    (                                                         \
+        {                                                     \
+            uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
+            __ASM("pkhbt %0, %1, %2, lsl %3"                  \
+                  : "=r"(__RES)                               \
+                  : "r"(__ARG1), "r"(__ARG2), "I"(ARG3));     \
+            __RES;                                            \
+        })
 
 
-#define __PKHTB(ARG1,ARG2,ARG3) \
-({                          \
-  uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
-  if (ARG3 == 0) \
-    __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2)  ); \
-  else \
-    __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) :  "r" (__ARG1), "r" (__ARG2), "I" (ARG3)  ); \
-  __RES; \
- })
+#define __PKHTB(ARG1, ARG2, ARG3)                             \
+    (                                                         \
+        {                                                     \
+            uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
+            if (ARG3 == 0)                                    \
+                __ASM("pkhtb %0, %1, %2"                      \
+                      : "=r"(__RES)                           \
+                      : "r"(__ARG1), "r"(__ARG2));            \
+            else                                              \
+                __ASM("pkhtb %0, %1, %2, asr %3"              \
+                      : "=r"(__RES)                           \
+                      : "r"(__ARG1), "r"(__ARG2), "I"(ARG3)); \
+            __RES;                                            \
+        })
 
 
-__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3)
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMMLA(int32_t op1, int32_t op2, int32_t op3)
 {
 {
- int32_t result;
+    int32_t result;
 
 
- __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r"  (op1), "r" (op2), "r" (op3) );
- return(result);
+    __ASM volatile("smmla %0, %1, %2, %3"
+                   : "=r"(result)
+                   : "r"(op1), "r"(op2), "r"(op3));
+    return (result);
 }
 }
 
 
-
-#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
+#elif defined(__ICCARM__) /*------------------ ICC Compiler -------------------*/
 /* IAR iccarm specific functions */
 /* IAR iccarm specific functions */
 #include <cmsis_iar.h>
 #include <cmsis_iar.h>
 
 
-
-#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
+#elif defined(__TMS470__) /*---------------- TI CCS Compiler ------------------*/
 /* TI CCS specific functions */
 /* TI CCS specific functions */
 #include <cmsis_ccs.h>
 #include <cmsis_ccs.h>
 
 
-
-#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
+#elif defined(__TASKING__) /*------------------ TASKING Compiler --------------*/
 /* TASKING carm specific functions */
 /* TASKING carm specific functions */
 /* not yet supported */
 /* not yet supported */
 
 
-
-#elif defined ( __CSMC__ ) /*------------------ COSMIC Compiler -------------------*/
+#elif defined(__CSMC__) /*------------------ COSMIC Compiler -------------------*/
 /* Cosmic specific functions */
 /* Cosmic specific functions */
 #include <cmsis_csm.h>
 #include <cmsis_csm.h>
 
 
 #endif
 #endif
 
 
-/*@} end of group CMSIS_SIMD_intrinsics */
-
+    /*@} end of group CMSIS_SIMD_intrinsics */
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }

File diff suppressed because it is too large
+ 716 - 109
bsp/swm320-lq100/Libraries/CMSIS/DeviceSupport/SWM320.h


+ 87 - 87
bsp/swm320-lq100/Libraries/CMSIS/DeviceSupport/startup/arm/startup_SWM320.s

@@ -1,10 +1,10 @@
 ;******************************************************************************************************************************************
 ;******************************************************************************************************************************************
-; 文件名称:	startup_SWM2400.s
-; 功能说明:	SWM2400单片机的启动文件
-; 技术支持:	http://www.synwit.com.cn/e/tool/gbook/?bid=1
-; 注意事项:
-; 版本日期: V1.1.0		2017年10月25日
-; 升级记录:
+; 鏂囦欢鍚嶇О:	startup_SWM320.s
+; 鍔熻兘璇存槑:	SWM2400鍗曠墖鏈虹殑鍚�姩鏂囦欢
+; 鎶€鏈�敮鎸�:	http://www.synwit.com.cn/e/tool/gbook/?bid=1
+; 娉ㄦ剰浜嬮」:
+; 鐗堟湰鏃ユ湡: V1.1.0		2017骞�10鏈�25鏃�
+; 鍗囩骇璁板綍:
 ;
 ;
 ;
 ;
 ;******************************************************************************************************************************************
 ;******************************************************************************************************************************************
@@ -25,7 +25,7 @@
 ;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 ;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 ; </h>
 ; </h>
 
 
-Stack_Size      EQU     0x00000400
+Stack_Size      EQU     0x00001000
 
 
                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
 Stack_Mem       SPACE   Stack_Size
 Stack_Mem       SPACE   Stack_Size
@@ -36,7 +36,7 @@ __initial_sp
 ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 ; </h>
 ; </h>
 
 
-Heap_Size       EQU     0x00000200
+Heap_Size       EQU     0x00000000
 
 
                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
 __heap_base
 __heap_base
@@ -94,7 +94,7 @@ __Vectors       DCD     __initial_sp               ; Top of Stack
                 DCD     GPIOC4_Handler
                 DCD     GPIOC4_Handler
                 DCD     GPIOC5_Handler
                 DCD     GPIOC5_Handler
                 DCD     GPIOC6_Handler
                 DCD     GPIOC6_Handler
-                DCD     GPIOC7_Handler                                 
+                DCD     GPIOC7_Handler
                 DCD     GPIOM0_Handler
                 DCD     GPIOM0_Handler
                 DCD     GPIOM1_Handler
                 DCD     GPIOM1_Handler
                 DCD     GPIOM2_Handler
                 DCD     GPIOM2_Handler
@@ -102,25 +102,25 @@ __Vectors       DCD     __initial_sp               ; Top of Stack
                 DCD     GPIOM4_Handler
                 DCD     GPIOM4_Handler
                 DCD     GPIOM5_Handler
                 DCD     GPIOM5_Handler
                 DCD     GPIOM6_Handler
                 DCD     GPIOM6_Handler
-                DCD     GPIOM7_Handler                                            
-				DCD     DMA_Handler
+                DCD     GPIOM7_Handler
+                DCD     DMA_Handler
                 DCD     LCD_Handler
                 DCD     LCD_Handler
                 DCD     NORFLC_Handler
                 DCD     NORFLC_Handler
-				DCD		CAN_Handler
+                DCD     CAN_Handler
                 DCD     PULSE_Handler
                 DCD     PULSE_Handler
                 DCD     WDT_Handler
                 DCD     WDT_Handler
                 DCD     PWM_Handler
                 DCD     PWM_Handler
                 DCD     UART0_Handler
                 DCD     UART0_Handler
-				DCD     UART1_Handler
-				DCD     UART2_Handler
-				DCD     UART3_Handler
-				DCD     0
-				DCD     I2C0_Handler
+                DCD     UART1_Handler
+                DCD     UART2_Handler
+                DCD     UART3_Handler
+                DCD     0
+                DCD     I2C0_Handler
                 DCD     I2C1_Handler
                 DCD     I2C1_Handler
                 DCD     SPI0_Handler
                 DCD     SPI0_Handler
                 DCD     ADC0_Handler
                 DCD     ADC0_Handler
                 DCD     RTC_Handler
                 DCD     RTC_Handler
-                DCD     ANAC_Handler
+                DCD     BOD_Handler
                 DCD     SDIO_Handler
                 DCD     SDIO_Handler
                 DCD     GPIOA_Handler
                 DCD     GPIOA_Handler
                 DCD     GPIOB_Handler
                 DCD     GPIOB_Handler
@@ -130,13 +130,13 @@ __Vectors       DCD     __initial_sp               ; Top of Stack
                 DCD     GPIOP_Handler
                 DCD     GPIOP_Handler
                 DCD     ADC1_Handler
                 DCD     ADC1_Handler
                 DCD     FPU_Handler
                 DCD     FPU_Handler
-				DCD     SPI1_Handler
-				DCD     TIMR0_Handler
-				DCD     TIMR1_Handler
-				DCD     TIMR2_Handler
-				DCD     TIMR3_Handler
-				DCD     TIMR4_Handler
-				DCD     TIMR5_Handler
+                DCD     SPI1_Handler
+                DCD     TIMR0_Handler
+                DCD     TIMR1_Handler
+                DCD     TIMR2_Handler
+                DCD     TIMR3_Handler
+                DCD     TIMR4_Handler
+                DCD     TIMR5_Handler
                          
                          
 __Vectors_End
 __Vectors_End
 
 
@@ -157,262 +157,262 @@ Reset_Handler    PROC
 ; Dummy Exception Handlers (infinite loops which can be modified)
 ; Dummy Exception Handlers (infinite loops which can be modified)
 
 
 NMI_Handler     PROC
 NMI_Handler     PROC
-                EXPORT  NMI_Handler                [WEAK]
+                EXPORT  NMI_Handler             [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 HardFault_Handler PROC
 HardFault_Handler PROC
-                EXPORT  HardFault_Handler          [WEAK]
+                EXPORT  HardFault_Handler       [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 MemManage_Handler PROC
 MemManage_Handler PROC
-                EXPORT  MemManage_Handler          [WEAK]
+                EXPORT  MemManage_Handler       [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 BusFault_Handler PROC
 BusFault_Handler PROC
-                EXPORT  BusFault_Handler           [WEAK]
+                EXPORT  BusFault_Handler        [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 UsageFault_Handler PROC
 UsageFault_Handler PROC
-                EXPORT  UsageFault_Handler         [WEAK]
+                EXPORT  UsageFault_Handler      [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 SVC_Handler     PROC
 SVC_Handler     PROC
-                EXPORT  SVC_Handler                [WEAK]
+                EXPORT  SVC_Handler             [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 DebugMon_Handler PROC
 DebugMon_Handler PROC
-                EXPORT  DebugMon_Handler           [WEAK]
+                EXPORT  DebugMon_Handler        [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 PendSV_Handler  PROC
 PendSV_Handler  PROC
-                EXPORT  PendSV_Handler             [WEAK]
+                EXPORT  PendSV_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 SysTick_Handler PROC
 SysTick_Handler PROC
-                EXPORT  SysTick_Handler            [WEAK]
+                EXPORT  SysTick_Handler         [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOA0_Handler PROC
 GPIOA0_Handler PROC
-                EXPORT  GPIOA0_Handler            [WEAK]
+                EXPORT  GPIOA0_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOA1_Handler PROC
 GPIOA1_Handler PROC
-                EXPORT  GPIOA1_Handler            [WEAK]
+                EXPORT  GPIOA1_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOA2_Handler PROC
 GPIOA2_Handler PROC
-                EXPORT  GPIOA2_Handler            [WEAK]
+                EXPORT  GPIOA2_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOA3_Handler PROC
 GPIOA3_Handler PROC
-                EXPORT  GPIOA3_Handler            [WEAK]
+                EXPORT  GPIOA3_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOA4_Handler PROC
 GPIOA4_Handler PROC
-                EXPORT  GPIOA4_Handler            [WEAK]
+                EXPORT  GPIOA4_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOA5_Handler PROC
 GPIOA5_Handler PROC
-                EXPORT  GPIOA5_Handler            [WEAK]
+                EXPORT  GPIOA5_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOA6_Handler PROC
 GPIOA6_Handler PROC
-                EXPORT  GPIOA6_Handler            [WEAK]
+                EXPORT  GPIOA6_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOA7_Handler PROC
 GPIOA7_Handler PROC
-                EXPORT  GPIOA7_Handler            [WEAK]
+                EXPORT  GPIOA7_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOB0_Handler PROC
 GPIOB0_Handler PROC
-                EXPORT  GPIOB0_Handler            [WEAK]
+                EXPORT  GPIOB0_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOB1_Handler PROC
 GPIOB1_Handler PROC
-                EXPORT  GPIOB1_Handler            [WEAK]
+                EXPORT  GPIOB1_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOB2_Handler PROC
 GPIOB2_Handler PROC
-                EXPORT  GPIOB2_Handler            [WEAK]
+                EXPORT  GPIOB2_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOB3_Handler PROC
 GPIOB3_Handler PROC
-                EXPORT  GPIOB3_Handler            [WEAK]
+                EXPORT  GPIOB3_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOB4_Handler PROC
 GPIOB4_Handler PROC
-                EXPORT  GPIOB4_Handler            [WEAK]
+                EXPORT  GPIOB4_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOB5_Handler PROC
 GPIOB5_Handler PROC
-                EXPORT  GPIOB5_Handler            [WEAK]
+                EXPORT  GPIOB5_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOB6_Handler PROC
 GPIOB6_Handler PROC
-                EXPORT  GPIOB6_Handler            [WEAK]
+                EXPORT  GPIOB6_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOB7_Handler PROC
 GPIOB7_Handler PROC
-                EXPORT  GPIOB7_Handler            [WEAK]
+                EXPORT  GPIOB7_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOC0_Handler PROC
 GPIOC0_Handler PROC
-                EXPORT  GPIOC0_Handler            [WEAK]
+                EXPORT  GPIOC0_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOC1_Handler PROC
 GPIOC1_Handler PROC
-                EXPORT  GPIOC1_Handler            [WEAK]
+                EXPORT  GPIOC1_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOC2_Handler PROC
 GPIOC2_Handler PROC
-                EXPORT  GPIOC2_Handler            [WEAK]
+                EXPORT  GPIOC2_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOC3_Handler PROC
 GPIOC3_Handler PROC
-                EXPORT  GPIOC3_Handler            [WEAK]
+                EXPORT  GPIOC3_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOC4_Handler PROC
 GPIOC4_Handler PROC
-                EXPORT  GPIOC4_Handler            [WEAK]
+                EXPORT  GPIOC4_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOC5_Handler PROC
 GPIOC5_Handler PROC
-                EXPORT  GPIOC5_Handler            [WEAK]
+                EXPORT  GPIOC5_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOC6_Handler PROC
 GPIOC6_Handler PROC
-                EXPORT  GPIOC6_Handler            [WEAK]
+                EXPORT  GPIOC6_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOC7_Handler PROC
 GPIOC7_Handler PROC
-                EXPORT  GPIOC7_Handler            [WEAK]
+                EXPORT  GPIOC7_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOM0_Handler PROC
 GPIOM0_Handler PROC
-                EXPORT  GPIOM0_Handler            [WEAK]
+                EXPORT  GPIOM0_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOM1_Handler PROC
 GPIOM1_Handler PROC
-                EXPORT  GPIOM1_Handler            [WEAK]
+                EXPORT  GPIOM1_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOM2_Handler PROC
 GPIOM2_Handler PROC
-                EXPORT  GPIOM2_Handler            [WEAK]
+                EXPORT  GPIOM2_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOM3_Handler PROC
 GPIOM3_Handler PROC
-                EXPORT  GPIOM3_Handler            [WEAK]
+                EXPORT  GPIOM3_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOM4_Handler PROC
 GPIOM4_Handler PROC
-                EXPORT  GPIOM4_Handler            [WEAK]
+                EXPORT  GPIOM4_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOM5_Handler PROC
 GPIOM5_Handler PROC
-                EXPORT  GPIOM5_Handler            [WEAK]
+                EXPORT  GPIOM5_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOM6_Handler PROC
 GPIOM6_Handler PROC
-                EXPORT  GPIOM6_Handler            [WEAK]
+                EXPORT  GPIOM6_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOM7_Handler PROC
 GPIOM7_Handler PROC
-                EXPORT  GPIOM7_Handler            [WEAK]
+                EXPORT  GPIOM7_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 DMA_Handler PROC
 DMA_Handler PROC
-                EXPORT  DMA_Handler            [WEAK]
+                EXPORT  DMA_Handler             [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 LCD_Handler PROC
 LCD_Handler PROC
-                EXPORT  LCD_Handler            [WEAK]
+                EXPORT  LCD_Handler             [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 NORFLC_Handler PROC
 NORFLC_Handler PROC
-                EXPORT  NORFLC_Handler            [WEAK]
+                EXPORT  NORFLC_Handler          [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 CAN_Handler PROC
 CAN_Handler PROC
-                EXPORT  CAN_Handler            [WEAK]
+                EXPORT  CAN_Handler             [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 PULSE_Handler PROC
 PULSE_Handler PROC
-                EXPORT  PULSE_Handler          [WEAK]
+                EXPORT  PULSE_Handler           [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 WDT_Handler PROC
 WDT_Handler PROC
-                EXPORT  WDT_Handler            [WEAK]
+                EXPORT  WDT_Handler             [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 PWM_Handler PROC
 PWM_Handler PROC
-                EXPORT  PWM_Handler            [WEAK]
+                EXPORT  PWM_Handler             [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 UART0_Handler PROC
 UART0_Handler PROC
-                EXPORT  UART0_Handler            [WEAK]
+                EXPORT  UART0_Handler           [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 UART1_Handler PROC
 UART1_Handler PROC
-                EXPORT  UART1_Handler            [WEAK]
+                EXPORT  UART1_Handler           [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 UART2_Handler PROC
 UART2_Handler PROC
-                EXPORT  UART2_Handler            [WEAK]
+                EXPORT  UART2_Handler           [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 UART3_Handler PROC
 UART3_Handler PROC
-                EXPORT  UART3_Handler            [WEAK]
+                EXPORT  UART3_Handler           [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
@@ -437,12 +437,12 @@ ADC0_Handler PROC
                 ENDP
                 ENDP
 
 
 RTC_Handler PROC
 RTC_Handler PROC
-                EXPORT  RTC_Handler            [WEAK]
+                EXPORT  RTC_Handler             [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
-ANAC_Handler PROC
-                EXPORT  ANAC_Handler            [WEAK]
+BOD_Handler PROC
+                EXPORT  BOD_Handler             [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
@@ -452,32 +452,32 @@ SDIO_Handler PROC
                 ENDP
                 ENDP
 
 
 GPIOA_Handler PROC
 GPIOA_Handler PROC
-                EXPORT  GPIOA_Handler            [WEAK]
+                EXPORT  GPIOA_Handler           [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOB_Handler PROC
 GPIOB_Handler PROC
-                EXPORT  GPIOB_Handler            [WEAK]
+                EXPORT  GPIOB_Handler           [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOC_Handler PROC
 GPIOC_Handler PROC
-                EXPORT  GPIOC_Handler            [WEAK]
+                EXPORT  GPIOC_Handler           [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOM_Handler PROC
 GPIOM_Handler PROC
-                EXPORT  GPIOM_Handler            [WEAK]
+                EXPORT  GPIOM_Handler           [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPION_Handler PROC
 GPION_Handler PROC
-                EXPORT  GPION_Handler            [WEAK]
+                EXPORT  GPION_Handler           [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
 GPIOP_Handler PROC
 GPIOP_Handler PROC
-                EXPORT  GPIOP_Handler            [WEAK]
+                EXPORT  GPIOP_Handler           [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 
@@ -487,7 +487,7 @@ ADC1_Handler PROC
                 ENDP
                 ENDP
 
 
 FPU_Handler PROC
 FPU_Handler PROC
-                EXPORT  FPU_Handler            [WEAK]
+                EXPORT  FPU_Handler             [WEAK]
                 B       .
                 B       .
                 ENDP
                 ENDP
 
 

+ 55 - 19
bsp/swm320-lq100/Libraries/CMSIS/DeviceSupport/startup/iar/startup_SWM320.s

@@ -57,7 +57,7 @@ __vector_table
         DCD     GPIOA5_Handler
         DCD     GPIOA5_Handler
         DCD     GPIOA6_Handler
         DCD     GPIOA6_Handler
         DCD     GPIOA7_Handler
         DCD     GPIOA7_Handler
-		DCD     GPIOB0_Handler
+        DCD     GPIOB0_Handler
         DCD     GPIOB1_Handler
         DCD     GPIOB1_Handler
         DCD     GPIOB2_Handler
         DCD     GPIOB2_Handler
         DCD     GPIOB3_Handler
         DCD     GPIOB3_Handler
@@ -72,7 +72,7 @@ __vector_table
         DCD     GPIOC4_Handler
         DCD     GPIOC4_Handler
         DCD     GPIOC5_Handler
         DCD     GPIOC5_Handler
         DCD     GPIOC6_Handler
         DCD     GPIOC6_Handler
-        DCD     GPIOC7_Handler                                 
+        DCD     GPIOC7_Handler
         DCD     GPIOM0_Handler
         DCD     GPIOM0_Handler
         DCD     GPIOM1_Handler
         DCD     GPIOM1_Handler
         DCD     GPIOM2_Handler
         DCD     GPIOM2_Handler
@@ -80,25 +80,25 @@ __vector_table
         DCD     GPIOM4_Handler
         DCD     GPIOM4_Handler
         DCD     GPIOM5_Handler
         DCD     GPIOM5_Handler
         DCD     GPIOM6_Handler
         DCD     GPIOM6_Handler
-        DCD     GPIOM7_Handler                                            
-		DCD     DMA_Handler
+        DCD     GPIOM7_Handler
+        DCD     DMA_Handler
         DCD     LCD_Handler
         DCD     LCD_Handler
         DCD     NORFLC_Handler
         DCD     NORFLC_Handler
-		DCD		CAN_Handler
-        DCD     TIMR_Handler
+        DCD     CAN_Handler
+        DCD     PULSE_Handler
         DCD     WDT_Handler
         DCD     WDT_Handler
         DCD     PWM_Handler
         DCD     PWM_Handler
         DCD     UART0_Handler
         DCD     UART0_Handler
-		DCD     UART1_Handler
-		DCD     UART2_Handler
-		DCD     UART3_Handler
-		DCD     0
-		DCD     I2C0_Handler
+        DCD     UART1_Handler
+        DCD     UART2_Handler
+        DCD     UART3_Handler
+        DCD     0
+        DCD     I2C0_Handler
         DCD     I2C1_Handler
         DCD     I2C1_Handler
         DCD     SPI0_Handler
         DCD     SPI0_Handler
         DCD     ADC0_Handler
         DCD     ADC0_Handler
         DCD     RTC_Handler
         DCD     RTC_Handler
-        DCD     ANAC_Handler
+        DCD     BOD_Handler
         DCD     SDIO_Handler
         DCD     SDIO_Handler
         DCD     GPIOA_Handler
         DCD     GPIOA_Handler
         DCD     GPIOB_Handler
         DCD     GPIOB_Handler
@@ -108,7 +108,13 @@ __vector_table
         DCD     GPIOP_Handler
         DCD     GPIOP_Handler
         DCD     ADC1_Handler
         DCD     ADC1_Handler
         DCD     FPU_Handler
         DCD     FPU_Handler
-		DCD     SPI1_Handler
+        DCD     SPI1_Handler
+        DCD     TIMR0_Handler
+        DCD     TIMR1_Handler
+        DCD     TIMR2_Handler
+        DCD     TIMR3_Handler
+        DCD     TIMR4_Handler
+        DCD     TIMR5_Handler
         
         
 
 
         THUMB
         THUMB
@@ -345,10 +351,10 @@ NORFLC_Handler
 CAN_Handler
 CAN_Handler
         B CAN_Handler
         B CAN_Handler
 
 
-        PUBWEAK TIMR_Handler
+        PUBWEAK PULSE_Handler
         SECTION .text:CODE:REORDER:NOROOT(1)
         SECTION .text:CODE:REORDER:NOROOT(1)
-TIMR_Handler
-        B TIMR_Handler
+PULSE_Handler
+        B PULSE_Handler
 
 
         PUBWEAK WDT_Handler
         PUBWEAK WDT_Handler
         SECTION .text:CODE:REORDER:NOROOT(1)
         SECTION .text:CODE:REORDER:NOROOT(1)
@@ -405,10 +411,10 @@ ADC0_Handler
 RTC_Handler
 RTC_Handler
         B RTC_Handler
         B RTC_Handler
 
 
-        PUBWEAK ANAC_Handler
+        PUBWEAK BOD_Handler
         SECTION .text:CODE:REORDER:NOROOT(1)
         SECTION .text:CODE:REORDER:NOROOT(1)
-ANAC_Handler
-        B ANAC_Handler
+BOD_Handler
+        B BOD_Handler
 
 
         PUBWEAK SDIO_Handler
         PUBWEAK SDIO_Handler
         SECTION .text:CODE:REORDER:NOROOT(1)
         SECTION .text:CODE:REORDER:NOROOT(1)
@@ -459,6 +465,36 @@ FPU_Handler
         SECTION .text:CODE:REORDER:NOROOT(1)
         SECTION .text:CODE:REORDER:NOROOT(1)
 SPI1_Handler
 SPI1_Handler
         B SPI1_Handler
         B SPI1_Handler
+        
+        PUBWEAK TIMR0_Handler
+        SECTION .text:CODE:REORDER:NOROOT(1)
+TIMR0_Handler
+        B TIMR0_Handler
+        
+        PUBWEAK TIMR1_Handler
+        SECTION .text:CODE:REORDER:NOROOT(1)
+TIMR1_Handler
+        B TIMR1_Handler
+        
+        PUBWEAK TIMR2_Handler
+        SECTION .text:CODE:REORDER:NOROOT(1)
+TIMR2_Handler
+        B TIMR2_Handler
+        
+        PUBWEAK TIMR3_Handler
+        SECTION .text:CODE:REORDER:NOROOT(1)
+TIMR3_Handler
+        B TIMR3_Handler
+        
+        PUBWEAK TIMR4_Handler
+        SECTION .text:CODE:REORDER:NOROOT(1)
+TIMR4_Handler
+        B TIMR4_Handler
+        
+        PUBWEAK TIMR5_Handler
+        SECTION .text:CODE:REORDER:NOROOT(1)
+TIMR5_Handler
+        B TIMR5_Handler
 
 
 
 
         END
         END

+ 106 - 40
bsp/swm320-lq100/Libraries/CMSIS/DeviceSupport/system_SWM320.c

@@ -38,14 +38,15 @@
 #define SYS_CLK_DIV SYS_CLK_DIV_1
 #define SYS_CLK_DIV SYS_CLK_DIV_1
 
 
 #define __HSI (20000000UL) //高速内部时钟
 #define __HSI (20000000UL) //高速内部时钟
-#define __LSI (32000UL) //低速内部时钟
+#define __LSI (32000UL)    //低速内部时钟
 #define __HSE (20000000UL) //高速外部时钟
 #define __HSE (20000000UL) //高速外部时钟
 
 
 /********************************** PLL 设定 **********************************************
 /********************************** PLL 设定 **********************************************
  * VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
  * VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
  * PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
  * PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
+ * 注意:VCO输出频率需要在 [600MHz, 1200MHz] 之间
  *****************************************************************************************/
  *****************************************************************************************/
-#define SYS_PLL_SRC SYS_CLK_XTAL //可取值SYS_CLK_20MHz、SYS_CLK_XTAL
+#define SYS_PLL_SRC SYS_CLK_20MHz //可取值SYS_CLK_20MHz、SYS_CLK_XTAL
 
 
 #define PLL_IN_DIV 5
 #define PLL_IN_DIV 5
 
 
@@ -57,8 +58,8 @@
 
 
 #define PLL_OUT_DIV PLL_OUT_DIV8
 #define PLL_OUT_DIV PLL_OUT_DIV8
 
 
-uint32_t SystemCoreClock = (120000000UL);         //System Clock Frequency (Core Clock)
-uint32_t CyclesPerUs = ((120000000UL) / 1000000); //Cycles per micro second
+uint32_t SystemCoreClock = __HSI;         //System Clock Frequency (Core Clock)
+uint32_t CyclesPerUs = (__HSI / 1000000); //Cycles per micro second
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称:
 * 函数名称:
@@ -110,6 +111,8 @@ void SystemCoreClockUpdate(void)
 
 
     if (SYS->CLKDIV & SYS_CLKDIV_SYS_Msk)
     if (SYS->CLKDIV & SYS_CLKDIV_SYS_Msk)
         SystemCoreClock /= 2;
         SystemCoreClock /= 2;
+
+    CyclesPerUs = SystemCoreClock / 1000000;
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
@@ -121,56 +124,30 @@ void SystemCoreClockUpdate(void)
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SystemInit(void)
 void SystemInit(void)
 {
 {
-    uint32_t i;
-
     SYS->CLKEN |= (1 << SYS_CLKEN_ANAC_Pos);
     SYS->CLKEN |= (1 << SYS_CLKEN_ANAC_Pos);
 
 
+    Flash_Param_at_xMHz(120);
+
     switch (SYS_CLK)
     switch (SYS_CLK)
     {
     {
     case SYS_CLK_20MHz: //0 内部高频20MHz RC振荡器
     case SYS_CLK_20MHz: //0 内部高频20MHz RC振荡器
-        SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
-                     (0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
-
-        SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk;      //HFCK  <=  HRC
-        SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK  <= HFCK
+        switchCLK_20MHz();
         break;
         break;
 
 
     case SYS_CLK_40MHz: //1 内部高频40MHz RC振荡器
     case SYS_CLK_40MHz: //1 内部高频40MHz RC振荡器
-        SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
-                     (1 << SYS_HRCCR_DBL_Pos); //HRC = 40MHz
-
-        SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk;      //HFCK  <=  HRC
-        SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK  <= HFCK
+        switchCLK_40MHz();
         break;
         break;
 
 
     case SYS_CLK_32KHz: //2 内部低频32KHz RC振荡器
     case SYS_CLK_32KHz: //2 内部低频32KHz RC振荡器
-        SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
-
-        SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos);
-
-        for (i = 0; i < 20000; i++)
-            ;
-
-        SYS->CLKSEL &= ~SYS_CLKSEL_LFCK_Msk; //LFCK  <=  LRC
-        SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk;  //SYS_CLK  <= LFCK
+        switchCLK_32KHz();
         break;
         break;
 
 
     case SYS_CLK_XTAL: //3 外部晶体振荡器(2-30MHz)
     case SYS_CLK_XTAL: //3 外部晶体振荡器(2-30MHz)
-        SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
-
-        for (i = 0; i < 20000; i++)
-            ;
-
-        SYS->CLKSEL |= (1 << SYS_CLKSEL_HFCK_Pos); //HFCK  <=  XTAL
-        SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos);  //SYS_CLK  <= HFCK
+        switchCLK_XTAL();
         break;
         break;
 
 
     case SYS_CLK_PLL: //4 片内锁相环输出
     case SYS_CLK_PLL: //4 片内锁相环输出
-        PLLInit();
-        SYS->PLLCR |= (1 << SYS_PLLCR_OUTEN_Pos);
-
-        SYS->CLKSEL |= (1 << SYS_CLKSEL_LFCK_Pos); //LFCK  <=  PLL
-        SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk;        //SYS_CLK  <= LFCK
+        switchCLK_PLL();
         break;
         break;
     }
     }
 
 
@@ -178,25 +155,114 @@ void SystemInit(void)
     SYS->CLKDIV |= (SYS_CLK_DIV << SYS_CLKDIV_SYS_Pos);
     SYS->CLKDIV |= (SYS_CLK_DIV << SYS_CLKDIV_SYS_Pos);
 
 
     SystemCoreClockUpdate();
     SystemCoreClockUpdate();
+
+    if (SystemCoreClock > 80000000)
+    {
+        Flash_Param_at_xMHz(120);
+    }
+    else if (SystemCoreClock > 40000000)
+    {
+        Flash_Param_at_xMHz(80);
+    }
+    else if (SystemCoreClock > 30000000)
+    {
+        Flash_Param_at_xMHz(40);
+    }
+    else
+    {
+        Flash_Param_at_xMHz(30);
+    }
 }
 }
 
 
-void PLLInit(void)
+static void delay_3ms(void)
 {
 {
     uint32_t i;
     uint32_t i;
 
 
+    if (((SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) == 0) &&
+        ((SYS->CLKSEL & SYS_CLKSEL_LFCK_Msk) == 0)) //32KHz
+    {
+        for (i = 0; i < 20; i++)
+            __NOP();
+    }
+    else
+    {
+        for (i = 0; i < 20000; i++)
+            __NOP();
+    }
+}
+
+void switchCLK_20MHz(void)
+{
+    SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
+                 (0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
+
+    delay_3ms();
+
+    SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk;      //HFCK  <=  HRC
+    SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK  <= HFCK
+}
+
+void switchCLK_40MHz(void)
+{
+    SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
+                 (1 << SYS_HRCCR_DBL_Pos); //HRC = 40MHz
+
+    delay_3ms();
+
+    SYS->CLKSEL &= ~SYS_CLKSEL_HFCK_Msk;      //HFCK  <=  HRC
+    SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos); //SYS_CLK  <= HFCK
+}
+
+void switchCLK_32KHz(void)
+{
+    SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
+
+    SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos);
+
+    delay_3ms();
+
+    SYS->CLKSEL &= ~SYS_CLKSEL_LFCK_Msk; //LFCK  <=  LRC
+    SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk;  //SYS_CLK  <= LFCK
+}
+
+void switchCLK_XTAL(void)
+{
+    SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
+
+    delay_3ms();
+    delay_3ms();
+
+    SYS->CLKSEL |= (1 << SYS_CLKSEL_HFCK_Pos); //HFCK  <=  XTAL
+    SYS->CLKSEL |= (1 << SYS_CLKSEL_SYS_Pos);  //SYS_CLK  <= HFCK
+}
+
+void switchCLK_PLL(void)
+{
+    PLLInit();
+
+    SYS->PLLCR |= (1 << SYS_PLLCR_OUTEN_Pos);
+
+    SYS->CLKSEL |= (1 << SYS_CLKSEL_LFCK_Pos); //LFCK  <=  PLL
+    SYS->CLKSEL &= ~SYS_CLKSEL_SYS_Msk;        //SYS_CLK  <= LFCK
+}
+
+void PLLInit(void)
+{
     if (SYS_PLL_SRC == SYS_CLK_20MHz)
     if (SYS_PLL_SRC == SYS_CLK_20MHz)
     {
     {
         SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
         SYS->HRCCR = (0 << SYS_HRCCR_OFF_Pos) |
                      (0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
                      (0 << SYS_HRCCR_DBL_Pos); //HRC = 20MHz
 
 
+        delay_3ms();
+
         SYS->PLLCR |= (1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= HRC
         SYS->PLLCR |= (1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= HRC
     }
     }
     else if (SYS_PLL_SRC == SYS_CLK_XTAL)
     else if (SYS_PLL_SRC == SYS_CLK_XTAL)
     {
     {
         SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
         SYS->XTALCR = (1 << SYS_XTALCR_EN_Pos);
 
 
-        for (i = 0; i < 20000; i++)
-            ;
+        delay_3ms();
+        delay_3ms();
 
 
         SYS->PLLCR &= ~(1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= XTAL
         SYS->PLLCR &= ~(1 << SYS_PLLCR_INSEL_Pos); //PLL_SRC <= XTAL
     }
     }

+ 12 - 8
bsp/swm320-lq100/Libraries/CMSIS/DeviceSupport/system_SWM320.h

@@ -2,20 +2,24 @@
 #define __SYSTEM_SWM320_H__
 #define __SYSTEM_SWM320_H__
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
-extern "C" {
+extern "C"
+{
 #endif
 #endif
 
 
+    extern uint32_t SystemCoreClock; // System Clock Frequency (Core Clock)
+    extern uint32_t CyclesPerUs;     // Cycles per micro second
 
 
-extern uint32_t SystemCoreClock;        // System Clock Frequency (Core Clock)
-extern uint32_t CyclesPerUs;            // Cycles per micro second
+    extern void SystemInit(void);
 
 
+    extern void SystemCoreClockUpdate(void);
 
 
-extern void SystemInit(void);
-
-extern void SystemCoreClockUpdate(void);
-
-extern void PLLInit(void);
+    extern void switchCLK_20MHz(void);
+    extern void switchCLK_40MHz(void);
+    extern void switchCLK_32KHz(void);
+    extern void switchCLK_XTAL(void);
+    extern void switchCLK_PLL(void);
 
 
+    extern void PLLInit(void);
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }

+ 34 - 31
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_adc.c

@@ -22,7 +22,7 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_Init()
 * 函数名称: ADC_Init()
 * 功能说明: ADC模数转换器初始化
 * 功能说明: ADC模数转换器初始化
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,有效值包括ADC0、ADC1
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,有效值包括ADC0、ADC1
 *           ADC_InitStructure * initStruct      包含ADC各相关定值的结构体
 *           ADC_InitStructure * initStruct      包含ADC各相关定值的结构体
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -63,9 +63,12 @@ void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct)
         SYS->PLLDIV |= (initStruct->clk_div << SYS_PLLDIV_ADDIV_Pos);
         SYS->PLLDIV |= (initStruct->clk_div << SYS_PLLDIV_ADDIV_Pos);
     }
     }
 
 
+    ADCx->CALIBSET = (ADCx == ADC0) ? SYS->BKP[0] : SYS->BKP[1];
+    ADCx->CALIBEN = (1 << ADC_CALIBEN_OFFSET_Pos) | (1 << ADC_CALIBEN_K_Pos);
+
     ADCx->CTRL2 &= ~(ADC_CTRL2_ADCEVCM_Msk | ADC_CTRL2_PGAIVCM_Msk | ADC_CTRL2_PGAGAIN_Msk | ADC_CTRL2_PGAVCM_Msk);
     ADCx->CTRL2 &= ~(ADC_CTRL2_ADCEVCM_Msk | ADC_CTRL2_PGAIVCM_Msk | ADC_CTRL2_PGAGAIN_Msk | ADC_CTRL2_PGAVCM_Msk);
     ADCx->CTRL2 |= (0 << ADC_CTRL2_ADCEVCM_Pos) |
     ADCx->CTRL2 |= (0 << ADC_CTRL2_ADCEVCM_Pos) |
-                   (PGA_VCM_INTERNAL << ADC_CTRL2_PGAIVCM_Pos) |
+                   (initStruct->pga_ref << ADC_CTRL2_PGAIVCM_Pos) |
                    (6 << ADC_CTRL2_PGAGAIN_Pos) |
                    (6 << ADC_CTRL2_PGAGAIN_Pos) |
                    ((uint32_t)6 << ADC_CTRL2_PGAVCM_Pos);
                    ((uint32_t)6 << ADC_CTRL2_PGAVCM_Pos);
 
 
@@ -152,7 +155,7 @@ void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_Open()
 * 函数名称: ADC_Open()
 * 功能说明: ADC开启,可以软件启动、或硬件触发ADC转换
 * 功能说明: ADC开启,可以软件启动、或硬件触发ADC转换
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -164,7 +167,7 @@ void ADC_Open(ADC_TypeDef *ADCx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_Close()
 * 函数名称: ADC_Close()
 * 功能说明: ADC关闭,无法软件启动、或硬件触发ADC转换
 * 功能说明: ADC关闭,无法软件启动、或硬件触发ADC转换
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -176,7 +179,7 @@ void ADC_Close(ADC_TypeDef *ADCx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_Start()
 * 函数名称: ADC_Start()
 * 功能说明: 软件触发模式下启动ADC转换
 * 功能说明: 软件触发模式下启动ADC转换
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -188,7 +191,7 @@ void ADC_Start(ADC_TypeDef *ADCx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_Stop()
 * 函数名称: ADC_Stop()
 * 功能说明: 软件触发模式下停止ADC转换
 * 功能说明: 软件触发模式下停止ADC转换
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -235,9 +238,9 @@ static uint32_t chn2idx(uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_Read()
 * 函数名称: ADC_Read()
 * 功能说明: 从指定通道读取转换结果
 * 功能说明: 从指定通道读取转换结果
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要读取转换结果的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要读取转换结果的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
-* 输    出: uint32_t                读取到的转换结果
+* 输    出: uint32_t              读取到的转换结果
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t ADC_Read(ADC_TypeDef *ADCx, uint32_t chn)
 uint32_t ADC_Read(ADC_TypeDef *ADCx, uint32_t chn)
@@ -255,9 +258,9 @@ uint32_t ADC_Read(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IsEOC()
 * 函数名称: ADC_IsEOC()
 * 功能说明: 指定通道是否End Of Conversion
 * 功能说明: 指定通道是否End Of Conversion
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要查询状态的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要查询状态的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
-* 输    出: uint32_t                1 该通道完成了转换    0 该通道未完成转换
+* 输    出: uint32_t              1 该通道完成了转换    0 该通道未完成转换
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t ADC_IsEOC(ADC_TypeDef *ADCx, uint32_t chn)
 uint32_t ADC_IsEOC(ADC_TypeDef *ADCx, uint32_t chn)
@@ -270,7 +273,7 @@ uint32_t ADC_IsEOC(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_ChnSelect()
 * 函数名称: ADC_ChnSelect()
 * 功能说明: ADC通道选通,模数转换会在选通的通道上依次采样转换
 * 功能说明: ADC通道选通,模数转换会在选通的通道上依次采样转换
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chns           要选通的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
 *           uint32_t chns           要选通的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -284,7 +287,7 @@ void ADC_ChnSelect(ADC_TypeDef *ADCx, uint32_t chns)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntEOCEn()
 * 函数名称: ADC_IntEOCEn()
 * 功能说明: 转换完成中断使能
 * 功能说明: 转换完成中断使能
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -299,7 +302,7 @@ void ADC_IntEOCEn(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntEOCDis()
 * 函数名称: ADC_IntEOCDis()
 * 功能说明: 转换完成中断禁止
 * 功能说明: 转换完成中断禁止
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -314,7 +317,7 @@ void ADC_IntEOCDis(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntEOCClr()
 * 函数名称: ADC_IntEOCClr()
 * 功能说明: 转换完成中断标志清除
 * 功能说明: 转换完成中断标志清除
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -329,9 +332,9 @@ void ADC_IntEOCClr(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntEOCStat()
 * 函数名称: ADC_IntEOCStat()
 * 功能说明: 转换完成中断状态
 * 功能说明: 转换完成中断状态
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
-* 输    出: uint32_t                1 该通道完成了转换    0 该通道未完成转换
+* 输    出: uint32_t              1 该通道完成了转换    0 该通道未完成转换
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn)
 uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn)
@@ -344,7 +347,7 @@ uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntOVFEn()
 * 函数名称: ADC_IntOVFEn()
 * 功能说明: 数据溢出中断使能
 * 功能说明: 数据溢出中断使能
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -359,7 +362,7 @@ void ADC_IntOVFEn(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntOVFDis()
 * 函数名称: ADC_IntOVFDis()
 * 功能说明: 数据溢出中断禁止
 * 功能说明: 数据溢出中断禁止
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -374,7 +377,7 @@ void ADC_IntOVFDis(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntOVFClr()
 * 函数名称: ADC_IntOVFClr()
 * 功能说明: 数据溢出中断标志清除
 * 功能说明: 数据溢出中断标志清除
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -389,9 +392,9 @@ void ADC_IntOVFClr(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntOVFStat()
 * 函数名称: ADC_IntOVFStat()
 * 功能说明: 数据溢出中断状态
 * 功能说明: 数据溢出中断状态
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
-* 输    出: uint32_t                1 该通道完成了转换    0 该通道未完成转换
+* 输    出: uint32_t              1 该通道完成了转换    0 该通道未完成转换
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn)
 uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn)
@@ -404,7 +407,7 @@ uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntHFULLEn()
 * 函数名称: ADC_IntHFULLEn()
 * 功能说明: FIFO半满中断使能
 * 功能说明: FIFO半满中断使能
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -419,7 +422,7 @@ void ADC_IntHFULLEn(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntHFULLDis()
 * 函数名称: ADC_IntHFULLDis()
 * 功能说明: FIFO半满中断禁止
 * 功能说明: FIFO半满中断禁止
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -434,7 +437,7 @@ void ADC_IntHFULLDis(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntHFULLClr()
 * 函数名称: ADC_IntHFULLClr()
 * 功能说明: FIFO半满中断标志清除
 * 功能说明: FIFO半满中断标志清除
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -449,9 +452,9 @@ void ADC_IntHFULLClr(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntHFULLStat()
 * 函数名称: ADC_IntHFULLStat()
 * 功能说明: FIFO半满中断状态
 * 功能说明: FIFO半满中断状态
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
-* 输    出: uint32_t                1 该通道完成了转换    0 该通道未完成转换
+* 输    出: uint32_t              1 该通道完成了转换    0 该通道未完成转换
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t ADC_IntHFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
 uint32_t ADC_IntHFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
@@ -464,7 +467,7 @@ uint32_t ADC_IntHFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntFULLEn()
 * 函数名称: ADC_IntFULLEn()
 * 功能说明: FIFO满中断使能
 * 功能说明: FIFO满中断使能
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -479,7 +482,7 @@ void ADC_IntFULLEn(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntFULLDis()
 * 函数名称: ADC_IntFULLDis()
 * 功能说明: FIFO满中断禁止
 * 功能说明: FIFO满中断禁止
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -494,7 +497,7 @@ void ADC_IntFULLDis(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntFULLClr()
 * 函数名称: ADC_IntFULLClr()
 * 功能说明: FIFO满中断标志清除
 * 功能说明: FIFO满中断标志清除
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -509,9 +512,9 @@ void ADC_IntFULLClr(ADC_TypeDef *ADCx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: ADC_IntFULLStat()
 * 函数名称: ADC_IntFULLStat()
 * 功能说明: FIFO满中断状态
 * 功能说明: FIFO满中断状态
-* 输    入: ADC_TypeDef * ADCx      指定要被设置的ADC,可取值包括ADC
+* 输    入: ADC_TypeDef * ADCx        指定要被设置的ADC,可取值包括ADC
 *           uint32_t chn            要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
 *           uint32_t chn            要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
-* 输    出: uint32_t                1 该通道完成了转换    0 该通道未完成转换
+* 输    出: uint32_t              1 该通道完成了转换    0 该通道未完成转换
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
 uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn)

+ 10 - 16
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_adc.h

@@ -3,13 +3,14 @@
 
 
 typedef struct
 typedef struct
 {
 {
-    uint8_t clk_src;  //ADC转换时钟源:ADC_CLKSRC_HRC、ADC_CLKSRC_VCO_DIV16、ADC_CLKSRC_VCO_DIV32、ADC_CLKSRC_VCO_DIV32
-    uint8_t clk_div;  //ADC转换时钟分频,取值1--31
-    uint8_t channels; //ADC转换通道选中,ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
-    uint8_t samplAvg; //采样取平均,触发启动ADC转换后,ADC在一个通道上连续采样、转换多次,并将它们的平均值作为该通道转换结果
-    uint8_t trig_src; //ADC触发方式:ADC_TRIGSRC_SW、ADC_TRIGSRC_PWM、ADC_TRIGSRC_TIMR2、ADC_TRIGSRC_TIMR3
-    uint8_t Continue; //在软件触发模式下:1 连续转换模式,启动后一直采样、转换,直到软件清除START位
-    //                  0 单次转换模式,转换完成后START位自动清除停止转换
+    uint8_t clk_src;   //ADC转换时钟源:ADC_CLKSRC_HRC、ADC_CLKSRC_VCO_DIV16、ADC_CLKSRC_VCO_DIV32、ADC_CLKSRC_VCO_DIV32
+    uint8_t clk_div;   //ADC转换时钟分频,取值1--31
+    uint8_t pga_ref;   //PGA基准:PGA_REF_INTERNAL、PGA_REF_EXTERNAL
+    uint8_t channels;  //ADC转换通道选中,ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
+    uint8_t samplAvg;  //采样取平均,触发启动ADC转换后,ADC在一个通道上连续采样、转换多次,并将它们的平均值作为该通道转换结果
+    uint8_t trig_src;  //ADC触发方式:ADC_TRIGSRC_SW、ADC_TRIGSRC_PWM、ADC_TRIGSRC_TIMR2、ADC_TRIGSRC_TIMR3
+    uint8_t Continue;  //在软件触发模式下:1 连续转换模式,启动后一直采样、转换,直到软件清除START位
+                       //                  0 单次转换模式,转换完成后START位自动清除停止转换
     uint8_t EOC_IEn;   //EOC中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
     uint8_t EOC_IEn;   //EOC中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
     uint8_t OVF_IEn;   //OVF中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
     uint8_t OVF_IEn;   //OVF中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
     uint8_t HFULL_IEn; //FIFO半满中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
     uint8_t HFULL_IEn; //FIFO半满中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
@@ -39,8 +40,8 @@ typedef struct
 #define ADC_TRIGSRC_SW 0 //软件触发,即ADC->START.GO写1启动转换
 #define ADC_TRIGSRC_SW 0 //软件触发,即ADC->START.GO写1启动转换
 #define ADC_TRIGSRC_PWM 1
 #define ADC_TRIGSRC_PWM 1
 
 
-#define PGA_VCM_INTERNAL 1 //PGA输入共模电平由内部电路产生,ADC_REFP和ADC_REFN可悬空
-#define PGA_VCM_EXTERNAL 0 //PGA输入共模电平由外部引脚提供,(ADC_REFP + ADC_REFN) 电平值须与量程相同
+#define PGA_REF_INTERNAL 1 //PGA输入共模电平由内部电路产生,ADC_REFP和ADC_REFN可悬空
+#define PGA_REF_EXTERNAL 0 //PGA输入共模电平由外部引脚提供,(ADC_REFP + ADC_REFN) 电平值须与量程相同
 
 
 void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct); //ADC模数转换器初始化
 void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct); //ADC模数转换器初始化
 void ADC_Open(ADC_TypeDef *ADCx);                                //ADC开启,可以软件启动、或硬件触发ADC转换
 void ADC_Open(ADC_TypeDef *ADCx);                                //ADC开启,可以软件启动、或硬件触发ADC转换
@@ -73,11 +74,4 @@ void ADC_IntFULLDis(ADC_TypeDef *ADCx, uint32_t chn);      //FIFO满中断禁止
 void ADC_IntFULLClr(ADC_TypeDef *ADCx, uint32_t chn);      //FIFO满中断标志清除
 void ADC_IntFULLClr(ADC_TypeDef *ADCx, uint32_t chn);      //FIFO满中断标志清除
 uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断状态
 uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断状态
 
 
-/* ADC 内部 1.2V REFP电压输出到外部REFP引脚,用于测量,或在需要1.2V外部REFP时节省成本 */
-#define ADC_TEST_INNER_REFP_OUT_EN(ADCx) (ADCx->CTRL3 |= (1 << ADC_CTRL3_REFP_OUT_Pos))
-#define ADC_TEST_INNER_REFP_OUT_DIS(ADCx) (ADCx->CTRL3 &= ~(1 << ADC_CTRL3_REFP_OUT_Pos))
-
-#define ADC_TEST_ADC_PGA_EXT_VCM_EN(ADCx) (ADCx->CTRL3 |= (1 << ADC_CTRL3_EXTVCM_Pos))
-#define ADC_TEST_ADC_PGA_EXT_VCM_DIS(ADCx) (ADCx->CTRL3 &= ~(1 << ADC_CTRL3_EXTVCM_Pos))
-
 #endif //__SWM320_ADC_H__
 #endif //__SWM320_ADC_H__

+ 94 - 178
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_can.c

@@ -24,7 +24,7 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_Init()
 * 函数名称: CAN_Init()
 * 功能说明: CAN接口初始化
 * 功能说明: CAN接口初始化
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 *           CAN_InitStructure * initStruct    包含CAN接口相关设定值的结构体
 *           CAN_InitStructure * initStruct    包含CAN接口相关设定值的结构体
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -87,7 +87,7 @@ void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_Open()
 * 函数名称: CAN_Open()
 * 功能说明: CAN接口打开
 * 功能说明: CAN接口打开
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -99,7 +99,7 @@ void CAN_Open(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_Close()
 * 函数名称: CAN_Close()
 * 功能说明: CAN接口关闭
 * 功能说明: CAN接口关闭
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -111,7 +111,7 @@ void CAN_Close(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_Transmit()
 * 函数名称: CAN_Transmit()
 * 功能说明: CAN发送数据
 * 功能说明: CAN发送数据
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 *           uint32_t format     CAN_FRAME_STD 标准帧    CAN_FRAME_EXT 扩展帧
 *           uint32_t format     CAN_FRAME_STD 标准帧    CAN_FRAME_EXT 扩展帧
 *           uint32_t id         消息ID
 *           uint32_t id         消息ID
 *           uint8_t data[]      要发送的数据
 *           uint8_t data[]      要发送的数据
@@ -126,32 +126,32 @@ void CAN_Transmit(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint8_t data[
 
 
     if (format == CAN_FRAME_STD)
     if (format == CAN_FRAME_STD)
     {
     {
-        CANx->TXFRAME.INFO = (0 << CAN_INFO_FF_Pos) |
-                             (0 << CAN_INFO_RTR_Pos) |
-                             (size << CAN_INFO_DLC_Pos);
+        CANx->FRAME.INFO = (0 << CAN_INFO_FF_Pos) |
+                           (0 << CAN_INFO_RTR_Pos) |
+                           (size << CAN_INFO_DLC_Pos);
 
 
-        CANx->TXFRAME.DATA[0] = id >> 3;
-        CANx->TXFRAME.DATA[1] = id << 5;
+        CANx->FRAME.DATA[0] = id >> 3;
+        CANx->FRAME.DATA[1] = id << 5;
 
 
         for (i = 0; i < size; i++)
         for (i = 0; i < size; i++)
         {
         {
-            CANx->TXFRAME.DATA[i + 2] = data[i];
+            CANx->FRAME.DATA[i + 2] = data[i];
         }
         }
     }
     }
     else //if(format == CAN_FRAME_EXT)
     else //if(format == CAN_FRAME_EXT)
     {
     {
-        CANx->TXFRAME.INFO = (1 << CAN_INFO_FF_Pos) |
-                             (0 << CAN_INFO_RTR_Pos) |
-                             (size << CAN_INFO_DLC_Pos);
+        CANx->FRAME.INFO = (1 << CAN_INFO_FF_Pos) |
+                           (0 << CAN_INFO_RTR_Pos) |
+                           (size << CAN_INFO_DLC_Pos);
 
 
-        CANx->TXFRAME.DATA[0] = id >> 21;
-        CANx->TXFRAME.DATA[1] = id >> 13;
-        CANx->TXFRAME.DATA[2] = id >> 5;
-        CANx->TXFRAME.DATA[3] = id << 3;
+        CANx->FRAME.DATA[0] = id >> 21;
+        CANx->FRAME.DATA[1] = id >> 13;
+        CANx->FRAME.DATA[2] = id >> 5;
+        CANx->FRAME.DATA[3] = id << 3;
 
 
         for (i = 0; i < size; i++)
         for (i = 0; i < size; i++)
         {
         {
-            CANx->TXFRAME.DATA[i + 4] = data[i];
+            CANx->FRAME.DATA[i + 4] = data[i];
         }
         }
     }
     }
 
 
@@ -175,7 +175,7 @@ void CAN_Transmit(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint8_t data[
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_TransmitRequest()
 * 函数名称: CAN_TransmitRequest()
 * 功能说明: CAN发送远程请求,请求远程节点发送数据
 * 功能说明: CAN发送远程请求,请求远程节点发送数据
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 *           uint32_t format     CAN_FRAME_STD 标准帧    CAN_FRAME_EXT 扩展帧
 *           uint32_t format     CAN_FRAME_STD 标准帧    CAN_FRAME_EXT 扩展帧
 *           uint32_t id         消息ID
 *           uint32_t id         消息ID
 *           uint32_t once       只发送一次,即使发送失败(仲裁丢失、发送出错、NAK)也不尝试重发
 *           uint32_t once       只发送一次,即使发送失败(仲裁丢失、发送出错、NAK)也不尝试重发
@@ -186,23 +186,23 @@ void CAN_TransmitRequest(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint32
 {
 {
     if (format == CAN_FRAME_STD)
     if (format == CAN_FRAME_STD)
     {
     {
-        CANx->TXFRAME.INFO = (0 << CAN_INFO_FF_Pos) |
-                             (1 << CAN_INFO_RTR_Pos) |
-                             (0 << CAN_INFO_DLC_Pos);
+        CANx->FRAME.INFO = (0 << CAN_INFO_FF_Pos) |
+                           (1 << CAN_INFO_RTR_Pos) |
+                           (0 << CAN_INFO_DLC_Pos);
 
 
-        CANx->TXFRAME.DATA[0] = id >> 3;
-        CANx->TXFRAME.DATA[1] = id << 5;
+        CANx->FRAME.DATA[0] = id >> 3;
+        CANx->FRAME.DATA[1] = id << 5;
     }
     }
     else //if(format == CAN_FRAME_EXT)
     else //if(format == CAN_FRAME_EXT)
     {
     {
-        CANx->TXFRAME.INFO = (1 << CAN_INFO_FF_Pos) |
-                             (1 << CAN_INFO_RTR_Pos) |
-                             (0 << CAN_INFO_DLC_Pos);
-
-        CANx->TXFRAME.DATA[0] = id >> 21;
-        CANx->TXFRAME.DATA[1] = id >> 13;
-        CANx->TXFRAME.DATA[2] = id >> 5;
-        CANx->TXFRAME.DATA[3] = id << 3;
+        CANx->FRAME.INFO = (1 << CAN_INFO_FF_Pos) |
+                           (1 << CAN_INFO_RTR_Pos) |
+                           (0 << CAN_INFO_DLC_Pos);
+
+        CANx->FRAME.DATA[0] = id >> 21;
+        CANx->FRAME.DATA[1] = id >> 13;
+        CANx->FRAME.DATA[2] = id >> 5;
+        CANx->FRAME.DATA[3] = id << 3;
     }
     }
 
 
     if (once == 0)
     if (once == 0)
@@ -218,7 +218,7 @@ void CAN_TransmitRequest(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint32
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_Receive()
 * 函数名称: CAN_Receive()
 * 功能说明: CAN接收数据
 * 功能说明: CAN接收数据
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 *           CAN_RXMessage *msg  接收到的消息存储在此结构体变量中
 *           CAN_RXMessage *msg  接收到的消息存储在此结构体变量中
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -226,27 +226,27 @@ void CAN_TransmitRequest(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint32
 void CAN_Receive(CAN_TypeDef *CANx, CAN_RXMessage *msg)
 void CAN_Receive(CAN_TypeDef *CANx, CAN_RXMessage *msg)
 {
 {
     uint32_t i;
     uint32_t i;
-    uint32_t format = (CANx->RXFRAME.INFO & CAN_INFO_FF_Msk) >> CAN_INFO_FF_Pos;
+    msg->format = (CANx->FRAME.INFO & CAN_INFO_FF_Msk) >> CAN_INFO_FF_Pos;
 
 
-    msg->remote = (CANx->RXFRAME.INFO & CAN_INFO_RTR_Msk) >> CAN_INFO_RTR_Pos;
-    msg->size = (CANx->RXFRAME.INFO & CAN_INFO_DLC_Msk) >> CAN_INFO_DLC_Pos;
+    msg->remote = (CANx->FRAME.INFO & CAN_INFO_RTR_Msk) >> CAN_INFO_RTR_Pos;
+    msg->size = (CANx->FRAME.INFO & CAN_INFO_DLC_Msk) >> CAN_INFO_DLC_Pos;
 
 
-    if (format == CAN_FRAME_STD)
+    if (msg->format == CAN_FRAME_STD)
     {
     {
-        msg->id = (CANx->RXFRAME.DATA[0] << 3) | (CANx->RXFRAME.DATA[1] >> 5);
+        msg->id = (CANx->FRAME.DATA[0] << 3) | (CANx->FRAME.DATA[1] >> 5);
 
 
         for (i = 0; i < msg->size; i++)
         for (i = 0; i < msg->size; i++)
         {
         {
-            msg->data[i] = CANx->RXFRAME.DATA[i + 2];
+            msg->data[i] = CANx->FRAME.DATA[i + 2];
         }
         }
     }
     }
-    else //if(format == CAN_FRAME_EXT)
+    else //if(msg->format == CAN_FRAME_EXT)
     {
     {
-        msg->id = (CANx->RXFRAME.DATA[0] << 21) | (CANx->RXFRAME.DATA[1] << 13) | (CANx->RXFRAME.DATA[2] << 5) | (CANx->RXFRAME.DATA[3] >> 3);
+        msg->id = (CANx->FRAME.DATA[0] << 21) | (CANx->FRAME.DATA[1] << 13) | (CANx->FRAME.DATA[2] << 5) | (CANx->FRAME.DATA[3] >> 3);
 
 
         for (i = 0; i < msg->size; i++)
         for (i = 0; i < msg->size; i++)
         {
         {
-            msg->data[i] = CANx->RXFRAME.DATA[i + 4];
+            msg->data[i] = CANx->FRAME.DATA[i + 4];
         }
         }
     }
     }
 
 
@@ -256,8 +256,8 @@ void CAN_Receive(CAN_TypeDef *CANx, CAN_RXMessage *msg)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_TXComplete()
 * 函数名称: CAN_TXComplete()
 * 功能说明: 发送是否完成
 * 功能说明: 发送是否完成
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
-* 输    出: uint32_t            1 已经完成    0 还未完成
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
+* 输    出: uint32_t          1 已经完成    0 还未完成
 * 注意事项: 发送被Abort也会触发发送完成,但不会触发发送成功
 * 注意事项: 发送被Abort也会触发发送完成,但不会触发发送成功
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t CAN_TXComplete(CAN_TypeDef *CANx)
 uint32_t CAN_TXComplete(CAN_TypeDef *CANx)
@@ -268,8 +268,8 @@ uint32_t CAN_TXComplete(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_TXSuccess()
 * 函数名称: CAN_TXSuccess()
 * 功能说明: 发送是否成功
 * 功能说明: 发送是否成功
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
-* 输    出: uint32_t            1 发送成功    0 发送失败
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
+* 输    出: uint32_t          1 发送成功    0 发送失败
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t CAN_TXSuccess(CAN_TypeDef *CANx)
 uint32_t CAN_TXSuccess(CAN_TypeDef *CANx)
@@ -280,7 +280,7 @@ uint32_t CAN_TXSuccess(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_AbortTransmit()
 * 函数名称: CAN_AbortTransmit()
 * 功能说明: 终止发送
 * 功能说明: 终止发送
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 正在进行的发送无法终止,但执行此命令后若发送失败不会再重发
 * 注意事项: 正在进行的发送无法终止,但执行此命令后若发送失败不会再重发
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -292,8 +292,8 @@ void CAN_AbortTransmit(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_TXBufferReady()
 * 函数名称: CAN_TXBufferReady()
 * 功能说明: TX Buffer是否准备好可以写入消息
 * 功能说明: TX Buffer是否准备好可以写入消息
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
-* 输    出: uint32_t            1 已准备好    0 未准备好
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
+* 输    出: uint32_t          1 已准备好    0 未准备好
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t CAN_TXBufferReady(CAN_TypeDef *CANx)
 uint32_t CAN_TXBufferReady(CAN_TypeDef *CANx)
@@ -304,8 +304,8 @@ uint32_t CAN_TXBufferReady(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_RXDataAvailable()
 * 函数名称: CAN_RXDataAvailable()
 * 功能说明: RX FIFO中是否有数据可读出
 * 功能说明: RX FIFO中是否有数据可读出
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
-* 输    出: uint32_t            1 有数据可读出    0 没有数据
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
+* 输    出: uint32_t          1 有数据可读出    0 没有数据
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t CAN_RXDataAvailable(CAN_TypeDef *CANx)
 uint32_t CAN_RXDataAvailable(CAN_TypeDef *CANx)
@@ -316,7 +316,7 @@ uint32_t CAN_RXDataAvailable(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_SetBaudrate()
 * 函数名称: CAN_SetBaudrate()
 * 功能说明: 设置波特率
 * 功能说明: 设置波特率
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 *           uint32_t baudrate   波特率,即位传输速率
 *           uint32_t baudrate   波特率,即位传输速率
 *           uint32_t CAN_BS1    CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
 *           uint32_t CAN_BS1    CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
 *           uint32_t CAN_BS2    CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
 *           uint32_t CAN_BS2    CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
@@ -337,7 +337,7 @@ void CAN_SetBaudrate(CAN_TypeDef *CANx, uint32_t baudrate, uint32_t CAN_BS1, uin
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_SetFilter32b()
 * 函数名称: CAN_SetFilter32b()
 * 功能说明: 设置接收滤波器,1个32位滤波器
 * 功能说明: 设置接收滤波器,1个32位滤波器
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 *           uint32_t check      与mask一起决定了接收到的Message是否是自己需要的:check & (~mask) == ID & (~mask)的Message通过过滤
 *           uint32_t check      与mask一起决定了接收到的Message是否是自己需要的:check & (~mask) == ID & (~mask)的Message通过过滤
 *           uint32_t mask
 *           uint32_t mask
 * 输    出: 无
 * 输    出: 无
@@ -348,21 +348,21 @@ void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask)
     CANx->CR &= ~CAN_CR_AFM_Msk;
     CANx->CR &= ~CAN_CR_AFM_Msk;
     CANx->CR |= (CAN_FILTER_32b << CAN_CR_AFM_Pos);
     CANx->CR |= (CAN_FILTER_32b << CAN_CR_AFM_Pos);
 
 
-    CANx->FILTER.AMR[0] = mask & 0xFF;
-    CANx->FILTER.AMR[1] = (mask >> 8) & 0xFF;
-    CANx->FILTER.AMR[2] = (mask >> 16) & 0xFF;
-    CANx->FILTER.AMR[3] = (mask >> 24) & 0xFF;
+    CANx->FILTER.AMR[3] = mask & 0xFF;
+    CANx->FILTER.AMR[2] = (mask >> 8) & 0xFF;
+    CANx->FILTER.AMR[1] = (mask >> 16) & 0xFF;
+    CANx->FILTER.AMR[0] = (mask >> 24) & 0xFF;
 
 
-    CANx->FILTER.ACR[0] = check & 0xFF;
-    CANx->FILTER.ACR[1] = (check >> 8) & 0xFF;
-    CANx->FILTER.ACR[2] = (check >> 16) & 0xFF;
-    CANx->FILTER.ACR[3] = (check >> 24) & 0xFF;
+    CANx->FILTER.ACR[3] = check & 0xFF;
+    CANx->FILTER.ACR[2] = (check >> 8) & 0xFF;
+    CANx->FILTER.ACR[1] = (check >> 16) & 0xFF;
+    CANx->FILTER.ACR[0] = (check >> 24) & 0xFF;
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_SetFilter16b()
 * 函数名称: CAN_SetFilter16b()
 * 功能说明: 设置接收滤波器,2个16位滤波器
 * 功能说明: 设置接收滤波器,2个16位滤波器
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 *           uint16_t check1     与mask一起决定了接收到的Message是否是自己需要的:check & (~mask) == ID & (~mask)的Message通过过滤
 *           uint16_t check1     与mask一起决定了接收到的Message是否是自己需要的:check & (~mask) == ID & (~mask)的Message通过过滤
 *           uint16_t mask1
 *           uint16_t mask1
 *           uint16_t check2
 *           uint16_t check2
@@ -375,21 +375,21 @@ void CAN_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16
     CANx->CR &= ~CAN_CR_AFM_Msk;
     CANx->CR &= ~CAN_CR_AFM_Msk;
     CANx->CR |= (CAN_FILTER_16b << CAN_CR_AFM_Pos);
     CANx->CR |= (CAN_FILTER_16b << CAN_CR_AFM_Pos);
 
 
-    CANx->FILTER.AMR[0] = mask1 & 0xFF;
-    CANx->FILTER.AMR[1] = (mask1 >> 8) & 0xFF;
-    CANx->FILTER.AMR[2] = mask2 & 0xFF;
-    CANx->FILTER.AMR[3] = (mask2 >> 8) & 0xFF;
+    CANx->FILTER.AMR[3] = mask1 & 0xFF;
+    CANx->FILTER.AMR[2] = (mask1 >> 8) & 0xFF;
+    CANx->FILTER.AMR[1] = mask2 & 0xFF;
+    CANx->FILTER.AMR[0] = (mask2 >> 8) & 0xFF;
 
 
-    CANx->FILTER.ACR[0] = check1 & 0xFF;
-    CANx->FILTER.ACR[1] = (check1 >> 8) & 0xFF;
-    CANx->FILTER.ACR[2] = check2 & 0xFF;
-    CANx->FILTER.ACR[3] = (check2 >> 8) & 0xFF;
+    CANx->FILTER.ACR[3] = check1 & 0xFF;
+    CANx->FILTER.ACR[2] = (check1 >> 8) & 0xFF;
+    CANx->FILTER.ACR[1] = check2 & 0xFF;
+    CANx->FILTER.ACR[0] = (check2 >> 8) & 0xFF;
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTRXNotEmptyEn()
 * 函数名称: CAN_INTRXNotEmptyEn()
 * 功能说明: 当RX FIFO中有数据时(非空)触发中断使能
 * 功能说明: 当RX FIFO中有数据时(非空)触发中断使能
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -401,7 +401,7 @@ void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTRXNotEmptyDis()
 * 函数名称: CAN_INTRXNotEmptyDis()
 * 功能说明: 当RX FIFO中有数据时(非空)触发中断禁止
 * 功能说明: 当RX FIFO中有数据时(非空)触发中断禁止
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -410,22 +410,10 @@ void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx)
     CANx->IE &= ~(1 << CAN_IE_RXDA_Pos);
     CANx->IE &= ~(1 << CAN_IE_RXDA_Pos);
 }
 }
 
 
-/******************************************************************************************************************************************
-* 函数名称: CAN_INTRXNotEmptyStat()
-* 功能说明: RX FIFO非空中断是否触发
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
-* 输    出: uint32_t            1 已触发    0 未触发
-* 注意事项: 无
-******************************************************************************************************************************************/
-uint32_t CAN_INTRXNotEmptyStat(CAN_TypeDef *CANx)
-{
-    return (CANx->IF & CAN_IF_RXDA_Msk) ? 1 : 0;
-}
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTTXBufEmptyEn()
 * 函数名称: CAN_INTTXBufEmptyEn()
 * 功能说明: 当TX Buffer空时触发中断使能
 * 功能说明: 当TX Buffer空时触发中断使能
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -437,7 +425,7 @@ void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTTXBufEmptyDis()
 * 函数名称: CAN_INTTXBufEmptyDis()
 * 功能说明: 当TX Buffer空时触发中断禁止
 * 功能说明: 当TX Buffer空时触发中断禁止
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -446,22 +434,10 @@ void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx)
     CANx->IE &= ~(1 << CAN_IE_TXBR_Pos);
     CANx->IE &= ~(1 << CAN_IE_TXBR_Pos);
 }
 }
 
 
-/******************************************************************************************************************************************
-* 函数名称: CAN_INTTXBufEmptyStat()
-* 功能说明: TX Buffer空中断是否触发
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
-* 输    出: uint32_t            1 已触发    0 未触发
-* 注意事项: 无
-******************************************************************************************************************************************/
-uint32_t CAN_INTTXBufEmptyStat(CAN_TypeDef *CANx)
-{
-    return (CANx->IF & CAN_IF_TXBR_Msk) ? 1 : 0;
-}
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTErrWarningEn()
 * 函数名称: CAN_INTErrWarningEn()
 * 功能说明: TXERR/RXERR计数值达到Error Warning Limit时触发中断使能
 * 功能说明: TXERR/RXERR计数值达到Error Warning Limit时触发中断使能
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -473,7 +449,7 @@ void CAN_INTErrWarningEn(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTErrWarningDis()
 * 函数名称: CAN_INTErrWarningDis()
 * 功能说明: TXERR/RXERR计数值达到Error Warning Limit时触发中断禁止
 * 功能说明: TXERR/RXERR计数值达到Error Warning Limit时触发中断禁止
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -482,22 +458,10 @@ void CAN_INTErrWarningDis(CAN_TypeDef *CANx)
     CANx->IE &= ~(1 << CAN_IE_ERRWARN_Pos);
     CANx->IE &= ~(1 << CAN_IE_ERRWARN_Pos);
 }
 }
 
 
-/******************************************************************************************************************************************
-* 函数名称: CAN_INTErrWarningStat()
-* 功能说明: TXERR/RXERR计数值达到Error Warning Limit中断是否触发
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
-* 输    出: uint32_t            1 已触发    0 未触发
-* 注意事项: 无
-******************************************************************************************************************************************/
-uint32_t CAN_INTErrWarningStat(CAN_TypeDef *CANx)
-{
-    return (CANx->IF & CAN_IF_ERRWARN_Msk) ? 1 : 0;
-}
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTRXOverflowEn()
 * 函数名称: CAN_INTRXOverflowEn()
 * 功能说明: RX FIFO 溢出时触发中断使能
 * 功能说明: RX FIFO 溢出时触发中断使能
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -509,7 +473,7 @@ void CAN_INTRXOverflowEn(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTRXOverflowDis()
 * 函数名称: CAN_INTRXOverflowDis()
 * 功能说明: RX FIFO 溢出时触发中断禁止
 * 功能说明: RX FIFO 溢出时触发中断禁止
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -518,22 +482,10 @@ void CAN_INTRXOverflowDis(CAN_TypeDef *CANx)
     CANx->IE &= ~(1 << CAN_IE_RXOV_Pos);
     CANx->IE &= ~(1 << CAN_IE_RXOV_Pos);
 }
 }
 
 
-/******************************************************************************************************************************************
-* 函数名称: CAN_INTRXOverflowStat()
-* 功能说明: RX FIFO 溢出中断是否触发
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
-* 输    出: uint32_t            1 已触发    0 未触发
-* 注意事项: 无
-******************************************************************************************************************************************/
-uint32_t CAN_INTRXOverflowStat(CAN_TypeDef *CANx)
-{
-    return (CANx->IF & CAN_IF_RXOV_Msk) ? 1 : 0;
-}
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTRXOverflowClear()
 * 函数名称: CAN_INTRXOverflowClear()
 * 功能说明: RX FIFO 溢出中断清除
 * 功能说明: RX FIFO 溢出中断清除
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -545,7 +497,7 @@ void CAN_INTRXOverflowClear(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTWakeupEn()
 * 函数名称: CAN_INTWakeupEn()
 * 功能说明: 唤醒事件触发中断使能
 * 功能说明: 唤醒事件触发中断使能
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -557,7 +509,7 @@ void CAN_INTWakeupEn(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTWakeupDis()
 * 函数名称: CAN_INTWakeupDis()
 * 功能说明: 唤醒事件触发中断禁止
 * 功能说明: 唤醒事件触发中断禁止
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -566,22 +518,10 @@ void CAN_INTWakeupDis(CAN_TypeDef *CANx)
     CANx->IE &= ~(1 << CAN_IE_WKUP_Pos);
     CANx->IE &= ~(1 << CAN_IE_WKUP_Pos);
 }
 }
 
 
-/******************************************************************************************************************************************
-* 函数名称: CAN_INTWakeupStat()
-* 功能说明: 唤醒事件中断是否触发
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
-* 输    出: uint32_t            1 已触发    0 未触发
-* 注意事项: 无
-******************************************************************************************************************************************/
-uint32_t CAN_INTWakeupStat(CAN_TypeDef *CANx)
-{
-    return (CANx->IF & CAN_IF_WKUP_Msk) ? 1 : 0;
-}
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTErrPassiveEn()
 * 函数名称: CAN_INTErrPassiveEn()
 * 功能说明: TXERR/RXERR计数值达到127时中断使能
 * 功能说明: TXERR/RXERR计数值达到127时中断使能
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -593,7 +533,7 @@ void CAN_INTErrPassiveEn(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTErrPassiveDis()
 * 函数名称: CAN_INTErrPassiveDis()
 * 功能说明: TXERR/RXERR计数值达到127时中断禁止
 * 功能说明: TXERR/RXERR计数值达到127时中断禁止
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -602,22 +542,10 @@ void CAN_INTErrPassiveDis(CAN_TypeDef *CANx)
     CANx->IE &= ~(1 << CAN_IE_ERRPASS_Pos);
     CANx->IE &= ~(1 << CAN_IE_ERRPASS_Pos);
 }
 }
 
 
-/******************************************************************************************************************************************
-* 函数名称: CAN_INTErrPassiveStat()
-* 功能说明: TXERR/RXERR计数值达到127中断是否触发
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
-* 输    出: uint32_t            1 已触发    0 未触发
-* 注意事项: 无
-******************************************************************************************************************************************/
-uint32_t CAN_INTErrPassiveStat(CAN_TypeDef *CANx)
-{
-    return (CANx->IF & CAN_IF_ERRPASS_Msk) ? 1 : 0;
-}
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTArbitrLostEn()
 * 函数名称: CAN_INTArbitrLostEn()
 * 功能说明: 仲裁失败中断使能
 * 功能说明: 仲裁失败中断使能
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -629,7 +557,7 @@ void CAN_INTArbitrLostEn(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTArbitrLostDis()
 * 函数名称: CAN_INTArbitrLostDis()
 * 功能说明: 仲裁失败中断禁止
 * 功能说明: 仲裁失败中断禁止
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -638,22 +566,10 @@ void CAN_INTArbitrLostDis(CAN_TypeDef *CANx)
     CANx->IE &= ~(1 << CAN_IE_ARBLOST_Pos);
     CANx->IE &= ~(1 << CAN_IE_ARBLOST_Pos);
 }
 }
 
 
-/******************************************************************************************************************************************
-* 函数名称: CAN_INTArbitrLostStat()
-* 功能说明: 仲裁失败中断是否触发
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
-* 输    出: uint32_t            1 已触发    0 未触发
-* 注意事项: 无
-******************************************************************************************************************************************/
-uint32_t CAN_INTArbitrLostStat(CAN_TypeDef *CANx)
-{
-    return (CANx->IF & CAN_IF_ARBLOST_Msk) ? 1 : 0;
-}
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTBusErrorEn()
 * 函数名称: CAN_INTBusErrorEn()
 * 功能说明: 总线错误中断使能
 * 功能说明: 总线错误中断使能
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -665,7 +581,7 @@ void CAN_INTBusErrorEn(CAN_TypeDef *CANx)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: CAN_INTBusErrorDis()
 * 函数名称: CAN_INTBusErrorDis()
 * 功能说明: 总线错误中断禁止
 * 功能说明: 总线错误中断禁止
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -675,13 +591,13 @@ void CAN_INTBusErrorDis(CAN_TypeDef *CANx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: CAN_INTBusErrorStat()
-* 功能说明: 总线错误中断是否触发
-* 输    入: CAN_TypeDef * CANx  指定要被设置的CAN接口,有效值包括CAN
-* 输    出: uint32_t            1 已触发    0 未触发
-* 注意事项: 
+* 函数名称: CAN_INTStat()
+* 功能说明: 查询中断状态
+* 输    入: CAN_TypeDef * CANx    指定要被设置的CAN接口,有效值包括CAN
+* 输    出: uint32_t          当前中断状态
+* 注意事项: CANx->IF读取清零,因此在中断ISR中只能读取一次,不能多次读取
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
-uint32_t CAN_INTBusErrorStat(CAN_TypeDef *CANx)
+uint32_t CAN_INTStat(CAN_TypeDef *CANx)
 {
 {
-    return (CANx->IF & CAN_IF_BUSERR_Msk) ? 1 : 0;
+    return CANx->IF;
 }
 }

+ 59 - 66
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_can.h

@@ -1,22 +1,22 @@
 #ifndef __SWM320_CAN_H__
 #ifndef __SWM320_CAN_H__
 #define __SWM320_CAN_H__
 #define __SWM320_CAN_H__
 
 
-#define CAN_FRAME_STD   0
-#define CAN_FRAME_EXT   1
+#define CAN_FRAME_STD 0
+#define CAN_FRAME_EXT 1
 
 
 typedef struct
 typedef struct
 {
 {
-    uint8_t  Mode;          //CAN_MODE_NORMAL、CAN_MODE_LISTEN、CAN_MODE_SELFTEST
-    uint8_t  CAN_BS1;       //CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
-    uint8_t  CAN_BS2;       //CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
-    uint8_t  CAN_SJW;       //CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
-    uint32_t Baudrate;      //波特率,即位传输速率,取值1--1000000
-    uint8_t  FilterMode;    //CAN_FILTER_16b、CAN_FILTER_32b
+    uint8_t Mode;       //CAN_MODE_NORMAL銆丆AN_MODE_LISTEN銆丆AN_MODE_SELFTEST
+    uint8_t CAN_BS1;    //CAN_BS1_1tq銆丆AN_BS1_2tq銆�... ... 銆丆AN_BS1_16tq
+    uint8_t CAN_BS2;    //CAN_BS2_1tq銆丆AN_BS2_2tq銆�... ... 銆丆AN_BS2_8tq
+    uint8_t CAN_SJW;    //CAN_SJW_1tq銆丆AN_SJW_2tq銆丆AN_SJW_3tq銆丆AN_SJW_4tq
+    uint32_t Baudrate;  //娉㈢壒鐜囷紝鍗充綅浼犺緭閫熺巼锛屽彇鍊�1--1000000
+    uint8_t FilterMode; //CAN_FILTER_16b銆丆AN_FILTER_32b
     union
     union
     {
     {
-        uint32_t FilterMask32b;     //FilterCheck & (~FilterMask) == ID & (~FilterMask)的Message通过过滤
-        struct                      // 0 must match    1 don't care
-        {
+        uint32_t FilterMask32b; //FilterCheck & (~FilterMask) == ID & (~FilterMask)鐨凪essage閫氳繃杩囨护
+        struct
+        { // 0 must match    1 don't care
             uint16_t FilterMask16b1;
             uint16_t FilterMask16b1;
             uint16_t FilterMask16b2;
             uint16_t FilterMask16b2;
         };
         };
@@ -30,59 +30,59 @@ typedef struct
             uint16_t FilterCheck16b2;
             uint16_t FilterCheck16b2;
         };
         };
     };
     };
-    uint8_t  RXNotEmptyIEn;     //接收FIFO非空,有数据可读
-    uint8_t  RXOverflowIEn;     //接收FIFO溢出,有数据丢失
-    uint8_t  ArbitrLostIEn;     //控制器丢失仲裁变成接收方
-    uint8_t  ErrPassiveIEn;     //接收/发送错误计数值达到127
+    uint8_t RXNotEmptyIEn; //鎺ユ敹FIFO闈炵┖锛屾湁鏁版嵁鍙��
+    uint8_t RXOverflowIEn; //鎺ユ敹FIFO婧㈠嚭锛屾湁鏁版嵁涓㈠け
+    uint8_t ArbitrLostIEn; //鎺у埗鍣ㄤ涪澶变徊瑁佸彉鎴愭帴鏀舵柟
+    uint8_t ErrPassiveIEn; //鎺ユ敹/鍙戦€侀敊璇��鏁板€艰揪鍒�127
 } CAN_InitStructure;
 } CAN_InitStructure;
 
 
-#define CAN_MODE_NORMAL     0   //常规模式
-#define CAN_MODE_LISTEN     1   //监听模式
-#define CAN_MODE_SELFTEST   2   //自测模式
-
-#define CAN_BS1_1tq         0
-#define CAN_BS1_2tq         1
-#define CAN_BS1_3tq         2
-#define CAN_BS1_4tq         3
-#define CAN_BS1_5tq         4
-#define CAN_BS1_6tq         5
-#define CAN_BS1_7tq         6
-#define CAN_BS1_8tq         7
-#define CAN_BS1_9tq         8
-#define CAN_BS1_10tq        9
-#define CAN_BS1_11tq        10
-#define CAN_BS1_12tq        11
-#define CAN_BS1_13tq        12
-#define CAN_BS1_14tq        13
-#define CAN_BS1_15tq        14
-#define CAN_BS1_16tq        15
-
-#define CAN_BS2_1tq         0
-#define CAN_BS2_2tq         1
-#define CAN_BS2_3tq         2
-#define CAN_BS2_4tq         3
-#define CAN_BS2_5tq         4
-#define CAN_BS2_6tq         5
-#define CAN_BS2_7tq         6
-#define CAN_BS2_8tq         7
-
-#define CAN_SJW_1tq         0
-#define CAN_SJW_2tq         1
-#define CAN_SJW_3tq         2
-#define CAN_SJW_4tq         3
-
-#define CAN_FILTER_16b      0   //两个16位过滤器
-#define CAN_FILTER_32b      1   //一个32位过滤器
+#define CAN_MODE_NORMAL 0   //甯歌�妯″紡
+#define CAN_MODE_LISTEN 1   //鐩戝惉妯″紡
+#define CAN_MODE_SELFTEST 2 //鑷�祴妯″紡
+
+#define CAN_BS1_1tq 0
+#define CAN_BS1_2tq 1
+#define CAN_BS1_3tq 2
+#define CAN_BS1_4tq 3
+#define CAN_BS1_5tq 4
+#define CAN_BS1_6tq 5
+#define CAN_BS1_7tq 6
+#define CAN_BS1_8tq 7
+#define CAN_BS1_9tq 8
+#define CAN_BS1_10tq 9
+#define CAN_BS1_11tq 10
+#define CAN_BS1_12tq 11
+#define CAN_BS1_13tq 12
+#define CAN_BS1_14tq 13
+#define CAN_BS1_15tq 14
+#define CAN_BS1_16tq 15
+
+#define CAN_BS2_1tq 0
+#define CAN_BS2_2tq 1
+#define CAN_BS2_3tq 2
+#define CAN_BS2_4tq 3
+#define CAN_BS2_5tq 4
+#define CAN_BS2_6tq 5
+#define CAN_BS2_7tq 6
+#define CAN_BS2_8tq 7
+
+#define CAN_SJW_1tq 0
+#define CAN_SJW_2tq 1
+#define CAN_SJW_3tq 2
+#define CAN_SJW_4tq 3
+
+#define CAN_FILTER_16b 0 //涓や釜16浣嶈繃婊ゅ櫒
+#define CAN_FILTER_32b 1 //涓€涓�32浣嶈繃婊ゅ櫒
 
 
 typedef struct
 typedef struct
 {
 {
-    uint32_t id;        //消息ID
-    uint8_t  remote;    //消息是否为远程帧
-    uint8_t  data[8];   //接收到的数据
-    uint8_t  size;      //接收到的数据个数
+    uint32_t id;     //娑堟伅ID
+    uint8_t format;  //甯ф牸寮忥細CAN_FRAME_STD銆丆AN_FRAME_EXT
+    uint8_t remote;  //娑堟伅鏄�惁涓鸿繙绋嬪抚
+    uint8_t size;    //鎺ユ敹鍒扮殑鏁版嵁涓�暟
+    uint8_t data[8]; //鎺ユ敹鍒扮殑鏁版嵁
 } CAN_RXMessage;
 } CAN_RXMessage;
 
 
-
 void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct);
 void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct);
 void CAN_Open(CAN_TypeDef *CANx);
 void CAN_Open(CAN_TypeDef *CANx);
 void CAN_Close(CAN_TypeDef *CANx);
 void CAN_Close(CAN_TypeDef *CANx);
@@ -104,38 +104,31 @@ void CAN_SetBaudrate(CAN_TypeDef *CANx, uint32_t baudrate, uint32_t CAN_BS1, uin
 void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask);
 void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask);
 void CAN_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2);
 void CAN_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2);
 
 
-
 void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx);
 void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx);
 void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx);
 void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx);
-uint32_t CAN_INTRXNotEmptyStat(CAN_TypeDef *CANx);
 
 
 void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx);
 void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx);
 void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx);
 void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx);
-uint32_t CAN_INTTXBufEmptyStat(CAN_TypeDef *CANx);
 
 
 void CAN_INTErrWarningEn(CAN_TypeDef *CANx);
 void CAN_INTErrWarningEn(CAN_TypeDef *CANx);
 void CAN_INTErrWarningDis(CAN_TypeDef *CANx);
 void CAN_INTErrWarningDis(CAN_TypeDef *CANx);
-uint32_t CAN_INTErrWarningStat(CAN_TypeDef *CANx);
 
 
 void CAN_INTRXOverflowEn(CAN_TypeDef *CANx);
 void CAN_INTRXOverflowEn(CAN_TypeDef *CANx);
 void CAN_INTRXOverflowDis(CAN_TypeDef *CANx);
 void CAN_INTRXOverflowDis(CAN_TypeDef *CANx);
-uint32_t CAN_INTRXOverflowStat(CAN_TypeDef *CANx);
 void CAN_INTRXOverflowClear(CAN_TypeDef *CANx);
 void CAN_INTRXOverflowClear(CAN_TypeDef *CANx);
 
 
 void CAN_INTWakeupEn(CAN_TypeDef *CANx);
 void CAN_INTWakeupEn(CAN_TypeDef *CANx);
 void CAN_INTWakeupDis(CAN_TypeDef *CANx);
 void CAN_INTWakeupDis(CAN_TypeDef *CANx);
-uint32_t CAN_INTWakeupStat(CAN_TypeDef *CANx);
 
 
 void CAN_INTErrPassiveEn(CAN_TypeDef *CANx);
 void CAN_INTErrPassiveEn(CAN_TypeDef *CANx);
 void CAN_INTErrPassiveDis(CAN_TypeDef *CANx);
 void CAN_INTErrPassiveDis(CAN_TypeDef *CANx);
-uint32_t CAN_INTErrPassiveStat(CAN_TypeDef *CANx);
 
 
 void CAN_INTArbitrLostEn(CAN_TypeDef *CANx);
 void CAN_INTArbitrLostEn(CAN_TypeDef *CANx);
 void CAN_INTArbitrLostDis(CAN_TypeDef *CANx);
 void CAN_INTArbitrLostDis(CAN_TypeDef *CANx);
-uint32_t CAN_INTArbitrLostStat(CAN_TypeDef *CANx);
 
 
 void CAN_INTBusErrorEn(CAN_TypeDef *CANx);
 void CAN_INTBusErrorEn(CAN_TypeDef *CANx);
 void CAN_INTBusErrorDis(CAN_TypeDef *CANx);
 void CAN_INTBusErrorDis(CAN_TypeDef *CANx);
-uint32_t CAN_INTBusErrorStat(CAN_TypeDef *CANx);
+
+uint32_t CAN_INTStat(CAN_TypeDef *CANx);
 
 
 #endif //__SWM320_CAN_H__
 #endif //__SWM320_CAN_H__

+ 15 - 16
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_crc.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 恅璃靡備: SWM320_crc.c
-* 髡夔佽隴: SWM320等⑵儂腔CRC耀輸Й雄踱
-* 撮扲盓厥: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* 蛁砩岈砐:
-* 唳掛゜ヽ: V1.1.0      2017爛10堎25゜
-* 汔撰暮翹:
+* ��辣�滨妍: SWM320_crc.c
+* �蠘�霂湔�: SWM320�閧��箇�CRC璅∪�撽勗𢆡摨�
+* ���舀𣈲��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 瘜冽�鈭钅★:
+* ��𧋦�交�: V1.1.0      2017撟�10��25��
+* ��漣霈啣�:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -21,17 +21,16 @@
 #include "SWM320.h"
 #include "SWM320.h"
 #include "SWM320_crc.h"
 #include "SWM320_crc.h"
 
 
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 滲杅靡備: CRC_Init()
-* 髡夔佽隴: CRC 場宎趙
-* 怀    ⻌: CRC_TypeDef * CRCx  硌隅猁掩扢离腔CRC諉諳ㄛ衄虴硉婦嬤CRC
-*           uint32_t mode       馱釬耀宒ㄛ衄虴硉衄ㄩCRC32_IN32﹜CRC32_IN16﹜CRC32_IN8﹜CRC16_IN16﹜CRC16_IN8
-*           uint32_t out_not    怀堤賦彆岆瘁龰毀
-*           uint32_t out_rev    怀堤賦彆岆瘁楹蛌
-*           uint32_t ini_val    CRC場宎硉
-* 怀    堤: 拸
-* 蛁砩岈砐: 拸
+* �賣㺭�滨妍: CRC_Init()
+* �蠘�霂湔�: CRC �嘥���
+* 颲�    ��: CRC_TypeDef * CRCx    ���閬�◤霈曄蔭��RC�亙藁嚗峕����澆��拴RC
+*           uint32_t mode       撌乩�璅∪�嚗峕����潭�嚗鋴RC32_IN32��RC32_IN16��RC32_IN8��RC16_IN16��RC16_IN8
+*           uint32_t out_not    颲枏枂蝏𤘪��臬炏�硋�
+*           uint32_t out_rev    颲枏枂蝏𤘪��臬炏蝧餉蓮
+*           uint32_t ini_val    CRC�嘥���
+* 颲�    ��: ��
+* 瘜冽�鈭钅★: ��
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void CRC_Init(CRC_TypeDef *CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val)
 void CRC_Init(CRC_TypeDef *CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val)
 {
 {

+ 15 - 18
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_crc.h

@@ -1,23 +1,20 @@
 #ifndef __SWM320_CRC_H__
 #ifndef __SWM320_CRC_H__
 #define __SWM320_CRC_H__
 #define __SWM320_CRC_H__
 
 
-
-#define CRC32_IN32  0   //CRC32Ëã·¨£¬ÊäÈëÊý¾Ý32λ
-#define CRC32_IN16  2   //CRC32Ëã·¨£¬ÊäÈëÊý¾Ý16λ
-#define CRC32_IN8   4   //CRC32Ëã·¨£¬ÊäÈëÊý¾Ý 8λ
-#define CRC16_IN16  3   //CRC16Ëã·¨£¬ÊäÈëÊý¾Ý16λ
-#define CRC16_IN8   5   //CRC16Ëã·¨£¬ÊäÈëÊý¾Ý 8λ
-
+#define CRC32_IN32 0 //CRC32算法,输入数�32�
+#define CRC32_IN16 2 //CRC32算法,输入数�16�
+#define CRC32_IN8 4  //CRC32算法,输入数� 8�
+#define CRC16_IN16 3 //CRC16算法,输入数�16�
+#define CRC16_IN8 5  //CRC16算法,输入数� 8�
 
 
 void CRC_Init(CRC_TypeDef *CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val);
 void CRC_Init(CRC_TypeDef *CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val);
 
 
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: CRC_Write()
-* ¹¦ÄÜ˵Ã÷: CRCдÈëÊý¾Ý
-* Êä    Èë: uint32_t data       ҪдÈëµÄÊý¾Ý
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: CRC_Write()
+* 功能说明: CRC写入数�
+* 输    入: uint32_t data     �写入的数�
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 static __INLINE void CRC_Write(uint32_t data)
 static __INLINE void CRC_Write(uint32_t data)
 {
 {
@@ -25,11 +22,11 @@ static __INLINE void CRC_Write(uint32_t data)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: CRC_Result()
-* ¹¦ÄÜ˵Ã÷: »ñÈ¡CRC¼ÆËã½á¹û
-* Êä    Èë: ÎÞ
-* Êä    ³ö: uint32_t            CRC ¼ÆËã½á¹û
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: CRC_Result()
+* 功能说明: 获�CRC计算结果
+* 输    入: 无
+* 输    出: uint32_t          CRC 计算结果
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 static __INLINE uint32_t CRC_Result(void)
 static __INLINE uint32_t CRC_Result(void)
 {
 {

+ 55 - 53
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_dma.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 文件名称: SWM320_dma.c
-* 功能说明: SWM320单片机的DMA功能驱动库
-* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* 注意事项:
-* 版本日期: V1.1.0      2017年10月25日
-* 升级记录:
+* 鏂囦欢鍚嶇О: SWM320_dma.c
+* 鍔熻兘璇存槑: SWM320鍗曠墖鏈虹殑DMA鍔熻兘椹卞姩搴�
+* 鎶€鏈�敮鎸�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 娉ㄦ剰浜嬮」:
+* 鐗堟湰鏃ユ湡: V1.1.0      2017骞�10鏈�25鏃�
+* 鍗囩骇璁板綍:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -22,23 +22,23 @@
 #include "SWM320_dma.h"
 #include "SWM320_dma.h"
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: DMA_CHM_Config()
-* 功能说明: DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
-* 输    入: uint32_t chn            指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH1
-*           uint32_t src_addr       源地址,必须字对齐,即地址的最低2位必须是00
-*           uint32_t src_addr_incr  0 固定地址    1 地址递增
-*           uint32_t dst_addr       目的地址,必须字对齐,即地址的最低2位必须是00
-*           uint32_t dst_addr_incr  0 固定地址    1 地址递增
-*           uint32_t num_word       要搬运的数据字数,最大1024
-*           uint32_t int_en         中断使能,1 数据搬运完成后产生中断    0 数据搬运完成后不产生中断
-* 输    出: 无
-* 注意事项: 搬运数据量以字为单元,不是字节
+* 鍑芥暟鍚嶇О: DMA_CHM_Config()
+* 鍔熻兘璇存槑: DMA閫氶亾閰嶇疆锛岀敤浜庡瓨鍌ㄥ櫒闂达紙濡侳lash鍜孯AM闂达級鎼�繍鏁版嵁
+* 杈�    鍏�: uint32_t chn          鎸囧畾瑕侀厤缃�殑閫氶亾锛屾湁鏁堝€兼湁DMA_CH0銆丏MA_CH1銆丏MA_CH2
+*           uint32_t src_addr       婧愬湴鍧€锛屽繀椤诲瓧瀵归綈锛屽嵆鍦板潃鐨勬渶浣�2浣嶅繀椤绘槸00
+*           uint32_t src_addr_incr  0 鍥哄畾鍦板潃    1 鍦板潃閫掑�
+*           uint32_t dst_addr       鐩�殑鍦板潃锛屽繀椤诲瓧瀵归綈锛屽嵆鍦板潃鐨勬渶浣�2浣嶅繀椤绘槸00
+*           uint32_t dst_addr_incr  0 鍥哄畾鍦板潃    1 鍦板潃閫掑�
+*           uint32_t num_word       瑕佹惉杩愮殑鏁版嵁瀛楁暟锛屾渶澶�1024
+*           uint32_t int_en         涓�柇浣胯兘锛�1 鏁版嵁鎼�繍瀹屾垚鍚庝骇鐢熶腑鏂�    0 鏁版嵁鎼�繍瀹屾垚鍚庝笉浜х敓涓�柇
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鎼�繍鏁版嵁閲忎互瀛椾负鍗曞厓锛屼笉鏄�瓧鑺�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en)
 void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en)
 {
 {
-    DMA->EN = 1;            //每个通道都有自己独立的开关控制,所以总开关可以是一直开启的
+    DMA->EN = 1; //姣忎釜閫氶亾閮芥湁鑷�繁鐙�珛鐨勫紑鍏虫帶鍒讹紝鎵€浠ユ€诲紑鍏冲彲浠ユ槸涓€鐩村紑鍚�殑
 
 
-    DMA_CH_Close(chn);      //配置前先关闭该通道
+    DMA_CH_Close(chn); //閰嶇疆鍓嶅厛鍏抽棴璇ラ€氶亾
 
 
     DMA->CH[chn].SRC = src_addr;
     DMA->CH[chn].SRC = src_addr;
     DMA->CH[chn].DST = dst_addr;
     DMA->CH[chn].DST = dst_addr;
@@ -50,10 +50,12 @@ void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uin
                       (dst_addr_incr << DMA_AM_DSTAM_Pos) |
                       (dst_addr_incr << DMA_AM_DSTAM_Pos) |
                       (0 << DMA_AM_BURST_Pos);
                       (0 << DMA_AM_BURST_Pos);
 
 
-    DMA->IF  = (1 << chn);      //清除中断标志
+    DMA->IF = (1 << chn); //娓呴櫎涓�柇鏍囧織
     DMA->IE |= (1 << chn);
     DMA->IE |= (1 << chn);
-    if (int_en)  DMA->IM &= ~(1 << chn);
-    else        DMA->IM |= (1 << chn);
+    if (int_en)
+        DMA->IM &= ~(1 << chn);
+    else
+        DMA->IM |= (1 << chn);
 
 
     if (int_en)
     if (int_en)
     {
     {
@@ -61,16 +63,16 @@ void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uin
     }
     }
     else
     else
     {
     {
-        //不能调用NVIC_DisalbeIRQ(DMA_IRQn),因为其他通道可能使用DMA中断
+        //涓嶈兘璋冪敤NVIC_DisalbeIRQ(DMA_IRQn)锛屽洜涓哄叾浠栭€氶亾鍙�兘浣跨敤DMA涓�柇
     }
     }
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: DMA_CH_Open()
-* 功能说明: DMA通道打开
-* 输    入: uint32_t chn            指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH1
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: DMA_CH_Open()
+* 鍔熻兘璇存槑: DMA閫氶亾鎵撳紑
+* 杈�    鍏�: uint32_t chn          鎸囧畾瑕侀厤缃�殑閫氶亾锛屾湁鏁堝€兼湁DMA_CH0銆丏MA_CH1銆丏MA_CH2
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void DMA_CH_Open(uint32_t chn)
 void DMA_CH_Open(uint32_t chn)
 {
 {
@@ -78,11 +80,11 @@ void DMA_CH_Open(uint32_t chn)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: DMA_CH_Close()
-* 功能说明: DMA通道关闭
-* 输    入: uint32_t chn            指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH1
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: DMA_CH_Close()
+* 鍔熻兘璇存槑: DMA閫氶亾鍏抽棴
+* 杈�    鍏�: uint32_t chn          鎸囧畾瑕侀厤缃�殑閫氶亾锛屾湁鏁堝€兼湁DMA_CH0銆丏MA_CH1銆丏MA_CH2
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void DMA_CH_Close(uint32_t chn)
 void DMA_CH_Close(uint32_t chn)
 {
 {
@@ -90,11 +92,11 @@ void DMA_CH_Close(uint32_t chn)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: DMA_CH_INTEn()
-* 功能说明: DMA中断使能,数据搬运完成后触发中断
-* 输    入: uint32_t chn            指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH1
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: DMA_CH_INTEn()
+* 鍔熻兘璇存槑: DMA涓�柇浣胯兘锛屾暟鎹�惉杩愬畬鎴愬悗瑙﹀彂涓�柇
+* 杈�    鍏�: uint32_t chn          鎸囧畾瑕侀厤缃�殑閫氶亾锛屾湁鏁堝€兼湁DMA_CH0銆丏MA_CH1銆丏MA_CH2
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void DMA_CH_INTEn(uint32_t chn)
 void DMA_CH_INTEn(uint32_t chn)
 {
 {
@@ -102,11 +104,11 @@ void DMA_CH_INTEn(uint32_t chn)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: DMA_CH_INTDis()
-* 功能说明: DMA中断禁止,数据搬运完成后不触发中断
-* 输    入: uint32_t chn            指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH1
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: DMA_CH_INTDis()
+* 鍔熻兘璇存槑: DMA涓�柇绂佹�锛屾暟鎹�惉杩愬畬鎴愬悗涓嶈Е鍙戜腑鏂�
+* 杈�    鍏�: uint32_t chn          鎸囧畾瑕侀厤缃�殑閫氶亾锛屾湁鏁堝€兼湁DMA_CH0銆丏MA_CH1銆丏MA_CH2
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void DMA_CH_INTDis(uint32_t chn)
 void DMA_CH_INTDis(uint32_t chn)
 {
 {
@@ -114,11 +116,11 @@ void DMA_CH_INTDis(uint32_t chn)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: DMA_CH_INTClr()
-* 功能说明: DMA中断标志清除
-* 输    入: uint32_t chn            指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH1
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: DMA_CH_INTClr()
+* 鍔熻兘璇存槑: DMA涓�柇鏍囧織娓呴櫎
+* 杈�    鍏�: uint32_t chn          鎸囧畾瑕侀厤缃�殑閫氶亾锛屾湁鏁堝€兼湁DMA_CH0銆丏MA_CH1銆丏MA_CH2
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void DMA_CH_INTClr(uint32_t chn)
 void DMA_CH_INTClr(uint32_t chn)
 {
 {
@@ -126,11 +128,11 @@ void DMA_CH_INTClr(uint32_t chn)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: DMA_CH_INTStat()
-* 功能说明: DMA中断状态查询
-* 输    入: uint32_t chn            指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH1
-* 输    出: uint32_t                1 数据搬运完成    0 数据搬运未完成
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: DMA_CH_INTStat()
+* 鍔熻兘璇存槑: DMA涓�柇鐘舵€佹煡璇�
+* 杈�    鍏�: uint32_t chn          鎸囧畾瑕侀厤缃�殑閫氶亾锛屾湁鏁堝€兼湁DMA_CH0銆丏MA_CH1銆丏MA_CH2
+* 杈�    鍑�: uint32_t              1 鏁版嵁鎼�繍瀹屾垚    0 鏁版嵁鎼�繍鏈�畬鎴�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t DMA_CH_INTStat(uint32_t chn)
 uint32_t DMA_CH_INTStat(uint32_t chn)
 {
 {

+ 10 - 13
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_dma.h

@@ -1,20 +1,17 @@
 #ifndef __SWM320_DMA_H__
 #ifndef __SWM320_DMA_H__
 #define __SWM320_DMA_H__
 #define __SWM320_DMA_H__
 
 
+#define DMA_CH0 0
+#define DMA_CH1 1
+#define DMA_CH2 2
 
 
-#define DMA_CH0     0
-#define DMA_CH1     1
-#define DMA_CH2     2
-
-
-void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en);    //DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
-void DMA_CH_Open(uint32_t chn);                 //DMA通道打开
-void DMA_CH_Close(uint32_t chn);                //DMA通道关闭
-
-void DMA_CH_INTEn(uint32_t chn);                //DMA中断使能,数据搬运完成后触发中断
-void DMA_CH_INTDis(uint32_t chn);               //DMA中断禁止,数据搬运完成后不触发中断
-void DMA_CH_INTClr(uint32_t chn);               //DMA中断标志清除
-uint32_t DMA_CH_INTStat(uint32_t chn);          //DMA中断状态查询,1 数据搬运完成    0 数据搬运未完成
+void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en); //DMA閫氶亾閰嶇疆锛岀敤浜庡瓨鍌ㄥ櫒闂达紙濡侳lash鍜孯AM闂达級鎼�繍鏁版嵁
+void DMA_CH_Open(uint32_t chn);                                                                                                                              //DMA閫氶亾鎵撳紑
+void DMA_CH_Close(uint32_t chn);                                                                                                                             //DMA閫氶亾鍏抽棴
 
 
+void DMA_CH_INTEn(uint32_t chn);       //DMA涓�柇浣胯兘锛屾暟鎹�惉杩愬畬鎴愬悗瑙﹀彂涓�柇
+void DMA_CH_INTDis(uint32_t chn);      //DMA涓�柇绂佹�锛屾暟鎹�惉杩愬畬鎴愬悗涓嶈Е鍙戜腑鏂�
+void DMA_CH_INTClr(uint32_t chn);      //DMA涓�柇鏍囧織娓呴櫎
+uint32_t DMA_CH_INTStat(uint32_t chn); //DMA涓�柇鐘舵€佹煡璇�紝1 鏁版嵁鎼�繍瀹屾垚    0 鏁版嵁鎼�繍鏈�畬鎴�
 
 
 #endif //__SWM320_DMA_H__
 #endif //__SWM320_DMA_H__

+ 55 - 55
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_exti.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 文件名称: SWM320_exti.c
-* 功能说明: SWM320单片机的外部中断功能驱动库
-* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* 注意事项:
-* 版本日期: V1.1.0      2017年10月25日
-* 升级记录:
+* 鏂囦欢鍚嶇О: SWM320_exti.c
+* 鍔熻兘璇存槑: SWM320鍗曠墖鏈虹殑澶栭儴涓�柇鍔熻兘椹卞姩搴�
+* 鎶€鏈�敮鎸�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 娉ㄦ剰浜嬮」:
+* 鐗堟湰鏃ユ湡: V1.1.0      2017骞�10鏈�25鏃�
+* 鍗囩骇璁板綍:
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
 * @attention
 * @attention
@@ -21,57 +21,57 @@
 #include "SWM320_exti.h"
 #include "SWM320_exti.h"
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: EXTI_Init()
-* 功能说明: 指定引脚外部中断初始化
-* 输    入: GPIO_TypeDef * GPIOx    指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n         指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-*           uint32_t mode      有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL
-* 输    出: 无
-* 注意事项: 由于GPIOA、GPIOB、GPIOC、GPIOM的PIN0--7引脚即可以接入NVIC中的引脚中断(如GPIOA0_IRQn),也可以接入NVIC的组中断(GPIOA_IRQn),
-*           所以不在此函数中调用NVIC_EnableIRQ()使能NVIC中断,从而可以根据需要调用NVIC_EnableIRQ(GPIOA0_IRQn)和NVIC_EnableIRQ(GPIOA_IRQn)
+* 鍑芥暟鍚嶇О: EXTI_Init()
+* 鍔熻兘璇存槑: 鎸囧畾寮曡剼澶栭儴涓�柇鍒濆�鍖�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx  鎸囧畾浜х敓澶栭儴涓�柇鐨凣PIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n         鎸囧畾浜х敓澶栭儴涓�柇鐨凣PIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+*           uint32_t mode      鏈夋晥鍊兼湁EXTI_FALL_EDGE銆丒XTI_RISE_EDGE銆丒XTI_BOTH_EDGE銆丒XTI_LOW_LEVEL銆丒XTI_HIGH_LEVEL
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鐢变簬GPIOA銆丟PIOB銆丟PIOC銆丟PIOM鐨凱IN0--7寮曡剼鍗冲彲浠ユ帴鍏�VIC涓�殑寮曡剼涓�柇锛堝�GPIOA0_IRQn锛夛紝涔熷彲浠ユ帴鍏�VIC鐨勭粍涓�柇锛圙PIOA_IRQn锛夛紝
+*           鎵€浠ヤ笉鍦ㄦ�鍑芥暟涓�皟鐢∟VIC_EnableIRQ()浣胯兘NVIC涓�柇锛屼粠鑰屽彲浠ユ牴鎹�渶瑕佽皟鐢∟VIC_EnableIRQ(GPIOA0_IRQn)鍜孨VIC_EnableIRQ(GPIOA_IRQn)
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void EXTI_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t mode)
 void EXTI_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t mode)
 {
 {
-    EXTI_Close(GPIOx, n);           //配置关键寄存器前先关闭
+    EXTI_Close(GPIOx, n); //閰嶇疆鍏抽敭瀵勫瓨鍣ㄥ墠鍏堝叧闂�
 
 
     if (mode & 0x10)
     if (mode & 0x10)
     {
     {
-        GPIOx->INTLVLTRG |= (0x01 << n);            //电平触发
+        GPIOx->INTLVLTRG |= (0x01 << n); //鐢靛钩瑙﹀彂
 
 
         if (mode & 0x01)
         if (mode & 0x01)
-            GPIOx->INTRISEEN |= (0x01 << n);                //高电平触发
+            GPIOx->INTRISEEN |= (0x01 << n); //楂樼數骞宠Е鍙�
         else
         else
-            GPIOx->INTRISEEN &= ~(0x01 << n);               //低电平触发
+            GPIOx->INTRISEEN &= ~(0x01 << n); //浣庣數骞宠Е鍙�
     }
     }
     else
     else
     {
     {
-        GPIOx->INTLVLTRG &= ~(0x01 << n);           //边沿触发
+        GPIOx->INTLVLTRG &= ~(0x01 << n); //杈规部瑙﹀彂
 
 
         if (mode & 0x02)
         if (mode & 0x02)
         {
         {
-            GPIOx->INTBE |= (0x01 << n);                //双边沿触发
+            GPIOx->INTBE |= (0x01 << n); //鍙岃竟娌胯Е鍙�
         }
         }
         else
         else
         {
         {
-            GPIOx->INTBE &= ~(0x01 << n);               //单边沿触发
+            GPIOx->INTBE &= ~(0x01 << n); //鍗曡竟娌胯Е鍙�
 
 
             if (mode & 0x01)
             if (mode & 0x01)
-                GPIOx->INTRISEEN |= (0x01 << n);            //上升沿触发
+                GPIOx->INTRISEEN |= (0x01 << n); //涓婂崌娌胯Е鍙�
             else
             else
-                GPIOx->INTRISEEN &= ~(0x01 << n);           //下降沿触发
+                GPIOx->INTRISEEN &= ~(0x01 << n); //涓嬮檷娌胯Е鍙�
         }
         }
     }
     }
 
 
-    GPIOx->INTCLR = (1 << n);       //清除掉因为模式配置可能产生的中断
+    GPIOx->INTCLR = (1 << n); //娓呴櫎鎺夊洜涓烘ā寮忛厤缃�彲鑳戒骇鐢熺殑涓�柇
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: EXTI_Open()
-* 功能说明: 指定引脚外部中断打开(即使能)
-* 输    入: GPIO_TypeDef * GPIOx    指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n         指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: EXTI_Open()
+* 鍔熻兘璇存槑: 鎸囧畾寮曡剼澶栭儴涓�柇鎵撳紑锛堝嵆浣胯兘锛�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx  鎸囧畾浜х敓澶栭儴涓�柇鐨凣PIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n         鎸囧畾浜х敓澶栭儴涓�柇鐨凣PIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n)
 void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n)
 {
 {
@@ -79,12 +79,12 @@ void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: EXTI_Close()
-* 功能说明: 指定引脚外部中断关闭(即禁能)
-* 输    入: GPIO_TypeDef * GPIOx    指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n         指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: EXTI_Close()
+* 鍔熻兘璇存槑: 鎸囧畾寮曡剼澶栭儴涓�柇鍏抽棴锛堝嵆绂佽兘锛�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx  鎸囧畾浜х敓澶栭儴涓�柇鐨凣PIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n         鎸囧畾浜х敓澶栭儴涓�柇鐨凣PIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n)
 void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n)
 {
 {
@@ -92,12 +92,12 @@ void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: EXTI_State()
-* 功能说明: 指定引脚是否触发了中断
-* 输    入: GPIO_TypeDef * GPIOx    指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n         指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-* 输    出: uint32_t    1 此引脚触发了中断    0 此引脚未触发中断
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: EXTI_State()
+* 鍔熻兘璇存槑: 鎸囧畾寮曡剼鏄�惁瑙﹀彂浜嗕腑鏂�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx  鎸囧畾浜х敓澶栭儴涓�柇鐨凣PIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n         鎸囧畾浜х敓澶栭儴涓�柇鐨凣PIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+* 杈�    鍑�: uint32_t  1 姝ゅ紩鑴氳Е鍙戜簡涓�柇    0 姝ゅ紩鑴氭湭瑙﹀彂涓�柇
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n)
 uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n)
 {
 {
@@ -105,25 +105,25 @@ uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: EXTI_RawState()
-* 功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
-* 输    入: GPIO_TypeDef * GPIOx    指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n         指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-* 输    出: uint32_t    1 此引脚满足过/了中断触发条件    0 此引脚未满足过/了中断触发条件
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: EXTI_RawState()
+* 鍔熻兘璇存槑: 鎸囧畾寮曡剼鏄�惁婊¤冻杩�/浜嗕腑鏂�Е鍙戞潯浠讹紝褰撴�涓�柇鍏抽棴鏃跺彲閫氳繃璋冪敤姝ゅ嚱鏁颁互鏌ヨ�鐨勬柟寮忔�娴嬪紩鑴氫笂鏄�惁婊¤冻杩�/浜嗕腑鏂�Е鍙戞潯浠�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx  鎸囧畾浜х敓澶栭儴涓�柇鐨凣PIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n         鎸囧畾浜х敓澶栭儴涓�柇鐨凣PIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+* 杈�    鍑�: uint32_t  1 姝ゅ紩鑴氭弧瓒宠繃/浜嗕腑鏂�Е鍙戞潯浠�    0 姝ゅ紩鑴氭湭婊¤冻杩�/浜嗕腑鏂�Е鍙戞潯浠�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t EXTI_RawState(GPIO_TypeDef *GPIOx, uint32_t n)
 uint32_t EXTI_RawState(GPIO_TypeDef *GPIOx, uint32_t n)
 {
 {
-    return (GPIOx->INTRAWSTAT >> 1) & 0x01;
+    return (GPIOx->INTRAWSTAT >> n) & 0x01;
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: EXTI_Clear()
-* 功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
-* 输    入: GPIO_TypeDef * GPIOx    指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n         指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-* 输    出: 无
-* 注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
+* 鍑芥暟鍚嶇О: EXTI_Clear()
+* 鍔熻兘璇存槑: 鎸囧畾寮曡剼澶栭儴涓�柇娓呴櫎锛堝嵆娓呴櫎涓�柇鏍囧織锛屼互鍏嶅啀娆¤繘鍏ユ�涓�柇锛�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx  鎸囧畾浜х敓澶栭儴涓�柇鐨凣PIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n         鎸囧畾浜х敓澶栭儴涓�柇鐨凣PIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鍙�兘娓呴櫎杈规部瑙﹀彂涓�柇鐨勬爣蹇楋紝鐢靛钩瑙﹀彂涓�柇鐨勬爣蹇楁棤娉曟竻闄わ紝鍙�兘鍦ㄥ紩鑴氱數骞充笉绗﹀悎涓�柇瑙﹀彂鏉′欢鍚庣‖浠惰嚜鍔ㄦ竻闄�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n)
 void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n)
 {
 {

+ 11 - 13
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_exti.h

@@ -1,20 +1,18 @@
 #ifndef __SWM320_EXTI_H__
 #ifndef __SWM320_EXTI_H__
 #define __SWM320_EXTI_H__
 #define __SWM320_EXTI_H__
 
 
-void EXTI_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t mode);     //指定引脚外部中断初始化
-void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n);                    //指定引脚外部中断打开(即使能)
-void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n);                   //指定引脚外部中断关闭(即禁能)
+void EXTI_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t mode); //鎸囧畾寮曡剼澶栭儴涓�柇鍒濆�鍖�
+void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n);                //鎸囧畾寮曡剼澶栭儴涓�柇鎵撳紑锛堝嵆浣胯兘锛�
+void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n);               //鎸囧畾寮曡剼澶栭儴涓�柇鍏抽棴锛堝嵆绂佽兘锛�
 
 
-uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n);               //指定引脚是否触发了中断
-uint32_t EXTI_RawState(GPIO_TypeDef *GPIOx, uint32_t n);            //指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
-void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n);                   //指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
-
-
-#define EXTI_FALL_EDGE  0x00    //下降沿触发中断
-#define EXTI_RISE_EDGE  0x01    //上升沿触发中断
-#define EXTI_BOTH_EDGE  0x02    //双边沿触发中断
-#define EXTI_LOW_LEVEL  0x10    //低电平触发中断
-#define EXTI_HIGH_LEVEL 0x11    //高电平触发中断
+uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n);    //鎸囧畾寮曡剼鏄�惁瑙﹀彂浜嗕腑鏂�
+uint32_t EXTI_RawState(GPIO_TypeDef *GPIOx, uint32_t n); //鎸囧畾寮曡剼鏄�惁婊¤冻杩�/浜嗕腑鏂�Е鍙戞潯浠讹紝褰撴�涓�柇鍏抽棴鏃跺彲閫氳繃璋冪敤姝ゅ嚱鏁颁互鏌ヨ�鐨勬柟寮忔�娴嬪紩鑴氫笂鏄�惁婊¤冻杩�/浜嗕腑鏂�Е鍙戞潯浠�
+void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n);        //鎸囧畾寮曡剼澶栭儴涓�柇娓呴櫎锛堝嵆娓呴櫎涓�柇鏍囧織锛屼互鍏嶅啀娆¤繘鍏ユ�涓�柇锛�
 
 
+#define EXTI_FALL_EDGE 0x00  //涓嬮檷娌胯Е鍙戜腑鏂�
+#define EXTI_RISE_EDGE 0x01  //涓婂崌娌胯Е鍙戜腑鏂�
+#define EXTI_BOTH_EDGE 0x02  //鍙岃竟娌胯Е鍙戜腑鏂�
+#define EXTI_LOW_LEVEL 0x10  //浣庣數骞宠Е鍙戜腑鏂�
+#define EXTI_HIGH_LEVEL 0x11 //楂樼數骞宠Е鍙戜腑鏂�
 
 
 #endif //__SWM320_EXTI_H__
 #endif //__SWM320_EXTI_H__

+ 59 - 59
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_flash.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* ÎļþÃû³Æ: SWM320_flash.c
-* ¹¦ÄÜ˵Ã÷: ʹÓÃоƬµÄIAP¹¦Äܽ«Æ¬ÉÏFlashÄ£Äâ³ÉEEPROMÀ´±£´æÊý¾Ý£¬µôµçºó²»¶ªÊ§
-* ¼¼ÊõÖ§³Ö: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ×¢ÒâÊÂÏî:
-* °æ±¾ÈÕÆÚ: V1.1.0      2017Äê10ÔÂ25ÈÕ
-* Éý¼¶¼Ç¼:
+* 文件�称: SWM320_flash.c
+* 功能说明: 使用芯片的IAP功能将片上Flash模拟�EEPROM��存数�,掉电��丢失
+* 技术支�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注�事项:
+* 版本日期: V1.1.0      2017年10月25日
+* �级记录:
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
 * @attention
 * @attention
 *
 *
@@ -19,77 +19,77 @@
 #include "SWM320.h"
 #include "SWM320.h"
 #include "SWM320_flash.h"
 #include "SWM320_flash.h"
 
 
+IAP_Cache_Reset_t IAP_Cache_Reset = (IAP_Cache_Reset_t)0x11000601;
+IAP_Flash_Param_t IAP_Flash_Param = (IAP_Flash_Param_t)0x11000681;
+IAP_Flash_Erase_t IAP_Flash_Erase = (IAP_Flash_Erase_t)0x11000781;
+IAP_Flash_Write_t IAP_Flash_Write = (IAP_Flash_Write_t)0x11000801;
 
 
-__attribute__((section("PlaceInRAM")))
-static void switchTo80M(void)
+/******************************************************************************************************************************************
+* 函数�称: FLASH_Erase()
+* 功能说明: 片内Flash擦除
+* 输    入: uint32_t addr         擦除地�,扇区大�为4K Byte
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void FLASH_Erase(uint32_t addr)
 {
 {
-    uint32_t i;
+    __disable_irq();
 
 
-    for (i = 0; i < 50; i++) __NOP();
+    IAP_Flash_Erase(addr / 0x1000);
 
 
-    FLASH->CFG0 = 0x4bf;
-    FLASH->CFG1 = 0xabfc7a6e;
+    IAP_Cache_Reset();
 
 
-    for (i = 0; i < 50; i++) __NOP();
+    __enable_irq();
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: FLASH_Erase()
-* ¹¦ÄÜ˵Ã÷: ƬÄÚFlash²Á³ý
-* Êä    Èë: uint32_t addr           ²Á³ýµØÖ·
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: FLASH_Write()
+* 功能说明: 片内Flash写入
+* 输    入: uint32_t addr         写入地�
+*           uint32_t buff[]         �写入的数�
+*           uint32_t count          �写入数�的个数,以字为��,且必须是4的整数�,�最少写入4个字
+* 输    出: 无
+* 注�事项: 写入数�个数必须是4的整数�,�最少写入4个字
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
-void FLASH_Erase(uint32_t addr)
+void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count)
 {
 {
-//  switchTo80M();
+    __disable_irq();
 
 
-    FLASH->ERASE = addr | ((uint32_t)1 << FLASH_ERASE_REQ_Pos);
-    while ((FLASH->STAT & FLASH_STAT_ERASE_GOING_Msk) == 0);
-    while ((FLASH->STAT & FLASH_STAT_ERASE_GOING_Msk) == 1);
+    IAP_Flash_Write(addr, (uint32_t)buff, count / 4);
 
 
-    FLASH->ERASE = 0;
+    IAP_Cache_Reset();
 
 
-//  switchTo40M();
+    __enable_irq();
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: FLASH_Write()
-* ¹¦ÄÜ˵Ã÷: ƬÄÚFlashдÈë
-* Êä    Èë: uint32_t addr           дÈëµØÖ·
-*           uint32_t buff[]         ҪдÈëµÄÊý¾Ý
-*           uint32_t size           ҪдÈëÊý¾ÝµÄ¸öÊý£¬×ÖΪµ¥Î»
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: Flash_Param_at_xMHz()
+* 功能说明: 将Flash�数设置�xMHz主频下�行时所需的�数
+* 输    入: uint32_t x        ��值
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
-void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t size)
+void Flash_Param_at_xMHz(uint32_t x)
 {
 {
-    uint32_t i, j;
-
-    switchTo80M();
-
-    FLASH->CACHE |= (1 << FLASH_CACHE_PROG_Pos);
-
-    for (i = 0; i < size / 4; i++)
+    __disable_irq();
+    switch (x)
     {
     {
-        FLASH->ADDR = addr + i * 4 * 4;
-
-        for (j = 0; j < 4; j++)
-            FLASH->DATA = buff[i * 4 + j];
-        while ((FLASH->STAT & FLASH_STAT_FIFO_EMPTY_Msk) == 0) __NOP();
-    }
-    if ((size % 4) != 0)
-    {
-        FLASH->ADDR = addr + i * 4 * 4;
-
-        for (j = 0; j < size % 4; j++)
-            FLASH->DATA = buff[i * 4 + j];
-        while ((FLASH->STAT & FLASH_STAT_FIFO_EMPTY_Msk) == 0) __NOP();
+    case 30:
+        IAP_Flash_Param(0x489, 0xabf41f25);
+        break;
+
+    case 40:
+        IAP_Flash_Param(0x489, 0xabf42929);
+        break;
+
+    case 80:
+        IAP_Flash_Param(0x489, 0xabf8524d);
+        break;
+
+    case 120:
+    default:
+        IAP_Flash_Param(0x48a, 0xabfc7a6e);
+        break;
     }
     }
-    while (FLASH->STAT & FLASH_STAT_PROG_GOING_Msk);
-
-    FLASH->CACHE |= (1 << FLASH_CACHE_CLEAR_Pos);
-    FLASH->CACHE = 0;
-
-//  switchTo40M();
+    __enable_irq();
 }
 }

+ 12 - 2
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_flash.h

@@ -1,9 +1,19 @@
 #ifndef __SWM320_FLASH_H__
 #ifndef __SWM320_FLASH_H__
 #define __SWM320_FLASH_H__
 #define __SWM320_FLASH_H__
 
 
-
 void FLASH_Erase(uint32_t addr);
 void FLASH_Erase(uint32_t addr);
-void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t size);
+void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count);
+
+void Flash_Param_at_xMHz(uint32_t x);
+
+typedef void (*IAP_Cache_Reset_t)(void);
+typedef void (*IAP_Flash_Param_t)(uint32_t cfg0, uint32_t cfg1);
+typedef void (*IAP_Flash_Erase_t)(uint32_t sector);
+typedef void (*IAP_Flash_Write_t)(uint32_t flash_addr, uint32_t ram_addr, uint32_t count);
 
 
+extern IAP_Cache_Reset_t IAP_Cache_Reset;
+extern IAP_Flash_Param_t IAP_Flash_Param;
+extern IAP_Flash_Erase_t IAP_Flash_Erase;
+extern IAP_Flash_Write_t IAP_Flash_Write;
 
 
 #endif //__SWM320_FLASH_H__
 #endif //__SWM320_FLASH_H__

+ 173 - 75
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_gpio.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 文件名称: SWM320_gpio.c
-* 功能说明: SWM320单片机的通用输入输出功能驱动库
-* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* 注意事项:
-* 版本日期: V1.1.0      2017年10月25日
-* 升级记录:
+* 鏂囦欢鍚嶇О: SWM320_gpio.c
+* 鍔熻兘璇存槑: SWM320鍗曠墖鏈虹殑閫氱敤杈撳叆杈撳嚭鍔熻兘椹卞姩搴�
+* 鎶€鏈�敮鎸�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 娉ㄦ剰浜嬮」:
+* 鐗堟湰鏃ユ湡: V1.1.0      2017骞�10鏈�25鏃�
+* 鍗囩骇璁板綍:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -21,17 +21,16 @@
 #include "SWM320.h"
 #include "SWM320.h"
 #include "SWM320_gpio.h"
 #include "SWM320_gpio.h"
 
 
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: GPIO_Init()
-* 功能说明: 引脚初始化,包含引脚方向、上拉电阻、下拉电阻、开漏输出
-* 输    入: GPIO_TypeDef * GPIOx        指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n             指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-*           uint32_t dir           引脚方向,0 输入        1 输出
-*           uint32_t pull_up       上拉电阻,0 关闭上拉    1 开启上拉
-*           uint32_t pull_down     下拉电阻,0 关闭下拉    1 开启下拉
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: GPIO_Init()
+* 鍔熻兘璇存槑: 寮曡剼鍒濆�鍖栵紝鍖呭惈寮曡剼鏂瑰悜銆佷笂鎷夌數闃汇€佷笅鎷夌數闃�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+*           uint32_t dir           寮曡剼鏂瑰悜锛�0 杈撳叆        1 杈撳嚭
+*           uint32_t pull_up       涓婃媺鐢甸樆锛�0 鍏抽棴涓婃媺    1 寮€鍚�笂鎷�
+*           uint32_t pull_down     涓嬫媺鐢甸樆锛�0 鍏抽棴涓嬫媺    1 寮€鍚�笅鎷�
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: GPIOA銆丟PIOC銆丟PIOM銆丟PIOP鍙�湁涓婃媺锛孏PIOB銆丟PION鍙�湁涓嬫媺锛圥N0銆丳N1銆丳N2涓変釜寮曡剼鏈変笂鎷夋病涓嬫媺锛�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down)
 void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down)
 {
 {
@@ -40,7 +39,7 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
     case ((uint32_t)GPIOA):
     case ((uint32_t)GPIOA):
         SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOA_Pos);
         SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOA_Pos);
 
 
-        PORT_Init(PORTA, n, 0, 1);          //PORTA.PINn引脚配置为GPIO功能,数字输入开启
+        PORT_Init(PORTA, n, 0, 1); //PORTA.PINn寮曡剼閰嶇疆涓篏PIO鍔熻兘锛屾暟瀛楄緭鍏ュ紑鍚�
         if (dir == 1)
         if (dir == 1)
         {
         {
             GPIOA->DIR |= (0x01 << n);
             GPIOA->DIR |= (0x01 << n);
@@ -59,7 +58,7 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
     case ((uint32_t)GPIOB):
     case ((uint32_t)GPIOB):
         SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOB_Pos);
         SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOB_Pos);
 
 
-        PORT_Init(PORTB, n, 0, 1);          //PORTB.PINn引脚配置为GPIO功能,数字输入开启
+        PORT_Init(PORTB, n, 0, 1); //PORTB.PINn寮曡剼閰嶇疆涓篏PIO鍔熻兘锛屾暟瀛楄緭鍏ュ紑鍚�
         if (dir == 1)
         if (dir == 1)
         {
         {
             GPIOB->DIR |= (0x01 << n);
             GPIOB->DIR |= (0x01 << n);
@@ -78,7 +77,7 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
     case ((uint32_t)GPIOC):
     case ((uint32_t)GPIOC):
         SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOC_Pos);
         SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOC_Pos);
 
 
-        PORT_Init(PORTC, n, 0, 1);          //PORTC.PINn引脚配置为GPIO功能,数字输入开启
+        PORT_Init(PORTC, n, 0, 1); //PORTC.PINn寮曡剼閰嶇疆涓篏PIO鍔熻兘锛屾暟瀛楄緭鍏ュ紑鍚�
         if (dir == 1)
         if (dir == 1)
         {
         {
             GPIOC->DIR |= (0x01 << n);
             GPIOC->DIR |= (0x01 << n);
@@ -97,7 +96,7 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
     case ((uint32_t)GPIOM):
     case ((uint32_t)GPIOM):
         SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOM_Pos);
         SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOM_Pos);
 
 
-        PORT_Init(PORTM, n, 0, 1);          //PORTM.PINn引脚配置为GPIO功能,数字输入开启
+        PORT_Init(PORTM, n, 0, 1); //PORTM.PINn寮曡剼閰嶇疆涓篏PIO鍔熻兘锛屾暟瀛楄緭鍏ュ紑鍚�
         if (dir == 1)
         if (dir == 1)
         {
         {
             GPIOM->DIR |= (0x01 << n);
             GPIOM->DIR |= (0x01 << n);
@@ -116,7 +115,7 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
     case ((uint32_t)GPION):
     case ((uint32_t)GPION):
         SYS->CLKEN |= (0x01 << SYS_CLKEN_GPION_Pos);
         SYS->CLKEN |= (0x01 << SYS_CLKEN_GPION_Pos);
 
 
-        PORT_Init(PORTN, n, 0, 1);          //PORTN.PINn引脚配置为GPIO功能,数字输入开启
+        PORT_Init(PORTN, n, 0, 1); //PORTN.PINn寮曡剼閰嶇疆涓篏PIO鍔熻兘锛屾暟瀛楄緭鍏ュ紑鍚�
         if (dir == 1)
         if (dir == 1)
         {
         {
             GPION->DIR |= (0x01 << n);
             GPION->DIR |= (0x01 << n);
@@ -135,7 +134,7 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
     case ((uint32_t)GPIOP):
     case ((uint32_t)GPIOP):
         SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOP_Pos);
         SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOP_Pos);
 
 
-        PORT_Init(PORTP, n, 0, 1);          //PORTP.PINn引脚配置为GPIO功能,数字输入开启
+        PORT_Init(PORTP, n, 0, 1); //PORTP.PINn寮曡剼閰嶇疆涓篏PIO鍔熻兘锛屾暟瀛楄緭鍏ュ紑鍚�
         if (dir == 1)
         if (dir == 1)
         {
         {
             GPIOP->DIR |= (0x01 << n);
             GPIOP->DIR |= (0x01 << n);
@@ -154,12 +153,12 @@ void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up,
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: GPIO_SetBit()
-* 功能说明: 将参数指定的引脚电平置高
-* 输    入: GPIO_TypeDef * GPIOx        指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n             指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: GPIO_SetBit()
+* 鍔熻兘璇存槑: 灏嗗弬鏁版寚瀹氱殑寮曡剼鐢靛钩缃�珮
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n)
 void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n)
 {
 {
@@ -167,12 +166,12 @@ void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: GPIO_ClrBit()
-* 功能说明: 将参数指定的引脚电平置低
-* 输    入: GPIO_TypeDef * GPIOx        指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n             指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: GPIO_ClrBit()
+* 鍔熻兘璇存槑: 灏嗗弬鏁版寚瀹氱殑寮曡剼鐢靛钩缃�綆
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
 void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
 {
 {
@@ -180,12 +179,12 @@ void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: GPIO_InvBit()
-* 功能说明: 将参数指定的引脚电平反转
-* 输    入: GPIO_TypeDef * GPIOx        指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n             指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: GPIO_InvBit()
+* 鍔熻兘璇存槑: 灏嗗弬鏁版寚瀹氱殑寮曡剼鐢靛钩鍙嶈浆
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n)
 void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n)
 {
 {
@@ -193,12 +192,12 @@ void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: GPIO_GetBit()
-* 功能说明: 读取参数指定的引脚的电平状态
-* 输    入: GPIO_TypeDef * GPIOx        指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n             指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-* 输    出: 参数指定的引脚的电平状态    0 低电平    1 高电平
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: GPIO_GetBit()
+* 鍔熻兘璇存槑: 璇诲彇鍙傛暟鎸囧畾鐨勫紩鑴氱殑鐢靛钩鐘舵€�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+* 杈�    鍑�: 鍙傛暟鎸囧畾鐨勫紩鑴氱殑鐢靛钩鐘舵€�  0 浣庣數骞�   1 楂樼數骞�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n)
 uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n)
 {
 {
@@ -206,13 +205,13 @@ uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: GPIO_SetBits()
-* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高
-* 输    入: GPIO_TypeDef * GPIOx        指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n             指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-*           uint32_t w             指定要将引脚电平置高的引脚的个数
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: GPIO_SetBits()
+* 鍔熻兘璇存槑: 灏嗗弬鏁版寚瀹氱殑浠巒寮€濮嬬殑w浣嶈繛缁�紩鑴氱殑鐢靛钩缃�珮
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+*           uint32_t w             鎸囧畾瑕佸皢寮曡剼鐢靛钩缃�珮鐨勫紩鑴氱殑涓�暟
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
 void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
 {
 {
@@ -224,13 +223,13 @@ void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: GPIO_ClrBits()
-* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低
-* 输    入: GPIO_TypeDef * GPIOx        指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n             指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-*           uint32_t w             指定要将引脚电平置低的引脚的个数
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: GPIO_ClrBits()
+* 鍔熻兘璇存槑: 灏嗗弬鏁版寚瀹氱殑浠巒寮€濮嬬殑w浣嶈繛缁�紩鑴氱殑鐢靛钩缃�綆
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+*           uint32_t w             鎸囧畾瑕佸皢寮曡剼鐢靛钩缃�綆鐨勫紩鑴氱殑涓�暟
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
 void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
 {
 {
@@ -242,13 +241,13 @@ void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: GPIO_InvBits()
-* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转
-* 输    入: GPIO_TypeDef * GPIOx        指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n             指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-*           uint32_t w             指定要将引脚电平反转的引脚的个数
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: GPIO_InvBits()
+* 鍔熻兘璇存槑: 灏嗗弬鏁版寚瀹氱殑浠巒寮€濮嬬殑w浣嶈繛缁�紩鑴氱殑鐢靛钩鍙嶈浆
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+*           uint32_t w             鎸囧畾瑕佸皢寮曡剼鐢靛钩鍙嶈浆鐨勫紩鑴氱殑涓�暟
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
 void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
 {
 {
@@ -260,14 +259,14 @@ void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: GPIO_GetBits()
-* 功能说明: 读取参数指定的从n开始的w位连续引脚的电平状态
-* 输    入: GPIO_TypeDef * GPIOx        指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
-*           uint32_t n             指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-*           uint32_t w             指定要将引脚电平置高的引脚的个数
-* 输    出: 参数指定的从n开始的w位连续引脚的电平状态    0 低电平    1 高电平
-*           返回值的第0位表示引脚n的电平状态、返回值的第1位表示引脚n+1的电平状态... ...返回值的第w位表示引脚n+w的电平状态
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: GPIO_GetBits()
+* 鍔熻兘璇存槑: 璇诲彇鍙傛暟鎸囧畾鐨勪粠n寮€濮嬬殑w浣嶈繛缁�紩鑴氱殑鐢靛钩鐘舵€�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOM銆丟PION銆丟PIOP
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+*           uint32_t w             鎸囧畾瑕佸皢寮曡剼鐢靛钩缃�珮鐨勫紩鑴氱殑涓�暟
+* 杈�    鍑�: 鍙傛暟鎸囧畾鐨勪粠n寮€濮嬬殑w浣嶈繛缁�紩鑴氱殑鐢靛钩鐘舵€� 0 浣庣數骞�   1 楂樼數骞�
+*           杩斿洖鍊肩殑绗�0浣嶈〃绀哄紩鑴歯鐨勭數骞崇姸鎬併€佽繑鍥炲€肩殑绗�1浣嶈〃绀哄紩鑴歯+1鐨勭數骞崇姸鎬�... ...杩斿洖鍊肩殑绗瑆浣嶈〃绀哄紩鑴歯+w鐨勭數骞崇姸鎬�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
 uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
 {
 {
@@ -277,3 +276,102 @@ uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
 
 
     return ((GPIOx->DATA >> n) & bits);
     return ((GPIOx->DATA >> n) & bits);
 }
 }
+
+/******************************************************************************************************************************************
+* 鍑芥暟鍚嶇О: GPIO_AtomicSetBit()
+* 鍔熻兘璇存槑: 灏嗗弬鏁版寚瀹氱殑寮曡剼鐢靛钩缃�珮锛岀‘淇濆紩鑴氣€濊�-鏀�-鍐欌€滄搷浣滅殑鍘熷瓙鎬э紙涓嶈�涓�柇ISR鎵撴柇锛�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOD
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN14銆丳IN15
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 褰揋PIOx鐨�16涓�紩鑴氫腑锛屾湁浜涘湪涓诲惊鐜�腑鎿嶄綔锛屾湁浜涘湪涓�柇ISR涓�搷浣滄椂锛孏PIOx鐨勫紩鑴氬繀椤婚兘鐢℅PIO_Atomic绫诲瀷鍑芥暟鎿嶄綔
+******************************************************************************************************************************************/
+void GPIO_AtomicSetBit(GPIO_TypeDef *GPIOx, uint32_t n)
+{
+    *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 1;
+}
+
+/******************************************************************************************************************************************
+* 鍑芥暟鍚嶇О: GPIO_AtomicClrBit()
+* 鍔熻兘璇存槑: 灏嗗弬鏁版寚瀹氱殑寮曡剼鐢靛钩缃�綆锛岀‘淇濆紩鑴氣€濊�-鏀�-鍐欌€滄搷浣滅殑鍘熷瓙鎬э紙涓嶈�涓�柇ISR鎵撴柇锛�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOD
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN14銆丳IN15
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 褰揋PIOx鐨�16涓�紩鑴氫腑锛屾湁浜涘湪涓诲惊鐜�腑鎿嶄綔锛屾湁浜涘湪涓�柇ISR涓�搷浣滄椂锛孏PIOx鐨勫紩鑴氬繀椤婚兘鐢℅PIO_Atomic绫诲瀷鍑芥暟鎿嶄綔
+******************************************************************************************************************************************/
+void GPIO_AtomicClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
+{
+    *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 0;
+}
+
+/******************************************************************************************************************************************
+* 鍑芥暟鍚嶇О: GPIO_AtomicInvBit()
+* 鍔熻兘璇存槑: 灏嗗弬鏁版寚瀹氱殑寮曡剼鐢靛钩鍙嶈浆锛岀‘淇濆紩鑴氣€濊�-鏀�-鍐欌€滄搷浣滅殑鍘熷瓙鎬э紙涓嶈�涓�柇ISR鎵撴柇锛�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOD
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN14銆丳IN15
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 褰揋PIOx鐨�16涓�紩鑴氫腑锛屾湁浜涘湪涓诲惊鐜�腑鎿嶄綔锛屾湁浜涘湪涓�柇ISR涓�搷浣滄椂锛孏PIOx鐨勫紩鑴氬繀椤婚兘鐢℅PIO_Atomic绫诲瀷鍑芥暟鎿嶄綔
+******************************************************************************************************************************************/
+void GPIO_AtomicInvBit(GPIO_TypeDef *GPIOx, uint32_t n)
+{
+    *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 1 - *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4));
+}
+
+/******************************************************************************************************************************************
+* 鍑芥暟鍚嶇О: GPIO_AtomicSetBits()
+* 鍔熻兘璇存槑: 灏嗗弬鏁版寚瀹氱殑浠巒寮€濮嬬殑w浣嶈繛缁�紩鑴氱殑鐢靛钩缃�珮锛岀‘淇濆紩鑴氣€濊�-鏀�-鍐欌€滄搷浣滅殑鍘熷瓙鎬э紙涓嶈�涓�柇ISR鎵撴柇锛�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOD
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN14銆丳IN15
+*           uint32_t w      鎸囧畾瑕佸皢寮曡剼鐢靛钩缃�珮鐨勫紩鑴氱殑涓�暟
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 褰揋PIOx鐨�16涓�紩鑴氫腑锛屾湁浜涘湪涓诲惊鐜�腑鎿嶄綔锛屾湁浜涘湪涓�柇ISR涓�搷浣滄椂锛孏PIOx鐨勫紩鑴氬繀椤婚兘鐢℅PIO_Atomic绫诲瀷鍑芥暟鎿嶄綔
+******************************************************************************************************************************************/
+void GPIO_AtomicSetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
+{
+    uint32_t bits;
+
+    bits = 0xFFFFFF >> (24 - w);
+
+    __disable_irq();
+    GPIOx->DATA |= (bits << n);
+    __enable_irq();
+}
+
+/******************************************************************************************************************************************
+* 鍑芥暟鍚嶇О: GPIO_AtomicClrBits()
+* 鍔熻兘璇存槑: 灏嗗弬鏁版寚瀹氱殑浠巒寮€濮嬬殑w浣嶈繛缁�紩鑴氱殑鐢靛钩缃�綆锛岀‘淇濆紩鑴氣€濊�-鏀�-鍐欌€滄搷浣滅殑鍘熷瓙鎬э紙涓嶈�涓�柇ISR鎵撴柇锛�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOD
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN14銆丳IN15
+*           uint32_t w             鎸囧畾瑕佸皢寮曡剼鐢靛钩缃�綆鐨勫紩鑴氱殑涓�暟
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 褰揋PIOx鐨�16涓�紩鑴氫腑锛屾湁浜涘湪涓诲惊鐜�腑鎿嶄綔锛屾湁浜涘湪涓�柇ISR涓�搷浣滄椂锛孏PIOx鐨勫紩鑴氬繀椤婚兘鐢℅PIO_Atomic绫诲瀷鍑芥暟鎿嶄綔
+******************************************************************************************************************************************/
+void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
+{
+    uint32_t bits;
+
+    bits = 0xFFFFFF >> (24 - w);
+
+    __disable_irq();
+    GPIOx->DATA &= ~(bits << n);
+    __enable_irq();
+}
+
+/******************************************************************************************************************************************
+* 鍑芥暟鍚嶇О: GPIO_AtomicInvBits()
+* 鍔熻兘璇存槑: 灏嗗弬鏁版寚瀹氱殑浠巒寮€濮嬬殑w浣嶈繛缁�紩鑴氱殑鐢靛钩鍙嶈浆锛岀‘淇濆紩鑴氣€濊�-鏀�-鍐欌€滄搷浣滅殑鍘熷瓙鎬э紙涓嶈�涓�柇ISR鎵撴柇锛�
+* 杈�    鍏�: GPIO_TypeDef * GPIOx      鎸囧畾GPIO绔�彛锛屾湁鏁堝€煎寘鎷珿PIOA銆丟PIOB銆丟PIOC銆丟PIOD
+*           uint32_t n             鎸囧畾GPIO寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN14銆丳IN15
+*           uint32_t w             鎸囧畾瑕佸皢寮曡剼鐢靛钩鍙嶈浆鐨勫紩鑴氱殑涓�暟
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 褰揋PIOx鐨�16涓�紩鑴氫腑锛屾湁浜涘湪涓诲惊鐜�腑鎿嶄綔锛屾湁浜涘湪涓�柇ISR涓�搷浣滄椂锛孏PIOx鐨勫紩鑴氬繀椤婚兘鐢℅PIO_Atomic绫诲瀷鍑芥暟鎿嶄綔
+******************************************************************************************************************************************/
+void GPIO_AtomicInvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
+{
+    uint32_t bits;
+
+    bits = 0xFFFFFF >> (24 - w);
+
+    __disable_irq();
+    GPIOx->DATA ^= (bits << n);
+    __enable_irq();
+}

+ 15 - 10
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_gpio.h

@@ -1,17 +1,22 @@
 #ifndef __SWM320_GPIO_H__
 #ifndef __SWM320_GPIO_H__
 #define __SWM320_GPIO_H__
 #define __SWM320_GPIO_H__
 
 
+void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //寮曡剼鍒濆�鍖栵紝鍖呭惈寮曡剼鏂瑰悜銆佷笂鎷夌數闃汇€佷笅鎷夌數闃�
 
 
-void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down);    //引脚初始化,包含引脚方向、上拉电阻、下拉电阻
-
-void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n);                      //将参数指定的引脚电平置高
-void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n);                      //将参数指定的引脚电平置低
-void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n);                      //将参数指定的引脚电平反转
-uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n);                  //读取参数指定的引脚的电平状态
-void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);         //将参数指定的从n开始的w位连续引脚的电平置高
-void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);         //将参数指定的从n开始的w位连续引脚的电平置低
-void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);         //将参数指定的从n开始的w位连续引脚的电平反转
-uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);     //读取参数指定的从n开始的w位连续引脚的电平状态
+void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n);                  //灏嗗弬鏁版寚瀹氱殑寮曡剼鐢靛钩缃�珮
+void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n);                  //灏嗗弬鏁版寚瀹氱殑寮曡剼鐢靛钩缃�綆
+void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n);                  //灏嗗弬鏁版寚瀹氱殑寮曡剼鐢靛钩鍙嶈浆
+uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n);              //璇诲彇鍙傛暟鎸囧畾鐨勫紩鑴氱殑鐢靛钩鐘舵€�
+void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);     //灏嗗弬鏁版寚瀹氱殑浠巒寮€濮嬬殑w浣嶈繛缁�紩鑴氱殑鐢靛钩缃�珮
+void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);     //灏嗗弬鏁版寚瀹氱殑浠巒寮€濮嬬殑w浣嶈繛缁�紩鑴氱殑鐢靛钩缃�綆
+void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);     //灏嗗弬鏁版寚瀹氱殑浠巒寮€濮嬬殑w浣嶈繛缁�紩鑴氱殑鐢靛钩鍙嶈浆
+uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //璇诲彇鍙傛暟鎸囧畾鐨勪粠n寮€濮嬬殑w浣嶈繛缁�紩鑴氱殑鐢靛钩鐘舵€�
 
 
+void GPIO_AtomicSetBit(GPIO_TypeDef *GPIOx, uint32_t n);
+void GPIO_AtomicClrBit(GPIO_TypeDef *GPIOx, uint32_t n);
+void GPIO_AtomicInvBit(GPIO_TypeDef *GPIOx, uint32_t n);
+void GPIO_AtomicSetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
+void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
+void GPIO_AtomicInvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
 
 
 #endif //__SWM320_GPIO_H__
 #endif //__SWM320_GPIO_H__

+ 100 - 31
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_i2c.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* ÎļþÃû³Æ: SWM320_i2c.c
-* ¹¦ÄÜ˵Ã÷: SWM320µ¥Æ¬»úµÄI2C´®Ðнӿڹ¦ÄÜÇý¶¯¿â
-* ¼¼ÊõÖ§³Ö: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ×¢ÒâÊÂÏî:
-* °æ±¾ÈÕÆÚ: V1.1.0      2017Äê10ÔÂ25ÈÕ
-* Éý¼¶¼Ç¼:
+* 文件�称: SWM320_i2c.c
+* 功能说明: SWM320�片机的I2C串行接�功能驱动库
+* 技术支�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注�事项:
+* 版本日期: V1.1.0      2017年10月25日
+* �级记录:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -22,12 +22,12 @@
 #include "SWM320_i2c.h"
 #include "SWM320_i2c.h"
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: I2C_Init()
-* ¹¦ÄÜ˵Ã÷: I2C³õʼ»¯
-* Êä    Èë: I2C_TypeDef * I2Cx      Ö¸¶¨Òª±»ÉèÖõÄI2C£¬ÓÐЧֵ°üÀ¨I2C0¡¢I2C1
-*           I2C_InitStructure * initStruct  °üº¬I2CÏà¹ØÉ趨ֵµÄ½á¹¹Ìå
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: Ä£¿éÖ»Äܹ¤×÷ÓÚÖ÷»úģʽ
+* 函数�称: I2C_Init()
+* 功能说明: I2C�始化
+* 输    入: I2C_TypeDef * I2Cx        指定�被设置的I2C,有效值包括I2C0�I2C1
+*           I2C_InitStructure * initStruct  包�I2C相关设定值的结构体
+* 输    出: 无
+* 注�事项: 模��能工作于主机模�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
 void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
 {
 {
@@ -42,13 +42,13 @@ void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
         break;
         break;
     }
     }
 
 
-    I2C_Close(I2Cx);    //һЩ¹Ø¼ü¼Ä´æÆ÷Ö»ÄÜÔÚI2C¹Ø±ÕʱÉèÖÃ
+    I2C_Close(I2Cx); //一些关键寄存器�能在I2C关闭时设置
 
 
     if (initStruct->Master == 1)
     if (initStruct->Master == 1)
     {
     {
         I2Cx->CLKDIV = SystemCoreClock / 5 / initStruct->MstClk;
         I2Cx->CLKDIV = SystemCoreClock / 5 / initStruct->MstClk;
 
 
-        I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos);    //ʹÄÜÖжÏ֮ǰÏÈÇå³ýÖжϱêÖ¾
+        I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos); //使能中断之�先清除中断标志
         I2Cx->CTRL &= ~I2C_CTRL_MSTIE_Msk;
         I2Cx->CTRL &= ~I2C_CTRL_MSTIE_Msk;
         I2Cx->CTRL |= (initStruct->MstIEn << I2C_CTRL_MSTIE_Pos);
         I2Cx->CTRL |= (initStruct->MstIEn << I2C_CTRL_MSTIE_Pos);
 
 
@@ -86,21 +86,21 @@ void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
                        (initStruct->Addr7b << I2C_SLVCR_ADDR7b_Pos) |
                        (initStruct->Addr7b << I2C_SLVCR_ADDR7b_Pos) |
                        (initStruct->SlvAddr << I2C_SLVCR_ADDR_Pos);
                        (initStruct->SlvAddr << I2C_SLVCR_ADDR_Pos);
 
 
-        I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk;  //ÇåÖжϱêÖ¾
+        I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk; //清中断标志
         I2Cx->SLVCR &= ~(I2C_SLVCR_IM_RXEND_Msk | I2C_SLVCR_IM_TXEND_Msk | I2C_SLVCR_IM_STADET_Msk | I2C_SLVCR_IM_STODET_Msk |
         I2Cx->SLVCR &= ~(I2C_SLVCR_IM_RXEND_Msk | I2C_SLVCR_IM_TXEND_Msk | I2C_SLVCR_IM_STADET_Msk | I2C_SLVCR_IM_STODET_Msk |
                          I2C_SLVCR_IM_RDREQ_Msk | I2C_SLVCR_IM_WRREQ_Msk);
                          I2C_SLVCR_IM_RDREQ_Msk | I2C_SLVCR_IM_WRREQ_Msk);
-        I2Cx->SLVCR |= ((initStruct->SlvRxEndIEn  ? 0 : 1) << I2C_SLVCR_IM_RXEND_Pos)  |
-                       ((initStruct->SlvTxEndIEn  ? 0 : 1) << I2C_SLVCR_IM_TXEND_Pos)  |
+        I2Cx->SLVCR |= ((initStruct->SlvRxEndIEn ? 0 : 1) << I2C_SLVCR_IM_RXEND_Pos) |
+                       ((initStruct->SlvTxEndIEn ? 0 : 1) << I2C_SLVCR_IM_TXEND_Pos) |
                        ((initStruct->SlvSTADetIEn ? 0 : 1) << I2C_SLVCR_IM_STADET_Pos) |
                        ((initStruct->SlvSTADetIEn ? 0 : 1) << I2C_SLVCR_IM_STADET_Pos) |
                        ((initStruct->SlvSTODetIEn ? 0 : 1) << I2C_SLVCR_IM_STODET_Pos) |
                        ((initStruct->SlvSTODetIEn ? 0 : 1) << I2C_SLVCR_IM_STODET_Pos) |
-                       ((initStruct->SlvRdReqIEn  ? 0 : 1) << I2C_SLVCR_IM_RDREQ_Pos)  |
-                       ((initStruct->SlvWrReqIEn  ? 0 : 1) << I2C_SLVCR_IM_WRREQ_Pos);
+                       ((initStruct->SlvRdReqIEn ? 0 : 1) << I2C_SLVCR_IM_RDREQ_Pos) |
+                       ((initStruct->SlvWrReqIEn ? 0 : 1) << I2C_SLVCR_IM_WRREQ_Pos);
 
 
         switch ((uint32_t)I2Cx)
         switch ((uint32_t)I2Cx)
         {
         {
         case ((uint32_t)I2C0):
         case ((uint32_t)I2C0):
             if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
             if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
-                    initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
+                initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
             {
             {
                 NVIC_EnableIRQ(I2C0_IRQn);
                 NVIC_EnableIRQ(I2C0_IRQn);
             }
             }
@@ -112,7 +112,7 @@ void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
 
 
         case ((uint32_t)I2C1):
         case ((uint32_t)I2C1):
             if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
             if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
-                    initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
+                initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
             {
             {
                 NVIC_EnableIRQ(I2C1_IRQn);
                 NVIC_EnableIRQ(I2C1_IRQn);
             }
             }
@@ -126,11 +126,11 @@ void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: I2C_Open()
-* ¹¦ÄÜ˵Ã÷: I2C´ò¿ª£¬ÔÊÐíÊÕ·¢
-* Êä    Èë: I2C_TypeDef * I2Cx      Ö¸¶¨Òª±»ÉèÖõÄI2C£¬ÓÐЧֵ°üÀ¨I2C0¡¢I2C1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: I2C_Open()
+* 功能说明: I2C打开,�许收�
+* 输    入: I2C_TypeDef * I2Cx        指定�被设置的I2C,有效值包括I2C0�I2C1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void I2C_Open(I2C_TypeDef *I2Cx)
 void I2C_Open(I2C_TypeDef *I2Cx)
 {
 {
@@ -138,13 +138,82 @@ void I2C_Open(I2C_TypeDef *I2Cx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: I2C_Close()
-* ¹¦ÄÜ˵Ã÷: I2C¹Ø±Õ£¬½ûÖ¹ÊÕ·¢
-* Êä    Èë: I2C_TypeDef * I2Cx      Ö¸¶¨Òª±»ÉèÖõÄI2C£¬ÓÐЧֵ°üÀ¨I2C0¡¢I2C1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: I2C_Close()
+* 功能说明: I2C关闭,�止收�
+* 输    入: I2C_TypeDef * I2Cx        指定�被设置的I2C,有效值包括I2C0�I2C1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void I2C_Close(I2C_TypeDef *I2Cx)
 void I2C_Close(I2C_TypeDef *I2Cx)
 {
 {
     I2Cx->CTRL &= ~I2C_CTRL_EN_Msk;
     I2Cx->CTRL &= ~I2C_CTRL_EN_Msk;
 }
 }
+
+/******************************************************************************************************************************************
+* 函数�称: I2C_Start()
+* 功能说明: 产生起始信�并��设备地�
+* 输    入: I2C_TypeDef * I2Cx        指定�被设置的I2C,有效值包括I2C0�I2C1
+*           uint8_t addr            设备地�
+* 输    出: uint8_t                   1 接收到ACK   0 接收到NACK
+* 注�事项: 无
+******************************************************************************************************************************************/
+uint8_t I2C_Start(I2C_TypeDef *I2Cx, uint8_t addr)
+{
+    I2Cx->MSTDAT = addr;
+    I2Cx->MSTCMD = (1 << I2C_MSTCMD_STA_Pos) |
+                   (1 << I2C_MSTCMD_WR_Pos); //��起始�和从机地�
+    while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
+        __NOP(); //等待��完�
+
+    return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
+}
+
+/******************************************************************************************************************************************
+* 函数�称: I2C_Stop()
+* 功能说明: 产生�止信�
+* 输    入: I2C_TypeDef * I2Cx        指定�被设置的I2C,有效值包括I2C0�I2C1
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void I2C_Stop(I2C_TypeDef *I2Cx)
+{
+    I2Cx->MSTCMD = (1 << I2C_MSTCMD_STO_Pos);
+    while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
+        __NOP(); //等待��完�
+}
+
+/******************************************************************************************************************************************
+* 函数�称: I2C_Write()
+* 功能说明: 写入一个数�
+* 输    入: I2C_TypeDef * I2Cx        指定�被设置的I2C,有效值包括I2C0�I2C1
+*           uint8_t data            �写的数�
+* 输    出: uint8_t                   1 接收到ACK   0 接收到NACK
+* 注�事项: 无
+******************************************************************************************************************************************/
+uint8_t I2C_Write(I2C_TypeDef *I2Cx, uint8_t data)
+{
+    I2Cx->MSTDAT = data;
+    I2Cx->MSTCMD = (1 << I2C_MSTCMD_WR_Pos);
+    while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
+        __NOP(); //等待��完�
+
+    return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
+}
+
+/******************************************************************************************************************************************
+* 函数�称: I2C_Read()
+* 功能说明: 读�一个数�
+* 输    入: I2C_TypeDef * I2Cx        指定�被设置的I2C,有效值包括I2C0�I2C1
+*           uint8_t ack             1 ��ACK   0 ��NACK
+* 输    出: uint8_t                   读�到的数�
+* 注�事项: 无
+******************************************************************************************************************************************/
+uint8_t I2C_Read(I2C_TypeDef *I2Cx, uint8_t ack)
+{
+    I2Cx->MSTCMD = (1 << I2C_MSTCMD_RD_Pos) |
+                   ((ack ? 0 : 1) << I2C_MSTCMD_ACK_Pos);
+    while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
+        __NOP(); //等待接收完�
+
+    return I2Cx->MSTDAT;
+}

+ 16 - 12
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_i2c.h

@@ -3,25 +3,29 @@
 
 
 typedef struct
 typedef struct
 {
 {
-    uint8_t  Master;        //1 主机模式
-    uint8_t  Addr7b;        //1 7位地址     0 10位地址
+    uint8_t Master; //1 涓绘満妯″紡
+    uint8_t Addr7b; //1 7浣嶅湴鍧€     0 10浣嶅湴鍧€
 
 
-    uint32_t MstClk;        //主机传输时钟频率
-    uint8_t  MstIEn;        //主机模式中断使能
+    uint32_t MstClk; //涓绘満浼犺緭鏃堕挓棰戠巼
+    uint8_t MstIEn;  //涓绘満妯″紡涓�柇浣胯兘
 
 
-    uint16_t SlvAddr;       //从机地址
-    uint8_t  SlvRxEndIEn;   //从机接收完成中断使能
-    uint8_t  SlvTxEndIEn;   //从机发送完成中断使能
-    uint8_t  SlvSTADetIEn;  //从机检测到起始中断使能
-    uint8_t  SlvSTODetIEn;  //从机检测到终止中断使能
-    uint8_t  SlvRdReqIEn;   //从机接收到读请求中断使能
-    uint8_t  SlvWrReqIEn;   //从机接收到写请求中断使能
+    uint16_t SlvAddr;     //浠庢満鍦板潃
+    uint8_t SlvRxEndIEn;  //浠庢満鎺ユ敹瀹屾垚涓�柇浣胯兘
+    uint8_t SlvTxEndIEn;  //浠庢満鍙戦€佸畬鎴愪腑鏂�娇鑳�
+    uint8_t SlvSTADetIEn; //浠庢満妫€娴嬪埌璧峰�涓�柇浣胯兘
+    uint8_t SlvSTODetIEn; //浠庢満妫€娴嬪埌缁堟�涓�柇浣胯兘
+    uint8_t SlvRdReqIEn;  //浠庢満鎺ユ敹鍒拌�璇锋眰涓�柇浣胯兘
+    uint8_t SlvWrReqIEn;  //浠庢満鎺ユ敹鍒板啓璇锋眰涓�柇浣胯兘
 } I2C_InitStructure;
 } I2C_InitStructure;
 
 
-
 void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct);
 void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct);
 
 
 void I2C_Open(I2C_TypeDef *I2Cx);
 void I2C_Open(I2C_TypeDef *I2Cx);
 void I2C_Close(I2C_TypeDef *I2Cx);
 void I2C_Close(I2C_TypeDef *I2Cx);
 
 
+uint8_t I2C_Start(I2C_TypeDef *I2Cx, uint8_t addr);
+void I2C_Stop(I2C_TypeDef *I2Cx);
+uint8_t I2C_Write(I2C_TypeDef *I2Cx, uint8_t data);
+uint8_t I2C_Read(I2C_TypeDef *I2Cx, uint8_t ack);
+
 #endif //__SWM320_I2C_H__
 #endif //__SWM320_I2C_H__

+ 58 - 170
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_lcd.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 文件名称: SWM320_lcd.c
-* 功能说明: SWM320单片机的LCD功能驱动库
-* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* 注意事项:
-* 版本日期: V1.1.0      2017年10月25日
-* 升级记录:
+* 鏂囦欢鍚嶇О: SWM320_lcd.c
+* 鍔熻兘璇存槑: SWM320鍗曠墖鏈虹殑LCD鍔熻兘椹卞姩搴�
+* 鎶€鏈�敮鎸�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 娉ㄦ剰浜嬮」:
+* 鐗堟湰鏃ユ湡: V1.1.0      2017骞�10鏈�25鏃�
+* 鍗囩骇璁板綍:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -24,12 +24,12 @@
 #include <string.h>
 #include <string.h>
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: LCD_Init()
-* 功能说明: LCD初始化
-* 输    入: LCD_TypeDef * LCDx  指定要被设置的LCD,有效值包括LCD
-*           LCD_InitStructure * initStruct    包含LCD相关设定值的结构体
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: LCD_Init()
+* 鍔熻兘璇存槑: LCD鍒濆�鍖�
+* 杈�    鍏�: LCD_TypeDef * LCDx    鎸囧畾瑕佽�璁剧疆鐨凩CD锛屾湁鏁堝€煎寘鎷琇CD
+*           LCD_InitStructure * initStruct    鍖呭惈LCD鐩稿叧璁惧畾鍊肩殑缁撴瀯浣�
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct)
 void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct)
 {
 {
@@ -40,56 +40,24 @@ void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct)
         break;
         break;
     }
     }
 
 
-    if (initStruct->Interface == LCD_INTERFACE_RGB)
-    {
-        LCDx->START = (0 << LCD_START_MPUEN_Pos);
-
-        if (initStruct->Dir == LCD_DIR_LANDSCAPE)
-        {
-            LCDx->CR0 = ((initStruct->HnPixel - 1) << LCD_CR0_HPIX_Pos) |
-                        ((initStruct->VnPixel - 1) << LCD_CR0_VPIX_Pos) |
-                        (initStruct->ClkAlways << LCD_CR0_DCLK_Pos) |
-                        (initStruct->HsyncWidth << LCD_CR0_HLOW_Pos);
-
-            LCDx->CR1 = (initStruct->Dir << LCD_CR1_DIRV_Pos) |
-                        ((initStruct->Hfp - 1) << LCD_CR1_HFP_Pos)  |
-                        ((initStruct->Hbp - 1) << LCD_CR1_HBP_Pos)  |
-                        ((initStruct->Vfp - 1) << LCD_CR1_VFP_Pos)  |
-                        ((initStruct->Vbp - 1) << LCD_CR1_VBP_Pos)  |
-                        (initStruct->ClkDiv << LCD_CR1_DCLKDIV_Pos) |
-                        (initStruct->SamplEdge << LCD_CR1_DCLKINV_Pos);
-        }
-        else
-        {
-            LCDx->CR0 = ((initStruct->HnPixel - 1) << LCD_CR0_VPIX_Pos) |
-                        ((initStruct->VnPixel - 1) << LCD_CR0_HPIX_Pos) |
-                        (initStruct->ClkAlways << LCD_CR0_DCLK_Pos) |
-                        (initStruct->HsyncWidth << LCD_CR0_HLOW_Pos);
-
-            LCDx->CR1 = (initStruct->Dir << LCD_CR1_DIRV_Pos) |
-                        ((initStruct->Hfp - 1) << LCD_CR1_VFP_Pos)  |
-                        ((initStruct->Hbp - 1) << LCD_CR1_VBP_Pos)  |
-                        ((initStruct->Vfp - 1) << LCD_CR1_HFP_Pos)  |
-                        ((initStruct->Vbp - 1) << LCD_CR1_HBP_Pos)  |
-                        (initStruct->ClkDiv << LCD_CR1_DCLKDIV_Pos) |
-                        (initStruct->SamplEdge << LCD_CR1_DCLKINV_Pos);
-        }
-    }
-    else if (initStruct->Interface == LCD_INTERFACE_I80)
-    {
-        LCDx->START = (1 << LCD_START_MPUEN_Pos);
+    LCDx->CR0 = ((initStruct->HnPixel - 1) << LCD_CR0_HPIX_Pos) |
+                ((initStruct->VnPixel - 1) << LCD_CR0_VPIX_Pos) |
+                (initStruct->ClkAlways << LCD_CR0_DCLK_Pos) |
+                (initStruct->HsyncWidth << LCD_CR0_HLOW_Pos);
 
 
-        LCDx->CR1 = (1 << LCD_CR1_I80_Pos) |
-                    (initStruct->T_CSf_WRf << LCD_CR1_TAS_Pos) |
-                    (initStruct->T_WRnHold << LCD_CR1_TPWLW_Pos) |
-                    (initStruct->T_WRr_CSr << LCD_CR1_TAH_Pos) |
-                    (initStruct->T_CSr_CSf << LCD_CR1_TTAIL_Pos);
-    }
+    LCDx->CR1 = ((initStruct->Hfp - 1) << LCD_CR1_HFP_Pos) |
+                ((initStruct->Hbp - 1) << LCD_CR1_HBP_Pos) |
+                ((initStruct->Vfp - 1) << LCD_CR1_VFP_Pos) |
+                ((initStruct->Vbp - 1) << LCD_CR1_VBP_Pos) |
+                (initStruct->ClkDiv << LCD_CR1_DCLKDIV_Pos) |
+                (initStruct->SamplEdge << LCD_CR1_DCLKINV_Pos);
 
 
     LCDx->IE = 1;
     LCDx->IE = 1;
-    LCDx->IF = 1;   //清除标志
-    if (initStruct->IntEOTEn) LCD_INTEn(LCDx);
-    else                     LCD_INTDis(LCDx);
+    LCDx->IF = 1; //娓呴櫎鏍囧織
+    if (initStruct->IntEOTEn)
+        LCD_INTEn(LCDx);
+    else
+        LCD_INTDis(LCDx);
 
 
     switch ((uint32_t)LCDx)
     switch ((uint32_t)LCDx)
     {
     {
@@ -107,23 +75,23 @@ void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: LCD_Start()
-* 功能说明: 启动一次数据传输
-* 输    入: LCD_TypeDef * LCDx  指定要被设置的LCD,有效值包括LCD
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: LCD_Start()
+* 鍔熻兘璇存槑: 鍚�姩涓€娆℃暟鎹�紶杈�
+* 杈�    鍏�: LCD_TypeDef * LCDx    鎸囧畾瑕佽�璁剧疆鐨凩CD锛屾湁鏁堝€煎寘鎷琇CD
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void LCD_Start(LCD_TypeDef *LCDx)
 void LCD_Start(LCD_TypeDef *LCDx)
 {
 {
-    LCDx->START |= (1 << LCD_START_GO_Pos);
+    LCDx->START |= (1 << LCD_START_GO_Pos) | (1 << LCD_START_BURST_Pos);
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: LCD_IsBusy()
-* 功能说明: 是否正在进行数据传输
-* 输    入: LCD_TypeDef * LCDx  指定要被设置的LCD,有效值包括LCD
-* 输    出: uint32_t            1 正在传输数据    0 数据传输已完成
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: LCD_IsBusy()
+* 鍔熻兘璇存槑: 鏄�惁姝e湪杩涜�鏁版嵁浼犺緭
+* 杈�    鍏�: LCD_TypeDef * LCDx    鎸囧畾瑕佽�璁剧疆鐨凩CD锛屾湁鏁堝€煎寘鎷琇CD
+* 杈�    鍑�: uint32_t          1 姝e湪浼犺緭鏁版嵁    0 鏁版嵁浼犺緭宸插畬鎴�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t LCD_IsBusy(LCD_TypeDef *LCDx)
 uint32_t LCD_IsBusy(LCD_TypeDef *LCDx)
 {
 {
@@ -131,91 +99,11 @@ uint32_t LCD_IsBusy(LCD_TypeDef *LCDx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: LCD_I80_WriteReg()
-* 功能说明: MPU接口时,写寄存器
-* 输    入: LCD_TypeDef * LCDx  指定要被设置的LCD,有效值包括LCD
-*           uint16_t reg        要写的寄存器其实地址,地址自增
-*           uint16_t val[]      寄存器值,数组地址必须自对齐
-*           uint16_t cnt        要写的寄存器个数
-* 输    出: 无
-* 注意事项: 无
-******************************************************************************************************************************************/
-void LCD_I80_WriteReg(LCD_TypeDef *LCDx, uint16_t reg, uint16_t val[], uint16_t cnt)
-{
-    LCD->SRCADDR = (uint32_t)val;
-    LCD->CR0 &= ~LCD_CR0_DLEN_Msk;
-    LCD->CR0 |= ((cnt - 1) << LCD_CR0_DLEN_Pos);
-
-    LCD->CR1 |= (1 << LCD_CR1_CMD_Pos);
-    LCD->CR1 &= ~LCD_CR1_REG_Msk;
-    LCD->CR1 |= (reg << LCD_CR1_REG_Pos);
-
-    LCD_Start(LCDx);
-    while (LCD_IsBusy(LCDx));
-}
-
-/******************************************************************************************************************************************
-* 函数名称: LCD_I80_WriteOneReg()
-* 功能说明: MPU接口时,写寄存器
-* 输    入: LCD_TypeDef * LCDx  指定要被设置的LCD,有效值包括LCD
-*           uint16_t reg        要写的寄存器其实地址
-*           uint16_t val        寄存器值
-* 输    出: 无
-* 注意事项: 无
-******************************************************************************************************************************************/
-void LCD_I80_WriteOneReg(LCD_TypeDef *LCDx, uint16_t reg, uint16_t val)
-{
-    uint16_t buf[1] __attribute__((aligned(4)));
-
-    buf[0] = val;
-
-    LCD_I80_WriteReg(LCDx, reg, buf, 1);
-}
-
-/******************************************************************************************************************************************
-* 函数名称: LCD_I80_WriteData()
-* 功能说明: MPU接口时,写数据
-* 输    入: LCD_TypeDef * LCDx  指定要被设置的LCD,有效值包括LCD
-*           uint16_t val[]      要写的数据,数组地址必须自对齐
-*           uint16_t cnt        要写的数据个数
-* 输    出: 无
-* 注意事项: 无
-******************************************************************************************************************************************/
-void LCD_I80_WriteData(LCD_TypeDef *LCDx, uint16_t val[], uint16_t cnt)
-{
-    LCD->SRCADDR = (uint32_t)val;
-    LCD->CR0 &= ~LCD_CR0_DLEN_Msk;
-    LCD->CR0 |= ((cnt - 1) << LCD_CR0_DLEN_Pos);
-
-    LCD->CR1 &= ~(1 << LCD_CR1_CMD_Pos);
-
-    LCD_Start(LCDx);
-    while (LCD_IsBusy(LCDx));
-}
-
-/******************************************************************************************************************************************
-* 函数名称: LCD_I80_WriteOneData()
-* 功能说明: MPU接口时,写数据
-* 输    入: LCD_TypeDef * LCDx  指定要被设置的LCD,有效值包括LCD
-*           uint16_t val        要写的数据
-* 输    出: 无
-* 注意事项: 无
-******************************************************************************************************************************************/
-void LCD_I80_WriteOneData(LCD_TypeDef *LCDx, uint16_t val)
-{
-    uint16_t buf[1] __attribute__((aligned(4)));
-
-    buf[0] = val;
-
-    LCD_I80_WriteData(LCDx, buf, 2);
-}
-
-/******************************************************************************************************************************************
-* 函数名称: LCD_INTEn()
-* 功能说明: LCD中断使能,完成指定长度的数据传输时触发中断
-* 输    入: LCD_TypeDef * LCDx  指定要被设置的LCD,有效值包括LCD
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: LCD_INTEn()
+* 鍔熻兘璇存槑: LCD涓�柇浣胯兘锛屽畬鎴愭寚瀹氶暱搴︾殑鏁版嵁浼犺緭鏃惰Е鍙戜腑鏂�
+* 杈�    鍏�: LCD_TypeDef * LCDx    鎸囧畾瑕佽�璁剧疆鐨凩CD锛屾湁鏁堝€煎寘鎷琇CD
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void LCD_INTEn(LCD_TypeDef *LCDx)
 void LCD_INTEn(LCD_TypeDef *LCDx)
 {
 {
@@ -223,11 +111,11 @@ void LCD_INTEn(LCD_TypeDef *LCDx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: LCD_INTDis()
-* 功能说明: LCD中断禁止,完成指定长度的数据传输时不触发中断
-* 输    入: LCD_TypeDef * LCDx  指定要被设置的LCD,有效值包括LCD
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: LCD_INTDis()
+* 鍔熻兘璇存槑: LCD涓�柇绂佹�锛屽畬鎴愭寚瀹氶暱搴︾殑鏁版嵁浼犺緭鏃朵笉瑙﹀彂涓�柇
+* 杈�    鍏�: LCD_TypeDef * LCDx    鎸囧畾瑕佽�璁剧疆鐨凩CD锛屾湁鏁堝€煎寘鎷琇CD
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void LCD_INTDis(LCD_TypeDef *LCDx)
 void LCD_INTDis(LCD_TypeDef *LCDx)
 {
 {
@@ -235,11 +123,11 @@ void LCD_INTDis(LCD_TypeDef *LCDx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: LCD_INTClr()
-* 功能说明: LCD中断标志清除
-* 输    入: LCD_TypeDef * LCDx  指定要被设置的LCD,有效值包括LCD
-* 输    出: 无
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: LCD_INTClr()
+* 鍔熻兘璇存槑: LCD涓�柇鏍囧織娓呴櫎
+* 杈�    鍏�: LCD_TypeDef * LCDx    鎸囧畾瑕佽�璁剧疆鐨凩CD锛屾湁鏁堝€煎寘鎷琇CD
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void LCD_INTClr(LCD_TypeDef *LCDx)
 void LCD_INTClr(LCD_TypeDef *LCDx)
 {
 {
@@ -247,11 +135,11 @@ void LCD_INTClr(LCD_TypeDef *LCDx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: LCD_INTStat()
-* 功能说明: LCD中断状态查询
-* 输    入: LCD_TypeDef * LCDx  指定要被设置的LCD,有效值包括LCD
-* 输    出: uint32_t            1 完成指定长度的数据传输    0 未完成指定长度的数据传输
-* 注意事项: 无
+* 鍑芥暟鍚嶇О: LCD_INTStat()
+* 鍔熻兘璇存槑: LCD涓�柇鐘舵€佹煡璇�
+* 杈�    鍏�: LCD_TypeDef * LCDx    鎸囧畾瑕佽�璁剧疆鐨凩CD锛屾湁鏁堝€煎寘鎷琇CD
+* 杈�    鍑�: uint32_t          1 瀹屾垚鎸囧畾闀垮害鐨勬暟鎹�紶杈�    0 鏈�畬鎴愭寚瀹氶暱搴︾殑鏁版嵁浼犺緭
+* 娉ㄦ剰浜嬮」: 鏃�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t LCD_INTStat(LCD_TypeDef *LCDx)
 uint32_t LCD_INTStat(LCD_TypeDef *LCDx)
 {
 {

+ 52 - 78
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_lcd.h

@@ -1,96 +1,70 @@
 #ifndef __SWM320_LCD_H__
 #ifndef __SWM320_LCD_H__
 #define __SWM320_LCD_H__
 #define __SWM320_LCD_H__
 
 
-
 typedef struct
 typedef struct
 {
 {
-    uint8_t  Interface;     //LCD屏接口:LCD_INTERFACE_RGB、LCD_INTERFACE_I80、LCD_INTERFACE_M68
-
-    /* RGB同步接口参数 */
-    uint8_t  Dir;           //LCD_DIR_LANDSCAPE 横屏    LCD_DIR_PORTRAIT 竖屏
-    uint16_t HnPixel;       //水平方向像素个数,最大取值1024
-    uint16_t VnPixel;       //垂直方向像素个数,最大取值 768
-    uint8_t  Hfp;           //horizonal front porch,最大取值32
-    uint8_t  Hbp;           //horizonal back porch, 最大取值128
-    uint8_t  Vfp;           //vertical front porch, 最大取值8
-    uint8_t  Vbp;           //vertical back porch,  最大取值32
-    uint8_t  ClkDiv;        //系统时钟经ClkDiv分频后产生DOCCLK,0 2分频    1 4分频    2 6分频    ... ...    31 64分频
-    uint8_t  SamplEdge;     //屏幕在DOTCLK的哪个边沿采样数据:LCD_SAMPLEDGE_RISE、LCD_SAMPLEDGE_FALL
-    uint8_t  ClkAlways;     //1 一直输出DOTCLK    0 只在传输数据时输出DOTCLK
-    uint8_t  HsyncWidth;    //HSYNC低电平持续多少个DOTCLK,取值:LCD_HSYNC_1DOTCLK、LCD_HSYNC_2DOTCLK、LCD_HSYNC_3DOTCLK、LCD_HSYNC_4DOTCLK
-
-    /* MPU(8080)接口参数 */
-    uint8_t  T_CSf_WRf;     //CSn下降沿到WRn下降沿的时间,取值0--3
-    uint8_t  T_WRnHold;     //WRn低电平的持续时间,       取值0--7
-    uint8_t  T_WRr_CSr;     //WRn上升沿到CSn上升沿的时间,取值0--3
-    uint8_t  T_CSr_CSf;     //CSn上升沿到CSn下降沿的时间,取值0--7
-
-    uint8_t  IntEOTEn;      //End of Transter(传输完成)中断使能
+    uint16_t HnPixel;   //姘村钩鏂瑰悜鍍忕礌涓�暟锛屾渶澶у彇鍊�1024
+    uint16_t VnPixel;   //鍨傜洿鏂瑰悜鍍忕礌涓�暟锛屾渶澶у彇鍊� 768
+    uint8_t Hfp;        //horizonal front porch锛屾渶澶у彇鍊�32
+    uint8_t Hbp;        //horizonal back porch锛� 鏈€澶у彇鍊�128
+    uint8_t Vfp;        //vertical front porch锛� 鏈€澶у彇鍊�8
+    uint8_t Vbp;        //vertical back porch锛�  鏈€澶у彇鍊�32
+    uint8_t ClkDiv;     //绯荤粺鏃堕挓缁廋lkDiv鍒嗛�鍚庝骇鐢烡OCCLK锛�0 2鍒嗛�    1 4鍒嗛�    2 6鍒嗛�    ... ...    31 64鍒嗛�
+    uint8_t SamplEdge;  //灞忓箷鍦―OTCLK鐨勫摢涓�竟娌块噰鏍锋暟鎹�細LCD_SAMPLEDGE_RISE銆丩CD_SAMPLEDGE_FALL
+    uint8_t ClkAlways;  //1 涓€鐩磋緭鍑篋OTCLK    0 鍙�湪浼犺緭鏁版嵁鏃惰緭鍑篋OTCLK
+    uint8_t HsyncWidth; //HSYNC浣庣數骞虫寔缁��灏戜釜DOTCLK锛屽彇鍊硷細LCD_HSYNC_1DOTCLK銆丩CD_HSYNC_2DOTCLK銆丩CD_HSYNC_3DOTCLK銆丩CD_HSYNC_4DOTCLK
+
+    uint8_t IntEOTEn; //End of Transter锛堜紶杈撳畬鎴愶級涓�柇浣胯兘
 } LCD_InitStructure;
 } LCD_InitStructure;
 
 
-
-#define LCD_INTERFACE_RGB   0
-#define LCD_INTERFACE_I80   1
-#define LCD_INTERFACE_M68   2
-
-#define LCD_DIR_LANDSCAPE   0   //横屏
-#define LCD_DIR_PORTRAIT    1   //竖屏
-
-#define LCD_SAMPLEDGE_RISE  0   //屏幕在DOTCLK的上升沿采样数据
-#define LCD_SAMPLEDGE_FALL  1   //屏幕在DOTCLK的下降沿采样数据
-
-#define LCD_HSYNC_1DOTCLK   0   //1个DOTCLK
-#define LCD_HSYNC_2DOTCLK   1
-#define LCD_HSYNC_3DOTCLK   2
-#define LCD_HSYNC_4DOTCLK   3
-
-#define LCD_CLKDIV_2        0
-#define LCD_CLKDIV_4        1
-#define LCD_CLKDIV_6        2
-#define LCD_CLKDIV_8        3
-#define LCD_CLKDIV_10       4
-#define LCD_CLKDIV_12       5
-#define LCD_CLKDIV_14       6
-#define LCD_CLKDIV_16       7
-#define LCD_CLKDIV_18       8
-#define LCD_CLKDIV_20       9
-#define LCD_CLKDIV_22       10
-#define LCD_CLKDIV_24       11
-#define LCD_CLKDIV_26       12
-#define LCD_CLKDIV_28       13
-#define LCD_CLKDIV_30       14
-#define LCD_CLKDIV_32       15
-#define LCD_CLKDIV_34       16
-#define LCD_CLKDIV_36       17
-#define LCD_CLKDIV_38       18
-#define LCD_CLKDIV_40       19
-#define LCD_CLKDIV_42       20
-#define LCD_CLKDIV_44       21
-#define LCD_CLKDIV_46       22
-#define LCD_CLKDIV_48       23
-#define LCD_CLKDIV_50       24
-#define LCD_CLKDIV_52       25
-#define LCD_CLKDIV_54       26
-#define LCD_CLKDIV_56       27
-#define LCD_CLKDIV_58       28
-#define LCD_CLKDIV_60       29
-#define LCD_CLKDIV_62       30
-#define LCD_CLKDIV_64       31
-
+#define LCD_SAMPLEDGE_RISE 0 //灞忓箷鍦―OTCLK鐨勪笂鍗囨部閲囨牱鏁版嵁
+#define LCD_SAMPLEDGE_FALL 1 //灞忓箷鍦―OTCLK鐨勪笅闄嶆部閲囨牱鏁版嵁
+
+#define LCD_HSYNC_1DOTCLK 0 //1涓狣OTCLK
+#define LCD_HSYNC_2DOTCLK 1
+#define LCD_HSYNC_3DOTCLK 2
+#define LCD_HSYNC_4DOTCLK 3
+
+#define LCD_CLKDIV_2 0
+#define LCD_CLKDIV_4 1
+#define LCD_CLKDIV_6 2
+#define LCD_CLKDIV_8 3
+#define LCD_CLKDIV_10 4
+#define LCD_CLKDIV_12 5
+#define LCD_CLKDIV_14 6
+#define LCD_CLKDIV_16 7
+#define LCD_CLKDIV_18 8
+#define LCD_CLKDIV_20 9
+#define LCD_CLKDIV_22 10
+#define LCD_CLKDIV_24 11
+#define LCD_CLKDIV_26 12
+#define LCD_CLKDIV_28 13
+#define LCD_CLKDIV_30 14
+#define LCD_CLKDIV_32 15
+#define LCD_CLKDIV_34 16
+#define LCD_CLKDIV_36 17
+#define LCD_CLKDIV_38 18
+#define LCD_CLKDIV_40 19
+#define LCD_CLKDIV_42 20
+#define LCD_CLKDIV_44 21
+#define LCD_CLKDIV_46 22
+#define LCD_CLKDIV_48 23
+#define LCD_CLKDIV_50 24
+#define LCD_CLKDIV_52 25
+#define LCD_CLKDIV_54 26
+#define LCD_CLKDIV_56 27
+#define LCD_CLKDIV_58 28
+#define LCD_CLKDIV_60 29
+#define LCD_CLKDIV_62 30
+#define LCD_CLKDIV_64 31
 
 
 void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct);
 void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct);
 void LCD_Start(LCD_TypeDef *LCDx);
 void LCD_Start(LCD_TypeDef *LCDx);
 uint32_t LCD_IsBusy(LCD_TypeDef *LCDx);
 uint32_t LCD_IsBusy(LCD_TypeDef *LCDx);
 
 
-void LCD_I80_WriteReg(LCD_TypeDef *LCDx, uint16_t reg, uint16_t val[], uint16_t cnt);
-void LCD_I80_WriteOneReg(LCD_TypeDef *LCDx, uint16_t reg, uint16_t val);
-void LCD_I80_WriteData(LCD_TypeDef *LCDx, uint16_t data[], uint16_t cnt);
-void LCD_I80_WriteOneData(LCD_TypeDef *LCDx, uint16_t val);
-
 void LCD_INTEn(LCD_TypeDef *LCDx);
 void LCD_INTEn(LCD_TypeDef *LCDx);
 void LCD_INTDis(LCD_TypeDef *LCDx);
 void LCD_INTDis(LCD_TypeDef *LCDx);
 void LCD_INTClr(LCD_TypeDef *LCDx);
 void LCD_INTClr(LCD_TypeDef *LCDx);
 uint32_t LCD_INTStat(LCD_TypeDef *LCDx);
 uint32_t LCD_INTStat(LCD_TypeDef *LCDx);
 
 
-
 #endif //__SWM320_LCD_H__
 #endif //__SWM320_LCD_H__

+ 71 - 58
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_norflash.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* ÎļþÃû³Æ: SWM320_norflash.c
-* ¹¦ÄÜ˵Ã÷: SWM320µ¥Æ¬»úµÄNOR FlashÇý¶¯³ÌÐò
-* ¼¼ÊõÖ§³Ö: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ×¢ÒâÊÂÏî:
-* °æ±¾ÈÕÆÚ: V1.1.0      2017Äê10ÔÂ25ÈÕ
-* Éý¼¶¼Ç¼:
+* 文件�称: SWM320_norflash.c
+* 功能说明: SWM320�片机的NOR Flash驱动程�
+* 技术支�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注�事项:
+* 版本日期: V1.1.0      2017年10月25日
+* �级记录:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -21,30 +21,30 @@
 #include "SWM320.h"
 #include "SWM320.h"
 #include "SWM320_norflash.h"
 #include "SWM320_norflash.h"
 
 
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: NORFL_Init()
-* ¹¦ÄÜ˵Ã÷: NOR Flash¿ØÖÆÆ÷³õʼ»¯
-* Êä    Èë: NORFL_InitStructure * initStruct    °üº¬NOR Flash¿ØÖÆÆ÷Ïà¹ØÉ趨ֵµÄ½á¹¹Ìå
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: NORFL_Init()
+* 功能说明: NOR Flash控制器�始化
+* 输    入: NORFL_InitStructure * initStruct    包�NOR Flash控制器相关设定值的结构体
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void NORFL_Init(NORFL_InitStructure *initStruct)
 void NORFL_Init(NORFL_InitStructure *initStruct)
 {
 {
     uint32_t i;
     uint32_t i;
 
 
-    // ÅäÖÃSRAMǰÐèҪˢÐÂÏÂSDRAM¿ØÖÆÆ÷
+    // �置SRAM�需�刷新下SDRAM控制器
     do
     do
     {
     {
         SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
         SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
 
 
-        while (SDRAMC->REFDONE == 0);
+        while (SDRAMC->REFDONE == 0)
+            ;
         SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
         SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
 
 
-        for (i = 0; i < 1000; i++) __NOP();
+        for (i = 0; i < 1000; i++)
+            __NOP();
         SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
         SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
-    }
-    while (0);
+    } while (0);
 
 
     SYS->CLKEN |= (1 << SYS_CLKEN_NORFL_Pos);
     SYS->CLKEN |= (1 << SYS_CLKEN_NORFL_Pos);
 
 
@@ -53,19 +53,23 @@ void NORFL_Init(NORFL_InitStructure *initStruct)
                  (initStruct->OEPreValidTime << NORFLC_CR_RDTIME_Pos);
                  (initStruct->OEPreValidTime << NORFLC_CR_RDTIME_Pos);
 
 
     NORFLC->IE = 3;
     NORFLC->IE = 3;
-    NORFLC->IF = 3;     // Çå³ýÖжϱêÖ¾
-    if (initStruct->OperFinishIEn)  NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos);
-    else                           NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos);
-    if (initStruct->OperTimeoutIEn) NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos);
-    else                           NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos);
+    NORFLC->IF = 3; // 清除中断标志
+    if (initStruct->OperFinishIEn)
+        NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos);
+    else
+        NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos);
+    if (initStruct->OperTimeoutIEn)
+        NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos);
+    else
+        NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos);
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: NORFL_ChipErase()
-* ¹¦ÄÜ˵Ã÷: NOR FlashÕûƬ²Á³ý
-* Êä    Èë: ÎÞ
-* Êä    ³ö: uint32_t            0 ²Á³ý³É¹¦    1 ²Á³ý³¬Ê±
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: NORFL_ChipErase()
+* 功能说明: NOR Flash整片擦除
+* 输    入: 无
+* 输    出: uint32_t          0 擦除�功    1 擦除超时
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t NORFL_ChipErase(void)
 uint32_t NORFL_ChipErase(void)
 {
 {
@@ -74,10 +78,13 @@ uint32_t NORFL_ChipErase(void)
     NORFLC->CMD = (NORFL_CMD_CHIP_ERASE << NORFLC_CMD_CMD_Pos);
     NORFLC->CMD = (NORFL_CMD_CHIP_ERASE << NORFLC_CMD_CMD_Pos);
 
 
     while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
     while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
-            ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
+           ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
+        __NOP();
 
 
-    if (NORFLC->IF & NORFLC_IF_FINISH_Msk)  res = 0;
-    else                                   res = 1;
+    if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
+        res = 0;
+    else
+        res = 1;
 
 
     NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
     NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
 
 
@@ -85,11 +92,11 @@ uint32_t NORFL_ChipErase(void)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: NORFL_SectorErase()
-* ¹¦ÄÜ˵Ã÷: NOR FlashÉÈÇø²Á³ý
-* Êä    Èë: uint32_t addr       Òª²Á³ýÉÈÇøµÄÆðʼµØÖ·
-* Êä    ³ö: uint32_t            0 ²Á³ý³É¹¦    1 ²Á³ý³¬Ê±
-* ×¢ÒâÊÂÏî: MX29LV128DB ǰ8ÉÈÇøÎª8K¡¢ºó255ÉÈÇøÎª64K    MX29LV128DT ǰ255ÉÈÇøÎª64K¡¢ºó8ÉÈÇøÎª8K
+* 函数�称: NORFL_SectorErase()
+* 功能说明: NOR Flash扇区擦除
+* 输    入: uint32_t addr     �擦除扇区的起始地�
+* 输    出: uint32_t          0 擦除�功    1 擦除超时
+* 注�事项: MX29LV128DB �8扇区为8K��255扇区为64K    MX29LV128DT �255扇区为64K��8扇区为8K
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t NORFL_SectorErase(uint32_t addr)
 uint32_t NORFL_SectorErase(uint32_t addr)
 {
 {
@@ -99,10 +106,13 @@ uint32_t NORFL_SectorErase(uint32_t addr)
     NORFLC->CMD = (NORFL_CMD_SECTOR_ERASE << NORFLC_CMD_CMD_Pos);
     NORFLC->CMD = (NORFL_CMD_SECTOR_ERASE << NORFLC_CMD_CMD_Pos);
 
 
     while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
     while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
-            ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
+           ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
+        __NOP();
 
 
-    if (NORFLC->IF & NORFLC_IF_FINISH_Msk)  res = 0;
-    else                                   res = 1;
+    if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
+        res = 0;
+    else
+        res = 1;
 
 
     NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
     NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
 
 
@@ -110,12 +120,12 @@ uint32_t NORFL_SectorErase(uint32_t addr)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: NORFL_Write()
-* ¹¦ÄÜ˵Ã÷: NOR Flashд
-* Êä    Èë: uint32_t addr       Êý¾ÝҪдÈëµÄµØÖ·
-*           uint32_t data       ҪдÈëµÄÊý¾Ý
-* Êä    ³ö: uint32_t            0 дÈë³É¹¦    1 дÈ볬ʱ
-* ×¢ÒâÊÂÏî: Ó²¼þÁ¬½Ó£¬Êý¾ÝÏßΪ16λʱ£¬°ë×ÖдÈ룻Êý¾ÝÏßΪ8λʱ£¬×Ö½ÚдÈë
+* 函数�称: NORFL_Write()
+* 功能说明: NOR Flash写
+* 输    入: uint32_t addr     数��写入的地�
+*           uint32_t data       �写入的数�
+* 输    出: uint32_t          0 写入�功    1 写入超时
+* 注�事项: 硬件连接,数�线为16�时,�字写入;数�线为8�时,字节写入
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t NORFL_Write(uint32_t addr, uint32_t data)
 uint32_t NORFL_Write(uint32_t addr, uint32_t data)
 {
 {
@@ -125,10 +135,13 @@ uint32_t NORFL_Write(uint32_t addr, uint32_t data)
     NORFLC->CMD = (NORFL_CMD_PROGRAM << NORFLC_CMD_CMD_Pos) | (data << NORFLC_CMD_DATA_Pos);
     NORFLC->CMD = (NORFL_CMD_PROGRAM << NORFLC_CMD_CMD_Pos) | (data << NORFLC_CMD_DATA_Pos);
 
 
     while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
     while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
-            ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
+           ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
+        __NOP();
 
 
-    if (NORFLC->IF & NORFLC_IF_FINISH_Msk)  res = 0;
-    else                                   res = 1;
+    if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
+        res = 0;
+    else
+        res = 1;
 
 
     NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
     NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
 
 
@@ -136,11 +149,11 @@ uint32_t NORFL_Write(uint32_t addr, uint32_t data)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: NORFL_Read()
-* ¹¦ÄÜ˵Ã÷: NOR Flash¶Á
-* Êä    Èë: uint32_t addr       Êý¾ÝÒª¶Á³öµÄµØÖ·
-* Êä    ³ö: uint32_t            ¶Á³öµÄÊý¾Ý
-* ×¢ÒâÊÂÏî: Ó²¼þÁ¬½Ó£¬Êý¾ÝÏßΪ16λʱ£¬°ë×Ö¶Á³ö£»Êý¾ÝÏßΪ8λʱ£¬×Ö½Ú¶Á³ö
+* 函数�称: NORFL_Read()
+* 功能说明: NOR Flash读
+* 输    入: uint32_t addr     数��读出的地�
+* 输    出: uint32_t          读出的数�
+* 注�事项: 硬件连接,数�线为16�时,�字读出;数�线为8�时,字节读出
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t NORFL_Read(uint32_t addr)
 uint32_t NORFL_Read(uint32_t addr)
 {
 {
@@ -151,11 +164,11 @@ uint32_t NORFL_Read(uint32_t addr)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: NORFL_ReadID()
-* ¹¦ÄÜ˵Ã÷: NOR Flash¶ÁID
-* Êä    Èë: uint32_t id_addr    IDµØÖ·£¬´Ë²ÎÊýÊÇоƬÏà¹ØµÄ£¬Ã¿ÖÖоƬ¶¼²»Í¬
-* Êä    ³ö: uint16_t            ¶ÁÈ¡µ½µÄID
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: NORFL_ReadID()
+* 功能说明: NOR Flash读ID
+* 输    入: uint32_t id_addr  ID地�,此�数是芯片相关的,��芯片都��
+* 输    出: uint16_t          读�到的ID
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint16_t NORFL_ReadID(uint32_t id_addr)
 uint16_t NORFL_ReadID(uint32_t id_addr)
 {
 {
@@ -168,7 +181,7 @@ uint16_t NORFL_ReadID(uint32_t id_addr)
 
 
     id = NORFLC->CMD & NORFLC_CMD_DATA_Msk;
     id = NORFLC->CMD & NORFLC_CMD_DATA_Msk;
 
 
-    NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos);  // Í˳öID¶Áȡģʽ
+    NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos); // 退出ID读�模�
 
 
     return id;
     return id;
 }
 }

+ 15 - 20
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_norflash.h

@@ -3,17 +3,15 @@
 
 
 typedef struct
 typedef struct
 {
 {
-    uint8_t DataWidth;          // 8、16
+    uint8_t DataWidth; // 8銆�16
 
 
-    uint8_t WELowPulseTime;     // WE# pulse width,单位为系统时钟周期,最大值为7
-    uint8_t OEPreValidTime;     // Valid data output after OE# low,单位为系统时钟周期,最大值为15
+    uint8_t WELowPulseTime; // WE# pulse width锛屽崟浣嶄负绯荤粺鏃堕挓鍛ㄦ湡锛屾渶澶у€间负7
+    uint8_t OEPreValidTime; // Valid data output after OE# low锛屽崟浣嶄负绯荤粺鏃堕挓鍛ㄦ湡锛屾渶澶у€间负15
 
 
-    uint8_t OperFinishIEn;      // 操作(写入、擦除)完成中断使能
+    uint8_t OperFinishIEn; // 鎿嶄綔(鍐欏叆銆佹摝闄�)瀹屾垚涓�柇浣胯兘
     uint8_t OperTimeoutIEn;
     uint8_t OperTimeoutIEn;
 } NORFL_InitStructure;
 } NORFL_InitStructure;
 
 
-
-
 void NORFL_Init(NORFL_InitStructure *initStruct);
 void NORFL_Init(NORFL_InitStructure *initStruct);
 uint32_t NORFL_ChipErase(void);
 uint32_t NORFL_ChipErase(void);
 uint32_t NORFL_SectorErase(uint32_t addr);
 uint32_t NORFL_SectorErase(uint32_t addr);
@@ -21,19 +19,16 @@ uint32_t NORFL_Write(uint32_t addr, uint32_t data);
 uint32_t NORFL_Read(uint32_t addr);
 uint32_t NORFL_Read(uint32_t addr);
 uint16_t NORFL_ReadID(uint32_t id_addr);
 uint16_t NORFL_ReadID(uint32_t id_addr);
 
 
-
-/* 当前版本总线读只支持字读
-#define NORFL_Read8(addr)           *((volatile uint8_t  *)(NORFLM_BASE + addr))
-#define NORFL_Read16(addr)          *((volatile uint16_t *)(NORFLM_BASE + addr))    */
-#define NORFL_Read32(addr)          *((volatile uint32_t *)(NORFLM_BASE + addr))
-
-
-
-#define NORFL_CMD_READ              0
-#define NORFL_CMD_RESET             1
-#define NORFL_CMD_AUTO_SELECT       2
-#define NORFL_CMD_PROGRAM           3
-#define NORFL_CMD_CHIP_ERASE        4
-#define NORFL_CMD_SECTOR_ERASE      5
+/* 褰撳墠鐗堟湰鎬荤嚎璇诲彧鏀�寔瀛楄�
+#define NORFL_Read8(addr)   *((volatile uint8_t  *)(NORFLM_BASE + addr))
+#define NORFL_Read16(addr)  *((volatile uint16_t *)(NORFLM_BASE + addr))    */
+#define NORFL_Read32(addr) *((volatile uint32_t *)(NORFLM_BASE + addr))
+
+#define NORFL_CMD_READ 0
+#define NORFL_CMD_RESET 1
+#define NORFL_CMD_AUTO_SELECT 2
+#define NORFL_CMD_PROGRAM 3
+#define NORFL_CMD_CHIP_ERASE 4
+#define NORFL_CMD_SECTOR_ERASE 5
 
 
 #endif // __SWM320_NORFLASH_H__
 #endif // __SWM320_NORFLASH_H__

+ 15 - 16
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_port.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 文件名称: SWM320_port.c
-* 功能说明: SWM320单片机的端口引脚功能选择库函数
-* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* 注意事项:
-* 版本日期: V1.1.0      2017年10月25日
-* 升级记录:
+* 鏂囦欢鍚嶇О: SWM320_port.c
+* 鍔熻兘璇存槑: SWM320鍗曠墖鏈虹殑绔�彛寮曡剼鍔熻兘閫夋嫨搴撳嚱鏁�
+* 鎶€鏈�敮鎸�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 娉ㄦ剰浜嬮」:
+* 鐗堟湰鏃ユ湡: V1.1.0      2017骞�10鏈�25鏃�
+* 鍗囩骇璁板綍:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -21,17 +21,16 @@
 #include "SWM320.h"
 #include "SWM320.h"
 #include "SWM320_port.h"
 #include "SWM320_port.h"
 
 
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 函数名称: PORT_Init()
-* 功能说明: 端口引脚功能选择,可用的功能见"SWM320_port.h"文件
-* 输    入: uint32_t PORTx          指定PORT端口,有效值包括PORTA、PORTB、PORTC、PORTM、PORTN、PORTP
-*           uint32_t n              指定PORT引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
-*           uint32_t func           指定端口引脚要设定的功能,其可取值见"SWM320_port.h"文件
-*           uint32_t digit_in_en    数字输入使能
-* 输    出: 无
-* 注意事项: 当引脚标号n为偶数时,func取值只能是FUNMUX0开头的,如FUNMUX0_UART0_RXD
-*           当引脚标号n为奇数时,func取值只能是FUNMUX1开头的,如FUNMUX1_UART0_TXD
+* 鍑芥暟鍚嶇О: PORT_Init()
+* 鍔熻兘璇存槑: 绔�彛寮曡剼鍔熻兘閫夋嫨锛屽彲鐢ㄧ殑鍔熻兘瑙�"SWM320_port.h"鏂囦欢
+* 杈�    鍏�: uint32_t PORTx            鎸囧畾PORT绔�彛锛屾湁鏁堝€煎寘鎷琍ORTA銆丳ORTB銆丳ORTC銆丳ORTM銆丳ORTN銆丳ORTP
+*           uint32_t n              鎸囧畾PORT寮曡剼锛屾湁鏁堝€煎寘鎷琍IN0銆丳IN1銆丳IN2銆�... ... PIN22銆丳IN23
+*           uint32_t func           鎸囧畾绔�彛寮曡剼瑕佽�瀹氱殑鍔熻兘锛屽叾鍙�彇鍊艰�"SWM320_port.h"鏂囦欢
+*           uint32_t digit_in_en    鏁板瓧杈撳叆浣胯兘
+* 杈�    鍑�: 鏃�
+* 娉ㄦ剰浜嬮」: 褰撳紩鑴氭爣鍙穘涓哄伓鏁版椂锛宖unc鍙栧€煎彧鑳芥槸FUNMUX0寮€澶寸殑锛屽�FUNMUX0_UART0_RXD
+*           褰撳紩鑴氭爣鍙穘涓哄�鏁版椂锛宖unc鍙栧€煎彧鑳芥槸FUNMUX1寮€澶寸殑锛屽�FUNMUX1_UART0_TXD
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en)
 void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en)
 {
 {

+ 415 - 423
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_port.h

@@ -1,482 +1,474 @@
 #ifndef __SWM320_PORT_H__
 #ifndef __SWM320_PORT_H__
 #define __SWM320_PORT_H__
 #define __SWM320_PORT_H__
 
 
-void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en);    //端口引脚功能选择,其可取值如下:
+void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en); //绔�彛寮曡剼鍔熻兘閫夋嫨锛屽叾鍙�彇鍊煎�涓嬶細
 
 
-#define PORTA   0
-#define PORTB   1
-#define PORTC   2
-#define PORTM   3
-#define PORTN   4
-#define PORTP   5
+#define PORTA 0
+#define PORTB 1
+#define PORTC 2
+#define PORTM 3
+#define PORTN 4
+#define PORTP 5
 
 
-#define PORTA_PIN0_GPIO         0
-#define PORTA_PIN0_FUNMUX       1
-#define PORTA_PIN0_SWCLK        2
+#define PORTA_PIN0_GPIO 0
+#define PORTA_PIN0_FUNMUX 1
+#define PORTA_PIN0_SWCLK 2
 
 
-#define PORTA_PIN1_GPIO         0
-#define PORTA_PIN1_FUNMUX       1
-#define PORTA_PIN1_SWDIO        2
+#define PORTA_PIN1_GPIO 0
+#define PORTA_PIN1_FUNMUX 1
+#define PORTA_PIN1_SWDIO 2
 
 
-#define PORTA_PIN2_GPIO         0
-#define PORTA_PIN2_FUNMUX       1
+#define PORTA_PIN2_GPIO 0
+#define PORTA_PIN2_FUNMUX 1
 
 
-#define PORTA_PIN3_GPIO         0
-#define PORTA_PIN3_FUNMUX       1
+#define PORTA_PIN3_GPIO 0
+#define PORTA_PIN3_FUNMUX 1
 
 
-#define PORTA_PIN4_GPIO         0
-#define PORTA_PIN4_FUNMUX       1
+#define PORTA_PIN4_GPIO 0
+#define PORTA_PIN4_FUNMUX 1
 
 
-#define PORTA_PIN5_GPIO         0
-#define PORTA_PIN5_FUNMUX       1
+#define PORTA_PIN5_GPIO 0
+#define PORTA_PIN5_FUNMUX 1
 
 
-#define PORTA_PIN6_GPIO         0
-#define PORTA_PIN6_FUNMUX       1
+#define PORTA_PIN6_GPIO 0
+#define PORTA_PIN6_FUNMUX 1
 
 
-#define PORTA_PIN7_GPIO         0
-#define PORTA_PIN7_FUNMUX       1
+#define PORTA_PIN7_GPIO 0
+#define PORTA_PIN7_FUNMUX 1
 
 
-#define PORTA_PIN8_GPIO         0
-#define PORTA_PIN8_FUNMUX       1
+#define PORTA_PIN8_GPIO 0
+#define PORTA_PIN8_FUNMUX 1
 
 
-#define PORTA_PIN9_GPIO         0
-#define PORTA_PIN9_FUNMUX       1
-#define PORTA_PIN9_ADC0_IN7     3
+#define PORTA_PIN9_GPIO 0
+#define PORTA_PIN9_FUNMUX 1
+#define PORTA_PIN9_ADC0_IN7 3
 
 
-#define PORTA_PIN10_GPIO        0
-#define PORTA_PIN10_FUNMUX      1
-#define PORTA_PIN10_ADC0_IN6    3
+#define PORTA_PIN10_GPIO 0
+#define PORTA_PIN10_FUNMUX 1
+#define PORTA_PIN10_ADC0_IN6 3
 
 
-#define PORTA_PIN11_GPIO        0
-#define PORTA_PIN11_FUNMUX      1
-#define PORTA_PIN11_ADC0_IN5    3
+#define PORTA_PIN11_GPIO 0
+#define PORTA_PIN11_FUNMUX 1
+#define PORTA_PIN11_ADC0_IN5 3
 
 
-#define PORTA_PIN12_GPIO        0
-#define PORTA_PIN12_ADC0_IN4    3
+#define PORTA_PIN12_GPIO 0
+#define PORTA_PIN12_ADC0_IN4 3
 
 
+#define PORTB_PIN0_GPIO 0
+#define PORTB_PIN0_FUNMUX 1
+#define PORTB_PIN0_SD_DETECT 2
 
 
-#define PORTB_PIN0_GPIO         0
-#define PORTB_PIN0_FUNMUX       1
-#define PORTB_PIN0_SD_DETECT    2
+#define PORTB_PIN1_GPIO 0
+#define PORTB_PIN1_FUNMUX 1
+#define PORTB_PIN1_SD_CLK 2
 
 
-#define PORTB_PIN1_GPIO         0
-#define PORTB_PIN1_FUNMUX       1
-#define PORTB_PIN1_SD_CLK       2
+#define PORTB_PIN2_GPIO 0
+#define PORTB_PIN2_FUNMUX 1
+#define PORTB_PIN2_SD_CMD 2
 
 
-#define PORTB_PIN2_GPIO         0
-#define PORTB_PIN2_FUNMUX       1
-#define PORTB_PIN2_SD_CMD       2
+#define PORTB_PIN3_GPIO 0
+#define PORTB_PIN3_FUNMUX 1
+#define PORTB_PIN3_SD_D0 2
 
 
-#define PORTB_PIN3_GPIO         0
-#define PORTB_PIN3_FUNMUX       1
-#define PORTB_PIN3_SD_D0        2
+#define PORTB_PIN4_GPIO 0
+#define PORTB_PIN4_FUNMUX 1
+#define PORTB_PIN4_SD_D1 2
 
 
-#define PORTB_PIN4_GPIO         0
-#define PORTB_PIN4_FUNMUX       1
-#define PORTB_PIN4_SD_D1        2
+#define PORTB_PIN5_GPIO 0
+#define PORTB_PIN5_FUNMUX 1
+#define PORTB_PIN5_SD_D2 2
 
 
-#define PORTB_PIN5_GPIO         0
-#define PORTB_PIN5_FUNMUX       1
-#define PORTB_PIN5_SD_D2        2
+#define PORTB_PIN6_GPIO 0
+#define PORTB_PIN6_FUNMUX 1
+#define PORTB_PIN6_SD_D3 2
 
 
-#define PORTB_PIN6_GPIO         0
-#define PORTB_PIN6_FUNMUX       1
-#define PORTB_PIN6_SD_D3        2
+#define PORTB_PIN7_GPIO 0
+#define PORTB_PIN7_FUNMUX 1
+#define PORTB_PIN7_SD_D4 2
 
 
-#define PORTB_PIN7_GPIO         0
-#define PORTB_PIN7_FUNMUX       1
-#define PORTB_PIN7_SD_D4        2
+#define PORTB_PIN8_GPIO 0
+#define PORTB_PIN8_FUNMUX 1
+#define PORTB_PIN8_SD_D5 2
 
 
-#define PORTB_PIN8_GPIO         0
-#define PORTB_PIN8_FUNMUX       1
-#define PORTB_PIN8_SD_D5        2
+#define PORTB_PIN9_GPIO 0
+#define PORTB_PIN9_FUNMUX 1
+#define PORTB_PIN9_SD_D6 2
 
 
-#define PORTB_PIN9_GPIO         0
-#define PORTB_PIN9_FUNMUX       1
-#define PORTB_PIN9_SD_D6        2
+#define PORTB_PIN10_GPIO 0
+#define PORTB_PIN10_FUNMUX 1
+#define PORTB_PIN10_SD_D7 2
 
 
-#define PORTB_PIN10_GPIO        0
-#define PORTB_PIN10_FUNMUX      1
-#define PORTB_PIN10_SD_D7       2
+#define PORTB_PIN11_GPIO 0
+#define PORTB_PIN11_FUNMUX 1
 
 
-#define PORTB_PIN11_GPIO        0
-#define PORTB_PIN11_FUNMUX      1
+#define PORTB_PIN12_GPIO 0
 
 
-#define PORTB_PIN12_GPIO        0
+#define PORTC_PIN0_GPIO 0
+#define PORTC_PIN0_FUNMUX 1
 
 
+#define PORTC_PIN1_GPIO 0
+#define PORTC_PIN1_FUNMUX 1
 
 
-#define PORTC_PIN0_GPIO         0
-#define PORTC_PIN0_FUNMUX       1
+#define PORTC_PIN2_GPIO 0
+#define PORTC_PIN2_FUNMUX 1
 
 
-#define PORTC_PIN1_GPIO         0
-#define PORTC_PIN1_FUNMUX       1
+#define PORTC_PIN3_GPIO 0
+#define PORTC_PIN3_FUNMUX 1
 
 
-#define PORTC_PIN2_GPIO         0
-#define PORTC_PIN2_FUNMUX       1
+#define PORTC_PIN4_GPIO 0
+#define PORTC_PIN4_FUNMUX 1
+#define PORTC_PIN4_ADC1_IN3 3
 
 
-#define PORTC_PIN3_GPIO         0
-#define PORTC_PIN3_FUNMUX       1
+#define PORTC_PIN5_GPIO 0
+#define PORTC_PIN5_FUNMUX 1
+#define PORTC_PIN5_ADC1_IN2 3
 
 
-#define PORTC_PIN4_GPIO         0
-#define PORTC_PIN4_FUNMUX       1
-#define PORTC_PIN4_ADC1_IN3     3
+#define PORTC_PIN6_GPIO 0
+#define PORTC_PIN6_FUNMUX 1
+#define PORTC_PIN6_ADC1_IN1 3
 
 
-#define PORTC_PIN5_GPIO         0
-#define PORTC_PIN5_FUNMUX       1
-#define PORTC_PIN5_ADC1_IN2     3
+#define PORTC_PIN7_GPIO 0
+#define PORTC_PIN7_FUNMUX 1
+#define PORTC_PIN7_ADC1_IN0 3
 
 
-#define PORTC_PIN6_GPIO         0
-#define PORTC_PIN6_FUNMUX       1
-#define PORTC_PIN6_ADC1_IN1     3
+#define PORTM_PIN0_GPIO 0
+#define PORTM_PIN0_FUNMUX 1
+#define PORTM_PIN0_NORFL_D15 2
 
 
-#define PORTC_PIN7_GPIO         0
-#define PORTC_PIN7_FUNMUX       1
-#define PORTC_PIN7_ADC1_IN0     3
+#define PORTM_PIN1_GPIO 0
+#define PORTM_PIN1_FUNMUX 1
+#define PORTM_PIN1_NORFL_D14 2
 
 
+#define PORTM_PIN2_GPIO 0
+#define PORTM_PIN2_FUNMUX 1
+#define PORTM_PIN2_NORFL_D13 2
 
 
-#define PORTM_PIN0_GPIO         0
-#define PORTM_PIN0_FUNMUX       1
-#define PORTM_PIN0_NORFL_D15    2
+#define PORTM_PIN3_GPIO 0
+#define PORTM_PIN3_FUNMUX 1
+#define PORTM_PIN3_NORFL_D12 2
 
 
-#define PORTM_PIN1_GPIO         0
-#define PORTM_PIN1_FUNMUX       1
-#define PORTM_PIN1_NORFL_D14    2
+#define PORTM_PIN4_GPIO 0
+#define PORTM_PIN4_FUNMUX 1
+#define PORTM_PIN4_NORFL_D11 2
 
 
-#define PORTM_PIN2_GPIO         0
-#define PORTM_PIN2_FUNMUX       1
-#define PORTM_PIN2_NORFL_D13    2
+#define PORTM_PIN5_GPIO 0
+#define PORTM_PIN5_FUNMUX 1
+#define PORTM_PIN5_NORFL_D10 2
 
 
-#define PORTM_PIN3_GPIO         0
-#define PORTM_PIN3_FUNMUX       1
-#define PORTM_PIN3_NORFL_D12    2
+#define PORTM_PIN6_GPIO 0
+#define PORTM_PIN6_FUNMUX 1
+#define PORTM_PIN6_NORFL_D9 2
 
 
-#define PORTM_PIN4_GPIO         0
-#define PORTM_PIN4_FUNMUX       1
-#define PORTM_PIN4_NORFL_D11    2
+#define PORTM_PIN7_GPIO 0
+#define PORTM_PIN7_FUNMUX 1
+#define PORTM_PIN7_NORFL_D8 2
 
 
-#define PORTM_PIN5_GPIO         0
-#define PORTM_PIN5_FUNMUX       1
-#define PORTM_PIN5_NORFL_D10    2
+#define PORTM_PIN8_GPIO 0
+#define PORTM_PIN8_FUNMUX 1
+#define PORTM_PIN8_NORFL_D7 2
 
 
-#define PORTM_PIN6_GPIO         0
-#define PORTM_PIN6_FUNMUX       1
-#define PORTM_PIN6_NORFL_D9     2
+#define PORTM_PIN9_GPIO 0
+#define PORTM_PIN9_FUNMUX 1
+#define PORTM_PIN9_NORFL_D6 2
 
 
-#define PORTM_PIN7_GPIO         0
-#define PORTM_PIN7_FUNMUX       1
-#define PORTM_PIN7_NORFL_D8     2
+#define PORTM_PIN10_GPIO 0
+#define PORTM_PIN10_FUNMUX 1
+#define PORTM_PIN10_NORFL_D5 2
 
 
-#define PORTM_PIN8_GPIO         0
-#define PORTM_PIN8_FUNMUX       1
-#define PORTM_PIN8_NORFL_D7     2
+#define PORTM_PIN11_GPIO 0
+#define PORTM_PIN11_FUNMUX 1
+#define PORTM_PIN11_NORFL_D4 2
 
 
-#define PORTM_PIN9_GPIO         0
-#define PORTM_PIN9_FUNMUX       1
-#define PORTM_PIN9_NORFL_D6     2
+#define PORTM_PIN12_GPIO 0
+#define PORTM_PIN12_FUNMUX 1
+#define PORTM_PIN12_NORFL_D3 2
 
 
-#define PORTM_PIN10_GPIO        0
-#define PORTM_PIN10_FUNMUX      1
-#define PORTM_PIN10_NORFL_D5    2
+#define PORTM_PIN13_GPIO 0
+#define PORTM_PIN13_FUNMUX 1
+#define PORTM_PIN13_NORFL_D2 2
 
 
-#define PORTM_PIN11_GPIO        0
-#define PORTM_PIN11_FUNMUX      1
-#define PORTM_PIN11_NORFL_D4    2
+#define PORTM_PIN14_GPIO 0
+#define PORTM_PIN14_FUNMUX 1
+#define PORTM_PIN14_NORFL_D1 2
 
 
-#define PORTM_PIN12_GPIO        0
-#define PORTM_PIN12_FUNMUX      1
-#define PORTM_PIN12_NORFL_D3    2
+#define PORTM_PIN15_GPIO 0
+#define PORTM_PIN15_FUNMUX 1
+#define PORTM_PIN15_NORFL_D0 2
 
 
-#define PORTM_PIN13_GPIO        0
-#define PORTM_PIN13_FUNMUX      1
-#define PORTM_PIN13_NORFL_D2    2
+#define PORTM_PIN16_GPIO 0
+#define PORTM_PIN16_FUNMUX 1
+#define PORTM_PIN16_NORFL_OEN 2
 
 
-#define PORTM_PIN14_GPIO        0
-#define PORTM_PIN14_FUNMUX      1
-#define PORTM_PIN14_NORFL_D1    2
-
-#define PORTM_PIN15_GPIO        0
-#define PORTM_PIN15_FUNMUX      1
-#define PORTM_PIN15_NORFL_D0    2
-
-#define PORTM_PIN16_GPIO        0
-#define PORTM_PIN16_FUNMUX      1
-#define PORTM_PIN16_NORFL_OEN   2
-
-#define PORTM_PIN17_GPIO        0
-#define PORTM_PIN17_FUNMUX      1
-#define PORTM_PIN17_NORFL_WEN   2
-
-#define PORTM_PIN18_GPIO        0
-#define PORTM_PIN18_FUNMUX      1
-#define PORTM_PIN18_NORFL_CSN   2
-
-#define PORTM_PIN19_GPIO        0
-#define PORTM_PIN19_FUNMUX      1
-#define PORTM_PIN19_SDRAM_CSN   2
-
-#define PORTM_PIN20_GPIO        0
-#define PORTM_PIN20_FUNMUX      1
-#define PORTM_PIN20_SRAM_CSN    2
-
-#define PORTM_PIN21_GPIO        0
-#define PORTM_PIN21_FUNMUX      1
-#define PORTM_PIN21_SDRAM_CKE   2
-
-
-#define PORTN_PIN0_GPIO         0
-#define PORTN_PIN0_FUNMUX       1
-#define PORTN_PIN0_LCD_D0       2
-#define PORTN_PIN0_ADC1_IN4     3
-
-#define PORTN_PIN1_GPIO         0
-#define PORTN_PIN1_FUNMUX       1
-#define PORTN_PIN1_LCD_D1       2
-#define PORTN_PIN1_ADC1_IN5     3
-
-#define PORTN_PIN2_GPIO         0
-#define PORTN_PIN2_FUNMUX       1
-#define PORTN_PIN2_LCD_D2       2
-#define PORTN_PIN2_ADC1_IN6     3
-
-#define PORTN_PIN3_GPIO         0
-#define PORTN_PIN3_FUNMUX       1
-#define PORTN_PIN3_LCD_D3       2
-
-#define PORTN_PIN4_GPIO         0
-#define PORTN_PIN4_FUNMUX       1
-#define PORTN_PIN4_LCD_D4       2
-
-#define PORTN_PIN5_GPIO         0
-#define PORTN_PIN5_FUNMUX       1
-#define PORTN_PIN5_LCD_D5       2
-
-#define PORTN_PIN6_GPIO         0
-#define PORTN_PIN6_FUNMUX       1
-#define PORTN_PIN6_LCD_D6       2
-
-#define PORTN_PIN7_GPIO         0
-#define PORTN_PIN7_FUNMUX       1
-#define PORTN_PIN7_LCD_D7       2
-
-#define PORTN_PIN8_GPIO         0
-#define PORTN_PIN8_FUNMUX       1
-#define PORTN_PIN8_LCD_D8       2
-
-#define PORTN_PIN9_GPIO         0
-#define PORTN_PIN9_FUNMUX       1
-#define PORTN_PIN9_LCD_D9       2
-
-#define PORTN_PIN10_GPIO        0
-#define PORTN_PIN10_FUNMUX      1
-#define PORTN_PIN10_LCD_D10     2
-
-#define PORTN_PIN11_GPIO        0
-#define PORTN_PIN11_FUNMUX      1
-#define PORTN_PIN11_LCD_D11     2
-
-#define PORTN_PIN12_GPIO        0
-#define PORTN_PIN12_FUNMUX      1
-#define PORTN_PIN12_LCD_D12     2
-
-#define PORTN_PIN13_GPIO        0
-#define PORTN_PIN13_FUNMUX      1
-#define PORTN_PIN13_LCD_D13     2
-
-#define PORTN_PIN14_GPIO        0
-#define PORTN_PIN14_FUNMUX      1
-#define PORTN_PIN14_LCD_D14     2
-
-#define PORTN_PIN15_GPIO        0
-#define PORTN_PIN15_FUNMUX      1
-#define PORTN_PIN15_LCD_D15     2
-
-#define PORTN_PIN16_GPIO        0
-#define PORTN_PIN16_FUNMUX      1
-#define PORTN_PIN16_LCD_RD      2
-#define PORTN_PIN16_LCD_DOTCK   2
-
-#define PORTN_PIN17_GPIO        0
-#define PORTN_PIN17_FUNMUX      1
-#define PORTN_PIN17_LCD_CS      2
-#define PORTN_PIN17_LCD_VSYNC   2
-
-#define PORTN_PIN18_GPIO        0
-#define PORTN_PIN18_LCD_RS      2
-#define PORTN_PIN18_LCD_DATEN   2   //Data Enable
-
-#define PORTN_PIN19_GPIO        0
-#define PORTN_PIN19_LCD_WR      2
-#define PORTN_PIN19_LCD_HSYNC   2
-
-
-#define PORTP_PIN0_GPIO         0
-#define PORTP_PIN0_FUNMUX       1
-#define PORTP_PIN0_NORFL_A0     2
-
-#define PORTP_PIN1_GPIO         0
-#define PORTP_PIN1_FUNMUX       1
-#define PORTP_PIN1_NORFL_A1     2
-
-#define PORTP_PIN2_GPIO         0
-#define PORTP_PIN2_FUNMUX       1
-#define PORTP_PIN2_NORFL_A2     2
-#define PORTP_PIN2_SD_D7        3
-
-#define PORTP_PIN3_GPIO         0
-#define PORTP_PIN3_FUNMUX       1
-#define PORTP_PIN3_NORFL_A3     2
-#define PORTP_PIN3_SD_D6        3
-
-#define PORTP_PIN4_GPIO         0
-#define PORTP_PIN4_FUNMUX       1
-#define PORTP_PIN4_NORFL_A4     2
-#define PORTP_PIN4_SD_D5        3
-
-#define PORTP_PIN5_GPIO         0
-#define PORTP_PIN5_FUNMUX       1
-#define PORTP_PIN5_NORFL_A5     2
-#define PORTP_PIN5_SD_D4        3
-
-#define PORTP_PIN6_GPIO         0
-#define PORTP_PIN6_FUNMUX       1
-#define PORTP_PIN6_NORFL_A6     2
-#define PORTP_PIN6_SD_D3        3
-
-#define PORTP_PIN7_GPIO         0
-#define PORTP_PIN7_FUNMUX       1
-#define PORTP_PIN7_NORFL_A7     2
-#define PORTP_PIN7_SD_D2        3
-
-#define PORTP_PIN8_GPIO         0
-#define PORTP_PIN8_FUNMUX       1
-#define PORTP_PIN8_NORFL_A8     2
-#define PORTP_PIN8_SD_D1        3
-
-#define PORTP_PIN9_GPIO         0
-#define PORTP_PIN9_FUNMUX       1
-#define PORTP_PIN9_NORFL_A9     2
-#define PORTP_PIN9_SD_D0        3
-
-#define PORTP_PIN10_GPIO        0
-#define PORTP_PIN10_FUNMUX      1
-#define PORTP_PIN10_NORFL_A10   2
-#define PORTP_PIN10_SD_CMD      3
-
-#define PORTP_PIN11_GPIO        0
-#define PORTP_PIN11_FUNMUX      1
-#define PORTP_PIN11_NORFL_A11   2
-#define PORTP_PIN11_SD_CLK      3
-
-#define PORTP_PIN12_GPIO        0
-#define PORTP_PIN12_FUNMUX      1
-#define PORTP_PIN12_NORFL_A12   2
-#define PORTP_PIN12_SD_DETECT   3
-
-#define PORTP_PIN13_GPIO        0
-#define PORTP_PIN13_FUNMUX      1
-#define PORTP_PIN13_NORFL_A13   2
-#define PORTP_PIN13_SDRAM_CLK   2
-
-#define PORTP_PIN14_GPIO        0
-#define PORTP_PIN14_FUNMUX      1
-#define PORTP_PIN14_NORFL_A14   2
-#define PORTP_PIN14_SDRAM_CAS   2
-
-#define PORTP_PIN15_GPIO        0
-#define PORTP_PIN15_FUNMUX      1
-#define PORTP_PIN15_NORFL_A15   2
-#define PORTP_PIN15_SDRAM_RAS   2
-
-#define PORTP_PIN16_GPIO        0
-#define PORTP_PIN16_FUNMUX      1
-#define PORTP_PIN16_NORFL_A16   2
-#define PORTP_PIN16_SDRAM_LDQ   2
-
-#define PORTP_PIN17_GPIO        0
-#define PORTP_PIN17_FUNMUX      1
-#define PORTP_PIN17_NORFL_A17   2
-#define PORTP_PIN17_SDRAM_UDQ   2
-
-#define PORTP_PIN18_GPIO        0
-#define PORTP_PIN18_FUNMUX      1
-#define PORTP_PIN18_NORFL_A18   2
-
-#define PORTP_PIN19_GPIO        0
-#define PORTP_PIN19_FUNMUX      1
-#define PORTP_PIN19_NORFL_A19   2
-
-#define PORTP_PIN20_GPIO        0
-#define PORTP_PIN20_FUNMUX      1
-#define PORTP_PIN20_NORFL_A20   2
-#define PORTP_PIN20_SDRAM_BA0   2
-
-#define PORTP_PIN21_GPIO        0
-#define PORTP_PIN21_FUNMUX      1
-#define PORTP_PIN21_NORFL_A21   2
-#define PORTP_PIN21_SDRAM_BA1   2
-
-#define PORTP_PIN22_GPIO        0
-#define PORTP_PIN22_FUNMUX      1
-#define PORTP_PIN22_NORFL_A22   2
-
-#define PORTP_PIN23_GPIO        0
-#define PORTP_PIN23_FUNMUX      1
-#define PORTP_PIN23_NORFL_A23   2
-
-
-
-/* 下面宏定义的取值全部在正确值的基础上“加100”,以区分上面宏定义的值,从而方便库函数的编写*/
-/* 下面这些值是偶数编号引脚的功能取值,如PIN0、PIN2、... */
-#define FUNMUX0_UART0_RXD       100
-#define FUNMUX0_UART1_RXD       101
-#define FUNMUX0_UART2_RXD       102
-#define FUNMUX0_UART3_RXD       103
-#define FUNMUX0_I2C0_SCL        105
-#define FUNMUX0_I2C1_SCL        106
-#define FUNMUX0_PWM0A_OUT       107
-#define FUNMUX0_PWM2A_OUT       108
-#define FUNMUX0_PWM4A_OUT       109
-#define FUNMUX0_PWM0B_OUT       110
-#define FUNMUX0_PWM2B_OUT       111
-#define FUNMUX0_PWM4B_OUT       112
-#define FUNMUX0_PWM_BREAK       113
-#define FUNMUX0_TIMR0_IN        114
-#define FUNMUX0_TIMR2_IN        115
-#define FUNMUX0_CAN_RX          116
-#define FUNMUX0_SPI0_SSEL       117
-#define FUNMUX0_SPI0_MOSI       118
-#define FUNMUX0_SPI1_SSEL       119
-#define FUNMUX0_SPI1_MOSI       120
-#define FUNMUX0_UART0_CTS       121
-#define FUNMUX0_UART1_CTS       122
-#define FUNMUX0_UART2_CTS       123
-#define FUNMUX0_UART3_CTS       124
-
-/* 下面这些值是奇数编号引脚的功能取值,如PIN1、PIN3、... */
-#define FUNMUX1_UART0_TXD       100
-#define FUNMUX1_UART1_TXD       101
-#define FUNMUX1_UART2_TXD       102
-#define FUNMUX1_UART3_TXD       103
-#define FUNMUX1_I2C0_SDA        105
-#define FUNMUX1_I2C1_SDA        106
-#define FUNMUX1_PWM1A_OUT       107
-#define FUNMUX1_PWM3A_OUT       108
-#define FUNMUX1_PWM5A_OUT       109
-#define FUNMUX1_PWM1B_OUT       110
-#define FUNMUX1_PWM3B_OUT       111
-#define FUNMUX1_PWM5B_OUT       112
-#define FUNMUX1_PULSE_IN        113
-#define FUNMUX1_TIMR1_IN        114
-#define FUNMUX1_TIMR3_IN        115
-#define FUNMUX1_CAN_TX          116
-#define FUNMUX1_SPI0_SCLK       117
-#define FUNMUX1_SPI0_MISO       118
-#define FUNMUX1_SPI1_SCLK       119
-#define FUNMUX1_SPI1_MISO       120
-#define FUNMUX1_UART0_RTS       121
-#define FUNMUX1_UART1_RTS       122
-#define FUNMUX1_UART2_RTS       123
-#define FUNMUX1_UART3_RTS       124
+#define PORTM_PIN17_GPIO 0
+#define PORTM_PIN17_FUNMUX 1
+#define PORTM_PIN17_NORFL_WEN 2
 
 
+#define PORTM_PIN18_GPIO 0
+#define PORTM_PIN18_FUNMUX 1
+#define PORTM_PIN18_NORFL_CSN 2
+
+#define PORTM_PIN19_GPIO 0
+#define PORTM_PIN19_FUNMUX 1
+#define PORTM_PIN19_SDRAM_CSN 2
+
+#define PORTM_PIN20_GPIO 0
+#define PORTM_PIN20_FUNMUX 1
+#define PORTM_PIN20_SRAM_CSN 2
+
+#define PORTM_PIN21_GPIO 0
+#define PORTM_PIN21_FUNMUX 1
+#define PORTM_PIN21_SDRAM_CKE 2
+
+#define PORTN_PIN0_GPIO 0
+#define PORTN_PIN0_FUNMUX 1
+#define PORTN_PIN0_LCD_D0 2
+#define PORTN_PIN0_ADC1_IN4 3
+
+#define PORTN_PIN1_GPIO 0
+#define PORTN_PIN1_FUNMUX 1
+#define PORTN_PIN1_LCD_D1 2
+#define PORTN_PIN1_ADC1_IN5 3
+
+#define PORTN_PIN2_GPIO 0
+#define PORTN_PIN2_FUNMUX 1
+#define PORTN_PIN2_LCD_D2 2
+#define PORTN_PIN2_ADC1_IN6 3
+
+#define PORTN_PIN3_GPIO 0
+#define PORTN_PIN3_FUNMUX 1
+#define PORTN_PIN3_LCD_D3 2
+
+#define PORTN_PIN4_GPIO 0
+#define PORTN_PIN4_FUNMUX 1
+#define PORTN_PIN4_LCD_D4 2
+
+#define PORTN_PIN5_GPIO 0
+#define PORTN_PIN5_FUNMUX 1
+#define PORTN_PIN5_LCD_D5 2
+
+#define PORTN_PIN6_GPIO 0
+#define PORTN_PIN6_FUNMUX 1
+#define PORTN_PIN6_LCD_D6 2
+
+#define PORTN_PIN7_GPIO 0
+#define PORTN_PIN7_FUNMUX 1
+#define PORTN_PIN7_LCD_D7 2
+
+#define PORTN_PIN8_GPIO 0
+#define PORTN_PIN8_FUNMUX 1
+#define PORTN_PIN8_LCD_D8 2
+
+#define PORTN_PIN9_GPIO 0
+#define PORTN_PIN9_FUNMUX 1
+#define PORTN_PIN9_LCD_D9 2
+
+#define PORTN_PIN10_GPIO 0
+#define PORTN_PIN10_FUNMUX 1
+#define PORTN_PIN10_LCD_D10 2
+
+#define PORTN_PIN11_GPIO 0
+#define PORTN_PIN11_FUNMUX 1
+#define PORTN_PIN11_LCD_D11 2
+
+#define PORTN_PIN12_GPIO 0
+#define PORTN_PIN12_FUNMUX 1
+#define PORTN_PIN12_LCD_D12 2
+
+#define PORTN_PIN13_GPIO 0
+#define PORTN_PIN13_FUNMUX 1
+#define PORTN_PIN13_LCD_D13 2
+
+#define PORTN_PIN14_GPIO 0
+#define PORTN_PIN14_FUNMUX 1
+#define PORTN_PIN14_LCD_D14 2
+
+#define PORTN_PIN15_GPIO 0
+#define PORTN_PIN15_FUNMUX 1
+#define PORTN_PIN15_LCD_D15 2
+
+#define PORTN_PIN16_GPIO 0
+#define PORTN_PIN16_FUNMUX 1
+#define PORTN_PIN16_LCD_RD 2
+#define PORTN_PIN16_LCD_DOTCK 2
+
+#define PORTN_PIN17_GPIO 0
+#define PORTN_PIN17_FUNMUX 1
+#define PORTN_PIN17_LCD_CS 2
+#define PORTN_PIN17_LCD_VSYNC 2
+
+#define PORTN_PIN18_GPIO 0
+#define PORTN_PIN18_LCD_RS 2
+#define PORTN_PIN18_LCD_DATEN 2 //Data Enable
+
+#define PORTN_PIN19_GPIO 0
+#define PORTN_PIN19_LCD_WR 2
+#define PORTN_PIN19_LCD_HSYNC 2
+
+#define PORTP_PIN0_GPIO 0
+#define PORTP_PIN0_FUNMUX 1
+#define PORTP_PIN0_NORFL_A0 2
+
+#define PORTP_PIN1_GPIO 0
+#define PORTP_PIN1_FUNMUX 1
+#define PORTP_PIN1_NORFL_A1 2
+
+#define PORTP_PIN2_GPIO 0
+#define PORTP_PIN2_FUNMUX 1
+#define PORTP_PIN2_NORFL_A2 2
+#define PORTP_PIN2_SD_D7 3
+
+#define PORTP_PIN3_GPIO 0
+#define PORTP_PIN3_FUNMUX 1
+#define PORTP_PIN3_NORFL_A3 2
+#define PORTP_PIN3_SD_D6 3
+
+#define PORTP_PIN4_GPIO 0
+#define PORTP_PIN4_FUNMUX 1
+#define PORTP_PIN4_NORFL_A4 2
+#define PORTP_PIN4_SD_D5 3
+
+#define PORTP_PIN5_GPIO 0
+#define PORTP_PIN5_FUNMUX 1
+#define PORTP_PIN5_NORFL_A5 2
+#define PORTP_PIN5_SD_D4 3
+
+#define PORTP_PIN6_GPIO 0
+#define PORTP_PIN6_FUNMUX 1
+#define PORTP_PIN6_NORFL_A6 2
+#define PORTP_PIN6_SD_D3 3
+
+#define PORTP_PIN7_GPIO 0
+#define PORTP_PIN7_FUNMUX 1
+#define PORTP_PIN7_NORFL_A7 2
+#define PORTP_PIN7_SD_D2 3
+
+#define PORTP_PIN8_GPIO 0
+#define PORTP_PIN8_FUNMUX 1
+#define PORTP_PIN8_NORFL_A8 2
+#define PORTP_PIN8_SD_D1 3
+
+#define PORTP_PIN9_GPIO 0
+#define PORTP_PIN9_FUNMUX 1
+#define PORTP_PIN9_NORFL_A9 2
+#define PORTP_PIN9_SD_D0 3
+
+#define PORTP_PIN10_GPIO 0
+#define PORTP_PIN10_FUNMUX 1
+#define PORTP_PIN10_NORFL_A10 2
+#define PORTP_PIN10_SD_CMD 3
+
+#define PORTP_PIN11_GPIO 0
+#define PORTP_PIN11_FUNMUX 1
+#define PORTP_PIN11_NORFL_A11 2
+#define PORTP_PIN11_SD_CLK 3
+
+#define PORTP_PIN12_GPIO 0
+#define PORTP_PIN12_FUNMUX 1
+#define PORTP_PIN12_NORFL_A12 2
+#define PORTP_PIN12_SD_DETECT 3
+
+#define PORTP_PIN13_GPIO 0
+#define PORTP_PIN13_FUNMUX 1
+#define PORTP_PIN13_NORFL_A13 2
+#define PORTP_PIN13_SDRAM_CLK 2
+
+#define PORTP_PIN14_GPIO 0
+#define PORTP_PIN14_FUNMUX 1
+#define PORTP_PIN14_NORFL_A14 2
+#define PORTP_PIN14_SDRAM_CAS 2
+
+#define PORTP_PIN15_GPIO 0
+#define PORTP_PIN15_FUNMUX 1
+#define PORTP_PIN15_NORFL_A15 2
+#define PORTP_PIN15_SDRAM_RAS 2
+
+#define PORTP_PIN16_GPIO 0
+#define PORTP_PIN16_FUNMUX 1
+#define PORTP_PIN16_NORFL_A16 2
+#define PORTP_PIN16_SDRAM_LDQ 2
+
+#define PORTP_PIN17_GPIO 0
+#define PORTP_PIN17_FUNMUX 1
+#define PORTP_PIN17_NORFL_A17 2
+#define PORTP_PIN17_SDRAM_UDQ 2
+
+#define PORTP_PIN18_GPIO 0
+#define PORTP_PIN18_FUNMUX 1
+#define PORTP_PIN18_NORFL_A18 2
+
+#define PORTP_PIN19_GPIO 0
+#define PORTP_PIN19_FUNMUX 1
+#define PORTP_PIN19_NORFL_A19 2
+
+#define PORTP_PIN20_GPIO 0
+#define PORTP_PIN20_FUNMUX 1
+#define PORTP_PIN20_NORFL_A20 2
+#define PORTP_PIN20_SDRAM_BA0 2
+
+#define PORTP_PIN21_GPIO 0
+#define PORTP_PIN21_FUNMUX 1
+#define PORTP_PIN21_NORFL_A21 2
+#define PORTP_PIN21_SDRAM_BA1 2
+
+#define PORTP_PIN22_GPIO 0
+#define PORTP_PIN22_FUNMUX 1
+#define PORTP_PIN22_NORFL_A22 2
+
+#define PORTP_PIN23_GPIO 0
+#define PORTP_PIN23_FUNMUX 1
+#define PORTP_PIN23_NORFL_A23 2
+
+/* 涓嬮潰瀹忓畾涔夌殑鍙栧€煎叏閮ㄥ湪姝g‘鍊肩殑鍩虹�涓娾€滃姞100鈥濓紝浠ュ尯鍒嗕笂闈㈠畯瀹氫箟鐨勫€硷紝浠庤€屾柟渚垮簱鍑芥暟鐨勭紪鍐�*/
+/* 涓嬮潰杩欎簺鍊兼槸鍋舵暟缂栧彿寮曡剼鐨勫姛鑳藉彇鍊硷紝濡侾IN0銆丳IN2銆�... */
+#define FUNMUX0_UART0_RXD 100
+#define FUNMUX0_UART1_RXD 101
+#define FUNMUX0_UART2_RXD 102
+#define FUNMUX0_UART3_RXD 103
+#define FUNMUX0_I2C0_SCL 105
+#define FUNMUX0_I2C1_SCL 106
+#define FUNMUX0_PWM0A_OUT 107
+#define FUNMUX0_PWM2A_OUT 108
+#define FUNMUX0_PWM4A_OUT 109
+#define FUNMUX0_PWM0B_OUT 110
+#define FUNMUX0_PWM2B_OUT 111
+#define FUNMUX0_PWM4B_OUT 112
+#define FUNMUX0_PWM_BREAK 113
+#define FUNMUX0_TIMR0_IN 114
+#define FUNMUX0_TIMR2_IN 115
+#define FUNMUX0_CAN_RX 116
+#define FUNMUX0_SPI0_SSEL 117
+#define FUNMUX0_SPI0_MOSI 118
+#define FUNMUX0_SPI1_SSEL 119
+#define FUNMUX0_SPI1_MOSI 120
+#define FUNMUX0_UART0_CTS 121
+#define FUNMUX0_UART1_CTS 122
+#define FUNMUX0_UART2_CTS 123
+#define FUNMUX0_UART3_CTS 124
+
+/* 涓嬮潰杩欎簺鍊兼槸濂囨暟缂栧彿寮曡剼鐨勫姛鑳藉彇鍊硷紝濡侾IN1銆丳IN3銆�... */
+#define FUNMUX1_UART0_TXD 100
+#define FUNMUX1_UART1_TXD 101
+#define FUNMUX1_UART2_TXD 102
+#define FUNMUX1_UART3_TXD 103
+#define FUNMUX1_I2C0_SDA 105
+#define FUNMUX1_I2C1_SDA 106
+#define FUNMUX1_PWM1A_OUT 107
+#define FUNMUX1_PWM3A_OUT 108
+#define FUNMUX1_PWM5A_OUT 109
+#define FUNMUX1_PWM1B_OUT 110
+#define FUNMUX1_PWM3B_OUT 111
+#define FUNMUX1_PWM5B_OUT 112
+#define FUNMUX1_PULSE_IN 113
+#define FUNMUX1_TIMR1_IN 114
+#define FUNMUX1_TIMR3_IN 115
+#define FUNMUX1_CAN_TX 116
+#define FUNMUX1_SPI0_SCLK 117
+#define FUNMUX1_SPI0_MISO 118
+#define FUNMUX1_SPI1_SCLK 119
+#define FUNMUX1_SPI1_MISO 120
+#define FUNMUX1_UART0_RTS 121
+#define FUNMUX1_UART1_RTS 122
+#define FUNMUX1_UART2_RTS 123
+#define FUNMUX1_UART3_RTS 124
 
 
 #endif //__SWM320_PORT_H__
 #endif //__SWM320_PORT_H__

+ 26 - 26
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_pwm.c

@@ -24,7 +24,7 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_Init()
 * 函数名称: PWM_Init()
 * 功能说明: PWM初始化
 * 功能说明: PWM初始化
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           PWM_InitStructure * initStruct  包含PWM相关设定值的结构体
 *           PWM_InitStructure * initStruct  包含PWM相关设定值的结构体
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -101,9 +101,9 @@ void PWM_Init(PWM_TypeDef *PWMx, PWM_InitStructure *initStruct)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_Start()
 * 函数名称: PWM_Start()
 * 功能说明: 启动PWM,开始PWM输出
 * 功能说明: 启动PWM,开始PWM输出
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
-*           uint32_t chA            0 通道A不启动       1 通道A启动
-*           uint32_t chB            0 通道B不启动       1 通道B启动
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+*           uint32_t chA            0 通道A不启动        1 通道A启动
+*           uint32_t chB            0 通道B不启动        1 通道B启动
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -140,9 +140,9 @@ void PWM_Start(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_Stop()
 * 函数名称: PWM_Stop()
 * 功能说明: 关闭PWM,停止PWM输出
 * 功能说明: 关闭PWM,停止PWM输出
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
-*           uint32_t chA            0 通道A不关闭       1 通道A关闭
-*           uint32_t chB            0 通道B不关闭       1 通道B关闭
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+*           uint32_t chA            0 通道A不关闭        1 通道A关闭
+*           uint32_t chB            0 通道B不关闭        1 通道B关闭
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
@@ -179,7 +179,7 @@ void PWM_Stop(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_SetCycle()
 * 函数名称: PWM_SetCycle()
 * 功能说明: 设置周期
 * 功能说明: 设置周期
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint16_t cycle          要设定的周期值
 *           uint16_t cycle          要设定的周期值
 * 输    出: 无
 * 输    出: 无
@@ -196,9 +196,9 @@ void PWM_SetCycle(PWM_TypeDef *PWMx, uint32_t chn, uint16_t cycle)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_GetCycle()
 * 函数名称: PWM_GetCycle()
 * 功能说明: 获取周期
 * 功能说明: 获取周期
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
-* 输    出: uint16_t                获取到的周期值
+* 输    出: uint16_t              获取到的周期值
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn)
 uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn)
@@ -216,7 +216,7 @@ uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_SetHDuty()
 * 函数名称: PWM_SetHDuty()
 * 功能说明: 设置高电平时长
 * 功能说明: 设置高电平时长
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint16_t hduty          要设定的高电平时长
 *           uint16_t hduty          要设定的高电平时长
 * 输    出: 无
 * 输    出: 无
@@ -233,9 +233,9 @@ void PWM_SetHDuty(PWM_TypeDef *PWMx, uint32_t chn, uint16_t hduty)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_GetHDuty()
 * 函数名称: PWM_GetHDuty()
 * 功能说明: 获取高电平时长
 * 功能说明: 获取高电平时长
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
-* 输    出: uint16_t                获取到的高电平时长
+* 输    出: uint16_t              获取到的高电平时长
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn)
 uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn)
@@ -253,7 +253,7 @@ uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_SetDeadzone()
 * 函数名称: PWM_SetDeadzone()
 * 功能说明: 设置死区时长
 * 功能说明: 设置死区时长
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint8_t deadzone        要设定的死区时长
 *           uint8_t deadzone        要设定的死区时长
 * 输    出: 无
 * 输    出: 无
@@ -270,9 +270,9 @@ void PWM_SetDeadzone(PWM_TypeDef *PWMx, uint32_t chn, uint8_t deadzone)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_GetDeadzone()
 * 函数名称: PWM_GetDeadzone()
 * 功能说明: 获取死区时长
 * 功能说明: 获取死区时长
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
-* 输    出: uint8_t                 获取到的死区时长
+* 输    出: uint8_t                   获取到的死区时长
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn)
 uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn)
@@ -290,7 +290,7 @@ uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_IntNCycleEn()
 * 函数名称: PWM_IntNCycleEn()
 * 功能说明: 新周期开始中断使能
 * 功能说明: 新周期开始中断使能
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -346,7 +346,7 @@ void PWM_IntNCycleEn(PWM_TypeDef *PWMx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_IntNCycleDis()
 * 函数名称: PWM_IntNCycleDis()
 * 功能说明: 新周期开始中断禁能
 * 功能说明: 新周期开始中断禁能
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -402,7 +402,7 @@ void PWM_IntNCycleDis(PWM_TypeDef *PWMx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_IntNCycleClr()
 * 函数名称: PWM_IntNCycleClr()
 * 功能说明: 新周期开始中断标志清除
 * 功能说明: 新周期开始中断标志清除
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -458,9 +458,9 @@ void PWM_IntNCycleClr(PWM_TypeDef *PWMx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_IntNCycleStat()
 * 函数名称: PWM_IntNCycleStat()
 * 功能说明: 新周期开始中断是否发生
 * 功能说明: 新周期开始中断是否发生
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
-* 输    出: uint32_t                1 新周期开始中断已发生    0 新周期开始中断未发生
+* 输    出: uint32_t              1 新周期开始中断已发生    0 新周期开始中断未发生
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn)
 uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn)
@@ -518,7 +518,7 @@ uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_IntHEndEn()
 * 函数名称: PWM_IntHEndEn()
 * 功能说明: 高电平结束中断使能
 * 功能说明: 高电平结束中断使能
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -574,7 +574,7 @@ void PWM_IntHEndEn(PWM_TypeDef *PWMx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_IntHEndDis()
 * 函数名称: PWM_IntHEndDis()
 * 功能说明: 高电平结束中断禁能
 * 功能说明: 高电平结束中断禁能
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -630,7 +630,7 @@ void PWM_IntHEndDis(PWM_TypeDef *PWMx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_IntHEndClr()
 * 函数名称: PWM_IntHEndClr()
 * 功能说明: 高电平结束中断标志清除
 * 功能说明: 高电平结束中断标志清除
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 * 输    出: 无
 * 输    出: 无
 * 注意事项: 无
 * 注意事项: 无
@@ -686,9 +686,9 @@ void PWM_IntHEndClr(PWM_TypeDef *PWMx, uint32_t chn)
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
 * 函数名称: PWM_IntHEndStat()
 * 函数名称: PWM_IntHEndStat()
 * 功能说明: 高电平结束中断是否发生
 * 功能说明: 高电平结束中断是否发生
-* 输    入: PWM_TypeDef * PWMx      指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
 *           uint32_t chn            选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
-* 输    出: uint32_t                1 高电平结束中断已发生    0 高电平结束中断未发生
+* 输    出: uint32_t              1 高电平结束中断已发生    0 高电平结束中断未发生
 * 注意事项: 无
 * 注意事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn)
 uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn)

+ 162 - 156
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_rtc.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* ÎļþÃû³Æ: SWM320_rtc.c
-* ¹¦ÄÜ˵Ã÷: SWM320µ¥Æ¬»úµÄRTCÇý¶¯¿â
-* ¼¼ÊõÖ§³Ö: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ×¢ÒâÊÂÏî:
-* °æ±¾ÈÕÆÚ: V1.1.0      2017Äê10ÔÂ25ÈÕ
-* Éý¼¶¼Ç¼:
+* 文件�称: SWM320_rtc.c
+* 功能说明: SWM320�片机的RTC驱动库
+* 技术支�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注�事项:
+* 版本日期: V1.1.0      2017年10月25日
+* �级记录:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -21,39 +21,39 @@
 #include "SWM320.h"
 #include "SWM320.h"
 #include "SWM320_rtc.h"
 #include "SWM320_rtc.h"
 
 
-
 static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date);
 static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date);
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_Init()
-* ¹¦ÄÜ˵Ã÷: RTC³õʼ»¯
-* Êä    Èë: RTC_TypeDef * RTCx  Ö¸¶¨Òª±»ÉèÖõÄRTC£¬ÓÐЧֵ°üÀ¨RTC
-*           RTC_InitStructure * initStruct    °üº¬RTCÏà¹ØÉ趨ֵµÄ½á¹¹Ìå
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_Init()
+* 功能说明: RTC�始化
+* 输    入: RTC_TypeDef * RTCx    指定�被设置的RTC,有效值包括RTC
+*           RTC_InitStructure * initStruct    包�RTC相关设定值的结构体
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_Init(RTC_TypeDef *RTCx, RTC_InitStructure *initStruct)
 void RTC_Init(RTC_TypeDef *RTCx, RTC_InitStructure *initStruct)
 {
 {
     SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
     SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
 
 
-    SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos);    //RTCʹÓÃ32KHz RCʱÖÓ
+    SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos); //RTC使用32KHz RC时钟
 
 
     SYS->CLKEN |= (1 << SYS_CLKEN_RTC_Pos) |
     SYS->CLKEN |= (1 << SYS_CLKEN_RTC_Pos) |
                   ((uint32_t)1 << SYS_CLKEN_ALIVE_Pos);
                   ((uint32_t)1 << SYS_CLKEN_ALIVE_Pos);
 
 
     RTC_Stop(RTCx);
     RTC_Stop(RTCx);
 
 
-    while (RTCx->CFGABLE == 0);
+    while (RTCx->CFGABLE == 0)
+        ;
 
 
     RTCx->MINSEC = (initStruct->Second << RTC_MINSEC_SEC_Pos) |
     RTCx->MINSEC = (initStruct->Second << RTC_MINSEC_SEC_Pos) |
                    (initStruct->Minute << RTC_MINSEC_MIN_Pos);
                    (initStruct->Minute << RTC_MINSEC_MIN_Pos);
 
 
     RTCx->DATHUR = (initStruct->Hour << RTC_DATHUR_HOUR_Pos) |
     RTCx->DATHUR = (initStruct->Hour << RTC_DATHUR_HOUR_Pos) |
-                   ((initStruct->Date - 1) << RTC_DATHUR_DATE_Pos);
+                   (initStruct->Date << RTC_DATHUR_DATE_Pos);
 
 
     RTCx->MONDAY = (calcWeekDay(initStruct->Year, initStruct->Month, initStruct->Date) << RTC_MONDAY_DAY_Pos) |
     RTCx->MONDAY = (calcWeekDay(initStruct->Year, initStruct->Month, initStruct->Date) << RTC_MONDAY_DAY_Pos) |
-                   ((initStruct->Month - 1) << RTC_MONDAY_MON_Pos);
+                   (initStruct->Month << RTC_MONDAY_MON_Pos);
 
 
-    RTCx->YEAR = initStruct->Year - 1901;
+    RTCx->YEAR = initStruct->Year;
 
 
     RTCx->LOAD = 1 << RTC_LOAD_TIME_Pos;
     RTCx->LOAD = 1 << RTC_LOAD_TIME_Pos;
 
 
@@ -72,11 +72,11 @@ void RTC_Init(RTC_TypeDef *RTCx, RTC_InitStructure *initStruct)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_Start()
-* ¹¦ÄÜ˵Ã÷: Æô¶¯RTC
-* Êä    Èë: RTC_TypeDef * RTCx  Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_Start()
+* 功能说明: �动RTC
+* 输    入: RTC_TypeDef * RTCx    指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_Start(RTC_TypeDef *RTCx)
 void RTC_Start(RTC_TypeDef *RTCx)
 {
 {
@@ -84,11 +84,11 @@ void RTC_Start(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_Stop()
-* ¹¦ÄÜ˵Ã÷: Í£Ö¹RTC
-* Êä    Èë: RTC_TypeDef * RTCx  Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_Stop()
+* 功能说明: �止RTC
+* 输    入: RTC_TypeDef * RTCx    指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_Stop(RTC_TypeDef *RTCx)
 void RTC_Stop(RTC_TypeDef *RTCx)
 {
 {
@@ -96,18 +96,18 @@ void RTC_Stop(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_GetDateTime()
-* ¹¦ÄÜ˵Ã÷: »ñÈ¡µ±Ç°µÄʱ¼äºÍÈÕÆÚ
-* Êä    Èë: RTC_TypeDef * RTCx  Ö¸¶¨Òª±»ÉèÖõÄRTC£¬ÓÐЧֵ°üÀ¨RTC
-*           RTC_DateTime * dateTime    »ñÈ¡µ½µÄʱ¼ä¡¢ÈÕÆÚÖµ´æÈë´ËÖ¸ÕëÖ¸ÏòµÄ½á¹¹Ìå
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_GetDateTime()
+* 功能说明: 获�当�的时间和日期
+* 输    入: RTC_TypeDef * RTCx    指定�被设置的RTC,有效值包括RTC
+*           RTC_DateTime * dateTime    获�到的时间�日期值存入此指针指�的结构体
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_GetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime)
 void RTC_GetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime)
 {
 {
-    dateTime->Year = RTCx->YEAR + 1901;
-    dateTime->Month = ((RTCx->MONDAY & RTC_MONDAY_MON_Msk) >> RTC_MONDAY_MON_Pos) + 1;
-    dateTime->Date = ((RTCx->DATHUR & RTC_DATHUR_DATE_Msk) >> RTC_DATHUR_DATE_Pos) + 1;
+    dateTime->Year = RTCx->YEAR;
+    dateTime->Month = (RTCx->MONDAY & RTC_MONDAY_MON_Msk) >> RTC_MONDAY_MON_Pos;
+    dateTime->Date = (RTCx->DATHUR & RTC_DATHUR_DATE_Msk) >> RTC_DATHUR_DATE_Pos;
     dateTime->Day = 1 << ((RTCx->MONDAY & RTC_MONDAY_DAY_Msk) >> RTC_MONDAY_DAY_Pos);
     dateTime->Day = 1 << ((RTCx->MONDAY & RTC_MONDAY_DAY_Msk) >> RTC_MONDAY_DAY_Pos);
     dateTime->Hour = (RTCx->DATHUR & RTC_DATHUR_HOUR_Msk) >> RTC_DATHUR_HOUR_Pos;
     dateTime->Hour = (RTCx->DATHUR & RTC_DATHUR_HOUR_Msk) >> RTC_DATHUR_HOUR_Pos;
     dateTime->Minute = (RTCx->MINSEC & RTC_MINSEC_MIN_Msk) >> RTC_MINSEC_MIN_Pos;
     dateTime->Minute = (RTCx->MINSEC & RTC_MINSEC_MIN_Msk) >> RTC_MINSEC_MIN_Pos;
@@ -115,16 +115,17 @@ void RTC_GetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_AlarmSetup()
-* ¹¦ÄÜ˵Ã÷: RTCÄÖÖÓÉ趨
-* Êä    Èë: RTC_TypeDef * RTCx  Ö¸¶¨Òª±»ÉèÖõÄRTC£¬ÓÐЧֵ°üÀ¨RTC
-*           RTC_AlarmStructure * alarmStruct    °üº¬RTCÄÖÖÓÉ趨ֵµÄ½á¹¹Ìå
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_AlarmSetup()
+* 功能说明: RTC闹钟设定
+* 输    入: RTC_TypeDef * RTCx    指定�被设置的RTC,有效值包括RTC
+*           RTC_AlarmStructure * alarmStruct    包�RTC闹钟设定值的结构体
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct)
 void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct)
 {
 {
-    while (RTCx->CFGABLE == 0);
+    while (RTCx->CFGABLE == 0)
+        ;
 
 
     RTCx->MINSECAL = (alarmStruct->Second << RTC_MINSECAL_SEC_Pos) |
     RTCx->MINSECAL = (alarmStruct->Second << RTC_MINSECAL_SEC_Pos) |
                      (alarmStruct->Minute << RTC_MINSECAL_MIN_Pos);
                      (alarmStruct->Minute << RTC_MINSECAL_MIN_Pos);
@@ -133,51 +134,56 @@ void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct)
                      (alarmStruct->Days << RTC_DAYHURAL_SUN_Pos);
                      (alarmStruct->Days << RTC_DAYHURAL_SUN_Pos);
 
 
     RTCx->LOAD = 1 << RTC_LOAD_ALARM_Pos;
     RTCx->LOAD = 1 << RTC_LOAD_ALARM_Pos;
-    while (RTCx->LOAD & RTC_LOAD_ALARM_Msk);
+    while (RTCx->LOAD & RTC_LOAD_ALARM_Msk)
+        ;
 
 
     RTCx->IF = (1 << RTC_IF_ALARM_Pos);
     RTCx->IF = (1 << RTC_IF_ALARM_Pos);
     RTCx->IE &= ~RTC_IE_ALARM_Msk;
     RTCx->IE &= ~RTC_IE_ALARM_Msk;
     RTCx->IE |= (alarmStruct->AlarmIEn << RTC_IE_ALARM_Pos);
     RTCx->IE |= (alarmStruct->AlarmIEn << RTC_IE_ALARM_Pos);
 
 
-    if (alarmStruct->AlarmIEn)  NVIC_EnableIRQ(RTC_IRQn);
+    if (alarmStruct->AlarmIEn)
+        NVIC_EnableIRQ(RTC_IRQn);
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: calcWeekDay()
-* ¹¦ÄÜ˵Ã÷: ¼ÆËãÖ¸¶¨Äê¡¢Ô¡¢ÈÕÊÇÐÇÆÚ¼¸
-* Êä    Èë: uint32_t year       Äê
-*           uint32_t month      ÔÂ
-*           uint32_t date       ÈÕ
-* Êä    ³ö: uint32_t            0 ÐÇÆÚÈÕ    1 ÐÇÆÚÒ»    ... ...    6 ÐÇÆÚÁù
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: calcWeekDay()
+* 功能说明: 计算指定年�月�日是星期几
+* 输    入: uint32_t year     年
+*           uint32_t month      月
+*           uint32_t date       æ—¥
+* 输    出: uint32_t          0 星期日    1 星期一    ... ...    6 星期六
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
 static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
 {
 {
     uint32_t i, cnt = 0;
     uint32_t i, cnt = 0;
     const uint32_t daysOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
     const uint32_t daysOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
 
-    for (i = 1; i < month; i++) cnt += daysOfMonth[i];
+    for (i = 1; i < month; i++)
+        cnt += daysOfMonth[i];
 
 
     cnt += date;
     cnt += date;
 
 
-    if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)) && (month >= 3)) cnt += 1;
+    if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)) && (month >= 3))
+        cnt += 1;
 
 
     cnt += (year - 1901) * 365;
     cnt += (year - 1901) * 365;
 
 
     for (i = 1901; i < year; i++)
     for (i = 1901; i < year; i++)
     {
     {
-        if ((i % 4 == 0) && ((i % 100 != 0) || (i % 400 == 0))) cnt += 1;
+        if ((i % 4 == 0) && ((i % 100 != 0) || (i % 400 == 0)))
+            cnt += 1;
     }
     }
 
 
     return (cnt + 1) % 7;
     return (cnt + 1) % 7;
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntSecondEn()
-* ¹¦ÄÜ˵Ã÷: ÃëÖжÏʹÄÜ
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntSecondEn()
+* 功能说明: 秒中断使能
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntSecondEn(RTC_TypeDef *RTCx)
 void RTC_IntSecondEn(RTC_TypeDef *RTCx)
 {
 {
@@ -185,11 +191,11 @@ void RTC_IntSecondEn(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntSecondDis()
-* ¹¦ÄÜ˵Ã÷: ÃëÖжϽûÖ¹
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntSecondDis()
+* 功能说明: 秒中断�止
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntSecondDis(RTC_TypeDef *RTCx)
 void RTC_IntSecondDis(RTC_TypeDef *RTCx)
 {
 {
@@ -197,11 +203,11 @@ void RTC_IntSecondDis(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntSecondClr()
-* ¹¦ÄÜ˵Ã÷: ÃëÖжϱêÖ¾Çå³ý
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntSecondClr()
+* 功能说明: 秒中断标志清除
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntSecondClr(RTC_TypeDef *RTCx)
 void RTC_IntSecondClr(RTC_TypeDef *RTCx)
 {
 {
@@ -209,11 +215,11 @@ void RTC_IntSecondClr(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntSecondStat()
-* ¹¦ÄÜ˵Ã÷: ÃëÖжÏ״̬
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: uint32_t                1 ÃëÖжϷ¢Éú    0 ÃëÖжÏδ·¢Éú
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntSecondStat()
+* 功能说明: 秒中断状�
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: uint32_t              1 秒中断�生    0 秒中断未�生
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t RTC_IntSecondStat(RTC_TypeDef *RTCx)
 uint32_t RTC_IntSecondStat(RTC_TypeDef *RTCx)
 {
 {
@@ -221,11 +227,11 @@ uint32_t RTC_IntSecondStat(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntMinuteEn()
-* ¹¦ÄÜ˵Ã÷: ·ÖÖжÏʹÄÜ
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntMinuteEn()
+* 功能说明: 分中断使能
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntMinuteEn(RTC_TypeDef *RTCx)
 void RTC_IntMinuteEn(RTC_TypeDef *RTCx)
 {
 {
@@ -233,11 +239,11 @@ void RTC_IntMinuteEn(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntMinuteDis()
-* ¹¦ÄÜ˵Ã÷: ·ÖÖжϽûÖ¹
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntMinuteDis()
+* 功能说明: 分中断�止
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntMinuteDis(RTC_TypeDef *RTCx)
 void RTC_IntMinuteDis(RTC_TypeDef *RTCx)
 {
 {
@@ -245,11 +251,11 @@ void RTC_IntMinuteDis(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntMinuteClr()
-* ¹¦ÄÜ˵Ã÷: ·ÖÖжϱêÖ¾Çå³ý
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntMinuteClr()
+* 功能说明: 分中断标志清除
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntMinuteClr(RTC_TypeDef *RTCx)
 void RTC_IntMinuteClr(RTC_TypeDef *RTCx)
 {
 {
@@ -257,11 +263,11 @@ void RTC_IntMinuteClr(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntMinuteStat()
-* ¹¦ÄÜ˵Ã÷: ·ÖÖжÏ״̬
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: uint32_t                1 ·ÖÖжϷ¢Éú    0 ·ÖÖжÏδ·¢Éú
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntMinuteStat()
+* 功能说明: 分中断状�
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: uint32_t              1 分中断�生    0 分中断未�生
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t RTC_IntMinuteStat(RTC_TypeDef *RTCx)
 uint32_t RTC_IntMinuteStat(RTC_TypeDef *RTCx)
 {
 {
@@ -269,11 +275,11 @@ uint32_t RTC_IntMinuteStat(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntHourEn()
-* ¹¦ÄÜ˵Ã÷: ʱÖжÏʹÄÜ
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntHourEn()
+* 功能说明: 时中断使能
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntHourEn(RTC_TypeDef *RTCx)
 void RTC_IntHourEn(RTC_TypeDef *RTCx)
 {
 {
@@ -281,11 +287,11 @@ void RTC_IntHourEn(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntHourDis()
-* ¹¦ÄÜ˵Ã÷: ʱÖжϽûÖ¹
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntHourDis()
+* 功能说明: 时中断�止
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntHourDis(RTC_TypeDef *RTCx)
 void RTC_IntHourDis(RTC_TypeDef *RTCx)
 {
 {
@@ -293,11 +299,11 @@ void RTC_IntHourDis(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntHourClr()
-* ¹¦ÄÜ˵Ã÷: ʱÖжϱêÖ¾Çå³ý
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntHourClr()
+* 功能说明: 时中断标志清除
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntHourClr(RTC_TypeDef *RTCx)
 void RTC_IntHourClr(RTC_TypeDef *RTCx)
 {
 {
@@ -305,11 +311,11 @@ void RTC_IntHourClr(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntHourStat()
-* ¹¦ÄÜ˵Ã÷: ʱÖжÏ״̬
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: uint32_t                1 ʱÖжϷ¢Éú    0 ʱÖжÏδ·¢Éú
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntHourStat()
+* 功能说明: 时中断状�
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: uint32_t              1 时中断�生    0 时中断未�生
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t RTC_IntHourStat(RTC_TypeDef *RTCx)
 uint32_t RTC_IntHourStat(RTC_TypeDef *RTCx)
 {
 {
@@ -317,11 +323,11 @@ uint32_t RTC_IntHourStat(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntDateEn()
-* ¹¦ÄÜ˵Ã÷: ÈÕÖжÏʹÄÜ
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntDateEn()
+* 功能说明: 日中断使能
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntDateEn(RTC_TypeDef *RTCx)
 void RTC_IntDateEn(RTC_TypeDef *RTCx)
 {
 {
@@ -329,11 +335,11 @@ void RTC_IntDateEn(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntDateDis()
-* ¹¦ÄÜ˵Ã÷: ÈÕÖжϽûÖ¹
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntDateDis()
+* 功能说明: 日中断�止
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntDateDis(RTC_TypeDef *RTCx)
 void RTC_IntDateDis(RTC_TypeDef *RTCx)
 {
 {
@@ -341,11 +347,11 @@ void RTC_IntDateDis(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntDateClr()
-* ¹¦ÄÜ˵Ã÷: ÈÕÖжϱêÖ¾Çå³ý
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntDateClr()
+* 功能说明: 日中断标志清除
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntDateClr(RTC_TypeDef *RTCx)
 void RTC_IntDateClr(RTC_TypeDef *RTCx)
 {
 {
@@ -353,11 +359,11 @@ void RTC_IntDateClr(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntDateStat()
-* ¹¦ÄÜ˵Ã÷: ÈÕÖжÏ״̬
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: uint32_t                1 ÈÕÖжϷ¢Éú    0 ÈÕÖжÏδ·¢Éú
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntDateStat()
+* 功能说明: 日中断状�
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: uint32_t              1 日中断�生    0 日中断未�生
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t RTC_IntDateStat(RTC_TypeDef *RTCx)
 uint32_t RTC_IntDateStat(RTC_TypeDef *RTCx)
 {
 {
@@ -365,11 +371,11 @@ uint32_t RTC_IntDateStat(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntAlarmEn()
-* ¹¦ÄÜ˵Ã÷: ÄÖÖÓÖжÏʹÄÜ
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntAlarmEn()
+* 功能说明: 闹钟中断使能
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntAlarmEn(RTC_TypeDef *RTCx)
 void RTC_IntAlarmEn(RTC_TypeDef *RTCx)
 {
 {
@@ -377,11 +383,11 @@ void RTC_IntAlarmEn(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntAlarmDis()
-* ¹¦ÄÜ˵Ã÷: ÄÖÖÓÖжϽûÖ¹
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntAlarmDis()
+* 功能说明: 闹钟中断�止
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntAlarmDis(RTC_TypeDef *RTCx)
 void RTC_IntAlarmDis(RTC_TypeDef *RTCx)
 {
 {
@@ -389,11 +395,11 @@ void RTC_IntAlarmDis(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntAlarmClr()
-* ¹¦ÄÜ˵Ã÷: ÄÖÖÓÖжϱêÖ¾Çå³ý
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntAlarmClr()
+* 功能说明: 闹钟中断标志清除
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void RTC_IntAlarmClr(RTC_TypeDef *RTCx)
 void RTC_IntAlarmClr(RTC_TypeDef *RTCx)
 {
 {
@@ -401,11 +407,11 @@ void RTC_IntAlarmClr(RTC_TypeDef *RTCx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: RTC_IntAlarmStat()
-* ¹¦ÄÜ˵Ã÷: ÄÖÖÓÖжÏ״̬
-* Êä    Èë: RTC_TypeDef * RTCx      Ö¸¶¨Òª±»ÉèÖõÄRTC£¬¿Éȡֵ°üÀ¨RTC
-* Êä    ³ö: uint32_t                1 ÄÖÖÓÖжϷ¢Éú    0 ÄÖÖÓÖжÏδ·¢Éú
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: RTC_IntAlarmStat()
+* 功能说明: 闹钟中断状�
+* 输    入: RTC_TypeDef * RTCx        指定�被设置的RTC,��值包括RTC
+* 输    出: uint32_t              1 闹钟中断�生    0 闹钟中断未�生
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t RTC_IntAlarmStat(RTC_TypeDef *RTCx)
 uint32_t RTC_IntAlarmStat(RTC_TypeDef *RTCx)
 {
 {

+ 25 - 28
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_rtc.h

@@ -1,46 +1,44 @@
 #ifndef __SWM320_RTC_H__
 #ifndef __SWM320_RTC_H__
 #define __SWM320_RTC_H__
 #define __SWM320_RTC_H__
 
 
-
-#define RTC_SUN   0x01
-#define RTC_MON   0x02
-#define RTC_TUE   0x04
-#define RTC_WED   0x08
-#define RTC_THU   0x10
-#define RTC_FRI   0x20
-#define RTC_SAT   0x40
-
+#define RTC_SUN 0x01
+#define RTC_MON 0x02
+#define RTC_TUE 0x04
+#define RTC_WED 0x08
+#define RTC_THU 0x10
+#define RTC_FRI 0x20
+#define RTC_SAT 0x40
 
 
 typedef struct
 typedef struct
 {
 {
     uint16_t Year;
     uint16_t Year;
-    uint8_t  Month;
-    uint8_t  Date;
-    uint8_t  Hour;
-    uint8_t  Minute;
-    uint8_t  Second;
-    uint8_t  SecondIEn;
-    uint8_t  MinuteIEn;
+    uint8_t Month;  //�值1--12
+    uint8_t Date;   //�值1--31
+    uint8_t Hour;   //�值0--23
+    uint8_t Minute; //�值0--59
+    uint8_t Second; //�值0--59
+    uint8_t SecondIEn;
+    uint8_t MinuteIEn;
 } RTC_InitStructure;
 } RTC_InitStructure;
 
 
 typedef struct
 typedef struct
 {
 {
-    uint8_t  Days;          //RTC_SUN¡¢RTC_MON¡¢RTC_TUE¡¢RTC_WED¡¢RTC_THU¡¢RTC_FRI¡¢RTC_SAT¼°Æä»òÔËËã×éºÏ
-    uint8_t  Hour;
-    uint8_t  Minute;
-    uint8_t  Second;
-    uint8_t  AlarmIEn;
+    uint8_t Days; //RTC_SUN�RTC_MON�RTC_TUE�RTC_WED�RTC_THU�RTC_FRI�RTC_SAT�其或�算组�
+    uint8_t Hour;
+    uint8_t Minute;
+    uint8_t Second;
+    uint8_t AlarmIEn;
 } RTC_AlarmStructure;
 } RTC_AlarmStructure;
 
 
 typedef struct
 typedef struct
 {
 {
     uint16_t Year;
     uint16_t Year;
-    uint8_t  Month;
-    uint8_t  Date;
-    uint8_t  Day;           //RTC_SUN¡¢RTC_MON¡¢RTC_TUE¡¢RTC_WED¡¢RTC_THU¡¢RTC_FRI¡¢RTC_SAT
-    uint8_t  Hour;
-    uint8_t  Minute;
-    uint8_t  Second;
+    uint8_t Month;
+    uint8_t Date;
+    uint8_t Day; //RTC_SUN�RTC_MON�RTC_TUE�RTC_WED�RTC_THU�RTC_FRI�RTC_SAT
+    uint8_t Hour;
+    uint8_t Minute;
+    uint8_t Second;
 } RTC_DateTime;
 } RTC_DateTime;
 
 
 void RTC_Init(RTC_TypeDef *RTCx, RTC_InitStructure *initStruct);
 void RTC_Init(RTC_TypeDef *RTCx, RTC_InitStructure *initStruct);
@@ -51,7 +49,6 @@ void RTC_GetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime);
 
 
 void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct);
 void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct);
 
 
-
 void RTC_IntSecondEn(RTC_TypeDef *RTCx);
 void RTC_IntSecondEn(RTC_TypeDef *RTCx);
 void RTC_IntSecondDis(RTC_TypeDef *RTCx);
 void RTC_IntSecondDis(RTC_TypeDef *RTCx);
 void RTC_IntSecondClr(RTC_TypeDef *RTCx);
 void RTC_IntSecondClr(RTC_TypeDef *RTCx);

+ 314 - 124
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_sdio.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* ÎļþÃû³Æ: SWM320_sdio.c
-* ¹¦ÄÜ˵Ã÷: SWM320µ¥Æ¬»úµÄSDIO½Ó¿ÚÇý¶¯¿â
-* ¼¼ÊõÖ§³Ö: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ×¢ÒâÊÂÏî: ΪÁËͨÓÃÐÔ¡¢¼æÈÝÐÔ¡¢Ò×ÓÃÐÔ£¬Ö»Ö§³ÖÒÔ512×Ö½ÚΪµ¥Î»µÄ¶Áд
-* °æ±¾ÈÕÆÚ: V1.1.0      2017Äê10ÔÂ25ÈÕ
-* Éý¼¶¼Ç¼:
+* 文件�称: SWM320_sdio.c
+* 功能说明: SWM320�片机的SDIO接�驱动库
+* 技术支�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注�事项: 为了通用性�兼容性�易用性,�支�以512字节为��的读写
+* 版本日期: V1.1.0      2017年10月25日
+* �级记录:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -21,104 +21,104 @@
 #include "SWM320.h"
 #include "SWM320.h"
 #include "SWM320_sdio.h"
 #include "SWM320_sdio.h"
 
 
-
 SD_CardInfo SD_cardInfo;
 SD_CardInfo SD_cardInfo;
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SDIO_Init()
-* ¹¦ÄÜ˵Ã÷: SDIO¶ÁдSD¿¨³õʼ»¯£¬³õʼ»¯³É¸ßËÙ4Ïßģʽ¡¢¶ÁдÒÔ512×Ö½Ú´óС½øÐÐ
-* Êä    Èë: ÎÞ
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SDIO_Init()
+* 功能说明: SDIO读写SD��始化,�始化�高速4线模��读写以512字节大�进行
+* 输    入: uint32_t freq         SDIO_CLK时钟频率
+* 输    出: uint32_t              SD_RES_OK �作�功    SD_RES_ERR �作失败    SD_RES_TIMEOUT �作超时
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
-uint32_t SDIO_Init(void)
+uint32_t SDIO_Init(uint32_t freq)
 {
 {
+    uint32_t res;
     uint32_t resp, resps[4];
     uint32_t resp, resps[4];
 
 
     SYS->CLKDIV &= ~SYS_CLKDIV_SDIO_Msk;
     SYS->CLKDIV &= ~SYS_CLKDIV_SDIO_Msk;
-    if (SystemCoreClock > 80000000)     //SDIOʱÖÓÐèҪСÓÚ52MHz
-        SYS->CLKDIV |= (2 << SYS_CLKDIV_SDIO_Pos);  //SDCLK = SYSCLK / 4
+    if (SystemCoreClock > 80000000)                //SDIO时钟需��于52MHz
+        SYS->CLKDIV |= (2 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 4
     else
     else
-        SYS->CLKDIV |= (1 << SYS_CLKDIV_SDIO_Pos);  //SDCLK = SYSCLK / 2
+        SYS->CLKDIV |= (1 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 2
 
 
     SYS->CLKEN |= (0x01 << SYS_CLKEN_SDIO_Pos);
     SYS->CLKEN |= (0x01 << SYS_CLKEN_SDIO_Pos);
 
 
     SDIO->CR2 = (1 << SDIO_CR2_RSTALL_Pos);
     SDIO->CR2 = (1 << SDIO_CR2_RSTALL_Pos);
 
 
     SDIO->CR1 = (1 << SDIO_CR1_CDSRC_Pos) |
     SDIO->CR1 = (1 << SDIO_CR1_CDSRC_Pos) |
-                (0 << SDIO_CR1_8BIT_Pos)  |
-                (0 << SDIO_CR1_4BIT_Pos)  |
+                (0 << SDIO_CR1_8BIT_Pos) |
+                (0 << SDIO_CR1_4BIT_Pos) |
                 (1 << SDIO_CR1_PWRON_Pos) |
                 (1 << SDIO_CR1_PWRON_Pos) |
                 (7 << SDIO_CR1_VOLT_Pos);
                 (7 << SDIO_CR1_VOLT_Pos);
 
 
     SDIO->CR2 = (1 << SDIO_CR2_CLKEN_Pos) |
     SDIO->CR2 = (1 << SDIO_CR2_CLKEN_Pos) |
                 (1 << SDIO_CR2_SDCLKEN_Pos) |
                 (1 << SDIO_CR2_SDCLKEN_Pos) |
-                (calcSDCLKDiv(SD_CLK_400KHz) << SDIO_CR2_SDCLKDIV_Pos) |
-                (0xC << SDIO_CR2_TIMEOUT_Pos);
-
-    while ((SDIO->CR2 & SDIO_CR2_CLKRDY_Msk) == 0);
-
-    SDIO->IE = 0xFFFF01FF;
-    SDIO->IM = 0x00FF00FF;
+                (calcSDCLKDiv(100000) << SDIO_CR2_SDCLKDIV_Pos) |
+                (0xC << SDIO_CR2_TIMEOUT_Pos); // 2**25 SDIO_CLK
 
 
-    SDIO_SendCmd(SD_CMD_GO_IDLE_STATE, 0x00, SD_RESP_NO, 0, 0, 0);          //CMD0: GO_IDLE_STATE
+    while ((SDIO->CR2 & SDIO_CR2_CLKRDY_Msk) == 0)
+        ;
 
 
+    SDIO->IFE = 0xFFFFFFFF;
 
 
-    SDIO_SendCmd(SD_CMD_SEND_IF_COND, 0x1AA, SD_RESP_32b, &resp, 0, 0);     //CMD8: SEND_IF_COND, ¼ì²â¹¤×÷µçѹ¡¢¼ì²âÊÇ·ñÖ§³ÖSD 2.0
+    SDIO_SendCmd(SD_CMD_GO_IDLE_STATE, 0x00, SD_RESP_NO, 0); //CMD0: GO_IDLE_STATE
 
 
-    if (resp == 0x1AA) SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0;
-    else              SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1;
+    res = SDIO_SendCmd(SD_CMD_SEND_IF_COND, 0x1AA, SD_RESP_32b, &resp); //CMD8: SEND_IF_COND, 检测工作电压�检测是�支�SD 2.0
+    if (res != SD_RES_OK)
+        return res;
 
 
+    if (resp == 0x1AA)
+        SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0;
+    else
+        SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1;
 
 
-    do                                                                      //ACMD41: SD_CMD_SD_APP_OP_COND
+    do //ACMD41: SD_CMD_SD_APP_OP_COND
     {
     {
-        SDIO_SendCmd(SD_CMD_APP_CMD, 0x00, SD_RESP_32b, &resp, 0, 0);
+        res = SDIO_SendCmd(SD_CMD_APP_CMD, 0x00, SD_RESP_32b, &resp);
+        if (res != SD_RES_OK)
+            return res;
 
 
-        if (resp != 0x120) return SD_RES_ERR;   //²»ÊÇSD¿¨£¬¿ÉÄÜÊÇMMC¿¨
+        if (resp != 0x120)
+            return SD_RES_ERR; //�是SD�,�能是MMC�
 
 
         if (SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0)
         if (SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0)
-            SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x40000000, SD_RESP_32b, &resp, 0, 0);
+            SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x40000000, SD_RESP_32b, &resp);
         else
         else
-            SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x00000000, SD_RESP_32b, &resp, 0, 0);
-    }
-    while (((resp >> 31) & 0x01) == 0);         //ÉϵçûÍê³Éʱresp[31] == 0
-
-    if (((resp >> 30) & 0x01) == 1) SD_cardInfo.CardType = SDIO_HIGH_CAPACITY_SD_CARD;
+            SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x00000000, SD_RESP_32b, &resp);
+    } while (((resp >> 31) & 0x01) == 0); //上电没完�时resp[31] == 0
 
 
+    if (((resp >> 30) & 0x01) == 1)
+        SD_cardInfo.CardType = SDIO_HIGH_CAPACITY_SD_CARD;
 
 
-    SDIO_SendCmd(SD_CMD_ALL_SEND_CID, 0x00, SD_RESP_128b, resps, 0, 0);     //CMD2: SD_CMD_ALL_SEND_CID£¬»ñÈ¡CID
+    SDIO_SendCmd(SD_CMD_ALL_SEND_CID, 0x00, SD_RESP_128b, resps); //CMD2: SD_CMD_ALL_SEND_CID,获�CID
 
 
     parseCID(resps);
     parseCID(resps);
 
 
-
-    SDIO_SendCmd(SD_CMD_SET_REL_ADDR, 0x00, SD_RESP_32b, &resp, 0, 0);      //CMD3: SD_CMD_SET_REL_ADDR£¬ÉèÖÃRCA
+    SDIO_SendCmd(SD_CMD_SET_REL_ADDR, 0x00, SD_RESP_32b, &resp); //CMD3: SD_CMD_SET_REL_ADDR,设置RCA
 
 
     SD_cardInfo.RCA = resp >> 16;
     SD_cardInfo.RCA = resp >> 16;
 
 
-
-    SDIO_SendCmd(SD_CMD_SEND_CSD, SD_cardInfo.RCA << 16, SD_RESP_128b, resps, 0, 0);    //CMD9: SD_CMD_SEND_CSD£¬»ñÈ¡CSD
+    SDIO_SendCmd(SD_CMD_SEND_CSD, SD_cardInfo.RCA << 16, SD_RESP_128b, resps); //CMD9: SD_CMD_SEND_CSD,获�CSD
 
 
     parseCSD(resps);
     parseCSD(resps);
 
 
-    if (SD_cardInfo.CardBlockSize < 0x200) return SD_RES_ERR;   //±¾Çý¶¯Ö»Ö§³ÖÒÔ512×Ö½ÚΪµ¥Î»µÄ¶Áд£¬ËùÒÔ×î´ó¶Áдµ¥Î»±ØÐ벻СÓÚ512
-
+    if (SD_cardInfo.CardBlockSize < 0x200)
+        return SD_RES_ERR; //本驱动�支�以512字节为��的读写,所以最大读写��必须��于512
 
 
     SDIO->CR2 &= ~(SDIO_CR2_SDCLKEN_Msk | SDIO_CR2_SDCLKDIV_Msk);
     SDIO->CR2 &= ~(SDIO_CR2_SDCLKEN_Msk | SDIO_CR2_SDCLKDIV_Msk);
     SDIO->CR2 |= (1 << SDIO_CR2_SDCLKEN_Pos) |
     SDIO->CR2 |= (1 << SDIO_CR2_SDCLKEN_Pos) |
-                 (calcSDCLKDiv(SD_CLK_20MHz) << SDIO_CR2_SDCLKDIV_Pos);     //³õʼ»¯Íê³É£¬SDCLKÇл»µ½¸ßËÙ
-
-
-    SDIO_SendCmd(SD_CMD_SEL_DESEL_CARD, SD_cardInfo.RCA << 16, SD_RESP_32b_busy, &resp, 0, 0);  //CMD7: Ñ¡Öп¨£¬´ÓStandyģʽ½øÈëTransferģʽ
+                 (calcSDCLKDiv(freq) << SDIO_CR2_SDCLKDIV_Pos); //�始化完�,SDCLK切�到高速
 
 
+    SDIO_SendCmd(SD_CMD_SEL_DESEL_CARD, SD_cardInfo.RCA << 16, SD_RESP_32b_busy, &resp); //CMD7: 选中�,从Standy模�进入Transfer模�
+    SDIO->IF = SDIO_IF_TRXDONE_Msk;
 
 
-    SDIO_SendCmd(SD_CMD_APP_CMD, SD_cardInfo.RCA << 16, SD_RESP_32b, &resp, 0, 0);
+    SDIO_SendCmd(SD_CMD_APP_CMD, SD_cardInfo.RCA << 16, SD_RESP_32b, &resp);
 
 
-    SDIO_SendCmd(SD_CMD_APP_SD_SET_BUSWIDTH, SD_BUSWIDTH_4b, SD_RESP_32b, &resp, 0, 0);     //Çл»³É4λ×ÜÏßģʽ
+    SDIO_SendCmd(SD_CMD_APP_SD_SET_BUSWIDTH, SD_BUSWIDTH_4b, SD_RESP_32b, &resp); //切��4�总线模�
 
 
     SDIO->CR1 |= (1 << SDIO_CR1_4BIT_Pos);
     SDIO->CR1 |= (1 << SDIO_CR1_4BIT_Pos);
 
 
-
-    SDIO_SendCmd(SD_CMD_SET_BLOCKLEN, 512, SD_RESP_32b, &resp, 0, 0);       //¹Ì¶¨¿é´óСλ512×Ö½Ú
+    SDIO_SendCmd(SD_CMD_SET_BLOCKLEN, 512, SD_RESP_32b, &resp); //固定�大��512字节
 
 
     SDIO->BLK = 512;
     SDIO->BLK = 512;
 
 
@@ -126,84 +126,268 @@ uint32_t SDIO_Init(void)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SDIO_BlockWrite()
-* ¹¦ÄÜ˵Ã÷: ÏòSD¿¨Ð´ÈëÊý¾Ý
-* Êä    Èë: uint32_t block_addr     SD¿¨¿éµØÖ·£¬Ã¿¿é512×Ö½Ú
-*           uint32_t buff[]         ҪдÈëµÄÊý¾Ý
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SDIO_BlockWrite()
+* 功能说明: �SD�写入数�
+* 输    入: uint32_t block_addr       SD��地�,��512字节
+*           uint32_t buff[]         �写入的数�
+* 输    出: uint32_t              SD_RES_OK �作�功    SD_RES_ERR �作失败    SD_RES_TIMEOUT �作超时
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
-void SDIO_BlockWrite(uint32_t block_addr, uint32_t buff[])
+uint32_t SDIO_BlockWrite(uint32_t block_addr, uint32_t buff[])
 {
 {
-    uint32_t i, resp, addr;
+    uint32_t res, i;
+    uint32_t addr, resp;
 
 
-    if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)  addr = block_addr;
-    else                                                    addr = block_addr * 512;
+    if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+        addr = block_addr;
+    else
+        addr = block_addr * 512;
 
 
-    SDIO_SendCmd(SD_CMD_WRITE_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 1, 0);
+    res = SDIO_SendCmdWithData(SD_CMD_WRITE_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 0, 1);
+    if (res != SD_RES_OK)
+        return res;
 
 
-    while ((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0);
+    while ((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0)
+        __NOP();
     SDIO->IF = SDIO_IF_BUFWRRDY_Msk;
     SDIO->IF = SDIO_IF_BUFWRRDY_Msk;
 
 
-    for (i = 0; i < 512 / 4; i++) SDIO->DATA = buff[i];
+    for (i = 0; i < 512 / 4; i++)
+        SDIO->DATA = buff[i];
+
+    while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
+        __NOP();
+    SDIO->IF = SDIO_IF_TRXDONE_Msk;
+
+    return SD_RES_OK;
+}
+
+/******************************************************************************************************************************************
+* 函数�称: SDIO_MultiBlockWrite()
+* 功能说明: �SD�写入多�数�
+* 输    入: uint32_t block_addr       SD��地�,��512字节
+*           uint16_t block_cnt      �写入的�数
+*           uint32_t buff[]         �写入的数�
+* 输    出: uint32_t              SD_RES_OK �作�功    SD_RES_ERR �作失败    SD_RES_TIMEOUT �作超时
+* 注�事项: 无
+******************************************************************************************************************************************/
+uint32_t SDIO_MultiBlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[])
+{
+    uint32_t res, i, j;
+    uint32_t addr, resp;
+
+    if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+        addr = block_addr;
+    else
+        addr = block_addr * 512;
+
+    res = SDIO_SendCmdWithData(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt);
+    if (res != SD_RES_OK)
+        return res;
+
+    for (i = 0; i < block_cnt; i++)
+    {
+        while ((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0)
+            __NOP();
+        SDIO->IF = SDIO_IF_BUFWRRDY_Msk;
 
 
-    SDIO->IF = SDIO_IF_TRXDONE_Msk;     //?? Õâ¸ö±ØÐëÓÐ
-    while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0);
+        for (j = 0; j < 512 / 4; j++)
+            SDIO->DATA = buff[i * (512 / 4) + j];
+    }
+
+    while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
+        __NOP();
     SDIO->IF = SDIO_IF_TRXDONE_Msk;
     SDIO->IF = SDIO_IF_TRXDONE_Msk;
+
+    return SD_RES_OK;
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SDIO_BlockRead()
-* ¹¦ÄÜ˵Ã÷: ´ÓSD¿¨¶Á³öÊý¾Ý
-* Êä    Èë: uint32_t block_addr     SD¿¨¿éµØÖ·£¬Ã¿¿é512×Ö½Ú
-*           uint32_t buff[]         ¶Á³öµÄÊý¾Ý
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SDIO_DMABlockWrite()
+* 功能说明: 通过DMA�SD�写入多�数�
+* 输    入: uint32_t block_addr       SD��地�,��512字节
+*           uint16_t block_cnt      �写入的�数
+*           uint32_t buff[]         �写入的数�
+* 输    出: uint32_t              SD_RES_OK �作�功    SD_RES_ERR �作失败    SD_RES_TIMEOUT �作超时
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
-void SDIO_BlockRead(uint32_t block_addr, uint32_t buff[])
+uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[])
 {
 {
-    uint32_t i, resp, addr;
+    uint32_t res;
+    uint32_t addr, resp;
+
+    if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+        addr = block_addr;
+    else
+        addr = block_addr * 512;
+
+    SDIO->DMA_MEM_ADDR = (uint32_t)buff;
+
+    res = SDIO_SendCmdWithDataByDMA(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt);
+    if (res != SD_RES_OK)
+        return res;
 
 
-    if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)  addr = block_addr;
-    else                                                    addr = block_addr * 512;
+    while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
+        __NOP();
+    SDIO->IF = SDIO_IF_TRXDONE_Msk;
 
 
-    SDIO_SendCmd(SD_CMD_READ_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 1, 1);
+    return SD_RES_OK;
+}
 
 
-    while ((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0);
+/******************************************************************************************************************************************
+* 函数�称: SDIO_BlockRead()
+* 功能说明: 从SD�读出数�
+* 输    入: uint32_t block_addr       SD��地�,��512字节
+*           uint32_t buff[]         读出的数�
+* 输    出: uint32_t              SD_RES_OK �作�功    SD_RES_ERR �作失败    SD_RES_TIMEOUT �作超时
+* 注�事项: 无
+******************************************************************************************************************************************/
+uint32_t SDIO_BlockRead(uint32_t block_addr, uint32_t buff[])
+{
+    uint32_t res, i;
+    uint32_t addr, resp;
+
+    if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+        addr = block_addr;
+    else
+        addr = block_addr * 512;
+
+    res = SDIO_SendCmdWithData(SD_CMD_READ_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 1, 1);
+    if (res != SD_RES_OK)
+        return res;
+
+    while ((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0)
+        __NOP();
     SDIO->IF = SDIO_IF_BUFRDRDY_Msk;
     SDIO->IF = SDIO_IF_BUFRDRDY_Msk;
 
 
-    for (i = 0; i < 512 / 4; i++) buff[i] = SDIO->DATA;
+    for (i = 0; i < 512 / 4; i++)
+        buff[i] = SDIO->DATA;
+
+    while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
+        __NOP();
+    SDIO->IF = SDIO_IF_TRXDONE_Msk;
+
+    return SD_RES_OK;
+}
+
+/******************************************************************************************************************************************
+* 函数�称: SDIO_MultiBlockRead()
+* 功能说明: 从SD�读出多�数�
+* 输    入: uint32_t block_addr       SD��地�,��512字节
+*           uint16_t block_cnt      �读出的�数
+*           uint32_t buff[]         读出的数�
+* 输    出: uint32_t              SD_RES_OK �作�功    SD_RES_ERR �作失败    SD_RES_TIMEOUT �作超时
+* 注�事项: 无
+******************************************************************************************************************************************/
+uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[])
+{
+    uint32_t res, i, j;
+    uint32_t addr, resp;
+
+    if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+        addr = block_addr;
+    else
+        addr = block_addr * 512;
+
+    res = SDIO_SendCmdWithData(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt);
+    if (res != SD_RES_OK)
+        return res;
 
 
-    while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0);
+    for (i = 0; i < block_cnt; i++)
+    {
+        while ((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0)
+            __NOP();
+        SDIO->IF = SDIO_IF_BUFRDRDY_Msk;
+
+        for (j = 0; j < 512 / 4; j++)
+            buff[i * (512 / 4) + j] = SDIO->DATA;
+    }
+
+    while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
+        __NOP();
     SDIO->IF = SDIO_IF_TRXDONE_Msk;
     SDIO->IF = SDIO_IF_TRXDONE_Msk;
+
+    return SD_RES_OK;
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SDIO_SendCmd()
-* ¹¦ÄÜ˵Ã÷: SDIOÏòSD¿¨·¢ËÍÃüÁî
-* Êä    Èë: uint32_t cmd                ÃüÁîË÷Òý
-*           uint32_t arg                ÃüÁî²ÎÊý
-*           uint32_t resp_type          ÏìÓ¦ÀàÐÍ£¬È¡ÖµSD_RESP_NO¡¢SD_RESP_32b¡¢SD_RESP_128b¡¢SD_RESP_32b_busy
-*           uint32_t *resp_data         ÏìÓ¦ÄÚÈÝ
-*           uint32_t have_data          ÊÇ·ñÓÐÊý¾Ý´«Êä
-*           uint32_t data_read          1 ¶ÁSD¿¨    0 дSD¿¨
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SDIO_DMABlockRead()
+* 功能说明: 通过DMA从SD�读出多�数�
+* 输    入: uint32_t block_addr       SD��地�,��512字节
+*           uint16_t block_cnt      �读出的�数
+*           uint32_t buff[]         读出的数�
+* 输    出: uint32_t              SD_RES_OK �作�功    SD_RES_ERR �作失败    SD_RES_TIMEOUT �作超时
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
-void SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read)
+uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[])
 {
 {
+    uint32_t res;
+    uint32_t addr, resp;
+
+    if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+        addr = block_addr;
+    else
+        addr = block_addr * 512;
+
+    SDIO->DMA_MEM_ADDR = (uint32_t)buff;
+
+    res = SDIO_SendCmdWithDataByDMA(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt);
+    if (res != SD_RES_OK)
+        return res;
+
+    while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
+        __NOP();
+    SDIO->IF = SDIO_IF_TRXDONE_Msk;
+
+    return SD_RES_OK;
+}
+
+/******************************************************************************************************************************************
+* 函数�称: _SDIO_SendCmd()
+* 功能说明: SDIO�SD���命令
+* 输    入: uint32_t cmd          命令索引
+*           uint32_t arg            命令�数
+*           uint32_t resp_type      �应类型,�值SD_RESP_NO�SD_RESP_32b�SD_RESP_128b�SD_RESP_32b_busy
+*           uint32_t *resp_data     �应内容
+*           uint32_t have_data      是�有数�传输
+*           uint32_t data_read      1 读SD�    0 写SD�
+*           uint16_t block_cnt      读写�个数
+*           uint32_t use_dma        1 使用DMA��数�
+* 输    出: uint32_t              SD_RES_OK �作�功    SD_RES_ERR �作失败    SD_RES_TIMEOUT �作超时
+* 注�事项: 无
+******************************************************************************************************************************************/
+uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read, uint16_t block_cnt, uint32_t use_dma)
+{
+    SDIO->BLK &= ~SDIO_BLK_COUNT_Msk;
+    SDIO->BLK |= (block_cnt << SDIO_BLK_COUNT_Pos);
+
     SDIO->ARG = arg;
     SDIO->ARG = arg;
     SDIO->CMD = (cmd << SDIO_CMD_CMDINDX_Pos) |
     SDIO->CMD = (cmd << SDIO_CMD_CMDINDX_Pos) |
-                (0   << SDIO_CMD_CMDTYPE_Pos) |
-                (have_data << SDIO_CMD_HAVEDATA_Pos) |
-                (0  << SDIO_CMD_IDXCHECK_Pos) |
-                (0  << SDIO_CMD_CRCCHECK_Pos) |
+                (0 << SDIO_CMD_CMDTYPE_Pos) |
+                (0 << SDIO_CMD_IDXCHECK_Pos) |
+                (0 << SDIO_CMD_CRCCHECK_Pos) |
                 (resp_type << SDIO_CMD_RESPTYPE_Pos) |
                 (resp_type << SDIO_CMD_RESPTYPE_Pos) |
-                (0  << SDIO_CMD_MULTBLK_Pos)  |
-                (data_read << SDIO_CMD_DIRREAD_Pos)  |
-                (0  << SDIO_CMD_BLKCNTEN_Pos);
+                (have_data << SDIO_CMD_HAVEDATA_Pos) |
+                (data_read << SDIO_CMD_DIRREAD_Pos) |
+                ((block_cnt > 1) << SDIO_CMD_MULTBLK_Pos) |
+                ((block_cnt > 1) << SDIO_CMD_BLKCNTEN_Pos) |
+                ((block_cnt > 1) << SDIO_CMD_AUTOCMD12_Pos) |
+                (use_dma << SDIO_CMD_DMAEN_Pos);
 
 
-    while ((SDIO->IF & SDIO_IF_CMDDONE_Msk) == 0);
+    while ((SDIO->IF & SDIO_IF_CMDDONE_Msk) == 0)
+    {
+        if (SDIO->IF & SDIO_IF_CMDTIMEOUT_Msk)
+        {
+            SDIO->IF = SDIO_IF_CMDTIMEOUT_Msk;
+
+            return SD_RES_TIMEOUT;
+        }
+        else if (SDIO->IF & SDIO_IF_ERROR_Msk)
+        {
+            SDIO->IF = 0xFFFFFFFF;
+
+            return SD_RES_ERR;
+        }
+    }
     SDIO->IF = SDIO_IF_CMDDONE_Msk;
     SDIO->IF = SDIO_IF_CMDDONE_Msk;
 
 
     if (resp_type == SD_RESP_32b)
     if (resp_type == SD_RESP_32b)
@@ -212,15 +396,16 @@ void SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t *resp
     }
     }
     else if (resp_type == SD_RESP_128b)
     else if (resp_type == SD_RESP_128b)
     {
     {
-        //¼Ä´æÆ÷Öн«CID/CSD[127-8]ÒÀ´Î´æ·ÅÔÚÁËRESP3-0[119-0]£¬×îµÍλµÄCRC±»¶ªµô
-        //¶Á³öÊý¾Ýʱµ÷ÕûÁË˳Ðò£¬½«CID/CSD[127-8]´æ·ÅÔÚresp_data0-3[127-8]£¬×îµÍ8λÌî³ä0x00
+        //寄存器中将CID/CSD[127-8]�次存放在了RESP3-0[119-0],最低�的CRC被丢掉
+        //读出数�时调整了顺�,将CID/CSD[127-8]存放在resp_data0-3[127-8],最低8�填充0x00
         resp_data[0] = (SDIO->RESP[3] << 8) + ((SDIO->RESP[2] >> 24) & 0xFF);
         resp_data[0] = (SDIO->RESP[3] << 8) + ((SDIO->RESP[2] >> 24) & 0xFF);
         resp_data[1] = (SDIO->RESP[2] << 8) + ((SDIO->RESP[1] >> 24) & 0xFF);
         resp_data[1] = (SDIO->RESP[2] << 8) + ((SDIO->RESP[1] >> 24) & 0xFF);
         resp_data[2] = (SDIO->RESP[1] << 8) + ((SDIO->RESP[0] >> 24) & 0xFF);
         resp_data[2] = (SDIO->RESP[1] << 8) + ((SDIO->RESP[0] >> 24) & 0xFF);
         resp_data[3] = (SDIO->RESP[0] << 8) + 0x00;
         resp_data[3] = (SDIO->RESP[0] << 8) + 0x00;
     }
     }
-}
 
 
+    return SD_RES_OK;
+}
 
 
 void parseCID(uint32_t CID_Tab[4])
 void parseCID(uint32_t CID_Tab[4])
 {
 {
@@ -328,7 +513,7 @@ void parseCSD(uint32_t CSD_Tab[4])
     SD_cardInfo.SD_csd.Reserved2 = 0; /*!< Reserved */
     SD_cardInfo.SD_csd.Reserved2 = 0; /*!< Reserved */
 
 
     if ((SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V1_1) ||
     if ((SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V1_1) ||
-            (SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0))
+        (SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0))
     {
     {
         SD_cardInfo.SD_csd.DeviceSize = (tmp & 0x03) << 10;
         SD_cardInfo.SD_csd.DeviceSize = (tmp & 0x03) << 10;
 
 
@@ -352,7 +537,7 @@ void parseCSD(uint32_t CSD_Tab[4])
         tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8);
         tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8);
         SD_cardInfo.SD_csd.DeviceSizeMul |= (tmp & 0x80) >> 7;
         SD_cardInfo.SD_csd.DeviceSizeMul |= (tmp & 0x80) >> 7;
 
 
-        SD_cardInfo.CardCapacity = (SD_cardInfo.SD_csd.DeviceSize + 1) ;
+        SD_cardInfo.CardCapacity = (SD_cardInfo.SD_csd.DeviceSize + 1);
         SD_cardInfo.CardCapacity *= (1 << (SD_cardInfo.SD_csd.DeviceSizeMul + 2));
         SD_cardInfo.CardCapacity *= (1 << (SD_cardInfo.SD_csd.DeviceSizeMul + 2));
         SD_cardInfo.CardBlockSize = 1 << (SD_cardInfo.SD_csd.RdBlockLen);
         SD_cardInfo.CardBlockSize = 1 << (SD_cardInfo.SD_csd.RdBlockLen);
         SD_cardInfo.CardCapacity *= SD_cardInfo.CardBlockSize;
         SD_cardInfo.CardCapacity *= SD_cardInfo.CardBlockSize;
@@ -376,7 +561,7 @@ void parseCSD(uint32_t CSD_Tab[4])
         /*!< Byte 10 */
         /*!< Byte 10 */
         tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8);
         tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8);
 
 
-        SD_cardInfo.CardCapacity = (SD_cardInfo.SD_csd.DeviceSize + 1) * 512 * 1024;
+        SD_cardInfo.CardCapacity = (uint64_t)(SD_cardInfo.SD_csd.DeviceSize + 1) * 512 * 1024;
         SD_cardInfo.CardBlockSize = 512;
         SD_cardInfo.CardBlockSize = 512;
     }
     }
 
 
@@ -412,25 +597,30 @@ void parseCSD(uint32_t CSD_Tab[4])
     SD_cardInfo.SD_csd.ECC = (tmp & 0x03);
     SD_cardInfo.SD_csd.ECC = (tmp & 0x03);
 }
 }
 
 
-uint32_t calcSDCLKDiv(uint32_t freq_sel)
+uint32_t calcSDCLKDiv(uint32_t freq)
 {
 {
+    uint32_t prediv = ((SYS->CLKDIV & SYS_CLKDIV_SDIO_Msk) >> SYS_CLKDIV_SDIO_Pos);
+    uint32_t clkdiv = (SystemCoreClock / (1 << prediv)) / freq;
     uint32_t regdiv = 0;
     uint32_t regdiv = 0;
-    uint32_t clkdiv = 0;
-
-    if (((SYS->CLKDIV & SYS_CLKDIV_SDIO_Msk) >> SYS_CLKDIV_SDIO_Pos) == 1)
-        clkdiv = SystemCoreClock / 2 / ((freq_sel == SD_CLK_400KHz) ? 300000 : 15000000);
-    else if (((SYS->CLKDIV & SYS_CLKDIV_SDIO_Msk) >> SYS_CLKDIV_SDIO_Pos) == 2)
-        clkdiv = SystemCoreClock / 4 / ((freq_sel == SD_CLK_400KHz) ? 300000 : 15000000);
-
-    if (clkdiv > 128)     regdiv = 0x80;
-    else if (clkdiv > 64) regdiv = 0x40;
-    else if (clkdiv > 32) regdiv = 0x20;
-    else if (clkdiv > 16) regdiv = 0x10;
-    else if (clkdiv >  8) regdiv = 0x08;
-    else if (clkdiv >  4) regdiv = 0x04;
-    else if (clkdiv >  2) regdiv = 0x02;
-    else if (clkdiv >  1) regdiv = 0x01;
-    else                 regdiv = 0x00;
+
+    if (clkdiv > 128)
+        regdiv = 0x80;
+    else if (clkdiv > 64)
+        regdiv = 0x40;
+    else if (clkdiv > 32)
+        regdiv = 0x20;
+    else if (clkdiv > 16)
+        regdiv = 0x10;
+    else if (clkdiv > 8)
+        regdiv = 0x08;
+    else if (clkdiv > 4)
+        regdiv = 0x04;
+    else if (clkdiv > 2)
+        regdiv = 0x02;
+    else if (clkdiv > 1)
+        regdiv = 0x01;
+    else
+        regdiv = 0x00;
 
 
     return regdiv;
     return regdiv;
 }
 }

+ 105 - 103
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_sdio.h

@@ -1,116 +1,109 @@
 #ifndef __SWM320_SDIO_H__
 #ifndef __SWM320_SDIO_H__
 #define __SWM320_SDIO_H__
 #define __SWM320_SDIO_H__
 
 
-
-#define SD_CMD_GO_IDLE_STATE                       ((uint8_t)0)
-#define SD_CMD_SEND_OP_COND                        ((uint8_t)1)
-#define SD_CMD_ALL_SEND_CID                        ((uint8_t)2)
-#define SD_CMD_SET_REL_ADDR                        ((uint8_t)3)
-#define SD_CMD_SET_DSR                             ((uint8_t)4)
-#define SD_CMD_HS_SWITCH                           ((uint8_t)6)
-#define SD_CMD_SEL_DESEL_CARD                      ((uint8_t)7)
-#define SD_CMD_SEND_IF_COND                        ((uint8_t)8)
-#define SD_CMD_SEND_CSD                            ((uint8_t)9)
-#define SD_CMD_SEND_CID                            ((uint8_t)10)
-#define SD_CMD_STOP_TRANSMISSION                   ((uint8_t)12)
-#define SD_CMD_SEND_STATUS                         ((uint8_t)13)
-#define SD_CMD_SET_BLOCKLEN                        ((uint8_t)16)
-#define SD_CMD_READ_SINGLE_BLOCK                   ((uint8_t)17)
-#define SD_CMD_READ_MULT_BLOCK                     ((uint8_t)18)
-#define SD_CMD_WRITE_SINGLE_BLOCK                  ((uint8_t)24)
-#define SD_CMD_WRITE_MULT_BLOCK                    ((uint8_t)25)
-#define SD_CMD_PROG_CID                            ((uint8_t)26)
-#define SD_CMD_PROG_CSD                            ((uint8_t)27)
-#define SD_CMD_APP_CMD                             ((uint8_t)55)
+#define SD_CMD_GO_IDLE_STATE ((uint8_t)0)
+#define SD_CMD_SEND_OP_COND ((uint8_t)1)
+#define SD_CMD_ALL_SEND_CID ((uint8_t)2)
+#define SD_CMD_SET_REL_ADDR ((uint8_t)3)
+#define SD_CMD_SET_DSR ((uint8_t)4)
+#define SD_CMD_HS_SWITCH ((uint8_t)6)
+#define SD_CMD_SEL_DESEL_CARD ((uint8_t)7)
+#define SD_CMD_SEND_IF_COND ((uint8_t)8)
+#define SD_CMD_SEND_CSD ((uint8_t)9)
+#define SD_CMD_SEND_CID ((uint8_t)10)
+#define SD_CMD_STOP_TRANSMISSION ((uint8_t)12)
+#define SD_CMD_SEND_STATUS ((uint8_t)13)
+#define SD_CMD_SET_BLOCKLEN ((uint8_t)16)
+#define SD_CMD_READ_SINGLE_BLOCK ((uint8_t)17)
+#define SD_CMD_READ_MULT_BLOCK ((uint8_t)18)
+#define SD_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24)
+#define SD_CMD_WRITE_MULT_BLOCK ((uint8_t)25)
+#define SD_CMD_PROG_CID ((uint8_t)26)
+#define SD_CMD_PROG_CSD ((uint8_t)27)
+#define SD_CMD_APP_CMD ((uint8_t)55)
 
 
 /*Following commands are SD Card Specific commands.
 /*Following commands are SD Card Specific commands.
   SDIO_APP_CMD should be sent before sending these commands. */
   SDIO_APP_CMD should be sent before sending these commands. */
-#define SD_CMD_APP_SD_SET_BUSWIDTH                 ((uint8_t)6)
-#define SD_CMD_SD_APP_STAUS                        ((uint8_t)13)
-#define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS        ((uint8_t)22)
-#define SD_CMD_SD_APP_OP_COND                      ((uint8_t)41)
-#define SD_CMD_SD_APP_SET_CLR_CARD_DETECT          ((uint8_t)42)
-#define SD_CMD_SD_APP_SEND_SCR                     ((uint8_t)51)
-#define SD_CMD_SDIO_RW_DIRECT                      ((uint8_t)52)
-#define SD_CMD_SDIO_RW_EXTENDED                    ((uint8_t)53)
-
-
-#define SD_RESP_NO          0   //0 ÎÞÏìÓ¦
-#define SD_RESP_32b         2   //2 32λÏìÓ¦
-#define SD_RESP_128b        1   //1 128λÏìÓ¦
-#define SD_RESP_32b_busy    3   //3 32λÏìÓ¦£¬check Busy after response
-
-#define SD_CLK_400KHz       0
-#define SD_CLK_20MHz        1
-
-#define SD_BUSWIDTH_1b      0
-#define SD_BUSWIDTH_4b      2
-
-#define SD_RES_OK           0
-#define SD_RES_ERR          1
-
+#define SD_CMD_APP_SD_SET_BUSWIDTH ((uint8_t)6)
+#define SD_CMD_SD_APP_STAUS ((uint8_t)13)
+#define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22)
+#define SD_CMD_SD_APP_OP_COND ((uint8_t)41)
+#define SD_CMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42)
+#define SD_CMD_SD_APP_SEND_SCR ((uint8_t)51)
+#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52)
+#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53)
+
+#define SD_RESP_NO 0       //0 无�应
+#define SD_RESP_32b 2      //2 32��应
+#define SD_RESP_128b 1     //1 128��应
+#define SD_RESP_32b_busy 3 //3 32��应,check Busy after response
+
+#define SD_BUSWIDTH_1b 0
+#define SD_BUSWIDTH_4b 2
+
+#define SD_RES_OK 0
+#define SD_RES_ERR 1
+#define SD_RES_TIMEOUT 2
 
 
 typedef struct
 typedef struct
 {
 {
-    __IO uint8_t  CSDStruct;            // CSD structure
-    __IO uint8_t  SysSpecVersion;       // System specification version
-    __IO uint8_t  Reserved1;            // Reserved
-    __IO uint8_t  TAAC;                 // Data read access-time 1
-    __IO uint8_t  NSAC;                 // Data read access-time 2 in CLK cycles
-    __IO uint8_t  MaxBusClkFrec;        // Max. bus clock frequency
-    __IO uint16_t CardComdClasses;      //< Card command classes
-    __IO uint8_t  RdBlockLen;           // Max. read data block length
-    __IO uint8_t  PartBlockRead;        // Partial blocks for read allowed
-    __IO uint8_t  WrBlockMisalign;      // Write block misalignment
-    __IO uint8_t  RdBlockMisalign;      // Read block misalignment
-    __IO uint8_t  DSRImpl;              // DSR implemented
-    __IO uint8_t  Reserved2;            // Reserved
-    __IO uint32_t DeviceSize;           // Device Size
-    __IO uint8_t  MaxRdCurrentVDDMin;   // Max. read current @ VDD min
-    __IO uint8_t  MaxRdCurrentVDDMax;   // Max. read current @ VDD max
-    __IO uint8_t  MaxWrCurrentVDDMin;   // Max. write current @ VDD min
-    __IO uint8_t  MaxWrCurrentVDDMax;   // Max. write current @ VDD max
-    __IO uint8_t  DeviceSizeMul;        // Device size multiplier
-    __IO uint8_t  EraseGrSize;          // Erase group size
-    __IO uint8_t  EraseGrMul;           // Erase group size multiplier
-    __IO uint8_t  WrProtectGrSize;      // Write protect group size
-    __IO uint8_t  WrProtectGrEnable;    // Write protect group enable
-    __IO uint8_t  ManDeflECC;           // Manufacturer default ECC
-    __IO uint8_t  WrSpeedFact;          // Write speed factor
-    __IO uint8_t  MaxWrBlockLen;        // Max. write data block length
-    __IO uint8_t  WriteBlockPaPartial;  // Partial blocks for write allowed
-    __IO uint8_t  Reserved3;            // Reserded
-    __IO uint8_t  ContentProtectAppli;  // Content protection application
-    __IO uint8_t  FileFormatGrouop;     // File format group
-    __IO uint8_t  CopyFlag;             // Copy flag (OTP)
-    __IO uint8_t  PermWrProtect;        // Permanent write protection
-    __IO uint8_t  TempWrProtect;        // Temporary write protection
-    __IO uint8_t  FileFormat;           // File Format
-    __IO uint8_t  ECC;                  // ECC code
+    __IO uint8_t CSDStruct;           // CSD structure
+    __IO uint8_t SysSpecVersion;      // System specification version
+    __IO uint8_t Reserved1;           // Reserved
+    __IO uint8_t TAAC;                // Data read access-time 1
+    __IO uint8_t NSAC;                // Data read access-time 2 in CLK cycles
+    __IO uint8_t MaxBusClkFrec;       // Max. bus clock frequency
+    __IO uint16_t CardComdClasses;    //< Card command classes
+    __IO uint8_t RdBlockLen;          // Max. read data block length
+    __IO uint8_t PartBlockRead;       // Partial blocks for read allowed
+    __IO uint8_t WrBlockMisalign;     // Write block misalignment
+    __IO uint8_t RdBlockMisalign;     // Read block misalignment
+    __IO uint8_t DSRImpl;             // DSR implemented
+    __IO uint8_t Reserved2;           // Reserved
+    __IO uint32_t DeviceSize;         // Device Size
+    __IO uint8_t MaxRdCurrentVDDMin;  // Max. read current @ VDD min
+    __IO uint8_t MaxRdCurrentVDDMax;  // Max. read current @ VDD max
+    __IO uint8_t MaxWrCurrentVDDMin;  // Max. write current @ VDD min
+    __IO uint8_t MaxWrCurrentVDDMax;  // Max. write current @ VDD max
+    __IO uint8_t DeviceSizeMul;       // Device size multiplier
+    __IO uint8_t EraseGrSize;         // Erase group size
+    __IO uint8_t EraseGrMul;          // Erase group size multiplier
+    __IO uint8_t WrProtectGrSize;     // Write protect group size
+    __IO uint8_t WrProtectGrEnable;   // Write protect group enable
+    __IO uint8_t ManDeflECC;          // Manufacturer default ECC
+    __IO uint8_t WrSpeedFact;         // Write speed factor
+    __IO uint8_t MaxWrBlockLen;       // Max. write data block length
+    __IO uint8_t WriteBlockPaPartial; // Partial blocks for write allowed
+    __IO uint8_t Reserved3;           // Reserded
+    __IO uint8_t ContentProtectAppli; // Content protection application
+    __IO uint8_t FileFormatGrouop;    // File format group
+    __IO uint8_t CopyFlag;            // Copy flag (OTP)
+    __IO uint8_t PermWrProtect;       // Permanent write protection
+    __IO uint8_t TempWrProtect;       // Temporary write protection
+    __IO uint8_t FileFormat;          // File Format
+    __IO uint8_t ECC;                 // ECC code
 } SD_CSD;
 } SD_CSD;
 
 
 typedef struct
 typedef struct
 {
 {
-    __IO uint8_t  ManufacturerID;       // ManufacturerID
-    __IO uint16_t OEM_AppliID;          // OEM/Application ID
-    __IO uint32_t ProdName1;            // Product Name part1
-    __IO uint8_t  ProdName2;            // Product Name part2
-    __IO uint8_t  ProdRev;              // Product Revision
-    __IO uint32_t ProdSN;               // Product Serial Number
-    __IO uint8_t  Reserved1;            // Reserved1
-    __IO uint16_t ManufactDate;         // Manufacturing Date
+    __IO uint8_t ManufacturerID; // ManufacturerID
+    __IO uint16_t OEM_AppliID;   // OEM/Application ID
+    __IO uint32_t ProdName1;     // Product Name part1
+    __IO uint8_t ProdName2;      // Product Name part2
+    __IO uint8_t ProdRev;        // Product Revision
+    __IO uint32_t ProdSN;        // Product Serial Number
+    __IO uint8_t Reserved1;      // Reserved1
+    __IO uint16_t ManufactDate;  // Manufacturing Date
 } SD_CID;
 } SD_CID;
 
 
-
-#define SDIO_STD_CAPACITY_SD_CARD_V1_1             ((uint32_t)0x00000000)
-#define SDIO_STD_CAPACITY_SD_CARD_V2_0             ((uint32_t)0x00000001)
-#define SDIO_HIGH_CAPACITY_SD_CARD                 ((uint32_t)0x00000002)
-#define SDIO_MULTIMEDIA_CARD                       ((uint32_t)0x00000003)
-#define SDIO_SECURE_DIGITAL_IO_CARD                ((uint32_t)0x00000004)
-#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD            ((uint32_t)0x00000005)
-#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD          ((uint32_t)0x00000006)
-#define SDIO_HIGH_CAPACITY_MMC_CARD                ((uint32_t)0x00000007)
-
+#define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000)
+#define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001)
+#define SDIO_HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002)
+#define SDIO_MULTIMEDIA_CARD ((uint32_t)0x00000003)
+#define SDIO_SECURE_DIGITAL_IO_CARD ((uint32_t)0x00000004)
+#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD ((uint32_t)0x00000005)
+#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006)
+#define SDIO_HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007)
 
 
 typedef struct
 typedef struct
 {
 {
@@ -122,14 +115,23 @@ typedef struct
     uint8_t CardType;
     uint8_t CardType;
 } SD_CardInfo;
 } SD_CardInfo;
 
 
-
 extern SD_CardInfo SD_cardInfo;
 extern SD_CardInfo SD_cardInfo;
 
 
-uint32_t SDIO_Init(void);
-void SDIO_BlockWrite(uint32_t block_addr, uint32_t buff[]);
-void SDIO_BlockRead(uint32_t block_addr, uint32_t buff[]);
+uint32_t SDIO_Init(uint32_t freq);
+uint32_t SDIO_BlockWrite(uint32_t block_addr, uint32_t buff[]);
+uint32_t SDIO_BlockRead(uint32_t block_addr, uint32_t buff[]);
+
+uint32_t SDIO_MultiBlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]);
+uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]);
+
+uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]);
+uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]);
+
+uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read, uint16_t block_cnt, uint32_t use_dma);
 
 
-void SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read);
+#define SDIO_SendCmd(cmd, arg, resp_type, resp_data) _SDIO_SendCmd(cmd, arg, resp_type, resp_data, 0, 0, 0, 0)
+#define SDIO_SendCmdWithData(cmd, arg, resp_type, resp_data, data_read, block_cnt) _SDIO_SendCmd(cmd, arg, resp_type, resp_data, 1, data_read, block_cnt, 0)
+#define SDIO_SendCmdWithDataByDMA(cmd, arg, resp_type, resp_data, data_read, block_cnt) _SDIO_SendCmd(cmd, arg, resp_type, resp_data, 1, data_read, block_cnt, 1)
 
 
 void parseCID(uint32_t CID_Tab[4]);
 void parseCID(uint32_t CID_Tab[4]);
 void parseCSD(uint32_t CID_Tab[4]);
 void parseCSD(uint32_t CID_Tab[4]);

+ 82 - 24
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_sdram.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* ÎļþÃû³Æ: SWM320_sdram.c
-* ¹¦ÄÜ˵Ã÷: SWM320µ¥Æ¬»úµÄSDRAMÇý¶¯³ÌÐò
-* ¼¼ÊõÖ§³Ö: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ×¢ÒâÊÂÏî:
-* °æ±¾ÈÕÆÚ: V1.1.0      2017Äê10ÔÂ25ÈÕ
-* Éý¼¶¼Ç¼:
+* 文件�称: SWM320_sdram.c
+* 功能说明: SWM320�片机的SDRAM驱动程�
+* 技术支�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注�事项:
+* 版本日期: V1.1.0      2017年10月25日
+* �级记录:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -22,37 +22,95 @@
 #include "SWM320_sdram.h"
 #include "SWM320_sdram.h"
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SDRAM_Init()
-* ¹¦ÄÜ˵Ã÷: SDRAM¿ØÖÆÆ÷³õʼ»¯
-* Êä    Èë: SDRAM_InitStructure * initStruct    °üº¬NOR Flash¿ØÖÆÆ÷Ïà¹ØÉ趨ֵµÄ½á¹¹Ìå
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SDRAM_Init()
+* 功能说明: SDRAM控制器�始化
+* 输    入: SDRAM_InitStructure * initStruct    包� SDRAM 控制器相关设定值的结构体
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SDRAM_Init(SDRAM_InitStructure *initStruct)
 void SDRAM_Init(SDRAM_InitStructure *initStruct)
 {
 {
+    uint32_t row_n;
+
     SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
     SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
 
 
     SYS->CLKDIV &= ~SYS_CLKDIV_SDRAM_Msk;
     SYS->CLKDIV &= ~SYS_CLKDIV_SDRAM_Msk;
-    SYS->CLKDIV |= (1 << SYS_CLKDIV_SDRAM_Pos);     //2·ÖƵ
+    SYS->CLKDIV |= (1 << SYS_CLKDIV_SDRAM_Pos); //2分频
 
 
-    SDRAMC->CR0 = (2 << SDRAMC_CR0_BURSTLEN_Pos) |  //2 Burst LengthΪ4
-                  (2 << SDRAMC_CR0_CASDELAY_Pos);
+    SDRAMC->CR0 = (2 << SDRAMC_CR0_BURSTLEN_Pos) | //2 Burst Length为4
+                  (initStruct->CASLatency << SDRAMC_CR0_CASDELAY_Pos);
 
 
     SDRAMC->CR1 = (initStruct->CellSize << SDRAMC_CR1_CELLSIZE_Pos) |
     SDRAMC->CR1 = (initStruct->CellSize << SDRAMC_CR1_CELLSIZE_Pos) |
-                  ((initStruct->CellWidth == 16 ? 0 : 1) << SDRAMC_CR1_CELL32BIT_Pos) |
+                  (initStruct->CellWidth << SDRAMC_CR1_CELL32BIT_Pos) |
                   (initStruct->CellBank << SDRAMC_CR1_BANK_Pos) |
                   (initStruct->CellBank << SDRAMC_CR1_BANK_Pos) |
-                  ((initStruct->DataWidth == 16 ? 0 : 1) << SDRAMC_CR1_32BIT_Pos) |
-                  (7 << SDRAMC_CR1_TMRD_Pos) |
-                  (3 << SDRAMC_CR1_TRRD_Pos) |
-                  (7 << SDRAMC_CR1_TRAS_Pos) |
-                  (8 << SDRAMC_CR1_TRC_Pos) |
-                  (3 << SDRAMC_CR1_TRCD_Pos) |
-                  (3 << SDRAMC_CR1_TRP_Pos);
+                  (0 << SDRAMC_CR1_32BIT_Pos) |
+                  (initStruct->TimeTMRD << SDRAMC_CR1_TMRD_Pos) |
+                  (initStruct->TimeTRRD << SDRAMC_CR1_TRRD_Pos) |
+                  (initStruct->TimeTRAS << SDRAMC_CR1_TRAS_Pos) |
+                  (initStruct->TimeTRC << SDRAMC_CR1_TRC_Pos) |
+                  (initStruct->TimeTRCD << SDRAMC_CR1_TRCD_Pos) |
+                  (initStruct->TimeTRP << SDRAMC_CR1_TRP_Pos);
 
 
     SDRAMC->LATCH = 0x02;
     SDRAMC->LATCH = 0x02;
 
 
+    switch (initStruct->CellSize)
+    {
+    case SDRAM_CELLSIZE_16Mb:
+        row_n = 11;
+        break;
+    case SDRAM_CELLSIZE_64Mb:
+        row_n = 12;
+        break;
+    case SDRAM_CELLSIZE_128Mb:
+        row_n = 12;
+        break;
+    case SDRAM_CELLSIZE_256Mb:
+        row_n = 13;
+        break;
+    default:
+        row_n = 13;
+        break;
+    }
+
     SDRAMC->REFRESH = (1 << SDRAMC_REFRESH_EN_Pos) |
     SDRAMC->REFRESH = (1 << SDRAMC_REFRESH_EN_Pos) |
-                      (0x0FA << SDRAMC_REFRESH_RATE_Pos);
+                      (((SystemCoreClock / 2) / 1000 * 64 / (1 << row_n)) << SDRAMC_REFRESH_RATE_Pos);
+
+    while (SDRAMC->REFDONE == 0)
+        ;
+}
+
+/******************************************************************************************************************************************
+* 函数�称: SDRAM_Enable()
+* 功能说明: SDRAM使能,使能��读写SDRAM
+* 输    入: 无
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void SDRAM_Enable(void)
+{
+    uint32_t i;
+
+    SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
+    SDRAMC->REFRESH |= (1 << SDRAMC_REFRESH_EN_Pos);
+
+    for (i = 0; i < 100; i++)
+        __NOP();
+}
+
+/******************************************************************************************************************************************
+* 函数�称: SDRAM_Disable()
+* 功能说明: SDRAM�能,�能�SDRAM颗粒进入低功耗模��并自刷新,��读写
+* 输    入: 无
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void SDRAM_Disable(void)
+{
+    uint32_t i;
+
+    SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
+    SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
 
 
-    while (SDRAMC->REFDONE == 0);
+    for (i = 0; i < 100; i++)
+        __NOP();
 }
 }

+ 68 - 10
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_sdram.h

@@ -3,21 +3,79 @@
 
 
 typedef struct
 typedef struct
 {
 {
-    uint8_t DataWidth;          // 16、32
+    uint8_t CellSize;   // SDRAM棰楃矑鐨勫�閲忥紝SDRAM_CELLSIZE_16Mb銆丼DRAM_CELLSIZE_64Mb銆丼DRAM_CELLSIZE_128Mb銆丼DRAM_CELLSIZE_256Mb
+    uint8_t CellBank;   // SDRAM棰楃矑鏈夊嚑涓猙ank锛孲DRAM_CELLBANK_2銆丼DRAM_CELLBANK_4
+    uint8_t CellWidth;  // SDRAM棰楃矑鐨勪綅瀹斤紝SDRAM_CELLWIDTH_16銆丼DRAM_CELLWIDTH_32
+    uint8_t CASLatency; // 鍒楀湴鍧€鍒版湁鏁堟暟鎹�緭鍑洪棿闅旓紝SDRAM_CASLATENCY_2銆丼DRAM_CASLATENCY_3
 
 
-    uint8_t CellSize;           // SDRAM颗粒的容量
-    uint8_t CellBank;           // SDRAM颗粒有几个bank
-    uint8_t CellWidth;          // SDRAM颗粒的位宽 16、32
+    uint8_t TimeTMRD; // MRS to New Command
+    uint8_t TimeTRRD; // Activate to activate on different banks
+    uint8_t TimeTRAS; // Self refresh time锛屾渶灏廠elf-refresh鍛ㄦ湡
+    uint8_t TimeTRC;  // Row cycle delay锛孯efresh鍛戒护鍒癆ctivate鍛戒护闂村欢鏃讹紝涔熸槸涓や釜杩炵画Refresh鍛戒护闂村欢鏃�
+    uint8_t TimeTRCD; // Row to column delay锛岃�鍦板潃鍒板垪鍦板潃闂村欢鏃讹紝涔熷嵆Activate鍛戒护鍒拌�鍐欏懡浠ら棿寤舵椂
+    uint8_t TimeTRP;  // Row precharge delay锛孭recharge鍛戒护鍒板彟涓€涓�懡浠ら棿寤舵椂
 } SDRAM_InitStructure;
 } SDRAM_InitStructure;
 
 
-#define SDRAM_CELLSIZE_16Mb     3
-#define SDRAM_CELLSIZE_64Mb     0
-#define SDRAM_CELLSIZE_128Mb    1
-#define SDRAM_CELLSIZE_256Mb    2
+#define SDRAM_CELLSIZE_16Mb 3
+#define SDRAM_CELLSIZE_64Mb 0
+#define SDRAM_CELLSIZE_128Mb 1
+#define SDRAM_CELLSIZE_256Mb 2
 
 
-#define SDRAM_CELLBANK_2        0
-#define SDRAM_CELLBANK_4        1
+#define SDRAM_CELLBANK_2 0
+#define SDRAM_CELLBANK_4 1
+
+#define SDRAM_CELLWIDTH_16 0
+#define SDRAM_CELLWIDTH_32 1
+
+#define SDRAM_CASLATENCY_2 2
+#define SDRAM_CASLATENCY_3 3
+
+#define SDRAM_TMRD_3 3
+#define SDRAM_TMRD_4 4
+#define SDRAM_TMRD_5 5
+#define SDRAM_TMRD_6 6
+#define SDRAM_TMRD_7 7
+
+#define SDRAM_TRRD_2 2
+#define SDRAM_TRRD_3 3
+
+#define SDRAM_TRAS_2 2
+#define SDRAM_TRAS_3 3
+#define SDRAM_TRAS_4 4
+#define SDRAM_TRAS_5 5
+#define SDRAM_TRAS_6 6
+#define SDRAM_TRAS_7 7
+
+#define SDRAM_TRC_2 2
+#define SDRAM_TRC_3 3
+#define SDRAM_TRC_4 4
+#define SDRAM_TRC_5 5
+#define SDRAM_TRC_6 6
+#define SDRAM_TRC_7 7
+#define SDRAM_TRC_8 8
+#define SDRAM_TRC_9 9
+#define SDRAM_TRC_10 10
+#define SDRAM_TRC_11 11
+#define SDRAM_TRC_12 12
+#define SDRAM_TRC_13 13
+#define SDRAM_TRC_14 14
+#define SDRAM_TRC_15 15
+
+#define SDRAM_TRCD_3 3
+#define SDRAM_TRCD_4 4
+#define SDRAM_TRCD_5 5
+#define SDRAM_TRCD_6 6
+#define SDRAM_TRCD_7 7
+
+#define SDRAM_TRP_3 3
+#define SDRAM_TRP_4 4
+#define SDRAM_TRP_5 5
+#define SDRAM_TRP_6 6
+#define SDRAM_TRP_7 7
 
 
 void SDRAM_Init(SDRAM_InitStructure *initStruct);
 void SDRAM_Init(SDRAM_InitStructure *initStruct);
 
 
+void SDRAM_Enable(void);
+void SDRAM_Disable(void);
+
 #endif //__SWM320_SDRAM_H__
 #endif //__SWM320_SDRAM_H__

+ 271 - 175
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_spi.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* ÎļþÃû³Æ: SWM320_spi.c
-* ¹¦ÄÜ˵Ã÷: SWM320µ¥Æ¬»úµÄSPI¹¦ÄÜÇý¶¯¿â
-* ¼¼ÊõÖ§³Ö: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ×¢ÒâÊÂÏî:
-* °æ±¾ÈÕÆÚ: V1.1.0      2017Äê10ÔÂ25ÈÕ
-* Éý¼¶¼Ç¼:
+* 文件�称: SWM320_spi.c
+* 功能说明: SWM320�片机的SPI功能驱动库
+* 技术支�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注�事项:
+* 版本日期: V1.1.0      2017年10月25日
+* �级记录:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -21,14 +21,13 @@
 #include "SWM320.h"
 #include "SWM320.h"
 #include "SWM320_spi.h"
 #include "SWM320_spi.h"
 
 
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_Init()
-* ¹¦ÄÜ˵Ã÷: SPIͬ²½´®Ðнӿڳõʼ»¯£¬°üÀ¨Ö¡³¤¶ÈÉ趨¡¢Ê±ÐòÉ趨¡¢ËÙ¶ÈÉ趨¡¢ÖжÏÉ趨¡¢FIFO´¥·¢É趨
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-*           SPI_InitStructure * initStruct  °üº¬SPIÏà¹ØÉ趨ֵµÄ½á¹¹Ìå
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_Init()
+* 功能说明: SPI�步串行接��始化,包括帧长度设定�时�设定�速度设定�中断设定�FIFO触�设定
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+*           SPI_InitStructure * initStruct  包�SPI相关设定值的结构体
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct)
 void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct)
 {
 {
@@ -39,23 +38,23 @@ void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct)
         break;
         break;
 
 
     case ((uint32_t)SPI1):
     case ((uint32_t)SPI1):
-        SYS->CLKEN |= (0x01 << SYS_CLKEN_SPI0_Pos);     //ÓëSPI0ʹÓÃͬһλʱÖÓʹÄÜ
+        SYS->CLKEN |= (0x01 << SYS_CLKEN_SPI0_Pos); //与SPI0使用�一�时钟使能
         break;
         break;
     }
     }
 
 
-    SPI_Close(SPIx);    //һЩ¹Ø¼ü¼Ä´æÆ÷Ö»ÄÜÔÚSPI¹Ø±ÕʱÉèÖÃ
+    SPI_Close(SPIx); //一些关键寄存器�能在SPI关闭时设置
 
 
     SPIx->CTRL &= ~(SPI_CTRL_FFS_Msk | SPI_CTRL_CPHA_Msk | SPI_CTRL_CPOL_Msk |
     SPIx->CTRL &= ~(SPI_CTRL_FFS_Msk | SPI_CTRL_CPHA_Msk | SPI_CTRL_CPOL_Msk |
                     SPI_CTRL_SIZE_Msk | SPI_CTRL_MSTR_Msk | SPI_CTRL_CLKDIV_Msk | SPI_CTRL_SSN_H_Msk);
                     SPI_CTRL_SIZE_Msk | SPI_CTRL_MSTR_Msk | SPI_CTRL_CLKDIV_Msk | SPI_CTRL_SSN_H_Msk);
-    SPIx->CTRL |= (initStruct->FrameFormat   << SPI_CTRL_FFS_Pos) |
-                  (initStruct->SampleEdge    << SPI_CTRL_CPHA_Pos) |
-                  (initStruct->IdleLevel     << SPI_CTRL_CPOL_Pos) |
-                  ((initStruct->WordSize - 1)  << SPI_CTRL_SIZE_Pos) |
-                  (initStruct->Master        << SPI_CTRL_MSTR_Pos) |
-                  (initStruct->clkDiv        << SPI_CTRL_CLKDIV_Pos) |
-                  (0                         << SPI_CTRL_SSN_H_Pos);
-
-    SPIx->IF = (0x01 << SPI_IF_RFOVF_Pos);  //Çå³ýÖжϱêÖ¾
+    SPIx->CTRL |= (initStruct->FrameFormat << SPI_CTRL_FFS_Pos) |
+                  (initStruct->SampleEdge << SPI_CTRL_CPHA_Pos) |
+                  (initStruct->IdleLevel << SPI_CTRL_CPOL_Pos) |
+                  ((initStruct->WordSize - 1) << SPI_CTRL_SIZE_Pos) |
+                  (initStruct->Master << SPI_CTRL_MSTR_Pos) |
+                  (initStruct->clkDiv << SPI_CTRL_CLKDIV_Pos) |
+                  (0 << SPI_CTRL_SSN_H_Pos);
+
+    SPIx->IF = (0x01 << SPI_IF_RFOVF_Pos); //清除中断标志
     SPIx->IE &= ~(SPI_IE_RFHF_Msk | SPI_IE_TFHF_Msk | SPI_IE_FTC_Msk);
     SPIx->IE &= ~(SPI_IE_RFHF_Msk | SPI_IE_TFHF_Msk | SPI_IE_FTC_Msk);
     SPIx->IE |= (initStruct->RXHFullIEn << SPI_IE_RFHF_Pos) |
     SPIx->IE |= (initStruct->RXHFullIEn << SPI_IE_RFHF_Pos) |
                 (initStruct->TXEmptyIEn << SPI_IE_TFHF_Pos) |
                 (initStruct->TXEmptyIEn << SPI_IE_TFHF_Pos) |
@@ -88,11 +87,11 @@ void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_Open()
-* ¹¦ÄÜ˵Ã÷: SPI´ò¿ª£¬ÔÊÐíÊÕ·¢
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_Open()
+* 功能说明: SPI打开,�许收�
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_Open(SPI_TypeDef *SPIx)
 void SPI_Open(SPI_TypeDef *SPIx)
 {
 {
@@ -100,11 +99,11 @@ void SPI_Open(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_Close()
-* ¹¦ÄÜ˵Ã÷: SPI¹Ø±Õ£¬½ûÖ¹ÊÕ·¢
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_Close()
+* 功能说明: SPI关闭,�止收�
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_Close(SPI_TypeDef *SPIx)
 void SPI_Close(SPI_TypeDef *SPIx)
 {
 {
@@ -112,11 +111,11 @@ void SPI_Close(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_Read()
-* ¹¦ÄÜ˵Ã÷: ¶Áȡһ¸öÊý¾Ý
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: uint32_t                ¶ÁÈ¡µ½µÄÊý¾Ý
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_Read()
+* 功能说明: 读�一个数�
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: uint32_t              读�到的数�
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t SPI_Read(SPI_TypeDef *SPIx)
 uint32_t SPI_Read(SPI_TypeDef *SPIx)
 {
 {
@@ -124,12 +123,12 @@ uint32_t SPI_Read(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_Write()
-* ¹¦ÄÜ˵Ã÷: дÈëÒ»¸öÊý¾Ý
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-*           uint32_t                ҪдÈëµÄÊý¾Ý
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_Write()
+* 功能说明: 写入一个数�
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+*           uint32_t                �写入的数�
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_Write(SPI_TypeDef *SPIx, uint32_t data)
 void SPI_Write(SPI_TypeDef *SPIx, uint32_t data)
 {
 {
@@ -137,12 +136,12 @@ void SPI_Write(SPI_TypeDef *SPIx, uint32_t data)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_WriteWithWait()
-* ¹¦ÄÜ˵Ã÷: дÈëÒ»¸öÊý¾Ý²¢µÈ´ýÊý¾ÝÍêÈ«·¢ËͳöÈ¥
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1¡¢SPI1
-*           uint32_t                ҪдÈëµÄÊý¾Ý
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_WriteWithWait()
+* 功能说明: 写入一个数�并等待数�完全��出去
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1�SPI1
+*           uint32_t                �写入的数�
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data)
 void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data)
 {
 {
@@ -150,31 +149,33 @@ void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data)
 
 
     SPIx->DATA = data;
     SPIx->DATA = data;
 
 
-    while ((SPIx->STAT & SPI_STAT_WTC_Msk) == 0);
+    while ((SPIx->STAT & SPI_STAT_WTC_Msk) == 0)
+        ;
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_ReadWrite()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍÒ»¸öÊý¾Ý£¬²¢·µ»Ø·¢Ë͹ý³ÌÖнÓÊÕµ½µÄ
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-*           uint32_t data           Òª·¢Ë͵ÄÊý¾Ý
-* Êä    ³ö: uint32_t                ½ÓÊÕµ½µÄÊý¾Ý
-* ×¢ÒâÊÂÏî: ¶ÔÓÚͬһ¸öSPIÄ£¿é£¬´Ëº¯Êý²»Ó¦ÓëSPI_Write()»ì×ÅÓã¬ÒòΪSPI_Write()²»Çå³ýSPI_STAT_RFNE״̬
+* 函数�称: SPI_ReadWrite()
+* 功能说明: ��一个数�,并返回��过程中接收到的
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+*           uint32_t data           ���的数�
+* 输    出: uint32_t              接收到的数�
+* 注�事项: 对于�一个SPI模�,此函数�应与SPI_Write()混�用,因为SPI_Write()�清除SPI_STAT_RFNE状�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data)
 uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data)
 {
 {
     SPIx->DATA = data;
     SPIx->DATA = data;
-    while (!(SPIx->STAT & SPI_STAT_RFNE_Msk));
+    while (!(SPIx->STAT & SPI_STAT_RFNE_Msk))
+        ;
 
 
     return SPIx->DATA;
     return SPIx->DATA;
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_IsRXEmpty()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕFIFOÊÇ·ñ¿Õ£¬Èç¹û²»¿ÕÔò¿ÉÒÔ¼ÌÐøSPI_Read()
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: uint32_t                1 ½ÓÊÕFIFO¿Õ    0 ½ÓÊÕFIFO·Ç¿Õ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_IsRXEmpty()
+* 功能说明: 接收FIFO是�空,如果�空则�以继续SPI_Read()
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: uint32_t              1 接收FIFO空    0 接收FIFO�空
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx)
 uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx)
 {
 {
@@ -182,11 +183,11 @@ uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_IsTXFull()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFOÊÇ·ñÂú£¬Èç¹û²»ÂúÔò¿ÉÒÔ¼ÌÐøSPI_Write()
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: uint32_t                1 ·¢ËÍFIFOÂú    0 ·¢ËÍFIFO²»Âú
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_IsTXFull()
+* 功能说明: ��FIFO是�满,如果�满则�以继续SPI_Write()
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: uint32_t              1 ��FIFO满    0 ��FIFO�满
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx)
 uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx)
 {
 {
@@ -194,24 +195,23 @@ uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_IsTXEmpty()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFOÊÇ·ñ¿Õ
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: uint32_t                1 ·¢ËÍFIFO¿Õ    0 ·¢ËÍFIFO·Ç¿Õ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_IsTXEmpty()
+* 功能说明: ��FIFO是�空
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: uint32_t              1 ��FIFO空    0 ��FIFO�空
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx)
 uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx)
 {
 {
     return (SPIx->STAT & SPI_STAT_TFE_Msk) ? 1 : 0;
     return (SPIx->STAT & SPI_STAT_TFE_Msk) ? 1 : 0;
 }
 }
 
 
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTRXHalfFullEn()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕFIFO°ëÂúÖжÏʹÄÜ
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTRXHalfFullEn()
+* 功能说明: 接收FIFO�满中断使能
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx)
 void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx)
 {
 {
@@ -219,11 +219,11 @@ void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTRXHalfFullDis()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕFIFO°ëÂúÖжϽûÖ¹
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTRXHalfFullDis()
+* 功能说明: 接收FIFO�满中断�止
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx)
 void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx)
 {
 {
@@ -231,11 +231,23 @@ void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTRXHalfFullStat()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕFIFO°ëÂúÖжÏ״̬
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: uint32_t                1 ½ÓÊÕFIFO´ïµ½°ëÂú    0 ½ÓÊÕFIFOδ´ïµ½°ëÂú
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTRXHalfFullClr()
+* 功能说明: 接收FIFO�满中断标志清除
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx)
+{
+    SPIx->IF = (1 << SPI_IF_RFHF_Pos);
+}
+
+/******************************************************************************************************************************************
+* 函数�称: SPI_INTRXHalfFullStat()
+* 功能说明: 接收FIFO�满中断状�
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: uint32_t              1 接收FIFO达到�满    0 接收FIFO未达到�满
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx)
 uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx)
 {
 {
@@ -243,11 +255,11 @@ uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTRXFullEn()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕFIFOÂúÖжÏʹÄÜ
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTRXFullEn()
+* 功能说明: 接收FIFO满中断使能
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTRXFullEn(SPI_TypeDef *SPIx)
 void SPI_INTRXFullEn(SPI_TypeDef *SPIx)
 {
 {
@@ -255,11 +267,11 @@ void SPI_INTRXFullEn(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTRXFullDis()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕFIFOÂúÖжϽûÖ¹
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTRXFullDis()
+* 功能说明: 接收FIFO满中断�止
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTRXFullDis(SPI_TypeDef *SPIx)
 void SPI_INTRXFullDis(SPI_TypeDef *SPIx)
 {
 {
@@ -267,11 +279,23 @@ void SPI_INTRXFullDis(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTRXFullStat()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕFIFOÂúÖжÏ״̬
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: uint32_t                1 ½ÓÊÕFIFOÂú    0 ½ÓÊÕFIFOδÂú
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTRXFullClr()
+* 功能说明: 接收FIFO满中断标志清除
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void SPI_INTRXFullClr(SPI_TypeDef *SPIx)
+{
+    SPIx->IF = (1 << SPI_IF_RFF_Pos);
+}
+
+/******************************************************************************************************************************************
+* 函数�称: SPI_INTRXFullStat()
+* 功能说明: 接收FIFO满中断状�
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: uint32_t              1 接收FIFO满    0 接收FIFO未满
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx)
 uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx)
 {
 {
@@ -279,11 +303,11 @@ uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTRXOverflowEn()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕFIFOÒç³öÖжÏʹÄÜ
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTRXOverflowEn()
+* 功能说明: 接收FIFO溢出中断使能
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx)
 void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx)
 {
 {
@@ -291,11 +315,11 @@ void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTRXOverflowDis()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕFIFOÒç³öÖжϽûÖ¹
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTRXOverflowDis()
+* 功能说明: 接收FIFO溢出中断�止
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx)
 void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx)
 {
 {
@@ -303,11 +327,11 @@ void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTRXOverflowClr()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕFIFOÒç³öÖжϱêÖ¾Çå³ý
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTRXOverflowClr()
+* 功能说明: 接收FIFO溢出中断标志清除
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTRXOverflowClr(SPI_TypeDef *SPIx)
 void SPI_INTRXOverflowClr(SPI_TypeDef *SPIx)
 {
 {
@@ -315,11 +339,11 @@ void SPI_INTRXOverflowClr(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTRXOverflowStat()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕFIFOÒç³öÖжÏ״̬
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: uint32_t                1 ½ÓÊÕFIFOÒç³ö    0 ½ÓÊÕFIFOδÒç³ö
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTRXOverflowStat()
+* 功能说明: 接收FIFO溢出中断状�
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: uint32_t              1 接收FIFO溢出    0 接收FIFO未溢出
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx)
 uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx)
 {
 {
@@ -327,11 +351,11 @@ uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTTXHalfFullEn()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO°ëÂúÖжÏʹÄÜ
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTTXHalfFullEn()
+* 功能说明: ��FIFO�满中断使能
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx)
 void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx)
 {
 {
@@ -339,11 +363,11 @@ void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTTXHalfFullDis()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO°ëÂúÖжϽûÖ¹
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTTXHalfFullDis()
+* 功能说明: ��FIFO�满中断�止
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx)
 void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx)
 {
 {
@@ -351,11 +375,23 @@ void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTTXHalfFullStat()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO°ëÂúÖжÏ״̬
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: uint32_t                1 ·¢ËÍFIFO´ïµ½°ëÂú    0 ·¢ËÍFIFOδ´ïµ½°ëÂú
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTTXHalfFullClr()
+* 功能说明: ��FIFO�满中断标志清除
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void SPI_INTTXHalfFullClr(SPI_TypeDef *SPIx)
+{
+    SPIx->IF = (1 << SPI_IF_TFHF_Pos);
+}
+
+/******************************************************************************************************************************************
+* 函数�称: SPI_INTTXHalfFullStat()
+* 功能说明: ��FIFO�满中断状�
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: uint32_t              1 ��FIFO达到�满    0 ��FIFO未达到�满
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx)
 uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx)
 {
 {
@@ -363,11 +399,11 @@ uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTTXEmptyEn()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO¿ÕÖжÏʹÄÜ
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTTXEmptyEn()
+* 功能说明: ��FIFO空中断使能
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx)
 void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx)
 {
 {
@@ -375,11 +411,11 @@ void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTTXEmptyDis()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO¿ÕÖжϽûÖ¹
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTTXEmptyDis()
+* 功能说明: ��FIFO空中断�止
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx)
 void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx)
 {
 {
@@ -387,11 +423,23 @@ void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTTXEmptyStat()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO¿ÕÖжÏ״̬
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: uint32_t                1 ·¢ËÍFIFO¿Õ    0 ·¢ËÍFIFO·Ç¿Õ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTTXEmptyClr()
+* 功能说明: ��FIFO空中断标志清除
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void SPI_INTTXEmptyClr(SPI_TypeDef *SPIx)
+{
+    SPIx->IF = (1 << SPI_IF_TFE_Pos);
+}
+
+/******************************************************************************************************************************************
+* 函数�称: SPI_INTTXEmptyStat()
+* 功能说明: ��FIFO空中断状�
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: uint32_t              1 ��FIFO空    0 ��FIFO�空
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx)
 uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx)
 {
 {
@@ -399,11 +447,11 @@ uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTTXCompleteEn()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO¿ÕÇÒ·¢ËÍÒÆÎ»¼Ä´æÆ÷¿ÕÖжÏʹÄÜ
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTTXCompleteEn()
+* 功能说明: ��FIFO空且��移�寄存器空中断使能
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx)
 void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx)
 {
 {
@@ -411,11 +459,11 @@ void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTTXCompleteDis()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO¿ÕÇÒ·¢ËÍÒÆÎ»¼Ä´æÆ÷¿ÕÖжϽûÖ¹
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTTXCompleteDis()
+* 功能说明: ��FIFO空且��移�寄存器空中断�止
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx)
 void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx)
 {
 {
@@ -423,11 +471,11 @@ void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTTXCompleteClr()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO¿ÕÇÒ·¢ËÍÒÆÎ»¼Ä´æÆ÷¿ÕÖжÏ״̬Çå³ý
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTTXCompleteClr()
+* 功能说明: ��FIFO空且��移�寄存器空中断状�清除
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx)
 void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx)
 {
 {
@@ -435,13 +483,61 @@ void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: SPI_INTTXCompleteStat()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO¿ÕÇÒ·¢ËÍÒÆÎ»¼Ä´æÆ÷¿ÕÖжÏ״̬
-* Êä    Èë: SPI_TypeDef * SPIx      Ö¸¶¨Òª±»ÉèÖõÄSPI£¬ÓÐЧֵ°üÀ¨SPI0¡¢SPI1
-* Êä    ³ö: uint32_t                1 ·¢ËÍFIFO¿ÕÇÒ·¢ËÍÒÆÎ»¼Ä´æÆ÷¿Õ    0 ·¢ËÍFIFO»ò·¢ËÍÒÆÎ»¼Ä´æÆ÷·Ç¿Õ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: SPI_INTTXCompleteStat()
+* 功能说明: ��FIFO空且��移�寄存器空中断状�
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: uint32_t              1 ��FIFO空且��移�寄存器空    0 ��FIFO或��移�寄存器�空
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx)
 uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx)
 {
 {
     return (SPIx->IF & SPI_IF_FTC_Msk) ? 1 : 0;
     return (SPIx->IF & SPI_IF_FTC_Msk) ? 1 : 0;
 }
 }
+
+/******************************************************************************************************************************************
+* 函数�称: SPI_INTTXWordCompleteEn()
+* 功能说明: ��FIFO字��完�中断使能
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void SPI_INTTXWordCompleteEn(SPI_TypeDef *SPIx)
+{
+    SPIx->IE |= (0x01 << SPI_IE_WTC_Pos);
+}
+
+/******************************************************************************************************************************************
+* 函数�称: SPI_INTTXWordCompleteDis()
+* 功能说明: ��FIFO字��完�中断�止
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void SPI_INTTXWordCompleteDis(SPI_TypeDef *SPIx)
+{
+    SPIx->IE &= ~(0x01 << SPI_IE_WTC_Pos);
+}
+
+/******************************************************************************************************************************************
+* 函数�称: SPI_INTTXWordCompleteClr()
+* 功能说明: ��FIFO字��完�中断标志清除
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx)
+{
+    SPIx->IF = (1 << SPI_IF_WTC_Pos);
+}
+
+/******************************************************************************************************************************************
+* 函数�称: SPI_INTTXWordCompleteStat()
+* 功能说明: ��FIFO字��完�中断状�
+* 输    入: SPI_TypeDef * SPIx        指定�被设置的SPI,有效值包括SPI0�SPI1
+* 输    出: uint32_t              1 ��完�中断已�生    0 ��完�中断未�生
+* 注�事项: 无
+******************************************************************************************************************************************/
+uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx)
+{
+    return (SPIx->IF & SPI_IF_WTC_Msk) ? 1 : 0;
+}

+ 38 - 33
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_spi.h

@@ -3,57 +3,56 @@
 
 
 typedef struct
 typedef struct
 {
 {
-    uint8_t  FrameFormat;   //帧格式:SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI
-    uint8_t  SampleEdge;    //在SPI帧格式下,选择数据采样边沿:SPI_FIRST_EDGE、SPI_SECOND_EDGE
-    uint8_t  IdleLevel;     //在SPI帧格式下,选择空闲时(无数据传输时)时钟线的电平:SPI_LOW_LEVEL、SPI_HIGH_LEVEL
-    uint8_t  WordSize;      //字长度, 有效值4-16
-    uint8_t  Master;        //1 主机模式    0 从机模式
-    uint8_t  clkDiv;        //SPI_CLK = SYS_CLK / clkDiv,有效值:SPI_CLKDIV_4、SPI_CLKDIV_8、... ... 、SPI_CLKDIV_512
-
-    uint8_t  RXHFullIEn;    //接收FIFO半满中断使能
-    uint8_t  TXEmptyIEn;    //发送FIFO  空中断使能
-    uint8_t  TXCompleteIEn; //发送FIFO  空且发送移位寄存器空中断使能
+    uint8_t FrameFormat; //甯ф牸寮忥細SPI_FORMAT_SPI銆丼PI_FORMAT_TI_SSI
+    uint8_t SampleEdge;  //鍦⊿PI甯ф牸寮忎笅锛岄€夋嫨鏁版嵁閲囨牱杈规部锛歋PI_FIRST_EDGE銆丼PI_SECOND_EDGE
+    uint8_t IdleLevel;   //鍦⊿PI甯ф牸寮忎笅锛岄€夋嫨绌洪棽鏃讹紙鏃犳暟鎹�紶杈撴椂锛夋椂閽熺嚎鐨勭數骞筹細SPI_LOW_LEVEL銆丼PI_HIGH_LEVEL
+    uint8_t WordSize;    //瀛楅暱搴�, 鏈夋晥鍊�4-16
+    uint8_t Master;      //1 涓绘満妯″紡    0 浠庢満妯″紡
+    uint8_t clkDiv;      //SPI_CLK = SYS_CLK / clkDiv锛屾湁鏁堝€硷細SPI_CLKDIV_4銆丼PI_CLKDIV_8銆�... ... 銆丼PI_CLKDIV_512
+
+    uint8_t RXHFullIEn;    //鎺ユ敹FIFO鍗婃弧涓�柇浣胯兘
+    uint8_t TXEmptyIEn;    //鍙戦€丗IFO  绌轰腑鏂�娇鑳�
+    uint8_t TXCompleteIEn; //鍙戦€丗IFO  绌轰笖鍙戦€佺Щ浣嶅瘎瀛樺櫒绌轰腑鏂�娇鑳�
 } SPI_InitStructure;
 } SPI_InitStructure;
 
 
-#define SPI_FORMAT_SPI          0       //Motorola SPI 格式
-#define SPI_FORMAT_TI_SSI       1       //TI SSI 格式
-
-#define SPI_FIRST_EDGE          0       //第一个时钟沿开始采样
-#define SPI_SECOND_EDGE         1       //第二个时钟沿开始采样
+#define SPI_FORMAT_SPI 0    //Motorola SPI 鏍煎紡
+#define SPI_FORMAT_TI_SSI 1 //TI SSI 鏍煎紡
 
 
-#define SPI_LOW_LEVEL           0       //空闲时时钟线保持低电平
-#define SPI_HIGH_LEVEL          1       //空闲时时钟线保持高电平
+#define SPI_FIRST_EDGE 0  //绗�竴涓�椂閽熸部寮€濮嬮噰鏍�
+#define SPI_SECOND_EDGE 1 //绗�簩涓�椂閽熸部寮€濮嬮噰鏍�
 
 
-#define SPI_CLKDIV_4            0
-#define SPI_CLKDIV_8            1
-#define SPI_CLKDIV_16           2
-#define SPI_CLKDIV_32           3
-#define SPI_CLKDIV_64           4
-#define SPI_CLKDIV_128          5
-#define SPI_CLKDIV_256          6
-#define SPI_CLKDIV_512          7
+#define SPI_LOW_LEVEL 0  //绌洪棽鏃舵椂閽熺嚎淇濇寔浣庣數骞�
+#define SPI_HIGH_LEVEL 1 //绌洪棽鏃舵椂閽熺嚎淇濇寔楂樼數骞�
 
 
+#define SPI_CLKDIV_4 0
+#define SPI_CLKDIV_8 1
+#define SPI_CLKDIV_16 2
+#define SPI_CLKDIV_32 3
+#define SPI_CLKDIV_64 4
+#define SPI_CLKDIV_128 5
+#define SPI_CLKDIV_256 6
+#define SPI_CLKDIV_512 7
 
 
-
-void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct);        //SPI初始化
-void SPI_Open(SPI_TypeDef *SPIx);                                       //SPI打开,允许收发
-void SPI_Close(SPI_TypeDef *SPIx);                                      //SPI关闭,禁止收发
+void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct); //SPI鍒濆�鍖�
+void SPI_Open(SPI_TypeDef *SPIx);                                //SPI鎵撳紑锛屽厑璁告敹鍙�
+void SPI_Close(SPI_TypeDef *SPIx);                               //SPI鍏抽棴锛岀�姝㈡敹鍙�
 
 
 uint32_t SPI_Read(SPI_TypeDef *SPIx);
 uint32_t SPI_Read(SPI_TypeDef *SPIx);
 void SPI_Write(SPI_TypeDef *SPIx, uint32_t data);
 void SPI_Write(SPI_TypeDef *SPIx, uint32_t data);
 void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data);
 void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data);
 uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data);
 uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data);
 
 
-uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx);              //接收FIFO是否空,如果不空则可以继续SPI_Read()
-uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx);               //发送FIFO是否满,如果不满则可以继续SPI_Write()
-uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx);              //发送FIFO是否空
-
+uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx); //鎺ユ敹FIFO鏄�惁绌猴紝濡傛灉涓嶇┖鍒欏彲浠ョ户缁璖PI_Read()
+uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx);  //鍙戦€丗IFO鏄�惁婊★紝濡傛灉涓嶆弧鍒欏彲浠ョ户缁璖PI_Write()
+uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx); //鍙戦€丗IFO鏄�惁绌�
 
 
 void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx);
 void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx);
 void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx);
 void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx);
+void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx);
 uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx);
 uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx);
 void SPI_INTRXFullEn(SPI_TypeDef *SPIx);
 void SPI_INTRXFullEn(SPI_TypeDef *SPIx);
 void SPI_INTRXFullDis(SPI_TypeDef *SPIx);
 void SPI_INTRXFullDis(SPI_TypeDef *SPIx);
+void SPI_INTRXFullClr(SPI_TypeDef *SPIx);
 uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx);
 uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx);
 void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx);
 void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx);
 void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx);
 void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx);
@@ -62,14 +61,20 @@ uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx);
 
 
 void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx);
 void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx);
 void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx);
 void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx);
+void SPI_INTTXHalfFullClr(SPI_TypeDef *SPIx);
 uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx);
 uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx);
 void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx);
 void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx);
 void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx);
 void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx);
+void SPI_INTTXEmptyClr(SPI_TypeDef *SPIx);
 uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx);
 uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx);
 void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx);
 void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx);
 void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx);
 void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx);
 void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx);
 void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx);
 uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx);
 uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx);
 
 
+void SPI_INTTXWordCompleteEn(SPI_TypeDef *SPIx);
+void SPI_INTTXWordCompleteDis(SPI_TypeDef *SPIx);
+void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx);
+uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx);
 
 
 #endif //__SWM320_SPI_H__
 #endif //__SWM320_SPI_H__

+ 56 - 0
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_sram.c

@@ -0,0 +1,56 @@
+/******************************************************************************************************************************************
+* 文件名称: SWM320_sram.c
+* 功能说明: SWM320单片机的SRAM驱动程序
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0      2017年10月25日
+* 升级记录:
+*
+*
+*******************************************************************************************************************************************
+* @attention
+*
+* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
+* REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
+* FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
+* OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
+* -ECTION WITH THEIR PRODUCTS.
+*
+* COPYRIGHT 2012 Synwit Technology
+*******************************************************************************************************************************************/
+#include "SWM320.h"
+#include "SWM320_sram.h"
+
+/******************************************************************************************************************************************
+* 函数名称: SRAM_Init()
+* 功能说明: SRAM控制器初始化
+* 输    入: SRAM_InitStructure * initStruct    包含 SRAM 控制器相关设定值的结构体
+* 输    出: 无
+* 注意事项: 无
+******************************************************************************************************************************************/
+void SRAM_Init(SRAM_InitStructure *initStruct)
+{
+    uint32_t i;
+
+    // 配置SRAM前需要刷新下SDRAM控制器
+    do
+    {
+        SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
+
+        while (SDRAMC->REFDONE == 0)
+            ;
+        SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
+
+        for (i = 0; i < 1000; i++)
+            __NOP();
+        SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
+    } while (0);
+
+    SYS->CLKEN |= (1 << SYS_CLKEN_RAMC_Pos);
+    for (i = 0; i < 10; i++)
+        __NOP();
+
+    SRAMC->CR = (initStruct->ClkDiv << SRAMC_CR_RWTIME_Pos) |
+                (initStruct->DataWidth << SRAMC_CR_BYTEIF_Pos) |
+                (0 << SRAMC_CR_HBLBDIS_Pos); // 使能字节、半字访问
+}

+ 29 - 0
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_sram.h

@@ -0,0 +1,29 @@
+#ifndef __SWM320_SRAM_H__
+#define __SWM320_SRAM_H__
+
+typedef struct
+{
+    uint8_t ClkDiv;    //SRAM_CLKDIV_5...SRAM_CLKDIV_16,根据SRAM芯片所能跑的最高频率选择合适分频
+    uint8_t DataWidth; //SRAM_DATAWIDTH_8、SRAM_DATAWIDTH_16
+} SRAM_InitStructure;
+
+#define SRAM_CLKDIV_4 3
+#define SRAM_CLKDIV_5 4
+#define SRAM_CLKDIV_6 5
+#define SRAM_CLKDIV_7 6
+#define SRAM_CLKDIV_8 7
+#define SRAM_CLKDIV_9 8
+#define SRAM_CLKDIV_10 9
+#define SRAM_CLKDIV_11 10
+#define SRAM_CLKDIV_12 11
+#define SRAM_CLKDIV_13 12
+#define SRAM_CLKDIV_14 13
+#define SRAM_CLKDIV_15 14
+#define SRAM_CLKDIV_16 15
+
+#define SRAM_DATAWIDTH_8 1
+#define SRAM_DATAWIDTH_16 0
+
+void SRAM_Init(SRAM_InitStructure *initStruct);
+
+#endif //__SWM320_SRAM_H__

+ 139 - 79
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_timr.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* ÎļþÃû³Æ: SWM320_timr.c
-* ¹¦ÄÜ˵Ã÷: SWM320µ¥Æ¬»úµÄ¼ÆÊýÆ÷/¶¨Ê±Æ÷¹¦ÄÜÇý¶¯¿â
-* ¼¼ÊõÖ§³Ö: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ×¢ÒâÊÂÏî:
-* °æ±¾ÈÕÆÚ: V1.1.0      2017Äê10ÔÂ25ÈÕ
-* Éý¼¶¼Ç¼:
+* 文件�称: SWM320_timr.c
+* 功能说明: SWM320�片机的计数器/定时器功能驱动库
+* 技术支�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注�事项:
+* 版本日期: V1.1.0      2017年10月25日
+* �级记录:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -21,22 +21,21 @@
 #include "SWM320.h"
 #include "SWM320.h"
 #include "SWM320_timr.h"
 #include "SWM320_timr.h"
 
 
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: TIMR_Init()
-* ¹¦ÄÜ˵Ã÷: TIMR¶¨Ê±Æ÷/¼ÆÊýÆ÷³õʼ»¯
-* Êä    Èë: TIMR_TypeDef * TIMRx    Ö¸¶¨Òª±»ÉèÖõĶ¨Ê±Æ÷£¬ÓÐЧֵ°üÀ¨TIMR0¡¢TIMR1¡¢TIMR2¡¢TIMR3¡¢TIMR4¡¢TIMR5
-*           uint32_t mode           TIMR_MODE_TIMER ¶¨Ê±Æ÷ģʽ    TIMR_MODE_COUNTER ¼ÆÊýÆ÷ģʽ
-*           uint32_t period         ¶¨Ê±/¼ÆÊýÖÜÆÚ
-*           uint32_t int_en         ÖжÏʹÄÜ
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: TIMR_Init()
+* 功能说明: TIMR定时器/计数器�始化
+* 输    入: TIMR_TypeDef * TIMRx  指定�被设置的定时器,有效值包括TIMR0�TIMR1�TIMR2�TIMR3�TIMR4�TIMR5
+*           uint32_t mode           TIMR_MODE_TIMER 定时器模�    TIMR_MODE_COUNTER 计数器模�
+*           uint32_t period         定时/计数周期
+*           uint32_t int_en         中断使能
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int_en)
 void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int_en)
 {
 {
     SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
     SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
 
 
-    TIMR_Stop(TIMRx);   //һЩ¹Ø¼ü¼Ä´æÆ÷Ö»ÄÜÔÚ¶¨Ê±Æ÷ֹͣʱÉèÖÃ
+    TIMR_Stop(TIMRx); //一些关键寄存器�能在定时器�止时设置
 
 
     TIMRx->CTRL &= ~TIMR_CTRL_CLKSRC_Msk;
     TIMRx->CTRL &= ~TIMR_CTRL_CLKSRC_Msk;
     TIMRx->CTRL |= mode << TIMR_CTRL_CLKSRC_Pos;
     TIMRx->CTRL |= mode << TIMR_CTRL_CLKSRC_Pos;
@@ -46,11 +45,12 @@ void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int
     switch ((uint32_t)TIMRx)
     switch ((uint32_t)TIMRx)
     {
     {
     case ((uint32_t)TIMR0):
     case ((uint32_t)TIMR0):
-        TIMRG->IF = (1 << TIMRG_IF_TIMR0_Pos);      //ʹÄÜÖжÏǰÇå³ýÖжϱêÖ¾
+        TIMRG->IF = (1 << TIMRG_IF_TIMR0_Pos); //使能中断�清除中断标志
         TIMRG->IE &= ~TIMRG_IE_TIMR0_Msk;
         TIMRG->IE &= ~TIMRG_IE_TIMR0_Msk;
         TIMRG->IE |= (int_en << TIMRG_IE_TIMR0_Pos);
         TIMRG->IE |= (int_en << TIMRG_IE_TIMR0_Pos);
 
 
-        if (int_en) NVIC_EnableIRQ(TIMR0_IRQn);
+        if (int_en)
+            NVIC_EnableIRQ(TIMR0_IRQn);
         break;
         break;
 
 
     case ((uint32_t)TIMR1):
     case ((uint32_t)TIMR1):
@@ -58,7 +58,8 @@ void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int
         TIMRG->IE &= ~TIMRG_IE_TIMR1_Msk;
         TIMRG->IE &= ~TIMRG_IE_TIMR1_Msk;
         TIMRG->IE |= (int_en << TIMRG_IE_TIMR1_Pos);
         TIMRG->IE |= (int_en << TIMRG_IE_TIMR1_Pos);
 
 
-        if (int_en) NVIC_EnableIRQ(TIMR1_IRQn);
+        if (int_en)
+            NVIC_EnableIRQ(TIMR1_IRQn);
         break;
         break;
 
 
     case ((uint32_t)TIMR2):
     case ((uint32_t)TIMR2):
@@ -66,7 +67,8 @@ void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int
         TIMRG->IE &= ~TIMRG_IE_TIMR2_Msk;
         TIMRG->IE &= ~TIMRG_IE_TIMR2_Msk;
         TIMRG->IE |= (int_en << TIMRG_IE_TIMR2_Pos);
         TIMRG->IE |= (int_en << TIMRG_IE_TIMR2_Pos);
 
 
-        if (int_en) NVIC_EnableIRQ(TIMR2_IRQn);
+        if (int_en)
+            NVIC_EnableIRQ(TIMR2_IRQn);
         break;
         break;
 
 
     case ((uint32_t)TIMR3):
     case ((uint32_t)TIMR3):
@@ -74,7 +76,8 @@ void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int
         TIMRG->IE &= ~TIMRG_IE_TIMR3_Msk;
         TIMRG->IE &= ~TIMRG_IE_TIMR3_Msk;
         TIMRG->IE |= (int_en << TIMRG_IE_TIMR3_Pos);
         TIMRG->IE |= (int_en << TIMRG_IE_TIMR3_Pos);
 
 
-        if (int_en) NVIC_EnableIRQ(TIMR3_IRQn);
+        if (int_en)
+            NVIC_EnableIRQ(TIMR3_IRQn);
         break;
         break;
 
 
     case ((uint32_t)TIMR4):
     case ((uint32_t)TIMR4):
@@ -82,7 +85,8 @@ void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int
         TIMRG->IE &= ~TIMRG_IE_TIMR4_Msk;
         TIMRG->IE &= ~TIMRG_IE_TIMR4_Msk;
         TIMRG->IE |= (int_en << TIMRG_IE_TIMR4_Pos);
         TIMRG->IE |= (int_en << TIMRG_IE_TIMR4_Pos);
 
 
-        if (int_en) NVIC_EnableIRQ(TIMR4_IRQn);
+        if (int_en)
+            NVIC_EnableIRQ(TIMR4_IRQn);
         break;
         break;
 
 
     case ((uint32_t)TIMR5):
     case ((uint32_t)TIMR5):
@@ -90,17 +94,18 @@ void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int
         TIMRG->IE &= ~TIMRG_IE_TIMR5_Msk;
         TIMRG->IE &= ~TIMRG_IE_TIMR5_Msk;
         TIMRG->IE |= (int_en << TIMRG_IE_TIMR5_Pos);
         TIMRG->IE |= (int_en << TIMRG_IE_TIMR5_Pos);
 
 
-        if (int_en) NVIC_EnableIRQ(TIMR5_IRQn);
+        if (int_en)
+            NVIC_EnableIRQ(TIMR5_IRQn);
         break;
         break;
     }
     }
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: TIMR_Start()
-* ¹¦ÄÜ˵Ã÷: Æô¶¯¶¨Ê±Æ÷£¬´Ó³õʼֵ¿ªÊ¼¼ÆÊ±/¼ÆÊý
-* Êä    Èë: TIMR_TypeDef * TIMRx    Ö¸¶¨Òª±»ÉèÖõĶ¨Ê±Æ÷£¬¿Éȡֵ°üÀ¨TIMR0¡¢TIMR1¡¢TIMR2¡¢TIMR3¡¢TIMR4¡¢TIMR5
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: TIMR_Start()
+* 功能说明: �动定时器,从�始值开始计时/计数
+* 输    入: TIMR_TypeDef * TIMRx  指定�被设置的定时器,��值包括TIMR0�TIMR1�TIMR2�TIMR3�TIMR4�TIMR5
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void TIMR_Start(TIMR_TypeDef *TIMRx)
 void TIMR_Start(TIMR_TypeDef *TIMRx)
 {
 {
@@ -108,11 +113,11 @@ void TIMR_Start(TIMR_TypeDef *TIMRx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: TIMR_Stop()
-* ¹¦ÄÜ˵Ã÷: Í£Ö¹¶¨Ê±Æ÷
-* Êä    Èë: TIMR_TypeDef * TIMRx    Ö¸¶¨Òª±»ÉèÖõĶ¨Ê±Æ÷£¬¿Éȡֵ°üÀ¨TIMR0¡¢TIMR1¡¢TIMR2¡¢TIMR3¡¢TIMR4¡¢TIMR5
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: TIMR_Stop()
+* 功能说明: �止定时器
+* 输    入: TIMR_TypeDef * TIMRx  指定�被设置的定时器,��值包括TIMR0�TIMR1�TIMR2�TIMR3�TIMR4�TIMR5
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void TIMR_Stop(TIMR_TypeDef *TIMRx)
 void TIMR_Stop(TIMR_TypeDef *TIMRx)
 {
 {
@@ -120,11 +125,11 @@ void TIMR_Stop(TIMR_TypeDef *TIMRx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: TIMR_Halt()
-* ¹¦ÄÜ˵Ã÷: ÔÝÍ£¶¨Ê±Æ÷£¬¼ÆÊýÖµ±£³Ö²»±ä
-* Êä    Èë: TIMR_TypeDef * TIMRx    Ö¸¶¨Òª±»ÉèÖõĶ¨Ê±Æ÷£¬¿Éȡֵ°üÀ¨TIMR0¡¢TIMR1¡¢TIMR2¡¢TIMR3¡¢TIMR4¡¢TIMR5
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: TIMR_Halt()
+* 功能说明: 暂�定时器,计数值����
+* 输    入: TIMR_TypeDef * TIMRx  指定�被设置的定时器,��值包括TIMR0�TIMR1�TIMR2�TIMR3�TIMR4�TIMR5
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void TIMR_Halt(TIMR_TypeDef *TIMRx)
 void TIMR_Halt(TIMR_TypeDef *TIMRx)
 {
 {
@@ -157,11 +162,11 @@ void TIMR_Halt(TIMR_TypeDef *TIMRx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: TIMR_Resume()
-* ¹¦ÄÜ˵Ã÷: »Ö¸´¶¨Ê±Æ÷£¬´ÓÔÝÍ£´¦¼ÌÐø¼ÆÊý
-* Êä    Èë: TIMR_TypeDef * TIMRx    Ö¸¶¨Òª±»ÉèÖõĶ¨Ê±Æ÷£¬¿Éȡֵ°üÀ¨TIMR0¡¢TIMR1¡¢TIMR2¡¢TIMR3¡¢TIMR4¡¢TIMR5
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: TIMR_Resume()
+* 功能说明: ��定时器,从暂�处继续计数
+* 输    入: TIMR_TypeDef * TIMRx  指定�被设置的定时器,��值包括TIMR0�TIMR1�TIMR2�TIMR3�TIMR4�TIMR5
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void TIMR_Resume(TIMR_TypeDef *TIMRx)
 void TIMR_Resume(TIMR_TypeDef *TIMRx)
 {
 {
@@ -194,12 +199,12 @@ void TIMR_Resume(TIMR_TypeDef *TIMRx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: TIMR_SetPeriod()
-* ¹¦ÄÜ˵Ã÷: ÉèÖö¨Ê±/¼ÆÊýÖÜÆÚ
-* Êä    Èë: TIMR_TypeDef * TIMRx    Ö¸¶¨Òª±»ÉèÖõĶ¨Ê±Æ÷£¬¿Éȡֵ°üÀ¨TIMR0¡¢TIMR1¡¢TIMR2¡¢TIMR3¡¢TIMR4¡¢TIMR5
-*           uint32_t period         ¶¨Ê±/¼ÆÊýÖÜÆÚ
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: TIMR_SetPeriod()
+* 功能说明: 设置定时/计数周期
+* 输    入: TIMR_TypeDef * TIMRx  指定�被设置的定时器,��值包括TIMR0�TIMR1�TIMR2�TIMR3�TIMR4�TIMR5
+*           uint32_t period         定时/计数周期
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void TIMR_SetPeriod(TIMR_TypeDef *TIMRx, uint32_t period)
 void TIMR_SetPeriod(TIMR_TypeDef *TIMRx, uint32_t period)
 {
 {
@@ -207,11 +212,11 @@ void TIMR_SetPeriod(TIMR_TypeDef *TIMRx, uint32_t period)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: TIMR_GetPeriod()
-* ¹¦ÄÜ˵Ã÷: »ñÈ¡¶¨Ê±/¼ÆÊýÖÜÆÚ
-* Êä    Èë: TIMR_TypeDef * TIMRx    Ö¸¶¨Òª±»ÉèÖõĶ¨Ê±Æ÷£¬¿Éȡֵ°üÀ¨TIMR0¡¢TIMR1¡¢TIMR2¡¢TIMR3¡¢TIMR4¡¢TIMR5
-* Êä    ³ö: uint32_t                µ±Ç°¶¨Ê±/¼ÆÊýÖÜÆÚ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: TIMR_GetPeriod()
+* 功能说明: 获�定时/计数周期
+* 输    入: TIMR_TypeDef * TIMRx  指定�被设置的定时器,��值包括TIMR0�TIMR1�TIMR2�TIMR3�TIMR4�TIMR5
+* 输    出: uint32_t              当�定时/计数周期
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t TIMR_GetPeriod(TIMR_TypeDef *TIMRx)
 uint32_t TIMR_GetPeriod(TIMR_TypeDef *TIMRx)
 {
 {
@@ -219,11 +224,11 @@ uint32_t TIMR_GetPeriod(TIMR_TypeDef *TIMRx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: TIMR_GetCurValue()
-* ¹¦ÄÜ˵Ã÷: »ñÈ¡µ±Ç°¼ÆÊýÖµ
-* Êä    Èë: TIMR_TypeDef * TIMRx    Ö¸¶¨Òª±»ÉèÖõĶ¨Ê±Æ÷£¬¿Éȡֵ°üÀ¨TIMR0¡¢TIMR1¡¢TIMR2¡¢TIMR3¡¢TIMR4¡¢TIMR5
-* Êä    ³ö: uint32_t                µ±Ç°¼ÆÊýÖµ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: TIMR_GetCurValue()
+* 功能说明: 获�当�计数值
+* 输    入: TIMR_TypeDef * TIMRx  指定�被设置的定时器,��值包括TIMR0�TIMR1�TIMR2�TIMR3�TIMR4�TIMR5
+* 输    出: uint32_t              当�计数值
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t TIMR_GetCurValue(TIMR_TypeDef *TIMRx)
 uint32_t TIMR_GetCurValue(TIMR_TypeDef *TIMRx)
 {
 {
@@ -231,11 +236,11 @@ uint32_t TIMR_GetCurValue(TIMR_TypeDef *TIMRx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: TIMR_INTEn()
-* ¹¦ÄÜ˵Ã÷: ʹÄÜÖжÏ
-* Êä    Èë: TIMR_TypeDef * TIMRx    Ö¸¶¨Òª±»ÉèÖõĶ¨Ê±Æ÷£¬¿Éȡֵ°üÀ¨TIMR0¡¢TIMR1¡¢TIMR2¡¢TIMR3¡¢TIMR4¡¢TIMR5
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: TIMR_INTEn()
+* 功能说明: 使能中断
+* 输    入: TIMR_TypeDef * TIMRx  指定�被设置的定时器,��值包括TIMR0�TIMR1�TIMR2�TIMR3�TIMR4�TIMR5
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void TIMR_INTEn(TIMR_TypeDef *TIMRx)
 void TIMR_INTEn(TIMR_TypeDef *TIMRx)
 {
 {
@@ -274,11 +279,11 @@ void TIMR_INTEn(TIMR_TypeDef *TIMRx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: TIMR_INTDis()
-* ¹¦ÄÜ˵Ã÷: ½ûÄÜÖжÏ
-* Êä    Èë: TIMR_TypeDef * TIMRx    Ö¸¶¨Òª±»ÉèÖõĶ¨Ê±Æ÷£¬¿Éȡֵ°üÀ¨TIMR0¡¢TIMR1¡¢TIMR2¡¢TIMR3¡¢TIMR4¡¢TIMR5
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: TIMR_INTDis()
+* 功能说明: �能中断
+* 输    入: TIMR_TypeDef * TIMRx  指定�被设置的定时器,��值包括TIMR0�TIMR1�TIMR2�TIMR3�TIMR4�TIMR5
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void TIMR_INTDis(TIMR_TypeDef *TIMRx)
 void TIMR_INTDis(TIMR_TypeDef *TIMRx)
 {
 {
@@ -311,11 +316,11 @@ void TIMR_INTDis(TIMR_TypeDef *TIMRx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: TIMR_INTClr()
-* ¹¦ÄÜ˵Ã÷: Çå³ýÖжϱêÖ¾
-* Êä    Èë: TIMR_TypeDef * TIMRx    Ö¸¶¨Òª±»ÉèÖõĶ¨Ê±Æ÷£¬¿Éȡֵ°üÀ¨TIMR0¡¢TIMR1¡¢TIMR2¡¢TIMR3¡¢TIMR4¡¢TIMR5
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: TIMR_INTClr()
+* 功能说明: 清除中断标志
+* 输    入: TIMR_TypeDef * TIMRx  指定�被设置的定时器,��值包括TIMR0�TIMR1�TIMR2�TIMR3�TIMR4�TIMR5
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void TIMR_INTClr(TIMR_TypeDef *TIMRx)
 void TIMR_INTClr(TIMR_TypeDef *TIMRx)
 {
 {
@@ -348,11 +353,11 @@ void TIMR_INTClr(TIMR_TypeDef *TIMRx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: TIMR_INTStat()
-* ¹¦ÄÜ˵Ã÷: »ñÈ¡ÖжÏ״̬
-* Êä    Èë: TIMR_TypeDef * TIMRx    Ö¸¶¨Òª±»ÉèÖõĶ¨Ê±Æ÷£¬¿Éȡֵ°üÀ¨TIMR0¡¢TIMR1¡¢TIMR2¡¢TIMR3¡¢TIMR4¡¢TIMR5
-* Êä    ³ö: uint32_t                0 TIMRxδ²úÉúÖÐ¶Ï    1 TIMRx²úÉúÁËÖжÏ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: TIMR_INTStat()
+* 功能说明: 获�中断状�
+* 输    入: TIMR_TypeDef * TIMRx  指定�被设置的定时器,��值包括TIMR0�TIMR1�TIMR2�TIMR3�TIMR4�TIMR5
+* 输    出: uint32_t              0 TIMRx未产生中断    1 TIMRx产生了中断
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t TIMR_INTStat(TIMR_TypeDef *TIMRx)
 uint32_t TIMR_INTStat(TIMR_TypeDef *TIMRx)
 {
 {
@@ -379,3 +384,58 @@ uint32_t TIMR_INTStat(TIMR_TypeDef *TIMRx)
 
 
     return 0;
     return 0;
 }
 }
+
+/******************************************************************************************************************************************
+* 函数�称: Pulse_Init()
+* 功能说明: 脉宽测�功能�始化
+* 输    入: uint32_t pulse            PULSE_LOW 测�低脉冲宽度   PULSE_HIGH 测�高脉冲宽度
+*           uint32_t int_en         是�使能脉冲测�完�中断
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void Pulse_Init(uint32_t pulse, uint32_t int_en)
+{
+    SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
+
+    TIMRG->PCTRL = (0 << TIMRG_PCTRL_CLKSRC_Pos) | // 系统时钟作为时钟�
+                   (pulse << TIMRG_PCTRL_HIGH_Pos) |
+                   (0 << TIMRG_PCTRL_EN_Pos);
+
+    TIMRG->IE |= (1 << TIMRG_IE_PULSE_Pos); //使能�能查询中断标志
+
+    if (int_en)
+        NVIC_EnableIRQ(PULSE_IRQn);
+}
+
+/******************************************************************************************************************************************
+* 函数�称: Pulse_Start()
+* 功能说明: 脉宽测�功能�动,测�到脉宽�会自动关闭测�功能
+* 输    入: 无
+* 输    出: 无
+* 注�事项: 无
+******************************************************************************************************************************************/
+void Pulse_Start(void)
+{
+    TIMRG->PCTRL |= (1 << TIMRG_PCTRL_EN_Pos);
+}
+
+/******************************************************************************************************************************************
+* 函数�称: Pulse_Done()
+* 功能说明: 脉宽测�是�完�
+* 输    入: 无
+* 输    出: uint32_t              1 测�已完�    0 测�未完�
+* 注�事项: 无
+******************************************************************************************************************************************/
+uint32_t Pulse_Done(void)
+{
+    if (TIMRG->IF & TIMRG_IF_PULSE_Msk)
+    {
+        TIMRG->IF = TIMRG_IF_PULSE_Msk; // 清除中断标志
+
+        return 1;
+    }
+    else
+    {
+        return 0;
+    }
+}

+ 20 - 14
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_timr.h

@@ -1,23 +1,29 @@
 #ifndef __SWM320_TIMR_H__
 #ifndef __SWM320_TIMR_H__
 #define __SWM320_TIMR_H__
 #define __SWM320_TIMR_H__
 
 
-#define TIMR_MODE_TIMER     0
-#define TIMR_MODE_COUNTER   1
+#define TIMR_MODE_TIMER 0
+#define TIMR_MODE_COUNTER 1
 
 
-void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int_en);   //定时器/计数器初始化
-void TIMR_Start(TIMR_TypeDef *TIMRx);                           //启动定时器,从初始值开始计时/计数
-void TIMR_Stop(TIMR_TypeDef *TIMRx);                            //停止定时器
-void TIMR_Halt(TIMR_TypeDef *TIMRx);                            //暂停定时器,计数值保持不变
-void TIMR_Resume(TIMR_TypeDef *TIMRx);                          //恢复定时器,从暂停处继续计数
+void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int_en); //瀹氭椂鍣�/璁℃暟鍣ㄥ垵濮嬪寲
+void TIMR_Start(TIMR_TypeDef *TIMRx);                                                 //鍚�姩瀹氭椂鍣�紝浠庡垵濮嬪€煎紑濮嬭�鏃�/璁℃暟
+void TIMR_Stop(TIMR_TypeDef *TIMRx);                                                  //鍋滄�瀹氭椂鍣�
+void TIMR_Halt(TIMR_TypeDef *TIMRx);                                                  //鏆傚仠瀹氭椂鍣�紝璁℃暟鍊间繚鎸佷笉鍙�
+void TIMR_Resume(TIMR_TypeDef *TIMRx);                                                //鎭㈠�瀹氭椂鍣�紝浠庢殏鍋滃�缁х画璁℃暟
 
 
-void TIMR_SetPeriod(TIMR_TypeDef *TIMRx, uint32_t period);      //设置定时/计数周期
-uint32_t TIMR_GetPeriod(TIMR_TypeDef *TIMRx);                   //获取定时/计数周期
-uint32_t TIMR_GetCurValue(TIMR_TypeDef *TIMRx);                 //获取当前计数值
+void TIMR_SetPeriod(TIMR_TypeDef *TIMRx, uint32_t period); //璁剧疆瀹氭椂/璁℃暟鍛ㄦ湡
+uint32_t TIMR_GetPeriod(TIMR_TypeDef *TIMRx);              //鑾峰彇瀹氭椂/璁℃暟鍛ㄦ湡
+uint32_t TIMR_GetCurValue(TIMR_TypeDef *TIMRx);            //鑾峰彇褰撳墠璁℃暟鍊�
 
 
-void TIMR_INTEn(TIMR_TypeDef *TIMRx);                           //使能中断
-void TIMR_INTDis(TIMR_TypeDef *TIMRx);                          //禁能中断
-void TIMR_INTClr(TIMR_TypeDef *TIMRx);                          //清除中断标志
-uint32_t TIMR_INTStat(TIMR_TypeDef *TIMRx);                     //获取中断状态
+void TIMR_INTEn(TIMR_TypeDef *TIMRx);       //浣胯兘涓�柇
+void TIMR_INTDis(TIMR_TypeDef *TIMRx);      //绂佽兘涓�柇
+void TIMR_INTClr(TIMR_TypeDef *TIMRx);      //娓呴櫎涓�柇鏍囧織
+uint32_t TIMR_INTStat(TIMR_TypeDef *TIMRx); //鑾峰彇涓�柇鐘舵€�
 
 
+#define PULSE_LOW 0
+#define PULSE_HIGH 1
+
+void Pulse_Init(uint32_t pulse, uint32_t int_en);
+void Pulse_Start(void);
+uint32_t Pulse_Done(void);
 
 
 #endif //__SWM320_TIMR_H__
 #endif //__SWM320_TIMR_H__

+ 223 - 199
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_uart.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* ÎļþÃû³Æ: SWM320_uart.c
-* ¹¦ÄÜ˵Ã÷: SWM320µ¥Æ¬»úµÄUART´®¿Ú¹¦ÄÜÇý¶¯¿â
-* ¼¼ÊõÖ§³Ö: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ×¢ÒâÊÂÏî: ûÓбàдLIN¹¦ÄÜÏà¹ØµÄº¯Êý
-* °æ±¾ÈÕÆÚ: V1.1.0      2017Äê10ÔÂ25ÈÕ
-* Éý¼¶¼Ç¼:
+* 文件�称: SWM320_uart.c
+* 功能说明: SWM320�片机的UART串�功能驱动库
+* 技术支�: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注�事项: 没有编写LIN功能相关的函数
+* 版本日期: V1.1.0      2017年10月25日
+* �级记录:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -21,14 +21,13 @@
 #include "SWM320.h"
 #include "SWM320.h"
 #include "SWM320_uart.h"
 #include "SWM320_uart.h"
 
 
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_Init()
-* ¹¦ÄÜ˵Ã÷: UART´®¿Ú³õʼ»¯
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-*           UART_InitStructure * initStruct    °üº¬UART´®¿ÚÏà¹ØÉ趨ֵµÄ½á¹¹Ìå
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_Init()
+* 功能说明: UART串��始化
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+*           UART_InitStructure * initStruct    包�UART串�相关设定值的结构体
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct)
 void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct)
 {
 {
@@ -51,7 +50,7 @@ void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct)
         break;
         break;
     }
     }
 
 
-    UART_Close(UARTx);  //һЩ¹Ø¼ü¼Ä´æÆ÷Ö»ÄÜÔÚ´®¿Ú¹Ø±ÕʱÉèÖÃ
+    UART_Close(UARTx); //一些关键寄存器�能在串�关闭时设置
 
 
     UARTx->CTRL |= (0x01 << UART_CTRL_BAUDEN_Pos);
     UARTx->CTRL |= (0x01 << UART_CTRL_BAUDEN_Pos);
     UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
     UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
@@ -59,11 +58,29 @@ void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct)
 
 
     UARTx->CTRL &= ~(UART_CTRL_DATA9b_Msk | UART_CTRL_PARITY_Msk | UART_CTRL_STOP2b_Msk);
     UARTx->CTRL &= ~(UART_CTRL_DATA9b_Msk | UART_CTRL_PARITY_Msk | UART_CTRL_STOP2b_Msk);
     UARTx->CTRL |= (initStruct->DataBits << UART_CTRL_DATA9b_Pos) |
     UARTx->CTRL |= (initStruct->DataBits << UART_CTRL_DATA9b_Pos) |
-                   (initStruct->Parity   << UART_CTRL_PARITY_Pos) |
+                   (initStruct->Parity << UART_CTRL_PARITY_Pos) |
                    (initStruct->StopBits << UART_CTRL_STOP2b_Pos);
                    (initStruct->StopBits << UART_CTRL_STOP2b_Pos);
 
 
+    /* 在SWM320中,当 RXLVL >= RXTHR 时触�中断,如果RXTHR设置为0的�,在未接收到数�时就会一直触�中断;
+       其他芯片中,当 RXLVL >  RXTHR 时触�中断,为解决SWM320中RXTHR�能为0的问题,并统一库函数API,这里将RXTHR设置值加一
+    */
+    switch ((uint32_t)UARTx) // 软件���能清零 NVIC 寄存器,若�手动清除,下�的代�清零 RXTHR 时会导致一直进入 ISR
+    {
+    case ((uint32_t)UART0):
+        NVIC_DisableIRQ(UART0_IRQn);
+        break;
+    case ((uint32_t)UART1):
+        NVIC_DisableIRQ(UART1_IRQn);
+        break;
+    case ((uint32_t)UART2):
+        NVIC_DisableIRQ(UART2_IRQn);
+        break;
+    case ((uint32_t)UART3):
+        NVIC_DisableIRQ(UART3_IRQn);
+        break;
+    }
     UARTx->FIFO &= ~(UART_FIFO_RXTHR_Msk | UART_FIFO_TXTHR_Msk);
     UARTx->FIFO &= ~(UART_FIFO_RXTHR_Msk | UART_FIFO_TXTHR_Msk);
-    UARTx->FIFO |= (initStruct->RXThreshold << UART_FIFO_RXTHR_Pos) |
+    UARTx->FIFO |= ((initStruct->RXThreshold + 1) << UART_FIFO_RXTHR_Pos) |
                    (initStruct->TXThreshold << UART_FIFO_TXTHR_Pos);
                    (initStruct->TXThreshold << UART_FIFO_TXTHR_Pos);
 
 
     UARTx->CTRL &= ~UART_CTRL_TOTIME_Msk;
     UARTx->CTRL &= ~UART_CTRL_TOTIME_Msk;
@@ -123,11 +140,11 @@ void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_Open()
-* ¹¦ÄÜ˵Ã÷: UART´®¿Ú´ò¿ª
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_Open()
+* 功能说明: UART串�打开
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_Open(UART_TypeDef *UARTx)
 void UART_Open(UART_TypeDef *UARTx)
 {
 {
@@ -135,11 +152,11 @@ void UART_Open(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_Close()
-* ¹¦ÄÜ˵Ã÷: UART´®¿Ú¹Ø±Õ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_Close()
+* 功能说明: UART串�关闭
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_Close(UART_TypeDef *UARTx)
 void UART_Close(UART_TypeDef *UARTx)
 {
 {
@@ -147,25 +164,25 @@ void UART_Close(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_WriteByte()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ý
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬¿Éȡֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3¡¢UART4
-*           uint8_t data            Òª·¢Ë͵Ä×Ö½Ú
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_WriteByte()
+* 功能说明: ��一个字节数�
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,��值包括UART0�UART1�UART2�UART3�UART4
+*           uint32_t data           ���的字节
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
-void UART_WriteByte(UART_TypeDef *UARTx, uint8_t data)
+void UART_WriteByte(UART_TypeDef *UARTx, uint32_t data)
 {
 {
     UARTx->DATA = data;
     UARTx->DATA = data;
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_ReadByte()
-* ¹¦ÄÜ˵Ã÷: ¶Áȡһ¸ö×Ö½ÚÊý¾Ý£¬²¢Ö¸³öÊý¾ÝÊÇ·ñValid
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬¿Éȡֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3¡¢UART4
-*           uint32_t * data         ½ÓÊÕµ½µÄÊý¾Ý
-* Êä    ³ö: uint32_t                0 ÎÞ´íÎó    UART_ERR_PARITY ÆæÅ¼Ð£Ñé´íÎó
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_ReadByte()
+* 功能说明: 读�一个字节数�,并指出数�是�Valid
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,��值包括UART0�UART1�UART2�UART3�UART4
+*           uint32_t * data         接收到的数�
+* 输    出: uint32_t              0 无错误    UART_ERR_PARITY 奇�校验错误
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data)
 uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data)
 {
 {
@@ -173,17 +190,18 @@ uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data)
 
 
     *data = (reg & UART_DATA_DATA_Msk);
     *data = (reg & UART_DATA_DATA_Msk);
 
 
-    if (reg & UART_DATA_PAERR_Msk) return UART_ERR_PARITY;
+    if (reg & UART_DATA_PAERR_Msk)
+        return UART_ERR_PARITY;
 
 
     return 0;
     return 0;
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_IsTXBusy()
-* ¹¦ÄÜ˵Ã÷: UARTÊÇ·ñÕýÔÚ·¢ËÍÊý¾Ý
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                1 UARTÕýÔÚ·¢ËÍÊý¾Ý    0 Êý¾ÝÒÑ·¢Íê
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_IsTXBusy()
+* 功能说明: UART是�正在��数�
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              1 UART正在��数�    0 数�已�完
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_IsTXBusy(UART_TypeDef *UARTx)
 uint32_t UART_IsTXBusy(UART_TypeDef *UARTx)
 {
 {
@@ -191,11 +209,11 @@ uint32_t UART_IsTXBusy(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_IsRXFIFOEmpty()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕFIFOÊÇ·ñΪ¿Õ£¬Èç¹û²»¿ÕÔò˵Ã÷ÆäÖÐÓÐÊý¾Ý¿ÉÒÔ¶ÁÈ¡
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                1 ½ÓÊÕFIFO¿Õ    0 ½ÓÊÕFIFO·Ç¿Õ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_IsRXFIFOEmpty()
+* 功能说明: 接收FIFO是�为空,如果�空则说明其中有数��以读�
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              1 接收FIFO空    0 接收FIFO�空
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx)
 uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx)
 {
 {
@@ -203,11 +221,11 @@ uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_IsTXFIFOFull()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFOÊÇ·ñΪÂú£¬Èç¹û²»ÂúÔò¿ÉÒÔ¼ÌÐøÏòÆäÖÐдÈëÊý¾Ý
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                1 ·¢ËÍFIFOÂú    0 ·¢ËÍFIFO²»Âú
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_IsTXFIFOFull()
+* 功能说明: ��FIFO是�为满,如果�满则�以继续�其中写入数�
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              1 ��FIFO满    0 ��FIFO�满
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx)
 uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx)
 {
 {
@@ -215,53 +233,53 @@ uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_SetBaudrate()
-* ¹¦ÄÜ˵Ã÷: ÉèÖò¨ÌØÂÊ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-*           uint32_t baudrate       ÒªÉèÖõIJ¨ÌØÂÊ
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ²»ÒªÔÚ´®¿Ú¹¤×÷ʱ¸ü¸Ä²¨ÌØÂÊ£¬Ê¹Óô˺¯ÊýǰÇëÏȵ÷ÓÃUART_Close()¹Ø±Õ´®¿Ú
+* 函数�称: UART_SetBaudrate()
+* 功能说明: 设置波特率
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+*           uint32_t baudrate       �设置的波特率
+* 输    出: 无
+* 注�事项: ��在串�工作时更改波特率,使用此函数�请先调用UART_Close()关闭串�
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate)
 void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate)
 {
 {
     UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
     UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
-    UARTx->BAUD |= ((SystemCoreClock / 16 / baudrate) << UART_BAUD_BAUD_Pos);
+    UARTx->BAUD |= ((SystemCoreClock / 16 / baudrate - 1) << UART_BAUD_BAUD_Pos);
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_GetBaudrate()
-* ¹¦ÄÜ˵Ã÷: ²éѯ²¨ÌØÂÊ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                µ±Ç°²¨ÌØÂÊ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_GetBaudrate()
+* 功能说明: 查询波特率
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              当�波特率
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_GetBaudrate(UART_TypeDef *UARTx)
 uint32_t UART_GetBaudrate(UART_TypeDef *UARTx)
 {
 {
-    return (UARTx->BAUD & UART_BAUD_BAUD_Msk);
+    return SystemCoreClock / 16 / (((UARTx->BAUD & UART_BAUD_BAUD_Msk) >> UART_BAUD_BAUD_Pos) + 1);
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_CTSConfig()
-* ¹¦ÄÜ˵Ã÷: UART CTSÁ÷¿ØÅäÖÃ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-*           uint32_t enable         1 ʹÄÜCTSÁ÷¿Ø    0 ½ûÖ¹CTSÁ÷¿Ø
-*           uint32_t polarity       0 CTSÊäÈëΪµÍ±íʾ¿ÉÒÔ·¢ËÍÊý¾Ý    1 CTSÊäÈëΪ¸ß±íʾ¿ÉÒÔ·¢ËÍÊý¾Ý
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_CTSConfig()
+* 功能说明: UART CTS�控�置
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+*           uint32_t enable         1 使能CTS�控    0 �止CTS�控
+*           uint32_t polarity       0 CTS输入为低表示�以��数�    1 CTS输入为高表示�以��数�
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_CTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity)
 void UART_CTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity)
 {
 {
     UARTx->CTSCR &= ~(UART_CTSCR_EN_Msk | UART_CTSCR_POL_Msk);
     UARTx->CTSCR &= ~(UART_CTSCR_EN_Msk | UART_CTSCR_POL_Msk);
-    UARTx->CTSCR |= (enable   << UART_CTSCR_EN_Pos) |
+    UARTx->CTSCR |= (enable << UART_CTSCR_EN_Pos) |
                     (polarity << UART_CTSCR_POL_Pos);
                     (polarity << UART_CTSCR_POL_Pos);
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_CTSLineState()
-* ¹¦ÄÜ˵Ã÷: UART CTSÏßµ±Ç°×´Ì¬
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                0 CTSÏßµ±Ç°ÎªµÍµçƽ    1 CTSÏßµ±Ç°Îª¸ßµçƽ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_CTSLineState()
+* 功能说明: UART CTS线当�状�
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              0 CTS线当�为低电平    1 CTS线当�为高电平
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_CTSLineState(UART_TypeDef *UARTx)
 uint32_t UART_CTSLineState(UART_TypeDef *UARTx)
 {
 {
@@ -269,29 +287,29 @@ uint32_t UART_CTSLineState(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_RTSConfig()
-* ¹¦ÄÜ˵Ã÷: UART RTSÁ÷¿ØÅäÖÃ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-*           uint32_t enable         1 ʹÄÜRTSÁ÷¿Ø    0 ½ûÖ¹RTSÁ÷¿Ø
-*           uint32_t polarity       0 RTSÊä³öµÍ±íʾ¿ÉÒÔ½ÓÊÕÊý¾Ý    1 RTSÊä³ö¸ß±íʾ¿ÉÒÔ½ÓÊÕÊý¾Ý
-*           uint32_t threshold      RTSÁ÷¿ØµÄ´¥·¢ãÐÖµ£¬¿ÉȡֵUART_RTS_1BYTE¡¢UART_RTS_2BYTE¡¢UART_RTS_4BYTE¡¢UART_RTS_6BYTE
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_RTSConfig()
+* 功能说明: UART RTS�控�置
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+*           uint32_t enable         1 使能RTS�控    0 �止RTS�控
+*           uint32_t polarity       0 RTS输出低表示�以接收数�    1 RTS输出高表示�以接收数�
+*           uint32_t threshold      RTS�控的触�阈值,��值UART_RTS_1BYTE�UART_RTS_2BYTE�UART_RTS_4BYTE�UART_RTS_6BYTE
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_RTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold)
 void UART_RTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold)
 {
 {
     UARTx->RTSCR &= ~(UART_RTSCR_EN_Msk | UART_RTSCR_POL_Msk | UART_RTSCR_THR_Msk);
     UARTx->RTSCR &= ~(UART_RTSCR_EN_Msk | UART_RTSCR_POL_Msk | UART_RTSCR_THR_Msk);
-    UARTx->RTSCR |= (enable    << UART_RTSCR_EN_Pos)  |
-                    (polarity  << UART_RTSCR_POL_Pos) |
+    UARTx->RTSCR |= (enable << UART_RTSCR_EN_Pos) |
+                    (polarity << UART_RTSCR_POL_Pos) |
                     (threshold << UART_RTSCR_THR_Pos);
                     (threshold << UART_RTSCR_THR_Pos);
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_RTSLineState()
-* ¹¦ÄÜ˵Ã÷: UART RTSÏßµ±Ç°×´Ì¬
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                0 RTSÏßµ±Ç°ÎªµÍµçƽ    1 RTSÏßµ±Ç°Îª¸ßµçƽ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_RTSLineState()
+* 功能说明: UART RTS线当�状�
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              0 RTS线当�为低电平    1 RTS线当�为高电平
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_RTSLineState(UART_TypeDef *UARTx)
 uint32_t UART_RTSLineState(UART_TypeDef *UARTx)
 {
 {
@@ -299,27 +317,27 @@ uint32_t UART_RTSLineState(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_LINConfig()
-* ¹¦ÄÜ˵Ã÷: UART LIN¹¦ÄÜÅäÖÃ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-*           uint32_t detectedIEn    ¼ì²âµ½BreakÖжÏʹÄÜ
-*           uint32_t generatedIEn   Break·¢ËÍÍê³ÉÖжÏʹÄÜ
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_LINConfig()
+* 功能说明: UART LIN功能�置
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+*           uint32_t detectedIEn    检测到Break中断使能
+*           uint32_t generatedIEn   Break��完�中断使能
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_LINConfig(UART_TypeDef *UARTx, uint32_t detectedIEn, uint32_t generatedIEn)
 void UART_LINConfig(UART_TypeDef *UARTx, uint32_t detectedIEn, uint32_t generatedIEn)
 {
 {
     UARTx->LINCR &= ~(UART_LINCR_BRKDETIE_Msk | UART_LINCR_GENBRKIE_Msk);
     UARTx->LINCR &= ~(UART_LINCR_BRKDETIE_Msk | UART_LINCR_GENBRKIE_Msk);
-    UARTx->LINCR |= (detectedIEn  << UART_LINCR_BRKDETIE_Pos) |
+    UARTx->LINCR |= (detectedIEn << UART_LINCR_BRKDETIE_Pos) |
                     (generatedIEn << UART_LINCR_GENBRKIE_Pos);
                     (generatedIEn << UART_LINCR_GENBRKIE_Pos);
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_LINGenerate()
-* ¹¦ÄÜ˵Ã÷: UART LIN²úÉú/·¢ËÍBreak
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_LINGenerate()
+* 功能说明: UART LIN产生/��Break
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_LINGenerate(UART_TypeDef *UARTx)
 void UART_LINGenerate(UART_TypeDef *UARTx)
 {
 {
@@ -327,23 +345,23 @@ void UART_LINGenerate(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_LINIsDetected()
-* ¹¦ÄÜ˵Ã÷: UART LINÊÇ·ñ¼ì²âµ½Break
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                1 ¼ì²âµ½LIN Break    0 δ¼ì²âµ½LIN Break
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_LINIsDetected()
+* 功能说明: UART LIN是�检测到Break
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              1 检测到LIN Break    0 未检测到LIN Break
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_LINIsDetected(UART_TypeDef *UARTx)
 uint32_t UART_LINIsDetected(UART_TypeDef *UARTx)
 {
 {
-    return (UARTx->LINCR & UART_LINCR_BRKDETIE_Msk) ? 1 : 0;
+    return (UARTx->LINCR & UART_LINCR_BRKDETIF_Msk) ? 1 : 0;
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_LINIsGenerated()
-* ¹¦ÄÜ˵Ã÷: UART LIN BreakÊÇ·ñ·¢ËÍÍê³É
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                1 LIN Break ·¢ËÍÍê³É    0 LIN Break·¢ËÍδÍê³É
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_LINIsGenerated()
+* 功能说明: UART LIN Break是���完�
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              1 LIN Break ��完�    0 LIN Break��未完�
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_LINIsGenerated(UART_TypeDef *UARTx)
 uint32_t UART_LINIsGenerated(UART_TypeDef *UARTx)
 {
 {
@@ -351,36 +369,42 @@ uint32_t UART_LINIsGenerated(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_ABRStart()
-* ¹¦ÄÜ˵Ã÷: UART ×Ô¶¯²¨ÌØÂʼì²â¿ªÊ¼
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-*           uint32_t detectChar     ÓÃÓÚ×Ô¶¯¼ì²â¡¢¼ÆËã²¨ÌØÂʵļì²â×Ö·û
-*                                   8λÊý¾Ýʱ¿Éȡֵ£º0xFF¡¢0xFE¡¢0xF8¡¢0x80£¬·Ö±ð±íʾ·¢ËÍ·½±ØÐë·¢ËÍ0xFF¡¢0xFE¡¢0xF8¡¢0x80
-*                                   9λÊý¾Ýʱ¿Éȡֵ£º0x1FF¡¢0x1FE¡¢0x1F8¡¢0x180£¬·Ö±ð±íʾ·¢ËÍ·½±ØÐë·¢ËÍ0x1FF¡¢0x1FE¡¢0x1F8¡¢0x180
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ×Ô¶¯²¨ÌØÂʼì²âʱ²»ÄÜ¿ªÆôÆæÅ¼Ð£Ñé
+* 函数�称: UART_ABRStart()
+* 功能说明: UART 自动波特率检测开始
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+*           uint32_t detectChar     用于自动检测�计算波特率的检测字符
+*                                   8�数�时��值:0xFF�0xFE�0xF8�0x80,分别表示��方必须��0xFF�0xFE�0xF8�0x80
+*                                   9�数�时��值:0x1FF�0x1FE�0x1F8�0x180,分别表示��方必须��0x1FF�0x1FE�0x1F8�0x180
+* 输    出: 无
+* 注�事项: 自动波特率检测时�能开�奇�校验
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar)
 void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar)
 {
 {
     uint32_t bits;
     uint32_t bits;
 
 
-    if ((detectChar == 0xFF) || (detectChar == 0x1FF))      bits = 0;
-    else if ((detectChar == 0xFE) || (detectChar == 0x1FE)) bits = 1;
-    else if ((detectChar == 0xF8) || (detectChar == 0x1F8)) bits = 2;
-    else if ((detectChar == 0x80) || (detectChar == 0x180)) bits = 3;
-    else while (1);
+    if ((detectChar == 0xFF) || (detectChar == 0x1FF))
+        bits = 0;
+    else if ((detectChar == 0xFE) || (detectChar == 0x1FE))
+        bits = 1;
+    else if ((detectChar == 0xF8) || (detectChar == 0x1F8))
+        bits = 2;
+    else if ((detectChar == 0x80) || (detectChar == 0x180))
+        bits = 3;
+    else
+        while (1)
+            ;
 
 
     UARTx->BAUD &= ~(UART_BAUD_ABREN_Msk | UART_BAUD_ABRBIT_Msk);
     UARTx->BAUD &= ~(UART_BAUD_ABREN_Msk | UART_BAUD_ABRBIT_Msk);
-    UARTx->BAUD |= (1    << UART_BAUD_ABREN_Pos) |
+    UARTx->BAUD |= (1 << UART_BAUD_ABREN_Pos) |
                    (bits << UART_BAUD_ABRBIT_Pos);
                    (bits << UART_BAUD_ABRBIT_Pos);
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_ABRIsDone()
-* ¹¦ÄÜ˵Ã÷: UART ×Ô¶¯²¨ÌØÂÊÊÇ·ñÍê³É
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                0 δÍê³É    UART_ABR_RES_OK ÒÑÍê³É£¬Çҳɹ¦    UART_ABR_RES_ERR ÒÑÍê³É£¬µ«Ê§°Ü¡¢³ö´í
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_ABRIsDone()
+* 功能说明: UART 自动波特率是�完�
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              0 未完�    UART_ABR_RES_OK 已完�,且�功    UART_ABR_RES_ERR 已完�,但失败�出错
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_ABRIsDone(UART_TypeDef *UARTx)
 uint32_t UART_ABRIsDone(UART_TypeDef *UARTx)
 {
 {
@@ -399,11 +423,11 @@ uint32_t UART_ABRIsDone(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_INTRXThresholdEn()
-* ¹¦ÄÜ˵Ã÷: µ±RX FIFOÖÐÊý¾Ý¸öÊý >= RXThresholdʱ ´¥·¢ÖжÏ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_INTRXThresholdEn()
+* 功能说明: 当RX FIFO中数�个数 >= RXThreshold时 触�中断
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_INTRXThresholdEn(UART_TypeDef *UARTx)
 void UART_INTRXThresholdEn(UART_TypeDef *UARTx)
 {
 {
@@ -411,11 +435,11 @@ void UART_INTRXThresholdEn(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_INTRXThresholdDis()
-* ¹¦ÄÜ˵Ã÷: µ±RX FIFOÖÐÊý¾Ý¸öÊý >= RXThresholdʱ ²»´¥·¢ÖжÏ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_INTRXThresholdDis()
+* 功能说明: 当RX FIFO中数�个数 >= RXThreshold时 �触�中断
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_INTRXThresholdDis(UART_TypeDef *UARTx)
 void UART_INTRXThresholdDis(UART_TypeDef *UARTx)
 {
 {
@@ -423,11 +447,11 @@ void UART_INTRXThresholdDis(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_INTRXThresholdStat()
-* ¹¦ÄÜ˵Ã÷: ÊÇ·ñRX FIFOÖÐÊý¾Ý¸öÊý >= RXThreshold
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                1 RX FIFOÖÐÊý¾Ý¸öÊý >= RXThreshold      0 RX FIFOÖÐÊý¾Ý¸öÊý < RXThreshold
-* ×¢ÒâÊÂÏî: RXIF = RXTHRF & RXIE
+* 函数�称: UART_INTRXThresholdStat()
+* 功能说明: 是�RX FIFO中数�个数 >= RXThreshold
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              1 RX FIFO中数�个数 >= RXThreshold       0 RX FIFO中数�个数 < RXThreshold
+* 注�事项: RXIF = RXTHRF & RXIE
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx)
 uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx)
 {
 {
@@ -435,11 +459,11 @@ uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_INTTXThresholdEn()
-* ¹¦ÄÜ˵Ã÷: µ±TX FIFOÖÐÊý¾Ý¸öÊý <= TXThresholdʱ ´¥·¢ÖжÏ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_INTTXThresholdEn()
+* 功能说明: 当TX FIFO中数�个数 <= TXThreshold时 触�中断
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_INTTXThresholdEn(UART_TypeDef *UARTx)
 void UART_INTTXThresholdEn(UART_TypeDef *UARTx)
 {
 {
@@ -447,11 +471,11 @@ void UART_INTTXThresholdEn(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_INTTXThresholdDis()
-* ¹¦ÄÜ˵Ã÷: µ±TX FIFOÖÐÊý¾Ý¸öÊý <= TXThresholdʱ ²»´¥·¢ÖжÏ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_INTTXThresholdDis()
+* 功能说明: 当TX FIFO中数�个数 <= TXThreshold时 �触�中断
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_INTTXThresholdDis(UART_TypeDef *UARTx)
 void UART_INTTXThresholdDis(UART_TypeDef *UARTx)
 {
 {
@@ -459,11 +483,11 @@ void UART_INTTXThresholdDis(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_INTTXThresholdStat()
-* ¹¦ÄÜ˵Ã÷: ÊÇ·ñTX FIFOÖÐÊý¾Ý¸öÊý <= TXThreshold
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                1 TX FIFOÖÐÊý¾Ý¸öÊý <= TXThreshold      0 TX FIFOÖÐÊý¾Ý¸öÊý > TXThreshold
-* ×¢ÒâÊÂÏî: TXIF = TXTHRF & TXIE
+* 函数�称: UART_INTTXThresholdStat()
+* 功能说明: 是�TX FIFO中数�个数 <= TXThreshold
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              1 TX FIFO中数�个数 <= TXThreshold       0 TX FIFO中数�个数 > TXThreshold
+* 注�事项: TXIF = TXTHRF & TXIE
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_INTTXThresholdStat(UART_TypeDef *UARTx)
 uint32_t UART_INTTXThresholdStat(UART_TypeDef *UARTx)
 {
 {
@@ -471,11 +495,11 @@ uint32_t UART_INTTXThresholdStat(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_INTTimeoutEn()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕ·¢Éú³¬Ê±Ê± ´¥·¢ÖжÏ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_INTTimeoutEn()
+* 功能说明: 接收�生超时时 触�中断
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_INTTimeoutEn(UART_TypeDef *UARTx)
 void UART_INTTimeoutEn(UART_TypeDef *UARTx)
 {
 {
@@ -483,11 +507,11 @@ void UART_INTTimeoutEn(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_INTTimeoutDis()
-* ¹¦ÄÜ˵Ã÷: ½ÓÊÕ·¢Éú³¬Ê±Ê± ²»´¥·¢ÖжÏ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_INTTimeoutDis()
+* 功能说明: 接收�生超时时 �触�中断
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_INTTimeoutDis(UART_TypeDef *UARTx)
 void UART_INTTimeoutDis(UART_TypeDef *UARTx)
 {
 {
@@ -495,11 +519,11 @@ void UART_INTTimeoutDis(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_INTTimeoutStat()
-* ¹¦ÄÜ˵Ã÷: ÊÇ·ñ·¢ÉúÁ˽ÓÊÕ³¬Ê±£¬¼´³¬¹ý TimeoutTime/(Baudrate/10) ÃëûÓÐÔÚRXÏßÉϽÓÊÕµ½Êý¾Ýʱ´¥·¢ÖжÏ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                1 ·¢ÉúÁ˽ÓÊÕ³¬Ê±        0 δ·¢Éú½ÓÊÕ³¬Ê±
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_INTTimeoutStat()
+* 功能说明: 是��生了接收超时,�超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数�时触�中断
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              1 �生了接收超时       0 未�生接收超时
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_INTTimeoutStat(UART_TypeDef *UARTx)
 uint32_t UART_INTTimeoutStat(UART_TypeDef *UARTx)
 {
 {
@@ -507,11 +531,11 @@ uint32_t UART_INTTimeoutStat(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_INTTXDoneEn()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO¿ÕÇÒ·¢ËÍÒÆÎ»¼Ä´æÆ÷¿ÕÖжÏʹÄÜ
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_INTTXDoneEn()
+* 功能说明: ��FIFO空且��移�寄存器空中断使能
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_INTTXDoneEn(UART_TypeDef *UARTx)
 void UART_INTTXDoneEn(UART_TypeDef *UARTx)
 {
 {
@@ -519,11 +543,11 @@ void UART_INTTXDoneEn(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_INTTXDoneDis()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO¿ÕÇÒ·¢ËÍÒÆÎ»¼Ä´æÆ÷¿ÕÖжϽûÖ¹
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: ÎÞ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_INTTXDoneDis()
+* 功能说明: ��FIFO空且��移�寄存器空中断�止
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: 无
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void UART_INTTXDoneDis(UART_TypeDef *UARTx)
 void UART_INTTXDoneDis(UART_TypeDef *UARTx)
 {
 {
@@ -531,11 +555,11 @@ void UART_INTTXDoneDis(UART_TypeDef *UARTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* º¯ÊýÃû³Æ: UART_INTTXDoneStat()
-* ¹¦ÄÜ˵Ã÷: ·¢ËÍFIFO¿ÕÇÒ·¢ËÍÒÆÎ»¼Ä´æÆ÷¿ÕÖжÏ״̬
-* Êä    Èë: UART_TypeDef * UARTx    Ö¸¶¨Òª±»ÉèÖõÄUART´®¿Ú£¬ÓÐЧֵ°üÀ¨UART0¡¢UART1¡¢UART2¡¢UART3
-* Êä    ³ö: uint32_t                1 ·¢ËÍFIFO¿ÕÇÒ·¢ËÍÒÆÎ»¼Ä´æÆ÷¿Õ      0 ·¢ËÍFIFO»ò·¢ËÍÒÆÎ»¼Ä´æÆ÷δ¿Õ
-* ×¢ÒâÊÂÏî: ÎÞ
+* 函数�称: UART_INTTXDoneStat()
+* 功能说明: ��FIFO空且��移�寄存器空中断状�
+* 输    入: UART_TypeDef * UARTx  指定�被设置的UART串�,有效值包括UART0�UART1�UART2�UART3
+* 输    出: uint32_t              1 ��FIFO空且��移�寄存器空      0 ��FIFO或��移�寄存器未空
+* 注�事项: 无
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx)
 uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx)
 {
 {

+ 34 - 39
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_uart.h

@@ -5,62 +5,59 @@ typedef struct
 {
 {
     uint32_t Baudrate;
     uint32_t Baudrate;
 
 
-    uint8_t  DataBits;          //数据位位数,可取值UART_DATA_8BIT、UART_DATA_9BIT
+    uint8_t DataBits; //鏁版嵁浣嶄綅鏁帮紝鍙�彇鍊糢ART_DATA_8BIT銆乁ART_DATA_9BIT
 
 
-    uint8_t  Parity;            //奇偶校验位,可取值UART_PARITY_NONE、UART_PARITY_ODD、UART_PARITY_EVEN、UART_PARITY_ONE、UART_PARITY_ZERO
+    uint8_t Parity; //濂囧伓鏍¢獙浣嶏紝鍙�彇鍊糢ART_PARITY_NONE銆乁ART_PARITY_ODD銆乁ART_PARITY_EVEN銆乁ART_PARITY_ONE銆乁ART_PARITY_ZERO
 
 
-    uint8_t  StopBits;          //停止位位数,可取值UART_STOP_1BIT、UART_STOP_2BIT
+    uint8_t StopBits; //鍋滄�浣嶄綅鏁帮紝鍙�彇鍊糢ART_STOP_1BIT銆乁ART_STOP_2BIT
 
 
-    uint8_t  RXThreshold;       //取值0--7
-    uint8_t  RXThresholdIEn;    //当RX FIFO中数据个数 >= RXThreshold时触发中断
+    uint8_t RXThreshold;    //鍙栧€�0--7
+    uint8_t RXThresholdIEn; //褰揜X FIFO涓�暟鎹�釜鏁� >  RXThreshold鏃惰Е鍙戜腑鏂�
 
 
-    uint8_t  TXThreshold;       //取值0--7
-    uint8_t  TXThresholdIEn;    //当TX FIFO中数据个数 <= TXThreshold时触发中断
+    uint8_t TXThreshold;    //鍙栧€�0--7
+    uint8_t TXThresholdIEn; //褰揟X FIFO涓�暟鎹�釜鏁� <= TXThreshold鏃惰Е鍙戜腑鏂�
 
 
-    uint8_t  TimeoutTime;       //超时时长 = TimeoutTime/(Baudrate/10) 秒
-    uint8_t  TimeoutIEn;        //超时中断,超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断
+    uint8_t TimeoutTime; //瓒呮椂鏃堕暱 = TimeoutTime/(Baudrate/10) 绉�
+    uint8_t TimeoutIEn;  //瓒呮椂涓�柇锛孯X FIFO闈炵┖锛屼笖瓒呰繃 TimeoutTime/(Baudrate/10) 绉掓病鏈夊湪RX绾夸笂鎺ユ敹鍒版暟鎹�椂瑙﹀彂涓�柇
 } UART_InitStructure;
 } UART_InitStructure;
 
 
+#define UART_DATA_8BIT 0
+#define UART_DATA_9BIT 1
 
 
-#define UART_DATA_8BIT      0
-#define UART_DATA_9BIT      1
+#define UART_PARITY_NONE 0
+#define UART_PARITY_ODD 1
+#define UART_PARITY_EVEN 3
+#define UART_PARITY_ONE 5
+#define UART_PARITY_ZERO 7
 
 
-#define UART_PARITY_NONE    0
-#define UART_PARITY_ODD     1
-#define UART_PARITY_EVEN    3
-#define UART_PARITY_ONE     5
-#define UART_PARITY_ZERO    7
+#define UART_STOP_1BIT 0
+#define UART_STOP_2BIT 1
 
 
-#define UART_STOP_1BIT      0
-#define UART_STOP_2BIT      1
+#define UART_RTS_1BYTE 0
+#define UART_RTS_2BYTE 1
+#define UART_RTS_4BYTE 2
+#define UART_RTS_6BYTE 3
 
 
-#define UART_RTS_1BYTE      0
-#define UART_RTS_2BYTE      1
-#define UART_RTS_4BYTE      2
-#define UART_RTS_6BYTE      3
+#define UART_ABR_RES_OK 1
+#define UART_ABR_RES_ERR 2
 
 
-#define UART_ABR_RES_OK     1
-#define UART_ABR_RES_ERR    2
+#define UART_ERR_FRAME 1
+#define UART_ERR_PARITY 2
+#define UART_ERR_NOISE 3
 
 
-#define UART_ERR_FRAME      1
-#define UART_ERR_PARITY     2
-#define UART_ERR_NOISE      3
-
-
-void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct);    //UART串口初始化
+void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct); //UART涓插彛鍒濆�鍖�
 void UART_Open(UART_TypeDef *UARTx);
 void UART_Open(UART_TypeDef *UARTx);
 void UART_Close(UART_TypeDef *UARTx);
 void UART_Close(UART_TypeDef *UARTx);
 
 
-void UART_WriteByte(UART_TypeDef *UARTx, uint8_t data);                 //发送一个字节数据
-uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data);            //读取一个字节数据,并指出数据是否Valid
+void UART_WriteByte(UART_TypeDef *UARTx, uint32_t data);     //鍙戦€佷竴涓�瓧鑺傛暟鎹�
+uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data); //璇诲彇涓€涓�瓧鑺傛暟鎹�紝骞舵寚鍑烘暟鎹�槸鍚�alid
 
 
 uint32_t UART_IsTXBusy(UART_TypeDef *UARTx);
 uint32_t UART_IsTXBusy(UART_TypeDef *UARTx);
-uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx);                       //接收FIFO是否空,如果不空则可以继续UART_ReadByte()
-uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx);                        //发送FIFO是否满,如果不满则可以继续UART_WriteByte()
-
+uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx); //鎺ユ敹FIFO鏄�惁绌猴紝濡傛灉涓嶇┖鍒欏彲浠ョ户缁璘ART_ReadByte()
+uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx);  //鍙戦€丗IFO鏄�惁婊★紝濡傛灉涓嶆弧鍒欏彲浠ョ户缁璘ART_WriteByte()
 
 
-void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate);          //设置波特率
-uint32_t UART_GetBaudrate(UART_TypeDef *UARTx);                         //获取当前使用的波特率
+void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate); //璁剧疆娉㈢壒鐜�
+uint32_t UART_GetBaudrate(UART_TypeDef *UARTx);                //鑾峰彇褰撳墠浣跨敤鐨勬尝鐗圭巼
 
 
 void UART_CTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity);
 void UART_CTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity);
 uint32_t UART_CTSLineState(UART_TypeDef *UARTx);
 uint32_t UART_CTSLineState(UART_TypeDef *UARTx);
@@ -76,7 +73,6 @@ uint32_t UART_LINIsGenerated(UART_TypeDef *UARTx);
 void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar);
 void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar);
 uint32_t UART_ABRIsDone(UART_TypeDef *UARTx);
 uint32_t UART_ABRIsDone(UART_TypeDef *UARTx);
 
 
-
 void UART_INTRXThresholdEn(UART_TypeDef *UARTx);
 void UART_INTRXThresholdEn(UART_TypeDef *UARTx);
 void UART_INTRXThresholdDis(UART_TypeDef *UARTx);
 void UART_INTRXThresholdDis(UART_TypeDef *UARTx);
 uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx);
 uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx);
@@ -91,5 +87,4 @@ void UART_INTTXDoneEn(UART_TypeDef *UARTx);
 void UART_INTTXDoneDis(UART_TypeDef *UARTx);
 void UART_INTTXDoneDis(UART_TypeDef *UARTx);
 uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx);
 uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx);
 
 
-
 #endif //__SWM320_UART_H__
 #endif //__SWM320_UART_H__

+ 48 - 47
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_wdt.c

@@ -1,10 +1,10 @@
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 恅璃靡備: SWM320_wdt.c
-* 髡夔佽隴: SWM320等⑵儂腔WDT艘藷僩髡夔Й雄踱
-* 撮扲盓厥: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* 蛁砩岈砐:
-* 唳掛゜ヽ: V1.1.0      2017爛10堎25゜
-* 汔撰暮翹:
+* ��辣�滨妍: SWM320_wdt.c
+* �蠘�霂湔�: SWM320�閧��箇�WDT�钅秄�堒��賡店�典�
+* ���舀𣈲��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 瘜冽�鈭钅★:
+* ��𧋦�交�: V1.1.0      2017撟�10��25��
+* ��漣霈啣�:
 *
 *
 *
 *
 *******************************************************************************************************************************************
 *******************************************************************************************************************************************
@@ -21,32 +21,33 @@
 #include "SWM320.h"
 #include "SWM320.h"
 #include "SWM320_wdt.h"
 #include "SWM320_wdt.h"
 
 
-
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 滲杅靡備: WDT_Init()
-* 髡夔佽隴: WDT艘藷僩場宎趙
-* 怀    ⻌: WDT_TypeDef * WDTx      硌隅猁掩扢离腔艘藷僩ㄛ衄虴硉婦嬤WDT
-*           uint32_t peroid         龰硉0--4294967295ㄛ等弇峈等⑵儂炵苀奀笘笚ヽ
-*           uint32_t mode           WDT_MODE_RESET 閉奀莉汜葩弇    WDT_MODE_INTERRUPT 閉奀莉汜笢剿
-* 怀    堤: 拸
-* 蛁砩岈砐: 葩弇妏夔奀笢剿祥お釬蚚ㄛ秪峈數杅笚ヽ賦旰奀郋⑵眻諉葩弇賸ㄛ拸楊砒茼笢剿
+* �賣㺭�滨妍: WDT_Init()
+* �蠘�霂湔�: WDT�钅秄�堒�憪见�
+* 颲�    ��: WDT_TypeDef * WDTx        ���閬�◤霈曄蔭����函�嚗峕����澆��柱DT
+*           uint32_t peroid         �硋��0--4294967295嚗��雿滢蛹�閧��箇頂蝏�𧒄�笔𪂹��
+*           uint32_t mode           WDT_MODE_RESET 頞�𧒄鈭抒�憭滢�    WDT_MODE_INTERRUPT 頞�𧒄鈭抒�銝剜鱏
+* 颲�    ��: ��
+* 瘜冽�鈭钅★: ��
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void WDT_Init(WDT_TypeDef *WDTx, uint32_t peroid, uint32_t mode)
 void WDT_Init(WDT_TypeDef *WDTx, uint32_t peroid, uint32_t mode)
 {
 {
     SYS->CLKEN |= (0x01 << SYS_CLKEN_WDT_Pos);
     SYS->CLKEN |= (0x01 << SYS_CLKEN_WDT_Pos);
 
 
-    WDT_Stop(WDTx);     //扢离ゴ珂壽敕
-
-    WDTx->LOAD = peroid;
+    WDT_Stop(WDTx); //霈曄蔭�滚��喲𡡒
 
 
     if (mode == WDT_MODE_RESET)
     if (mode == WDT_MODE_RESET)
     {
     {
+        WDTx->LOAD = peroid / 2; //蝚砌�銝芾恣�啣𪂹�毺蔭雿滢葉�剜�敹𨰜��洵鈭䔶葵霈⊥㺭�冽�撠�塳���雿�
+
         NVIC_DisableIRQ(WDT_IRQn);
         NVIC_DisableIRQ(WDT_IRQn);
 
 
         WDTx->CR |= (1 << WDT_CR_RSTEN_Pos);
         WDTx->CR |= (1 << WDT_CR_RSTEN_Pos);
     }
     }
     else //mode == WDT_MODE_INTERRUPT
     else //mode == WDT_MODE_INTERRUPT
     {
     {
+        WDTx->LOAD = peroid;
+
         NVIC_EnableIRQ(WDT_IRQn);
         NVIC_EnableIRQ(WDT_IRQn);
 
 
         WDTx->CR &= ~(1 << WDT_CR_RSTEN_Pos);
         WDTx->CR &= ~(1 << WDT_CR_RSTEN_Pos);
@@ -54,11 +55,11 @@ void WDT_Init(WDT_TypeDef *WDTx, uint32_t peroid, uint32_t mode)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 滲杅靡備: WDT_Start()
-* 髡夔佽隴: ぎ雄硌隅WDTㄛ羲宎給數奀
-* 怀    ⻌: WDT_TypeDef * WDTx      硌隅猁掩扢离腔艘藷僩ㄛ衄虴硉婦嬤WDT
-* 怀    堤: 拸
-* 蛁砩岈砐: 拸
+* �賣㺭�滨妍: WDT_Start()
+* �蠘�霂湔�: �臬𢆡���WDT嚗��憪见�坿恣��
+* 颲�    ��: WDT_TypeDef * WDTx        ���閬�◤霈曄蔭����函�嚗峕����澆��柱DT
+* 颲�    ��: ��
+* 瘜冽�鈭钅★: ��
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void WDT_Start(WDT_TypeDef *WDTx)
 void WDT_Start(WDT_TypeDef *WDTx)
 {
 {
@@ -66,11 +67,11 @@ void WDT_Start(WDT_TypeDef *WDTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 滲杅靡備: WDT_Stop()
-* 髡夔佽隴: 壽敕硌隅WDTㄛ礿砦給數奀
-* 怀    ⻌: WDT_TypeDef * WDTx      硌隅猁掩扢离腔艘藷僩ㄛ衄虴硉婦嬤WDT
-* 怀    堤: 拸
-* 蛁砩岈砐: 拸
+* �賣㺭�滨妍: WDT_Stop()
+* �蠘�霂湔�: �喲𡡒���WDT嚗��甇W�坿恣��
+* 颲�    ��: WDT_TypeDef * WDTx        ���閬�◤霈曄蔭����函�嚗峕����澆��柱DT
+* 颲�    ��: ��
+* 瘜冽�鈭钅★: ��
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void WDT_Stop(WDT_TypeDef *WDTx)
 void WDT_Stop(WDT_TypeDef *WDTx)
 {
 {
@@ -78,11 +79,11 @@ void WDT_Stop(WDT_TypeDef *WDTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 滲杅靡備: WDT_Feed()
-* 髡夔佽隴: 庣僩ㄛ笭陔植蚾婥硉羲宎給數奀
-* 怀    ⻌: WDT_TypeDef * WDTx      硌隅猁掩扢离腔艘藷僩ㄛ衄虴硉婦嬤WDT
-* 怀    堤: 拸
-* 蛁砩岈砐: 拸
+* �賣㺭�滨妍: WDT_Feed()
+* �蠘�霂湔�: ���嚗屸��唬�鋆�蝸�澆�憪见�坿恣��
+* 颲�    ��: WDT_TypeDef * WDTx        ���閬�◤霈曄蔭����函�嚗峕����澆��柱DT
+* 颲�    ��: ��
+* 瘜冽�鈭钅★: ��
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void WDT_Feed(WDT_TypeDef *WDTx)
 void WDT_Feed(WDT_TypeDef *WDTx)
 {
 {
@@ -90,11 +91,11 @@ void WDT_Feed(WDT_TypeDef *WDTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 滲杅靡備: WDT_GetValue()
-* 髡夔佽隴: 鳳龰硌隅艘藷僩隅奀け腔絞ゴ給數奀硉
-* 怀    ⻌: WDT_TypeDef * WDTx      硌隅猁掩扢离腔艘藷僩ㄛ衄虴硉婦嬤WDT
-* 怀    堤: int32_t                 艘藷僩絞ゴ數杅硉
-* 蛁砩岈砐: 拸
+* �賣㺭�滨妍: WDT_GetValue()
+* �蠘�霂湔�: �瑕�����钅秄�堒��嗅膥����滚�坿恣�嗅��
+* 颲�    ��: WDT_TypeDef * WDTx        ���閬�◤霈曄蔭����函�嚗峕����澆��柱DT
+* 颲�    ��: int32_t                   �钅秄�堒��滩恣�啣��
+* 瘜冽�鈭钅★: ��
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 int32_t WDT_GetValue(WDT_TypeDef *WDTx)
 int32_t WDT_GetValue(WDT_TypeDef *WDTx)
 {
 {
@@ -102,11 +103,11 @@ int32_t WDT_GetValue(WDT_TypeDef *WDTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 滲杅靡備: WDT_INTClr()
-* 髡夔佽隴: 笢剿梓祩ラ壺
-* 怀    ⻌: WDT_TypeDef * WDTx      硌隅猁掩扢离腔艘藷僩ㄛ衄虴硉婦嬤WDT
-* 怀    堤: 拸
-* 蛁砩岈砐: 拸
+* �賣㺭�滨妍: WDT_INTClr()
+* �蠘�霂湔�: 銝剜鱏���皜�膄
+* 颲�    ��: WDT_TypeDef * WDTx        ���閬�◤霈曄蔭����函�嚗峕����澆��柱DT
+* 颲�    ��: ��
+* 瘜冽�鈭钅★: ��
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 void WDT_INTClr(WDT_TypeDef *WDTx)
 void WDT_INTClr(WDT_TypeDef *WDTx)
 {
 {
@@ -114,11 +115,11 @@ void WDT_INTClr(WDT_TypeDef *WDTx)
 }
 }
 
 
 /******************************************************************************************************************************************
 /******************************************************************************************************************************************
-* 滲杅靡備: WDT_INTStat()
-* 髡夔佽隴: 笢剿袨怓脤戙
-* 怀    ⻌: WDT_TypeDef * WDTx      硌隅猁掩扢离腔艘藷僩ㄛ衄虴硉婦嬤WDT
-* 怀    堤: int32_t                 1 楷汜笢剿祛堤    0 帤楷汜笢剿祛堤
-* 蛁砩岈砐: 拸
+* �賣㺭�滨妍: WDT_INTStat()
+* �蠘�霂湔�: 銝剜鱏�嗆��䰻霂�
+* 颲�    ��: WDT_TypeDef * WDTx        ���閬�◤霈曄蔭����函�嚗峕����澆��柱DT
+* 颲�    ��: int32_t                   1 �𤑳�銝剜鱏皞W枂    0 �芸��煺葉�剜滯��
+* 瘜冽�鈭钅★: ��
 ******************************************************************************************************************************************/
 ******************************************************************************************************************************************/
 uint32_t WDT_INTStat(WDT_TypeDef *WDTx)
 uint32_t WDT_INTStat(WDT_TypeDef *WDTx)
 {
 {

+ 9 - 10
bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_wdt.h

@@ -1,19 +1,18 @@
 #ifndef __SWM320_WDT_H__
 #ifndef __SWM320_WDT_H__
 #define __SWM320_WDT_H__
 #define __SWM320_WDT_H__
 
 
-#define WDT_MODE_RESET      0
-#define WDT_MODE_INTERRUPT  1
+#define WDT_MODE_RESET 0
+#define WDT_MODE_INTERRUPT 1
 
 
-void WDT_Init(WDT_TypeDef *WDTx, uint32_t peroid, uint32_t mode);   //WDT看门狗初始化
-void WDT_Start(WDT_TypeDef *WDTx);          //启动指定WDT,开始倒计时
-void WDT_Stop(WDT_TypeDef *WDTx);           //关闭指定WDT,停止倒计时
+void WDT_Init(WDT_TypeDef *WDTx, uint32_t peroid, uint32_t mode); //WDT鐪嬮棬鐙楀垵濮嬪寲
+void WDT_Start(WDT_TypeDef *WDTx);                                //鍚�姩鎸囧畾WDT锛屽紑濮嬪€掕�鏃�
+void WDT_Stop(WDT_TypeDef *WDTx);                                 //鍏抽棴鎸囧畾WDT锛屽仠姝㈠€掕�鏃�
 
 
-void WDT_Feed(WDT_TypeDef *WDTx);           //喂狗,重新从装载值开始倒计时
+void WDT_Feed(WDT_TypeDef *WDTx); //鍠傜嫍锛岄噸鏂颁粠瑁呰浇鍊煎紑濮嬪€掕�鏃�
 
 
-int32_t WDT_GetValue(WDT_TypeDef *WDTx);    //获取指定看门狗定时器的当前倒计时值
+int32_t WDT_GetValue(WDT_TypeDef *WDTx); //鑾峰彇鎸囧畾鐪嬮棬鐙楀畾鏃跺櫒鐨勫綋鍓嶅€掕�鏃跺€�
 
 
-
-void WDT_INTClr(WDT_TypeDef *WDTx);         //中断标志清除
-uint32_t WDT_INTStat(WDT_TypeDef *WDTx);    //中断状态查询
+void WDT_INTClr(WDT_TypeDef *WDTx);      //涓�柇鏍囧織娓呴櫎
+uint32_t WDT_INTStat(WDT_TypeDef *WDTx); //涓�柇鐘舵€佹煡璇�
 
 
 #endif //__SWM320_WDT_H__
 #endif //__SWM320_WDT_H__

+ 22 - 28
bsp/swm320-lq100/README.md

@@ -31,7 +31,7 @@ SWXT-LQ100-32102 V1.1 开发板板载资源如下:
 - 常用接口:USB打印接口,TFT LCD接口,SD卡接口
 - 常用接口:USB打印接口,TFT LCD接口,SD卡接口
 - 调试接口:SWD
 - 调试接口:SWD
 
 
-更多详细信息请咨询[华芯微特技术支持][http://www.synwit.cn/support.html]
+更多详细信息请咨询[华芯微特技术支持](https://www.synwit.cn)
 
 
 ### 1.2  MCU 简介
 ### 1.2  MCU 简介
 
 
@@ -89,36 +89,30 @@ msh />
 
 
 ## 4. 驱动支持情况及计划
 ## 4. 驱动支持情况及计划
 
 
-|**板载外设**     |**支持情况**|**备注**                    |
-| ----------------- | :----------: | ----------------------- |
-| Nor Flash         | 支持          |                        |
-| SDIO TF 卡        | 暂不支持      |                        |
-| SRAM              | 支持          |      |
-| TFT-LCD           |   暂不支持    |   即将支持             |
-|**片上外设**     |**支持情况** |**备注**                  |
-| GPIO              |     支持     | PIN:1...100 |
-| UART              |     支持     | UART0 / UART1 / UART2 / UART3  |
-| SPI               |     支持     | SPI0 / SPI1        |
-| I2C               |   支持   |    I2C0 IO模拟   |
-| ADC               | 暂不支持 | 即将支持 |
-| PWM               |   支持   |  PWM0 / PWM1 /PWM2 /PWM3 其余两个后续补充|
-| IWG               |   支持   |                            |
-| TIMER             |   支持   |                       |
-| RTC               |   支持   |                             |
-| CAN               |   暂不支持   |                |
+| **片上外设**        | **支持情况**  | **备注**                              |
+| :----------------- | :----------: | :----------------------------------- |
+| GPIO               |     支持     | PA0, PA1... PP23 ---> PIN: 0, 1...100 |
+| UART               |     支持     | UART0/1/2/3                           |
+| ADC                |     支持     | ADC0/1                                |
+| TIM                |     支持     | TIM0/1/2/3/4/5                        |
+| I2C                |     支持     | 软件 I2C0/1                            |
+| PWM                |     支持     | PWM0/1/2/3/4/5                        |
+| RTC                |     支持     | RTC                                   |
+| SPI                |     支持     | SPI0/1                                |
+| WDT                |     支持     | WDT                                   |
+| CRC                |     支持     | CRC                                   |
+| SDIO               |     支持     | SDIO                                  |
+| SRAM               |     支持     | SRAM                                  |
+| NOR FLASH          |     支持     | NOR FLASH                             |
+| CAN                |    暂不支持   |                                       |
 
 
 ## 5. 联系人信息
 ## 5. 联系人信息
 
 
-维护人:
+- [yanmowudi](https://github.com/yanmowudi)
+- [邮箱](lik@synwit.cn)
 
 
--[Zohar_Lee](https://github.com/zohar123) email: lizhh@synwit.cn
+## 参考资料
 
 
-## 6. 参考
+* [RT-Thread 文档中心](https://www.rt-thread.org/document/site/)
 
 
-- 芯片[SWM320系列数据手册][http://www.synwit.cn/Public/Uploads/2018-11-05/5bdff49b396d1.pdf]
-
-- [ SWM320_LQFP100原理图](http://www.synwit.cn/Public/Uploads/2018-11-01/5bdab8ad2e5b9.pdf)
-
-- [ SWM320_LQFP64原理图](http://www.synwit.cn/Public/Uploads/2018-11-05/5bdfea74d5712.pdf)
-
-- [ keil pack及其他资料](http://www.synwit.cn/support-1/2.html)
+* [SWM320数据手册](https://www.synwit.cn/col.jsp?id=155)

+ 4 - 1
bsp/swm320-lq100/SConscript

@@ -1,11 +1,14 @@
+# for module compiling
+import os
 from building import *
 from building import *
 
 
 cwd = GetCurrentDir()
 cwd = GetCurrentDir()
-
 objs = []
 objs = []
 list = os.listdir(cwd)
 list = os.listdir(cwd)
+
 for d in list:
 for d in list:
     path = os.path.join(cwd, d)
     path = os.path.join(cwd, d)
     if os.path.isfile(os.path.join(path, 'SConscript')):
     if os.path.isfile(os.path.join(path, 'SConscript')):
         objs = objs + SConscript(os.path.join(d, 'SConscript'))
         objs = objs + SConscript(os.path.join(d, 'SConscript'))
+
 Return('objs')
 Return('objs')

+ 7 - 6
bsp/swm320-lq100/SConstruct

@@ -8,6 +8,7 @@ else:
     RTT_ROOT = os.path.normpath(os.getcwd() + '/../..')
     RTT_ROOT = os.path.normpath(os.getcwd() + '/../..')
 
 
 sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
 sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+
 try:
 try:
     from building import *
     from building import *
 except:
 except:
@@ -17,18 +18,18 @@ except:
 
 
 TARGET = 'rtthread.' + rtconfig.TARGET_EXT
 TARGET = 'rtthread.' + rtconfig.TARGET_EXT
 
 
-DefaultEnvironment(tools=[])
 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,
+    CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
+    AR = rtconfig.AR, ARFLAGS = '-rc',
+    LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
 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(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
     env.Replace(ARFLAGS = [''])
     env.Replace(ARFLAGS = [''])
-    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map')
 
 
 Export('RTT_ROOT')
 Export('RTT_ROOT')
 Export('rtconfig')
 Export('rtconfig')

+ 548 - 8
bsp/swm320-lq100/applications/main.c

@@ -1,31 +1,571 @@
 /*
 /*
- * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
+ * Copyright (c) 2006-2021, RT-Thread Development Team
  *
  *
  * SPDX-License-Identifier: Apache-2.0
  * SPDX-License-Identifier: Apache-2.0
  *
  *
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
- * 2018-12-10     Zohar_Lee    first version
  */
  */
 
 
 #include <rtthread.h>
 #include <rtthread.h>
 #include <rtdevice.h>
 #include <rtdevice.h>
-/* defined the LED pin: PA12 */
-#define LED_PIN    100
+
+#define LED_PIN 11
 
 
 int main(void)
 int main(void)
 {
 {
     int count = 1;
     int count = 1;
-    /* set LED4 pin mode to output */
-    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
 
 
+    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
     while (count++)
     while (count++)
     {
     {
         rt_pin_write(LED_PIN, PIN_HIGH);
         rt_pin_write(LED_PIN, PIN_HIGH);
-        rt_thread_mdelay(500);
+        rt_thread_mdelay(1000);
         rt_pin_write(LED_PIN, PIN_LOW);
         rt_pin_write(LED_PIN, PIN_LOW);
-        rt_thread_mdelay(500);
+        rt_thread_mdelay(1000);
+    }
+
+    return RT_EOK;
+}
+
+// #ifdef RT_USING_PIN
+// #define KEY1_PIN 31
+// void key1_cb(void *args)
+// {
+//     rt_kprintf("key1 irq!\n");
+// }
+// static int pin_sample(int argc, char *argv[])
+// {
+//     rt_pin_mode(KEY1_PIN, PIN_IRQ_MODE_FALLING);
+//     rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, key1_cb, RT_NULL);
+//     rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE);
+
+//     return RT_EOK;
+// }
+// MSH_CMD_EXPORT(pin_sample, pin sample);
+// #endif
+
+#ifdef RT_USING_ADC
+#define ADC_DEV_NAME "adc1"
+#define ADC_DEV_CHANNEL 0
+#define REFER_VOLTAGE 330
+#define CONVERT_BITS (1 << 12)
+
+static int adc_vol_sample(int argc, char *argv[])
+{
+    rt_adc_device_t adc_dev;
+    rt_uint32_t value, vol;
+    rt_err_t ret = RT_EOK;
+
+    adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
+    if (adc_dev == RT_NULL)
+    {
+        rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);
+        return RT_ERROR;
     }
     }
 
 
+    ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
+
+    value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
+    rt_kprintf("the value is :%d,", value);
+
+    vol = value * REFER_VOLTAGE / CONVERT_BITS;
+    rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
+
+    ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
+
+    return ret;
+}
+MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);
+#endif
+
+#ifdef RT_USING_HWTIMER
+#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 fucntion!\n");
+    rt_kprintf("tick is :%d !\n", rt_tick_get());
+
+    return 0;
+}
+
+static int hwtimer_sample(int argc, char *argv[])
+{
+    rt_err_t ret = RT_EOK;
+    rt_hwtimerval_t timeout_s;
+    rt_device_t hw_dev = RT_NULL;
+    rt_hwtimer_mode_t mode;
+
+    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);
+
+    mode = HWTIMER_MODE_PERIOD;
+    //mode = HWTIMER_MODE_ONESHOT;
+    ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
+    if (ret != RT_EOK)
+    {
+        rt_kprintf("set mode failed! ret is :%d\n", ret);
+        return ret;
+    }
+
+    timeout_s.sec = 2;
+    timeout_s.usec = 0;
+
+    if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
+    {
+        rt_kprintf("set timeout value failed\n");
+        return RT_ERROR;
+    }
+
+    rt_thread_mdelay(3500);
+
+    rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
+    rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec);
+
+    return ret;
+}
+MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample);
+#endif
+
+#ifdef RT_USING_PWM
+#define PWM_DEV_NAME "pwm0" /* PWM设备名称 */
+#define PWM_DEV_CHANNEL 0   /* PWM通道 */
+
+struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
+
+static int pwm_sample(int argc, char *argv[])
+{
+    rt_uint32_t period, pulse;
+
+    period = 500000; /* 周期为0.5ms,单位为纳秒ns */
+    pulse = 250000;  /* 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;
+    }
+
+    rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
+    rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
+    return RT_EOK;
+}
+MSH_CMD_EXPORT(pwm_sample, pwm sample);
+#endif
+
+#ifdef RT_USING_RTC
+#include <time.h>
+static int rtc_sample(int argc, char *argv[])
+{
+    rt_err_t ret = RT_EOK;
+    time_t now;
+
+    ret = set_date(2020, 2, 28);
+    if (ret != RT_EOK)
+    {
+        rt_kprintf("set RTC date failed\n");
+        return ret;
+    }
+
+    ret = set_time(23, 59, 55);
+    if (ret != RT_EOK)
+    {
+        rt_kprintf("set RTC time failed\n");
+        return ret;
+    }
+
+    //rt_thread_mdelay(3000);
+    now = time(RT_NULL);
+    rt_kprintf("%s\n", ctime(&now));
+
+    return ret;
+}
+MSH_CMD_EXPORT(rtc_sample, rtc sample);
+#endif
+
+#ifdef RT_USING_WDT
+#define WDT_DEVICE_NAME "wdt"
+
+static rt_device_t wdg_dev;
+
+static void idle_hook(void)
+{
+    rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL);
+    rt_kprintf("feed the dog!\n ");
+}
+
+static int wdt_sample(int argc, char *argv[])
+{
+    rt_err_t ret = RT_EOK;
+    rt_uint32_t timeout = 1;
+    char device_name[RT_NAME_MAX];
+
+    if (argc == 2)
+    {
+        rt_strncpy(device_name, argv[1], RT_NAME_MAX);
+    }
+    else
+    {
+        rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);
+    }
+    wdg_dev = rt_device_find(device_name);
+    if (!wdg_dev)
+    {
+        rt_kprintf("find %s failed!\n", device_name);
+        return RT_ERROR;
+    }
+    ret = rt_device_init(wdg_dev);
+    if (ret != RT_EOK)
+    {
+        rt_kprintf("initialize %s failed!\n", device_name);
+        return RT_ERROR;
+    }
+    ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
+    if (ret != RT_EOK)
+    {
+        rt_kprintf("set %s timeout failed!\n", device_name);
+        return RT_ERROR;
+    }
+    ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
+    if (ret != RT_EOK)
+    {
+        rt_kprintf("start %s failed!\n", device_name);
+        return -RT_ERROR;
+    }
+    // rt_thread_idle_sethook(idle_hook);
+
+    return ret;
+}
+MSH_CMD_EXPORT(wdt_sample, wdt sample);
+#endif
+
+#ifdef RT_USING_SPI
+#define W25Q_SPI_DEVICE_NAME "spi00"
+#define W25Q_FLASH_NAME "norflash0"
+
+#include "drv_spi.h"
+#include "spi_flash_sfud.h"
+#include "dfs_posix.h"
+
+static int rt_hw_spi_flash_init(void)
+{
+    rt_hw_spi_device_attach("spi0", "spi00", GPIOP, PIN22);
+
+    if (RT_NULL == rt_sfud_flash_probe(W25Q_FLASH_NAME, W25Q_SPI_DEVICE_NAME))
+    {
+        return -RT_ERROR;
+    };
+
     return RT_EOK;
     return RT_EOK;
 }
 }
+INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
+
+static void spi_w25q_sample(int argc, char *argv[])
+{
+    struct rt_spi_device *spi_dev_w25q;
+    char name[RT_NAME_MAX];
+    rt_uint8_t w25x_read_id = 0x90;
+    rt_uint8_t id[5] = {0};
+
+    if (argc == 2)
+    {
+        rt_strncpy(name, argv[1], RT_NAME_MAX);
+    }
+    else
+    {
+        rt_strncpy(name, W25Q_SPI_DEVICE_NAME, RT_NAME_MAX);
+    }
+
+    /* 查找 spi 设备获取设备句柄 */
+    spi_dev_w25q = (struct rt_spi_device *)rt_device_find(name);
+    struct rt_spi_configuration cfg;
+    cfg.data_width = 8;
+    cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;
+    cfg.max_hz = 30 * 1000 * 1000; /* 20M */
+
+    rt_spi_configure(spi_dev_w25q, &cfg);
+    if (!spi_dev_w25q)
+    {
+        rt_kprintf("spi sample run failed! can't find %s device!\n", name);
+    }
+    else
+    {
+        /* 方式1:使用 rt_spi_send_then_recv()发送命令读取ID */
+        rt_spi_send_then_recv(spi_dev_w25q, &w25x_read_id, 1, id, 5);
+        rt_kprintf("use rt_spi_send_then_recv() read w25q ID is:%x%x\n", id[3], id[4]);
+
+        /* 方式2:使用 rt_spi_transfer_message()发送命令读取ID */
+        struct rt_spi_message msg1, msg2;
+
+        msg1.send_buf = &w25x_read_id;
+        msg1.recv_buf = RT_NULL;
+        msg1.length = 1;
+        msg1.cs_take = 1;
+        msg1.cs_release = 0;
+        msg1.next = &msg2;
+
+        msg2.send_buf = RT_NULL;
+        msg2.recv_buf = id;
+        msg2.length = 5;
+        msg2.cs_take = 0;
+        msg2.cs_release = 1;
+        msg2.next = RT_NULL;
+
+        rt_spi_transfer_message(spi_dev_w25q, &msg1);
+        rt_kprintf("use rt_spi_transfer_message() read w25q ID is:%x%x\n", id[3], id[4]);
+    }
+}
+static void spi_flash_elmfat_sample(void)
+{
+    int fd, size;
+    struct statfs elm_stat;
+    char str[] = "elmfat mount to W25Q flash.\r\n", buf[80];
+
+    if (dfs_mkfs("elm", W25Q_FLASH_NAME) == 0)
+        rt_kprintf("make elmfat filesystem success.\n");
+
+    if (dfs_mount(W25Q_FLASH_NAME, "/", "elm", 0, 0) == 0)
+        rt_kprintf("elmfat filesystem mount success.\n");
+
+    if (statfs("/", &elm_stat) == 0)
+        rt_kprintf("elmfat filesystem block size: %d, total blocks: %d, free blocks: %d.\n",
+                   elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree);
+
+    if (mkdir("/user", 0x777) == 0)
+        rt_kprintf("make a directory: '/user'.\n");
+
+    rt_kprintf("Write string '%s' to /user/test.txt.\n", str);
+
+    fd = open("/user/test.txt", O_WRONLY | O_CREAT);
+    if (fd >= 0)
+    {
+        if (write(fd, str, sizeof(str)) == sizeof(str))
+            rt_kprintf("Write data done.\n");
+
+        close(fd);
+    }
+
+    fd = open("/user/test.txt", O_RDONLY);
+    if (fd >= 0)
+    {
+        size = read(fd, buf, sizeof(buf));
+
+        close(fd);
+
+        if (size == sizeof(str))
+            rt_kprintf("Read data from file test.txt(size: %d): %s \n", size, buf);
+    }
+}
+MSH_CMD_EXPORT(spi_flash_elmfat_sample, spi flash elmfat sample);
+MSH_CMD_EXPORT(spi_w25q_sample, spi w25q sample);
+#endif
+
+//#ifdef RT_USING_SPI
+//#define SD_SPI_DEVICE_NAME "spi10"
+//#define SDCARD_NAME "sd0"
+
+//#include "drv_spi.h"
+//#include "dfs_posix.h"
+//#include "spi_msd.h"
+
+//static int rt_hw_spi1_tfcard(void)
+//{
+//    rt_hw_spi_device_attach("spi1", SD_SPI_DEVICE_NAME, GPIOB, PIN6);
+//    return msd_init(SDCARD_NAME, SD_SPI_DEVICE_NAME);
+//}
+//INIT_DEVICE_EXPORT(rt_hw_spi1_tfcard);
+
+//static void elmfat_sample(void)
+//{
+//    int fd, size;
+//    struct statfs elm_stat;
+//    char str[] = "elmfat mount to sdcard.", buf[80];
+
+//    if (dfs_mkfs("elm", SDCARD_NAME) == 0)
+//        rt_kprintf("make elmfat filesystem success.\n");
+
+//    if (dfs_mount(SDCARD_NAME, "/", "elm", 0, 0) == 0)
+//        rt_kprintf("elmfat filesystem mount success.\n");
+
+//    if (statfs("/", &elm_stat) == 0)
+//        rt_kprintf("elmfat filesystem block size: %d, total blocks: %d, free blocks: %d.\n",
+//                   elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree);
+
+//    if (mkdir("/user", 0x777) == 0)
+//        rt_kprintf("make a directory: '/user'.\n");
+
+//    rt_kprintf("Write string '%s' to /user/test.txt.\n", str);
+
+//    fd = open("/user/test.txt", O_WRONLY | O_CREAT);
+//    if (fd >= 0)
+//    {
+//        if (write(fd, str, sizeof(str)) == sizeof(str))
+//            rt_kprintf("Write data done.\n");
+
+//        close(fd);
+//    }
+
+//    fd = open("/user/test.txt", O_RDONLY);
+//    if (fd >= 0)
+//    {
+//        size = read(fd, buf, sizeof(buf));
+
+//        close(fd);
+
+//        if (size == sizeof(str))
+//            rt_kprintf("Read data from file test.txt(size: %d): %s \n", size, buf);
+//    }
+//}
+//MSH_CMD_EXPORT(elmfat_sample, elmfat sample);
+//#endif
+
+#ifdef RT_USING_SDIO
+#define SDCARD_NAME "sd0"
+
+#include "dfs_posix.h"
+
+static void sdio_elmfat_sample(void)
+{
+    int fd, size;
+    struct statfs elm_stat;
+    char str[] = "elmfat mount to sdcard.\n", buf[80];
+
+    if (dfs_mkfs("elm", SDCARD_NAME) == 0)
+        rt_kprintf("make elmfat filesystem success.\n");
+
+    if (dfs_mount(SDCARD_NAME, "/", "elm", 0, 0) == 0)
+        rt_kprintf("elmfat filesystem mount success.\n");
+
+    if (statfs("/", &elm_stat) == 0)
+        rt_kprintf("elmfat filesystem block size: %d, total blocks: %d, free blocks: %d.\n",
+                   elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree);
+
+    if (mkdir("/user", 0x777) == 0)
+        rt_kprintf("make a directory: '/user'.\n");
+
+    rt_kprintf("Write string '%s' to /user/test.txt.\n", str);
+
+    fd = open("/user/test.txt", O_WRONLY | O_CREAT);
+    if (fd >= 0)
+    {
+        if (write(fd, str, sizeof(str)) == sizeof(str))
+            rt_kprintf("Write data done.\n");
+
+        close(fd);
+    }
+
+    fd = open("/user/test.txt", O_RDONLY);
+    if (fd >= 0)
+    {
+        size = read(fd, buf, sizeof(buf));
+
+        close(fd);
+
+        if (size == sizeof(str))
+            rt_kprintf("Read data from file test.txt(size: %d): %s \n", size, buf);
+    }
+}
+MSH_CMD_EXPORT(sdio_elmfat_sample, sdio elmfat sample);
+#endif
+
+#ifdef RT_USING_HWCRYPTO
+static void crypto_sample(void)
+{
+    rt_uint8_t temp[] = {0, 1, 2, 3, 4, 5, 6, 7};
+    struct rt_hwcrypto_ctx *ctx;
+    rt_uint32_t result = 0;
+    struct hwcrypto_crc_cfg cfg =
+        {
+            .last_val = 0x0,
+            .poly = 0x04C11DB7,
+            .width = 8,
+            .xorout = 0x00000000,
+            .flags = 0,
+        };
+
+    ctx = rt_hwcrypto_crc_create(rt_hwcrypto_dev_default(), HWCRYPTO_CRC_CRC32);
+    rt_hwcrypto_crc_cfg(ctx, &cfg);
+    result = rt_hwcrypto_crc_update(ctx, temp, sizeof(temp));
+    rt_kprintf("result: 0x%08x \n", result);
+    rt_hwcrypto_crc_destroy(ctx);
+}
+MSH_CMD_EXPORT(crypto_sample, crypto sample);
+#endif
+
+#ifdef BSP_USING_NOR_FLASH
+#define NORFLASH_DEV_NAME "nor"
+static int norflash_sample(int argc, char *argv[])
+{
+    rt_err_t ret = RT_EOK;
+    rt_device_t hw_dev = RT_NULL;
+
+    hw_dev = rt_device_find(NORFLASH_DEV_NAME);
+    if (hw_dev == RT_NULL)
+    {
+        rt_kprintf("norflash sample run failed! can't find %s device!\n", NORFLASH_DEV_NAME);
+        return RT_ERROR;
+    }
+    else
+    {
+        rt_kprintf("norflash sample run success! find %s device!\n", NORFLASH_DEV_NAME);
+    }
+
+    ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
+    if (ret != RT_EOK)
+    {
+        rt_kprintf("open %s device failed!\n", NORFLASH_DEV_NAME);
+        return ret;
+    }
+    else
+    {
+        rt_kprintf("open %s device success!\n", NORFLASH_DEV_NAME);
+    }
+
+    struct rt_mtd_nor_device *hw_nor;
+    hw_nor = RT_MTD_NOR_DEVICE(hw_dev);
+    long id = hw_nor->ops->read_id(hw_nor);
+    rt_kprintf("id = %08x!\n", id);
+    // rt_device_set_rx_indicate(hw_dev, timeout_cb);
+
+    // mode = HWTIMER_MODE_PERIOD;
+    // //mode = HWTIMER_MODE_ONESHOT;
+    // ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
+    // if (ret != RT_EOK)
+    // {
+    //     rt_kprintf("set mode failed! ret is :%d\n", ret);
+    //     return ret;
+    // }
+
+    // timeout_s.sec = 2;
+    // timeout_s.usec = 0;
+
+    // if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
+    // {
+    //     rt_kprintf("set timeout value failed\n");
+    //     return RT_ERROR;
+    // }
+
+    // rt_thread_mdelay(3500);
+
+    // rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
+    // rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec);
+
+    return ret;
+}
+MSH_CMD_EXPORT(norflash_sample, norflash sample);
+#endif

+ 275 - 138
bsp/swm320-lq100/drivers/Kconfig

@@ -1,169 +1,306 @@
 menu "Hardware Drivers Config"
 menu "Hardware Drivers Config"
 
 
-    menu "On-chip Peripheral Drivers"
-        config BSP_USING_GPIO
-            bool "Enable GPIO"
-            select RT_USING_PIN
-            default y
-            
-        config BSP_USING_WDT
-            bool "Enable Watch Dog"
-            select RT_USING_WDT
-            default n
+config SOC_SWM320
+    bool
+    select RT_USING_COMPONENTS_INIT
+    select RT_USING_USER_MAIN
+    default y
 
 
-        menu "UART Drivers"
-            config BSP_USING_UART0
-                bool "Enable UART0 PA2/3(R/T)"
-                select RT_USING_SERIAL
-                default y    
+menu "On-chip Peripheral Drivers"
 
 
+    menuconfig BSP_USING_UART
+        bool "Enable UART"
+        default y
+        select RT_USING_SERIAL
+        if BSP_USING_UART
+            config BSP_USING_UART0
+                bool "Enable UART0 (A2/RX,A3/TX)"
+                default y
             config BSP_USING_UART1
             config BSP_USING_UART1
-                bool "Enable UART1 PC2/3(R/T)"
-                select RT_USING_SERIAL
+                bool "Enable UART1 (C2/RX,C3/TX)"
                 default n
                 default n
-        
             config BSP_USING_UART2
             config BSP_USING_UART2
-                bool "Enable UART2 PC4/5(R/T)"
-                select RT_USING_SERIAL
+                bool "Enable UART2 (C4/RX,C5/TX)"
                 default n
                 default n
-
             config BSP_USING_UART3
             config BSP_USING_UART3
-                bool "Enable UART3 PC6/7(R/T)"
-                select RT_USING_SERIAL
-                default n 
-        endmenu
+                bool "Enable UART3 (C6/RX,C7/TX)"
+                default n
+        endif
 
 
-        menu "SPI Drivers"
-            config BSP_USING_SPI0
-                bool "Enable SPI0 BUS PC4/5/6(C/O/I)"
-                select RT_USING_SPI
-                select RT_USING_PIN
-                default n 
+    config BSP_USING_GPIO
+        bool "Enable GPIO"
+        select RT_USING_PIN
+        default y
 
 
-            config BSP_USING_SPI1
-                bool "Enable SPI1 BUS PM5/C2/C3(C/O/I)"
-                select RT_USING_SPI
-                select RT_USING_PIN
+    menuconfig BSP_USING_ADC
+        bool "Enable ADC"
+        default n
+        select RT_USING_ADC
+        if BSP_USING_ADC
+            config BSP_USING_ADC0
+                bool "Enable ADC0"
                 default n
                 default n
-        endmenu
-
-        menu "I2C Drivers"
-            config BSP_USING_I2C
-                bool "Enable I2C BUS"
-                select RT_USING_I2C
-                select RT_USING_PIN
-                select RT_USING_I2C_BITOPS
+                if BSP_USING_ADC0
+                    config BSP_USING_ADC0_CHN0
+                        bool "Enable ADC0_CHN0"
+                        default n
+                    config BSP_USING_ADC0_CHN1
+                        bool "Enable ADC0_CHN1"
+                        default n
+                    config BSP_USING_ADC0_CHN2
+                        bool "Enable ADC0_CHN2"
+                        default n
+                    config BSP_USING_ADC0_CHN3
+                        bool "Enable ADC0_CHN3"
+                        default n
+                    config BSP_USING_ADC0_CHN4
+                        bool "Enable ADC0_CHN4(A12)"
+                        default n
+                    config BSP_USING_ADC0_CHN5
+                        bool "Enable ADC0_CHN5(A11)"
+                        default n
+                    config BSP_USING_ADC0_CHN6
+                        bool "Enable ADC0_CHN6(A10)"
+                        default n
+                    config BSP_USING_ADC0_CHN7
+                        bool "Enable ADC0_CHN7(A9)"
+                        default n
+                endif
+            config BSP_USING_ADC1
+                bool "Enable ADC1"
                 default n
                 default n
+                if BSP_USING_ADC1
+                    config BSP_USING_ADC1_CHN0
+                        bool "Enable ADC1_CHN0(C7)"
+                        default n
+                    config BSP_USING_ADC1_CHN1
+                        bool "Enable ADC1_CHN1(C6)"
+                        default n
+                    config BSP_USING_ADC1_CHN2
+                        bool "Enable ADC1_CHN2(C5)"
+                        default n
+                    config BSP_USING_ADC1_CHN3
+                        bool "Enable ADC1_CHN3(C4)"
+                        default n
+                    config BSP_USING_ADC1_CHN4
+                        bool "Enable ADC1_CHN4(N0)"
+                        default n
+                    config BSP_USING_ADC1_CHN5
+                        bool "Enable ADC1_CHN5(N1)"
+                        default n
+                    config BSP_USING_ADC1_CHN6
+                        bool "Enable ADC1_CHN6(N2)"
+                        default n
+                    config BSP_USING_ADC1_CHN7
+                        bool "Enable ADC1_CHN7"
+                        default n
+                endif
+        endif
 
 
-                if BSP_USING_I2C
-
-                    config BSP_I2C_SCL  
-                        int "I2C SCL Pin index"
-                        default 98
+    menuconfig BSP_USING_TIM
+        bool "Enable HWTIMER"
+        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_TIM3
+                bool "Enable TIM3"
+                default n
 
 
-                    config BSP_I2C_SDA
-                        int "I2C SDA Pin index"
-                        default 99
+            config BSP_USING_TIM4
+                bool "Enable TIM4"
+                default n
+            config BSP_USING_TIM5
+                bool "Enable TIM5"
+                default n
+        endif
 
 
-                    config BSP_I2C_BUS_NAME
-                        string "i2c bus name"
-                        default "i2c0"
+    menuconfig BSP_USING_I2C
+        bool "Enable I2C BUS (software simulation)"
+        default n
+        select RT_USING_I2C
+        select RT_USING_I2C_BITOPS
+        select RT_USING_PIN
+        if BSP_USING_I2C
+            config BSP_USING_I2C0
+                bool "Enable I2C0"
+                default n
+                if BSP_USING_I2C0
+                    comment "Notice: PC2 --> 28; PC3 --> 29"
+                    config BSP_I2C0_SCL_PIN
+                        int "I2C0 scl pin number"
+                        range 0 99
+                        default 28
+                    config BSP_I2C0_SDA_PIN
+                        int "I2C0 sda pin number"
+                        range 0 99
+                        default 29
                 endif
                 endif
-        endmenu
-
-        menu "PWM Drivers"
-            config BSP_USING_PWM0
-                bool "Using PWM0 PA4/10(A/B)"
-                select RT_USING_PWM
-                default n 
-
-            config BSP_USING_PWM1
-                bool "Using PWM1 PA5/9(A/B)"
-                select RT_USING_PWM
-                default n  
-
-            config BSP_USING_PWM2
-                bool "Using PWM2 PP0/2(A/B)"
-                select RT_USING_PWM
-                default n  
-
-            config BSP_USING_PWM3
-                bool "Using PWM3 PP1/3(A/B)"
-                select RT_USING_PWM
-                default n  
-        endmenu
-
-        menu "RTC Drivers"
-            config BSP_USING_RTC
-                bool "Using RTC"
-                select RT_USING_RTC
-                default n 
-        endmenu
-
-        menu "HWtimer Drivers"
-            config BSP_USING_HWTIMER0
-                bool "Using timer0"
-                select RT_USING_HWTIMER 
+            config BSP_USING_I2C1
+                bool "Enable I2C1"
                 default n
                 default n
+                if BSP_USING_I2C1
+                    comment "Notice: PC6 --> 32; PC7 --> 33"
+                    config BSP_I2C1_SCL_PIN
+                        int "I2C1 scl pin number"
+                        range 0 99
+                        default 32
+                    config BSP_I2C1_SDA_PIN
+                        int "I2C1 sda pin number"
+                        range 0 99
+                        default 33
+                endif
+        endif
 
 
-            config BSP_USING_HWTIMER1
-                bool "Using timer1"
-                select RT_USING_HWTIMER 
-                default n
+    menuconfig BSP_USING_PWM
+        bool "Enable PWM"
+        default n
+        select RT_USING_PWM
+        if BSP_USING_PWM
+        config BSP_USING_PWM0
+            bool "Enable PWM0"
+            default n
+            if BSP_USING_PWM0
+                config BSP_USING_PWM0A
+                    bool "Enable PWM0A (C2)"
+                    default n
+                config BSP_USING_PWM0B
+                    bool "Enable PWM0B (C4)"
+                    default n
+            endif
+        config BSP_USING_PWM1
+            bool "Enable PWM1"
+            default n
+            if BSP_USING_PWM1
+                config BSP_USING_PWM1A
+                    bool "Enable PWM1A (C3)"
+                    default n
+                config BSP_USING_PWM1B
+                    bool "Enable PWM1B (C5)"
+                    default n
+            endif
+        config BSP_USING_PWM2
+            bool "Enable PWM2"
+            default n
+            if BSP_USING_PWM2
+                config BSP_USING_PWM2A
+                    bool "Enable PWM2A (N4)"
+                    default n
+                config BSP_USING_PWM2B
+                    bool "Enable PWM2B (N6)"
+                    default n
+            endif
+        config BSP_USING_PWM3
+            bool "Enable PWM3"
+            default n
+            if BSP_USING_PWM3
+                config BSP_USING_PWM3A
+                    bool "Enable PWM3A (N3)"
+                    default n
+                config BSP_USING_PWM3B
+                    bool "Enable PWM3B (N5)"
+                    default n
+            endif
+        config BSP_USING_PWM4
+            bool "Enable PWM4"
+            default n
+            if BSP_USING_PWM4
+                config BSP_USING_PWM4A
+                    bool "Enable PWM4A (N8)"
+                    default n
+                config BSP_USING_PWM4B
+                    bool "Enable PWM4B (N10)"
+                    default n
+            endif
+        config BSP_USING_PWM5
+            bool "Enable PWM5"
+            default n
+            if BSP_USING_PWM5
+                config BSP_USING_PWM5A
+                    bool "Enable PWM5A (N7)"
+                    default n
+                config BSP_USING_PWM5B
+                    bool "Enable PWM5B (N9)"
+                    default n
+            endif
+        endif
 
 
-            config BSP_USING_HWTIMER2
-                bool "Using timer2"
-                select RT_USING_HWTIMER 
-                default n
+    config BSP_USING_RTC
+        bool "Enable RTC"
+        select RT_USING_RTC
+        select RT_USING_LIBC
+        default n
 
 
-            config BSP_USING_HWTIMER3
-                bool "Using timer3"
-                select RT_USING_HWTIMER 
+    menuconfig BSP_USING_SPI
+        bool "Enable SPI BUS"
+        default n
+        select RT_USING_SPI
+        if BSP_USING_SPI
+            config BSP_USING_SPI0
+                bool "Enable SPI0 BUS(CS/P22,MISO/P19,MOSI/P18,CLK/P23)"
                 default n
                 default n
 
 
-            config BSP_USING_HWTIMER4
-                bool "Using timer4"
-                select RT_USING_HWTIMER 
+            config BSP_USING_SPI1
+                bool "Enable SPI1 BUS(CS/B6,MISO/B3,MOSI/B2,CLK/B1)"
                 default n
                 default n
+        endif
 
 
-            config BSP_USING_HWTIMER5
-                bool "Using timer5"
-                select RT_USING_HWTIMER 
-                default n
-        endmenu
-    endmenu
-    
-    menu "Onboard Peripheral Drivers"
-        menuconfig BSP_USING_EXT_SRAM
-            bool "Enable external sram"
-            select RT_USING_MEMHEAP
-            select RT_USING_MEMHEAP_AS_HEAP
-            default n
+    config BSP_USING_WDT
+        bool "Enable Watchdog Timer"
+        select RT_USING_WDT
+        default n
 
 
-            if BSP_USING_EXT_SRAM
-                config BSP_EXT_SRAM_SIZE
-                hex "external sram size"
-                default 0x100000
-            endif
+    config BSP_USING_CRC
+        bool "Enable CRC (CRC-32 0x04C11DB7 Polynomial)"
+        select RT_USING_HWCRYPTO
+        select RT_HWCRYPTO_USING_CRC
+        default n
+endmenu
+
+menu "Onboard Peripheral Drivers"
+    config BSP_USING_SDIO
+        bool "Enable SDCARD (sdio)"
+        select RT_USING_SDIO
+        select RT_USING_DFS
+        select RT_USING_DFS_ELMFAT
+        default n
+
+    menuconfig BSP_USING_EXT_SRAM
+        bool "Enable external sram"
+        select RT_USING_MEMHEAP
+        select RT_USING_MEMHEAP_AS_HEAP
+        default n
+        if BSP_USING_EXT_SRAM
+            config BSP_EXT_SRAM_SIZE
+            hex "external sram size"
+            default 0x100000
+        endif
 
 
         menuconfig BSP_USING_NOR_FLASH
         menuconfig BSP_USING_NOR_FLASH
-            bool "Enable mtd nor flash"
-            select RT_USING_MTD_NOR
-            select PKG_USING_FTL_SRC
-            default n
+        bool "Enable mtd nor flash"
+        select RT_USING_MTD_NOR
+        select PKG_USING_FTL_SRC
+        default n
+        if BSP_USING_NOR_FLASH
+            config BSP_NOR_FLASH_SIZE
+                hex "mtd nor flash size"
+                default 0x1000000
+            config BSP_NOR_FLASH_SECTOR_SIZE
+                hex "mtd nor flsah sector"
+                default 0x10000
+        endif
+endmenu
 
 
-            if BSP_USING_NOR_FLASH
-                config BSP_NOR_FLASH_SIZE
-                    hex "mtd nor flash size"
-                    default 0x1000000
-                config BSP_NOR_FLASH_SECTOR_SIZE
-                    hex "mtd nor flsah sector"
-                    default 0x10000
-            endif
-    endmenu
-    
-    menu "Offboard Peripheral Drivers"
+menu "Offboard Peripheral Drivers"
+
+endmenu
 
 
-    endmenu
-    
 endmenu
 endmenu

+ 31 - 35
bsp/swm320-lq100/drivers/SConscript

@@ -1,55 +1,51 @@
-# RT-Thread building script for component
-
 from building import *
 from building import *
 
 
-cwd = GetCurrentDir()
+cwd     = GetCurrentDir()
 
 
-# add the general drivers.
-src = Split("""
-board.c
-""")
+CPPPATH = [cwd]
 
 
-# add gpio driver code
-if  GetDepend(['BSP_USING_GPIO']):
-    src += ['drv_gpio.c']
+src     = Split('''
+                board.c
+                ''')
 
 
-# add serial driver code
-if  GetDepend('BSP_USING_UART0') or GetDepend('BSP_USING_UART1') or GetDepend('BSP_USING_UART2') or GetDepend('BSP_USING_UART3'):
+if GetDepend(['RT_USING_SERIAL']):
     src += ['drv_uart.c']
     src += ['drv_uart.c']
 
 
-# add spi driver code
-if  GetDepend('BSP_USING_SPI0') or GetDepend('BSP_USING_SPI1'):
-    src += ['drv_spi.c']
+if GetDepend(['RT_USING_PIN']):
+    src += ['drv_gpio.c']
 
 
-# add i2c driver code
-if  GetDepend(['BSP_USING_I2C']):
-    src += ['drv_i2c.c']
+if GetDepend(['RT_USING_ADC']):
+    src += ['drv_adc.c']
 
 
-# add sram driver code
-if  GetDepend(['BSP_USING_EXT_SRAM']):
-    src += ['drv_sram.c']
+if GetDepend(['RT_USING_HWTIMER']):
+    src += ['drv_hwtimer.c']
 
 
-# add nor flash driver code
-if  GetDepend(['BSP_USING_NOR_FLASH']):
-    src += ['drv_nor_flash.c']
+if GetDepend(['RT_USING_I2C']):
+    src += ['drv_soft_i2c.c']
 
 
-# add pwm driver code
-if  GetDepend('BSP_USING_PWM0') or GetDepend('BSP_USING_PWM1') or GetDepend('BSP_USING_PWM2') or GetDepend('BSP_USING_PWM3'):
+if GetDepend(['RT_USING_PWM']):
     src += ['drv_pwm.c']
     src += ['drv_pwm.c']
 
 
-# add rtc driver code
-if GetDepend(['BSP_USING_RTC']):
+if GetDepend(['RT_USING_RTC']):
     src += ['drv_rtc.c']
     src += ['drv_rtc.c']
 
 
-# add hwtimer driver code
-if GetDepend(['BSP_USING_WDT']):
-    src += ['drv_iwg.c']
+if GetDepend(['RT_USING_SPI']):
+    src += ['drv_spi.c']
 
 
-# add hwtimer driver code
-if  GetDepend('BSP_USING_HWTIMER0') or GetDepend('BSP_USING_HWTIMER1') or  GetDepend('BSP_USING_HWTIMER2') or GetDepend('BSP_USING_HWTIMER3') or GetDepend('BSP_USING_HWTIMER4') or GetDepend('BSP_USING_HWTIMER5'):
-    src += ['drv_hwtimer.c']
+if GetDepend(['RT_USING_WDT']):
+    src += ['drv_wdt.c']
 
 
-CPPPATH = [cwd]
+if GetDepend(['RT_USING_SDIO']):
+    src += ['drv_sdio.c']
+
+if GetDepend(['RT_USING_HWCRYPTO']):
+    src += ['drv_crypto.c']
+
+if GetDepend(['BSP_USING_EXT_SRAM']):
+    src += ['drv_sram.c']
+
+if  GetDepend(['BSP_USING_NOR_FLASH']):
+    src += ['drv_nor_flash.c']
 
 
 group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
 group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
 
 

+ 40 - 14
bsp/swm320-lq100/drivers/board.c

@@ -9,16 +9,15 @@
  * 2018-12-10     Zohar_Lee    format file
  * 2018-12-10     Zohar_Lee    format file
  */
  */
 
 
-#include <board.h>
-#if defined(BSP_USING_EXT_SRAM) && defined(RT_USING_MEMHEAP_AS_HEAP)
-    static struct rt_memheap system_heap;
-#endif
+#include "board.h"
+
 static void bsp_clock_config(void)
 static void bsp_clock_config(void)
 {
 {
     SystemInit();
     SystemInit();
     SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
     SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
     SysTick->CTRL |= 0x00000004UL;
     SysTick->CTRL |= 0x00000004UL;
 }
 }
+
 void SysTick_Handler(void)
 void SysTick_Handler(void)
 {
 {
     /* enter interrupt */
     /* enter interrupt */
@@ -29,20 +28,47 @@ void SysTick_Handler(void)
     /* leave interrupt */
     /* leave interrupt */
     rt_interrupt_leave();
     rt_interrupt_leave();
 }
 }
-#ifdef BSP_USING_EXT_SRAM
-    extern int rt_hw_sram_init(void);
-#endif
+
+/**
+ * This function will delay for some us.
+ *
+ * @param us the delay time of us
+ */
+void rt_hw_us_delay(rt_uint32_t us)
+{
+    rt_uint32_t ticks;
+    rt_uint32_t told, tnow, tcnt = 0;
+    rt_uint32_t reload = SysTick->LOAD;
+
+    ticks = us * reload / (1000000 / RT_TICK_PER_SECOND);
+    told = SysTick->VAL;
+    while (1)
+    {
+        tnow = SysTick->VAL;
+        if (tnow != told)
+        {
+            if (tnow < told)
+            {
+                tcnt += told - tnow;
+            }
+            else
+            {
+                tcnt += reload - tnow + told;
+            }
+            told = tnow;
+            if (tcnt >= ticks)
+            {
+                break;
+            }
+        }
+    }
+}
+
 void rt_hw_board_init()
 void rt_hw_board_init()
 {
 {
     bsp_clock_config();
     bsp_clock_config();
 
 
-#ifdef BSP_USING_EXT_SRAM
-    rt_hw_sram_init();
-#endif
-#if defined(BSP_USING_EXT_SRAM) && defined(RT_USING_MEMHEAP_AS_HEAP)
-    rt_system_heap_init((void *)EXT_SRAM_BEGIN, (void *)EXT_SRAM_END);
-    rt_memheap_init(&system_heap, "sram", (void *)HEAP_BEGIN, HEAP_SIZE);
-#elif defined(RT_USING_HEAP)
+#ifdef RT_USING_HEAP
     rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
     rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
 #endif
 #endif
 #ifdef RT_USING_COMPONENTS_INIT
 #ifdef RT_USING_COMPONENTS_INIT

+ 30 - 13
bsp/swm320-lq100/drivers/board.h

@@ -9,32 +9,49 @@
  * 2018-12-10     Zohar_Lee    format file
  * 2018-12-10     Zohar_Lee    format file
  */
  */
 
 
-#ifndef BOARD_H__
-#define BOARD_H__
+#ifndef __BOARD_H__
+#define __BOARD_H__
+
 #include <rtthread.h>
 #include <rtthread.h>
+#include <rthw.h>
+#include <rtdevice.h>
+#include <string.h>
 #include <SWM320.h>
 #include <SWM320.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
 #define SRAM_BASE 0x20000000
 #define SRAM_BASE 0x20000000
 #define SRAM_SIZE 0x20000
 #define SRAM_SIZE 0x20000
+#define SRAM_END (SRAM_BASE + SRAM_SIZE)
 
 
 #ifdef BSP_USING_EXT_SRAM
 #ifdef BSP_USING_EXT_SRAM
-    #define EXT_SRAM_BASE SRAMM_BASE
-    #define EXT_SRAM_SIZE BSP_EXT_SRAM_SIZE
-    #define EXT_SRAM_BEGIN EXT_SRAM_BASE
-    #define EXT_SRAM_END (EXT_SRAM_BASE + EXT_SRAM_SIZE)
+#define EXT_SRAM_BASE SRAMM_BASE
+#define EXT_SRAM_SIZE BSP_EXT_SRAM_SIZE
+#define EXT_SRAM_BEGIN EXT_SRAM_BASE
+#define EXT_SRAM_END (EXT_SRAM_BASE + EXT_SRAM_SIZE)
 #endif
 #endif
 
 
-#define SRAM_END (SRAM_BASE + SRAM_SIZE)
 #if defined(__CC_ARM) || defined(__CLANG_ARM)
 #if defined(__CC_ARM) || defined(__CLANG_ARM)
     extern int Image$$RW_IRAM1$$ZI$$Limit;
     extern int Image$$RW_IRAM1$$ZI$$Limit;
-    #define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
+#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
 #elif __ICCARM__
 #elif __ICCARM__
-    #pragma section = "HEAP"
-    #define HEAP_BEGIN (__segment_end("HEAP"))
+#pragma section = "HEAP"
+#define HEAP_BEGIN (__segment_end("HEAP"))
 #else
 #else
-    extern int __bss_end;
-    #define HEAP_BEGIN ((void *)&__bss_end)
+extern int __bss_end;
+#define HEAP_BEGIN ((void *)&__bss_end)
 #endif
 #endif
+
 #define HEAP_END SRAM_END
 #define HEAP_END SRAM_END
 #define HEAP_SIZE (HEAP_END - (rt_uint32_t)HEAP_BEGIN)
 #define HEAP_SIZE (HEAP_END - (rt_uint32_t)HEAP_BEGIN)
-extern void rt_hw_board_init(void);
+
+    void rt_hw_board_init(void);
+
+#ifdef __cplusplus
+}
 #endif
 #endif
+
+#endif /* __BOARD_H__ */

+ 217 - 0
bsp/swm320-lq100/drivers/drv_adc.c

@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2020-5-26      lik          first version
+ */
+
+#include "drv_adc.h"
+
+#ifdef RT_USING_ADC
+#ifdef BSP_USING_ADC
+
+//#define DRV_DEBUG
+#define LOG_TAG "drv.adc"
+#include <drv_log.h>
+
+static struct swm_adc_cfg adc_cfg[] =
+    {
+#ifdef BSP_USING_ADC0
+        ADC0_CFG,
+#endif
+#ifdef BSP_USING_ADC1
+        ADC1_CFG,
+#endif
+
+};
+
+static struct swm_adc adc_drv[sizeof(adc_cfg) / sizeof(adc_cfg[0])];
+
+static rt_err_t swm_adc_enabled(struct rt_adc_device *adc_device, rt_uint32_t channel, rt_bool_t enabled)
+{
+    struct swm_adc_cfg *cfg = RT_NULL;
+    RT_ASSERT(adc_device != RT_NULL);
+    cfg = adc_device->parent.user_data;
+
+    if (enabled)
+    {
+        ADC_Open(cfg->ADCx);
+    }
+    else
+    {
+        ADC_Close(cfg->ADCx);
+    }
+
+    return RT_EOK;
+}
+
+static rt_uint32_t swm_adc_get_channel(rt_uint32_t channel)
+{
+    rt_uint32_t swm_channel = 0;
+
+    switch (channel)
+    {
+    case 0:
+        swm_channel = ADC_CH0;
+        break;
+    case 1:
+        swm_channel = ADC_CH1;
+        break;
+    case 2:
+        swm_channel = ADC_CH2;
+        break;
+    case 3:
+        swm_channel = ADC_CH3;
+        break;
+    case 4:
+        swm_channel = ADC_CH4;
+        break;
+    case 5:
+        swm_channel = ADC_CH5;
+        break;
+    case 6:
+        swm_channel = ADC_CH6;
+        break;
+    case 7:
+        swm_channel = ADC_CH7;
+        break;
+    }
+
+    return swm_channel;
+}
+
+static rt_err_t swm_get_adc_value(struct rt_adc_device *adc_device, rt_uint32_t channel, rt_uint32_t *value)
+{
+    uint32_t adc_chn;
+    struct swm_adc_cfg *cfg = RT_NULL;
+    RT_ASSERT(adc_device != RT_NULL);
+    RT_ASSERT(value != RT_NULL);
+    cfg = adc_device->parent.user_data;
+
+    if (channel < 8)
+    {
+        /* set stm32 ADC channel */
+        adc_chn = swm_adc_get_channel(channel);
+    }
+    else
+    {
+        LOG_E("ADC channel must be between 0 and 7.");
+        return -RT_ERROR;
+    }
+
+    /* start ADC */
+    ADC_Start(cfg->ADCx);
+    /* Wait for the ADC to convert */
+    while ((cfg->ADCx->CH[channel].STAT & 0x01) == 0)
+        ;
+
+    /* get ADC value */
+    *value = (rt_uint32_t)ADC_Read(cfg->ADCx, adc_chn);
+
+    return RT_EOK;
+}
+
+static const struct rt_adc_ops swm_adc_ops =
+    {
+        .enabled = swm_adc_enabled,
+        .convert = swm_get_adc_value,
+};
+
+static int rt_hw_adc_init(void)
+{
+    int i = 0;
+    int result = RT_EOK;
+
+    for (i = 0; i < sizeof(adc_cfg) / sizeof(adc_cfg[0]); i++)
+    {
+        /* ADC init */
+        adc_drv[i].cfg = &adc_cfg[i];
+
+        if (adc_drv[i].cfg->ADCx == ADC0)
+        {
+#ifdef BSP_USING_ADC0_CHN0
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH0;
+#endif
+#ifdef BSP_USING_ADC0_CHN1
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH1;
+#endif
+#ifdef BSP_USING_ADC0_CHN2
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH2;
+#endif
+#ifdef BSP_USING_ADC0_CHN3
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH3;
+#endif
+#ifdef BSP_USING_ADC0_CHN4
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH4;
+            PORT_Init(PORTA, PIN12, PORTA_PIN12_ADC0_IN4, 0); //PA.12 => ADC0.CH4
+#endif
+#ifdef BSP_USING_ADC0_CHN5
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH5;
+            PORT_Init(PORTA, PIN11, PORTA_PIN11_ADC0_IN5, 0); //PA.11 => ADC0.CH5
+#endif
+#ifdef BSP_USING_ADC0_CHN6
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH6;
+            PORT_Init(PORTA, PIN10, PORTA_PIN10_ADC0_IN6, 0); //PA.10 => ADC0.CH6
+#endif
+#ifdef BSP_USING_ADC0_CHN7
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH7;
+            PORT_Init(PORTA, PIN9, PORTA_PIN9_ADC0_IN7, 0); //PA.9  => ADC0.CH7
+#endif
+        }
+        else if (adc_drv[i].cfg->ADCx == ADC1)
+        {
+#ifdef BSP_USING_ADC1_CHN0
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH0;
+            PORT_Init(PORTC, PIN7, PORTC_PIN7_ADC1_IN0, 0); //PC.7 => ADC1.CH0
+#endif
+#ifdef BSP_USING_ADC1_CHN1
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH1;
+            PORT_Init(PORTC, PIN6, PORTC_PIN6_ADC1_IN1, 0); //PC.6 => ADC1.CH1
+#endif
+#ifdef BSP_USING_ADC1_CHN2
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH2;
+            PORT_Init(PORTC, PIN5, PORTC_PIN5_ADC1_IN2, 0); //PC.5 => ADC1.CH2
+#endif
+#ifdef BSP_USING_ADC1_CHN3
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH3;
+            PORT_Init(PORTC, PIN4, PORTC_PIN4_ADC1_IN3, 0); //PC.4 => ADC1.CH3
+#endif
+#ifdef BSP_USING_ADC1_CHN4
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH4;
+            PORT_Init(PORTN, PIN0, PORTN_PIN0_ADC1_IN4, 0); //PN.0 => ADC1.CH4
+#endif
+#ifdef BSP_USING_ADC1_CHN5
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH5;
+            PORT_Init(PORTN, PIN1, PORTN_PIN1_ADC1_IN5, 0); //PN.1 => ADC1.CH5
+#endif
+#ifdef BSP_USING_ADC1_CHN6
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH6;
+            PORT_Init(PORTN, PIN2, PORTN_PIN2_ADC1_IN6, 0); //PN.2 => ADC1.CH6
+#endif
+#ifdef BSP_USING_ADC1_CHN7
+            adc_drv[i].cfg->adc_initstruct.channels |= ADC_CH7;
+#endif
+        }
+
+        ADC_Init(adc_drv[i].cfg->ADCx, &(adc_drv[i].cfg->adc_initstruct));
+        ADC_Open(adc_drv[i].cfg->ADCx);
+        /* register ADC device */
+        if (rt_hw_adc_register(&adc_drv[i].adc_device, adc_drv[i].cfg->name, &swm_adc_ops, adc_drv[i].cfg) == RT_EOK)
+        {
+            LOG_D("%s init success", adc_drv[i].cfg->name);
+        }
+        else
+        {
+            LOG_E("%s register failed", adc_drv[i].cfg->name);
+            result = -RT_ERROR;
+        }
+    }
+
+    return result;
+}
+INIT_BOARD_EXPORT(rt_hw_adc_init);
+#endif /* BSP_USING_ADC */
+#endif /* RT_USING_ADC */

+ 71 - 0
bsp/swm320-lq100/drivers/drv_adc.h

@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2020-5-26      lik          first version
+ */
+
+#ifndef __DRV_ADC_H__
+#define __DRV_ADC_H__
+
+#include "board.h"
+
+struct swm_adc_cfg
+{
+    const char *name;
+    ADC_TypeDef *ADCx;
+    ADC_InitStructure adc_initstruct;
+};
+
+struct swm_adc
+{
+    struct swm_adc_cfg *cfg;
+    struct rt_adc_device adc_device;
+};
+
+#ifdef BSP_USING_ADC0
+#ifndef ADC0_CFG
+#define ADC0_CFG                                        \
+    {                                                   \
+        .name = "adc0",                                 \
+        .ADCx = ADC0,                                   \
+        .adc_initstruct.clk_src = ADC_CLKSRC_VCO_DIV64, \
+        .adc_initstruct.clk_div = 25,                   \
+        .adc_initstruct.pga_ref = PGA_REF_INTERNAL,     \
+        .adc_initstruct.channels = 0,                   \
+        .adc_initstruct.samplAvg = ADC_AVG_SAMPLE1,     \
+        .adc_initstruct.trig_src = ADC_TRIGSRC_SW,      \
+        .adc_initstruct.Continue = 0,                   \
+        .adc_initstruct.EOC_IEn = 0,                    \
+        .adc_initstruct.OVF_IEn = 0,                    \
+        .adc_initstruct.HFULL_IEn = 0,                  \
+        .adc_initstruct.FULL_IEn = 0,                   \
+    }
+#endif /* ADC0_CFG */
+#endif /* BSP_USING_ADC0 */
+
+#ifdef BSP_USING_ADC1
+#ifndef ADC1_CFG
+#define ADC1_CFG                                        \
+    {                                                   \
+        .name = "adc1",                                 \
+        .ADCx = ADC1,                                   \
+        .adc_initstruct.clk_src = ADC_CLKSRC_VCO_DIV64, \
+        .adc_initstruct.clk_div = 25,                   \
+        .adc_initstruct.pga_ref = PGA_REF_INTERNAL,     \
+        .adc_initstruct.channels = 0,                   \
+        .adc_initstruct.samplAvg = ADC_AVG_SAMPLE1,     \
+        .adc_initstruct.trig_src = ADC_TRIGSRC_SW,      \
+        .adc_initstruct.Continue = 0,                   \
+        .adc_initstruct.EOC_IEn = 0,                    \
+        .adc_initstruct.OVF_IEn = 0,                    \
+        .adc_initstruct.HFULL_IEn = 0,                  \
+        .adc_initstruct.FULL_IEn = 0,                   \
+    }
+#endif /* ADC1_CFG */
+#endif /* BSP_USING_ADC1 */
+
+#endif /* __DRV_ADC_H__ */

+ 226 - 0
bsp/swm320-lq100/drivers/drv_crypto.c

@@ -0,0 +1,226 @@
+/*
+ * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2020-07-10     lik          first version
+ */
+
+#include "drv_crypto.h"
+#include <string.h>
+
+#ifdef RT_USING_HWCRYPTO
+
+struct swm_hwcrypto_device
+{
+    struct rt_hwcrypto_device dev;
+    struct rt_mutex mutex;
+};
+
+#ifdef BSP_USING_CRC
+
+static struct hwcrypto_crc_cfg crc_backup_cfg;
+
+static rt_uint32_t _crc_update(struct hwcrypto_crc *ctx, const rt_uint8_t *in, rt_size_t length)
+{
+    rt_uint32_t result = 0;
+    struct swm_hwcrypto_device *swm_hw_dev = (struct swm_hwcrypto_device *)ctx->parent.device->user_data;
+
+    struct swm_crc_cfg *hw_crc_cfg = (struct swm_crc_cfg *)(ctx->parent.contex);
+
+    rt_mutex_take(&swm_hw_dev->mutex, RT_WAITING_FOREVER);
+
+    if (memcmp(&crc_backup_cfg, &ctx->crc_cfg, sizeof(struct hwcrypto_crc_cfg)) != 0)
+    {
+        hw_crc_cfg->CRCx = CRC;
+
+        hw_crc_cfg->inival = ctx->crc_cfg.last_val;
+
+        switch (ctx->crc_cfg.width)
+        {
+        case 8:
+            hw_crc_cfg->crc_inbits = 2;
+            break;
+        case 16:
+            hw_crc_cfg->crc_inbits = 1;
+            break;
+        case 32:
+            hw_crc_cfg->crc_inbits = 0;
+            break;
+        default:
+            goto _exit;
+        }
+        switch (ctx->crc_cfg.poly)
+        {
+        case 0x1021:
+            hw_crc_cfg->crc_1632 = 1;
+            break;
+        case 0x04C11DB7:
+            hw_crc_cfg->crc_1632 = 0;
+            break;
+        default:
+            goto _exit;
+        }
+
+        hw_crc_cfg->crc_out_not = 0;
+
+        switch (ctx->crc_cfg.flags)
+        {
+        case 0:
+        case CRC_FLAG_REFIN:
+            hw_crc_cfg->crc_out_rev = 0;
+            break;
+        case CRC_FLAG_REFOUT:
+        case CRC_FLAG_REFIN | CRC_FLAG_REFOUT:
+            hw_crc_cfg->crc_out_rev = 1;
+            break;
+        default:
+            goto _exit;
+        }
+
+        CRC_Init(hw_crc_cfg->CRCx, (hw_crc_cfg->crc_inbits << 1) | hw_crc_cfg->crc_1632, hw_crc_cfg->crc_out_not, hw_crc_cfg->crc_out_rev, hw_crc_cfg->inival);
+        memcpy(&crc_backup_cfg, &ctx->crc_cfg, sizeof(struct hwcrypto_crc_cfg));
+    }
+
+    for (uint32_t i = 0; i < length; i++)
+        CRC_Write((uint32_t)in[i]);
+    result = CRC_Result();
+
+    ctx->crc_cfg.last_val = result;
+
+    crc_backup_cfg.last_val = ctx->crc_cfg.last_val;
+    result = (result ? result ^ (ctx->crc_cfg.xorout) : result);
+
+_exit:
+    rt_mutex_release(&swm_hw_dev->mutex);
+
+    return result;
+}
+
+static const struct hwcrypto_crc_ops crc_ops =
+    {
+        .update = _crc_update,
+};
+#endif /* BSP_USING_CRC */
+
+static rt_err_t _crypto_create(struct rt_hwcrypto_ctx *ctx)
+{
+    rt_err_t res = RT_EOK;
+
+    switch (ctx->type & HWCRYPTO_MAIN_TYPE_MASK)
+    {
+#if defined(BSP_USING_CRC)
+    case HWCRYPTO_TYPE_CRC:
+    {
+        struct swm_crc_cfg *contex = rt_calloc(1, sizeof(struct swm_crc_cfg));
+        if (RT_NULL == contex)
+        {
+            res = -RT_ERROR;
+            break;
+        }
+        contex->CRCx = DEFAULT_CRC;
+        contex->inival = DEFAULT_INIVAL;
+        contex->crc_inbits = DEFAULT_INBITS;
+        contex->crc_1632 = DEFAULT_CRC1632;
+        contex->crc_out_not = DEFAULT_OUT_NOT;
+        contex->crc_out_rev = DEFAULT_OUT_REV;
+
+        ctx->contex = contex;
+        ((struct hwcrypto_crc *)ctx)->ops = &crc_ops;
+        break;
+    }
+#endif /* BSP_USING_CRC */
+    default:
+        res = -RT_ERROR;
+        break;
+    }
+    return res;
+}
+
+static void _crypto_destroy(struct rt_hwcrypto_ctx *ctx)
+{
+    struct swm_crc_cfg *hw_crc_cfg = (struct swm_crc_cfg *)(ctx->contex);
+    switch (ctx->type & HWCRYPTO_MAIN_TYPE_MASK)
+    {
+#if defined(BSP_USING_CRC)
+    case HWCRYPTO_TYPE_CRC:
+        hw_crc_cfg->CRCx->CR &= ~CRC_CR_EN_Msk;
+        break;
+#endif /* BSP_USING_CRC */
+    default:
+        break;
+    }
+
+    rt_free(ctx->contex);
+}
+
+static rt_err_t _crypto_clone(struct rt_hwcrypto_ctx *des, const struct rt_hwcrypto_ctx *src)
+{
+    rt_err_t res = RT_EOK;
+
+    switch (src->type & HWCRYPTO_MAIN_TYPE_MASK)
+    {
+#if defined(BSP_USING_CRC)
+    case HWCRYPTO_TYPE_CRC:
+        if (des->contex && src->contex)
+        {
+            rt_memcpy(des->contex, src->contex, sizeof(struct swm_crc_cfg));
+        }
+        break;
+#endif /* BSP_USING_CRC */
+    default:
+        res = -RT_ERROR;
+        break;
+    }
+    return res;
+}
+
+static void _crypto_reset(struct rt_hwcrypto_ctx *ctx)
+{
+    struct swm_crc_cfg *hw_crc_cfg = (struct swm_crc_cfg *)(ctx->contex);
+    switch (ctx->type & HWCRYPTO_MAIN_TYPE_MASK)
+    {
+#if defined(BSP_USING_CRC)
+    case HWCRYPTO_TYPE_CRC:
+        hw_crc_cfg->CRCx->CR &= ~CRC_CR_EN_Msk;
+        break;
+#endif /* BSP_USING_CRC */
+    default:
+        break;
+    }
+}
+
+static const struct rt_hwcrypto_ops _ops =
+    {
+        .create = _crypto_create,
+        .destroy = _crypto_destroy,
+        .copy = _crypto_clone,
+        .reset = _crypto_reset,
+};
+
+int rt_hw_crypto_init(void)
+{
+    static struct swm_hwcrypto_device _crypto_dev;
+    rt_uint32_t cpuid[2] = {0};
+
+    _crypto_dev.dev.ops = &_ops;
+
+    cpuid[0] = SCB->CPUID;
+    _crypto_dev.dev.id = 0;
+    rt_memcpy(&_crypto_dev.dev.id, cpuid, 8);
+
+    _crypto_dev.dev.user_data = &_crypto_dev;
+
+    if (rt_hwcrypto_register(&_crypto_dev.dev, RT_HWCRYPTO_DEFAULT_NAME) != RT_EOK)
+    {
+        return -1;
+    }
+    rt_mutex_init(&_crypto_dev.mutex, RT_HWCRYPTO_DEFAULT_NAME, RT_IPC_FLAG_FIFO);
+    return 0;
+}
+INIT_BOARD_EXPORT(rt_hw_crypto_init);
+
+
+#endif /* RT_USING_HWCRYPTO */

+ 40 - 0
bsp/swm320-lq100/drivers/drv_crypto.h

@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2020-07-10     lik          first version
+ */
+
+#ifndef __DRV_CRYPTO_H__
+#define __DRV_CRYPTO_H__
+
+#include "board.h"
+
+/* swm config class */
+struct swm_crc_cfg
+{
+    CRC_TypeDef *CRCx;
+    uint32_t inival;
+    uint8_t crc_inbits;
+    uint8_t crc_1632;
+    uint8_t crc_out_not;
+    uint8_t crc_out_rev;
+};
+
+#ifdef BSP_USING_CRC
+
+#define DEFAULT_CRC (CRC)
+#define DEFAULT_INIVAL (0x00000000)
+#define DEFAULT_INBITS (2)
+#define DEFAULT_CRC1632 (0)
+#define DEFAULT_OUT_NOT (0)
+#define DEFAULT_OUT_REV (0)
+
+#endif /* BSP_USING_CRC */
+
+int rt_hw_crypto_init(void);
+
+#endif /* __DRV_CRYPTO_H__ */

+ 342 - 413
bsp/swm320-lq100/drivers/drv_gpio.c

@@ -6,162 +6,250 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-05-31     ZYH          first version
  * 2018-05-31     ZYH          first version
- * 2018-12-10     Zohar_Lee    修复bug
+ * 2018-12-10     Zohar_Lee    fix bug
+ * 2020-07-10     lik          rewrite
  */
  */
 
 
-#include <rtthread.h>
-#include <rtdevice.h>
-#include <board.h>
-#include <SWM320_port.h>
-#include <SWM320_gpio.h>
-#include <SWM320_exti.h>
-#include <rthw.h>
+#include "drv_gpio.h"
 
 
-typedef void (*pin_callback_t)(void *args);
-struct pin
-{
-    uint32_t package_index;
-    const char *name;
-    GPIO_TypeDef *port;
-    uint32_t group_index;
-    IRQn_Type irq;
-    rt_uint32_t irq_mode;
-    pin_callback_t callback;
-    void *callback_args;
-};
-typedef struct pin pin_t;
-
-#define SWM32_PIN(a, b, c, d)             \
-    {                                     \
-        a, #b, GPIO##c, d, GPIO##c##_IRQn \
-    }
-#define GPIO0 ((GPIO_TypeDef *)(0))
-#define GPIO0_IRQn (GPIOA0_IRQn)
+#ifdef RT_USING_PIN
+#ifdef BSP_USING_GPIO
+
+static const struct swm_pin_index pins[] =
+    {
+        __SWM_PIN(0, A, 0),
+        __SWM_PIN(1, A, 1),
+        __SWM_PIN(2, A, 2),
+        __SWM_PIN(3, A, 3),
+        __SWM_PIN(4, A, 4),
+        __SWM_PIN(5, A, 5),
+        __SWM_PIN(6, A, 6),
+        __SWM_PIN(7, A, 7),
+        __SWM_PIN(8, A, 8),
+        __SWM_PIN(9, A, 9),
+        __SWM_PIN(10, A, 10),
+        __SWM_PIN(11, A, 11),
+        __SWM_PIN(12, A, 12),
+
+        __SWM_PIN(13, B, 0),
+        __SWM_PIN(14, B, 1),
+        __SWM_PIN(15, B, 2),
+        __SWM_PIN(16, B, 3),
+        __SWM_PIN(17, B, 4),
+        __SWM_PIN(18, B, 5),
+        __SWM_PIN(19, B, 6),
+        __SWM_PIN(20, B, 7),
+        __SWM_PIN(21, B, 8),
+        __SWM_PIN(22, B, 9),
+        __SWM_PIN(23, B, 10),
+        __SWM_PIN(24, B, 11),
+        __SWM_PIN(25, B, 12),
+
+        __SWM_PIN(26, C, 0),
+        __SWM_PIN(27, C, 1),
+        __SWM_PIN(28, C, 2),
+        __SWM_PIN(29, C, 3),
+        __SWM_PIN(30, C, 4),
+        __SWM_PIN(31, C, 5),
+        __SWM_PIN(32, C, 6),
+        __SWM_PIN(33, C, 7),
+
+        __SWM_PIN(34, M, 0),
+        __SWM_PIN(35, M, 1),
+        __SWM_PIN(36, M, 2),
+        __SWM_PIN(37, M, 3),
+        __SWM_PIN(38, M, 4),
+        __SWM_PIN(39, M, 5),
+        __SWM_PIN(40, M, 6),
+        __SWM_PIN(41, M, 7),
+        __SWM_PIN(42, M, 8),
+        __SWM_PIN(43, M, 9),
+        __SWM_PIN(44, M, 10),
+        __SWM_PIN(45, M, 11),
+        __SWM_PIN(46, M, 12),
+        __SWM_PIN(47, M, 13),
+        __SWM_PIN(48, M, 14),
+        __SWM_PIN(49, M, 15),
+        __SWM_PIN(50, M, 16),
+        __SWM_PIN(51, M, 17),
+        __SWM_PIN(52, M, 18),
+        __SWM_PIN(53, M, 19),
+        __SWM_PIN(54, M, 20),
+        __SWM_PIN(55, M, 21),
+
+        __SWM_PIN(56, N, 0),
+        __SWM_PIN(57, N, 1),
+        __SWM_PIN(58, N, 2),
+        __SWM_PIN(59, N, 3),
+        __SWM_PIN(60, N, 4),
+        __SWM_PIN(61, N, 5),
+        __SWM_PIN(62, N, 6),
+        __SWM_PIN(63, N, 7),
+        __SWM_PIN(64, N, 8),
+        __SWM_PIN(65, N, 9),
+        __SWM_PIN(66, N, 10),
+        __SWM_PIN(67, N, 11),
+        __SWM_PIN(68, N, 12),
+        __SWM_PIN(69, N, 13),
+        __SWM_PIN(70, N, 14),
+        __SWM_PIN(71, N, 15),
+        __SWM_PIN(72, N, 16),
+        __SWM_PIN(73, N, 17),
+        __SWM_PIN(74, N, 18),
+        __SWM_PIN(75, N, 19),
+
+        __SWM_PIN(76, P, 0),
+        __SWM_PIN(77, P, 1),
+        __SWM_PIN(78, P, 2),
+        __SWM_PIN(79, P, 3),
+        __SWM_PIN(80, P, 4),
+        __SWM_PIN(81, P, 5),
+        __SWM_PIN(82, P, 6),
+        __SWM_PIN(83, P, 7),
+        __SWM_PIN(84, P, 8),
+        __SWM_PIN(85, P, 9),
+        __SWM_PIN(86, P, 10),
+        __SWM_PIN(87, P, 11),
+        __SWM_PIN(88, P, 12),
+        __SWM_PIN(89, P, 13),
+        __SWM_PIN(90, P, 14),
+        __SWM_PIN(91, P, 15),
+        __SWM_PIN(92, P, 16),
+        __SWM_PIN(93, P, 17),
+        __SWM_PIN(94, P, 18),
+        __SWM_PIN(95, P, 19),
+        __SWM_PIN(96, P, 20),
+        __SWM_PIN(97, P, 21),
+        __SWM_PIN(98, P, 22),
+        __SWM_PIN(99, P, 23)};
+
+static struct rt_pin_irq_hdr pin_irq_hdr_tab[] =
+    {
+        {0, 0, RT_NULL, RT_NULL},
+        {1, 0, RT_NULL, RT_NULL},
+        {2, 0, RT_NULL, RT_NULL},
+        {3, 0, RT_NULL, RT_NULL},
+        {4, 0, RT_NULL, RT_NULL},
+        {5, 0, RT_NULL, RT_NULL},
+        {6, 0, RT_NULL, RT_NULL},
+        {7, 0, RT_NULL, RT_NULL},
+        {8, 0, RT_NULL, RT_NULL},
+        {9, 0, RT_NULL, RT_NULL},
+        {10, 0, RT_NULL, RT_NULL},
+        {11, 0, RT_NULL, RT_NULL},
+        {12, 0, RT_NULL, RT_NULL},
+        {13, 0, RT_NULL, RT_NULL},
+        {14, 0, RT_NULL, RT_NULL},
+        {15, 0, RT_NULL, RT_NULL},
+        {16, 0, RT_NULL, RT_NULL},
+        {17, 0, RT_NULL, RT_NULL},
+        {18, 0, RT_NULL, RT_NULL},
+        {19, 0, RT_NULL, RT_NULL},
+        {20, 0, RT_NULL, RT_NULL},
+        {21, 0, RT_NULL, RT_NULL},
+        {22, 0, RT_NULL, RT_NULL},
+        {23, 0, RT_NULL, RT_NULL},
+        {24, 0, RT_NULL, RT_NULL},
+        {25, 0, RT_NULL, RT_NULL},
+        {26, 0, RT_NULL, RT_NULL},
+        {27, 0, RT_NULL, RT_NULL},
+        {28, 0, RT_NULL, RT_NULL},
+        {29, 0, RT_NULL, RT_NULL},
+        {30, 0, RT_NULL, RT_NULL},
+        {31, 0, RT_NULL, RT_NULL},
+        {32, 0, RT_NULL, RT_NULL},
+        {33, 0, RT_NULL, RT_NULL},
+        {34, 0, RT_NULL, RT_NULL},
+        {35, 0, RT_NULL, RT_NULL},
+        {36, 0, RT_NULL, RT_NULL},
+        {37, 0, RT_NULL, RT_NULL},
+        {38, 0, RT_NULL, RT_NULL},
+        {39, 0, RT_NULL, RT_NULL},
+        {40, 0, RT_NULL, RT_NULL},
+        {41, 0, RT_NULL, RT_NULL},
+        {42, 0, RT_NULL, RT_NULL},
+        {43, 0, RT_NULL, RT_NULL},
+        {44, 0, RT_NULL, RT_NULL},
+        {45, 0, RT_NULL, RT_NULL},
+        {46, 0, RT_NULL, RT_NULL},
+        {47, 0, RT_NULL, RT_NULL},
+        {48, 0, RT_NULL, RT_NULL},
+        {49, 0, RT_NULL, RT_NULL},
+        {50, 0, RT_NULL, RT_NULL},
+        {51, 0, RT_NULL, RT_NULL},
+        {52, 0, RT_NULL, RT_NULL},
+        {53, 0, RT_NULL, RT_NULL},
+        {54, 0, RT_NULL, RT_NULL},
+        {55, 0, RT_NULL, RT_NULL},
+        {56, 0, RT_NULL, RT_NULL},
+        {57, 0, RT_NULL, RT_NULL},
+        {58, 0, RT_NULL, RT_NULL},
+        {59, 0, RT_NULL, RT_NULL},
+        {60, 0, RT_NULL, RT_NULL},
+        {61, 0, RT_NULL, RT_NULL},
+        {62, 0, RT_NULL, RT_NULL},
+        {63, 0, RT_NULL, RT_NULL},
+        {64, 0, RT_NULL, RT_NULL},
+        {65, 0, RT_NULL, RT_NULL},
+        {66, 0, RT_NULL, RT_NULL},
+        {67, 0, RT_NULL, RT_NULL},
+        {68, 0, RT_NULL, RT_NULL},
+        {69, 0, RT_NULL, RT_NULL},
+        {70, 0, RT_NULL, RT_NULL},
+        {71, 0, RT_NULL, RT_NULL},
+        {72, 0, RT_NULL, RT_NULL},
+        {73, 0, RT_NULL, RT_NULL},
+        {74, 0, RT_NULL, RT_NULL},
+        {75, 0, RT_NULL, RT_NULL},
+        {76, 0, RT_NULL, RT_NULL},
+        {77, 0, RT_NULL, RT_NULL},
+        {78, 0, RT_NULL, RT_NULL},
+        {79, 0, RT_NULL, RT_NULL},
+        {80, 0, RT_NULL, RT_NULL},
+        {81, 0, RT_NULL, RT_NULL},
+        {82, 0, RT_NULL, RT_NULL},
+        {83, 0, RT_NULL, RT_NULL},
+        {84, 0, RT_NULL, RT_NULL},
+        {85, 0, RT_NULL, RT_NULL},
+        {86, 0, RT_NULL, RT_NULL},
+        {87, 0, RT_NULL, RT_NULL},
+        {88, 0, RT_NULL, RT_NULL},
+        {89, 0, RT_NULL, RT_NULL},
+        {90, 0, RT_NULL, RT_NULL},
+        {91, 0, RT_NULL, RT_NULL},
+        {92, 0, RT_NULL, RT_NULL},
+        {93, 0, RT_NULL, RT_NULL},
+        {94, 0, RT_NULL, RT_NULL},
+        {95, 0, RT_NULL, RT_NULL},
+        {96, 0, RT_NULL, RT_NULL},
+        {97, 0, RT_NULL, RT_NULL},
+        {98, 0, RT_NULL, RT_NULL},
+        {99, 0, RT_NULL, RT_NULL}};
 
 
-const static pin_t swm32_pin_map[] =
-{
-    SWM32_PIN(0, None, 0, 0),
-    SWM32_PIN(1, ADC0 CH3, 0, 0),
-    SWM32_PIN(2, ADC0 REFP, 0, 0),
-    SWM32_PIN(3, Cap0, 0, 0),
-    SWM32_PIN(4, B12, B, 12),
-    SWM32_PIN(5, RTC VDD, 0, 0),
-    SWM32_PIN(6, N14, N, 14),
-    SWM32_PIN(7, N13, N, 13),
-    SWM32_PIN(8, N12, N, 12),
-    SWM32_PIN(9, N11, N, 11),
-    SWM32_PIN(10, VDD 3.3V, 0, 0),
-    SWM32_PIN(11, VSS 3.3V, 0, 0),
-    SWM32_PIN(12, Cap 2, 0, 0),
-    SWM32_PIN(13, N9, N, 9),
-    SWM32_PIN(14, N10, N, 10),
-    SWM32_PIN(15, Cap 1, 0, 0),
-    SWM32_PIN(16, AVSS, 0, 0),
-    SWM32_PIN(17, AVDD, 0, 0),
-    SWM32_PIN(18, N2, N, 2),
-    SWM32_PIN(19, N1, N, 1),
-    SWM32_PIN(20, N0, N, 0),
-    SWM32_PIN(21, C4, C, 4),
-    SWM32_PIN(22, C5, C, 5),
-    SWM32_PIN(23, C6, C, 6),
-    SWM32_PIN(24, C7, C, 7),
-    SWM32_PIN(25, C2, C, 2),
-    SWM32_PIN(26, C3, C, 3),
-    SWM32_PIN(27, XHIN, 0, 0),
-    SWM32_PIN(28, XHOUT, 0, 0),
-    SWM32_PIN(29, RESET, 0, 0),
-    SWM32_PIN(30, M2, M, 2),
-    SWM32_PIN(31, M3, M, 3),
-    SWM32_PIN(32, M4, M, 4),
-    SWM32_PIN(33, M5, M, 5),
-    SWM32_PIN(34, M6, M, 6),
-    SWM32_PIN(35, M7, M, 7),
-    SWM32_PIN(36, M8, M, 8),
-    SWM32_PIN(37, M9, M, 9),
-    SWM32_PIN(38, M10, M, 10),
-    SWM32_PIN(39, M11, M, 11),
-    SWM32_PIN(40, M12, M, 12),
-    SWM32_PIN(41, M13, M, 13),
-    SWM32_PIN(42, M14, M, 14),
-    SWM32_PIN(43, M15, M, 15),
-    SWM32_PIN(44, M16, M, 16),
-    SWM32_PIN(45, M17, M, 17),
-    SWM32_PIN(46, M18, M, 18),
-    SWM32_PIN(47, M19, M, 19),
-    SWM32_PIN(48, M20, M, 20),
-    SWM32_PIN(49, M21, M, 21),
-    SWM32_PIN(50, VDDIO, 0, 0),
-    SWM32_PIN(51, M1, M, 1),
-    SWM32_PIN(52, M0, M, 0),
-    SWM32_PIN(53, P0, P, 0),
-    SWM32_PIN(54, P1, P, 1),
-    SWM32_PIN(55, P2, P, 2),
-    SWM32_PIN(56, P3, P, 3),
-    SWM32_PIN(57, P4, P, 4),
-    SWM32_PIN(58, P5, P, 5),
-    SWM32_PIN(59, P6, P, 6),
-    SWM32_PIN(60, P7, P, 7),
-    SWM32_PIN(61, P8, P, 8),
-    SWM32_PIN(62, P9, P, 9),
-    SWM32_PIN(63, P10, P, 10),
-    SWM32_PIN(64, P11, P, 11),
-    SWM32_PIN(65, P12, P, 12),
-    SWM32_PIN(66, P13, P, 13),
-    SWM32_PIN(67, P14, P, 14),
-    SWM32_PIN(68, P15, P, 15),
-    SWM32_PIN(69, P16, P, 16),
-    SWM32_PIN(70, P17, P, 17),
-    SWM32_PIN(71, P18, P, 18),
-    SWM32_PIN(72, P19, P, 19),
-    SWM32_PIN(73, P20, P, 20),
-    SWM32_PIN(74, P21, P, 21),
-    SWM32_PIN(75, P22, P, 22),
-    SWM32_PIN(76, P23, P, 23),
-    SWM32_PIN(77, B0, B, 0),
-    SWM32_PIN(78, A0, A, 0),
-    SWM32_PIN(79, A1, A, 1),
-    SWM32_PIN(80, A2, A, 2),
-    SWM32_PIN(81, A3, A, 3),
-    SWM32_PIN(82, A4, A, 4),
-    SWM32_PIN(83, A5, A, 5),
-    SWM32_PIN(84, VSSIO, 0, 0),
-    SWM32_PIN(85, C1, C, 1),
-    SWM32_PIN(86, N19, N, 19),
-    SWM32_PIN(87, N18, N, 18),
-    SWM32_PIN(88, N17, N, 17),
-    SWM32_PIN(89, N16, N, 16),
-    SWM32_PIN(90, N15, N, 15),
-    SWM32_PIN(91, N8, N, 8),
-    SWM32_PIN(92, N7, N, 7),
-    SWM32_PIN(93, N6, N, 6),
-    SWM32_PIN(94, N5, N, 5),
-    SWM32_PIN(95, N4, N, 4),
-    SWM32_PIN(96, N3, N, 3),
-    SWM32_PIN(97, A9, A, 9),
-    SWM32_PIN(98, A10, A, 10),
-    SWM32_PIN(99, A11, A, 11),
-    SWM32_PIN(100, A12, A, 12)
-};
 #define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
 #define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
-static pin_t *get_pin(uint8_t pin)
+
+static const struct swm_pin_index *get_pin(uint8_t pin)
 {
 {
-    pin_t *index;
-    if (pin < ITEM_NUM(swm32_pin_map))
+    const struct swm_pin_index *index;
+
+    if (pin < ITEM_NUM(pins))
     {
     {
-        index = (pin_t *)&swm32_pin_map[pin];
-        if (index->port == GPIO0)
+        index = &pins[pin];
+        if (index->gpio == GPIO0)
             index = RT_NULL;
             index = RT_NULL;
     }
     }
     else
     else
     {
     {
         index = RT_NULL;
         index = RT_NULL;
     }
     }
+
     return index;
     return index;
-};
+}
 
 
-static void swm320_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
+static void swm_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
 {
 {
-    pin_t *index;
+    const struct swm_pin_index *index;
+
     index = get_pin(pin);
     index = get_pin(pin);
     if (index == RT_NULL)
     if (index == RT_NULL)
     {
     {
@@ -169,201 +257,206 @@ static void swm320_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
     }
     }
     if (value)
     if (value)
     {
     {
-        GPIO_SetBit(index->port, index->group_index);
+        GPIO_SetBit(index->gpio, index->pin);
     }
     }
     else
     else
     {
     {
-        GPIO_ClrBit(index->port, index->group_index);
+        GPIO_ClrBit(index->gpio, index->pin);
     }
     }
 }
 }
 
 
-static int swm320_pin_read(rt_device_t dev, rt_base_t pin)
+static int swm_pin_read(rt_device_t dev, rt_base_t pin)
 {
 {
-    pin_t *index;
+    const struct swm_pin_index *index;
+
     index = get_pin(pin);
     index = get_pin(pin);
     if (index == RT_NULL)
     if (index == RT_NULL)
     {
     {
         return PIN_LOW;
         return PIN_LOW;
     }
     }
-    return GPIO_GetBit(index->port, index->group_index);
+    return (int)GPIO_GetBit(index->gpio, index->pin);
 }
 }
 
 
-static void swm320_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
+static void swm_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
 {
 {
-    pin_t *index;
+    const struct swm_pin_index *index;
     int dir = 0;
     int dir = 0;
     int pull_up = 0;
     int pull_up = 0;
     int pull_down = 0;
     int pull_down = 0;
+
     index = get_pin(pin);
     index = get_pin(pin);
     if (index == RT_NULL)
     if (index == RT_NULL)
     {
     {
         return;
         return;
     }
     }
     /* Configure GPIO_InitStructure */
     /* Configure GPIO_InitStructure */
-    if (mode == PIN_MODE_OUTPUT)
+    switch (mode)
     {
     {
+    case PIN_MODE_OUTPUT:
         /* output setting */
         /* output setting */
         dir = 1;
         dir = 1;
-    }
-    else if (mode == PIN_MODE_INPUT)
-    {
+        break;
+    case PIN_MODE_INPUT:
         /* input setting: not pull. */
         /* input setting: not pull. */
         dir = 0;
         dir = 0;
-    }
-    else if (mode == PIN_MODE_INPUT_PULLUP)
-    {
+        break;
+    case PIN_MODE_INPUT_PULLUP:
         /* input setting: pull up. */
         /* input setting: pull up. */
         dir = 0;
         dir = 0;
         pull_up = 1;
         pull_up = 1;
-    }
-    else if (mode == PIN_MODE_INPUT_PULLDOWN)
-    {
+        break;
+    case PIN_MODE_INPUT_PULLDOWN:
         /* input setting: pull down. */
         /* input setting: pull down. */
         dir = 0;
         dir = 0;
         pull_down = 1;
         pull_down = 1;
-    }
-    else if (mode == PIN_MODE_OUTPUT_OD)
-    {
+        break;
+    case PIN_MODE_OUTPUT_OD:
         /* output setting: od. */
         /* output setting: od. */
         dir = 1;
         dir = 1;
         pull_up = 1;
         pull_up = 1;
+        break;
     }
     }
-    GPIO_Init(index->port, index->group_index, dir, pull_up, pull_down);
+
+    GPIO_Init(index->gpio, index->pin, dir, pull_up, pull_down);
 }
 }
 
 
-static rt_err_t swm320_pin_attach_irq(struct rt_device *device,
-                                      rt_int32_t pin,
-                                      rt_uint32_t mode,
-                                      pin_callback_t cb,
-                                      void *args)
+static rt_err_t swm_pin_attach_irq(struct rt_device *device,
+                                   rt_int32_t pin,
+                                   rt_uint32_t mode,
+                                   void (*hdr)(void *args),
+                                   void *args)
 {
 {
-    pin_t *index;
+    const struct swm_pin_index *index;
     rt_base_t level;
     rt_base_t level;
+
     index = get_pin(pin);
     index = get_pin(pin);
     if (index == RT_NULL)
     if (index == RT_NULL)
     {
     {
-        return RT_EINVAL;
+        return RT_ENOSYS;
     }
     }
-    level = rt_hw_interrupt_disable();
-    index->callback = cb;
-    index->callback_args = args;
-    index->irq_mode = mode;
 
 
+    level = rt_hw_interrupt_disable();
+    if (pin_irq_hdr_tab[pin].pin == pin &&
+        pin_irq_hdr_tab[pin].mode == mode &&
+        pin_irq_hdr_tab[pin].hdr == hdr &&
+        pin_irq_hdr_tab[pin].args == args)
+    {
+        rt_hw_interrupt_enable(level);
+        return RT_EOK;
+    }
+    pin_irq_hdr_tab[pin].pin = pin;
+    pin_irq_hdr_tab[pin].mode = mode;
+    pin_irq_hdr_tab[pin].hdr = hdr;
+    pin_irq_hdr_tab[pin].args = args;
     rt_hw_interrupt_enable(level);
     rt_hw_interrupt_enable(level);
     return RT_EOK;
     return RT_EOK;
 }
 }
 
 
-static rt_err_t swm320_pin_detach_irq(struct rt_device *device, rt_int32_t pin)
+static rt_err_t swm_pin_detach_irq(struct rt_device *device, rt_int32_t pin)
 {
 {
-    pin_t *index;
+    const struct swm_pin_index *index;
     rt_base_t level;
     rt_base_t level;
+
     index = get_pin(pin);
     index = get_pin(pin);
     if (index == RT_NULL)
     if (index == RT_NULL)
     {
     {
-        return RT_EINVAL;
+        return RT_ENOSYS;
     }
     }
+
     level = rt_hw_interrupt_disable();
     level = rt_hw_interrupt_disable();
-    index->callback = 0;
-    index->callback_args = 0;
-    index->irq_mode = 0;
+    pin_irq_hdr_tab[pin].mode = 0;
+    pin_irq_hdr_tab[pin].hdr = RT_NULL;
+    pin_irq_hdr_tab[pin].args = RT_NULL;
     rt_hw_interrupt_enable(level);
     rt_hw_interrupt_enable(level);
     return RT_EOK;
     return RT_EOK;
 }
 }
 
 
-static rt_err_t swm320_pin_irq_enable(struct rt_device *device,
-                                      rt_base_t pin,
-                                      rt_uint32_t enabled)
+static rt_err_t swm_pin_irq_enable(struct rt_device *device,
+                                   rt_base_t pin,
+                                   rt_uint32_t enabled)
 {
 {
-    pin_t *index;
+    const struct swm_pin_index *index;
     rt_base_t level = 0;
     rt_base_t level = 0;
+
     index = get_pin(pin);
     index = get_pin(pin);
     if (index == RT_NULL)
     if (index == RT_NULL)
     {
     {
-        return RT_EINVAL;
+        return RT_ENOSYS;
     }
     }
+
     if (enabled == PIN_IRQ_ENABLE)
     if (enabled == PIN_IRQ_ENABLE)
     {
     {
-        switch (index->irq_mode)
+        switch (pin_irq_hdr_tab[pin].mode)
         {
         {
         case PIN_IRQ_MODE_RISING:
         case PIN_IRQ_MODE_RISING:
-            GPIO_Init(index->port, index->group_index, 0, 0, 1);
-            EXTI_Init(index->port, index->group_index, EXTI_RISE_EDGE);
+            GPIO_Init(index->gpio, index->pin, 0, 0, 1);
+            EXTI_Init(index->gpio, index->pin, EXTI_RISE_EDGE);
             break;
             break;
         case PIN_IRQ_MODE_FALLING:
         case PIN_IRQ_MODE_FALLING:
-            GPIO_Init(index->port, index->group_index, 0, 1, 0);
-            EXTI_Init(index->port, index->group_index, EXTI_FALL_EDGE);
+            GPIO_Init(index->gpio, index->pin, 0, 1, 0);
+            EXTI_Init(index->gpio, index->pin, EXTI_FALL_EDGE);
             break;
             break;
         case PIN_IRQ_MODE_RISING_FALLING:
         case PIN_IRQ_MODE_RISING_FALLING:
-            GPIO_Init(index->port, index->group_index, 0, 1, 1);
-            EXTI_Init(index->port, index->group_index, EXTI_BOTH_EDGE);
+            GPIO_Init(index->gpio, index->pin, 0, 1, 1);
+            EXTI_Init(index->gpio, index->pin, EXTI_BOTH_EDGE);
             break;
             break;
         case PIN_IRQ_MODE_HIGH_LEVEL:
         case PIN_IRQ_MODE_HIGH_LEVEL:
-            GPIO_Init(index->port, index->group_index, 0, 0, 1);
-            EXTI_Init(index->port, index->group_index, EXTI_HIGH_LEVEL);
+            GPIO_Init(index->gpio, index->pin, 0, 0, 1);
+            EXTI_Init(index->gpio, index->pin, EXTI_HIGH_LEVEL);
             break;
             break;
         case PIN_IRQ_MODE_LOW_LEVEL:
         case PIN_IRQ_MODE_LOW_LEVEL:
-            GPIO_Init(index->port, index->group_index, 0, 1, 0);
-            EXTI_Init(index->port, index->group_index, EXTI_LOW_LEVEL);
+            GPIO_Init(index->gpio, index->pin, 0, 1, 0);
+            EXTI_Init(index->gpio, index->pin, EXTI_LOW_LEVEL);
             break;
             break;
         default:
         default:
-            rt_hw_interrupt_enable(level);
             return RT_EINVAL;
             return RT_EINVAL;
         }
         }
 
 
         level = rt_hw_interrupt_disable();
         level = rt_hw_interrupt_disable();
         NVIC_EnableIRQ(index->irq);
         NVIC_EnableIRQ(index->irq);
-        EXTI_Open(index->port, index->group_index);
+        EXTI_Open(index->gpio, index->pin);
         rt_hw_interrupt_enable(level);
         rt_hw_interrupt_enable(level);
     }
     }
     else if (enabled == PIN_IRQ_DISABLE)
     else if (enabled == PIN_IRQ_DISABLE)
     {
     {
+        level = rt_hw_interrupt_disable();
         NVIC_DisableIRQ(index->irq);
         NVIC_DisableIRQ(index->irq);
-        EXTI_Close(index->port, index->group_index);
+        EXTI_Close(index->gpio, index->pin);
+        rt_hw_interrupt_enable(level);
     }
     }
     else
     else
     {
     {
-        return RT_ENOSYS;
+        return -RT_ENOSYS;
     }
     }
     return RT_EOK;
     return RT_EOK;
 }
 }
 
 
-const static struct rt_pin_ops swm320_pin_ops =
-{
-    swm320_pin_mode,
-    swm320_pin_write,
-    swm320_pin_read,
-    swm320_pin_attach_irq,
-    swm320_pin_detach_irq,
-    swm320_pin_irq_enable,
-    RT_NULL,
-};
-
-int rt_hw_pin_init(void)
-{
-    int result;
-    result = rt_device_pin_register("pin", &swm320_pin_ops, RT_NULL);
-    return result;
-}
-INIT_BOARD_EXPORT(rt_hw_pin_init);
+const static struct rt_pin_ops swm_pin_ops =
+    {
+        .pin_mode = swm_pin_mode,
+        .pin_write = swm_pin_write,
+        .pin_read = swm_pin_read,
+        .pin_attach_irq = swm_pin_attach_irq,
+        .pin_detach_irq = swm_pin_detach_irq,
+        .pin_irq_enable = swm_pin_irq_enable};
 
 
-void GPIOA_Handler(void)
+static void rt_hw_pin_isr(GPIO_TypeDef *GPIOx)
 {
 {
     static int gpio[24];
     static int gpio[24];
     int index = 0;
     int index = 0;
     static int init = 0;
     static int init = 0;
-    pin_t *pin;
-    /* enter interrupt */
-    rt_interrupt_enter();
+    const struct swm_pin_index *pin;
+
     if (init == 0)
     if (init == 0)
     {
     {
         init = 1;
         init = 1;
-        for (pin = (pin_t *)&swm32_pin_map[1];
-                pin->package_index < ITEM_NUM(swm32_pin_map);
-                pin++)
+        for (pin = &pins[0];
+             pin->index < ITEM_NUM(pins);
+             pin++)
         {
         {
-            if (pin->port == GPIOA)
+            if (pin->gpio == GPIOx)
             {
             {
-                gpio[index] = pin->package_index;
+                gpio[index] = pin->index;
                 index++;
                 index++;
                 RT_ASSERT(index <= 24)
                 RT_ASSERT(index <= 24)
             }
             }
@@ -372,228 +465,64 @@ void GPIOA_Handler(void)
     for (index = 0; index < 24; index++)
     for (index = 0; index < 24; index++)
     {
     {
         pin = get_pin(gpio[index]);
         pin = get_pin(gpio[index]);
-        if (index != RT_NULL)
+        if (EXTI_State(pin->gpio, pin->pin))
         {
         {
-            if (EXTI_State(pin->port, pin->group_index))
+            EXTI_Clear(pin->gpio, pin->pin);
+            if (pin_irq_hdr_tab[pin->index].hdr)
             {
             {
-                EXTI_Clear(pin->port, pin->group_index);
-                if (pin->callback)
-                {
-                    pin->callback(pin->callback_args);
-                }
+                pin_irq_hdr_tab[pin->index].hdr(pin_irq_hdr_tab[pin->index].args);
             }
             }
         }
         }
     }
     }
-    /* leave interrupt */
+}
+
+void GPIOA_Handler(void)
+{
+    rt_interrupt_enter();
+    rt_hw_pin_isr(GPIOA);
     rt_interrupt_leave();
     rt_interrupt_leave();
 }
 }
 
 
 void GPIOB_Handler(void)
 void GPIOB_Handler(void)
 {
 {
-    static int gpio[24];
-    int index = 0;
-    static int init = 0;
-    pin_t *pin;
-    /* enter interrupt */
     rt_interrupt_enter();
     rt_interrupt_enter();
-    if (init == 0)
-    {
-        init = 1;
-        for (pin = (pin_t *)&swm32_pin_map[1];
-                pin->package_index < ITEM_NUM(swm32_pin_map);
-                pin++)
-        {
-            if (pin->port == GPIOB)
-            {
-                gpio[index] = pin->package_index;
-                index++;
-                RT_ASSERT(index <= 24)
-            }
-        }
-    }
-    for (index = 0; index < 24; index++)
-    {
-        pin = get_pin(gpio[index]);
-        if (index != RT_NULL)
-        {
-            if (EXTI_State(pin->port, pin->group_index))
-            {
-                EXTI_Clear(pin->port, pin->group_index);
-                if (pin->callback)
-                {
-                    pin->callback(pin->callback_args);
-                }
-            }
-        }
-    }
-    /* leave interrupt */
+    rt_hw_pin_isr(GPIOB);
     rt_interrupt_leave();
     rt_interrupt_leave();
 }
 }
 
 
 void GPIOC_Handler(void)
 void GPIOC_Handler(void)
 {
 {
-    static int gpio[24];
-    int index = 0;
-    static int init = 0;
-    pin_t *pin;
-    /* enter interrupt */
     rt_interrupt_enter();
     rt_interrupt_enter();
-    if (init == 0)
-    {
-        init = 1;
-        for (pin = (pin_t *)&swm32_pin_map[1];
-                pin->package_index < ITEM_NUM(swm32_pin_map);
-                pin++)
-        {
-            if (pin->port == GPIOC)
-            {
-                gpio[index] = pin->package_index;
-                index++;
-                RT_ASSERT(index <= 24)
-            }
-        }
-    }
-    for (index = 0; index < 24; index++)
-    {
-        pin = get_pin(gpio[index]);
-        if (index != RT_NULL)
-        {
-            if (EXTI_State(pin->port, pin->group_index))
-            {
-                EXTI_Clear(pin->port, pin->group_index);
-                if (pin->callback)
-                {
-                    pin->callback(pin->callback_args);
-                }
-            }
-        }
-    }
-    /* leave interrupt */
+    rt_hw_pin_isr(GPIOC);
     rt_interrupt_leave();
     rt_interrupt_leave();
 }
 }
 
 
 void GPIOM_Handler(void)
 void GPIOM_Handler(void)
 {
 {
-    static int gpio[24];
-    int index = 0;
-    static int init = 0;
-    pin_t *pin;
-    /* enter interrupt */
     rt_interrupt_enter();
     rt_interrupt_enter();
-    if (init == 0)
-    {
-        init = 1;
-        for (pin = (pin_t *)&swm32_pin_map[1];
-                pin->package_index < ITEM_NUM(swm32_pin_map);
-                pin++)
-        {
-            if (pin->port == GPIOM)
-            {
-                gpio[index] = pin->package_index;
-                index++;
-                RT_ASSERT(index <= 24)
-            }
-        }
-    }
-    for (index = 0; index < 24; index++)
-    {
-        pin = get_pin(gpio[index]);
-        if (index != RT_NULL)
-        {
-            if (EXTI_State(pin->port, pin->group_index))
-            {
-                EXTI_Clear(pin->port, pin->group_index);
-                if (pin->callback)
-                {
-                    pin->callback(pin->callback_args);
-                }
-            }
-        }
-    }
-    /* leave interrupt */
+    rt_hw_pin_isr(GPIOM);
     rt_interrupt_leave();
     rt_interrupt_leave();
 }
 }
 
 
 void GPION_Handler(void)
 void GPION_Handler(void)
 {
 {
-    static int gpio[24];
-    int index = 0;
-    static int init = 0;
-    pin_t *pin;
-    /* enter interrupt */
     rt_interrupt_enter();
     rt_interrupt_enter();
-    if (init == 0)
-    {
-        init = 1;
-        for (pin = (pin_t *)&swm32_pin_map[1];
-                pin->package_index < ITEM_NUM(swm32_pin_map);
-                pin++)
-        {
-            if (pin->port == GPION)
-            {
-                gpio[index] = pin->package_index;
-                index++;
-                RT_ASSERT(index <= 24)
-            }
-        }
-    }
-    for (index = 0; index < 24; index++)
-    {
-        pin = get_pin(gpio[index]);
-        if (index != RT_NULL)
-        {
-            if (EXTI_State(pin->port, pin->group_index))
-            {
-                EXTI_Clear(pin->port, pin->group_index);
-                if (pin->callback)
-                {
-                    pin->callback(pin->callback_args);
-                }
-            }
-        }
-    }
-    /* leave interrupt */
+    rt_hw_pin_isr(GPION);
     rt_interrupt_leave();
     rt_interrupt_leave();
 }
 }
 
 
 void GPIOP_Handler(void)
 void GPIOP_Handler(void)
 {
 {
-    static int gpio[24];
-    int index = 0;
-    static int init = 0;
-    pin_t *pin;
-    /* enter interrupt */
     rt_interrupt_enter();
     rt_interrupt_enter();
-    if (init == 0)
-    {
-        init = 1;
-        for (pin = (pin_t *)&swm32_pin_map[1];
-                pin->package_index < ITEM_NUM(swm32_pin_map);
-                pin++)
-        {
-            if (pin->port == GPIOP)
-            {
-                gpio[index] = pin->package_index;
-                index++;
-                RT_ASSERT(index <= 24)
-            }
-        }
-    }
-    for (index = 0; index < 24; index++)
-    {
-        pin = get_pin(gpio[index]);
-        if (index != RT_NULL)
-        {
-            if (EXTI_State(pin->port, pin->group_index))
-            {
-                EXTI_Clear(pin->port, pin->group_index);
-                if (pin->callback)
-                {
-                    pin->callback(pin->callback_args);
-                }
-            }
-        }
-    }
-    /* leave interrupt */
+    rt_hw_pin_isr(GPIOP);
     rt_interrupt_leave();
     rt_interrupt_leave();
 }
 }
+
+int rt_hw_pin_init(void)
+{
+    return rt_device_pin_register("pin", &swm_pin_ops, RT_NULL);
+}
+INIT_BOARD_EXPORT(rt_hw_pin_init);
+
+#endif /* BSP_USING_GPIO */
+#endif /* RT_USING_PIN */

+ 22 - 3
bsp/swm320-lq100/drivers/drv_gpio.h

@@ -6,11 +6,30 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-12-10     Zohar_Lee    first version
  * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          rewrite
  */
  */
 
 
-#ifndef DRV_GPIO_H__
-#define DRV_GPIO_H__
+#ifndef __DRV_GPIO_H__
+#define __DRV_GPIO_H__
+
+#include "board.h"
+
+#define __SWM_PIN(index, gpio, pin_index)                    \
+    {                                                        \
+        index, GPIO##gpio, PIN##pin_index, GPIO##gpio##_IRQn \
+    }
+#define GPIO0 ((GPIO_TypeDef *)(0))
+#define GPIO0_IRQn (GPIOA0_IRQn)
+
+struct swm_pin_index
+{
+    uint32_t index;
+    GPIO_TypeDef *gpio;
+    uint32_t pin;
+    IRQn_Type irq;
+};
+typedef struct swm_pin_index pin_t;
 
 
 int rt_hw_pin_init(void);
 int rt_hw_pin_init(void);
 
 
-#endif
+#endif /* __DRV_GPIO_H__ */

+ 190 - 196
bsp/swm320-lq100/drivers/drv_hwtimer.c

@@ -6,257 +6,251 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-12-10    Zohar_Lee    first version
  * 2018-12-10    Zohar_Lee    first version
+ * 2020-07-10    lik          format file
  */
  */
 
 
-#include <rthw.h>
-#include <rtthread.h>
-#include <rtdevice.h>
-#include <board.h>
+#include "drv_hwtimer.h"
 
 
-#define SWM320_HWTIMER_DEVICE(hwtimer) (struct swm320_hwtimer_dev *)(hwtimer)
+#ifdef RT_USING_HWTIMER
+#ifdef BSP_USING_TIM
 
 
-struct swm320_hwtimer_dev
+enum
 {
 {
-    rt_hwtimer_t parent;
-    TIMR_TypeDef *hwtimer_periph;
+#ifdef BSP_USING_TIM0
+    TIM0_INDEX,
+#endif
+#ifdef BSP_USING_TIM1
+    TIM1_INDEX,
+#endif
+#ifdef BSP_USING_TIM2
+    TIM2_INDEX,
+#endif
+#ifdef BSP_USING_TIM3
+    TIM3_INDEX,
+#endif
+#ifdef BSP_USING_TIM4
+    TIM4_INDEX,
+#endif
+#ifdef BSP_USING_TIM5
+    TIM5_INDEX,
+#endif
 };
 };
 
 
-#ifdef BSP_USING_HWTIMER0
-static struct swm320_hwtimer_dev hwtimer0;
-
-void TIMR0_Handler(void)
-{
-    TIMR_INTClr(TIMR0);
-    rt_device_hwtimer_isr(&hwtimer0.parent);
-    
-    if (HWTIMER_MODE_ONESHOT == hwtimer0.parent.mode)
+static struct swm_hwtimer_cfg hwtimer_cfg[] =
     {
     {
-        TIMR_Stop(hwtimer0.hwtimer_periph);
-    }  
-}
-#endif //BSP_USING_HWTIMER0
+#ifdef BSP_USING_TIM0
+        TIM0_CFG,
+#endif
+#ifdef BSP_USING_TIM1
+        TIM1_CFG,
+#endif
+#ifdef BSP_USING_TIM2
+        TIM2_CFG,
+#endif
+#ifdef BSP_USING_TIM3
+        TIM3_CFG,
+#endif
+#ifdef BSP_USING_TIM4
+        TIM4_CFG,
+#endif
+#ifdef BSP_USING_TIM5
+        TIM5_CFG,
+#endif
+};
 
 
-#ifdef BSP_USING_HWTIMER1
-static struct swm320_hwtimer_dev hwtimer1;
+static struct swm_hwtimer hwtimer_drv[sizeof(hwtimer_cfg) / sizeof(hwtimer_cfg[0])] = {0};
 
 
-void TIMR1_Handler(void)
+static void swm_timer_init(struct rt_hwtimer_device *timer_device, rt_uint32_t state)
 {
 {
-    TIMR_INTClr(TIMR1);
-    rt_device_hwtimer_isr(&hwtimer1.parent);
+    struct swm_hwtimer_cfg *cfg = RT_NULL;
+    RT_ASSERT(timer_device != RT_NULL);
 
 
-    if (HWTIMER_MODE_ONESHOT == hwtimer1.parent.mode)
+    if (state)
     {
     {
-        TIMR_Stop(hwtimer1.hwtimer_periph);
-    } 
+        cfg = timer_device->parent.user_data;
+        TIMR_Init(cfg->TIMRx, TIMR_MODE_TIMER, SystemCoreClock, 1);
+        timer_device->freq = SystemCoreClock;
+    }
 }
 }
-#endif //BSP_USING_HWTIMER1
-
-#ifdef BSP_USING_HWTIMER2
-static struct swm320_hwtimer_dev hwtimer2;
 
 
-void TIMR2_Handler(void)
+static rt_err_t swm_timer_start(rt_hwtimer_t *timer_device, rt_uint32_t cnt, rt_hwtimer_mode_t opmode)
 {
 {
-    TIMR_INTClr(TIMR2);
-    rt_device_hwtimer_isr(&hwtimer2.parent);
-    
-    if (HWTIMER_MODE_ONESHOT == hwtimer2.parent.mode)
-    {
-        TIMR_Stop(hwtimer2.hwtimer_periph);
-    } 
-}
-#endif //BSP_USING_HWTIMER2
-
-#ifdef BSP_USING_HWTIMER3
-static struct swm320_hwtimer_dev hwtimer3;
+    rt_err_t result = RT_EOK;
+    struct swm_hwtimer_cfg *cfg = RT_NULL;
+    RT_ASSERT(timer_device != RT_NULL);
+    cfg = timer_device->parent.user_data;
 
 
-void TIMR3_Handler(void)
-{
-    TIMR_INTClr(TIMR3);
-    rt_device_hwtimer_isr(&hwtimer3.parent);
-    
-    if (HWTIMER_MODE_ONESHOT == hwtimer3.parent.mode)
+    if (opmode == HWTIMER_MODE_ONESHOT)
     {
     {
-        TIMR_Stop(hwtimer3.hwtimer_periph);
+        /* set timer to single mode */
+        timer_device->mode = HWTIMER_MODE_ONESHOT;
     }
     }
-}
-#endif //BSP_USING_HWTIMER3
-
-#ifdef BSP_USING_HWTIMER4
-static struct swm320_hwtimer_dev hwtimer4;
-
-void TIMR4_Handler(void)
-{
-    TIMR_INTClr(TIMR4);
-    rt_device_hwtimer_isr(&hwtimer4.parent);
-    
-    if (HWTIMER_MODE_ONESHOT == hwtimer4.parent.mode)
+    else
     {
     {
-        TIMR_Stop(hwtimer4.hwtimer_periph);
+        timer_device->mode = HWTIMER_MODE_PERIOD;
     }
     }
-}
-#endif //BSP_USING_HWTIMER4
+    TIMR_SetPeriod(cfg->TIMRx, cnt);
+    TIMR_Stop(cfg->TIMRx);
+    TIMR_Start(cfg->TIMRx);
 
 
-#ifdef BSP_USING_HWTIMER5
-static struct swm320_hwtimer_dev hwtimer5;
+    return result;
+}
 
 
-void TIMR5_Handler(void)
+static void swm_timer_stop(rt_hwtimer_t *timer_device)
 {
 {
-    TIMR_INTClr(TIMR5);
-    rt_device_hwtimer_isr(&hwtimer5.parent);
-    
-    if (HWTIMER_MODE_ONESHOT == hwtimer5.parent.mode)
-    {
-        TIMR_Stop(hwtimer5.hwtimer_periph);
-    }
+    struct swm_hwtimer_cfg *cfg = RT_NULL;
+    RT_ASSERT(timer_device != RT_NULL);
+    cfg = timer_device->parent.user_data;
+
+    /* stop timer */
+    TIMR_Stop(cfg->TIMRx);
 }
 }
-#endif //BSP_USING_HWTIMER5
 
 
-static struct rt_hwtimer_info swm320_hwtimer_info =
+static rt_uint32_t swm_timer_count_get(rt_hwtimer_t *timer_device)
 {
 {
-    120000000,  /*时钟源为系统时钟*/
-    120000000, 
-    4294967295, /*32位计数器,2的32次方*/
-    HWTIMER_CNTMODE_DW
-};
+    struct swm_hwtimer_cfg *cfg = RT_NULL;
+    RT_ASSERT(timer_device != RT_NULL);
+    cfg = timer_device->parent.user_data;
 
 
-static void swm320_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state)
+    return TIMR_GetCurValue(cfg->TIMRx);
+}
+
+static rt_err_t swm_timer_ctrl(rt_hwtimer_t *timer_device, rt_uint32_t cmd, void *args)
 {
 {
-    struct swm320_hwtimer_dev *hwtimer = SWM320_HWTIMER_DEVICE(timer->parent.user_data);
+    struct swm_hwtimer_cfg *cfg = RT_NULL;
+    rt_err_t result = RT_EOK;
+    RT_ASSERT(timer_device != RT_NULL);
+    RT_ASSERT(args != RT_NULL);
+    cfg = timer_device->parent.user_data;
 
 
-    RT_ASSERT(hwtimer != RT_NULL);
+    switch (cmd)
+    {
+    case HWTIMER_CTRL_FREQ_SET:
+    {
+        rt_uint32_t freq;
+        freq = *(rt_uint32_t *)args;
 
 
-    if (1 == state)
+        TIMR_Init(cfg->TIMRx, TIMR_MODE_TIMER, SystemCoreClock / freq, 1);
+    }
+    break;
+    default:
     {
     {
-        TIMR_Init(hwtimer->hwtimer_periph,
-                  TIMR_MODE_TIMER,
-                  SystemCoreClock,
-                  1);
+        result = -RT_ENOSYS;
     }
     }
-    hwtimer->parent.freq = SystemCoreClock;
-    swm320_hwtimer_info.maxfreq = SystemCoreClock;
-    swm320_hwtimer_info.minfreq = SystemCoreClock;
+    break;
+    }
+
+    return result;
 }
 }
 
 
-static rt_err_t swm320_hwtimer_start(rt_hwtimer_t *timer,
-                                     rt_uint32_t cnt,
-                                     rt_hwtimer_mode_t mode)
-{
-    struct swm320_hwtimer_dev *hwtimer = SWM320_HWTIMER_DEVICE(timer->parent.user_data);
+static const struct rt_hwtimer_info _info = TIM_DEV_INFO_CONFIG;
 
 
-    RT_ASSERT(hwtimer != RT_NULL);
+static struct rt_hwtimer_ops swm_hwtimer_ops =
+    {
+        .init = swm_timer_init,
+        .start = swm_timer_start,
+        .stop = swm_timer_stop,
+        .count_get = swm_timer_count_get,
+        .control = swm_timer_ctrl};
 
 
-    TIMR_SetPeriod(hwtimer->hwtimer_periph, cnt);
-    TIMR_Start(hwtimer->hwtimer_periph);
+void rt_hw_hwtimer_isr(rt_hwtimer_t *timer_device)
+{
+    struct swm_hwtimer_cfg *cfg = RT_NULL;
+    RT_ASSERT(timer_device != RT_NULL);
+    cfg = timer_device->parent.user_data;
 
 
-    return RT_EOK;
+    TIMR_INTClr(cfg->TIMRx);
+    rt_device_hwtimer_isr(timer_device);
 }
 }
-
-static void swm320_hwtimer_stop(rt_hwtimer_t *timer)
+#ifdef BSP_USING_TIM0
+void TIMR0_Handler(void)
 {
 {
-    struct swm320_hwtimer_dev *hwtimer = SWM320_HWTIMER_DEVICE(timer->parent.user_data);
-
-    RT_ASSERT(hwtimer != RT_NULL);
-
-    TIMR_Stop(hwtimer->hwtimer_periph);
+    /* enter interrupt */
+    rt_interrupt_enter();
+    rt_hw_hwtimer_isr(&(hwtimer_drv[TIM0_INDEX].time_device));
+    /* leave interrupt */
+    rt_interrupt_leave();
 }
 }
+#endif //BSP_USING_TIM0
 
 
-static rt_uint32_t swm320_hwtimer_count_get(rt_hwtimer_t *timer)
+#ifdef BSP_USING_TIM1
+void TIMR1_Handler(void)
 {
 {
-    struct swm320_hwtimer_dev *hwtimer = SWM320_HWTIMER_DEVICE(timer->parent.user_data);
-    uint32_t hwtimer_count = 0;
+    /* enter interrupt */
+    rt_interrupt_enter();
+    rt_hw_hwtimer_isr(&(hwtimer_drv[TIM1_INDEX].time_device));
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+#endif //BSP_USING_TIM1
 
 
-    RT_ASSERT(hwtimer != RT_NULL);
+#ifdef BSP_USING_TIM2
+void TIMR2_Handler(void)
+{
+    /* enter interrupt */
+    rt_interrupt_enter();
+    rt_hw_hwtimer_isr(&(hwtimer_drv[TIM2_INDEX].time_device));
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+#endif //BSP_USING_TIM2
 
 
-    hwtimer_count = TIMR_GetCurValue(hwtimer->hwtimer_periph);
+#ifdef BSP_USING_TIM3
+void TIMR3_Handler(void)
+{
+    /* enter interrupt */
+    rt_interrupt_enter();
+    rt_hw_hwtimer_isr(&(hwtimer_drv[TIM3_INDEX].time_device));
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+#endif //BSP_USING_TIM3
 
 
-    return hwtimer_count;
+#ifdef BSP_USING_TIM4
+void TIMR4_Handler(void)
+{
+    /* enter interrupt */
+    rt_interrupt_enter();
+    rt_hw_hwtimer_isr(&(hwtimer_drv[TIM4_INDEX].time_device));
+    /* leave interrupt */
+    rt_interrupt_leave();
 }
 }
+#endif //BSP_USING_TIM4
 
 
-static rt_err_t swm320_hwtimer_control(rt_hwtimer_t *timer,
-                                       rt_uint32_t cmd,
-                                       void *args)
+#ifdef BSP_USING_TIM5
+void TIMR5_Handler(void)
 {
 {
-    rt_err_t ret = RT_EOK;
-    rt_uint32_t freq = 0;
-    struct swm320_hwtimer_dev *hwtimer = SWM320_HWTIMER_DEVICE(timer->parent.user_data);
+    /* enter interrupt */
+    rt_interrupt_enter();
+    rt_hw_hwtimer_isr(&(hwtimer_drv[TIM5_INDEX].time_device));
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+#endif //BSP_USING_TIM5
 
 
-    RT_ASSERT(hwtimer != RT_NULL);
+static int rt_hw_hwtimer_init(void)
+{
+    int i = 0;
+    int result = RT_EOK;
 
 
-    switch (cmd)
+    for (i = 0; i < sizeof(hwtimer_cfg) / sizeof(hwtimer_cfg[0]); i++)
     {
     {
-    case HWTIMER_CTRL_FREQ_SET:
-        freq = *(rt_uint32_t*)args;
-        if (freq != SystemCoreClock)
+        hwtimer_drv[i].cfg = &hwtimer_cfg[i];
+        hwtimer_drv[i].time_device.info = &_info;
+        hwtimer_drv[i].time_device.ops = &swm_hwtimer_ops;
+        if (rt_device_hwtimer_register(&hwtimer_drv[i].time_device, hwtimer_drv[i].cfg->name, hwtimer_drv[i].cfg) == RT_EOK)
         {
         {
-            ret = RT_EINVAL;
+            ;
+        }
+        else
+        {
+            result = -RT_ERROR;
         }
         }
-        break;
-    case HWTIMER_CTRL_STOP:
-        TIMR_Stop(hwtimer->hwtimer_periph);
-        break;
-    default:
-        ret = RT_EINVAL;
-        break;
     }
     }
 
 
-    return ret;
-}
-
-static struct rt_hwtimer_ops swm320_hwtimer_ops =
-{
-    swm320_hwtimer_init,
-    swm320_hwtimer_start,
-    swm320_hwtimer_stop,
-    swm320_hwtimer_count_get,
-    swm320_hwtimer_control
-};
-
-int rt_hw_hwtimer_init(void)
-{
-    rt_err_t ret = RT_EOK;
-
-#ifdef BSP_USING_HWTIMER0
-    hwtimer0.hwtimer_periph = TIMR0;
-    hwtimer0.parent.info = &swm320_hwtimer_info;
-    hwtimer0.parent.ops = &swm320_hwtimer_ops;
-    ret = rt_device_hwtimer_register(&hwtimer0.parent, "timer0", &hwtimer0);
-#endif //BSP_USING_HWTIMER0
-
-#ifdef BSP_USING_HWTIMER1
-    hwtimer1.hwtimer_periph = TIMR1;
-    hwtimer1.parent.info = &swm320_hwtimer_info;
-    hwtimer1.parent.ops = &swm320_hwtimer_ops;
-    ret = rt_device_hwtimer_register(&hwtimer1.parent, "timer1", &hwtimer1);
-#endif //BSP_USING_HWTIMER1
-
-#ifdef BSP_USING_HWTIMER2
-    hwtimer2.hwtimer_periph = TIMR2;
-    hwtimer2.parent.info = &swm320_hwtimer_info;
-    hwtimer2.parent.ops = &swm320_hwtimer_ops;
-    ret = rt_device_hwtimer_register(&hwtimer2.parent, "timer2", &hwtimer2);
-#endif //BSP_USING_HWTIMER2
-
-#ifdef BSP_USING_HWTIMER3
-    hwtimer3.hwtimer_periph = TIMR3;
-    hwtimer3.parent.info = &swm320_hwtimer_info;
-    hwtimer3.parent.ops = &swm320_hwtimer_ops;
-    ret = rt_device_hwtimer_register(&hwtimer3.parent, "timer3", &hwtimer3);
-#endif //BSP_USING_HWTIMER3
-
-#ifdef BSP_USING_HWTIMER4
-    hwtimer4.hwtimer_periph = TIMR4;
-    hwtimer4.parent.info = &swm320_hwtimer_info;
-    hwtimer4.parent.ops = &swm320_hwtimer_ops;
-    ret = rt_device_hwtimer_register(&hwtimer4.parent, "timer4", &hwtimer4);
-#endif //BSP_USING_HWTIMER4
-
-#ifdef BSP_USING_HWTIMER5
-    hwtimer5.hwtimer_periph = TIMR5;
-    hwtimer5.parent.info = &swm320_hwtimer_info;
-    hwtimer5.parent.ops = &swm320_hwtimer_ops;
-    ret = rt_device_hwtimer_register(&hwtimer5.parent, "timer5", &hwtimer5);
-#endif //BSP_USING_HWTIMER5
-
-    return ret;
+    return result;
 }
 }
 INIT_BOARD_EXPORT(rt_hw_hwtimer_init);
 INIT_BOARD_EXPORT(rt_hw_hwtimer_init);
+
+#endif /* BSP_USING_TIM */
+#endif /* RT_USING_HWTIMER */

+ 88 - 3
bsp/swm320-lq100/drivers/drv_hwtimer.h

@@ -6,11 +6,96 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-12-10     Zohar_Lee    first version
  * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          rewrite
  */
  */
 
 
-#ifndef DRV_HWTIMER_H__
-#define DRV_HWTIMER_H__
+#ifndef __DRV_HWTIMER_H__
+#define __DRV_HWTIMER_H__
+
+#include "board.h"
+
+struct swm_hwtimer_cfg
+{
+    char *name;
+    TIMR_TypeDef *TIMRx;
+};
+
+struct swm_hwtimer
+{
+    struct swm_hwtimer_cfg *cfg;
+    rt_hwtimer_t time_device;
+};
+
+#ifndef TIM_DEV_INFO_CONFIG
+#define TIM_DEV_INFO_CONFIG            \
+    {                                  \
+        .maxfreq = 120000000,          \
+        .minfreq = 120000000,          \
+        .maxcnt = 0xFFFFFFFF,          \
+        .cntmode = HWTIMER_CNTMODE_DW, \
+    }
+#endif /* TIM_DEV_INFO_CONFIG */
+
+#ifdef BSP_USING_TIM0
+#ifndef TIM0_CFG
+#define TIM0_CFG          \
+    {                     \
+        .name = "timer0", \
+        .TIMRx = TIMR0,   \
+    }
+#endif /* TIM0_CFG */
+#endif /* BSP_USING_TIM0 */
+
+#ifdef BSP_USING_TIM1
+#ifndef TIM1_CFG
+#define TIM1_CFG          \
+    {                     \
+        .name = "timer1", \
+        .TIMRx = TIMR1,   \
+    }
+#endif /* TIM1_CFG */
+#endif /* BSP_USING_TIM1 */
+
+#ifdef BSP_USING_TIM2
+#ifndef TIM2_CFG
+#define TIM2_CFG          \
+    {                     \
+        .name = "timer2", \
+        .TIMRx = TIMR2,   \
+    }
+#endif /* TIM2_CFG */
+#endif /* BSP_USING_TIM2 */
+
+#ifdef BSP_USING_TIM3
+#ifndef TIM3_CFG
+#define TIM3_CFG          \
+    {                     \
+        .name = "timer3", \
+        .TIMRx = TIMR3,   \
+    }
+#endif /* TIM3_CFG */
+#endif /* BSP_USING_TIM3 */
+
+#ifdef BSP_USING_TIM4
+#ifndef TIM4_CFG
+#define TIM4_CFG          \
+    {                     \
+        .name = "timer4", \
+        .TIMRx = TIMR4,   \
+    }
+#endif /* TIM4_CFG */
+#endif /* BSP_USING_TIM4 */
+
+#ifdef BSP_USING_TIM5
+#ifndef TIM5_CFG
+#define TIM5_CFG          \
+    {                     \
+        .name = "timer5", \
+        .TIMRx = TIMR5,   \
+    }
+#endif /* TIM5_CFG */
+#endif /* BSP_USING_TIM5 */
 
 
 int rt_hw_hwtimer_init(void);
 int rt_hw_hwtimer_init(void);
 
 
-#endif
+#endif /* __DRV_HWTIMER_H__ */

+ 0 - 70
bsp/swm320-lq100/drivers/drv_i2c.c

@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date           Author       Notes
- * 2018-05-31     ZYH          first version
- * 2018-12-10     Zohar_Lee    format file
- */
-
-#include <rthw.h>
-#include <rtthread.h>
-#include <rtdevice.h>
-#include <board.h>
-
-static void drv_set_sda(void *data, rt_int32_t state)
-{
-    rt_pin_mode(BSP_I2C_SDA, PIN_MODE_OUTPUT);
-    rt_pin_write(BSP_I2C_SDA, state);
-}
-
-static void drv_set_scl(void *data, rt_int32_t state)
-{
-    rt_pin_mode(BSP_I2C_SCL, PIN_MODE_OUTPUT);
-    rt_pin_write(BSP_I2C_SCL, state);
-}
-
-static rt_int32_t drv_get_sda(void *data)
-{
-    rt_pin_mode(BSP_I2C_SDA, PIN_MODE_INPUT_PULLUP);
-    return rt_pin_read(BSP_I2C_SDA);
-}
-
-static rt_int32_t drv_get_scl(void *data)
-{
-    rt_pin_mode(BSP_I2C_SCL, PIN_MODE_INPUT_PULLUP);
-    return rt_pin_read(BSP_I2C_SCL);
-}
-
-static void drv_udelay(rt_uint32_t us)
-{
-    int i = (SystemCoreClock / 4000000 * us);
-    while (i)
-    {
-        i--;
-    }
-}
-
-static const struct rt_i2c_bit_ops drv_bit_ops =
-{
-    RT_NULL,
-    drv_set_sda,
-    drv_set_scl,
-    drv_get_sda,
-    drv_get_scl,
-    drv_udelay,
-    1,
-    100
-};
-
-int rt_hw_i2c_init(void)
-{
-    static struct rt_i2c_bus_device i2c2_bus;
-    rt_memset((void *)&i2c2_bus, 0, sizeof(struct rt_i2c_bus_device));
-    i2c2_bus.priv = (void *)&drv_bit_ops;
-    rt_i2c_bit_add_bus(&i2c2_bus, BSP_I2C_BUS_NAME);
-    return RT_EOK;
-}
-INIT_DEVICE_EXPORT(rt_hw_i2c_init);

+ 0 - 16
bsp/swm320-lq100/drivers/drv_i2c.h

@@ -1,16 +0,0 @@
-/*
- * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date           Author       Notes
- * 2018-12-10     Zohar_Lee    first version
- */
-
-#ifndef DRV_I2C_H__
-#define DRV_I2C_H__
-
-int rt_hw_i2c_init(void);
-
-#endif

+ 0 - 77
bsp/swm320-lq100/drivers/drv_iwg.c

@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date           Author       Notes
- * 2018-12-10     Zohar_Lee    first version
- */
-
-#include <board.h>
-#include "rtthread.h"
-#include "rtdevice.h"
-
-static rt_err_t swm320_wdt_init(rt_watchdog_t *wdt)
-{
-    WDT_Init(WDT, SystemCoreClock / 2, WDT_MODE_INTERRUPT);
-
-    return RT_EOK;
-}
-
-static rt_err_t swm320_wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
-{
-    switch (cmd)
-    {
-    case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
-        *(uint32_t *)arg = WDT->LOAD;
-        break;
-    case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
-        WDT_Stop(WDT);
-        WDT->LOAD = SystemCoreClock / 1000 * (*(uint32_t *)arg);
-        break;
-    case RT_DEVICE_CTRL_WDT_GET_TIMELEFT:
-        *(uint32_t *)arg = WDT_GetValue(WDT);
-        break;
-    case RT_DEVICE_CTRL_WDT_KEEPALIVE:
-        WDT_Feed(WDT);
-        break;
-    case RT_DEVICE_CTRL_WDT_START:
-        WDT_Start(WDT);
-        break;
-    case RT_DEVICE_CTRL_WDT_STOP:
-        WDT_Stop(WDT);
-        break;
-    default:
-        break;
-    }
-
-    return RT_EOK;
-}
-
-rt_watchdog_t swm320_wdt;
-const static struct rt_watchdog_ops swm320_wdt_ops =
-{
-    swm320_wdt_init,
-    swm320_wdt_control
-};
-
-int rt_hw_wdt_init(void)
-{
-    rt_err_t result = RT_EOK;
-
-    swm320_wdt.ops = &swm320_wdt_ops;
-
-    result = rt_hw_watchdog_register(&swm320_wdt,
-                                     "wdt",
-                                     RT_DEVICE_FLAG_RDWR,
-                                     WDT);
-
-    return result;
-}
-INIT_BOARD_EXPORT(rt_hw_wdt_init);
-
-void WDT_Handler(void)
-{
-    WDT_INTClr(WDT);
-}

+ 0 - 16
bsp/swm320-lq100/drivers/drv_iwg.h

@@ -1,16 +0,0 @@
-/*
- * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date           Author       Notes
- * 2018-12-10     Zohar_Lee    first version
- */
-
-#ifndef DRV_IWG_H__
-#define DRV_IWG_H__
-
-int rt_hw_wdt_init(void);
-
-#endif

+ 27 - 0
bsp/swm320-lq100/drivers/drv_log.h

@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2018-11-15     SummerGift   first version
+ */
+
+/*
+ * NOTE: DO NOT include this file on the header file.
+ */
+
+#ifndef LOG_TAG
+#define DBG_TAG "drv"
+#else
+#define DBG_TAG LOG_TAG
+#endif /* LOG_TAG */
+
+#ifdef DRV_DEBUG
+#define DBG_LVL DBG_LOG
+#else
+#define DBG_LVL DBG_INFO
+#endif /* DRV_DEBUG */
+
+#include <rtdbg.h>

+ 33 - 78
bsp/swm320-lq100/drivers/drv_nor_flash.c

@@ -7,67 +7,44 @@
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-05-31     ZYH          first version
  * 2018-05-31     ZYH          first version
  * 2018-12-10     Zohar_Lee    format file
  * 2018-12-10     Zohar_Lee    format file
+ * 2020-07-10     lik          rewrite
  */
  */
 
 
-#include <rtdevice.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <SWM320.h>
+#include "drv_nor_flash.h"
 
 
-#define BLOCK_SIZE (64 * 1024)
-#define FLASH_SIZE (BSP_NOR_FLASH_SIZE)
-#define BLOCK_COUNTER (FLASH_SIZE / BLOCK_SIZE)
+#ifdef BSP_USING_NOR_FLASH
+
+#define DRV_DEBUG
+#define LOG_TAG "drv.norflash"
+#include <drv_log.h>
 
 
 static struct rt_mutex flash_lock;
 static struct rt_mutex flash_lock;
 
 
 /* RT-Thread MTD device interface */
 /* RT-Thread MTD device interface */
-static long swm320_read_id(struct rt_mtd_nor_device *device)
+static long swm_norflash_read_id(struct rt_mtd_nor_device *device)
 {
 {
     return 0xdeadbeef;
     return 0xdeadbeef;
 }
 }
 
 
-static rt_size_t swm320_read(struct rt_mtd_nor_device *device,
-                             rt_off_t position,
-                             rt_uint8_t *data,
-                             rt_size_t size)
+static rt_size_t swm_norflash_read(struct rt_mtd_nor_device *device,
+                                   rt_off_t position,
+                                   rt_uint8_t *data,
+                                   rt_uint32_t size)
 {
 {
-    int ret = rt_mutex_take(&flash_lock, RT_WAITING_FOREVER);
-    if (ret == -RT_ETIMEOUT)
-    {
-        rt_kprintf("Take mutex time out.\n");
-        return ret;
-    }
-    else if (ret == -RT_ERROR)
-    {
-        rt_kprintf("Take mutex error.\n");
-        return ret;
-    }
-
+    rt_mutex_take(&flash_lock, RT_WAITING_FOREVER);
     memcpy(data, ((const void *)(NORFLM_BASE + position)), size);
     memcpy(data, ((const void *)(NORFLM_BASE + position)), size);
     rt_mutex_release(&flash_lock);
     rt_mutex_release(&flash_lock);
     return size;
     return size;
 }
 }
 
 
-static rt_size_t swm320_write(struct rt_mtd_nor_device *device,
-                              rt_off_t position,
-                              const rt_uint8_t *data,
-                              rt_size_t size)
+static rt_size_t swm_norflash_write(struct rt_mtd_nor_device *device,
+                                    rt_off_t position,
+                                    const rt_uint8_t *data,
+                                    rt_uint32_t size)
 {
 {
     rt_size_t i;
     rt_size_t i;
     const rt_uint16_t *hwdata = (const rt_uint16_t *)data;
     const rt_uint16_t *hwdata = (const rt_uint16_t *)data;
-    int ret = rt_mutex_take(&flash_lock, RT_WAITING_FOREVER);
-    if (ret == -RT_ETIMEOUT)
-    {
-        rt_kprintf("Take mutex time out.\n");
-        return ret;
-    }
-    else if (ret == -RT_ERROR)
-    {
-        rt_kprintf("Take mutex error.\n");
-        return ret;
-    }
-
+    rt_mutex_take(&flash_lock, RT_WAITING_FOREVER);
     for (i = 0; i < size / 2; i++)
     for (i = 0; i < size / 2; i++)
     {
     {
         NORFL_Write(position, hwdata[i]);
         NORFL_Write(position, hwdata[i]);
@@ -77,45 +54,35 @@ static rt_size_t swm320_write(struct rt_mtd_nor_device *device,
     return size;
     return size;
 }
 }
 
 
-static rt_err_t swm320_erase_block(struct rt_mtd_nor_device *device,
-                                   rt_off_t offset,
-                                   rt_uint32_t length)
+static rt_err_t swm_norflash_erase_block(struct rt_mtd_nor_device *device,
+                                         rt_off_t offset,
+                                         rt_uint32_t length)
 {
 {
-    rt_err_t ret = rt_mutex_take(&flash_lock, RT_WAITING_FOREVER);
-    if (ret == -RT_ETIMEOUT)
-    {
-        rt_kprintf("Take mutex time out.\n");
-        return ret;
-    }
-    else if (ret == -RT_ERROR)
-    {
-        rt_kprintf("Take mutex error.\n");
-        return ret;
-    }
-    
+    rt_mutex_take(&flash_lock, RT_WAITING_FOREVER);
     NORFL_SectorErase(offset);
     NORFL_SectorErase(offset);
     rt_mutex_release(&flash_lock);
     rt_mutex_release(&flash_lock);
     return RT_EOK;
     return RT_EOK;
 }
 }
 
 
 const static struct rt_mtd_nor_driver_ops mtd_ops =
 const static struct rt_mtd_nor_driver_ops mtd_ops =
-{
-    swm320_read_id,
-    swm320_read,
-    swm320_write,
-    swm320_erase_block
-};
+    {
+        swm_norflash_read_id,
+        swm_norflash_read,
+        swm_norflash_write,
+        swm_norflash_erase_block};
 
 
-static rt_err_t hw_init()
+static struct rt_mtd_nor_device mtd;
+int rt_hw_norflash_init(void)
 {
 {
     NORFL_InitStructure NORFL_InitStruct;
     NORFL_InitStructure NORFL_InitStruct;
+
     PORT->PORTP_SEL0 = 0xAAAAAAAA; //PP0-23 => ADDR0-23
     PORT->PORTP_SEL0 = 0xAAAAAAAA; //PP0-23 => ADDR0-23
     PORT->PORTP_SEL1 = 0xAAAA;
     PORT->PORTP_SEL1 = 0xAAAA;
 
 
     PORT->PORTM_SEL0 = 0xAAAAAAAA; //PM0-15 => DATA15-0
     PORT->PORTM_SEL0 = 0xAAAAAAAA; //PM0-15 => DATA15-0
     PORT->PORTM_INEN = 0xFFFF;
     PORT->PORTM_INEN = 0xFFFF;
 
 
-    PORT->PORTM_SEL1 = 0x2AA; //PM16 => OEN, PM17 => WEN, PM18 => NORFL_CSN,PM19 => SDRAM_CSN, PM20 => SRAM_CSN, PM21 => SDRAM_CKE
+    PORT->PORTM_SEL1 = 0xAAA; //PM16 => OEN、PM17 => WEN、PM18 => NORFL_CSN、PM19 => SDRAM_CSN、PM20 => SRAM_CSN、PM21 => SDRAM_CKE
 
 
     NORFL_InitStruct.DataWidth = 16;
     NORFL_InitStruct.DataWidth = 16;
     NORFL_InitStruct.WELowPulseTime = 5;
     NORFL_InitStruct.WELowPulseTime = 5;
@@ -123,12 +90,7 @@ static rt_err_t hw_init()
     NORFL_InitStruct.OperFinishIEn = 0;
     NORFL_InitStruct.OperFinishIEn = 0;
     NORFL_InitStruct.OperTimeoutIEn = 0;
     NORFL_InitStruct.OperTimeoutIEn = 0;
     NORFL_Init(&NORFL_InitStruct);
     NORFL_Init(&NORFL_InitStruct);
-    return RT_EOK;
-}
-static struct rt_mtd_nor_device mtd;
-int rt_hw_norflash_init(void)
-{
-    hw_init();
+
     /* set page size and block size */
     /* set page size and block size */
     mtd.block_size = BLOCK_SIZE; /* 64kByte */
     mtd.block_size = BLOCK_SIZE; /* 64kByte */
     mtd.ops = &mtd_ops;
     mtd.ops = &mtd_ops;
@@ -148,11 +110,4 @@ int rt_hw_norflash_init(void)
 }
 }
 INIT_DEVICE_EXPORT(rt_hw_norflash_init);
 INIT_DEVICE_EXPORT(rt_hw_norflash_init);
 
 
-#ifdef RT_USING_FINSH
-#include <finsh.h>
-void nor_erase(void)
-{
-    NORFL_ChipErase();
-}
-MSH_CMD_EXPORT(nor_erase, erase all block in SPI flash);
-#endif
+#endif /* BSP_USING_NOR_FLASH */

+ 7 - 0
bsp/swm320-lq100/drivers/drv_nor_flash.h

@@ -6,11 +6,18 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-12-10     Zohar_Lee    first version
  * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          rewrite
  */
  */
 
 
 #ifndef DRV_NOR_FLASH_H__
 #ifndef DRV_NOR_FLASH_H__
 #define DRV_NOR_FLASH_H__
 #define DRV_NOR_FLASH_H__
 
 
+#include "board.h"
+
+#define BLOCK_SIZE (64 * 1024)
+#define FLASH_SIZE (BSP_NOR_FLASH_SIZE)
+#define BLOCK_COUNTER (FLASH_SIZE / BLOCK_SIZE)
+
 int rt_hw_norflash_init(void);
 int rt_hw_norflash_init(void);
 
 
 #endif
 #endif

+ 176 - 133
bsp/swm320-lq100/drivers/drv_pwm.c

@@ -6,185 +6,228 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-12-10     Zohar_Lee    first version
  * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          format file
  */
  */
 
 
-#include <rthw.h>
-#include <rtthread.h>
-#include <rtdevice.h>
-#include <board.h>
+#include "drv_pwm.h"
 
 
-#define SWM320_PWM_DEVICE(pwm) (struct swm320_pwm_dev *)(pwm)
+#ifdef RT_USING_PWM
+#ifdef BSP_USING_PWM
 
 
-#define SWM320_PWM_TIMER_SET(time) ((time) / 1000.0 * 120)
+//#define DRV_DEBUG
+#define LOG_TAG "drv.pwm"
+#include <drv_log.h>
 
 
-struct swm320_pwm_dev
-{
-    struct rt_device_pwm parent;
-    PWM_TypeDef *pwm_periph;
+#define MIN_PERIOD 2
+#define MIN_PULSE 1
+
+static struct swm_pwm_cfg pwm_cfg[] =
+    {
+#ifdef BSP_USING_PWM0
+        PWM0_CFG,
+#endif
+#ifdef BSP_USING_PWM1
+        PWM1_CFG,
+#endif
+#ifdef BSP_USING_PWM2
+        PWM2_CFG,
+#endif
+#ifdef BSP_USING_PWM3
+        PWM3_CFG,
+#endif
+#ifdef BSP_USING_PWM4
+        PWM4_CFG,
+#endif
+#ifdef BSP_USING_PWM5
+        PWM5_CFG,
+#endif
 };
 };
 
 
-static rt_err_t swm320_pwm_enable(void *user_data,
-                                  struct rt_pwm_configuration *cfg,
-                                  rt_bool_t enable)
+static struct swm_pwm pwm_drv[sizeof(pwm_cfg) / sizeof(pwm_cfg[0])] = {0};
+
+static rt_err_t swm_pwm_control(struct rt_device_pwm *pwm_device, int cmd, void *arg);
+static struct rt_pwm_ops pwm_ops =
+    {
+        swm_pwm_control};
+
+static rt_err_t swm_pwm_enable(struct rt_device_pwm *pwm_device, struct rt_pwm_configuration *configuration, rt_bool_t enable)
 {
 {
-    rt_err_t ret = RT_EOK;
+    struct swm_pwm_cfg *cfg = RT_NULL;
+    RT_ASSERT(pwm_device != RT_NULL);
+    cfg = pwm_device->parent.user_data;
 
 
-    if (RT_TRUE == enable)
+    if (!enable)
     {
     {
-        if (2 == cfg->channel)
-        {
-            PWM_Start((PWM_TypeDef *)user_data, 1, 1);
-        }
-        if (1 == cfg->channel)
-        {
-            PWM_Start((PWM_TypeDef *)user_data, 0, 1);
-        }
-        if (0 == cfg->channel)
+        if (PWM_CH_A == configuration->channel)
         {
         {
-            PWM_Start((PWM_TypeDef *)user_data, 1, 0);
+            PWM_Stop(cfg->PWMx, 1, 0);
         }
         }
-        if (3 == cfg->channel)
+        if (PWM_CH_B == configuration->channel)
         {
         {
-            PWM_Start((PWM_TypeDef *)user_data, 0, 0);
+            PWM_Stop(cfg->PWMx, 0, 1);
         }
         }
     }
     }
-    else if (RT_FALSE == enable)
+    else
     {
     {
-        if (2 == cfg->channel)
-        {
-            PWM_Stop((PWM_TypeDef *)user_data, 1, 1);
-        }
-        if (1 == cfg->channel)
-        {
-            PWM_Stop((PWM_TypeDef *)user_data, 0, 1);
-        }
-        if (0 == cfg->channel)
+        if (PWM_CH_A == configuration->channel)
         {
         {
-            PWM_Stop((PWM_TypeDef *)user_data, 1, 0);
+            PWM_Start(cfg->PWMx, 1, 0);
         }
         }
-        if (3 == cfg->channel)
+        if (PWM_CH_B == configuration->channel)
         {
         {
-            PWM_Stop((PWM_TypeDef *)user_data, 0, 0);
+            PWM_Start(cfg->PWMx, 0, 1);
         }
         }
     }
     }
-    else
+
+    return RT_EOK;
+}
+
+static rt_err_t swm_pwm_get(struct rt_device_pwm *pwm_device, struct rt_pwm_configuration *configuration)
+{
+    rt_uint64_t tim_clock;
+    tim_clock = SystemCoreClock / 8;
+
+    struct swm_pwm_cfg *cfg = RT_NULL;
+    RT_ASSERT(pwm_device != RT_NULL);
+    cfg = pwm_device->parent.user_data;
+
+    /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */
+    tim_clock /= 1000000UL;
+    configuration->period = PWM_GetCycle(cfg->PWMx, configuration->channel) * 1000UL / tim_clock;
+    configuration->pulse = PWM_GetHDuty(cfg->PWMx, configuration->channel) * 1000UL / tim_clock;
+
+    return RT_EOK;
+}
+
+static rt_err_t swm_pwm_set(struct rt_device_pwm *pwm_device, struct rt_pwm_configuration *configuration)
+{
+    rt_uint32_t period, pulse;
+    rt_uint64_t tim_clock;
+    tim_clock = SystemCoreClock / 8;
+
+    struct swm_pwm_cfg *cfg = RT_NULL;
+    RT_ASSERT(pwm_device != RT_NULL);
+    cfg = pwm_device->parent.user_data;
+
+    /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */
+    /* when SystemCoreClock = 120MHz, configuration->period max 4.369ms */
+    /* when SystemCoreClock = 20MHz, configuration->period max 26.214ms */
+    tim_clock /= 1000000UL;
+    period = (unsigned long long)configuration->period * tim_clock / 1000ULL;
+    pulse = (unsigned long long)configuration->pulse * tim_clock / 1000ULL;
+    if (period < MIN_PERIOD)
+    {
+        period = MIN_PERIOD;
+    }
+    if (pulse < MIN_PULSE)
     {
     {
-        ret = RT_ERROR;
+        pulse = MIN_PULSE;
     }
     }
+    PWM_SetCycle(cfg->PWMx, configuration->channel, period);
+    PWM_SetHDuty(cfg->PWMx, configuration->channel, pulse);
 
 
-    return ret;
+    return RT_EOK;
 }
 }
 
 
-static rt_err_t swm320_pwm_control(struct rt_device_pwm *device,
-                                   int cmd,
-                                   void *arg)
+static rt_err_t swm_pwm_control(struct rt_device_pwm *pwm_device, int cmd, void *arg)
 {
 {
-    rt_err_t ret = RT_EOK;
-    struct swm320_pwm_dev *pwm = SWM320_PWM_DEVICE(device->parent.user_data);
-    struct rt_pwm_configuration *cfg = (struct rt_pwm_configuration *)arg;
+    RT_ASSERT(pwm_device != RT_NULL);
 
 
-    RT_ASSERT(pwm != RT_NULL);
+    struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg;
 
 
     switch (cmd)
     switch (cmd)
     {
     {
     case PWM_CMD_ENABLE:
     case PWM_CMD_ENABLE:
-
-        ret = swm320_pwm_enable((void *)pwm->pwm_periph, cfg, RT_TRUE);
-        break;
+        return swm_pwm_enable(pwm_device, configuration, RT_TRUE);
     case PWM_CMD_DISABLE:
     case PWM_CMD_DISABLE:
-
-        ret = swm320_pwm_enable((void *)pwm->pwm_periph, cfg, RT_FALSE);
-        break;
+        return swm_pwm_enable(pwm_device, configuration, RT_FALSE);
     case PWM_CMD_SET:
     case PWM_CMD_SET:
-        PWM_SetHDuty(pwm->pwm_periph,
-                     cfg->channel,
-                     SWM320_PWM_TIMER_SET(cfg->pulse));
-        PWM_SetCycle(pwm->pwm_periph,
-                     cfg->channel,
-                     SWM320_PWM_TIMER_SET(cfg->period));
-        break;
+        return swm_pwm_set(pwm_device, configuration);
     case PWM_CMD_GET:
     case PWM_CMD_GET:
-        cfg->pulse = PWM_GetHDuty(pwm->pwm_periph, cfg->channel);
-        break;
+        return swm_pwm_get(pwm_device, configuration);
     default:
     default:
-        break;
+        return RT_EINVAL;
     }
     }
-
-    return ret;
 }
 }
 
 
-const static struct rt_pwm_ops swm320_pwm_ops =
-{
-    swm320_pwm_control
-};
-
 int rt_hw_pwm_init(void)
 int rt_hw_pwm_init(void)
 {
 {
-    rt_err_t ret = RT_EOK;
-    PWM_InitStructure PWM_initStruct;
-
-    PWM_initStruct.clk_div = PWM_CLKDIV_1; /* F_PWM = 120M/1 = 120M */
-    PWM_initStruct.mode = PWM_MODE_INDEP;  /* A路和B路独立输出 */
-    PWM_initStruct.cycleA = SWM320_PWM_TIMER_SET(1000);
-    PWM_initStruct.hdutyA = SWM320_PWM_TIMER_SET(500);
-    PWM_initStruct.initLevelA = 1;
-    PWM_initStruct.cycleB = SWM320_PWM_TIMER_SET(1000);
-    PWM_initStruct.hdutyB = SWM320_PWM_TIMER_SET(250);
-    PWM_initStruct.initLevelB = 1;
-    PWM_initStruct.HEndAIEn = 0;
-    PWM_initStruct.NCycleAIEn = 0;
-    PWM_initStruct.HEndBIEn = 0;
-    PWM_initStruct.NCycleBIEn = 0;
+    int i = 0;
+    int result = RT_EOK;
 
 
-#ifdef BSP_USING_PWM0
-    static struct swm320_pwm_dev pwm_dev0;
-    pwm_dev0.pwm_periph = PWM0;
-    PWM_Init(pwm_dev0.pwm_periph, &PWM_initStruct);
-    PORT_Init(PORTA, PIN4, FUNMUX0_PWM0A_OUT, 0);
-    PORT_Init(PORTA, PIN10, FUNMUX0_PWM0B_OUT, 0);
-    ret = rt_device_pwm_register(&pwm_dev0.parent,
-                                 "pwm0",
-                                 &swm320_pwm_ops,
-                                 &pwm_dev0);
+    for (i = 0; i < sizeof(pwm_cfg) / sizeof(pwm_cfg[0]); i++)
+    {
+        pwm_drv[i].cfg = &pwm_cfg[i];
 
 
+        if (pwm_drv[i].cfg->PWMx == PWM0)
+        {
+#ifdef BSP_USING_PWM0A
+            PORT_Init(PORTC, PIN2, FUNMUX0_PWM0A_OUT, 0);
 #endif
 #endif
-
-#ifdef BSP_USING_PWM1
-    static struct swm320_pwm_dev pwm_dev1;
-    pwm_dev1.pwm_periph = PWM1;
-    PWM_Init(pwm_dev1.pwm_periph, &PWM_initStruct);
-    PORT_Init(PORTA, PIN5, FUNMUX1_PWM1A_OUT, 0);
-    PORT_Init(PORTA, PIN9, FUNMUX1_PWM1B_OUT, 0);
-    ret = rt_device_pwm_register(&pwm_dev1.parent,
-                                 "pwm1",
-                                 &swm320_pwm_ops,
-                                 &pwm_dev1);
+#ifdef BSP_USING_PWM0B
+            PORT_Init(PORTC, PIN4, FUNMUX0_PWM0B_OUT, 0);
 #endif
 #endif
-
-#ifdef BSP_USING_PWM2
-    static struct swm320_pwm_dev pwm_dev2;
-    pwm_dev2.pwm_periph = PWM2;
-    PWM_Init(pwm_dev2.pwm_periph, &PWM_initStruct);
-    PORT_Init(PORTP, PIN0, FUNMUX0_PWM2A_OUT, 0);
-    PORT_Init(PORTP, PIN2, FUNMUX0_PWM2B_OUT, 0);
-    ret = rt_device_pwm_register(&pwm_dev2.parent,
-                                 "pwm2",
-                                 &swm320_pwm_ops,
-                                 &pwm_dev2);
+        }
+        else if (pwm_drv[i].cfg->PWMx == PWM1)
+        {
+#ifdef BSP_USING_PWM1A
+            PORT_Init(PORTC, PIN3, FUNMUX1_PWM1A_OUT, 0);
+#endif
+#ifdef BSP_USING_PWM1B
+            PORT_Init(PORTC, PIN5, FUNMUX1_PWM1B_OUT, 0);
 #endif
 #endif
+        }
+        else if (pwm_drv[i].cfg->PWMx == PWM2)
+        {
+#ifdef BSP_USING_PWM2A
+            PORT_Init(PORTN, PIN4, FUNMUX0_PWM2A_OUT, 0);
+#endif
+#ifdef BSP_USING_PWM2B
+            PORT_Init(PORTN, PIN6, FUNMUX0_PWM2B_OUT, 0);
+#endif
+        }
+        else if (pwm_drv[i].cfg->PWMx == PWM3)
+        {
+#ifdef BSP_USING_PWM3A
+            PORT_Init(PORTN, PIN3, FUNMUX1_PWM3A_OUT, 0);
+#endif
+#ifdef BSP_USING_PWM3B
+            PORT_Init(PORTN, PIN5, FUNMUX1_PWM3B_OUT, 0);
+#endif
+        }
+        else if (pwm_drv[i].cfg->PWMx == PWM4)
+        {
+#ifdef BSP_USING_PWM4A
+            PORT_Init(PORTN, PIN8, FUNMUX0_PWM4A_OUT, 0);
+#endif
+#ifdef BSP_USING_PWM4B
+            PORT_Init(PORTN, PIN10, FUNMUX0_PWM4B_OUT, 0);
+#endif
+        }
+        else if (pwm_drv[i].cfg->PWMx == PWM5)
+        {
+#ifdef BSP_USING_PWM5A
+            PORT_Init(PORTN, PIN7, FUNMUX1_PWM5A_OUT, 0);
+#endif
+#ifdef BSP_USING_PWM5B
+            PORT_Init(PORTN, PIN9, FUNMUX1_PWM5B_OUT, 0);
+#endif
+        }
 
 
-#ifdef BSP_USING_PWM3
-    static struct swm320_pwm_dev pwm_dev3;
-    pwm_dev3.pwm_periph = PWM3;
-    PWM_Init(pwm_dev3.pwm_periph, &PWM_initStruct);
-    PORT_Init(PORTP, PIN1, FUNMUX1_PWM3A_OUT, 0);
-    PORT_Init(PORTP, PIN3, FUNMUX1_PWM3B_OUT, 0);
-    ret = rt_device_pwm_register(&pwm_dev3.parent,
-                                 "pwm3",
-                                 &swm320_pwm_ops,
-                                 &pwm_dev3);
-#endif
-
-    return ret;
+        PWM_Init(pwm_drv[i].cfg->PWMx, &(pwm_drv[i].cfg->pwm_initstruct));
+        if (rt_device_pwm_register(&pwm_drv[i].pwm_device, pwm_drv[i].cfg->name, &pwm_ops, pwm_drv[i].cfg) == RT_EOK)
+        {
+            LOG_D("%s register success", pwm_drv[i].cfg->name);
+        }
+        else
+        {
+            LOG_E("%s register failed", pwm_drv[i].cfg->name);
+            result = -RT_ERROR;
+        }
+    }
+    return result;
 }
 }
 INIT_DEVICE_EXPORT(rt_hw_pwm_init);
 INIT_DEVICE_EXPORT(rt_hw_pwm_init);
+
+#endif /* BSP_USING_PWM */
+#endif /* RT_USING_PWM */

+ 151 - 3
bsp/swm320-lq100/drivers/drv_pwm.h

@@ -6,11 +6,159 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-12-10     Zohar_Lee    first version
  * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          rewrite
  */
  */
 
 
-#ifndef DRV_PWM_H__
-#define DRV_PWM_H__
+#ifndef __DRV_PWM_H__
+#define __DRV_PWM_H__
+
+#include "board.h"
+
+struct swm_pwm_cfg
+{
+    const char *name;
+    PWM_TypeDef *PWMx;
+    PWM_InitStructure pwm_initstruct;
+};
+
+struct swm_pwm
+{
+    struct swm_pwm_cfg *cfg;
+    struct rt_device_pwm pwm_device;
+};
+
+#ifdef BSP_USING_PWM0
+#ifndef PWM0_CFG
+#define PWM0_CFG                                \
+    {                                           \
+        .name = "pwm0",                         \
+        .PWMx = PWM0,                           \
+        .pwm_initstruct.clk_div = PWM_CLKDIV_8, \
+        .pwm_initstruct.mode = PWM_MODE_INDEP,  \
+        .pwm_initstruct.cycleA = 10000,         \
+        .pwm_initstruct.hdutyA = 5000,          \
+        .pwm_initstruct.initLevelA = 1,         \
+        .pwm_initstruct.cycleB = 10000,         \
+        .pwm_initstruct.hdutyB = 5000,          \
+        .pwm_initstruct.initLevelB = 1,         \
+        .pwm_initstruct.HEndAIEn = 0,           \
+        .pwm_initstruct.NCycleAIEn = 0,         \
+        .pwm_initstruct.HEndBIEn = 0,           \
+        .pwm_initstruct.NCycleBIEn = 0,         \
+    }
+#endif /* PWM0_CFG */
+#endif /* BSP_USING_PWM0 */
+
+#ifdef BSP_USING_PWM1
+#ifndef PWM1_CFG
+#define PWM1_CFG                                \
+    {                                           \
+        .name = "pwm1",                         \
+        .PWMx = PWM1,                           \
+        .pwm_initstruct.clk_div = PWM_CLKDIV_8, \
+        .pwm_initstruct.mode = PWM_MODE_INDEP,  \
+        .pwm_initstruct.cycleA = 10000,         \
+        .pwm_initstruct.hdutyA = 5000,          \
+        .pwm_initstruct.initLevelA = 1,         \
+        .pwm_initstruct.cycleB = 10000,         \
+        .pwm_initstruct.hdutyB = 5000,          \
+        .pwm_initstruct.initLevelB = 1,         \
+        .pwm_initstruct.HEndAIEn = 0,           \
+        .pwm_initstruct.NCycleAIEn = 0,         \
+        .pwm_initstruct.HEndBIEn = 0,           \
+        .pwm_initstruct.NCycleBIEn = 0,         \
+    }
+#endif /* PWM1_CFG */
+#endif /* BSP_USING_PWM1 */
+
+#ifdef BSP_USING_PWM2
+#ifndef PWM2_CFG
+#define PWM2_CFG                                \
+    {                                           \
+        .name = "pwm2",                         \
+        .PWMx = PWM2,                           \
+        .pwm_initstruct.clk_div = PWM_CLKDIV_8, \
+        .pwm_initstruct.mode = PWM_MODE_INDEP,  \
+        .pwm_initstruct.cycleA = 10000,         \
+        .pwm_initstruct.hdutyA = 5000,          \
+        .pwm_initstruct.initLevelA = 1,         \
+        .pwm_initstruct.cycleB = 10000,         \
+        .pwm_initstruct.hdutyB = 5000,          \
+        .pwm_initstruct.initLevelB = 1,         \
+        .pwm_initstruct.HEndAIEn = 0,           \
+        .pwm_initstruct.NCycleAIEn = 0,         \
+        .pwm_initstruct.HEndBIEn = 0,           \
+        .pwm_initstruct.NCycleBIEn = 0,         \
+    }
+#endif /* PWM2_CFG */
+#endif /* BSP_USING_PWM2 */
+
+#ifdef BSP_USING_PWM3
+#ifndef PWM3_CFG
+#define PWM3_CFG                                \
+    {                                           \
+        .name = "pwm3",                         \
+        .PWMx = PWM3,                           \
+        .pwm_initstruct.clk_div = PWM_CLKDIV_8, \
+        .pwm_initstruct.mode = PWM_MODE_INDEP,  \
+        .pwm_initstruct.cycleA = 10000,         \
+        .pwm_initstruct.hdutyA = 5000,          \
+        .pwm_initstruct.initLevelA = 1,         \
+        .pwm_initstruct.cycleB = 10000,         \
+        .pwm_initstruct.hdutyB = 5000,          \
+        .pwm_initstruct.initLevelB = 1,         \
+        .pwm_initstruct.HEndAIEn = 0,           \
+        .pwm_initstruct.NCycleAIEn = 0,         \
+        .pwm_initstruct.HEndBIEn = 0,           \
+        .pwm_initstruct.NCycleBIEn = 0,         \
+    }
+#endif /* PWM3_CFG */
+#endif /* BSP_USING_PWM3 */
+
+#ifdef BSP_USING_PWM4
+#ifndef PWM4_CFG
+#define PWM4_CFG                                \
+    {                                           \
+        .name = "pwm4",                         \
+        .PWMx = PWM4,                           \
+        .pwm_initstruct.clk_div = PWM_CLKDIV_8, \
+        .pwm_initstruct.mode = PWM_MODE_INDEP,  \
+        .pwm_initstruct.cycleA = 10000,         \
+        .pwm_initstruct.hdutyA = 5000,          \
+        .pwm_initstruct.initLevelA = 1,         \
+        .pwm_initstruct.cycleB = 10000,         \
+        .pwm_initstruct.hdutyB = 5000,          \
+        .pwm_initstruct.initLevelB = 1,         \
+        .pwm_initstruct.HEndAIEn = 0,           \
+        .pwm_initstruct.NCycleAIEn = 0,         \
+        .pwm_initstruct.HEndBIEn = 0,           \
+        .pwm_initstruct.NCycleBIEn = 0,         \
+    }
+#endif /* PWM4_CFG */
+#endif /* BSP_USING_PWM4 */
+
+#ifdef BSP_USING_PWM5
+#ifndef PWM5_CFG
+#define PWM5_CFG                                \
+    {                                           \
+        .name = "pwm5",                         \
+        .PWMx = PWM5,                           \
+        .pwm_initstruct.clk_div = PWM_CLKDIV_8, \
+        .pwm_initstruct.mode = PWM_MODE_INDEP,  \
+        .pwm_initstruct.cycleA = 10000,         \
+        .pwm_initstruct.hdutyA = 5000,          \
+        .pwm_initstruct.initLevelA = 1,         \
+        .pwm_initstruct.cycleB = 10000,         \
+        .pwm_initstruct.hdutyB = 5000,          \
+        .pwm_initstruct.initLevelB = 1,         \
+        .pwm_initstruct.HEndAIEn = 0,           \
+        .pwm_initstruct.NCycleAIEn = 0,         \
+        .pwm_initstruct.HEndBIEn = 0,           \
+        .pwm_initstruct.NCycleBIEn = 0,         \
+    }
+#endif /* PWM5_CFG */
+#endif /* BSP_USING_PWM5 */
 
 
 int rt_hw_pwm_init(void);
 int rt_hw_pwm_init(void);
 
 
-#endif
+#endif /* __DRV_PWM_H__ */

+ 99 - 111
bsp/swm320-lq100/drivers/drv_rtc.c

@@ -6,26 +6,19 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-12-10     Zohar_Lee    first version
  * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          format file
  */
  */
 
 
-#include <rthw.h>
-#include <rtthread.h>
-#include <rtdevice.h>
-#include <board.h>
-#include <string.h>
+#include "drv_rtc.h"
 #include <sys/time.h>
 #include <sys/time.h>
 
 
-/**
- * This function will get the weed day from a date.
- *
- * @param year the year of time
- * @param month the month of time
- * @param date the date of time
- *
- * @return the week day 0 ~ 6 : sun ~ sat
- *
- * @note No
- */
+#ifdef RT_USING_RTC
+#ifdef BSP_USING_RTC
+
+//#define DRV_DEBUG
+#define LOG_TAG "drv.rtc"
+#include <drv_log.h>
+
 static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
 static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
 {
 {
     uint32_t i, cnt = 0;
     uint32_t i, cnt = 0;
@@ -36,8 +29,7 @@ static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
 
 
     cnt += date;
     cnt += date;
 
 
-    if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)) &&
-            (month >= 3))
+    if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)) && (month >= 3))
         cnt += 1;
         cnt += 1;
 
 
     cnt += (year - 1901) * 365;
     cnt += (year - 1901) * 365;
@@ -51,127 +43,123 @@ static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
     return (cnt + 1) % 7;
     return (cnt + 1) % 7;
 }
 }
 
 
-static void RTC_SetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime)
+static time_t swm_get_rtc_time_stamp(void)
 {
 {
-    RTC_Stop(RTCx);
+    RTC_DateTime get_datetime = {0};
+    struct tm tm_new;
 
 
-    while (RTCx->CFGABLE == 0);
+    RTC_GetDateTime(RTC, &get_datetime);
 
 
-    RTCx->MINSEC = (dateTime->Second << RTC_MINSEC_SEC_Pos) |
-                   (dateTime->Minute << RTC_MINSEC_MIN_Pos);
+    tm_new.tm_sec = get_datetime.Second;
+    tm_new.tm_min = get_datetime.Minute;
+    tm_new.tm_hour = get_datetime.Hour;
+    tm_new.tm_mday = get_datetime.Date;
+    tm_new.tm_mon = get_datetime.Month;
+    tm_new.tm_year = get_datetime.Year;
 
 
-    RTCx->DATHUR = (dateTime->Hour << RTC_DATHUR_HOUR_Pos) |
-                   ((dateTime->Date - 1) << RTC_DATHUR_DATE_Pos);
+    LOG_D("get rtc time.");
+    return mktime(&tm_new);
+}
+static rt_err_t swm_set_rtc_time_stamp(time_t time_stamp)
+{
+    RTC_DateTime set_datetime = {0};
+    struct tm *p_tm;
+
+    p_tm = gmtime(&time_stamp);
+
+    set_datetime.Second = p_tm->tm_sec;
+    set_datetime.Minute = p_tm->tm_min;
+    set_datetime.Hour = p_tm->tm_hour;
+    set_datetime.Date = p_tm->tm_mday;
+    set_datetime.Month = p_tm->tm_mon;
+    set_datetime.Year = p_tm->tm_year;
+    // set_datetime.Day = p_tm->tm_wday;
+
+    RTC_Stop(RTC);
+    while (RTC->CFGABLE == 0)
+        ;
+    RTC->MINSEC = (set_datetime.Second << RTC_MINSEC_SEC_Pos) |
+                  (set_datetime.Minute << RTC_MINSEC_MIN_Pos);
+    RTC->DATHUR = (set_datetime.Hour << RTC_DATHUR_HOUR_Pos) |
+                  ((set_datetime.Date) << RTC_DATHUR_DATE_Pos);
+    RTC->MONDAY = (calcWeekDay(set_datetime.Year, set_datetime.Month, set_datetime.Date)
+                   << RTC_MONDAY_DAY_Pos) |
+                  ((set_datetime.Month) << RTC_MONDAY_MON_Pos);
+    RTC->YEAR = set_datetime.Year;
+    RTC->LOAD = 1 << RTC_LOAD_TIME_Pos;
+    RTC_Start(RTC);
 
 
-    RTCx->MONDAY = (calcWeekDay(dateTime->Year, dateTime->Month, dateTime->Date)
-                    << RTC_MONDAY_DAY_Pos) |
-                   ((dateTime->Month - 1) << RTC_MONDAY_MON_Pos);
+    LOG_D("set rtc time.");
+    return RT_EOK;
+}
 
 
-    RTCx->YEAR = dateTime->Year - 1901;
+static rt_err_t swm_rtc_init(void)
+{
+    RTC_InitStructure rtc_initstruct;
+
+    rtc_initstruct.Year = 2020;
+    rtc_initstruct.Month = 6;
+    rtc_initstruct.Date = 8;
+    rtc_initstruct.Hour = 12;
+    rtc_initstruct.Minute = 0;
+    rtc_initstruct.Second = 0;
+    rtc_initstruct.SecondIEn = 0;
+    rtc_initstruct.MinuteIEn = 0;
+    RTC_Init(RTC, &rtc_initstruct);
+    RTC_Start(RTC);
 
 
-    RTCx->LOAD = 1 << RTC_LOAD_TIME_Pos;
+    return RT_EOK;
+}
 
 
-    RTC_Start(RTC);
+static rt_err_t swm_rtc_get_secs(void *args)
+{
+    *(rt_uint32_t *)args = swm_get_rtc_time_stamp();
+    LOG_D("RTC: get rtc_time %x\n", *(rt_uint32_t *)args);
+
+    return RT_EOK;
 }
 }
 
 
-static rt_err_t swm320_rtc_control(rt_device_t dev, int cmd, void *args)
+static rt_err_t swm_rtc_set_secs(void *args)
 {
 {
     rt_err_t result = RT_EOK;
     rt_err_t result = RT_EOK;
 
 
-    struct tm time_temp;
-    struct tm *pNow;
-    RTC_DateTime dateTime;
-
-    switch (cmd)
+    if (swm_set_rtc_time_stamp(*(rt_uint32_t *)args))
     {
     {
-    case RT_DEVICE_CTRL_RTC_GET_TIME:
-        RTC_GetDateTime(RTC, &dateTime);
-        time_temp.tm_sec = dateTime.Second;
-        time_temp.tm_min = dateTime.Minute;
-        time_temp.tm_hour = dateTime.Hour;
-        time_temp.tm_mday = dateTime.Date;
-        time_temp.tm_mon = dateTime.Month - 1;
-        time_temp.tm_year = dateTime.Year - 1900;
-        *((time_t *)args) = timegm(&time_temp);
-        break;
-    case RT_DEVICE_CTRL_RTC_SET_TIME:
-        rt_enter_critical();
-        /* converts calendar time time into local time. */
-        pNow = gmtime((const time_t *)args);
-        /* copy the statically located variable */
-        memcpy(&time_temp, pNow, sizeof(struct tm));
-        /* unlock scheduler. */
-        rt_exit_critical();
-
-        dateTime.Hour = time_temp.tm_hour;
-        dateTime.Minute = time_temp.tm_min;
-        dateTime.Second = time_temp.tm_sec;
-        dateTime.Year = time_temp.tm_year + 1900;
-        dateTime.Month = time_temp.tm_mon + 1;
-        dateTime.Date = time_temp.tm_mday;
-        RTC_SetDateTime(RTC, &dateTime);
-        break;
-    case RT_DEVICE_CTRL_RTC_GET_ALARM:
-
-        break;
-    case RT_DEVICE_CTRL_RTC_SET_ALARM:
-
-        break;
-    default:
-        break;
+        result = -RT_ERROR;
     }
     }
+    LOG_D("RTC: set rtc_time %x\n", *(rt_uint32_t *)args);
 
 
     return result;
     return result;
 }
 }
 
 
-#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops swm320_rtc_ops =
+static const struct rt_rtc_ops swm_rtc_ops =
 {
 {
+    swm_rtc_init,
+    swm_rtc_get_secs,
+    swm_rtc_set_secs,
     RT_NULL,
     RT_NULL,
     RT_NULL,
     RT_NULL,
     RT_NULL,
     RT_NULL,
     RT_NULL,
     RT_NULL,
-    RT_NULL,
-    swm320_rtc_control
 };
 };
-#endif
+
+static rt_rtc_dev_t swm_rtc_device;
 
 
 int rt_hw_rtc_init(void)
 int rt_hw_rtc_init(void)
 {
 {
-    rt_err_t ret = RT_EOK;
-    static struct rt_device rtc_dev;
-    RTC_InitStructure RTC_initStruct;
-
-    RTC_initStruct.Year = 2018;
-    RTC_initStruct.Month = 1;
-    RTC_initStruct.Date = 1;
-    RTC_initStruct.Hour = 12;
-    RTC_initStruct.Minute = 0;
-    RTC_initStruct.Second = 0;
-    RTC_initStruct.SecondIEn = 0;
-    RTC_initStruct.MinuteIEn = 0;
-    RTC_Init(RTC, &RTC_initStruct);
-    RTC_Start(RTC);
-
-    rtc_dev.type = RT_Device_Class_RTC;
-    rtc_dev.rx_indicate = RT_NULL;
-    rtc_dev.tx_complete = RT_NULL;
+    rt_err_t result;
 
 
-#ifdef RT_USING_DEVICE_OPS
-    rtc_dev.ops = &swm320_rtc_ops;
-#else
-    rtc_dev.init = RT_NULL;
-    rtc_dev.open = RT_NULL;
-    rtc_dev.close = RT_NULL;
-    rtc_dev.read = RT_NULL;
-    rtc_dev.write = RT_NULL;
-    rtc_dev.control = swm320_rtc_control;
-#endif
-
-    rtc_dev.user_data = RTC;
-
-    ret = rt_device_register(&rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR);
-
-    return ret;
+    swm_rtc_device.ops = &swm_rtc_ops;
+    result = rt_hw_rtc_register(&swm_rtc_device, "rtc", RT_DEVICE_FLAG_RDWR,RT_NULL);
+    if (result != RT_EOK)
+    {
+        LOG_E("rtc register err code: %d", result);
+        return result;
+    }
+    LOG_D("rtc init success");
+    return RT_EOK;
 }
 }
 INIT_DEVICE_EXPORT(rt_hw_rtc_init);
 INIT_DEVICE_EXPORT(rt_hw_rtc_init);
+
+#endif /* BSP_USING_RTC */
+#endif /* RT_USING_RTC */

+ 6 - 3
bsp/swm320-lq100/drivers/drv_rtc.h

@@ -6,11 +6,14 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-12-10     Zohar_Lee    first version
  * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          rewrite
  */
  */
 
 
-#ifndef DRV_RTC_H__
-#define DRV_RTC_H__
+#ifndef __DRV_RTC_H__
+#define __DRV_RTC_H__
+
+#include "board.h"
 
 
 int rt_hw_rtc_init(void);
 int rt_hw_rtc_init(void);
 
 
-#endif
+#endif /* __DRV_RTC_H__ */

+ 664 - 0
bsp/swm320-lq100/drivers/drv_sdio.c

@@ -0,0 +1,664 @@
+/*
+ * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2020-07-10     lik          first version
+ */
+
+#include "drv_sdio.h"
+
+#ifdef RT_USING_SDIO
+#ifdef BSP_USING_SDIO
+
+//#define DRV_DEBUG
+#define LOG_TAG "drv.sdio"
+#include <drv_log.h>
+
+static struct rt_mmcsd_host *host;
+
+#define RTHW_SDIO_LOCK(_sdio) rt_mutex_take(&_sdio->mutex, RT_WAITING_FOREVER)
+#define RTHW_SDIO_UNLOCK(_sdio) rt_mutex_release(&_sdio->mutex);
+
+struct rthw_sdio
+{
+    struct rt_mmcsd_host *host;
+    struct swm_sdio_des sdio_des;
+    struct rt_event event;
+    struct rt_mutex mutex;
+    struct sdio_pkg *pkg;
+};
+
+ALIGN(SDIO_ALIGN_LEN)
+static rt_uint8_t cache_buf[SDIO_BUFF_SIZE];
+
+/**
+  * @brief  This function wait sdio completed.
+  * @param  sdio  rthw_sdio
+  * @retval None
+  */
+static void rthw_sdio_wait_completed(struct rthw_sdio *sdio)
+{
+    rt_uint32_t status;
+    struct rt_mmcsd_cmd *cmd = sdio->pkg->cmd;
+    struct rt_mmcsd_data *data = cmd->data;
+    SDIO_TypeDef *hw_sdio = sdio->sdio_des.hw_sdio;
+
+    if (rt_event_recv(&sdio->event, 0xffffffff, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
+                      rt_tick_from_millisecond(1000), &status) != RT_EOK)
+    {
+        LOG_E("wait completed timeout");
+        cmd->err = -RT_ETIMEOUT;
+        return;
+    }
+
+    if (sdio->pkg == RT_NULL)
+    {
+        return;
+    }
+
+    if (resp_type(cmd) == RESP_NONE)
+    {
+        ;
+    }
+    else if (resp_type(cmd) == RESP_R2)
+    {
+        cmd->resp[0] = (hw_sdio->RESP[3] << 8) + ((hw_sdio->RESP[2] >> 24) & 0xFF);
+        cmd->resp[1] = (hw_sdio->RESP[2] << 8) + ((hw_sdio->RESP[1] >> 24) & 0xFF);
+        cmd->resp[2] = (hw_sdio->RESP[1] << 8) + ((hw_sdio->RESP[0] >> 24) & 0xFF);
+        cmd->resp[3] = (hw_sdio->RESP[0] << 8) + 0x00;
+    }
+    else
+    {
+        cmd->resp[0] = hw_sdio->RESP[0];
+    }
+
+    if (status & SDIO_IF_ERROR_Msk)
+    {
+        if ((status & SDIO_IF_CMDCRCERR_Msk) && (resp_type(cmd) & (RESP_R3 | RESP_R4)))
+        {
+            cmd->err = RT_EOK;
+        }
+        else
+        {
+            cmd->err = -RT_ERROR;
+        }
+
+        if (status & SDIO_IF_CMDTIMEOUT_Msk)
+        {
+            cmd->err = -RT_ETIMEOUT;
+        }
+
+        if (status & SDIO_IF_DATCRCERR_Msk)
+        {
+            data->err = -RT_ERROR;
+        }
+
+        if (status & SDIO_IF_DATTIMEOUT_Msk)
+        {
+            data->err = -RT_ETIMEOUT;
+        }
+
+        if (cmd->err == RT_EOK)
+        {
+            LOG_D("sta:0x%08X [%08X %08X %08X %08X]", status, cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]);
+        }
+        else
+        {
+            LOG_D("err:0x%08x, %s cmd:%d arg:0x%08x rw:%c len:%d blksize:%d",
+                  status,
+                  status == 0 ? "NULL" : "",
+                  cmd->cmd_code,
+                  cmd->arg,
+                  data ? (data->flags & DATA_DIR_WRITE ? 'w' : 'r') : '-',
+                  data ? data->blks * data->blksize : 0,
+                  data ? data->blksize : 0);
+        }
+    }
+    else
+    {
+        cmd->err = RT_EOK;
+        LOG_D("sta:0x%08X [%08X %08X %08X %08X]", status, cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]);
+    }
+}
+
+/**
+  * @brief  This function transfer data by dma.
+  * @param  sdio  rthw_sdio
+  * @param  pkg   sdio package
+  * @retval None
+  */
+static void rthw_sdio_transfer(struct rthw_sdio *sdio, struct sdio_pkg *pkg)
+{
+    struct rt_mmcsd_data *data;
+    int size;
+    void *buff;
+
+    if ((RT_NULL == pkg) || (RT_NULL == sdio))
+    {
+        LOG_E("rthw_sdio_transfer invalid args");
+        return;
+    }
+
+    data = pkg->cmd->data;
+    if (RT_NULL == data)
+    {
+        LOG_E("rthw_sdio_transfer invalid args");
+        return;
+    }
+
+    buff = pkg->buff;
+    if (RT_NULL == buff)
+    {
+        LOG_E("rthw_sdio_transfer invalid args");
+        return;
+    }
+
+    size = data->blks * data->blksize;
+
+    if (data->flags & DATA_DIR_WRITE)
+    {
+        sdio->sdio_des.txconfig(pkg, (rt_uint32_t *)buff, size);
+    }
+    else if (data->flags & DATA_DIR_READ)
+    {
+        sdio->sdio_des.rxconfig(pkg, (rt_uint32_t *)buff, size);
+    }
+}
+
+/**
+  * @brief  This function send command.
+  * @param  sdio  rthw_sdio
+  * @param  pkg   sdio package
+  * @retval None
+  */
+static void rthw_sdio_send_command(struct rthw_sdio *sdio, struct sdio_pkg *pkg)
+{
+    struct rt_mmcsd_cmd *cmd = pkg->cmd;
+    struct rt_mmcsd_data *data = cmd->data;
+    SDIO_TypeDef *hw_sdio = sdio->sdio_des.hw_sdio;
+    rt_uint32_t reg_cmd;
+
+    /* save pkg */
+    sdio->pkg = pkg;
+
+    LOG_D("CMD:%d ARG:0x%08x RES:%s%s%s%s%s%s%s%s%s rw:%c len:%d blksize:%d",
+          cmd->cmd_code,
+          cmd->arg,
+          resp_type(cmd) == RESP_NONE ? "NONE" : "",
+          resp_type(cmd) == RESP_R1 ? "R1" : "",
+          resp_type(cmd) == RESP_R1B ? "R1B" : "",
+          resp_type(cmd) == RESP_R2 ? "R2" : "",
+          resp_type(cmd) == RESP_R3 ? "R3" : "",
+          resp_type(cmd) == RESP_R4 ? "R4" : "",
+          resp_type(cmd) == RESP_R5 ? "R5" : "",
+          resp_type(cmd) == RESP_R6 ? "R6" : "",
+          resp_type(cmd) == RESP_R7 ? "R7" : "",
+          data ? (data->flags & DATA_DIR_WRITE ? 'w' : 'r') : '-',
+          data ? data->blks * data->blksize : 0,
+          data ? data->blksize : 0);
+
+    /* config cmd reg */
+    reg_cmd = (cmd->cmd_code << SDIO_CMD_CMDINDX_Pos) |
+              (0 << SDIO_CMD_CMDTYPE_Pos) |
+              (0 << SDIO_CMD_IDXCHECK_Pos) |
+              (0 << SDIO_CMD_CRCCHECK_Pos) |
+              (0 << SDIO_CMD_DMAEN_Pos);
+    if (resp_type(cmd) == RESP_NONE)
+        reg_cmd |= SD_RESP_NO << SDIO_CMD_RESPTYPE_Pos;
+    else if (resp_type(cmd) == RESP_R2)
+        reg_cmd |= SD_RESP_128b << SDIO_CMD_RESPTYPE_Pos;
+    else
+        reg_cmd |= SD_RESP_32b << SDIO_CMD_RESPTYPE_Pos;
+
+    /* config data reg */
+    if (data != RT_NULL)
+    {
+        rt_uint32_t dir = 0;
+        dir = (data->flags & DATA_DIR_READ) ? 1 : 0;
+
+        hw_sdio->BLK = (data->blks << SDIO_BLK_COUNT_Pos) | (data->blksize << SDIO_BLK_SIZE_Pos);
+
+        reg_cmd |= (1 << SDIO_CMD_HAVEDATA_Pos) |
+                   (dir << SDIO_CMD_DIRREAD_Pos) |
+                   ((data->blks > 1) << SDIO_CMD_MULTBLK_Pos) |
+                   ((data->blks > 1) << SDIO_CMD_BLKCNTEN_Pos) |
+                   (0 << SDIO_CMD_AUTOCMD12_Pos);
+    }
+    else
+    {
+        reg_cmd |= (0 << SDIO_CMD_HAVEDATA_Pos);
+    }
+
+    if (cmd->cmd_code != SD_IO_SEND_OP_COND)
+    {
+        /* send cmd */
+        hw_sdio->ARG = cmd->arg;
+        hw_sdio->CMD = reg_cmd;
+    }
+
+    /* transfer config */
+    if (data != RT_NULL)
+    {
+        rthw_sdio_transfer(sdio, pkg);
+    }
+
+    /* wait completed */
+    rthw_sdio_wait_completed(sdio);
+
+    /* clear pkg */
+    sdio->pkg = RT_NULL;
+}
+
+/**
+  * @brief  This function send sdio request.
+  * @param  sdio  rthw_sdio
+  * @param  req   request
+  * @retval None
+  */
+static void rthw_sdio_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req)
+{
+    struct sdio_pkg pkg;
+    struct rthw_sdio *sdio = host->private_data;
+    struct rt_mmcsd_data *data;
+
+    RTHW_SDIO_LOCK(sdio);
+
+    if (req->cmd != RT_NULL)
+    {
+        rt_memset(&pkg, 0, sizeof(pkg));
+        data = req->cmd->data;
+        pkg.cmd = req->cmd;
+
+        if (data != RT_NULL)
+        {
+            rt_uint32_t size = data->blks * data->blksize;
+
+            RT_ASSERT(size <= SDIO_BUFF_SIZE);
+
+            pkg.buff = data->buf;
+            if ((rt_uint32_t)data->buf & (SDIO_ALIGN_LEN - 1))
+            {
+                pkg.buff = cache_buf;
+                if (data->flags & DATA_DIR_WRITE)
+                {
+                    rt_memcpy(cache_buf, data->buf, size);
+                }
+            }
+        }
+
+        rthw_sdio_send_command(sdio, &pkg);
+
+        if ((data != RT_NULL) && (data->flags & DATA_DIR_READ) && ((rt_uint32_t)data->buf & (SDIO_ALIGN_LEN - 1)))
+        {
+            rt_memcpy(data->buf, cache_buf, data->blksize * data->blks);
+        }
+    }
+
+    if (req->stop != RT_NULL)
+    {
+        rt_memset(&pkg, 0, sizeof(pkg));
+        pkg.cmd = req->stop;
+        rthw_sdio_send_command(sdio, &pkg);
+    }
+
+    RTHW_SDIO_UNLOCK(sdio);
+
+    mmcsd_req_complete(sdio->host);
+}
+
+/**
+  * @brief  This function config sdio.
+  * @param  host    rt_mmcsd_host
+  * @param  io_cfg  rt_mmcsd_io_cfg
+  * @retval None
+  */
+static void rthw_sdio_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg)
+{
+    rt_uint32_t clkcr, div, clk_src;
+    rt_uint32_t clk = io_cfg->clock;
+    struct rthw_sdio *sdio = host->private_data;
+    SDIO_TypeDef *hw_sdio = sdio->sdio_des.hw_sdio;
+
+    clk_src = sdio->sdio_des.clk_get(sdio->sdio_des.hw_sdio);
+    if (clk_src < 400 * 1000)
+    {
+        LOG_E("The clock rate is too low! rata:%d", clk_src);
+        return;
+    }
+
+    if (clk > host->freq_max)
+        clk = host->freq_max;
+
+    if (clk > clk_src)
+    {
+        LOG_W("Setting rate is greater than clock source rate.");
+        clk = clk_src;
+    }
+
+    LOG_D("clk:%d width:%s%s%s power:%s%s%s",
+          clk,
+          io_cfg->bus_width == MMCSD_BUS_WIDTH_8 ? "8" : "",
+          io_cfg->bus_width == MMCSD_BUS_WIDTH_4 ? "4" : "",
+          io_cfg->bus_width == MMCSD_BUS_WIDTH_1 ? "1" : "",
+          io_cfg->power_mode == MMCSD_POWER_OFF ? "OFF" : "",
+          io_cfg->power_mode == MMCSD_POWER_UP ? "UP" : "",
+          io_cfg->power_mode == MMCSD_POWER_ON ? "ON" : "");
+
+    RTHW_SDIO_LOCK(sdio);
+
+    hw_sdio->CR1 = (1 << SDIO_CR1_CDSRC_Pos) | (7 << SDIO_CR1_VOLT_Pos);
+    if (io_cfg->bus_width == MMCSD_BUS_WIDTH_8)
+    {
+        hw_sdio->CR1 |= (1 << SDIO_CR1_8BIT_Pos);
+    }
+    else
+    {
+        hw_sdio->CR1 &= ~SDIO_CR1_8BIT_Msk;
+        if (io_cfg->bus_width == MMCSD_BUS_WIDTH_4)
+        {
+            hw_sdio->CR1 |= (1 << SDIO_CR1_4BIT_Pos);
+        }
+        else
+        {
+            hw_sdio->CR1 &= ~SDIO_CR1_4BIT_Msk;
+        }
+    }
+    switch (io_cfg->power_mode)
+    {
+    case MMCSD_POWER_OFF:
+        hw_sdio->CR1 &= ~SDIO_CR1_PWRON_Msk;
+        break;
+    case MMCSD_POWER_UP:
+    case MMCSD_POWER_ON:
+        hw_sdio->CR1 |= (1 << SDIO_CR1_PWRON_Pos);
+        break;
+    default:
+        LOG_W("unknown power_mode %d", io_cfg->power_mode);
+        break;
+    }
+
+    div = clk_src / clk;
+    if ((clk == 0) || (div == 0))
+    {
+        clkcr = 0;
+    }
+    else
+    {
+        if (div > 128)
+            clkcr = 0x80;
+        else if (div > 64)
+            clkcr = 0x40;
+        else if (div > 32)
+            clkcr = 0x20;
+        else if (div > 16)
+            clkcr = 0x10;
+        else if (div > 8)
+            clkcr = 0x08;
+        else if (div > 4)
+            clkcr = 0x04;
+        else if (div > 2)
+            clkcr = 0x02;
+        else if (div > 1)
+            clkcr = 0x01;
+        else
+            clkcr = 0x00;
+    }
+
+    SDIO->CR2 = (1 << SDIO_CR2_CLKEN_Pos) |
+                (1 << SDIO_CR2_SDCLKEN_Pos) |
+                (clkcr << SDIO_CR2_SDCLKDIV_Pos) |
+                (0xC << SDIO_CR2_TIMEOUT_Pos); // 2**25 SDIO_CLK
+
+    while ((SDIO->CR2 & SDIO_CR2_CLKRDY_Msk) == 0)
+        ;
+
+    RTHW_SDIO_UNLOCK(sdio);
+}
+
+/**
+  * @brief  This function delect sdcard.
+  * @param  host    rt_mmcsd_host
+  * @retval 0x01
+  */
+static rt_int32_t rthw_sdio_delect(struct rt_mmcsd_host *host)
+{
+    LOG_D("try to detect device");
+    return 0x01;
+}
+
+/**
+  * @brief  This function update sdio interrupt.
+  * @param  host    rt_mmcsd_host
+  * @param  enable
+  * @retval None
+  */
+void rthw_sdio_irq_update(struct rt_mmcsd_host *host, rt_int32_t enable)
+{
+    struct rthw_sdio *sdio = host->private_data;
+    SDIO_TypeDef *hw_sdio = sdio->sdio_des.hw_sdio;
+
+    if (enable)
+    {
+        LOG_D("enable sdio irq");
+        hw_sdio->IFE = 0xFFFFFFFF;
+        hw_sdio->IE = 0xFFFF000F;
+    }
+    else
+    {
+        LOG_D("disable sdio irq");
+        hw_sdio->IFE &= ~0xFFFFFFFF;
+        hw_sdio->IE &= ~0xFFFFFFFF;
+    }
+}
+
+static const struct rt_mmcsd_host_ops swm_sdio_ops =
+    {
+        rthw_sdio_request,
+        rthw_sdio_iocfg,
+        rthw_sdio_delect,
+        rthw_sdio_irq_update,
+};
+
+struct rt_mmcsd_host *sdio_host_create(struct swm_sdio_des *sdio_des)
+{
+    struct rt_mmcsd_host *host;
+    struct rthw_sdio *sdio = RT_NULL;
+
+    if ((sdio_des == RT_NULL) || (sdio_des->txconfig == RT_NULL) || (sdio_des->rxconfig == RT_NULL))
+    {
+        LOG_E("L:%d F:%s %s %s %s",
+              (sdio_des == RT_NULL ? "sdio_des is NULL" : ""),
+              (sdio_des ? (sdio_des->txconfig ? "txconfig is NULL" : "") : ""),
+              (sdio_des ? (sdio_des->rxconfig ? "rxconfig is NULL" : "") : ""));
+        return RT_NULL;
+    }
+
+    sdio = rt_malloc(sizeof(struct rthw_sdio));
+    if (sdio == RT_NULL)
+    {
+        LOG_E("L:%d F:%s malloc rthw_sdio fail");
+        return RT_NULL;
+    }
+    rt_memset(sdio, 0, sizeof(struct rthw_sdio));
+
+    host = mmcsd_alloc_host();
+    if (host == RT_NULL)
+    {
+        LOG_E("L:%d F:%s mmcsd alloc host fail");
+        rt_free(sdio);
+        return RT_NULL;
+    }
+
+    rt_memcpy(&sdio->sdio_des, sdio_des, sizeof(struct swm_sdio_des));
+
+    rt_event_init(&sdio->event, "sdio", RT_IPC_FLAG_FIFO);
+    rt_mutex_init(&sdio->mutex, "sdio", RT_IPC_FLAG_FIFO);
+
+    /* set host defautl attributes */
+    host->ops = &swm_sdio_ops;
+    host->freq_min = 400 * 1000;
+    host->freq_max = SDIO_MAX_FREQ;
+    host->valid_ocr = 0X00FFFF80; /* The voltage range supported is 1.65v-3.6v */
+#ifndef SDIO_USING_1_BIT
+    host->flags = MMCSD_BUSWIDTH_4 | MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ;
+#else
+    host->flags = MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ;
+#endif
+    host->max_seg_size = SDIO_BUFF_SIZE;
+    host->max_dma_segs = 1;
+    host->max_blk_size = 512;
+    host->max_blk_count = 512;
+
+    /* link up host and sdio */
+    sdio->host = host;
+    host->private_data = sdio;
+
+    rthw_sdio_irq_update(host, 1);
+
+    /* ready to change */
+    mmcsd_change(host);
+
+    return host;
+}
+
+static rt_uint32_t swm_sdio_clock_get(SDIO_TypeDef *hw_sdio)
+{
+    uint32_t prediv = ((SYS->CLKDIV & SYS_CLKDIV_SDIO_Msk) >> SYS_CLKDIV_SDIO_Pos);
+    return (SystemCoreClock / (1 << prediv));
+}
+
+static rt_err_t swm_sdio_rxconfig(struct sdio_pkg *pkg, rt_uint32_t *buff, int size)
+{
+    struct rt_mmcsd_cmd *cmd = pkg->cmd;
+    struct rt_mmcsd_data *data = cmd->data;
+    for (uint32_t i = 0; i < data->blks; i++)
+    {
+        while ((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0)
+            __NOP();
+        SDIO->IF = SDIO_IF_BUFRDRDY_Msk;
+        for (uint32_t j = 0; j < data->blksize / 4; j++)
+            buff[j] = SDIO->DATA;
+    }
+    return RT_EOK;
+}
+
+static rt_err_t swm_sdio_txconfig(struct sdio_pkg *pkg, rt_uint32_t *buff, int size)
+{
+    struct rt_mmcsd_cmd *cmd = pkg->cmd;
+    struct rt_mmcsd_data *data = cmd->data;
+    for (uint32_t i = 0; i < data->blks; i++)
+    {
+        while ((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0)
+            __NOP();
+        SDIO->IF = SDIO_IF_BUFWRRDY_Msk;
+        for (uint32_t j = 0; j < data->blksize / 4; j++)
+            SDIO->DATA = buff[j];
+    }
+    return RT_EOK;
+}
+
+/**
+  * @brief  This function interrupt process function.
+  * @param  host  rt_mmcsd_host
+  * @retval None
+  */
+void rthw_sdio_irq_process(struct rt_mmcsd_host *host)
+{
+    int complete = 0;
+    struct rthw_sdio *sdio = host->private_data;
+    SDIO_TypeDef *hw_sdio = sdio->sdio_des.hw_sdio;
+    rt_uint32_t intstatus = hw_sdio->IF;
+
+    if (intstatus & SDIO_IF_ERROR_Msk)
+    {
+        hw_sdio->IF = 0xFFFFFFFF;
+        complete = 1;
+    }
+    else
+    {
+        if (intstatus & SDIO_IF_CMDDONE_Msk)
+        {
+            hw_sdio->IF = SDIO_IF_CMDDONE_Msk;
+            if (sdio->pkg != RT_NULL)
+            {
+                if (!sdio->pkg->cmd->data)
+                {
+                    complete = 1;
+                }
+            }
+        }
+
+        if (intstatus & SDIO_IF_TRXDONE_Msk)
+        {
+            hw_sdio->IF = SDIO_IF_TRXDONE_Msk;
+            complete = 1;
+        }
+    }
+
+    if (complete)
+    {
+        rt_event_send(&sdio->event, intstatus);
+    }
+}
+
+void SDIO_Handler(void)
+{
+    /* enter interrupt */
+    rt_interrupt_enter();
+    /* Process All SDIO Interrupt Sources */
+    rthw_sdio_irq_process(host);
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+
+int rt_hw_sdio_init(void)
+{
+    struct swm_sdio_des sdio_des;
+
+#if 0
+    PORT_Init(PORTB, PIN1, PORTB_PIN1_SD_CLK, 0);
+    PORT_Init(PORTB, PIN2, PORTB_PIN2_SD_CMD, 1);
+    PORT_Init(PORTB, PIN3, PORTB_PIN3_SD_D0, 1);
+    PORT_Init(PORTB, PIN4, PORTB_PIN4_SD_D1, 1);
+    PORT_Init(PORTB, PIN5, PORTB_PIN5_SD_D2, 1);
+    PORT_Init(PORTB, PIN6, PORTB_PIN6_SD_D3, 1);
+#else
+    PORT_Init(PORTP, PIN11, PORTP_PIN11_SD_CLK, 0);
+    PORT_Init(PORTP, PIN10, PORTP_PIN10_SD_CMD, 1);
+    PORT_Init(PORTP, PIN9, PORTP_PIN9_SD_D0, 1);
+    PORT_Init(PORTP, PIN8, PORTP_PIN8_SD_D1, 1);
+    PORT_Init(PORTP, PIN7, PORTP_PIN7_SD_D2, 1);
+    PORT_Init(PORTP, PIN6, PORTP_PIN6_SD_D3, 1);
+#endif
+    NVIC_EnableIRQ(SDIO_IRQn);
+    SYS->CLKDIV &= ~SYS_CLKDIV_SDIO_Msk;
+    if (SystemCoreClock > 80000000)                //SDIO时钟需要小于52MHz
+        SYS->CLKDIV |= (2 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 4
+    else
+        SYS->CLKDIV |= (1 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 2
+
+    SYS->CLKEN |= (0x01 << SYS_CLKEN_SDIO_Pos);
+
+    SDIO->CR2 = (1 << SDIO_CR2_RSTALL_Pos);
+
+    NVIC_EnableIRQ(SDIO_IRQn);
+    sdio_des.clk_get = swm_sdio_clock_get;
+    sdio_des.hw_sdio = SDIO;
+    sdio_des.rxconfig = swm_sdio_rxconfig;
+    sdio_des.txconfig = swm_sdio_txconfig;
+
+    host = sdio_host_create(&sdio_des);
+    if (host == RT_NULL)
+    {
+        LOG_E("host create fail");
+        return -1;
+    }
+    return 0;
+}
+INIT_DEVICE_EXPORT(rt_hw_sdio_init);
+
+#endif /* BSP_USING_SDIO */
+#endif /* RT_USING_SDIO */

+ 42 - 0
bsp/swm320-lq100/drivers/drv_sdio.h

@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2020-07-10     lik          first version
+ */
+
+#ifndef __DRV_SDIO_H__
+#define __DRV_SDIO_H__
+
+#include "board.h"
+
+#define SDIO_BUFF_SIZE 4096
+#define SDIO_ALIGN_LEN 4
+
+#ifndef SDIO_MAX_FREQ
+#define SDIO_MAX_FREQ (30000000)
+#endif
+
+struct sdio_pkg
+{
+    struct rt_mmcsd_cmd *cmd;
+    void *buff;
+    rt_uint32_t flag;
+};
+
+typedef rt_err_t (*sdio_txconfig)(struct sdio_pkg *pkg, rt_uint32_t *buff, int size);
+typedef rt_err_t (*sdio_rxconfig)(struct sdio_pkg *pkg, rt_uint32_t *buff, int size);
+typedef rt_uint32_t (*sdio_clk_get)(SDIO_TypeDef *hw_sdio);
+
+struct swm_sdio_des
+{
+    SDIO_TypeDef *hw_sdio;
+    sdio_txconfig txconfig;
+    sdio_rxconfig rxconfig;
+    sdio_clk_get clk_get;
+};
+
+#endif /* __DRV_SDIO_H__ */

+ 197 - 0
bsp/swm320-lq100/drivers/drv_soft_i2c.c

@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2018-05-31     ZYH          first version
+ * 2018-12-10     Zohar_Lee    format file
+ * 2020-07-10     lik          rewrite
+ */
+
+#include "drv_soft_i2c.h"
+
+#ifdef RT_USING_I2C
+#ifdef BSP_USING_I2C
+
+/***************************************************************
+*!!!!!!!!!!!!!!!!!!!!!!!!!!!!NOTICE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+*In order to use swm drv_soft_i2c,you need to commented out
+line 114 (SDA_H(ops);) and line 167 (SDA_H(ops);) in i2c-bit-ops.c
+At the same time, add one line (SDA_L(ops);)after line 154 (SCL_L(ops);)
+in i2c-bit-ops.c
+***************************************************************/
+
+//#define DRV_DEBUG
+#define LOG_TAG "drv.i2c"
+#include <drv_log.h>
+
+#if !defined(BSP_USING_I2C0) && !defined(BSP_USING_I2C1)
+#error "Please define at least one BSP_USING_I2Cx"
+/* this driver can be disabled at menuconfig ? RT-Thread Components ? Device Drivers */
+#endif
+
+static const struct swm_soft_i2c_cfg soft_i2c_cfg[] =
+    {
+#ifdef BSP_USING_I2C0
+        I2C0_BUS_CFG,
+#endif
+#ifdef BSP_USING_I2C1
+        I2C1_BUS_CFG,
+#endif
+};
+
+static struct swm_i2c i2c_drv[sizeof(soft_i2c_cfg) / sizeof(soft_i2c_cfg[0])];
+
+/**
+ * This function initializes the i2c pin.
+ *
+ * @param swm i2c dirver class.
+ */
+static void swm_i2c_gpio_init(struct swm_i2c *i2c)
+{
+    struct swm_soft_i2c_cfg *cfg = (struct swm_soft_i2c_cfg *)i2c->ops.data;
+
+    rt_pin_mode(cfg->scl, PIN_MODE_OUTPUT_OD);
+    rt_pin_mode(cfg->sda, PIN_MODE_OUTPUT_OD);
+
+    rt_pin_write(cfg->scl, PIN_HIGH);
+    rt_pin_write(cfg->sda, PIN_HIGH);
+}
+
+/**
+ * This function sets the sda pin.
+ *
+ * @param swm config class.
+ * @param The sda pin state.
+ */
+static void swm_set_sda(void *data, rt_int32_t state)
+{
+    struct swm_soft_i2c_cfg *cfg = (struct swm_soft_i2c_cfg *)data;
+    rt_pin_mode(cfg->sda, PIN_MODE_OUTPUT_OD);
+    if (state)
+    {
+        rt_pin_write(cfg->sda, PIN_HIGH);
+    }
+    else
+    {
+        rt_pin_write(cfg->sda, PIN_LOW);
+    }
+}
+
+/**
+ * This function sets the scl pin.
+ *
+ * @param swm config class.
+ * @param The scl pin state.
+ */
+static void swm_set_scl(void *data, rt_int32_t state)
+{
+    struct swm_soft_i2c_cfg *cfg = (struct swm_soft_i2c_cfg *)data;
+    rt_pin_mode(cfg->scl, PIN_MODE_OUTPUT_OD);
+    if (state)
+    {
+        rt_pin_write(cfg->scl, PIN_HIGH);
+    }
+    else
+    {
+        rt_pin_write(cfg->scl, PIN_LOW);
+    }
+}
+
+/**
+ * This function gets the sda pin state.
+ *
+ * @param The sda pin state.
+ */
+static rt_int32_t swm_get_sda(void *data)
+{
+    struct swm_soft_i2c_cfg *cfg = (struct swm_soft_i2c_cfg *)data;
+    rt_pin_mode(cfg->sda, PIN_MODE_INPUT_PULLUP);
+    return rt_pin_read(cfg->sda);
+}
+
+/**
+ * This function gets the scl pin state.
+ *
+ * @param The scl pin state.
+ */
+static rt_int32_t swm_get_scl(void *data)
+{
+    struct swm_soft_i2c_cfg *cfg = (struct swm_soft_i2c_cfg *)data;
+    rt_pin_mode(cfg->scl, PIN_MODE_INPUT_PULLUP);
+    return rt_pin_read(cfg->scl);
+}
+
+/**
+ * The time delay function.
+ *
+ * @param microseconds.
+ */
+static void swm_udelay(rt_uint32_t us)
+{
+    rt_uint32_t ticks;
+    rt_uint32_t told, tnow, tcnt = 0;
+    rt_uint32_t reload = SysTick->LOAD;
+
+    ticks = us * reload / (1000000 / RT_TICK_PER_SECOND);
+    told = SysTick->VAL;
+    while (1)
+    {
+        tnow = SysTick->VAL;
+        if (tnow != told)
+        {
+            if (tnow < told)
+            {
+                tcnt += told - tnow;
+            }
+            else
+            {
+                tcnt += reload - tnow + told;
+            }
+            told = tnow;
+            if (tcnt >= ticks)
+            {
+                break;
+            }
+        }
+    }
+}
+
+static const struct rt_i2c_bit_ops swm_bit_ops =
+    {
+        .data = RT_NULL,
+        .set_sda = swm_set_sda,
+        .set_scl = swm_set_scl,
+        .get_sda = swm_get_sda,
+        .get_scl = swm_get_scl,
+        .udelay = swm_udelay,
+        .delay_us = 1,
+        .timeout = 100};
+
+/* I2C initialization function */
+int rt_hw_i2c_init(void)
+{
+    rt_err_t result;
+
+    for (int i = 0; i < sizeof(i2c_drv) / sizeof(struct swm_i2c); i++)
+    {
+        i2c_drv[i].ops = swm_bit_ops;
+        i2c_drv[i].ops.data = (void *)&soft_i2c_cfg[i];
+        i2c_drv[i].i2c2_bus.priv = &i2c_drv[i].ops;
+        swm_i2c_gpio_init(&i2c_drv[i]);
+        result = rt_i2c_bit_add_bus(&i2c_drv[i].i2c2_bus, soft_i2c_cfg[i].name);
+        RT_ASSERT(result == RT_EOK);
+
+        LOG_D("software simulation %s init done, pin scl: %d, pin sda %d",
+              soft_i2c_cfg[i].name,
+              soft_i2c_cfg[i].scl,
+              soft_i2c_cfg[i].sda);
+    }
+
+    return RT_EOK;
+}
+INIT_DEVICE_EXPORT(rt_hw_i2c_init);
+#endif /* BSP_USING_I2C */
+#endif /* RT_USING_I2C */

+ 51 - 0
bsp/swm320-lq100/drivers/drv_soft_i2c.h

@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          rewrite
+ */
+
+#ifndef __DRV_SOFT_I2C_H__
+#define __DRV_SOFT_I2C_H__
+
+#include "board.h"
+
+/* swm config class */
+struct swm_soft_i2c_cfg
+{
+    rt_uint8_t scl;
+    rt_uint8_t sda;
+    const char *name;
+};
+/* swm i2c dirver class */
+struct swm_i2c
+{
+    struct rt_i2c_bit_ops ops;
+    struct rt_i2c_bus_device i2c2_bus;
+};
+
+#ifdef BSP_USING_I2C0
+#define I2C0_BUS_CFG             \
+    {                            \
+        .scl = BSP_I2C0_SCL_PIN, \
+        .sda = BSP_I2C0_SDA_PIN, \
+        .name = "i2c0",          \
+    }
+#endif
+
+#ifdef BSP_USING_I2C1
+#define I2C1_BUS_CFG             \
+    {                            \
+        .scl = BSP_I2C1_SCL_PIN, \
+        .sda = BSP_I2C1_SDA_PIN, \
+        .name = "i2c1",          \
+    }
+#endif
+
+int rt_hw_i2c_init(void);
+
+#endif /* __DRV_SOFT_I2C_H__ */

+ 154 - 135
bsp/swm320-lq100/drivers/drv_spi.c

@@ -7,109 +7,119 @@
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-05-31     ZYH          first version
  * 2018-05-31     ZYH          first version
  * 2018-12-10     Zohar_Lee    format file
  * 2018-12-10     Zohar_Lee    format file
+ * 2020-07-10     lik          format file
  */
  */
 
 
-#include <board.h>
-#include <rtthread.h>
-#include <rtdevice.h>
-#include <SWM320_port.h>
-#include <rthw.h>
-#include <drv_spi.h>
+#include "drv_spi.h"
 
 
-#define SPIRXEVENT 0x01
-#define SPITXEVENT 0x02
-#define SPITIMEOUT 2
-#define SPICRCEN 0
+#ifdef RT_USING_SPI
+#ifdef BSP_USING_SPI
 
 
-struct swm320_spi
-{
-    SPI_TypeDef *swm320_spi;
-    struct rt_spi_configuration *cfg;
+//#define DRV_DEBUG
+#define LOG_TAG "drv.spi"
+#include <drv_log.h>
+
+static struct swm_spi_cfg spi_cfg[] =
+    {
+#ifdef BSP_USING_SPI0
+        SPI0_BUS_CONFIG,
+#endif
+#ifdef BSP_USING_SPI1
+        SPI1_BUS_CONFIG,
+#endif
 };
 };
 
 
-static rt_err_t swm320_spi_init(SPI_TypeDef *spix,
-                                struct rt_spi_configuration *cfg)
+static struct swm_spi spi_bus_drv[sizeof(spi_cfg) / sizeof(spi_cfg[0])] = {0};
+
+static rt_err_t swm_spi_init(struct swm_spi *spi_drv, struct rt_spi_configuration *configure)
 {
 {
-    SPI_InitStructure SPI_initStruct;
-    if (cfg->mode & RT_SPI_SLAVE)
+    RT_ASSERT(spi_drv != RT_NULL);
+    RT_ASSERT(configure != RT_NULL);
+
+    struct swm_spi_cfg *cfg = spi_drv->cfg;
+
+    if (configure->mode & RT_SPI_SLAVE)
     {
     {
-        SPI_initStruct.Master = 0;
+        cfg->spi_initstruct.Master = 0;
     }
     }
     else
     else
     {
     {
-        SPI_initStruct.Master = 1;
+        cfg->spi_initstruct.Master = 1;
     }
     }
-    if (cfg->mode & RT_SPI_3WIRE)
+
+    if (configure->mode & RT_SPI_3WIRE)
     {
     {
         return RT_EINVAL;
         return RT_EINVAL;
     }
     }
-    if (cfg->data_width == 8)
+
+    if (configure->data_width == 8)
     {
     {
-        SPI_initStruct.WordSize = 8;
+        cfg->spi_initstruct.WordSize = 8;
     }
     }
-    else if (cfg->data_width == 16)
+    else if (configure->data_width == 16)
     {
     {
-        SPI_initStruct.WordSize = 16;
+        cfg->spi_initstruct.WordSize = 16;
     }
     }
     else
     else
     {
     {
-        return RT_EINVAL;
+        return RT_EIO;
     }
     }
-    if (cfg->mode & RT_SPI_CPHA)
+
+    if (configure->mode & RT_SPI_CPHA)
     {
     {
-        SPI_initStruct.SampleEdge = SPI_SECOND_EDGE;
+        cfg->spi_initstruct.SampleEdge = SPI_SECOND_EDGE;
     }
     }
     else
     else
     {
     {
-        SPI_initStruct.SampleEdge = SPI_FIRST_EDGE;
+        cfg->spi_initstruct.SampleEdge = SPI_FIRST_EDGE;
     }
     }
-    if (cfg->mode & RT_SPI_CPOL)
+
+    if (configure->mode & RT_SPI_CPOL)
     {
     {
-        SPI_initStruct.IdleLevel = SPI_HIGH_LEVEL;
+        cfg->spi_initstruct.IdleLevel = SPI_HIGH_LEVEL;
     }
     }
     else
     else
     {
     {
-        SPI_initStruct.IdleLevel = SPI_LOW_LEVEL;
+        cfg->spi_initstruct.IdleLevel = SPI_LOW_LEVEL;
     }
     }
-    if (cfg->max_hz >= SystemCoreClock / 4)
+
+    if (configure->max_hz >= SystemCoreClock / 4)
     {
     {
-        SPI_initStruct.clkDiv = SPI_CLKDIV_4;
+        cfg->spi_initstruct.clkDiv = SPI_CLKDIV_4;
     }
     }
-    else if (cfg->max_hz >= SystemCoreClock / 8)
+    else if (configure->max_hz >= SystemCoreClock / 8)
     {
     {
-        SPI_initStruct.clkDiv = SPI_CLKDIV_8;
+        cfg->spi_initstruct.clkDiv = SPI_CLKDIV_8;
     }
     }
-    else if (cfg->max_hz >= SystemCoreClock / 16)
+    else if (configure->max_hz >= SystemCoreClock / 16)
     {
     {
-        SPI_initStruct.clkDiv = SPI_CLKDIV_16;
+        cfg->spi_initstruct.clkDiv = SPI_CLKDIV_16;
     }
     }
-    else if (cfg->max_hz >= SystemCoreClock / 32)
+    else if (configure->max_hz >= SystemCoreClock / 32)
     {
     {
-        SPI_initStruct.clkDiv = SPI_CLKDIV_32;
+        cfg->spi_initstruct.clkDiv = SPI_CLKDIV_32;
     }
     }
-    else if (cfg->max_hz >= SystemCoreClock / 64)
+    else if (configure->max_hz >= SystemCoreClock / 64)
     {
     {
-        SPI_initStruct.clkDiv = SPI_CLKDIV_64;
+        cfg->spi_initstruct.clkDiv = SPI_CLKDIV_64;
     }
     }
-    else if (cfg->max_hz >= SystemCoreClock / 128)
+    else if (configure->max_hz >= SystemCoreClock / 128)
     {
     {
-        SPI_initStruct.clkDiv = SPI_CLKDIV_128;
+        cfg->spi_initstruct.clkDiv = SPI_CLKDIV_128;
     }
     }
-    else if (cfg->max_hz >= SystemCoreClock / 256)
+    else if (configure->max_hz >= SystemCoreClock / 256)
     {
     {
-        SPI_initStruct.clkDiv = SPI_CLKDIV_256;
+        cfg->spi_initstruct.clkDiv = SPI_CLKDIV_256;
     }
     }
     else
     else
     {
     {
         /*  min prescaler 512 */
         /*  min prescaler 512 */
-        SPI_initStruct.clkDiv = SPI_CLKDIV_512;
+        cfg->spi_initstruct.clkDiv = SPI_CLKDIV_512;
     }
     }
-    SPI_initStruct.FrameFormat = SPI_FORMAT_SPI;
-    SPI_initStruct.RXHFullIEn = 0;
-    SPI_initStruct.TXEmptyIEn = 0;
-    SPI_initStruct.TXCompleteIEn = 0;
-    SPI_Init(spix, &SPI_initStruct);
-    SPI_Open(spix);
+
+    SPI_Init(cfg->SPIx, &(cfg->spi_initstruct));
+    SPI_Open(cfg->SPIx);
+    LOG_D("%s init done", cfg->name);
     return RT_EOK;
     return RT_EOK;
 }
 }
 
 
@@ -139,7 +149,7 @@ static rt_err_t swm320_spi_init(SPI_TypeDef *spix,
         }                                 \
         }                                 \
     } while (0)
     } while (0)
 
 
-static rt_err_t spitxrx1b(struct swm320_spi *hspi, void *rcvb, const void *sndb)
+static rt_err_t spitxrx1b(struct swm_spi *spi_drv, void *rcvb, const void *sndb)
 {
 {
     rt_uint32_t padrcv = 0;
     rt_uint32_t padrcv = 0;
     rt_uint32_t padsnd = 0xFF;
     rt_uint32_t padsnd = 0xFF;
@@ -155,39 +165,51 @@ static rt_err_t spitxrx1b(struct swm320_spi *hspi, void *rcvb, const void *sndb)
     {
     {
         sndb = &padsnd;
         sndb = &padsnd;
     }
     }
-    while (SPI_IsTXFull(hspi->swm320_spi));
-    SPISEND_1(hspi->swm320_spi->DATA, sndb, hspi->cfg->data_width);
-    while (SPI_IsRXEmpty(hspi->swm320_spi));
-    SPIRECV_1(hspi->swm320_spi->DATA, rcvb, hspi->cfg->data_width);
+    while (SPI_IsTXFull(spi_drv->cfg->SPIx))
+        ;
+    SPISEND_1(spi_drv->cfg->SPIx->DATA, sndb, spi_drv->cfg->spi_initstruct.WordSize);
+    while (SPI_IsRXEmpty(spi_drv->cfg->SPIx))
+        ;
+    SPIRECV_1(spi_drv->cfg->SPIx->DATA, rcvb, spi_drv->cfg->spi_initstruct.WordSize);
     return RT_EOK;
     return RT_EOK;
 }
 }
 
 
-static rt_uint32_t swm320_spi_xfer(struct rt_spi_device *device,
-                                   struct rt_spi_message *message)
+static rt_uint32_t swm_spi_xfer(struct rt_spi_device *device, struct rt_spi_message *message)
 {
 {
     rt_err_t res;
     rt_err_t res;
-    struct swm320_spi *hspi = (struct swm320_spi *)device->bus->parent.user_data;
-    struct swm320_spi_cs *cs = device->parent.user_data;
-    const rt_uint8_t *sndb = message->send_buf;
-    rt_uint8_t *rcvb = message->recv_buf;
-    rt_int32_t length = message->length;
+
     RT_ASSERT(device != RT_NULL);
     RT_ASSERT(device != RT_NULL);
     RT_ASSERT(device->bus != RT_NULL);
     RT_ASSERT(device->bus != RT_NULL);
     RT_ASSERT(device->bus->parent.user_data != RT_NULL);
     RT_ASSERT(device->bus->parent.user_data != RT_NULL);
+    RT_ASSERT(message != RT_NULL);
+
+    struct swm_spi *spi_drv = rt_container_of(device->bus, struct swm_spi, spi_bus);
+    struct swm_spi_cfg *cfg = spi_drv->cfg;
+    struct swm_spi_cs *cs = device->parent.user_data;
+
     if (message->cs_take)
     if (message->cs_take)
     {
     {
-        rt_pin_write(cs->pin, 0);
+        GPIO_ClrBit(cs->GPIOx, cs->gpio_pin);
     }
     }
+
+    LOG_D("%s transfer prepare and start", cfg->name);
+    LOG_D("%s sendbuf: %X, recvbuf: %X, length: %d",
+          cfg->name, (uint32_t)message->send_buf, (uint32_t)message->recv_buf, message->length);
+
+    const rt_uint8_t *sndb = message->send_buf;
+    rt_uint8_t *rcvb = message->recv_buf;
+    rt_int32_t length = message->length;
+
     while (length)
     while (length)
     {
     {
-        res = spitxrx1b(hspi, rcvb, sndb);
+        res = spitxrx1b(spi_drv, rcvb, sndb);
         if (rcvb)
         if (rcvb)
         {
         {
-            rcvb += SPISTEP(hspi->cfg->data_width);
+            rcvb += SPISTEP(cfg->spi_initstruct.WordSize);
         }
         }
         if (sndb)
         if (sndb)
         {
         {
-            sndb += SPISTEP(hspi->cfg->data_width);
+            sndb += SPISTEP(cfg->spi_initstruct.WordSize);
         }
         }
         if (res != RT_EOK)
         if (res != RT_EOK)
         {
         {
@@ -196,93 +218,90 @@ static rt_uint32_t swm320_spi_xfer(struct rt_spi_device *device,
         length--;
         length--;
     }
     }
     /* Wait until Busy flag is reset before disabling SPI */
     /* Wait until Busy flag is reset before disabling SPI */
-    while (!SPI_IsTXEmpty(hspi->swm320_spi) && !SPI_IsRXEmpty(hspi->swm320_spi));
+    while (!SPI_IsTXEmpty(cfg->SPIx) && !SPI_IsRXEmpty(cfg->SPIx))
+        ;
     if (message->cs_release)
     if (message->cs_release)
     {
     {
-        rt_pin_write(cs->pin, 1);
+        GPIO_SetBit(cs->GPIOx, cs->gpio_pin);
     }
     }
     return message->length - length;
     return message->length - length;
 }
 }
 
 
-static rt_err_t swm320_spi_configure(struct rt_spi_device *device,
-                                     struct rt_spi_configuration *configuration)
+static rt_err_t swm_spi_configure(struct rt_spi_device *device,
+                                  struct rt_spi_configuration *configure)
 {
 {
-    struct swm320_spi *hspi = (struct swm320_spi *)device->bus->parent.user_data;
-    hspi->cfg = configuration;
-    return swm320_spi_init(hspi->swm320_spi, configuration);
-}
-const static struct rt_spi_ops swm320_spi_ops =
-{
-    .configure = swm320_spi_configure,
-    .xfer = swm320_spi_xfer,
-};
-
-#ifdef BSP_USING_SPI0
-    static struct rt_spi_bus swm320_spi_bus0;
-    static struct swm320_spi swm320_spi0;
-#endif //BSP_USING_SPI0
+    RT_ASSERT(device != RT_NULL);
+    RT_ASSERT(configure != RT_NULL);
 
 
-#ifdef BSP_USING_SPI1
-    static struct rt_spi_bus swm320_spi_bus1;
-    static struct swm320_spi swm320_spi1;
-#endif //BSP_USING_SPI1
+    struct swm_spi *spi_drv = rt_container_of(device->bus, struct swm_spi, spi_bus);
+    spi_drv->configure = configure;
 
 
-static int swm320_spi_register_bus(SPI_TypeDef *SPIx, const char *name)
-{
-    struct rt_spi_bus *spi_bus;
-    struct swm320_spi *swm320_spi;
-    if (SPIx == SPI0)
-    {
-        PORT_Init(PORTC, PIN5, FUNMUX1_SPI0_SCLK, 0);
-        PORT_Init(PORTC, PIN6, FUNMUX0_SPI0_MOSI, 0);
-        PORT_Init(PORTC, PIN7, FUNMUX1_SPI0_MISO, 1);
-        spi_bus = &swm320_spi_bus0;
-        swm320_spi = &swm320_spi0;
-    }
-    else if (SPIx == SPI1)
-    {
-        PORT_Init(PORTM, PIN5, FUNMUX1_SPI1_SCLK, 0);
-        PORT_Init(PORTC, PIN2, FUNMUX0_SPI1_MOSI, 0);
-        PORT_Init(PORTC, PIN3, FUNMUX1_SPI1_MISO, 1);
-        spi_bus = &swm320_spi_bus1;
-        swm320_spi = &swm320_spi1;
-    }
-    else
-    {
-        return -1;
-    }
-    swm320_spi->swm320_spi = SPIx;
-    spi_bus->parent.user_data = swm320_spi;
-    return rt_spi_bus_register(spi_bus, name, &swm320_spi_ops);
+    return swm_spi_init(spi_drv, configure);
 }
 }
+const static struct rt_spi_ops swm_spi_ops =
+    {
+        .configure = swm_spi_configure,
+        .xfer = swm_spi_xfer,
+};
 
 
 //cannot be used before completion init
 //cannot be used before completion init
-static rt_err_t swm320_spi_bus_attach_device(rt_uint32_t pin,
-                                             const char *bus_name,
-                                             const char *device_name)
+rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, GPIO_TypeDef *cs_gpiox, uint32_t cs_gpio_pin)
 {
 {
-    struct rt_spi_device *spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));
+    RT_ASSERT(bus_name != RT_NULL);
+    RT_ASSERT(device_name != RT_NULL);
+
+    rt_err_t result;
+    struct rt_spi_device *spi_device;
+    struct swm_spi_cs *cs_pin;
+
+    GPIO_Init(cs_gpiox, cs_gpio_pin, 1, 0, 0);
+    GPIO_SetBit(cs_gpiox, cs_gpio_pin);
+
+    spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));
     RT_ASSERT(spi_device != RT_NULL);
     RT_ASSERT(spi_device != RT_NULL);
-    struct swm320_spi_cs *cs_pin = (struct swm320_spi_cs *)rt_malloc(sizeof(struct swm320_spi_cs));
+    cs_pin = (struct swm_spi_cs *)rt_malloc(sizeof(struct swm_spi_cs));
     RT_ASSERT(cs_pin != RT_NULL);
     RT_ASSERT(cs_pin != RT_NULL);
-    cs_pin->pin = pin;
-    rt_pin_mode(pin, PIN_MODE_OUTPUT);
-    rt_pin_write(pin, 1);
-    return rt_spi_bus_attach_device(spi_device,
-                                    device_name,
-                                    bus_name,
-                                    (void *)cs_pin);
+    cs_pin->GPIOx = cs_gpiox;
+    cs_pin->gpio_pin = cs_gpio_pin;
+
+    result = rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void *)cs_pin);
+    if (result != RT_EOK)
+    {
+        LOG_E("%s attach to %s faild, %d\n", device_name, bus_name, result);
+    }
+    RT_ASSERT(result == RT_EOK);
+    LOG_D("%s attach to %s done", device_name, bus_name);
+    return result;
 }
 }
 
 
 int rt_hw_spi_init(void)
 int rt_hw_spi_init(void)
 {
 {
-    int result = 0;
+    rt_err_t result;
+
 #ifdef BSP_USING_SPI0
 #ifdef BSP_USING_SPI0
-    result = swm320_spi_register_bus(SPI0, "spi0");
-#endif
+    PORT_Init(PORTP, PIN23, FUNMUX1_SPI0_SCLK, 0);
+    PORT_Init(PORTP, PIN18, FUNMUX0_SPI0_MOSI, 0);
+    PORT_Init(PORTP, PIN19, FUNMUX1_SPI0_MISO, 1);
+#endif //BSP_USING_SPI0
+
 #ifdef BSP_USING_SPI1
 #ifdef BSP_USING_SPI1
-    result = swm320_spi_register_bus(SPI1, "spi1");
-#endif
+    PORT_Init(PORTB, PIN1, FUNMUX1_SPI1_SCLK, 0);
+    PORT_Init(PORTB, PIN2, FUNMUX0_SPI1_MOSI, 0);
+    PORT_Init(PORTB, PIN3, FUNMUX1_SPI1_MISO, 1);
+#endif //BSP_USING_SPI1
+    for (int i = 0; i < sizeof(spi_cfg) / sizeof(spi_cfg[0]); i++)
+    {
+        spi_bus_drv[i].cfg = &spi_cfg[i];
+        spi_bus_drv[i].spi_bus.parent.user_data = &spi_cfg[i];
+        result = rt_spi_bus_register(&spi_bus_drv[i].spi_bus, spi_cfg[i].name, &swm_spi_ops);
+        RT_ASSERT(result == RT_EOK);
+
+        LOG_D("%s bus init done", spi_config[i].bus_name);
+    }
+
     return result;
     return result;
 }
 }
 INIT_BOARD_EXPORT(rt_hw_spi_init);
 INIT_BOARD_EXPORT(rt_hw_spi_init);
+
+#endif /* BSP_USING_SPI */
+#endif /* RT_USING_SPI */

+ 62 - 9
bsp/swm320-lq100/drivers/drv_spi.h

@@ -6,22 +6,75 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-12-10     Zohar_Lee    first version
  * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          rewrite
  */
  */
 
 
-#ifndef DRV_SPI_H__
-#define DRV_SPI_H__
+#ifndef __DRV_SPI_H__
+#define __DRV_SPI_H__
 
 
-#include <rtthread.h>
+#include "board.h"
 
 
-struct swm320_spi_cs
+struct swm_spi_cs
 {
 {
-    rt_uint32_t pin;
+    GPIO_TypeDef *GPIOx;
+    uint32_t gpio_pin;
 };
 };
 
 
+struct swm_spi_cfg
+{
+    const char *name;
+    SPI_TypeDef *SPIx;
+    SPI_InitStructure spi_initstruct;
+};
+
+/* swm spi dirver class */
+struct swm_spi
+{
+    struct swm_spi_cfg *cfg;
+    struct rt_spi_configuration *configure;
+    struct rt_spi_bus spi_bus;
+};
+
+#ifdef BSP_USING_SPI0
+#ifndef SPI0_BUS_CONFIG
+#define SPI0_BUS_CONFIG                               \
+    {                                                 \
+        .name = "spi0",                               \
+        .SPIx = SPI0,                                 \
+        .spi_initstruct.clkDiv = SPI_CLKDIV_32,       \
+        .spi_initstruct.FrameFormat = SPI_FORMAT_SPI, \
+        .spi_initstruct.SampleEdge = SPI_SECOND_EDGE, \
+        .spi_initstruct.IdleLevel = SPI_HIGH_LEVEL,   \
+        .spi_initstruct.WordSize = 8,                 \
+        .spi_initstruct.Master = 1,                   \
+        .spi_initstruct.RXHFullIEn = 0,               \
+        .spi_initstruct.TXEmptyIEn = 0,               \
+        .spi_initstruct.TXCompleteIEn = 0,            \
+    }
+#endif /* SPI1_BUS_CONFIG */
+#endif /* BSP_USING_SPI1 */
+
+#ifdef BSP_USING_SPI1
+#ifndef SPI1_BUS_CONFIG
+#define SPI1_BUS_CONFIG                               \
+    {                                                 \
+        .name = "spi1",                               \
+        .SPIx = SPI1,                                 \
+        .spi_initstruct.clkDiv = SPI_CLKDIV_32,       \
+        .spi_initstruct.FrameFormat = SPI_FORMAT_SPI, \
+        .spi_initstruct.SampleEdge = SPI_SECOND_EDGE, \
+        .spi_initstruct.IdleLevel = SPI_HIGH_LEVEL,   \
+        .spi_initstruct.WordSize = 8,                 \
+        .spi_initstruct.Master = 1,                   \
+        .spi_initstruct.RXHFullIEn = 0,               \
+        .spi_initstruct.TXEmptyIEn = 0,               \
+        .spi_initstruct.TXCompleteIEn = 0,            \
+    }
+#endif /* SPI1_BUS_CONFIG */
+#endif /* BSP_USING_SPI1 */
+
 //cannot be used before completion init
 //cannot be used before completion init
-static rt_err_t swm320_spi_bus_attach_device(rt_uint32_t pin,
-        const char *bus_name,
-        const char *device_name);
+rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, GPIO_TypeDef *GPIOx, uint32_t n);
 int rt_hw_spi_init(void);
 int rt_hw_spi_init(void);
 
 
-#endif
+#endif /* __DRV_SPI_H__ */

+ 29 - 25
bsp/swm320-lq100/drivers/drv_sram.c

@@ -7,40 +7,44 @@
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-05-31     ZYH          first version
  * 2018-05-31     ZYH          first version
  * 2018-12-10     Zohar_Lee    format file
  * 2018-12-10     Zohar_Lee    format file
+ * 2020-07-10     lik          rewrite
  */
  */
 
 
-#include <board.h>
-#include <rtthread.h>
-#include <rtdevice.h>
-#include <SWM320_port.h>
-#include <rthw.h>
+#include "drv_sram.h"
 
 
-int rt_hw_sram_init(void)
-{
-    int i;
-    PORT->PORTP_SEL0 = 0xAAAAAAAA; /* PP0-23 => ADDR0-23 */
-    PORT->PORTP_SEL1 = 0xAAAA;
-    PORT->PORTM_SEL0 = 0xAAAAAAAA; /* PM0-15 => DATA15-0 */
-    PORT->PORTM_INEN |= 0xFFFF;
-    PORT->PORTM_SEL1 = 0x2AA; /* PM16 => OEN、PM17 => WEN、PM18 => NORFL_CSN、PM19 => SDRAM_CSN、PM20 => SRAM_CSN、PM21 => SDRAM_CKE */
+#ifdef BSP_USING_EXT_SRAM
 
 
-    /* 配置SRAM前需要刷新下SDRAM控制器 */
+#define DRV_DEBUG
+#define LOG_TAG "drv.ext_sram"
+#include <drv_log.h>
 
 
-    SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
+#ifdef RT_USING_MEMHEAP_AS_HEAP
+static struct rt_memheap system_heap;
+#endif
 
 
-    while (SDRAMC->REFDONE == 0);
-    SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
+static int rt_hw_sram_init(void)
+{
+    SRAM_InitStructure SRAM_InitStruct;
 
 
-    for (i = 0; i < 1000; i++)
-    {
-    }
-    SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
+    PORT->PORTP_SEL0 = 0xAAAAAAAA; //PP0-23 => ADDR0-23
+    PORT->PORTP_SEL1 = 0xAAAA;
 
 
-    SYS->CLKEN |= (1 << SYS_CLKEN_RAMC_Pos);
+    PORT->PORTM_SEL0 = 0xAAAAAAAA; //PM0-15 => DATA15-0
+    PORT->PORTM_INEN = 0xFFFF;
 
 
-    SRAMC->CR = (9 << SRAMC_CR_RWTIME_Pos) |
-                (0 << SRAMC_CR_BYTEIF_Pos) | // 16位接口
-                (0 << SRAMC_CR_HBLBDIS_Pos); // 使能字节、半字访问
+    PORT->PORTM_SEL1 = 0xAAA; //PM16 => OEN,PM17 => WEN,PM18 => NORFL_CSN,PM19 => SDRAM_CSN,PM20 => SRAM_CSN,PM21 => SDRAM_CKE
+
+    SRAM_InitStruct.ClkDiv = SRAM_CLKDIV_8;
+    SRAM_InitStruct.DataWidth = SRAM_DATAWIDTH_16;
+    SRAM_Init(&SRAM_InitStruct);
+
+#ifdef RT_USING_MEMHEAP_AS_HEAP
+    /* If RT_USING_MEMHEAP_AS_HEAP is enabled, SRAM is initialized to the heap */
+    rt_memheap_init(&system_heap, "sram", (void *)EXT_SRAM_BEGIN, EXT_SRAM_SIZE);
+#endif
 
 
     return 0;
     return 0;
 }
 }
+INIT_BOARD_EXPORT(rt_hw_sram_init);
+
+#endif /* BSP_USING_EXT_SRAM */

+ 8 - 0
bsp/swm320-lq100/drivers/drv_sram.h

@@ -6,11 +6,19 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-12-10     Zohar_Lee    first version
  * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          rewrite
  */
  */
 
 
 #ifndef DRV_SRAM_H__
 #ifndef DRV_SRAM_H__
 #define DRV_SRAM_H__
 #define DRV_SRAM_H__
 
 
+#include "board.h"
+
+#define EXT_SRAM_BASE SRAMM_BASE
+#define EXT_SRAM_SIZE BSP_EXT_SRAM_SIZE
+#define EXT_SRAM_BEGIN EXT_SRAM_BASE
+#define EXT_SRAM_END (EXT_SRAM_BASE + EXT_SRAM_SIZE)
+
 int rt_hw_sram_init(void);
 int rt_hw_sram_init(void);
 
 
 #endif
 #endif

+ 170 - 146
bsp/swm320-lq100/drivers/drv_uart.c

@@ -7,193 +7,253 @@
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-05-31     ZYH          first version
  * 2018-05-31     ZYH          first version
  * 2018-12-10     Zohar_Lee    format file
  * 2018-12-10     Zohar_Lee    format file
+ * 2020-07-10     lik          format file
  */
  */
 
 
-#include <rtthread.h>
-#include <rtdevice.h>
-#include <board.h>
-#include <SWM320_port.h>
-#include <SWM320_uart.h>
+#include "drv_uart.h"
 
 
-struct swm320_uart
+#ifdef RT_USING_SERIAL
+#ifdef BSP_USING_UART
+
+//#define DRV_DEBUG
+#define LOG_TAG "drv.uart"
+#include <drv_log.h>
+
+#if !defined(BSP_USING_UART0) && !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) && \
+    !defined(BSP_USING_UART3)
+#error "Please define at least one BSP_USING_UARTx"
+/* this driver can be disabled at menuconfig -> RT-Thread Components -> Device Drivers */
+#endif
+
+enum
 {
 {
-    UART_TypeDef *uart;
-    IRQn_Type irq;
+#ifdef BSP_USING_UART0
+    UART0_INDEX,
+#endif
+#ifdef BSP_USING_UART1
+    UART1_INDEX,
+#endif
+#ifdef BSP_USING_UART2
+    UART2_INDEX,
+#endif
+#ifdef BSP_USING_UART3
+    UART3_INDEX,
+#endif
+};
+
+static struct swm_uart_cfg uart_cfg[] =
+    {
+#ifdef BSP_USING_UART0
+        UART0_CFG,
+#endif
+#ifdef BSP_USING_UART1
+        UART1_CFG,
+#endif
+#ifdef BSP_USING_UART2
+        UART2_CFG,
+#endif
+#ifdef BSP_USING_UART3
+        UART3_CFG,
+#endif
 };
 };
 
 
-static rt_err_t swm320_uart_configure(struct rt_serial_device *serial,
-                                      struct serial_configure *cfg)
+static struct swm_uart uart_drv[sizeof(uart_cfg) / sizeof(uart_cfg[0])] = {0};
+
+static rt_err_t swm_uart_init(struct rt_serial_device *serial_device, struct serial_configure *configure)
 {
 {
-    struct swm320_uart *uart;
-    UART_InitStructure UART_initStruct;
-    RT_ASSERT(serial != RT_NULL);
-    RT_ASSERT(cfg != RT_NULL);
-    uart = (struct swm320_uart *)serial->parent.user_data;
-    NVIC_DisableIRQ(uart->irq);
-    UART_initStruct.Baudrate = cfg->baud_rate;
-    UART_initStruct.RXThreshold = 1;
-    UART_initStruct.RXThresholdIEn = 1;
-    UART_initStruct.TXThresholdIEn = 0;
-    UART_initStruct.TimeoutTime = 10;
-    UART_initStruct.TimeoutIEn = 0;
-    switch (cfg->data_bits)
+    struct swm_uart_cfg *cfg;
+    RT_ASSERT(serial_device != RT_NULL);
+    RT_ASSERT(configure != RT_NULL);
+    cfg = serial_device->parent.user_data;
+
+    cfg->uart_initstruct.Baudrate = configure->baud_rate;
+    switch (configure->data_bits)
     {
     {
+    case DATA_BITS_8:
+        cfg->uart_initstruct.DataBits = UART_DATA_8BIT;
+        break;
     case DATA_BITS_9:
     case DATA_BITS_9:
-        UART_initStruct.DataBits = UART_DATA_9BIT;
+        cfg->uart_initstruct.DataBits = UART_DATA_9BIT;
         break;
         break;
     default:
     default:
-        UART_initStruct.DataBits = UART_DATA_8BIT;
+        cfg->uart_initstruct.DataBits = UART_DATA_8BIT;
         break;
         break;
     }
     }
-    switch (cfg->stop_bits)
+    switch (configure->stop_bits)
     {
     {
+    case STOP_BITS_1:
+        cfg->uart_initstruct.StopBits = UART_STOP_1BIT;
+        break;
     case STOP_BITS_2:
     case STOP_BITS_2:
-        UART_initStruct.StopBits = UART_STOP_2BIT;
+        cfg->uart_initstruct.StopBits = UART_STOP_2BIT;
         break;
         break;
     default:
     default:
-        UART_initStruct.StopBits = UART_STOP_1BIT;
+        cfg->uart_initstruct.StopBits = UART_STOP_1BIT;
         break;
         break;
     }
     }
-    switch (cfg->parity)
+    switch (configure->parity)
     {
     {
+    case PARITY_NONE:
+        cfg->uart_initstruct.Parity = UART_PARITY_NONE;
+        break;
     case PARITY_ODD:
     case PARITY_ODD:
-        UART_initStruct.Parity = UART_PARITY_ODD;
+        cfg->uart_initstruct.Parity = UART_PARITY_ODD;
         break;
         break;
     case PARITY_EVEN:
     case PARITY_EVEN:
-        UART_initStruct.Parity = UART_PARITY_EVEN;
+        cfg->uart_initstruct.Parity = UART_PARITY_EVEN;
+        break;
+    default:
+        cfg->uart_initstruct.Parity = UART_PARITY_NONE;
+        break;
+    }
+    switch ((uint32_t)cfg->UARTx)
+    {
+    case ((uint32_t)UART0):
+        PORT_Init(PORTA, PIN2, FUNMUX0_UART0_RXD, 1);
+        PORT_Init(PORTA, PIN3, FUNMUX1_UART0_TXD, 0);
+        break;
+    case ((uint32_t)UART1):
+        PORT_Init(PORTC, PIN2, FUNMUX0_UART1_RXD, 1);
+        PORT_Init(PORTC, PIN3, FUNMUX1_UART1_TXD, 0);
+        break;
+    case ((uint32_t)UART2):
+        PORT_Init(PORTC, PIN4, FUNMUX0_UART2_RXD, 1);
+        PORT_Init(PORTC, PIN5, FUNMUX1_UART2_TXD, 0);
+        break;
+    case ((uint32_t)UART3):
+        PORT_Init(PORTC, PIN6, FUNMUX0_UART3_RXD, 1);
+        PORT_Init(PORTC, PIN7, FUNMUX1_UART3_TXD, 0);
         break;
         break;
     default:
     default:
-        UART_initStruct.Parity = UART_PARITY_NONE;
         break;
         break;
     }
     }
-    UART_Init(uart->uart, &UART_initStruct);
-    UART_Open(uart->uart);
+    UART_Init(cfg->UARTx, &(cfg->uart_initstruct));
+    UART_Open(cfg->UARTx);
     return RT_EOK;
     return RT_EOK;
 }
 }
 
 
-static rt_err_t swm320_uart_control(struct rt_serial_device *serial,
-                                    int cmd, void *arg)
+static rt_err_t swm_uart_control(struct rt_serial_device *serial_device, int cmd, void *arg)
 {
 {
-    struct swm320_uart *uart;
-    RT_ASSERT(serial != RT_NULL);
-    uart = (struct swm320_uart *)serial->parent.user_data;
+    struct swm_uart_cfg *cfg;
+    RT_ASSERT(serial_device != RT_NULL);
+    cfg = serial_device->parent.user_data;
+
     switch (cmd)
     switch (cmd)
     {
     {
     case RT_DEVICE_CTRL_CLR_INT:
     case RT_DEVICE_CTRL_CLR_INT:
         /* disable rx irq */
         /* disable rx irq */
-        NVIC_DisableIRQ(uart->irq);
+        NVIC_DisableIRQ(cfg->irq);
         break;
         break;
     case RT_DEVICE_CTRL_SET_INT:
     case RT_DEVICE_CTRL_SET_INT:
         /* enable rx irq */
         /* enable rx irq */
-        NVIC_EnableIRQ(uart->irq);
+        NVIC_EnableIRQ(cfg->irq);
         break;
         break;
     }
     }
     return RT_EOK;
     return RT_EOK;
 }
 }
 
 
-static int swm320_uart_putc(struct rt_serial_device *serial, char c)
+static int swm_uart_putc(struct rt_serial_device *serial_device, char c)
 {
 {
-    struct swm320_uart *uart;
-    RT_ASSERT(serial != RT_NULL);
-    uart = (struct swm320_uart *)serial->parent.user_data;
-    while (UART_IsTXBusy(uart->uart));
-    uart->uart->DATA = c;
+    struct swm_uart_cfg *cfg;
+    RT_ASSERT(serial_device != RT_NULL);
+    cfg = serial_device->parent.user_data;
+
+    while (UART_IsTXFIFOFull(cfg->UARTx))
+        ;
+    UART_WriteByte(cfg->UARTx, c);
+    while (UART_IsTXBusy(cfg->UARTx))
+        ;
     return 1;
     return 1;
 }
 }
 
 
-static int swm320_uart_getc(struct rt_serial_device *serial)
+static int swm_uart_getc(struct rt_serial_device *serial_device)
 {
 {
     int ch;
     int ch;
-    struct swm320_uart *uart;
-    RT_ASSERT(serial != RT_NULL);
-    uart = (struct swm320_uart *)serial->parent.user_data;
+    struct swm_uart_cfg *cfg;
+    RT_ASSERT(serial_device != RT_NULL);
+    cfg = serial_device->parent.user_data;
+
     ch = -1;
     ch = -1;
-    if (UART_IsRXFIFOEmpty(uart->uart) == 0)
+    if (UART_IsRXFIFOEmpty(cfg->UARTx) == 0)
     {
     {
-        UART_ReadByte(uart->uart, (uint32_t *)&ch);
+        UART_ReadByte(cfg->UARTx, (uint32_t *)&ch);
     }
     }
     return ch;
     return ch;
 }
 }
 
 
-static const struct rt_uart_ops swm320_uart_ops =
+static const struct rt_uart_ops swm_uart_ops =
+    {
+        .configure = swm_uart_init,
+        .control = swm_uart_control,
+        .putc = swm_uart_putc,
+        .getc = swm_uart_getc,
+        .dma_transmit = RT_NULL};
+
+/**
+ * Uart common interrupt process. This need add to uart ISR.
+ *
+ * @param serial serial device
+ */
+static void rt_hw_uart_isr(struct rt_serial_device *serial_device)
 {
 {
-    swm320_uart_configure,
-    swm320_uart_control,
-    swm320_uart_putc,
-    swm320_uart_getc,
-};
+    struct swm_uart_cfg *cfg;
+    RT_ASSERT(serial_device != RT_NULL);
+    cfg = serial_device->parent.user_data;
+
+    /* UART in mode Receiver -------------------------------------------------*/
+    if (UART_INTRXThresholdStat(cfg->UARTx) || UART_INTTimeoutStat(cfg->UARTx))
+    {
+        rt_hw_serial_isr(serial_device, RT_SERIAL_EVENT_RX_IND);
+    }
+}
 
 
 #if defined(BSP_USING_UART0)
 #if defined(BSP_USING_UART0)
-/* UART0 device driver structure */
-static struct swm320_uart uart0;
-static struct rt_serial_device serial0;
 void UART0_Handler(void)
 void UART0_Handler(void)
 {
 {
     /* enter interrupt */
     /* enter interrupt */
     rt_interrupt_enter();
     rt_interrupt_enter();
 
 
-    /* UART in mode Receiver */
-    if (UART_INTRXThresholdStat(uart0.uart) || UART_INTTimeoutStat(uart0.uart))
-    {
-        rt_hw_serial_isr(&serial0, RT_SERIAL_EVENT_RX_IND);
-    }
+    rt_hw_uart_isr(&(uart_drv[UART0_INDEX].serial_device));
+
     /* leave interrupt */
     /* leave interrupt */
     rt_interrupt_leave();
     rt_interrupt_leave();
 }
 }
 #endif /* BSP_USING_UART0 */
 #endif /* BSP_USING_UART0 */
 
 
 #if defined(BSP_USING_UART1)
 #if defined(BSP_USING_UART1)
-/* UART1 device driver structure */
-static struct swm320_uart uart1;
-static struct rt_serial_device serial1;
 void UART1_Handler(void)
 void UART1_Handler(void)
 {
 {
     /* enter interrupt */
     /* enter interrupt */
     rt_interrupt_enter();
     rt_interrupt_enter();
 
 
-    /* UART in mode Receiver */
-    if (UART_INTRXThresholdStat(uart1.uart) || UART_INTTimeoutStat(uart1.uart))
-    {
-        rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND);
-    }
+    rt_hw_uart_isr(&(uart_drv[UART1_INDEX].serial_device));
+
     /* leave interrupt */
     /* leave interrupt */
     rt_interrupt_leave();
     rt_interrupt_leave();
 }
 }
 #endif /* BSP_USING_UART1 */
 #endif /* BSP_USING_UART1 */
 
 
 #if defined(BSP_USING_UART2)
 #if defined(BSP_USING_UART2)
-/* UART2 device driver structure */
-static struct swm320_uart uart2;
-static struct rt_serial_device serial2;
 void UART2_Handler(void)
 void UART2_Handler(void)
 {
 {
     /* enter interrupt */
     /* enter interrupt */
     rt_interrupt_enter();
     rt_interrupt_enter();
 
 
-    /* UART in mode Receiver */
-    if (UART_INTRXThresholdStat(uart2.uart) || UART_INTTimeoutStat(uart2.uart))
-    {
-        rt_hw_serial_isr(&serial2, RT_SERIAL_EVENT_RX_IND);
-    }
+    rt_hw_uart_isr(&(uart_drv[UART2_INDEX].serial_device));
+
     /* leave interrupt */
     /* leave interrupt */
     rt_interrupt_leave();
     rt_interrupt_leave();
 }
 }
 #endif /* BSP_USING_UART2 */
 #endif /* BSP_USING_UART2 */
 
 
 #if defined(BSP_USING_UART3)
 #if defined(BSP_USING_UART3)
-/* UART3 device driver structure */
-static struct swm320_uart uart3;
-static struct rt_serial_device serial3;
 void UART3_Handler(void)
 void UART3_Handler(void)
 {
 {
     /* enter interrupt */
     /* enter interrupt */
     rt_interrupt_enter();
     rt_interrupt_enter();
 
 
-    /* UART in mode Receiver */
-    if (UART_INTRXThresholdStat(uart3.uart) || UART_INTTimeoutStat(uart3.uart))
-    {
-        rt_hw_serial_isr(&serial3, RT_SERIAL_EVENT_RX_IND);
-    }
+    rt_hw_uart_isr(&(uart_drv[UART3_INDEX].serial_device));
+
     /* leave interrupt */
     /* leave interrupt */
     rt_interrupt_leave();
     rt_interrupt_leave();
 }
 }
@@ -201,60 +261,24 @@ void UART3_Handler(void)
 
 
 int rt_hw_uart_init(void)
 int rt_hw_uart_init(void)
 {
 {
-    struct swm320_uart *uart;
-    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
-#ifdef BSP_USING_UART0
-    PORT_Init(PORTA, PIN2, FUNMUX0_UART0_RXD, 1);
-    PORT_Init(PORTA, PIN3, FUNMUX1_UART0_TXD, 0);
-    uart = &uart0;
-    uart->uart = UART0;
-    uart->irq = UART0_IRQn;
-    serial0.ops = &swm320_uart_ops;
-    serial0.config = config;
-    /* register UART0 device */
-    rt_hw_serial_register(&serial0, "uart0",
-                          RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
-                          uart);
-#endif /* BSP_USING_UART0 */
-#ifdef BSP_USING_UART1
-    PORT_Init(PORTC, PIN2, FUNMUX0_UART1_RXD, 1);
-    PORT_Init(PORTC, PIN3, FUNMUX1_UART1_TXD, 0);
-    uart = &uart1;
-    uart->uart = UART1;
-    uart->irq = UART1_IRQn;
-    serial1.ops = &swm320_uart_ops;
-    serial1.config = config;
-    /* register UART1 device */
-    rt_hw_serial_register(&serial1, "uart1",
-                          RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
-                          uart);
-#endif /* BSP_USING_UART1 */
-#ifdef BSP_USING_UART2
-    PORT_Init(PORTC, PIN4, FUNMUX0_UART2_RXD, 1);
-    PORT_Init(PORTC, PIN5, FUNMUX1_UART2_TXD, 0);
-    uart = &uart2;
-    uart->uart = UART2;
-    uart->irq = UART2_IRQn;
-    serial2.ops = &swm320_uart_ops;
-    serial2.config = config;
-    /* register UART2 device */
-    rt_hw_serial_register(&serial2, "uart2",
-                          RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
-                          uart);
-#endif /* BSP_USING_UART2 */
-#ifdef BSP_USING_UART3
-    PORT_Init(PORTC, PIN6, FUNMUX0_UART3_RXD, 1);
-    PORT_Init(PORTC, PIN7, FUNMUX1_UART3_TXD, 0);
-    uart = &uart3;
-    uart->uart = UART3;
-    uart->irq = UART3_IRQn;
-    serial3.ops = &swm320_uart_ops;
-    serial3.config = config;
-    /* register UART3 device */
-    rt_hw_serial_register(&serial3, "uart3",
-                          RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
-                          uart);
-#endif /* BSP_USING_UART3 */
-    return 0;
+    struct serial_configure cfg = RT_SERIAL_CONFIG_DEFAULT;
+    int i = 0;
+    rt_err_t result = RT_EOK;
+
+    for (i = 0; i < sizeof(uart_cfg) / sizeof(uart_cfg[0]); i++)
+    {
+        uart_drv[i].cfg = &uart_cfg[i];
+        uart_drv[i].serial_device.ops = &swm_uart_ops;
+        uart_drv[i].serial_device.config = cfg;
+        /* register UART device */
+        result = rt_hw_serial_register(&uart_drv[i].serial_device, uart_drv[i].cfg->name,
+                                       RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart_drv[i].cfg);
+        RT_ASSERT(result == RT_EOK);
+    }
+
+    return result;
 }
 }
 INIT_BOARD_EXPORT(rt_hw_uart_init);
 INIT_BOARD_EXPORT(rt_hw_uart_init);
+
+#endif /* BSP_USING_UART */
+#endif /* RT_USING_SERIAL */

+ 103 - 4
bsp/swm320-lq100/drivers/drv_uart.h

@@ -6,11 +6,110 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-12-10     Zohar_Lee    first version
  * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          rewrite
  */
  */
 
 
-#ifndef DRV_UART_H__
-#define DRV_UART_H__
+#ifndef __DRV_UART_H__
+#define __DRV_UART_H__
 
 
-int rt_hw_uart_init(void);
+#include "board.h"
 
 
-#endif
+/* swm config class */
+struct swm_uart_cfg
+{
+    const char *name;
+    UART_TypeDef *UARTx;
+    IRQn_Type irq;
+    UART_InitStructure uart_initstruct;
+};
+
+/* swm uart dirver class */
+struct swm_uart
+{
+    struct swm_uart_cfg *cfg;
+    struct rt_serial_device serial_device;
+};
+
+#ifdef BSP_USING_UART0
+#ifndef UART0_CFG
+#define UART0_CFG                                   \
+    {                                               \
+        .name = "uart0",                            \
+        .UARTx = UART0,                             \
+        .irq = UART0_IRQn,                          \
+        .uart_initstruct.Baudrate = 115200,         \
+        .uart_initstruct.DataBits = UART_DATA_8BIT, \
+        .uart_initstruct.Parity = UART_PARITY_NONE, \
+        .uart_initstruct.StopBits = UART_STOP_1BIT, \
+        .uart_initstruct.RXThreshold = 0,           \
+        .uart_initstruct.RXThresholdIEn = 1,        \
+        .uart_initstruct.TXThresholdIEn = 0,        \
+        .uart_initstruct.TimeoutTime = 10,          \
+        .uart_initstruct.TimeoutIEn = 1,            \
+    }
+#endif /* UART0_CFG */
+#endif /* BSP_USING_UART0 */
+
+#ifdef BSP_USING_UART1
+#ifndef UART1_CFG
+#define UART1_CFG                                   \
+    {                                               \
+        .name = "uart1",                            \
+        .UARTx = UART1,                             \
+        .irq = UART1_IRQn,                          \
+        .uart_initstruct.Baudrate = 115200,         \
+        .uart_initstruct.DataBits = UART_DATA_8BIT, \
+        .uart_initstruct.Parity = UART_PARITY_NONE, \
+        .uart_initstruct.StopBits = UART_STOP_1BIT, \
+        .uart_initstruct.RXThreshold = 0,           \
+        .uart_initstruct.RXThresholdIEn = 1,        \
+        .uart_initstruct.TXThresholdIEn = 0,        \
+        .uart_initstruct.TimeoutTime = 10,          \
+        .uart_initstruct.TimeoutIEn = 1,            \
+    }
+#endif /* UART1_CFG */
+#endif /* BSP_USING_UART1 */
+
+#ifdef BSP_USING_UART2
+#ifndef UART2_CFG
+#define UART2_CFG                                   \
+    {                                               \
+        .name = "uart2",                            \
+        .UARTx = UART2,                             \
+        .irq = UART2_IRQn,                          \
+        .uart_initstruct.Baudrate = 115200,         \
+        .uart_initstruct.DataBits = UART_DATA_8BIT, \
+        .uart_initstruct.Parity = UART_PARITY_NONE, \
+        .uart_initstruct.StopBits = UART_STOP_1BIT, \
+        .uart_initstruct.RXThreshold = 0,           \
+        .uart_initstruct.RXThresholdIEn = 1,        \
+        .uart_initstruct.TXThresholdIEn = 0,        \
+        .uart_initstruct.TimeoutTime = 10,          \
+        .uart_initstruct.TimeoutIEn = 1,            \
+    }
+#endif /* UART2_CFG */
+#endif /* BSP_USING_UART2 */
+
+#ifdef BSP_USING_UART3
+#ifndef UART3_CFG
+#define UART3_CFG                                   \
+    {                                               \
+        .name = "uart3",                            \
+        .UARTx = UART3,                             \
+        .irq = UART3_IRQn,                          \
+        .uart_initstruct.Baudrate = 115200,         \
+        .uart_initstruct.DataBits = UART_DATA_8BIT, \
+        .uart_initstruct.Parity = UART_PARITY_NONE, \
+        .uart_initstruct.StopBits = UART_STOP_1BIT, \
+        .uart_initstruct.RXThreshold = 0,           \
+        .uart_initstruct.RXThresholdIEn = 1,        \
+        .uart_initstruct.TXThresholdIEn = 0,        \
+        .uart_initstruct.TimeoutTime = 10,          \
+        .uart_initstruct.TimeoutIEn = 1,            \
+    }
+#endif /* UART3_CFG */
+#endif /* BSP_USING_UART3 */
+
+int rt_hw_serial_init(void);
+
+#endif /* __DRV_UART_H__ */

+ 88 - 0
bsp/swm320-lq100/drivers/drv_wdt.c

@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          format file
+ */
+
+#include "drv_wdt.h"
+
+#ifdef RT_USING_WDT
+#ifdef BSP_USING_WDT
+//#define DRV_DEBUG
+#define LOG_TAG "drv.wdt"
+#include <drv_log.h>
+
+static struct swm_wdt_cfg wdt_cfg =
+    {
+        .name = "wdt",
+        .WDTx = WDT,
+};
+
+static struct swm_wdt wdt_drv;
+
+static rt_err_t swm_wdt_init(rt_watchdog_t *wdt_device)
+{
+    return RT_EOK;
+}
+
+static rt_err_t swm_wdt_control(rt_watchdog_t *wdt_device, int cmd, void *arg)
+{
+    struct swm_wdt_cfg *cfg;
+    RT_ASSERT(wdt_device != RT_NULL);
+    cfg = wdt_device->parent.user_data;
+
+    switch (cmd)
+    {
+    case RT_DEVICE_CTRL_WDT_KEEPALIVE:
+        WDT_Feed(cfg->WDTx);
+        break;
+    case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
+        WDT_Init(cfg->WDTx, (SystemCoreClock * (*(rt_uint32_t *)arg)), WDT_MODE_RESET);
+        break;
+    case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
+        *(rt_uint32_t *)arg = (cfg->WDTx->LOAD) / SystemCoreClock;
+        break;
+    case RT_DEVICE_CTRL_WDT_GET_TIMELEFT:
+        *(rt_uint32_t *)arg = WDT_GetValue(cfg->WDTx) / SystemCoreClock;
+        break;
+    case RT_DEVICE_CTRL_WDT_START:
+        WDT_Start(cfg->WDTx);
+        break;
+    case RT_DEVICE_CTRL_WDT_STOP:
+        WDT_Stop(cfg->WDTx);
+        break;
+    default:
+        LOG_W("This command is not supported.");
+        return -RT_ERROR;
+    }
+
+    return RT_EOK;
+}
+
+const static struct rt_watchdog_ops swm_wdt_ops =
+    {
+        swm_wdt_init,
+        swm_wdt_control};
+
+int rt_hw_wdt_init(void)
+{
+    wdt_drv.cfg = &wdt_cfg;
+    wdt_drv.wdt_device.ops = &swm_wdt_ops;
+
+    if (rt_hw_watchdog_register(&wdt_drv.wdt_device, wdt_drv.cfg->name, RT_DEVICE_FLAG_RDWR, wdt_drv.cfg) != RT_EOK)
+    {
+        LOG_E("wdt device register failed.");
+        return -RT_ERROR;
+    }
+    LOG_D("wdt device register success.");
+    return RT_EOK;
+}
+INIT_BOARD_EXPORT(rt_hw_wdt_init);
+
+#endif /* BSP_USING_WDT */
+#endif /* RT_USING_WDT */

+ 31 - 0
bsp/swm320-lq100/drivers/drv_wdt.h

@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2006-2018, Synwit Technology Co.,Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2018-12-10     Zohar_Lee    first version
+ * 2020-07-10     lik          rewrite
+ */
+
+#ifndef __DRV_WDT_H__
+#define __DRV_WDT_H__
+
+#include "board.h"
+
+struct swm_wdt_cfg
+{
+    const char *name;
+    WDT_TypeDef *WDTx;
+};
+
+struct swm_wdt
+{
+    struct swm_wdt_cfg *cfg;
+    struct rt_watchdog_device wdt_device;
+};
+
+int rt_hw_wdt_init(void);
+
+#endif /* __DRV_WDT_H__ */

+ 37 - 0
bsp/swm320-lq100/keilkill.bat

@@ -0,0 +1,37 @@
+del *.bak /s
+del *.ddk /s
+del *.edk /s
+del *.lst /s
+::del *.lnp /s
+del *.mpf /s
+del *.mpj /s
+del *.obj /s
+del *.omf /s
+::del *.opt /s  ::不允许删除JLINK的设置
+del *.plg /s
+del *.rpt /s
+del *.tmp /s
+::del *.__i /s
+::del *._ia /s
+del *.crf /s
+del *.o /s
+del *.d /s
+del *.axf /s
+del *.tra /s
+del *.dep /s           
+::del JLinkLog.txt /s
+
+del *.iex /s
+del *.htm /s
+::del *.sct /s
+del *.map /s
+
+del *.whsj2 /s
+del *.SYNWIT_Lik /s
+del *.whsj2 /s
+del *.scvd /s
+
+rmdir /s/q .git
+rmdir /s/q .vscode
+
+exit

+ 10 - 10
bsp/swm320-lq100/project.ewd

@@ -44,7 +44,7 @@
                 </option>
                 </option>
                 <option>
                 <option>
                     <name>MemFile</name>
                     <name>MemFile</name>
-                    <state>$TOOLKIT_DIR$\CONFIG\debugger\Synwit\SWM320.ddf</state>
+                    <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32F407ZG.ddf</state>
                 </option>
                 </option>
                 <option>
                 <option>
                     <name>RunToEnable</name>
                     <name>RunToEnable</name>
@@ -80,7 +80,7 @@
                 </option>
                 </option>
                 <option>
                 <option>
                     <name>OCProductVersion</name>
                     <name>OCProductVersion</name>
-                    <state>8.20.1.14181</state>
+                    <state>8.11.3.13977</state>
                 </option>
                 </option>
                 <option>
                 <option>
                     <name>OCDynDriverList</name>
                     <name>OCDynDriverList</name>
@@ -88,7 +88,7 @@
                 </option>
                 </option>
                 <option>
                 <option>
                     <name>OCLastSavedByProductVersion</name>
                     <name>OCLastSavedByProductVersion</name>
-                    <state>8.20.1.14181</state>
+                    <state>8.11.3.13977</state>
                 </option>
                 </option>
                 <option>
                 <option>
                     <name>UseFlashLoader</name>
                     <name>UseFlashLoader</name>
@@ -112,7 +112,7 @@
                 </option>
                 </option>
                 <option>
                 <option>
                     <name>FlashLoadersV3</name>
                     <name>FlashLoadersV3</name>
-                    <state>$TOOLKIT_DIR$\config\flashloader\Synwit\FlashSWM320xE.board</state>
+                    <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32F4xxx.board</state>
                 </option>
                 </option>
                 <option>
                 <option>
                     <name>OCImagesSuppressCheck1</name>
                     <name>OCImagesSuppressCheck1</name>
@@ -892,7 +892,7 @@
                 </option>
                 </option>
                 <option>
                 <option>
                     <name>CCCpuClockEdit</name>
                     <name>CCCpuClockEdit</name>
-                    <state></state>
+                    <state>168.0</state>
                 </option>
                 </option>
                 <option>
                 <option>
                     <name>CCSwoClockAuto</name>
                     <name>CCSwoClockAuto</name>
@@ -1403,11 +1403,11 @@
                 <loadFlag>1</loadFlag>
                 <loadFlag>1</loadFlag>
             </plugin>
             </plugin>
             <plugin>
             <plugin>
-                <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+                <file>$EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin</file>
                 <loadFlag>0</loadFlag>
                 <loadFlag>0</loadFlag>
             </plugin>
             </plugin>
             <plugin>
             <plugin>
-                <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+                <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
                 <loadFlag>0</loadFlag>
                 <loadFlag>0</loadFlag>
             </plugin>
             </plugin>
             <plugin>
             <plugin>
@@ -1495,7 +1495,7 @@
                 </option>
                 </option>
                 <option>
                 <option>
                     <name>OCProductVersion</name>
                     <name>OCProductVersion</name>
-                    <state>8.20.1.14181</state>
+                    <state>8.11.3.13977</state>
                 </option>
                 </option>
                 <option>
                 <option>
                     <name>OCDynDriverList</name>
                     <name>OCDynDriverList</name>
@@ -2818,11 +2818,11 @@
                 <loadFlag>1</loadFlag>
                 <loadFlag>1</loadFlag>
             </plugin>
             </plugin>
             <plugin>
             <plugin>
-                <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+                <file>$EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin</file>
                 <loadFlag>0</loadFlag>
                 <loadFlag>0</loadFlag>
             </plugin>
             </plugin>
             <plugin>
             <plugin>
-                <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+                <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
                 <loadFlag>0</loadFlag>
                 <loadFlag>0</loadFlag>
             </plugin>
             </plugin>
             <plugin>
             <plugin>

+ 2231 - 2289
bsp/swm320-lq100/project.ewp

@@ -1,2289 +1,2231 @@
-<project>
-  <fileVersion>3</fileVersion>
-  <configuration>
-    <name>rt-thread</name>
-    <toolchain>
-      <name>ARM</name>
-    </toolchain>
-    <debug>1</debug>
-    <settings>
-      <name>General</name>
-      <archiveVersion>3</archiveVersion>
-      <data>
-        <version>29</version>
-        <wantNonLocal>1</wantNonLocal>
-        <debug>1</debug>
-        <option>
-          <name>ExePath</name>
-          <state>build\iar\Exe</state>
-        </option>
-        <option>
-          <name>ObjPath</name>
-          <state>build\iar\Obj</state>
-        </option>
-        <option>
-          <name>ListPath</name>
-          <state>build\iar\List</state>
-        </option>
-        <option>
-          <name>GEndianMode</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>Input description</name>
-          <state>Automatic choice of formatter, without multibyte support.</state>
-        </option>
-        <option>
-          <name>Output description</name>
-          <state>Automatic choice of formatter, without multibyte support.</state>
-        </option>
-        <option>
-          <name>GOutputBinary</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGCoreOrChip</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>GRuntimeLibSelect</name>
-          <version>0</version>
-          <state>1</state>
-        </option>
-        <option>
-          <name>GRuntimeLibSelectSlave</name>
-          <version>0</version>
-          <state>1</state>
-        </option>
-        <option>
-          <name>RTDescription</name>
-          <state>Use the normal configuration of the C/C++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>
-        </option>
-        <option>
-          <name>OGProductVersion</name>
-          <state>6.30.6.53380</state>
-        </option>
-        <option>
-          <name>OGLastSavedByProductVersion</name>
-          <state>8.11.3.13977</state>
-        </option>
-        <option>
-          <name>GeneralEnableMisra</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GeneralMisraVerbose</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGChipSelectEditMenu</name>
-          <state>SWM320xE	Synwit SWM320xE</state>
-        </option>
-        <option>
-          <name>GenLowLevelInterface</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>GEndianModeBE</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>OGBufferedTerminalOutput</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GenStdoutInterface</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GeneralMisraRules98</name>
-          <version>0</version>
-          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
-        </option>
-        <option>
-          <name>GeneralMisraVer</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GeneralMisraRules04</name>
-          <version>0</version>
-          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
-        </option>
-        <option>
-          <name>RTConfigPath2</name>
-          <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Normal.h</state>
-        </option>
-        <option>
-          <name>GBECoreSlave</name>
-          <version>25</version>
-          <state>39</state>
-        </option>
-        <option>
-          <name>OGUseCmsis</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGUseCmsisDspLib</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GRuntimeLibThreads</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CoreVariant</name>
-          <version>25</version>
-          <state>39</state>
-        </option>
-        <option>
-          <name>GFPUDeviceSlave</name>
-          <state>SWM320xE	Synwit SWM320xE</state>
-        </option>
-        <option>
-          <name>FPU2</name>
-          <version>0</version>
-          <state>4</state>
-        </option>
-        <option>
-          <name>NrRegs</name>
-          <version>0</version>
-          <state>1</state>
-        </option>
-        <option>
-          <name>NEON</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GFPUCoreSlave2</name>
-          <version>25</version>
-          <state>39</state>
-        </option>
-        <option>
-          <name>OGCMSISPackSelectDevice</name>
-        </option>
-        <option>
-          <name>OgLibHeap</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGLibAdditionalLocale</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGPrintfVariant</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGPrintfMultibyteSupport</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGScanfVariant</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGScanfMultibyteSupport</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GenLocaleTags</name>
-          <state />
-        </option>
-        <option>
-          <name>GenLocaleDisplayOnly</name>
-          <state />
-        </option>
-        <option>
-          <name>DSPExtension</name>
-          <state>1</state>
-        </option>
-      </data>
-    </settings>
-    <settings>
-      <name>ICCARM</name>
-      <archiveVersion>2</archiveVersion>
-      <data>
-        <version>34</version>
-        <wantNonLocal>1</wantNonLocal>
-        <debug>1</debug>
-        <option>
-          <name>CCOptimizationNoSizeConstraints</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCDefines</name>
-          <state />
-        </option>
-        <option>
-          <name>CCPreprocFile</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCPreprocComments</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCPreprocLine</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCListCFile</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCListCMnemonics</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCListCMessages</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCListAssFile</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCListAssSource</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCEnableRemarks</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCDiagSuppress</name>
-          <state>Pa050</state>
-        </option>
-        <option>
-          <name>CCDiagRemark</name>
-          <state />
-        </option>
-        <option>
-          <name>CCDiagWarning</name>
-          <state />
-        </option>
-        <option>
-          <name>CCDiagError</name>
-          <state />
-        </option>
-        <option>
-          <name>CCObjPrefix</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CCAllowList</name>
-          <version>1</version>
-          <state>00000000</state>
-        </option>
-        <option>
-          <name>CCDebugInfo</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IEndianMode</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IProcessor</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IExtraOptionsCheck</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IExtraOptions</name>
-          <state />
-        </option>
-        <option>
-          <name>CCLangConformance</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCSignedPlainChar</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CCRequirePrototypes</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCDiagWarnAreErr</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCCompilerRuntimeInfo</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IFpuProcessor</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>OutputFile</name>
-          <state>$FILE_BNAME$.o</state>
-        </option>
-        <option>
-          <name>CCLibConfigHeader</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>PreInclude</name>
-          <state />
-        </option>
-        <option>
-          <name>CompilerMisraOverride</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCIncludePath2</name>
-          <state />
-          <state>$PROJ_DIR$\applications</state>
-          <state>$PROJ_DIR$\Libraries\CMSIS\DeviceSupport</state>
-          <state>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver</state>
-          <state>$PROJ_DIR$\drivers</state>
-          <state>$PROJ_DIR$\..\..\components\libc\compilers\common</state>
-          <state>$PROJ_DIR$\.</state>
-          <state>$PROJ_DIR$\..\..\include</state>
-          <state>$PROJ_DIR$\..\..\libcpu\arm\cortex-m4</state>
-          <state>$PROJ_DIR$\..\..\components\drivers\include</state>
-          <state>$PROJ_DIR$\..\..\libcpu\arm\common</state>
-          <state>$PROJ_DIR$\..\..\components\finsh</state>
-          <state>$PROJ_DIR$\Libraries\CMSIS\CoreSupport</state>
-        </option>
-        <option>
-          <name>CCStdIncCheck</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCCodeSection</name>
-          <state>.text</state>
-        </option>
-        <option>
-          <name>IProcessorMode2</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CCOptLevel</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CCOptStrategy</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCOptLevelSlave</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CompilerMisraRules98</name>
-          <version>0</version>
-          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
-        </option>
-        <option>
-          <name>CompilerMisraRules04</name>
-          <version>0</version>
-          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
-        </option>
-        <option>
-          <name>CCPosIndRopi</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCPosIndRwpi</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCPosIndNoDynInit</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IccLang</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IccCDialect</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IccAllowVLA</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IccStaticDestr</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IccCppInlineSemantics</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IccCmsis</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IccFloatSemantics</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCNoLiteralPool</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCOptStrategySlave</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCGuardCalls</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CCEncSource</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCEncOutput</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCEncOutputBom</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CCEncInput</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IccExceptions2</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IccRTTI2</name>
-          <state>0</state>
-        </option>
-      </data>
-    </settings>
-    <settings>
-      <name>AARM</name>
-      <archiveVersion>2</archiveVersion>
-      <data>
-        <version>10</version>
-        <wantNonLocal>1</wantNonLocal>
-        <debug>1</debug>
-        <option>
-          <name>AObjPrefix</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>AEndian</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>ACaseSensitivity</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>MacroChars</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AWarnEnable</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AWarnWhat</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AWarnOne</name>
-          <state />
-        </option>
-        <option>
-          <name>AWarnRange1</name>
-          <state />
-        </option>
-        <option>
-          <name>AWarnRange2</name>
-          <state />
-        </option>
-        <option>
-          <name>ADebug</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>AltRegisterNames</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>ADefines</name>
-          <state />
-        </option>
-        <option>
-          <name>AList</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AListHeader</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>AListing</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>Includes</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>MacDefs</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>MacExps</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>MacExec</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OnlyAssed</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>MultiLine</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>PageLengthCheck</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>PageLength</name>
-          <state>80</state>
-        </option>
-        <option>
-          <name>TabSpacing</name>
-          <state>8</state>
-        </option>
-        <option>
-          <name>AXRef</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AXRefDefines</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AXRefInternal</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AXRefDual</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AProcessor</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>AFpuProcessor</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>AOutputFile</name>
-          <state>$FILE_BNAME$.o</state>
-        </option>
-        <option>
-          <name>ALimitErrorsCheck</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>ALimitErrorsEdit</name>
-          <state>100</state>
-        </option>
-        <option>
-          <name>AIgnoreStdInclude</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AUserIncludes</name>
-          <state />
-        </option>
-        <option>
-          <name>AExtraOptionsCheckV2</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AExtraOptionsV2</name>
-          <state />
-        </option>
-        <option>
-          <name>AsmNoLiteralPool</name>
-          <state>0</state>
-        </option>
-      </data>
-    </settings>
-    <settings>
-      <name>OBJCOPY</name>
-      <archiveVersion>0</archiveVersion>
-      <data>
-        <version>1</version>
-        <wantNonLocal>1</wantNonLocal>
-        <debug>1</debug>
-        <option>
-          <name>OOCOutputFormat</name>
-          <version>3</version>
-          <state>3</state>
-        </option>
-        <option>
-          <name>OCOutputOverride</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>OOCOutputFile</name>
-          <state>../../../rtthread.bin</state>
-        </option>
-        <option>
-          <name>OOCCommandLineProducer</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>OOCObjCopyEnable</name>
-          <state>1</state>
-        </option>
-      </data>
-    </settings>
-    <settings>
-      <name>CUSTOM</name>
-      <archiveVersion>3</archiveVersion>
-      <data>
-        <extensions />
-        <cmdline />
-        <hasPrio>0</hasPrio>
-      </data>
-    </settings>
-    <settings>
-      <name>BICOMP</name>
-      <archiveVersion>0</archiveVersion>
-      <data />
-    </settings>
-    <settings>
-      <name>BUILDACTION</name>
-      <archiveVersion>1</archiveVersion>
-      <data>
-        <prebuild />
-        <postbuild />
-      </data>
-    </settings>
-    <settings>
-      <name>ILINK</name>
-      <archiveVersion>0</archiveVersion>
-      <data>
-        <version>20</version>
-        <wantNonLocal>1</wantNonLocal>
-        <debug>1</debug>
-        <option>
-          <name>IlinkLibIOConfig</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>XLinkMisraHandler</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkInputFileSlave</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkOutputFile</name>
-          <state>rtthread.out</state>
-        </option>
-        <option>
-          <name>IlinkDebugInfoEnable</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkKeepSymbols</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkRawBinaryFile</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkRawBinarySymbol</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkRawBinarySegment</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkRawBinaryAlign</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkDefines</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkConfigDefines</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkMapFile</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogFile</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogInitialization</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogModule</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogSection</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogVeneer</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkIcfOverride</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkIcfFile</name>
-          <state>$PROJ_DIR$\drivers\linker_scripts\link.icf</state>
-        </option>
-        <option>
-          <name>IlinkIcfFileSlave</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkEnableRemarks</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkSuppressDiags</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkTreatAsRem</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkTreatAsWarn</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkTreatAsErr</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkWarningsAreErrors</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkUseExtraOptions</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkExtraOptions</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkLowLevelInterfaceSlave</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkAutoLibEnable</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkAdditionalLibs</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkOverrideProgramEntryLabel</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkProgramEntryLabelSelect</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkProgramEntryLabel</name>
-          <state>__iar_program_start</state>
-        </option>
-        <option>
-          <name>DoFill</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>FillerByte</name>
-          <state>0xFF</state>
-        </option>
-        <option>
-          <name>FillerStart</name>
-          <state>0x0</state>
-        </option>
-        <option>
-          <name>FillerEnd</name>
-          <state>0x0</state>
-        </option>
-        <option>
-          <name>CrcSize</name>
-          <version>0</version>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CrcAlign</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CrcPoly</name>
-          <state>0x11021</state>
-        </option>
-        <option>
-          <name>CrcCompl</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CrcBitOrder</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CrcInitialValue</name>
-          <state>0x0</state>
-        </option>
-        <option>
-          <name>DoCrc</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkBE8Slave</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkBufferedTerminalOutput</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkStdoutInterfaceSlave</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CrcFullSize</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkIElfToolPostProcess</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogAutoLibSelect</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogRedirSymbols</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogUnusedFragments</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkCrcReverseByteOrder</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkCrcUseAsInput</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkOptInline</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkOptExceptionsAllow</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkOptExceptionsForce</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkCmsis</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkOptMergeDuplSections</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkOptUseVfe</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkOptForceVfe</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkStackAnalysisEnable</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkStackControlFile</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkStackCallGraphFile</name>
-          <state />
-        </option>
-        <option>
-          <name>CrcAlgorithm</name>
-          <version>1</version>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CrcUnitSize</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkThreadsSlave</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkLogCallGraph</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkIcfFile_AltDefault</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkEncInput</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkEncOutput</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkEncOutputBom</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkHeapSelect</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkLocaleSelect</name>
-          <state>1</state>
-        </option>
-      </data>
-    </settings>
-    <settings>
-      <name>IARCHIVE</name>
-      <archiveVersion>0</archiveVersion>
-      <data>
-        <version>0</version>
-        <wantNonLocal>1</wantNonLocal>
-        <debug>1</debug>
-        <option>
-          <name>IarchiveInputs</name>
-          <state />
-        </option>
-        <option>
-          <name>IarchiveOverride</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IarchiveOutput</name>
-          <state>###Unitialized###</state>
-        </option>
-      </data>
-    </settings>
-    <settings>
-      <name>BILINK</name>
-      <archiveVersion>0</archiveVersion>
-      <data />
-    </settings>
-  </configuration>
-  <configuration>
-    <name>Release</name>
-    <toolchain>
-      <name>ARM</name>
-    </toolchain>
-    <debug>0</debug>
-    <settings>
-      <name>General</name>
-      <archiveVersion>3</archiveVersion>
-      <data>
-        <version>29</version>
-        <wantNonLocal>1</wantNonLocal>
-        <debug>0</debug>
-        <option>
-          <name>ExePath</name>
-          <state>Release\Exe</state>
-        </option>
-        <option>
-          <name>ObjPath</name>
-          <state>Release\Obj</state>
-        </option>
-        <option>
-          <name>ListPath</name>
-          <state>Release\List</state>
-        </option>
-        <option>
-          <name>GEndianMode</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>Input description</name>
-          <state />
-        </option>
-        <option>
-          <name>Output description</name>
-          <state />
-        </option>
-        <option>
-          <name>GOutputBinary</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGCoreOrChip</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GRuntimeLibSelect</name>
-          <version>0</version>
-          <state>1</state>
-        </option>
-        <option>
-          <name>GRuntimeLibSelectSlave</name>
-          <version>0</version>
-          <state>1</state>
-        </option>
-        <option>
-          <name>RTDescription</name>
-          <state />
-        </option>
-        <option>
-          <name>OGProductVersion</name>
-          <state>6.30.6.53380</state>
-        </option>
-        <option>
-          <name>OGLastSavedByProductVersion</name>
-          <state>8.11.3.13977</state>
-        </option>
-        <option>
-          <name>GeneralEnableMisra</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GeneralMisraVerbose</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGChipSelectEditMenu</name>
-          <state>Default	None</state>
-        </option>
-        <option>
-          <name>GenLowLevelInterface</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GEndianModeBE</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGBufferedTerminalOutput</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GenStdoutInterface</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GeneralMisraRules98</name>
-          <version>0</version>
-          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
-        </option>
-        <option>
-          <name>GeneralMisraVer</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GeneralMisraRules04</name>
-          <version>0</version>
-          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
-        </option>
-        <option>
-          <name>RTConfigPath2</name>
-          <state />
-        </option>
-        <option>
-          <name>GBECoreSlave</name>
-          <version>25</version>
-          <state>1</state>
-        </option>
-        <option>
-          <name>OGUseCmsis</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGUseCmsisDspLib</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GRuntimeLibThreads</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CoreVariant</name>
-          <version>25</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GFPUDeviceSlave</name>
-          <state>Default	None</state>
-        </option>
-        <option>
-          <name>FPU2</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>NrRegs</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>NEON</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GFPUCoreSlave2</name>
-          <version>25</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGCMSISPackSelectDevice</name>
-        </option>
-        <option>
-          <name>OgLibHeap</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGLibAdditionalLocale</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGPrintfVariant</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGPrintfMultibyteSupport</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGScanfVariant</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OGScanfMultibyteSupport</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>GenLocaleTags</name>
-          <state />
-        </option>
-        <option>
-          <name>GenLocaleDisplayOnly</name>
-          <state />
-        </option>
-        <option>
-          <name>DSPExtension</name>
-          <state>0</state>
-        </option>
-      </data>
-    </settings>
-    <settings>
-      <name>ICCARM</name>
-      <archiveVersion>2</archiveVersion>
-      <data>
-        <version>34</version>
-        <wantNonLocal>1</wantNonLocal>
-        <debug>0</debug>
-        <option>
-          <name>CCOptimizationNoSizeConstraints</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCDefines</name>
-          <state />
-        </option>
-        <option>
-          <name>CCPreprocFile</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCPreprocComments</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCPreprocLine</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCListCFile</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCListCMnemonics</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCListCMessages</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCListAssFile</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCListAssSource</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCEnableRemarks</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCDiagSuppress</name>
-          <state />
-        </option>
-        <option>
-          <name>CCDiagRemark</name>
-          <state />
-        </option>
-        <option>
-          <name>CCDiagWarning</name>
-          <state />
-        </option>
-        <option>
-          <name>CCDiagError</name>
-          <state />
-        </option>
-        <option>
-          <name>CCObjPrefix</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CCAllowList</name>
-          <version>1</version>
-          <state>11111110</state>
-        </option>
-        <option>
-          <name>CCDebugInfo</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IEndianMode</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IProcessor</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IExtraOptionsCheck</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IExtraOptions</name>
-          <state />
-        </option>
-        <option>
-          <name>CCLangConformance</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCSignedPlainChar</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CCRequirePrototypes</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCDiagWarnAreErr</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCCompilerRuntimeInfo</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IFpuProcessor</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>OutputFile</name>
-          <state />
-        </option>
-        <option>
-          <name>CCLibConfigHeader</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>PreInclude</name>
-          <state />
-        </option>
-        <option>
-          <name>CompilerMisraOverride</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCIncludePath2</name>
-          <state />
-          <state>$PROJ_DIR$\applications</state>
-          <state>$PROJ_DIR$\Libraries\CMSIS\DeviceSupport</state>
-          <state>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver</state>
-          <state>$PROJ_DIR$\drivers</state>
-          <state>$PROJ_DIR$\..\..\components\libc\compilers\common</state>
-          <state>$PROJ_DIR$\.</state>
-          <state>$PROJ_DIR$\..\..\include</state>
-          <state>$PROJ_DIR$\..\..\libcpu\arm\cortex-m4</state>
-          <state>$PROJ_DIR$\..\..\components\drivers\include</state>
-          <state>$PROJ_DIR$\..\..\libcpu\arm\common</state>
-          <state>$PROJ_DIR$\..\..\components\finsh</state>
-          <state>$PROJ_DIR$\Libraries\CMSIS\CoreSupport</state>
-        </option>
-        <option>
-          <name>CCStdIncCheck</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCCodeSection</name>
-          <state>.text</state>
-        </option>
-        <option>
-          <name>IProcessorMode2</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CCOptLevel</name>
-          <state>3</state>
-        </option>
-        <option>
-          <name>CCOptStrategy</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCOptLevelSlave</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CompilerMisraRules98</name>
-          <version>0</version>
-          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
-        </option>
-        <option>
-          <name>CompilerMisraRules04</name>
-          <version>0</version>
-          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
-        </option>
-        <option>
-          <name>CCPosIndRopi</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCPosIndRwpi</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCPosIndNoDynInit</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IccLang</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IccCDialect</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IccAllowVLA</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IccStaticDestr</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IccCppInlineSemantics</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IccCmsis</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IccFloatSemantics</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCNoLiteralPool</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCOptStrategySlave</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCGuardCalls</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CCEncSource</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCEncOutput</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CCEncOutputBom</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CCEncInput</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IccExceptions2</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IccRTTI2</name>
-          <state>0</state>
-        </option>
-      </data>
-    </settings>
-    <settings>
-      <name>AARM</name>
-      <archiveVersion>2</archiveVersion>
-      <data>
-        <version>10</version>
-        <wantNonLocal>1</wantNonLocal>
-        <debug>0</debug>
-        <option>
-          <name>AObjPrefix</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>AEndian</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>ACaseSensitivity</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>MacroChars</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AWarnEnable</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AWarnWhat</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AWarnOne</name>
-          <state />
-        </option>
-        <option>
-          <name>AWarnRange1</name>
-          <state />
-        </option>
-        <option>
-          <name>AWarnRange2</name>
-          <state />
-        </option>
-        <option>
-          <name>ADebug</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AltRegisterNames</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>ADefines</name>
-          <state />
-        </option>
-        <option>
-          <name>AList</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AListHeader</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>AListing</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>Includes</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>MacDefs</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>MacExps</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>MacExec</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OnlyAssed</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>MultiLine</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>PageLengthCheck</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>PageLength</name>
-          <state>80</state>
-        </option>
-        <option>
-          <name>TabSpacing</name>
-          <state>8</state>
-        </option>
-        <option>
-          <name>AXRef</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AXRefDefines</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AXRefInternal</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AXRefDual</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AProcessor</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>AFpuProcessor</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>AOutputFile</name>
-          <state />
-        </option>
-        <option>
-          <name>ALimitErrorsCheck</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>ALimitErrorsEdit</name>
-          <state>100</state>
-        </option>
-        <option>
-          <name>AIgnoreStdInclude</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AUserIncludes</name>
-          <state />
-        </option>
-        <option>
-          <name>AExtraOptionsCheckV2</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>AExtraOptionsV2</name>
-          <state />
-        </option>
-        <option>
-          <name>AsmNoLiteralPool</name>
-          <state>0</state>
-        </option>
-      </data>
-    </settings>
-    <settings>
-      <name>OBJCOPY</name>
-      <archiveVersion>0</archiveVersion>
-      <data>
-        <version>1</version>
-        <wantNonLocal>1</wantNonLocal>
-        <debug>0</debug>
-        <option>
-          <name>OOCOutputFormat</name>
-          <version>3</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OCOutputOverride</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>OOCOutputFile</name>
-          <state />
-        </option>
-        <option>
-          <name>OOCCommandLineProducer</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>OOCObjCopyEnable</name>
-          <state>0</state>
-        </option>
-      </data>
-    </settings>
-    <settings>
-      <name>CUSTOM</name>
-      <archiveVersion>3</archiveVersion>
-      <data>
-        <extensions />
-        <cmdline />
-        <hasPrio>0</hasPrio>
-      </data>
-    </settings>
-    <settings>
-      <name>BICOMP</name>
-      <archiveVersion>0</archiveVersion>
-      <data />
-    </settings>
-    <settings>
-      <name>BUILDACTION</name>
-      <archiveVersion>1</archiveVersion>
-      <data>
-        <prebuild />
-        <postbuild />
-      </data>
-    </settings>
-    <settings>
-      <name>ILINK</name>
-      <archiveVersion>0</archiveVersion>
-      <data>
-        <version>20</version>
-        <wantNonLocal>1</wantNonLocal>
-        <debug>0</debug>
-        <option>
-          <name>IlinkLibIOConfig</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>XLinkMisraHandler</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkInputFileSlave</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkOutputFile</name>
-          <state>###Unitialized###</state>
-        </option>
-        <option>
-          <name>IlinkDebugInfoEnable</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkKeepSymbols</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkRawBinaryFile</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkRawBinarySymbol</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkRawBinarySegment</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkRawBinaryAlign</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkDefines</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkConfigDefines</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkMapFile</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogFile</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogInitialization</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogModule</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogSection</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogVeneer</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkIcfOverride</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkIcfFile</name>
-          <state>lnk0t.icf</state>
-        </option>
-        <option>
-          <name>IlinkIcfFileSlave</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkEnableRemarks</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkSuppressDiags</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkTreatAsRem</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkTreatAsWarn</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkTreatAsErr</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkWarningsAreErrors</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkUseExtraOptions</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkExtraOptions</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkLowLevelInterfaceSlave</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkAutoLibEnable</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkAdditionalLibs</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkOverrideProgramEntryLabel</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkProgramEntryLabelSelect</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkProgramEntryLabel</name>
-          <state />
-        </option>
-        <option>
-          <name>DoFill</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>FillerByte</name>
-          <state>0xFF</state>
-        </option>
-        <option>
-          <name>FillerStart</name>
-          <state>0x0</state>
-        </option>
-        <option>
-          <name>FillerEnd</name>
-          <state>0x0</state>
-        </option>
-        <option>
-          <name>CrcSize</name>
-          <version>0</version>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CrcAlign</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CrcPoly</name>
-          <state>0x11021</state>
-        </option>
-        <option>
-          <name>CrcCompl</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CrcBitOrder</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>CrcInitialValue</name>
-          <state>0x0</state>
-        </option>
-        <option>
-          <name>DoCrc</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkBE8Slave</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkBufferedTerminalOutput</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkStdoutInterfaceSlave</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CrcFullSize</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkIElfToolPostProcess</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogAutoLibSelect</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogRedirSymbols</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkLogUnusedFragments</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkCrcReverseByteOrder</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkCrcUseAsInput</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkOptInline</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkOptExceptionsAllow</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkOptExceptionsForce</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkCmsis</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkOptMergeDuplSections</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkOptUseVfe</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkOptForceVfe</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkStackAnalysisEnable</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkStackControlFile</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkStackCallGraphFile</name>
-          <state />
-        </option>
-        <option>
-          <name>CrcAlgorithm</name>
-          <version>1</version>
-          <state>1</state>
-        </option>
-        <option>
-          <name>CrcUnitSize</name>
-          <version>0</version>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkThreadsSlave</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkLogCallGraph</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkIcfFile_AltDefault</name>
-          <state />
-        </option>
-        <option>
-          <name>IlinkEncInput</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkEncOutput</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IlinkEncOutputBom</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkHeapSelect</name>
-          <state>1</state>
-        </option>
-        <option>
-          <name>IlinkLocaleSelect</name>
-          <state>1</state>
-        </option>
-      </data>
-    </settings>
-    <settings>
-      <name>IARCHIVE</name>
-      <archiveVersion>0</archiveVersion>
-      <data>
-        <version>0</version>
-        <wantNonLocal>1</wantNonLocal>
-        <debug>0</debug>
-        <option>
-          <name>IarchiveInputs</name>
-          <state />
-        </option>
-        <option>
-          <name>IarchiveOverride</name>
-          <state>0</state>
-        </option>
-        <option>
-          <name>IarchiveOutput</name>
-          <state>###Unitialized###</state>
-        </option>
-      </data>
-    </settings>
-    <settings>
-      <name>BILINK</name>
-      <archiveVersion>0</archiveVersion>
-      <data />
-    </settings>
-  </configuration>
-  <group>
-    <name>Kernel</name>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\clock.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\components.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\cpu.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\device.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\idle.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\ipc.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\irq.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\kservice.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\mem.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\memheap.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\mempool.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\object.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\scheduler.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\signal.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\thread.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\src\timer.c</name>
-    </file>
-  </group>
-  <group>
-    <name>Applications</name>
-    <file>
-      <name>$PROJ_DIR$\applications\main.c</name>
-    </file>
-  </group>
-  <group>
-    <name>Drivers</name>
-    <file>
-      <name>$PROJ_DIR$\drivers\board.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\drivers\drv_gpio.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\drivers\drv_uart.c</name>
-    </file>
-  </group>
-  <group>
-    <name>Libraries</name>
-    <file>
-      <name>$PROJ_DIR$\Libraries\CMSIS\DeviceSupport\system_SWM320.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_adc.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_can.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_crc.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_dma.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_exti.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_flash.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_gpio.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_i2c.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_lcd.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_norflash.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_port.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_pwm.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_rtc.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_sdio.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_sdram.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_spi.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_timr.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_uart.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\SWM320_StdPeriph_Driver\SWM320_wdt.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\Libraries\CMSIS\DeviceSupport\startup\iar\startup_SWM320.s</name>
-    </file>
-  </group>
-  <group>
-    <name>cpu</name>
-    <file>
-      <name>$PROJ_DIR$\..\..\libcpu\arm\common\backtrace.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\libcpu\arm\common\div0.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\libcpu\arm\common\showmem.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\libcpu\arm\cortex-m4\cpuport.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\libcpu\arm\cortex-m4\context_iar.S</name>
-    </file>
-  </group>
-  <group>
-    <name>DeviceDrivers</name>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\drivers\hwtimer\hwtimer.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\drivers\misc\pin.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\drivers\misc\rt_drv_pwm.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\drivers\serial\serial.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\drivers\src\completion.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\drivers\src\dataqueue.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\drivers\src\pipe.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\drivers\src\ringblk_buf.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\drivers\src\ringbuffer.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\drivers\src\waitqueue.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\drivers\src\workqueue.c</name>
-    </file>
-  </group>
-  <group>
-    <name>finsh</name>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\shell.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\cmd.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\msh.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\finsh_compiler.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\finsh_error.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\finsh_heap.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\finsh_init.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\finsh_node.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\finsh_ops.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\finsh_parser.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\finsh_var.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\finsh_vm.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\..\..\components\finsh\finsh_token.c</name>
-    </file>
-  </group>
-  <group>
-    <name>libc</name>
-  </group>
-</project>
+<project>
+  <fileVersion>3</fileVersion>
+  <configuration>
+    <name>rtthread</name>
+    <toolchain>
+      <name>ARM</name>
+    </toolchain>
+    <debug>1</debug>
+    <settings>
+      <name>General</name>
+      <archiveVersion>3</archiveVersion>
+      <data>
+        <version>29</version>
+        <wantNonLocal>1</wantNonLocal>
+        <debug>1</debug>
+        <option>
+          <name>ExePath</name>
+          <state>build\iar\Exe</state>
+        </option>
+        <option>
+          <name>ObjPath</name>
+          <state>build\iar\Obj</state>
+        </option>
+        <option>
+          <name>ListPath</name>
+          <state>build\iar\List</state>
+        </option>
+        <option>
+          <name>GEndianMode</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>Input description</name>
+          <state>Automatic choice of formatter, without multibyte support.</state>
+        </option>
+        <option>
+          <name>Output description</name>
+          <state>Automatic choice of formatter, without multibyte support.</state>
+        </option>
+        <option>
+          <name>GOutputBinary</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGCoreOrChip</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>GRuntimeLibSelect</name>
+          <version>0</version>
+          <state>1</state>
+        </option>
+        <option>
+          <name>GRuntimeLibSelectSlave</name>
+          <version>0</version>
+          <state>1</state>
+        </option>
+        <option>
+          <name>RTDescription</name>
+          <state>Use the normal configuration of the C/C++ runtime library. No locale interface, C locale, no file descriptor support, no multibytes in printf and scanf, and no hex floats in strtod.</state>
+        </option>
+        <option>
+          <name>OGProductVersion</name>
+          <state>6.30.6.53380</state>
+        </option>
+        <option>
+          <name>OGLastSavedByProductVersion</name>
+          <state>8.11.3.13977</state>
+        </option>
+        <option>
+          <name>GeneralEnableMisra</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GeneralMisraVerbose</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGChipSelectEditMenu</name>
+          <state>STM32F407ZG	ST STM32F407ZG</state>
+        </option>
+        <option>
+          <name>GenLowLevelInterface</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>GEndianModeBE</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>OGBufferedTerminalOutput</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GenStdoutInterface</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GeneralMisraRules98</name>
+          <version>0</version>
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+        </option>
+        <option>
+          <name>GeneralMisraVer</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GeneralMisraRules04</name>
+          <version>0</version>
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+        </option>
+        <option>
+          <name>RTConfigPath2</name>
+          <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Normal.h</state>
+        </option>
+        <option>
+          <name>GBECoreSlave</name>
+          <version>25</version>
+          <state>39</state>
+        </option>
+        <option>
+          <name>OGUseCmsis</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGUseCmsisDspLib</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GRuntimeLibThreads</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CoreVariant</name>
+          <version>25</version>
+          <state>39</state>
+        </option>
+        <option>
+          <name>GFPUDeviceSlave</name>
+          <state>STM32F407ZG	ST STM32F407ZG</state>
+        </option>
+        <option>
+          <name>FPU2</name>
+          <version>0</version>
+          <state>4</state>
+        </option>
+        <option>
+          <name>NrRegs</name>
+          <version>0</version>
+          <state>1</state>
+        </option>
+        <option>
+          <name>NEON</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GFPUCoreSlave2</name>
+          <version>25</version>
+          <state>39</state>
+        </option>
+        <option>
+          <name>OGCMSISPackSelectDevice</name>
+        </option>
+        <option>
+          <name>OgLibHeap</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGLibAdditionalLocale</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGPrintfVariant</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGPrintfMultibyteSupport</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGScanfVariant</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGScanfMultibyteSupport</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GenLocaleTags</name>
+          <state />
+        </option>
+        <option>
+          <name>GenLocaleDisplayOnly</name>
+          <state />
+        </option>
+        <option>
+          <name>DSPExtension</name>
+          <state>1</state>
+        </option>
+      </data>
+    </settings>
+    <settings>
+      <name>ICCARM</name>
+      <archiveVersion>2</archiveVersion>
+      <data>
+        <version>34</version>
+        <wantNonLocal>1</wantNonLocal>
+        <debug>1</debug>
+        <option>
+          <name>CCOptimizationNoSizeConstraints</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCDefines</name>
+          <state />
+        </option>
+        <option>
+          <name>CCPreprocFile</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCPreprocComments</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCPreprocLine</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCListCFile</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCListCMnemonics</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCListCMessages</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCListAssFile</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCListAssSource</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCEnableRemarks</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCDiagSuppress</name>
+          <state>Pa050</state>
+        </option>
+        <option>
+          <name>CCDiagRemark</name>
+          <state />
+        </option>
+        <option>
+          <name>CCDiagWarning</name>
+          <state />
+        </option>
+        <option>
+          <name>CCDiagError</name>
+          <state />
+        </option>
+        <option>
+          <name>CCObjPrefix</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CCAllowList</name>
+          <version>1</version>
+          <state>00000000</state>
+        </option>
+        <option>
+          <name>CCDebugInfo</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IEndianMode</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IProcessor</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IExtraOptionsCheck</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IExtraOptions</name>
+          <state />
+        </option>
+        <option>
+          <name>CCLangConformance</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCSignedPlainChar</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CCRequirePrototypes</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCDiagWarnAreErr</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCCompilerRuntimeInfo</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IFpuProcessor</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>OutputFile</name>
+          <state>$FILE_BNAME$.o</state>
+        </option>
+        <option>
+          <name>CCLibConfigHeader</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>PreInclude</name>
+          <state />
+        </option>
+        <option>
+          <name>CompilerMisraOverride</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCIncludePath2</name>
+          <state />
+          <state>$PROJ_DIR$\Libraries\XXX_StdPeriph_Driver</state>
+          <state>$PROJ_DIR$\applications</state>
+          <state>$PROJ_DIR$\Libraries\CMSIS\DeviceSupport</state>
+          <state>$PROJ_DIR$\drivers</state>
+          <state>$PROJ_DIR$\libcpu</state>
+          <state>$PROJ_DIR$\..\..\include</state>
+          <state>$PROJ_DIR$\..\..\libcpu\arm\cortex-m4</state>
+          <state>$PROJ_DIR$\..\..\components\drivers\include</state>
+          <state>$PROJ_DIR$\..\..\libcpu\arm\common</state>
+          <state>$PROJ_DIR$\.</state>
+          <state>$PROJ_DIR$\..\..\components\finsh</state>
+          <state>$PROJ_DIR$\Libraries\CMSIS\CoreSupport</state>
+        </option>
+        <option>
+          <name>CCStdIncCheck</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCCodeSection</name>
+          <state>.text</state>
+        </option>
+        <option>
+          <name>IProcessorMode2</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CCOptLevel</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CCOptStrategy</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCOptLevelSlave</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CompilerMisraRules98</name>
+          <version>0</version>
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+        </option>
+        <option>
+          <name>CompilerMisraRules04</name>
+          <version>0</version>
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+        </option>
+        <option>
+          <name>CCPosIndRopi</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCPosIndRwpi</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCPosIndNoDynInit</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IccLang</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IccCDialect</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IccAllowVLA</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IccStaticDestr</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IccCppInlineSemantics</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IccCmsis</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IccFloatSemantics</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCNoLiteralPool</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCOptStrategySlave</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCGuardCalls</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CCEncSource</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCEncOutput</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCEncOutputBom</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CCEncInput</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IccExceptions2</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IccRTTI2</name>
+          <state>0</state>
+        </option>
+      </data>
+    </settings>
+    <settings>
+      <name>AARM</name>
+      <archiveVersion>2</archiveVersion>
+      <data>
+        <version>10</version>
+        <wantNonLocal>1</wantNonLocal>
+        <debug>1</debug>
+        <option>
+          <name>AObjPrefix</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>AEndian</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>ACaseSensitivity</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>MacroChars</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AWarnEnable</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AWarnWhat</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AWarnOne</name>
+          <state />
+        </option>
+        <option>
+          <name>AWarnRange1</name>
+          <state />
+        </option>
+        <option>
+          <name>AWarnRange2</name>
+          <state />
+        </option>
+        <option>
+          <name>ADebug</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>AltRegisterNames</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>ADefines</name>
+          <state />
+        </option>
+        <option>
+          <name>AList</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AListHeader</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>AListing</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>Includes</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>MacDefs</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>MacExps</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>MacExec</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OnlyAssed</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>MultiLine</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>PageLengthCheck</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>PageLength</name>
+          <state>80</state>
+        </option>
+        <option>
+          <name>TabSpacing</name>
+          <state>8</state>
+        </option>
+        <option>
+          <name>AXRef</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AXRefDefines</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AXRefInternal</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AXRefDual</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AProcessor</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>AFpuProcessor</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>AOutputFile</name>
+          <state>$FILE_BNAME$.o</state>
+        </option>
+        <option>
+          <name>ALimitErrorsCheck</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>ALimitErrorsEdit</name>
+          <state>100</state>
+        </option>
+        <option>
+          <name>AIgnoreStdInclude</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AUserIncludes</name>
+          <state />
+        </option>
+        <option>
+          <name>AExtraOptionsCheckV2</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AExtraOptionsV2</name>
+          <state />
+        </option>
+        <option>
+          <name>AsmNoLiteralPool</name>
+          <state>0</state>
+        </option>
+      </data>
+    </settings>
+    <settings>
+      <name>OBJCOPY</name>
+      <archiveVersion>0</archiveVersion>
+      <data>
+        <version>1</version>
+        <wantNonLocal>1</wantNonLocal>
+        <debug>1</debug>
+        <option>
+          <name>OOCOutputFormat</name>
+          <version>3</version>
+          <state>3</state>
+        </option>
+        <option>
+          <name>OCOutputOverride</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>OOCOutputFile</name>
+          <state>../../../rtthread.bin</state>
+        </option>
+        <option>
+          <name>OOCCommandLineProducer</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>OOCObjCopyEnable</name>
+          <state>1</state>
+        </option>
+      </data>
+    </settings>
+    <settings>
+      <name>CUSTOM</name>
+      <archiveVersion>3</archiveVersion>
+      <data>
+        <extensions />
+        <cmdline />
+        <hasPrio>0</hasPrio>
+      </data>
+    </settings>
+    <settings>
+      <name>BICOMP</name>
+      <archiveVersion>0</archiveVersion>
+      <data />
+    </settings>
+    <settings>
+      <name>BUILDACTION</name>
+      <archiveVersion>1</archiveVersion>
+      <data>
+        <prebuild />
+        <postbuild />
+      </data>
+    </settings>
+    <settings>
+      <name>ILINK</name>
+      <archiveVersion>0</archiveVersion>
+      <data>
+        <version>20</version>
+        <wantNonLocal>1</wantNonLocal>
+        <debug>1</debug>
+        <option>
+          <name>IlinkLibIOConfig</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>XLinkMisraHandler</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkInputFileSlave</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkOutputFile</name>
+          <state>project.out</state>
+        </option>
+        <option>
+          <name>IlinkDebugInfoEnable</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkKeepSymbols</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkRawBinaryFile</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkRawBinarySymbol</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkRawBinarySegment</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkRawBinaryAlign</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkDefines</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkConfigDefines</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkMapFile</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogFile</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogInitialization</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogModule</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogSection</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogVeneer</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkIcfOverride</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkIcfFile</name>
+          <state>$PROJ_DIR$\drivers\linker_scripts\link.icf</state>
+        </option>
+        <option>
+          <name>IlinkIcfFileSlave</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkEnableRemarks</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkSuppressDiags</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkTreatAsRem</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkTreatAsWarn</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkTreatAsErr</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkWarningsAreErrors</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkUseExtraOptions</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkExtraOptions</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkLowLevelInterfaceSlave</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkAutoLibEnable</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkAdditionalLibs</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkOverrideProgramEntryLabel</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkProgramEntryLabelSelect</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkProgramEntryLabel</name>
+          <state>__iar_program_start</state>
+        </option>
+        <option>
+          <name>DoFill</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>FillerByte</name>
+          <state>0xFF</state>
+        </option>
+        <option>
+          <name>FillerStart</name>
+          <state>0x0</state>
+        </option>
+        <option>
+          <name>FillerEnd</name>
+          <state>0x0</state>
+        </option>
+        <option>
+          <name>CrcSize</name>
+          <version>0</version>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CrcAlign</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CrcPoly</name>
+          <state>0x11021</state>
+        </option>
+        <option>
+          <name>CrcCompl</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CrcBitOrder</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CrcInitialValue</name>
+          <state>0x0</state>
+        </option>
+        <option>
+          <name>DoCrc</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkBE8Slave</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkBufferedTerminalOutput</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkStdoutInterfaceSlave</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CrcFullSize</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkIElfToolPostProcess</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogAutoLibSelect</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogRedirSymbols</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogUnusedFragments</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkCrcReverseByteOrder</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkCrcUseAsInput</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkOptInline</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkOptExceptionsAllow</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkOptExceptionsForce</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkCmsis</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkOptMergeDuplSections</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkOptUseVfe</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkOptForceVfe</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkStackAnalysisEnable</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkStackControlFile</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkStackCallGraphFile</name>
+          <state />
+        </option>
+        <option>
+          <name>CrcAlgorithm</name>
+          <version>1</version>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CrcUnitSize</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkThreadsSlave</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkLogCallGraph</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkIcfFile_AltDefault</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkEncInput</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkEncOutput</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkEncOutputBom</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkHeapSelect</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkLocaleSelect</name>
+          <state>1</state>
+        </option>
+      </data>
+    </settings>
+    <settings>
+      <name>IARCHIVE</name>
+      <archiveVersion>0</archiveVersion>
+      <data>
+        <version>0</version>
+        <wantNonLocal>1</wantNonLocal>
+        <debug>1</debug>
+        <option>
+          <name>IarchiveInputs</name>
+          <state />
+        </option>
+        <option>
+          <name>IarchiveOverride</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IarchiveOutput</name>
+          <state>###Unitialized###</state>
+        </option>
+      </data>
+    </settings>
+    <settings>
+      <name>BILINK</name>
+      <archiveVersion>0</archiveVersion>
+      <data />
+    </settings>
+  </configuration>
+  <configuration>
+    <name>Release</name>
+    <toolchain>
+      <name>ARM</name>
+    </toolchain>
+    <debug>0</debug>
+    <settings>
+      <name>General</name>
+      <archiveVersion>3</archiveVersion>
+      <data>
+        <version>29</version>
+        <wantNonLocal>1</wantNonLocal>
+        <debug>0</debug>
+        <option>
+          <name>ExePath</name>
+          <state>Release\Exe</state>
+        </option>
+        <option>
+          <name>ObjPath</name>
+          <state>Release\Obj</state>
+        </option>
+        <option>
+          <name>ListPath</name>
+          <state>Release\List</state>
+        </option>
+        <option>
+          <name>GEndianMode</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>Input description</name>
+          <state />
+        </option>
+        <option>
+          <name>Output description</name>
+          <state />
+        </option>
+        <option>
+          <name>GOutputBinary</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGCoreOrChip</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GRuntimeLibSelect</name>
+          <version>0</version>
+          <state>1</state>
+        </option>
+        <option>
+          <name>GRuntimeLibSelectSlave</name>
+          <version>0</version>
+          <state>1</state>
+        </option>
+        <option>
+          <name>RTDescription</name>
+          <state />
+        </option>
+        <option>
+          <name>OGProductVersion</name>
+          <state>6.30.6.53380</state>
+        </option>
+        <option>
+          <name>OGLastSavedByProductVersion</name>
+          <state>8.11.3.13977</state>
+        </option>
+        <option>
+          <name>GeneralEnableMisra</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GeneralMisraVerbose</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGChipSelectEditMenu</name>
+          <state>Default	None</state>
+        </option>
+        <option>
+          <name>GenLowLevelInterface</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GEndianModeBE</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGBufferedTerminalOutput</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GenStdoutInterface</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GeneralMisraRules98</name>
+          <version>0</version>
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+        </option>
+        <option>
+          <name>GeneralMisraVer</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GeneralMisraRules04</name>
+          <version>0</version>
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+        </option>
+        <option>
+          <name>RTConfigPath2</name>
+          <state />
+        </option>
+        <option>
+          <name>GBECoreSlave</name>
+          <version>25</version>
+          <state>1</state>
+        </option>
+        <option>
+          <name>OGUseCmsis</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGUseCmsisDspLib</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GRuntimeLibThreads</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CoreVariant</name>
+          <version>25</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GFPUDeviceSlave</name>
+          <state>Default	None</state>
+        </option>
+        <option>
+          <name>FPU2</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>NrRegs</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>NEON</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GFPUCoreSlave2</name>
+          <version>25</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGCMSISPackSelectDevice</name>
+        </option>
+        <option>
+          <name>OgLibHeap</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGLibAdditionalLocale</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGPrintfVariant</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGPrintfMultibyteSupport</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGScanfVariant</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OGScanfMultibyteSupport</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>GenLocaleTags</name>
+          <state />
+        </option>
+        <option>
+          <name>GenLocaleDisplayOnly</name>
+          <state />
+        </option>
+        <option>
+          <name>DSPExtension</name>
+          <state>0</state>
+        </option>
+      </data>
+    </settings>
+    <settings>
+      <name>ICCARM</name>
+      <archiveVersion>2</archiveVersion>
+      <data>
+        <version>34</version>
+        <wantNonLocal>1</wantNonLocal>
+        <debug>0</debug>
+        <option>
+          <name>CCOptimizationNoSizeConstraints</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCDefines</name>
+        </option>
+        <option>
+          <name>CCPreprocFile</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCPreprocComments</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCPreprocLine</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCListCFile</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCListCMnemonics</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCListCMessages</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCListAssFile</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCListAssSource</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCEnableRemarks</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCDiagSuppress</name>
+          <state />
+        </option>
+        <option>
+          <name>CCDiagRemark</name>
+          <state />
+        </option>
+        <option>
+          <name>CCDiagWarning</name>
+          <state />
+        </option>
+        <option>
+          <name>CCDiagError</name>
+          <state />
+        </option>
+        <option>
+          <name>CCObjPrefix</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CCAllowList</name>
+          <version>1</version>
+          <state>11111110</state>
+        </option>
+        <option>
+          <name>CCDebugInfo</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IEndianMode</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IProcessor</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IExtraOptionsCheck</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IExtraOptions</name>
+          <state />
+        </option>
+        <option>
+          <name>CCLangConformance</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCSignedPlainChar</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CCRequirePrototypes</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCDiagWarnAreErr</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCCompilerRuntimeInfo</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IFpuProcessor</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>OutputFile</name>
+          <state />
+        </option>
+        <option>
+          <name>CCLibConfigHeader</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>PreInclude</name>
+          <state />
+        </option>
+        <option>
+          <name>CompilerMisraOverride</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCIncludePath2</name>
+          <state />
+          <state>$PROJ_DIR$\Libraries\XXX_StdPeriph_Driver</state>
+          <state>$PROJ_DIR$\applications</state>
+          <state>$PROJ_DIR$\Libraries\CMSIS\DeviceSupport</state>
+          <state>$PROJ_DIR$\drivers</state>
+          <state>$PROJ_DIR$\libcpu</state>
+          <state>$PROJ_DIR$\..\..\include</state>
+          <state>$PROJ_DIR$\..\..\libcpu\arm\cortex-m4</state>
+          <state>$PROJ_DIR$\..\..\components\drivers\include</state>
+          <state>$PROJ_DIR$\..\..\libcpu\arm\common</state>
+          <state>$PROJ_DIR$\.</state>
+          <state>$PROJ_DIR$\..\..\components\finsh</state>
+          <state>$PROJ_DIR$\Libraries\CMSIS\CoreSupport</state>
+        </option>
+        <option>
+          <name>CCStdIncCheck</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCCodeSection</name>
+          <state>.text</state>
+        </option>
+        <option>
+          <name>IProcessorMode2</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CCOptLevel</name>
+          <state>3</state>
+        </option>
+        <option>
+          <name>CCOptStrategy</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCOptLevelSlave</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CompilerMisraRules98</name>
+          <version>0</version>
+          <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+        </option>
+        <option>
+          <name>CompilerMisraRules04</name>
+          <version>0</version>
+          <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+        </option>
+        <option>
+          <name>CCPosIndRopi</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCPosIndRwpi</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCPosIndNoDynInit</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IccLang</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IccCDialect</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IccAllowVLA</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IccStaticDestr</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IccCppInlineSemantics</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IccCmsis</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IccFloatSemantics</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCNoLiteralPool</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCOptStrategySlave</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCGuardCalls</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CCEncSource</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCEncOutput</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CCEncOutputBom</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CCEncInput</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IccExceptions2</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IccRTTI2</name>
+          <state>0</state>
+        </option>
+      </data>
+    </settings>
+    <settings>
+      <name>AARM</name>
+      <archiveVersion>2</archiveVersion>
+      <data>
+        <version>10</version>
+        <wantNonLocal>1</wantNonLocal>
+        <debug>0</debug>
+        <option>
+          <name>AObjPrefix</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>AEndian</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>ACaseSensitivity</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>MacroChars</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AWarnEnable</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AWarnWhat</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AWarnOne</name>
+          <state />
+        </option>
+        <option>
+          <name>AWarnRange1</name>
+          <state />
+        </option>
+        <option>
+          <name>AWarnRange2</name>
+          <state />
+        </option>
+        <option>
+          <name>ADebug</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AltRegisterNames</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>ADefines</name>
+          <state />
+        </option>
+        <option>
+          <name>AList</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AListHeader</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>AListing</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>Includes</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>MacDefs</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>MacExps</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>MacExec</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OnlyAssed</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>MultiLine</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>PageLengthCheck</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>PageLength</name>
+          <state>80</state>
+        </option>
+        <option>
+          <name>TabSpacing</name>
+          <state>8</state>
+        </option>
+        <option>
+          <name>AXRef</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AXRefDefines</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AXRefInternal</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AXRefDual</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AProcessor</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>AFpuProcessor</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>AOutputFile</name>
+          <state />
+        </option>
+        <option>
+          <name>ALimitErrorsCheck</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>ALimitErrorsEdit</name>
+          <state>100</state>
+        </option>
+        <option>
+          <name>AIgnoreStdInclude</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AUserIncludes</name>
+          <state />
+        </option>
+        <option>
+          <name>AExtraOptionsCheckV2</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>AExtraOptionsV2</name>
+          <state />
+        </option>
+        <option>
+          <name>AsmNoLiteralPool</name>
+          <state>0</state>
+        </option>
+      </data>
+    </settings>
+    <settings>
+      <name>OBJCOPY</name>
+      <archiveVersion>0</archiveVersion>
+      <data>
+        <version>1</version>
+        <wantNonLocal>1</wantNonLocal>
+        <debug>0</debug>
+        <option>
+          <name>OOCOutputFormat</name>
+          <version>3</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OCOutputOverride</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>OOCOutputFile</name>
+          <state />
+        </option>
+        <option>
+          <name>OOCCommandLineProducer</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>OOCObjCopyEnable</name>
+          <state>0</state>
+        </option>
+      </data>
+    </settings>
+    <settings>
+      <name>CUSTOM</name>
+      <archiveVersion>3</archiveVersion>
+      <data>
+        <extensions />
+        <cmdline />
+        <hasPrio>0</hasPrio>
+      </data>
+    </settings>
+    <settings>
+      <name>BICOMP</name>
+      <archiveVersion>0</archiveVersion>
+      <data />
+    </settings>
+    <settings>
+      <name>BUILDACTION</name>
+      <archiveVersion>1</archiveVersion>
+      <data>
+        <prebuild />
+        <postbuild />
+      </data>
+    </settings>
+    <settings>
+      <name>ILINK</name>
+      <archiveVersion>0</archiveVersion>
+      <data>
+        <version>20</version>
+        <wantNonLocal>1</wantNonLocal>
+        <debug>0</debug>
+        <option>
+          <name>IlinkLibIOConfig</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>XLinkMisraHandler</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkInputFileSlave</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkOutputFile</name>
+          <state>###Unitialized###</state>
+        </option>
+        <option>
+          <name>IlinkDebugInfoEnable</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkKeepSymbols</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkRawBinaryFile</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkRawBinarySymbol</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkRawBinarySegment</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkRawBinaryAlign</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkDefines</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkConfigDefines</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkMapFile</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogFile</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogInitialization</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogModule</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogSection</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogVeneer</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkIcfOverride</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkIcfFile</name>
+          <state>lnk0t.icf</state>
+        </option>
+        <option>
+          <name>IlinkIcfFileSlave</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkEnableRemarks</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkSuppressDiags</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkTreatAsRem</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkTreatAsWarn</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkTreatAsErr</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkWarningsAreErrors</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkUseExtraOptions</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkExtraOptions</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkLowLevelInterfaceSlave</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkAutoLibEnable</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkAdditionalLibs</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkOverrideProgramEntryLabel</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkProgramEntryLabelSelect</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkProgramEntryLabel</name>
+          <state />
+        </option>
+        <option>
+          <name>DoFill</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>FillerByte</name>
+          <state>0xFF</state>
+        </option>
+        <option>
+          <name>FillerStart</name>
+          <state>0x0</state>
+        </option>
+        <option>
+          <name>FillerEnd</name>
+          <state>0x0</state>
+        </option>
+        <option>
+          <name>CrcSize</name>
+          <version>0</version>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CrcAlign</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CrcPoly</name>
+          <state>0x11021</state>
+        </option>
+        <option>
+          <name>CrcCompl</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CrcBitOrder</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>CrcInitialValue</name>
+          <state>0x0</state>
+        </option>
+        <option>
+          <name>DoCrc</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkBE8Slave</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkBufferedTerminalOutput</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkStdoutInterfaceSlave</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CrcFullSize</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkIElfToolPostProcess</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogAutoLibSelect</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogRedirSymbols</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkLogUnusedFragments</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkCrcReverseByteOrder</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkCrcUseAsInput</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkOptInline</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkOptExceptionsAllow</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkOptExceptionsForce</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkCmsis</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkOptMergeDuplSections</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkOptUseVfe</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkOptForceVfe</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkStackAnalysisEnable</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkStackControlFile</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkStackCallGraphFile</name>
+          <state />
+        </option>
+        <option>
+          <name>CrcAlgorithm</name>
+          <version>1</version>
+          <state>1</state>
+        </option>
+        <option>
+          <name>CrcUnitSize</name>
+          <version>0</version>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkThreadsSlave</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkLogCallGraph</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkIcfFile_AltDefault</name>
+          <state />
+        </option>
+        <option>
+          <name>IlinkEncInput</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkEncOutput</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IlinkEncOutputBom</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkHeapSelect</name>
+          <state>1</state>
+        </option>
+        <option>
+          <name>IlinkLocaleSelect</name>
+          <state>1</state>
+        </option>
+      </data>
+    </settings>
+    <settings>
+      <name>IARCHIVE</name>
+      <archiveVersion>0</archiveVersion>
+      <data>
+        <version>0</version>
+        <wantNonLocal>1</wantNonLocal>
+        <debug>0</debug>
+        <option>
+          <name>IarchiveInputs</name>
+          <state />
+        </option>
+        <option>
+          <name>IarchiveOverride</name>
+          <state>0</state>
+        </option>
+        <option>
+          <name>IarchiveOutput</name>
+          <state>###Unitialized###</state>
+        </option>
+      </data>
+    </settings>
+    <settings>
+      <name>BILINK</name>
+      <archiveVersion>0</archiveVersion>
+      <data />
+    </settings>
+  </configuration>
+  <group>
+    <name>Kernel</name>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\clock.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\components.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\cpu.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\device.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\idle.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\ipc.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\irq.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\kservice.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\mem.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\mempool.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\object.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\scheduler.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\signal.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\thread.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\src\timer.c</name>
+    </file>
+  </group>
+  <group>
+    <name>Applications</name>
+    <file>
+      <name>$PROJ_DIR$\applications\main.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\applications\mnt.c</name>
+    </file>
+  </group>
+  <group>
+    <name>Drivers</name>
+    <file>
+      <name>$PROJ_DIR$\drivers\board.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\drivers\drv_uart.c</name>
+    </file>
+  </group>
+  <group>
+    <name>CPU</name>
+    <file>
+      <name>$PROJ_DIR$\libcpu\port.c</name>
+    </file>
+  </group>
+  <group>
+    <name>Libraries</name>
+    <file>
+      <name>$PROJ_DIR$\Libraries\CMSIS\startup_xxx.s</name>
+    </file>
+  </group>
+  <group>
+    <name>cpu</name>
+    <file>
+      <name>$PROJ_DIR$\..\..\libcpu\arm\common\backtrace.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\libcpu\arm\common\div0.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\libcpu\arm\common\showmem.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\libcpu\arm\cortex-m4\cpuport.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\libcpu\arm\cortex-m4\context_iar.S</name>
+    </file>
+  </group>
+  <group>
+    <name>DeviceDrivers</name>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\drivers\misc\pin.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\drivers\serial\serial.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\drivers\src\completion.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\drivers\src\dataqueue.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\drivers\src\pipe.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\drivers\src\ringblk_buf.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\drivers\src\ringbuffer.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\drivers\src\waitqueue.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\drivers\src\workqueue.c</name>
+    </file>
+  </group>
+  <group>
+    <name>finsh</name>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\shell.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\symbol.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\cmd.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\msh.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\msh_cmd.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\msh_file.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\finsh_compiler.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\finsh_error.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\finsh_heap.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\finsh_init.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\finsh_node.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\finsh_ops.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\finsh_parser.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\finsh_var.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\finsh_vm.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\finsh\finsh_token.c</name>
+    </file>
+  </group>
+</project>

+ 10 - 10
bsp/swm320-lq100/project.eww

@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-
-<workspace>
-  <project>
-    <path>$WS_DIR$\project.ewp</path>
-  </project>
-  <batchBuild/>
-</workspace>
-
-
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<workspace>
+  <project>
+    <path>$WS_DIR$\project.ewp</path>
+  </project>
+  <batchBuild/>
+</workspace>
+
+

Some files were not shown because too many files changed in this diff