Browse Source

Merge pull request #3212 from wangyq2018/es8p508x

[bsp]add bsp essemi/es8p508x.
Bernard Xiong 5 years ago
parent
commit
a530a25c40
66 changed files with 17273 additions and 0 deletions
  1. 405 0
      bsp/essemi/es8p508x/.config
  2. 27 0
      bsp/essemi/es8p508x/Kconfig
  3. 91 0
      bsp/essemi/es8p508x/README.md
  4. 13 0
      bsp/essemi/es8p508x/SConscript
  5. 39 0
      bsp/essemi/es8p508x/SConstruct
  6. 9 0
      bsp/essemi/es8p508x/applications/SConscript
  7. 34 0
      bsp/essemi/es8p508x/applications/main.c
  8. 51 0
      bsp/essemi/es8p508x/drivers/Kconfig
  9. 21 0
      bsp/essemi/es8p508x/drivers/SConscript
  10. 120 0
      bsp/essemi/es8p508x/drivers/board.c
  11. 35 0
      bsp/essemi/es8p508x/drivers/board.h
  12. 478 0
      bsp/essemi/es8p508x/drivers/drv_gpio.c
  13. 16 0
      bsp/essemi/es8p508x/drivers/drv_gpio.h
  14. 444 0
      bsp/essemi/es8p508x/drivers/drv_uart.c
  15. 16 0
      bsp/essemi/es8p508x/drivers/drv_uart.h
  16. 15 0
      bsp/essemi/es8p508x/drivers/linker_scripts/link.sct
  17. BIN
      bsp/essemi/es8p508x/figures/ESLinkII-mini.jpg
  18. BIN
      bsp/essemi/es8p508x/figures/HRSDK-GDB-ES8P508x-V1.0.jpg
  19. 3117 0
      bsp/essemi/es8p508x/libraries/CMSIS/ES8P508x.h
  20. 668 0
      bsp/essemi/es8p508x/libraries/CMSIS/core_cm0.h
  21. 636 0
      bsp/essemi/es8p508x/libraries/CMSIS/core_cmFunc.h
  22. 688 0
      bsp/essemi/es8p508x/libraries/CMSIS/core_cmInstr.h
  23. 233 0
      bsp/essemi/es8p508x/libraries/CMSIS/startup_ES8P508x.s
  24. 76 0
      bsp/essemi/es8p508x/libraries/CMSIS/system_ES8P508x.c
  25. 23 0
      bsp/essemi/es8p508x/libraries/CMSIS/system_ES8P508x.h
  26. 17 0
      bsp/essemi/es8p508x/libraries/Library/Include/irqhandler.h
  27. 239 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_adc.h
  28. 74 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_aes.h
  29. 32 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_config.h
  30. 93 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_crc.h
  31. 44 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_flashiap.h
  32. 243 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_gpio.h
  33. 42 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_iap.h
  34. 229 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_iic.h
  35. 33 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_printf.h
  36. 84 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_rtc.h
  37. 98 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_scs.h
  38. 314 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_scu.h
  39. 141 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_spi.h
  40. 310 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_timer.h
  41. 171 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_uart.h
  42. 100 0
      bsp/essemi/es8p508x/libraries/Library/Include/lib_wdt.h
  43. 19 0
      bsp/essemi/es8p508x/libraries/Library/Include/type.h
  44. 27 0
      bsp/essemi/es8p508x/libraries/Library/Source/irqhandler.c
  45. 301 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_adc.c
  46. 222 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_aes.c
  47. 96 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_crc.c
  48. 355 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_flashiap.c
  49. 619 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_gpio.c
  50. 97 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_iap.c
  51. 311 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_iic.c
  52. 283 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_printf.c
  53. 1906 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_rtc.c
  54. 97 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_scs.c
  55. 387 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_scu.c
  56. 233 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_spi.c
  57. 569 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_timer.c
  58. 198 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_uart.c
  59. 172 0
      bsp/essemi/es8p508x/libraries/Library/Source/lib_wdt.c
  60. 27 0
      bsp/essemi/es8p508x/libraries/SConscript
  61. 174 0
      bsp/essemi/es8p508x/project.uvopt
  62. 790 0
      bsp/essemi/es8p508x/project.uvproj
  63. 162 0
      bsp/essemi/es8p508x/rtconfig.h
  64. 135 0
      bsp/essemi/es8p508x/rtconfig.py
  65. 174 0
      bsp/essemi/es8p508x/template.uvopt
  66. 400 0
      bsp/essemi/es8p508x/template.uvproj

+ 405 - 0
bsp/essemi/es8p508x/.config

@@ -0,0 +1,405 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# RT-Thread Configuration
+#
+
+#
+# RT-Thread Kernel
+#
+CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMP is not set
+CONFIG_RT_ALIGN_SIZE=4
+# CONFIG_RT_THREAD_PRIORITY_8 is not set
+CONFIG_RT_THREAD_PRIORITY_32=y
+# CONFIG_RT_THREAD_PRIORITY_256 is not set
+CONFIG_RT_THREAD_PRIORITY_MAX=32
+CONFIG_RT_TICK_PER_SECOND=100
+CONFIG_RT_USING_OVERFLOW_CHECK=y
+CONFIG_RT_USING_HOOK=y
+CONFIG_RT_USING_IDLE_HOOK=y
+CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
+CONFIG_IDLE_THREAD_STACK_SIZE=256
+# CONFIG_RT_USING_TIMER_SOFT is not set
+CONFIG_RT_DEBUG=y
+# CONFIG_RT_DEBUG_COLOR is not set
+# CONFIG_RT_DEBUG_INIT_CONFIG is not set
+# CONFIG_RT_DEBUG_THREAD_CONFIG is not set
+# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set
+# CONFIG_RT_DEBUG_IPC_CONFIG is not set
+# CONFIG_RT_DEBUG_TIMER_CONFIG is not set
+# CONFIG_RT_DEBUG_IRQ_CONFIG is not set
+# CONFIG_RT_DEBUG_MEM_CONFIG is not set
+# CONFIG_RT_DEBUG_SLAB_CONFIG is not set
+# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set
+# CONFIG_RT_DEBUG_MODULE_CONFIG is not set
+
+#
+# Inter-Thread communication
+#
+CONFIG_RT_USING_SEMAPHORE=y
+CONFIG_RT_USING_MUTEX=y
+CONFIG_RT_USING_EVENT=y
+CONFIG_RT_USING_MAILBOX=y
+CONFIG_RT_USING_MESSAGEQUEUE=y
+# CONFIG_RT_USING_SIGNALS is not set
+
+#
+# Memory Management
+#
+CONFIG_RT_USING_MEMPOOL=y
+# CONFIG_RT_USING_MEMHEAP is not set
+# CONFIG_RT_USING_NOHEAP is not set
+CONFIG_RT_USING_SMALL_MEM=y
+# CONFIG_RT_USING_SLAB is not set
+# CONFIG_RT_USING_MEMTRACE is not set
+CONFIG_RT_USING_HEAP=y
+
+#
+# Kernel Device Object
+#
+CONFIG_RT_USING_DEVICE=y
+# CONFIG_RT_USING_DEVICE_OPS is not set
+# CONFIG_RT_USING_INTERRUPT_INFO is not set
+CONFIG_RT_USING_CONSOLE=y
+CONFIG_RT_CONSOLEBUF_SIZE=128
+CONFIG_RT_CONSOLE_DEVICE_NAME="uart5"
+CONFIG_RT_VER_NUM=0x40002
+# CONFIG_RT_USING_CPU_FFS is not set
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+
+#
+# RT-Thread Components
+#
+CONFIG_RT_USING_COMPONENTS_INIT=y
+CONFIG_RT_USING_USER_MAIN=y
+CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048
+CONFIG_RT_MAIN_THREAD_PRIORITY=10
+
+#
+# C++ features
+#
+# CONFIG_RT_USING_CPLUSPLUS is not set
+
+#
+# Command shell
+#
+CONFIG_RT_USING_FINSH=y
+CONFIG_FINSH_THREAD_NAME="tshell"
+CONFIG_FINSH_USING_HISTORY=y
+CONFIG_FINSH_HISTORY_LINES=5
+CONFIG_FINSH_USING_SYMTAB=y
+CONFIG_FINSH_USING_DESCRIPTION=y
+# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
+CONFIG_FINSH_THREAD_PRIORITY=20
+CONFIG_FINSH_THREAD_STACK_SIZE=2048
+CONFIG_FINSH_CMD_SIZE=80
+# CONFIG_FINSH_USING_AUTH is not set
+CONFIG_FINSH_USING_MSH=y
+CONFIG_FINSH_USING_MSH_DEFAULT=y
+CONFIG_FINSH_USING_MSH_ONLY=y
+CONFIG_FINSH_ARG_MAX=10
+
+#
+# Device virtual file system
+#
+# CONFIG_RT_USING_DFS is not set
+
+#
+# Device Drivers
+#
+CONFIG_RT_USING_DEVICE_IPC=y
+CONFIG_RT_PIPE_BUFSZ=512
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
+CONFIG_RT_USING_SERIAL=y
+# CONFIG_RT_SERIAL_USING_DMA is not set
+CONFIG_RT_SERIAL_RB_BUFSZ=64
+# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_HWTIMER is not set
+# CONFIG_RT_USING_CPUTIME is not set
+# CONFIG_RT_USING_I2C is not set
+CONFIG_RT_USING_PIN=y
+# CONFIG_RT_USING_ADC is not set
+# CONFIG_RT_USING_PWM is not set
+# CONFIG_RT_USING_MTD_NOR is not set
+# CONFIG_RT_USING_MTD_NAND is not set
+# CONFIG_RT_USING_PM is not set
+# CONFIG_RT_USING_RTC is not set
+# CONFIG_RT_USING_SDIO is not set
+# CONFIG_RT_USING_SPI is not set
+# CONFIG_RT_USING_WDT is not set
+# CONFIG_RT_USING_AUDIO is not set
+# 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
+
+#
+# Using USB
+#
+# CONFIG_RT_USING_USB_HOST is not set
+# CONFIG_RT_USING_USB_DEVICE is not set
+
+#
+# POSIX layer and C standard library
+#
+# CONFIG_RT_USING_LIBC is not set
+# CONFIG_RT_USING_PTHREADS is not set
+# CONFIG_RT_LIBC_USING_TIME is not set
+
+#
+# Network
+#
+
+#
+# Socket abstraction layer
+#
+# CONFIG_RT_USING_SAL is not set
+
+#
+# Network interface device
+#
+# CONFIG_RT_USING_NETDEV is not set
+
+#
+# light weight TCP/IP stack
+#
+# CONFIG_RT_USING_LWIP is not set
+
+#
+# AT commands
+#
+# CONFIG_RT_USING_AT is not set
+
+#
+# VBUS(Virtual Software BUS)
+#
+# CONFIG_RT_USING_VBUS is not set
+
+#
+# Utilities
+#
+# CONFIG_RT_USING_RYM is not set
+# CONFIG_RT_USING_ULOG is not set
+# CONFIG_RT_USING_UTEST is not set
+
+#
+# RT-Thread online packages
+#
+
+#
+# IoT - internet of things
+#
+# CONFIG_PKG_USING_PAHOMQTT is not set
+# CONFIG_PKG_USING_WEBCLIENT is not set
+# CONFIG_PKG_USING_WEBNET is not set
+# CONFIG_PKG_USING_MONGOOSE is not set
+# CONFIG_PKG_USING_MYMQTT is not set
+# CONFIG_PKG_USING_WEBTERMINAL is not set
+# CONFIG_PKG_USING_CJSON 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_EZXML is not set
+# CONFIG_PKG_USING_NANOPB is not set
+
+#
+# Wi-Fi
+#
+
+#
+# Marvell WiFi
+#
+# CONFIG_PKG_USING_WLANMARVELL is not set
+
+#
+# Wiced WiFi
+#
+# 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_NOPOLL is not set
+# CONFIG_PKG_USING_NETUTILS is not set
+# CONFIG_PKG_USING_PPP_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
+
+#
+# IoT Cloud
+#
+# CONFIG_PKG_USING_ONENET is not set
+# CONFIG_PKG_USING_GAGENT_CLOUD is not set
+# CONFIG_PKG_USING_ALI_IOTKIT is not set
+# CONFIG_PKG_USING_AZURE is not set
+# CONFIG_PKG_USING_TENCENT_IOTHUB is not set
+# CONFIG_PKG_USING_JIOT-C-SDK 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_ONNX_PARSER is not set
+# CONFIG_PKG_USING_ONNX_BACKEND 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
+
+#
+# security packages
+#
+# CONFIG_PKG_USING_MBEDTLS is not set
+# CONFIG_PKG_USING_libsodium is not set
+# CONFIG_PKG_USING_TINYCRYPT is not set
+
+#
+# language packages
+#
+# CONFIG_PKG_USING_LUA is not set
+# CONFIG_PKG_USING_JERRYSCRIPT is not set
+# CONFIG_PKG_USING_MICROPYTHON is not set
+
+#
+# multimedia packages
+#
+# CONFIG_PKG_USING_OPENMV 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
+
+#
+# tools packages
+#
+# CONFIG_PKG_USING_CMBACKTRACE is not set
+# CONFIG_PKG_USING_EASYFLASH is not set
+# CONFIG_PKG_USING_EASYLOGGER is not set
+# CONFIG_PKG_USING_SYSTEMVIEW is not set
+# CONFIG_PKG_USING_RDB is not set
+# CONFIG_PKG_USING_QRCODE is not set
+# CONFIG_PKG_USING_ULOG_EASYFLASH 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_NR_MICRO_SHELL is not set
+
+#
+# system packages
+#
+# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_CAIRO 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_FAL is not set
+# CONFIG_PKG_USING_SQLITE is not set
+# CONFIG_PKG_USING_RTI is not set
+# CONFIG_PKG_USING_LITTLEVGL2RTT is not set
+# CONFIG_PKG_USING_CMSIS is not set
+# CONFIG_PKG_USING_DFS_YAFFS is not set
+# CONFIG_PKG_USING_LITTLEFS is not set
+# CONFIG_PKG_USING_THREAD_POOL is not set
+# CONFIG_PKG_USING_ROBOTS is not set
+
+#
+# peripheral libraries and drivers
+#
+# CONFIG_PKG_USING_SENSORS_DRIVERS is not set
+# CONFIG_PKG_USING_REALTEK_AMEBA is not set
+# CONFIG_PKG_USING_SHT2X is not set
+# CONFIG_PKG_USING_SHT3X is not set
+# CONFIG_PKG_USING_STM32_SDIO is not set
+# CONFIG_PKG_USING_ICM20608 is not set
+# CONFIG_PKG_USING_U8G2 is not set
+# CONFIG_PKG_USING_BUTTON 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_WM_LIBRARIES is not set
+# CONFIG_PKG_USING_KENDRYTE_SDK is not set
+# CONFIG_PKG_USING_INFRARED is not set
+# CONFIG_PKG_USING_ROSSERIAL 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_LCD_DRIVERS is not set
+# CONFIG_PKG_USING_MAX17048 is not set
+# CONFIG_PKG_USING_RPLIDAR is not set
+
+#
+# miscellaneous packages
+#
+# CONFIG_PKG_USING_LIBCSV is not set
+# CONFIG_PKG_USING_OPTPARSE is not set
+# CONFIG_PKG_USING_FASTLZ is not set
+# CONFIG_PKG_USING_MINILZO is not set
+# CONFIG_PKG_USING_QUICKLZ 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_ZLIB is not set
+# CONFIG_PKG_USING_DSTR is not set
+# CONFIG_PKG_USING_TINYFRAME 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
+
+#
+# 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_HELLO is not set
+# CONFIG_PKG_USING_VI is not set
+# CONFIG_PKG_USING_NNOM is not set
+# CONFIG_PKG_USING_LIBANN is not set
+# CONFIG_PKG_USING_ELAPACK is not set
+# CONFIG_PKG_USING_ARMv7M_DWT is not set
+# CONFIG_PKG_USING_VT100 is not set
+# CONFIG_PKG_USING_ULAPACK is not set
+# CONFIG_PKG_USING_UKAL is not set
+CONFIG_SOC_ES8P508x=y
+
+#
+# Hardware Drivers Config
+#
+
+#
+# On-chip Peripheral Drivers
+#
+CONFIG_BSP_USING_GPIO=y
+
+#
+# UART Drivers
+#
+# CONFIG_BSP_USING_UART0 is not set
+# CONFIG_BSP_USING_UART1 is not set
+# CONFIG_BSP_USING_UART2 is not set
+# CONFIG_BSP_USING_UART3 is not set
+# CONFIG_BSP_USING_UART4 is not set
+CONFIG_BSP_USING_UART5=y
+
+#
+# Onboard Peripheral Drivers
+#
+
+#
+# Offboard Peripheral Drivers
+#

+ 27 - 0
bsp/essemi/es8p508x/Kconfig

@@ -0,0 +1,27 @@
+mainmenu "RT-Thread Configuration"
+
+config BSP_DIR
+    string
+    option env="BSP_ROOT"
+    default "."
+
+config RTT_DIR
+    string
+    option env="RTT_ROOT"
+    default "../../.."
+
+config PKGS_DIR
+    string
+    option env="PKGS_ROOT"
+    default "packages"
+
+source "$RTT_DIR/Kconfig"
+source "$PKGS_DIR/Kconfig"
+
+config SOC_ES8P508x
+    bool
+    select RT_USING_COMPONENTS_INIT
+    select RT_USING_USER_MAIN
+    default y
+
+source "drivers/Kconfig"

+ 91 - 0
bsp/essemi/es8p508x/README.md

@@ -0,0 +1,91 @@
+# HRSDK-GDB-ES8P508 开发板 BSP 说明
+标签: EastSoft、国产MCU、Cortex-M0、ES8P5088FLLQ
+
+## 1. 简介
+
+本文档为上海东软载波微电子开发团队为 HRSDK-GDB-ES8P508 开发板提供的 BSP (板级支持包) 说明。
+通过阅读本文档,开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。
+
+### 1.1  开发板介绍
+
+主要内容如下:
+HRSDK-GDB-ES8P508x 是东软载波微电子官方推出的一款基于 ARM Cortex-M0 内核的开发板,最高主频为 48MHz,可满足基础功能测试及高端功能扩展等开发需求。
+
+开发板外观如下图所示:
+
+HRSDK-GDB-ES8P508x-V1.0
+
+![ES8P508](figures/HRSDK-GDB-ES8P508x-V1.0.jpg)
+
+该开发板常用 **板载资源** 如下:
+
+- MCU:ES8P5088FLLQ,主频 48MHz,24KB SRAM,128KB FLASH,45 GPIOs
+- 常用外设
+  - LED:1个,(PA14)
+  - 按键:1个(MRSTN)
+- 常用接口:GPIO、UART、SPI、I2C
+- 调试接口,ESLinkⅡ(EastSoft 官方推出的开发工具,有标准版和mini版两种版本,均自带 CDC 串口功能) SWD 下载
+
+外设支持:
+
+本 BSP 目前对外设的支持情况如下:
+
+| **片上外设**      | **支持情况** | **备注**                            |
+| :---------------- | :----------: | :-----------------------------------|
+| GPIO              |     支持     | 45 GPIOs                            |
+| UART              |     支持     | UART0/1/2/3/4/5                     |
+
+
+更多详细信息请咨询[上海东软载波微电子技术支持](http://www.essemi.com/)
+
+## 2. 快速上手
+
+本 BSP 为开发者提供 MDK4 工程。下面以 MDK4 开发环境为例,介绍如何将系统运行起来。
+
+### 硬件连接
+
+使用 ESLinkⅡ (自带 CDC 串口)或 Jlink 等调试工具连接开发板到 PC,拨动开关选择使用调试工具供电或使用外部电源供电。若使用 Jlink 等调试工具,还需要将 UART5_TX(PB13)、UART5_RX(PB12)、GND 接到串口工具上。
+
+使用ESlinkⅡ(mini)连接开发板如下图所示:
+
+ESLinkⅡ(mini) + HRSDK-GDB-ES8P508-V1.0
+
+![ESLinkII](figures/ESLinkII-mini.jpg)
+
+### 编译下载
+
+双击 project.uvprojx 文件,打开 MDK4 工程,工程默认配置使用 JLink 下载程序,在通过 JLink 连接开发板的基础上,点击下载按钮即可下载程序到开发板,如果使用 ESLinkⅡ,则选择 "CMSIS-DAP Debugger",连接正常后即可编译并下载程序到开发板。
+
+### 运行结果
+
+下载程序成功之后,系统会自动运行,观察串口输出的信息,同时开发板LED闪烁。
+
+```bash
+ \ | /
+- RT -     Thread Operating System
+ / | \     4.0.2 build Jul 12 2019
+ 2006 - 2019 Copyright by rt-thread team
+msh />
+```
+## 3. 进阶使用
+
+此 BSP 默认只开启了 GPIO 和 uart5 的功能,如果需使用 SPI 等更多高级功能,需要利用 ENV 工具对 BSP 进行配置,步骤如下:
+
+1. 在 bsp 下打开 env 工具。
+
+2. 输入`menuconfig`命令配置工程,配置好之后保存退出。
+
+3. 输入`pkgs --update`命令更新软件包。
+
+4. 输入`scons --target=MDK4` 命令重新生成工程。
+
+更多 Env 工具的详细介绍请参考 [RT-Thread 文档中心](https://www.rt-thread.org/document/site/)
+
+## 4. 联系人信息
+
+- [wangyongquan](https://github.com/wangyq2018) 
+
+## 5. 参考
+
+- [ EastSoft 官网](http://www.essemi.com)
+

+ 13 - 0
bsp/essemi/es8p508x/SConscript

@@ -0,0 +1,13 @@
+# RT-Thread SConscript bridge
+import os
+
+objs = []
+cwd  = GetCurrentDir()
+list = os.listdir(cwd)
+
+for d in list:
+    path = os.path.join(cwd, d)
+    if os.path.isfile(os.path.join(path, 'SConscript')):
+        objs = objs + SConscript(os.path.join(d, 'SConscript'))
+
+Return('objs')

+ 39 - 0
bsp/essemi/es8p508x/SConstruct

@@ -0,0 +1,39 @@
+import os
+import sys
+import rtconfig
+
+if os.getenv('RTT_ROOT'):
+    RTT_ROOT = os.getenv('RTT_ROOT')
+else:
+    RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
+
+sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+try:
+    from building import *
+except:
+    print('Cannot found RT-Thread root directory, please check RTT_ROOT')
+    print(RTT_ROOT)
+    exit(-1)
+
+TARGET = 'rtthread.' + rtconfig.TARGET_EXT
+
+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)
+env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
+
+if rtconfig.PLATFORM == 'iar':
+    env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
+    env.Replace(ARFLAGS = [''])
+    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
+
+Export('RTT_ROOT')
+Export('rtconfig')
+
+# prepare building environment
+objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
+
+# make a building
+DoBuilding(TARGET, objs)

+ 9 - 0
bsp/essemi/es8p508x/applications/SConscript

@@ -0,0 +1,9 @@
+from building import *
+
+cwd = GetCurrentDir()
+src = Glob('*.c')
+
+CPPPATH = [cwd]
+group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
+
+Return('group')

+ 34 - 0
bsp/essemi/es8p508x/applications/main.c

@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author        Notes
+ * 2019-07-12     wangyq        the first version
+ */
+
+#include <rtthread.h>
+#include <rtdevice.h>
+#include <lib_wdt.h>
+
+#define LED_PIN 29
+
+int main(void)
+{
+    int count = 1;
+
+    /* set PA14 pin mode to output */
+    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
+
+    while (count++)
+    {
+        rt_pin_write(LED_PIN, PIN_HIGH);
+        rt_thread_mdelay(500);
+        rt_pin_write(LED_PIN, PIN_LOW);
+        rt_thread_mdelay(500);
+    }
+
+    return RT_EOK;
+}
+

+ 51 - 0
bsp/essemi/es8p508x/drivers/Kconfig

@@ -0,0 +1,51 @@
+menu "Hardware Drivers Config"
+
+    menu "On-chip Peripheral Drivers"
+        config BSP_USING_GPIO
+            bool "Enable GPIO"
+            select RT_USING_PIN
+            default y
+
+        menu "UART Drivers"
+            config BSP_USING_UART0
+                bool "Enable UART0 PB00/PB01(R/T)"
+                select RT_USING_SERIAL
+                default n
+
+            config BSP_USING_UART1
+                bool "Enable UART1 PA18/PA17(R/T)"
+                select RT_USING_SERIAL
+                default n
+
+            config BSP_USING_UART2
+                bool "Enable UART2 PA04/PA05(R/T)"
+                select RT_USING_SERIAL
+                default n
+
+            config BSP_USING_UART3
+                bool "Enable UART3 PA30/PA29(R/T)"
+                select RT_USING_SERIAL
+                default n
+
+            config BSP_USING_UART4
+                bool "Enable UART4 PB10/PB11(R/T)"
+                select RT_USING_SERIAL
+                default n
+
+            config BSP_USING_UART5
+                bool "Enable UART5 PB12/PB13(R/T)"
+                select RT_USING_SERIAL
+                default y
+        endmenu
+
+    endmenu
+
+    menu "Onboard Peripheral Drivers"
+
+    endmenu
+
+    menu "Offboard Peripheral Drivers"
+
+    endmenu
+
+endmenu

+ 21 - 0
bsp/essemi/es8p508x/drivers/SConscript

@@ -0,0 +1,21 @@
+from building import *
+
+cwd = GetCurrentDir()
+
+# add the general drivers.
+src = Split('''
+board.c
+''')
+
+# add gpio code
+if GetDepend('RT_USING_PIN'):
+    src += ['drv_gpio.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') or GetDepend('BSP_USING_UART4') or GetDepend('BSP_USING_UART5'):
+    src += ['drv_uart.c']
+
+CPPPATH = [cwd]
+group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
+
+Return('group')

+ 120 - 0
bsp/essemi/es8p508x/drivers/board.c

@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author        Notes
+ * 2019-07-11     wangyq        the first version
+ */
+
+#include <rthw.h>
+#include <rtthread.h>
+#include "board.h"
+#include "drv_uart.h"
+#include "drv_gpio.h"
+#include <lib_scu.h>
+#include <lib_gpio.h>
+
+/**
+ * @addtogroup es8p
+ */
+
+/*@{*/
+
+/*******************************************************************************
+* Function Name  : NVIC_Configuration
+* Description    : Configures Vector Table base location.
+* Input          : None
+* Output         : None
+* Return         : None
+*******************************************************************************/
+void NVIC_Configuration(void)
+{
+}
+
+/*******************************************************************************
+ * Function Name  : SystemClock_Configuration
+ * Description    : Configures the System Clock.
+ * Input          : None
+ * Output         : None
+ * Return         : None
+ *******************************************************************************/
+void  SystemClock_Config(void)
+{
+    /* system clock 48MHz */
+    PLLClock_Config(ENABLE, SCU_PLL_HRC, SCU_PLL_48M, ENABLE);
+}
+
+/*******************************************************************************
+ * Function Name  : SysTick_Configuration
+ * Description    : Configures the SysTick for OS tick.
+ * Input          : None
+ * Output         : None
+ * Return         : None
+ *******************************************************************************/
+void  SysTick_Configuration(void)
+{
+    /* ticks = SYS_CLK / RT_TICK_PER_SECOND */
+    SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
+}
+
+/**
+ * This is the timer interrupt service routine.
+ *
+ */
+void systick_irq_cbk(void)
+{
+    /* enter interrupt */
+    rt_interrupt_enter();
+
+    rt_tick_increase();
+
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+
+/*@}*/
+/**
+ * This function will initial es8p board.
+ */
+void rt_hw_board_init(void)
+{
+    /* NVIC Configuration */
+    NVIC_Configuration();
+
+    /*System Clock Configuration */
+    SystemClock_Config();
+
+    /* Configure the SysTick */
+    SysTick_Configuration();
+
+#ifdef RT_USING_HEAP
+    rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
+#endif
+#ifdef RT_USING_COMPONENTS_INIT
+    rt_components_board_init();
+#endif
+#ifdef RT_USING_CONSOLE
+    rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
+#endif
+}
+
+/**
+ * This function will delay for some us.
+ *
+ * @param us the delay time of us
+ */
+void rt_hw_us_delay(rt_uint32_t us)
+{
+    unsigned int start, now, delta, reload, us_tick;
+    start = SysTick->VAL;
+    reload = SysTick->LOAD;
+    us_tick = SystemCoreClock / 1000000UL;
+    do
+    {
+        now = SysTick->VAL;
+        delta = start > now ? start - now : reload + start - now;
+    }
+    while (delta <  us_tick * us);
+}

+ 35 - 0
bsp/essemi/es8p508x/drivers/board.h

@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author        Notes
+ * 2019-07-11     wangyq        the first version
+ */
+
+// <<< Use Configuration Wizard in Context Menu >>>
+#ifndef __BOARD_H__
+#define __BOARD_H__
+
+#include <ES8P508x.h>
+
+#define ES8P_SRAM_SIZE    0x6000
+#define ES8P_SRAM_END     (0x20000000 + ES8P_SRAM_SIZE)
+
+#if defined(__CC_ARM) || defined(__CLANG_ARM)
+    extern int Image$$RW_IRAM1$$ZI$$Limit;
+    #define HEAP_BEGIN  ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
+#elif __ICCARM__
+    #pragma section="HEAP"
+    #define HEAP_BEGIN  (__segment_end("HEAP"))
+#else
+    extern int __bss_end;
+    #define HEAP_BEGIN  ((void *)&__bss_end)
+#endif
+
+#define HEAP_END    ES8P_SRAM_END
+
+void rt_hw_board_init(void);
+
+#endif

+ 478 - 0
bsp/essemi/es8p508x/drivers/drv_gpio.c

@@ -0,0 +1,478 @@
+/*
+ * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author        Notes
+ * 2019-07-11     wangyq        the first version
+ */
+
+#include <rthw.h>
+#include <rtdevice.h>
+#include "board.h"
+#include "drv_gpio.h"
+#include <lib_scu.h>
+#include <lib_gpio.h>
+
+#ifdef RT_USING_PIN
+
+#define __ES8P_PIN(index, gpio, gpio_index) {index, GPIO##gpio, GPIO_Pin_##gpio_index}
+#define __ES8P_PIN_DEFAULT {-1, GPIOA, GPIO_Pin_0}
+
+/* es8p GPIO driver */
+struct pin_index
+{
+    int index;
+    GPIO_TYPE gpio;
+    GPIO_TYPE_PIN pin;
+};
+
+static const struct pin_index pins[] =
+{
+    __ES8P_PIN_DEFAULT,
+    __ES8P_PIN(1, B, 0),
+    __ES8P_PIN(2, B, 1),
+    __ES8P_PIN(3, B, 2),
+    __ES8P_PIN(4, B, 3),
+    __ES8P_PIN(5, B, 4),
+    __ES8P_PIN(6, B, 5),
+    __ES8P_PIN(7, B, 6),
+    __ES8P_PIN(8, B, 7),
+    __ES8P_PIN(9, B, 8),
+    __ES8P_PIN(10, B, 9),
+    __ES8P_PIN(11, B, 10),
+    __ES8P_PIN(12, B, 11),
+    __ES8P_PIN(13, B, 12),
+    __ES8P_PIN(14, B, 13),
+    __ES8P_PIN(15, A, 0),
+    __ES8P_PIN(16, A, 1),
+    __ES8P_PIN(17, A, 2),
+    __ES8P_PIN(18, A, 3),
+    __ES8P_PIN(19, A, 4),
+    __ES8P_PIN(20, A, 5),
+    __ES8P_PIN(21, A, 6),
+    __ES8P_PIN(22, A, 7),
+    __ES8P_PIN(23, A, 8),
+    __ES8P_PIN(24, A, 9),
+    __ES8P_PIN(25, A, 10),
+    __ES8P_PIN(26, A, 11),
+    __ES8P_PIN(27, A, 12),
+    __ES8P_PIN(28, A, 13),
+    __ES8P_PIN(29, A, 14),
+    __ES8P_PIN(30, A, 15),
+    __ES8P_PIN(31, A, 16),
+    __ES8P_PIN_DEFAULT,
+    __ES8P_PIN_DEFAULT,
+    __ES8P_PIN(34, A, 17),
+    __ES8P_PIN(35, A, 18),
+    __ES8P_PIN_DEFAULT,
+    __ES8P_PIN(37, A, 20),
+    __ES8P_PIN(38, A, 21),
+    __ES8P_PIN(39, A, 22),
+    __ES8P_PIN(40, A, 23),
+    __ES8P_PIN(41, A, 24),
+    __ES8P_PIN(42, A, 25),
+    __ES8P_PIN(43, A, 26),
+    __ES8P_PIN(44, A, 27),
+    __ES8P_PIN(45, A, 28),
+    __ES8P_PIN(46, A, 29),
+    __ES8P_PIN(47, A, 30),
+    __ES8P_PIN(48, A, 31),
+};
+
+struct irq_map
+{
+    PINT_TYPE pinno;
+    IRQn_Type irqno;
+};
+static const struct irq_map irq_map[] =
+{
+    {PINT0, PINT0_IRQn},
+    {PINT1, PINT1_IRQn},
+    {PINT2, PINT2_IRQn},
+    {PINT3, PINT3_IRQn},
+    {PINT4, PINT4_IRQn},
+    {PINT5, PINT5_IRQn},
+    {PINT6, PINT6_IRQn},
+    {PINT7, PINT7_IRQn},
+};
+
+struct rt_pin_irq_hdr pin_irq_hdr_tab[] =
+{
+    {-1, 0, RT_NULL, RT_NULL},
+    {-1, 0, RT_NULL, RT_NULL},
+    {-1, 0, RT_NULL, RT_NULL},
+    {-1, 0, RT_NULL, RT_NULL},
+    {-1, 0, RT_NULL, RT_NULL},
+    {-1, 0, RT_NULL, RT_NULL},
+    {-1, 0, RT_NULL, RT_NULL},
+    {-1, 0, RT_NULL, RT_NULL},
+};
+
+#define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
+const struct pin_index *get_pin(uint8_t pin)
+{
+    const struct pin_index *index;
+    if (pin < ITEM_NUM(pins))
+    {
+        index = &pins[pin];
+        if (index->index == -1)
+            index = RT_NULL;
+    }
+    else
+    {
+        index = RT_NULL;
+    }
+    return index;
+};
+
+void es8p_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
+{
+    const struct pin_index *index;
+    index = get_pin(pin);
+    if (index == RT_NULL)
+    {
+        return;
+    }
+
+    if (value == 0)
+    {
+        if (index->gpio == GPIOA)
+            GPIOA_ResetBit(index->pin);
+        else if (index->gpio == GPIOB)
+            GPIOB_ResetBit(index->pin);
+    }
+    else
+    {
+        if (index->gpio == GPIOA)
+            GPIOA_SetBit(index->pin);
+        else if (index->gpio == GPIOB)
+            GPIOB_SetBit(index->pin);
+    }
+}
+
+int es8p_pin_read(rt_device_t dev, rt_base_t pin)
+{
+    int value;
+    const struct pin_index *index;
+    value = PIN_LOW;
+    index = get_pin(pin);
+    if (index == RT_NULL)
+    {
+        return value;
+    }
+    value = GPIO_ReadBit(index->gpio, index->pin);
+    return value;
+}
+
+void es8p_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
+{
+    const struct pin_index *index;
+    GPIO_InitStruType gpio_initstruct;
+    index = get_pin(pin);
+    if (index == RT_NULL)
+    {
+        return;
+    }
+
+    /* Configure GPIO_InitStructure */
+    gpio_initstruct.GPIO_Signal = GPIO_Pin_Signal_Digital;
+    gpio_initstruct.GPIO_Func = GPIO_Func_0;
+    gpio_initstruct.GPIO_OD = GPIO_ODE_Output_Disable;
+    gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Disable;
+    gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Disable;
+    gpio_initstruct.GPIO_DS = GPIO_DS_Output_Normal;
+
+    if (mode == PIN_MODE_OUTPUT)
+    {
+        /* output setting */
+        gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
+    }
+    else if (mode == PIN_MODE_INPUT)
+    {
+        /* input setting: not pull. */
+        gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
+    }
+    else if (mode == PIN_MODE_INPUT_PULLUP)
+    {
+        /* input setting: pull up. */
+        gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
+        gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Enable;
+    }
+    else if (mode == PIN_MODE_INPUT_PULLDOWN)
+    {
+        /* input setting: pull down. */
+        gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
+        gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Enable;
+    }
+    else if (mode == PIN_MODE_OUTPUT_OD)
+    {
+        /* output setting: od. */
+        gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
+        gpio_initstruct.GPIO_OD = GPIO_ODE_Output_Enable;
+    }
+    GPIO_Init(index->gpio, index->pin, &gpio_initstruct);
+}
+
+rt_inline const struct irq_map *get_pin_irq_map(rt_uint16_t gpio_pin)
+{
+    rt_int32_t mapindex = gpio_pin & 0x00FF;
+    if (mapindex < 0 || mapindex >= 32)
+    {
+        return RT_NULL;
+    }
+    return &irq_map[mapindex % 8];
+};
+
+rt_err_t es8p_pin_attach_irq(struct rt_device *device, rt_int32_t pin,
+                             rt_uint32_t mode, void (*hdr)(void *args), void *args)
+{
+    const struct pin_index *index;
+    rt_base_t level;
+    rt_int32_t irqindex;
+    index = get_pin(pin);
+    if (index == RT_NULL)
+    {
+        return RT_ENOSYS;
+    }
+
+    irqindex = index->pin % 8;
+    level = rt_hw_interrupt_disable();
+
+    if (pin_irq_hdr_tab[irqindex].pin == pin &&
+            pin_irq_hdr_tab[irqindex].hdr == hdr &&
+            pin_irq_hdr_tab[irqindex].mode == mode &&
+            pin_irq_hdr_tab[irqindex].args == args)
+    {
+        rt_hw_interrupt_enable(level);
+        return RT_EOK;
+    }
+    if (pin_irq_hdr_tab[irqindex].pin != -1)
+    {
+        rt_hw_interrupt_enable(level);
+        return RT_EBUSY;
+    }
+
+    pin_irq_hdr_tab[irqindex].pin = pin;
+    pin_irq_hdr_tab[irqindex].hdr = hdr;
+    pin_irq_hdr_tab[irqindex].mode = mode;
+    pin_irq_hdr_tab[irqindex].args = args;
+    rt_hw_interrupt_enable(level);
+
+    return RT_EOK;
+}
+
+rt_err_t es8p_pin_detach_irq(struct rt_device *device, rt_int32_t pin)
+{
+    const struct pin_index *index;
+    rt_base_t level;
+    rt_int32_t irqindex = -1;
+    index = get_pin(pin);
+    if (index == RT_NULL)
+    {
+        return RT_ENOSYS;
+    }
+    irqindex = index->pin % 8;
+    level = rt_hw_interrupt_disable();
+
+    if (pin_irq_hdr_tab[irqindex].pin == -1)
+    {
+        rt_hw_interrupt_enable(level);
+        return RT_EOK;
+    }
+    pin_irq_hdr_tab[irqindex].pin = -1;
+    pin_irq_hdr_tab[irqindex].hdr = RT_NULL;
+    pin_irq_hdr_tab[irqindex].mode = 0;
+    pin_irq_hdr_tab[irqindex].args = RT_NULL;
+    rt_hw_interrupt_enable(level);
+    return RT_EOK;
+}
+
+rt_err_t es8p_pin_irq_enable(struct rt_device *device, rt_base_t pin,
+                             rt_uint32_t enabled)
+{
+    const struct pin_index *index;
+    const struct irq_map *irqmap;
+    rt_base_t level;
+    rt_int32_t irqindex = -1;
+    /* Configure GPIO_InitStructure */
+    GPIO_InitStruType gpio_initstruct;
+
+    index = get_pin(pin);
+    if (index == RT_NULL)
+    {
+        return RT_ENOSYS;
+    }
+    if (enabled == PIN_IRQ_ENABLE)
+    {
+        irqindex = pin % 8;
+        level = rt_hw_interrupt_disable();
+        if (pin_irq_hdr_tab[irqindex].pin == -1)
+        {
+            rt_hw_interrupt_enable(level);
+            return RT_ENOSYS;
+        }
+        irqmap = &irq_map[irqindex];
+
+        /* Configure GPIO_InitStructure */
+        gpio_initstruct.GPIO_Signal = GPIO_Pin_Signal_Digital;
+        gpio_initstruct.GPIO_Func = GPIO_Func_0;
+        gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
+        gpio_initstruct.GPIO_OD = GPIO_ODE_Output_Disable;
+        gpio_initstruct.GPIO_DS = GPIO_DS_Output_Normal;
+
+        switch (pin_irq_hdr_tab[irqindex].mode)
+        {
+        case PIN_IRQ_MODE_RISING:
+            gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Disable;
+            gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Enable;
+            if (index->gpio == GPIOA)
+                PINT_Config(irqmap->pinno, (PINT_TYPE_SEL)(pin >> 3), PINT_Trig_Rise);
+            else
+                PINT_Config(irqmap->pinno, (PINT_TYPE_SEL)((pin >> 3) + 4), PINT_Trig_Rise);
+            break;
+
+        case PIN_IRQ_MODE_FALLING:
+            gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Enable;
+            gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Disable;
+            if (index->gpio == GPIOA)
+                PINT_Config(irqmap->pinno, (PINT_TYPE_SEL)(pin >> 3), PINT_Trig_Fall);
+            else
+                PINT_Config(irqmap->pinno, (PINT_TYPE_SEL)((pin >> 3) + 4), PINT_Trig_Fall);
+            break;
+
+        case PIN_IRQ_MODE_RISING_FALLING:
+            gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Disable;
+            gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Disable;
+            if (index->gpio == GPIOA)
+                PINT_Config(irqmap->pinno, (PINT_TYPE_SEL)(pin >> 3), PINT_Trig_Change);
+            else
+                PINT_Config(irqmap->pinno, (PINT_TYPE_SEL)((pin >> 3) + 4), PINT_Trig_Change);
+            break;
+
+        default:
+            break;
+        }
+        GPIO_Init(index->gpio, index->pin, &gpio_initstruct);
+        NVIC_EnableIRQ(irqmap->irqno);
+        rt_hw_interrupt_enable(level);
+    }
+    else if (enabled == PIN_IRQ_DISABLE)
+    {
+        irqmap = get_pin_irq_map(index->pin);
+        if (irqmap == RT_NULL)
+        {
+            return RT_ENOSYS;
+        }
+        NVIC_DisableIRQ(irqmap->irqno);
+    }
+    else
+    {
+        return RT_ENOSYS;
+    }
+    return RT_EOK;
+}
+
+const static struct rt_pin_ops _es8p_pin_ops =
+{
+    es8p_pin_mode,
+    es8p_pin_write,
+    es8p_pin_read,
+    es8p_pin_attach_irq,
+    es8p_pin_detach_irq,
+    es8p_pin_irq_enable,
+};
+
+int rt_hw_pin_init(void)
+{
+    int result;
+    SCU_GPIOCLK_Enable();
+    result = rt_device_pin_register("pin", &_es8p_pin_ops, RT_NULL);
+    return result;
+}
+INIT_BOARD_EXPORT(rt_hw_pin_init);
+
+rt_inline void pin_irq_hdr(PINT_TYPE_IT GPIO_Pin)
+{
+    uint16_t irqno;
+    /* pin no. convert to dec no. */
+    for (irqno = 0; irqno < 16; irqno++)
+    {
+        if ((0x01 << irqno) == GPIO_Pin)
+        {
+            break;
+        }
+    }
+    if (pin_irq_hdr_tab[irqno].hdr)
+    {
+        pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args);
+    }
+}
+
+rt_inline void GPIO_EXTI_Callback(PINT_TYPE_IT GPIO_Pin)
+{
+    if (PINT_GetIFStatus(GPIO_Pin) != RESET)
+    {
+        PINT_ClearITPendingBit(GPIO_Pin);
+        pin_irq_hdr(GPIO_Pin);
+    }
+}
+
+void PINT0_IRQHandler(void)
+{
+    rt_interrupt_enter();
+    GPIO_EXTI_Callback(PINT_IT_PINT0);
+    rt_interrupt_leave();
+}
+
+void PINT1_IRQHandler(void)
+{
+    rt_interrupt_enter();
+    GPIO_EXTI_Callback(PINT_IT_PINT1);
+    rt_interrupt_leave();
+}
+
+void PINT2_IRQHandler(void)
+{
+    rt_interrupt_enter();
+    GPIO_EXTI_Callback(PINT_IT_PINT2);
+    rt_interrupt_leave();
+}
+
+void PINT3_IRQHandler(void)
+{
+    rt_interrupt_enter();
+    GPIO_EXTI_Callback(PINT_IT_PINT3);
+    rt_interrupt_leave();
+}
+
+void PINT4_IRQHandler(void)
+{
+    rt_interrupt_enter();
+    GPIO_EXTI_Callback(PINT_IT_PINT4);
+    rt_interrupt_leave();
+}
+
+void PINT5_IRQHandler(void)
+{
+    rt_interrupt_enter();
+    GPIO_EXTI_Callback(PINT_IT_PINT5);
+    rt_interrupt_leave();
+}
+
+void PINT6_IRQHandler(void)
+{
+    rt_interrupt_enter();
+    GPIO_EXTI_Callback(PINT_IT_PINT6);
+    rt_interrupt_leave();
+}
+
+void PINT7_IRQHandler(void)
+{
+    rt_interrupt_enter();
+    GPIO_EXTI_Callback(PINT_IT_PINT7);
+    rt_interrupt_leave();
+}
+
+#endif

+ 16 - 0
bsp/essemi/es8p508x/drivers/drv_gpio.h

@@ -0,0 +1,16 @@
+/*
+ * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author        Notes
+ * 2019-07-11     wangyq        the first version
+ */
+
+#ifndef DRV_GPIO_H__
+#define DRV_GPIO_H__
+
+int rt_hw_pin_init(void);
+
+#endif

+ 444 - 0
bsp/essemi/es8p508x/drivers/drv_uart.c

@@ -0,0 +1,444 @@
+/*
+ * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author        Notes
+ * 2019-07-12     wangyq        the first version
+ */
+
+#include <rthw.h>
+#include <rtthread.h>
+#include <rtdevice.h>
+#include "board.h"
+#include "drv_uart.h"
+#include <lib_gpio.h>
+#include <lib_uart.h>
+
+#ifdef RT_USING_SERIAL
+
+/* es8p uart driver */
+struct es8p_uart
+{
+    UART_TypeDef *huart;
+    IRQn_Type irq;
+};
+
+static rt_err_t es8px_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
+{
+    GPIO_InitStruType gpio_initstruct;
+    UART_InitStruType uart_initstruct;
+    struct es8p_uart *uart;
+    RT_ASSERT(serial != RT_NULL);
+    RT_ASSERT(cfg != RT_NULL);
+    uart = (struct es8p_uart *)serial->parent.user_data;
+
+    gpio_initstruct.GPIO_Signal = GPIO_Pin_Signal_Digital;
+    gpio_initstruct.GPIO_OD = GPIO_ODE_Output_Disable;
+    gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Enable;
+    gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Disable;
+    gpio_initstruct.GPIO_DS = GPIO_DS_Output_Normal;
+
+#ifdef BSP_USING_UART0
+    gpio_initstruct.GPIO_Func = GPIO_Func_2;
+    /* Initialize rx pin */
+    gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
+    GPIO_Init(GPIOB, GPIO_Pin_0, &gpio_initstruct);
+    /* Initialize tx pin ,the same as rx pin except mode */
+    gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
+    GPIO_Init(GPIOB, GPIO_Pin_1, &gpio_initstruct);
+#endif
+
+#ifdef BSP_USING_UART1
+    gpio_initstruct.GPIO_Func = GPIO_Func_1;
+    /* Initialize rx pin */
+    gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
+    GPIO_Init(GPIOA, GPIO_Pin_18, &gpio_initstruct);
+    /* Initialize tx pin ,the same as rx pin except mode */
+    gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
+    GPIO_Init(GPIOA, GPIO_Pin_17, &gpio_initstruct);
+#endif
+
+#ifdef BSP_USING_UART2
+    gpio_initstruct.GPIO_Func = GPIO_Func_2;
+    /* Initialize rx pin */
+    gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
+    GPIO_Init(GPIOA, GPIO_Pin_4, &gpio_initstruct);
+    /* Initialize tx pin ,the same as rx pin except mode */
+    gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
+    GPIO_Init(GPIOA, GPIO_Pin_5, &gpio_initstruct);
+#endif
+
+#ifdef BSP_USING_UART3
+    gpio_initstruct.GPIO_Func = GPIO_Func_2;
+    /* Initialize rx pin */
+    gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
+    GPIO_Init(GPIOA, GPIO_Pin_30, &gpio_initstruct);
+    /* Initialize tx pin ,the same as rx pin except mode */
+    gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
+    GPIO_Init(GPIOA, GPIO_Pin_29, &gpio_initstruct);
+#endif
+
+#ifdef BSP_USING_UART4
+    gpio_initstruct.GPIO_Func = GPIO_Func_1;
+    /* Initialize rx pin */
+    gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
+    GPIO_Init(GPIOB, GPIO_Pin_10, &gpio_initstruct);
+    /* Initialize tx pin ,the same as rx pin except mode */
+    gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
+    GPIO_Init(GPIOB, GPIO_Pin_11, &gpio_initstruct);
+#endif
+
+#ifdef BSP_USING_UART5
+    gpio_initstruct.GPIO_Func = GPIO_Func_1;
+    /* Initialize rx pin */
+    gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
+    GPIO_Init(GPIOB, GPIO_Pin_12, &gpio_initstruct);
+    /* Initialize tx pin ,the same as rx pin except mode */
+    gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
+    GPIO_Init(GPIOB, GPIO_Pin_13, &gpio_initstruct);
+#endif
+
+    uart_initstruct.UART_ClockSet = UART_Clock_1;
+    uart_initstruct.UART_BaudRate = cfg->baud_rate;
+    uart_initstruct.UART_RxPolar = UART_Polar_Normal;
+    uart_initstruct.UART_TxPolar = UART_Polar_Normal;
+
+    if (cfg->data_bits == DATA_BITS_7)
+    {
+        uart_initstruct.UART_RxMode = UART_DataMode_7;
+        uart_initstruct.UART_TxMode = UART_DataMode_7;
+
+        if (cfg->parity == PARITY_EVEN)
+        {
+            uart_initstruct.UART_RxMode = UART_DataMode_7Even;
+            uart_initstruct.UART_TxMode = UART_DataMode_7Even;
+        }
+        else if (cfg->parity == PARITY_ODD)
+        {
+            uart_initstruct.UART_RxMode = UART_DataMode_7Odd;
+            uart_initstruct.UART_TxMode = UART_DataMode_7Odd;
+        }
+    }
+    else if (cfg->data_bits == DATA_BITS_8)
+    {
+        uart_initstruct.UART_RxMode = UART_DataMode_8;
+        uart_initstruct.UART_TxMode = UART_DataMode_8;
+
+        if (cfg->parity == PARITY_EVEN)
+        {
+            uart_initstruct.UART_RxMode = UART_DataMode_8Even;
+            uart_initstruct.UART_TxMode = UART_DataMode_8Even;
+        }
+        else if (cfg->parity == PARITY_ODD)
+        {
+            uart_initstruct.UART_RxMode = UART_DataMode_8Odd;
+            uart_initstruct.UART_TxMode = UART_DataMode_8Odd;
+        }
+    }
+    else if (cfg->data_bits == DATA_BITS_9)
+    {
+        uart_initstruct.UART_RxMode = UART_DataMode_9;
+        uart_initstruct.UART_TxMode = UART_DataMode_9;
+    }
+
+    if (cfg->bit_order == BIT_ORDER_MSB)
+    {
+        return RT_EINVAL;
+    }
+
+    if (cfg->invert == NRZ_INVERTED)
+    {
+        uart_initstruct.UART_RxPolar = UART_Polar_Opposite;
+        uart_initstruct.UART_TxPolar = UART_Polar_Opposite;
+    }
+
+    /* config uart function */
+    UART_Init(uart->huart, &uart_initstruct);
+    /* enable rx and tx */
+    uart->huart->CON.RXEN = 1;
+    uart->huart->CON.TXEN = 1;
+
+    NVIC_SetPriority(uart->irq, 1);
+
+    return RT_EOK;
+}
+
+static rt_err_t es8px_control(struct rt_serial_device *serial, int cmd, void *arg)
+{
+    struct es8p_uart *uart;
+    RT_ASSERT(serial != RT_NULL);
+
+    uart = (struct es8p_uart *)serial->parent.user_data;
+
+    switch (cmd)
+    {
+    case RT_DEVICE_CTRL_CLR_INT:
+        /* disable rx irq */
+        NVIC_DisableIRQ(uart->irq);
+        /* disable interrupt */
+        UART_ITConfig(uart->huart, UART_IT_RB, DISABLE);
+        break;
+
+    case RT_DEVICE_CTRL_SET_INT:
+        /* enable rx irq */
+        NVIC_EnableIRQ(uart->irq);
+        /* enable interrupt */
+        UART_ITConfig(uart->huart, UART_IT_RB, ENABLE);
+        break;
+    }
+
+    return RT_EOK;
+}
+
+static int es8px_putc(struct rt_serial_device *serial, char c)
+{
+    struct es8p_uart *uart;
+    RT_ASSERT(serial != RT_NULL);
+    uart = (struct es8p_uart *)serial->parent.user_data;
+
+    while (UART_GetFlagStatus(uart->huart, UART_FLAG_TB) == RESET) ;
+    UART_SendByte(uart->huart, c);
+
+    return 1;
+}
+
+static int es8px_getc(struct rt_serial_device *serial)
+{
+    int ch = -1;
+    struct es8p_uart *uart;
+
+    RT_ASSERT(serial != RT_NULL);
+    uart = (struct es8p_uart *)serial->parent.user_data;
+
+    if (UART_GetFlagStatus(uart->huart, UART_FLAG_RB))
+    {
+        ch = UART_RecByte(uart->huart);
+    }
+
+    return ch;
+}
+
+static const struct rt_uart_ops es8px_uart_ops =
+{
+    es8px_configure,
+    es8px_control,
+    es8px_putc,
+    es8px_getc,
+};
+
+#ifdef BSP_USING_UART0
+/* UART0 device driver structure */
+struct es8p_uart uart0 =
+{
+    UART0,
+    UART0_IRQn
+};
+
+struct rt_serial_device serial0;
+
+void UART0_IRQHandler(void)
+{
+    /* enter interrupt */
+    rt_interrupt_enter();
+
+    if (UART0->IF.RBIF)
+    {
+        rt_hw_serial_isr(&serial0, RT_SERIAL_EVENT_RX_IND);
+    }
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+#endif /* BSP_USING_UART0 */
+
+#ifdef BSP_USING_UART1
+/* UART1 device driver structure */
+struct es8p_uart uart1 =
+{
+    UART1,
+    UART1_IRQn
+};
+
+struct rt_serial_device serial1;
+
+void UART1_IRQHandler(void)
+{
+    /* enter interrupt */
+    rt_interrupt_enter();
+
+    if (UART1->IF.RBIF)
+    {
+        rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND);
+    }
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+#endif /* BSP_USING_UART1 */
+
+#ifdef BSP_USING_UART2
+/* UART1 device driver structure */
+struct es8p_uart uart2 =
+{
+    UART2,
+    UART2_IRQn
+};
+
+struct rt_serial_device serial2;
+
+void UART2_IRQHandler(void)
+{
+    /* enter interrupt */
+    rt_interrupt_enter();
+
+    if (UART2->IF.RBIF)
+    {
+        rt_hw_serial_isr(&serial2, RT_SERIAL_EVENT_RX_IND);
+    }
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+#endif /* BSP_USING_UART2 */
+
+#ifdef BSP_USING_UART3
+/* UART3 device driver structure */
+struct es8p_uart uart3 =
+{
+    UART3,
+    UART3_IRQn
+};
+
+struct rt_serial_device serial3;
+
+void UART3_IRQHandler(void)
+{
+    /* enter interrupt */
+    rt_interrupt_enter();
+
+    if (UART3->IF.RBIF)
+    {
+        rt_hw_serial_isr(&serial3, RT_SERIAL_EVENT_RX_IND);
+    }
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+#endif /* BSP_USING_UART3 */
+
+#ifdef BSP_USING_UART4
+/* UART4 device driver structure */
+struct es8p_uart uart4 =
+{
+    UART4,
+    UART4_IRQn
+};
+
+struct rt_serial_device serial4;
+
+void UART4_IRQHandler(void)
+{
+    /* enter interrupt */
+    rt_interrupt_enter();
+
+    if (UART4->IF.RBIF)
+    {
+        rt_hw_serial_isr(&serial4, RT_SERIAL_EVENT_RX_IND);
+    }
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+#endif /* BSP_USING_UART4 */
+
+#ifdef BSP_USING_UART5
+/* UART5 device driver structure */
+struct es8p_uart uart5 =
+{
+    UART5,
+    UART5_IRQn
+};
+
+struct rt_serial_device serial5;
+
+void UART5_IRQHandler(void)
+{
+    /* enter interrupt */
+    rt_interrupt_enter();
+
+    if (UART5->IF.RBIF)
+    {
+        rt_hw_serial_isr(&serial5, RT_SERIAL_EVENT_RX_IND);
+    }
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+#endif /* BSP_USING_UART5 */
+
+int rt_hw_uart_init(void)
+{
+    struct es8p_uart *uart;
+    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
+
+#ifdef BSP_USING_UART0
+    uart = &uart0;
+    serial0.ops = &es8px_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
+    uart = &uart1;
+    serial1.ops = &es8px_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
+    uart = &uart2;
+    serial2.ops = &es8px_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
+    uart = &uart3;
+    serial3.ops = &es8px_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 */
+
+#ifdef BSP_USING_UART4
+    uart = &uart4;
+    serial4.ops = &es8px_uart_ops;
+    serial4.config = config;
+
+    /* register UART4 device */
+    rt_hw_serial_register(&serial4, "uart4",
+                          RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
+#endif /* BSP_USING_UART4 */
+
+#ifdef BSP_USING_UART5
+    uart = &uart5;
+    serial5.ops = &es8px_uart_ops;
+    serial5.config = config;
+
+    /* register UART5 device */
+    rt_hw_serial_register(&serial5, "uart5",
+                          RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
+#endif /* BSP_USING_UART5 */
+
+    return 0;
+}
+INIT_BOARD_EXPORT(rt_hw_uart_init);
+
+#endif

+ 16 - 0
bsp/essemi/es8p508x/drivers/drv_uart.h

@@ -0,0 +1,16 @@
+/*
+ * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author        Notes
+ * 2019-07-12     wangyq        the first version
+ */
+
+#ifndef DRV_UART_H__
+#define DRV_UART_H__
+
+int rt_hw_uart_init(void);
+
+#endif

+ 15 - 0
bsp/essemi/es8p508x/drivers/linker_scripts/link.sct

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

BIN
bsp/essemi/es8p508x/figures/ESLinkII-mini.jpg


BIN
bsp/essemi/es8p508x/figures/HRSDK-GDB-ES8P508x-V1.0.jpg


+ 3117 - 0
bsp/essemi/es8p508x/libraries/CMSIS/ES8P508x.h

@@ -0,0 +1,3117 @@
+/*******************************************************************
+* *file       : ES8P508x.h
+* *description: ES8P508x Device Head File
+* *author     : Eastsoft MCU Software Team
+* *version    : V0.01
+* *data       : 7/11/2017
+*
+* *Copyright (C) 2017 Shanghai Eastsoft Microelectronics Co., Ltd.
+*******************************************************************/
+#ifndef __ES8P508x_H__
+#define __ES8P508x_H__
+
+#define __I volatile const /* defines 'read only' permissions */
+#define __O volatile /* defines 'write only' permissions */
+#define __IO volatile /* defines 'read / write' permissions */
+
+#define __CM0_REV 0 /* Core Revision r0p0 */
+#define __NVIC_PRIO_BITS 2 /* ES8P508x uses 2 Bits for the Priority Levels */
+#define __Vendor_SysTickConfig 0 /* Set to 1 if different SysTick Config is used */
+
+typedef enum IRQn
+{
+    /****** Cortex-M0 Processor Exceptions Numbers ******************************************************/
+    RST_IRQn = -15,
+    NonMaskableInt_IRQn = -14,
+    HardFault_IRQn = -13,
+    SVC_IRQn = -5,
+    PendSV_IRQn = -2,
+    SysTick_IRQn = -1,
+    PINT0_IRQn = 0,
+    PINT1_IRQn = 1,
+    PINT2_IRQn = 2,
+    PINT3_IRQn = 3,
+    PINT4_IRQn = 4,
+    PINT5_IRQn = 5,
+    PINT6_IRQn = 6,
+    PINT7_IRQn = 7,
+    T16N0_IRQn = 8,
+    T16N1_IRQn = 9,
+    T16N2_IRQn = 10,
+    T16N3_IRQn = 11,
+    T32N0_IRQn = 12,
+    Reserved0_IRQn = 13,
+    IWDT_IRQn = 14,
+    WWDT_IRQn = 15,
+    CCM_IRQn = 16,
+    PLK_IRQn = 17,
+    LVD_IRQn = 18,
+    KINT_IRQn = 19,
+    RTC_IRQn = 20,
+    ADC_IRQn = 21,
+    Reserved1_IRQn = 22,
+    AES_IRQn = 23,
+    UART0_IRQn = 24,
+    UART1_IRQn = 25,
+    UART2_IRQn = 26,
+    UART3_IRQn = 27,
+    UART4_IRQn = 28,
+    UART5_IRQn = 29,
+    SPI0_IRQn = 30,
+    I2C0_IRQn = 31,
+} IRQn_Type;
+
+
+#include "core_cm0.h"
+#include <stdint.h>
+
+
+/******************************************************************************/
+/*                              设备特殊寄存器结构定䷿                       */
+/******************************************************************************/
+
+/*   允许匿名结构和匿名联县   */
+#pragma anon_unions
+
+typedef union
+{
+    struct
+    {
+        uint32_t PROT: 1;
+        uint32_t RESERVED0: 31;
+    };
+    uint32_t Word;
+} SCU_PROT_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t NMIEN: 1;
+        uint32_t NMICS: 5;
+        uint32_t RESERVED0: 26;
+    };
+    uint32_t Word;
+} SCU_NMICON_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PORF: 1;
+        uint32_t PORRCF: 1;
+        uint32_t PORRSTF: 1;
+        uint32_t BORF: 1;
+        uint32_t WWDTRSTF: 1;
+        uint32_t IWDTRSTF: 1;
+        uint32_t MRSTF: 1;
+        uint32_t SOFT_RSTF: 1;
+        uint32_t POR_LOST: 1;
+        uint32_t CFG_RST: 1;
+        uint32_t LOCKUP_RST: 1;
+        uint32_t RESERVED0: 21;
+    };
+    uint32_t Word;
+} SCU_PWRC_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t FLAG0: 1;
+        uint32_t FLAG1: 1;
+        uint32_t FLAG2: 1;
+        uint32_t FLAG3: 1;
+        uint32_t FLAG4: 1;
+        uint32_t RESERVED0: 27;
+    };
+    uint32_t Word;
+} SCU_FAULTFLAG_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t WAKEUPTIME: 12;
+        uint32_t MOSC_EN: 1;
+        uint32_t CLKFLT_EN: 1;
+        uint32_t FLASHPW_PD: 1;
+        uint32_t RESERVED0: 1;
+        uint32_t LDOLP_VOSEL: 3;
+        uint32_t LDOHP_SOFT: 1;
+        uint32_t RESERVED1: 12;
+    };
+    uint32_t Word;
+} SCU_WAKEUPTIME_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PINST: 1;
+        uint32_t RESERVED0: 31;
+    };
+    uint32_t Word;
+} SCU_MRSTN_SOFT_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t T16N0HT: 1;
+        uint32_t T16N1HT: 1;
+        uint32_t T16N2HT: 1;
+        uint32_t T16N3HT: 1;
+        uint32_t RESERVED0: 4;
+        uint32_t T32N0HT: 1;
+        uint32_t RESERVED1: 7;
+        uint32_t IWDTHT: 1;
+        uint32_t WWDTHT: 1;
+        uint32_t RESERVED2: 14;
+    };
+    uint32_t Word;
+} SCU_DBGHALT_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t ACCT: 4;
+        uint32_t HS: 1;
+        uint32_t RESERVED0: 27;
+    };
+    uint32_t Word;
+} SCU_FLASHWAIT_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t RESERVED0: 1;
+        uint32_t BORV: 4;
+        uint32_t BORFLT: 3;
+        uint32_t RESERVED1: 24;
+    };
+    uint32_t Word;
+} SCU_SOFTCFG_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t EN: 1;
+        uint32_t FLTEN: 1;
+        uint32_t RESERVED0: 2;
+        uint32_t VS: 4;
+        uint32_t IF: 1;
+        uint32_t IE: 1;
+        uint32_t IFS: 3;
+        uint32_t RESERVED1: 2;
+        uint32_t LVDO: 1;
+        uint32_t RESERVED2: 16;
+    };
+    uint32_t Word;
+} SCU_LVDCON_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t EN: 1;
+        uint32_t RESERVED0: 3;
+        uint32_t IE: 1;
+        uint32_t IFS: 3;
+        uint32_t IF: 1;
+        uint32_t RESERVED1: 7;
+        uint32_t FLAG: 1;
+        uint32_t RESERVED2: 15;
+    };
+    uint32_t Word;
+} SCU_CCM_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t IE: 1;
+        uint32_t RESERVED0: 3;
+        uint32_t LK_IFS: 3;
+        uint32_t RESERVED1: 1;
+        uint32_t IF: 1;
+        uint32_t RESERVED2: 7;
+        uint32_t LK_FLAG: 1;
+        uint32_t RESERVED3: 15;
+    };
+    uint32_t Word;
+} SCU_PLLLKCON_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t CLK_SEL: 2;
+        uint32_t XTAL_LP: 1;
+        uint32_t RESERVED0: 5;
+        uint32_t PLL_MUX: 1;
+        uint32_t RESERVED1: 3;
+        uint32_t SYSCLK_DIV: 3;
+        uint32_t RESERVED2: 1;
+        uint32_t CLKFLT_BY: 8;
+        uint32_t CLKOUT0_SEL: 2;
+        uint32_t CLKOUT1_SEL: 2;
+        uint32_t RESERVED3: 4;
+    };
+    uint32_t Word;
+} SCU_SCLKEN0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t XTAL_EN: 1;
+        uint32_t HRC_EN: 1;
+        uint32_t RESERVED0: 6;
+        uint32_t PLL_REF_SEL: 3;
+        uint32_t PLL_48M_SEL: 1;
+        uint32_t PLL_EN: 1;
+        uint32_t PLL_BYLOCK: 1;
+        uint32_t RESERVED1: 2;
+        uint32_t XTAL_RDY: 1;
+        uint32_t HRC_RDY: 1;
+        uint32_t PLL_RDY: 1;
+        uint32_t RESERVED2: 13;
+    };
+    uint32_t Word;
+} SCU_SCLKEN1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t SCU_EN: 1;
+        uint32_t GPIO_EN: 1;
+        uint32_t IAP_EN: 1;
+        uint32_t CRC_EN: 1;
+        uint32_t ADC_EN: 1;
+        uint32_t RTC_EN: 1;
+        uint32_t RESERVED0: 1;
+        uint32_t IWDT_EN: 1;
+        uint32_t WWDT_EN: 1;
+        uint32_t AES_EN: 1;
+        uint32_t RESERVED1: 22;
+    };
+    uint32_t Word;
+} SCU_PCLKEN0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t T16N0_EN: 1;
+        uint32_t T16N1_EN: 1;
+        uint32_t T16N2_EN: 1;
+        uint32_t T16N3_EN: 1;
+        uint32_t RESERVED0: 4;
+        uint32_t T32N0_EN: 1;
+        uint32_t RESERVED1: 7;
+        uint32_t UART0_EN: 1;
+        uint32_t UART1_EN: 1;
+        uint32_t UART2_EN: 1;
+        uint32_t UART3_EN: 1;
+        uint32_t UART4_EN: 1;
+        uint32_t UART5_EN: 1;
+        uint32_t RESERVED2: 2;
+        uint32_t SPI0_EN: 1;
+        uint32_t RESERVED3: 3;
+        uint32_t I2C0_EN: 1;
+        uint32_t RESERVED4: 3;
+    };
+    uint32_t Word;
+} SCU_PCLKEN1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t RESERVED0: 1;
+        uint32_t GPIO_RST: 1;
+        uint32_t IAP_RST: 1;
+        uint32_t CRC_RST: 1;
+        uint32_t ADC_RST: 1;
+        uint32_t RTC_RST: 1;
+        uint32_t RESERVED1: 1;
+        uint32_t IWDT_RST: 1;
+        uint32_t WWDT_RST: 1;
+        uint32_t AES_RST: 1;
+        uint32_t RESERVED2: 22;
+    };
+    uint32_t Word;
+} SCU_PRSTEN0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t T16N0_RST: 1;
+        uint32_t T16N1_RST: 1;
+        uint32_t T16N2_RST: 1;
+        uint32_t T16N3_RST: 1;
+        uint32_t RESERVED0: 4;
+        uint32_t T32N0_RST: 1;
+        uint32_t RESERVED1: 7;
+        uint32_t UART0_RST: 1;
+        uint32_t UART1_RST: 1;
+        uint32_t UART2_RST: 1;
+        uint32_t UART3_RST: 1;
+        uint32_t UART4_RST: 1;
+        uint32_t UART5_RST: 1;
+        uint32_t RESERVED2: 2;
+        uint32_t SPI0_RST: 1;
+        uint32_t RESERVED3: 3;
+        uint32_t I2C0_RST: 1;
+        uint32_t RESERVED4: 3;
+    };
+    uint32_t Word;
+} SCU_PRSTEN1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t T16N0EN: 1;
+        uint32_t T16N1EN: 1;
+        uint32_t T16N2EN: 1;
+        uint32_t T16N3EN: 1;
+        uint32_t RESERVED0: 4;
+        uint32_t T32N0EN: 1;
+        uint32_t RESERVED1: 23;
+    };
+    uint32_t Word;
+} SCU_TIMEREN_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t T16N0DIS: 1;
+        uint32_t T16N1DIS: 1;
+        uint32_t T16N2DIS: 1;
+        uint32_t T16N3DIS: 1;
+        uint32_t RESERVED0: 4;
+        uint32_t T32N0DIS: 1;
+        uint32_t RESERVED1: 23;
+    };
+    uint32_t Word;
+} SCU_TIMERDIS_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t EN: 1;
+        uint32_t RESERVED0: 31;
+    };
+    uint32_t Word;
+} SCU_TBLREMAPEN_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TBLOFF: 32;
+    };
+    uint32_t Word;
+} SCU_TBLOFF_Typedef;
+
+typedef struct
+{
+    __IO SCU_PROT_Typedef PROT;
+    __IO SCU_NMICON_Typedef NMICON;
+    __IO SCU_PWRC_Typedef PWRC;
+    __IO SCU_FAULTFLAG_Typedef FAULTFLAG;
+    __IO SCU_WAKEUPTIME_Typedef WAKEUPTIME;
+    __IO SCU_MRSTN_SOFT_Typedef MRSTN_SOFT;
+    __IO SCU_DBGHALT_Typedef DBGHALT;
+    uint32_t RESERVED0 ;
+    __IO SCU_FLASHWAIT_Typedef FLASHWAIT;
+    __IO SCU_SOFTCFG_Typedef SOFTCFG;
+    __IO SCU_LVDCON_Typedef LVDCON;
+    __IO SCU_CCM_Typedef CCM;
+    __IO SCU_PLLLKCON_Typedef PLLLKCON;
+    uint32_t RESERVED1[3] ;
+    __IO SCU_SCLKEN0_Typedef SCLKEN0;
+    __IO SCU_SCLKEN1_Typedef SCLKEN1;
+    __IO SCU_PCLKEN0_Typedef PCLKEN0;
+    __IO SCU_PCLKEN1_Typedef PCLKEN1;
+    __IO SCU_PRSTEN0_Typedef PRSTEN0;
+    __IO SCU_PRSTEN1_Typedef PRSTEN1;
+    __O SCU_TIMEREN_Typedef TIMEREN;
+    __IO SCU_TIMERDIS_Typedef TIMERDIS;
+    __IO SCU_TBLREMAPEN_Typedef TBLREMAPEN;
+    __IO SCU_TBLOFF_Typedef TBLOFF;
+} SCU_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t UL: 32;
+    };
+    uint32_t Word;
+} CRC_UL_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t EN: 1;
+        uint32_t RST: 1;
+        uint32_t HS: 1;
+        uint32_t DS: 1;
+        uint32_t REQ: 1;
+        uint32_t ACK: 1;
+        uint32_t RESERVED0: 2;
+        uint32_t MOD: 2;
+        uint32_t BYTE: 2;
+        uint32_t REFIN: 1;
+        uint32_t REFOUT: 1;
+        uint32_t XOROUT: 1;
+        uint32_t RESERVED1: 17;
+    };
+    uint32_t Word;
+} CRC_CON_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TRIG: 32;
+    };
+    uint32_t Word;
+} CRC_TRIG_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t ADDR: 17;
+        uint32_t RESERVED0: 3;
+        uint32_t IFREN: 1;
+        uint32_t RESERVED1: 11;
+    };
+    uint32_t Word;
+} CRC_ADDR_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t CRC_SIZE: 15;
+        uint32_t RESERVED0: 17;
+    };
+    uint32_t Word;
+} CRC_SIZE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t DI: 32;
+    };
+    uint32_t Word;
+} CRC_DI_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t DO: 32;
+    };
+    uint32_t Word;
+} CRC_DO_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t BUSY: 1;
+        uint32_t RSTF: 1;
+        uint32_t EMPTY_ERR: 1;
+        uint32_t RESERVED0: 29;
+    };
+    uint32_t Word;
+} CRC_STA_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t FADR: 15;
+        uint32_t RESERVED0: 5;
+        uint32_t IFREN: 1;
+        uint32_t RESERVED1: 11;
+    };
+    uint32_t Word;
+} CRC_FA_Typedef;
+
+typedef struct
+{
+    __IO CRC_UL_Typedef UL;
+    __IO CRC_CON_Typedef CON;
+    __IO CRC_TRIG_Typedef TRIG;
+    __IO CRC_ADDR_Typedef ADDR;
+    __IO CRC_SIZE_Typedef SIZE;
+    __IO CRC_DI_Typedef DI;
+    __I CRC_DO_Typedef DO;
+    __IO CRC_STA_Typedef STA;
+    __I CRC_FA_Typedef FA;
+} CRC_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PORT_0: 1;
+        uint32_t PORT_1: 1;
+        uint32_t PORT_2: 1;
+        uint32_t PORT_3: 1;
+        uint32_t PORT_4: 1;
+        uint32_t PORT_5: 1;
+        uint32_t PORT_6: 1;
+        uint32_t PORT_7: 1;
+        uint32_t PORT_8: 1;
+        uint32_t PORT_9: 1;
+        uint32_t PORT_10: 1;
+        uint32_t PORT_11: 1;
+        uint32_t PORT_12: 1;
+        uint32_t PORT_13: 1;
+        uint32_t PORT_14: 1;
+        uint32_t PORT_15: 1;
+        uint32_t PORT_16: 1;
+        uint32_t PORT_17: 1;
+        uint32_t PORT_18: 1;
+        uint32_t PORT_19: 1;
+        uint32_t PORT_20: 1;
+        uint32_t PORT_21: 1;
+        uint32_t PORT_22: 1;
+        uint32_t PORT_23: 1;
+        uint32_t PORT_24: 1;
+        uint32_t PORT_25: 1;
+        uint32_t PORT_26: 1;
+        uint32_t PORT_27: 1;
+        uint32_t PORT_28: 1;
+        uint32_t PORT_29: 1;
+        uint32_t PORT_30: 1;
+        uint32_t PORT_31: 1;
+    };
+    uint32_t Word;
+} GPIO_PAPORT_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t DATA_0: 1;
+        uint32_t DATA_1: 1;
+        uint32_t DATA_2: 1;
+        uint32_t DATA_3: 1;
+        uint32_t DATA_4: 1;
+        uint32_t DATA_5: 1;
+        uint32_t DATA_6: 1;
+        uint32_t DATA_7: 1;
+        uint32_t DATA_8: 1;
+        uint32_t DATA_9: 1;
+        uint32_t DATA_10: 1;
+        uint32_t DATA_11: 1;
+        uint32_t DATA_12: 1;
+        uint32_t DATA_13: 1;
+        uint32_t DATA_14: 1;
+        uint32_t DATA_15: 1;
+        uint32_t DATA_16: 1;
+        uint32_t DATA_17: 1;
+        uint32_t DATA_18: 1;
+        uint32_t DATA_19: 1;
+        uint32_t DATA_20: 1;
+        uint32_t DATA_21: 1;
+        uint32_t DATA_22: 1;
+        uint32_t DATA_23: 1;
+        uint32_t DATA_24: 1;
+        uint32_t DATA_25: 1;
+        uint32_t DATA_26: 1;
+        uint32_t DATA_27: 1;
+        uint32_t DATA_28: 1;
+        uint32_t DATA_29: 1;
+        uint32_t DATA_30: 1;
+        uint32_t DATA_31: 1;
+    };
+    uint32_t Word;
+} GPIO_PADATA_Typedef;
+
+typedef union
+{
+    uint32_t Word;
+} GPIO_PADATABSR_Typedef;
+
+typedef union
+{
+    uint32_t Word;
+} GPIO_PADATABCR_Typedef;
+
+typedef union
+{
+    uint32_t Word;
+} GPIO_PADATABRR_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t DIR_0: 1;
+        uint32_t DIR_1: 1;
+        uint32_t DIR_2: 1;
+        uint32_t DIR_3: 1;
+        uint32_t DIR_4: 1;
+        uint32_t DIR_5: 1;
+        uint32_t DIR_6: 1;
+        uint32_t DIR_7: 1;
+        uint32_t DIR_8: 1;
+        uint32_t DIR_9: 1;
+        uint32_t DIR_10: 1;
+        uint32_t DIR_11: 1;
+        uint32_t DIR_12: 1;
+        uint32_t DIR_13: 1;
+        uint32_t DIR_14: 1;
+        uint32_t DIR_15: 1;
+        uint32_t DIR_16: 1;
+        uint32_t DIR_17: 1;
+        uint32_t DIR_18: 1;
+        uint32_t DIR_19: 1;
+        uint32_t DIR_20: 1;
+        uint32_t DIR_21: 1;
+        uint32_t DIR_22: 1;
+        uint32_t DIR_23: 1;
+        uint32_t DIR_24: 1;
+        uint32_t DIR_25: 1;
+        uint32_t DIR_26: 1;
+        uint32_t DIR_27: 1;
+        uint32_t DIR_28: 1;
+        uint32_t DIR_29: 1;
+        uint32_t DIR_30: 1;
+        uint32_t DIR_31: 1;
+    };
+    uint32_t Word;
+} GPIO_PADIR_Typedef;
+
+typedef union
+{
+    uint32_t Word;
+} GPIO_PADIRBSR_Typedef;
+
+typedef union
+{
+    uint32_t Word;
+} GPIO_PADIRBCR_Typedef;
+
+typedef union
+{
+    uint32_t Word;
+} GPIO_PADIRBRR_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PA0: 2;
+        uint32_t RESERVED0: 2;
+        uint32_t PA1: 2;
+        uint32_t RESERVED1: 2;
+        uint32_t PA2: 2;
+        uint32_t RESERVED2: 2;
+        uint32_t PA3: 2;
+        uint32_t RESERVED3: 2;
+        uint32_t PA4: 2;
+        uint32_t RESERVED4: 2;
+        uint32_t PA5: 2;
+        uint32_t RESERVED5: 2;
+        uint32_t PA6: 2;
+        uint32_t RESERVED6: 2;
+        uint32_t PA7: 2;
+        uint32_t RESERVED7: 2;
+    };
+    uint32_t Word;
+} GPIO_PAFUNC0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PA8: 2;
+        uint32_t RESERVED0: 2;
+        uint32_t PA9: 2;
+        uint32_t RESERVED1: 2;
+        uint32_t PA10: 2;
+        uint32_t RESERVED2: 2;
+        uint32_t PA11: 2;
+        uint32_t RESERVED3: 2;
+        uint32_t PA12: 2;
+        uint32_t RESERVED4: 2;
+        uint32_t PA13: 2;
+        uint32_t RESERVED5: 2;
+        uint32_t PA14: 2;
+        uint32_t RESERVED6: 2;
+        uint32_t PA15: 2;
+        uint32_t RESERVED7: 2;
+    };
+    uint32_t Word;
+} GPIO_PAFUNC1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PA16: 2;
+        uint32_t RESERVED0: 2;
+        uint32_t PA17: 2;
+        uint32_t RESERVED1: 2;
+        uint32_t PA18: 2;
+        uint32_t RESERVED2: 2;
+        uint32_t PA19: 2;
+        uint32_t RESERVED3: 2;
+        uint32_t PA20: 2;
+        uint32_t RESERVED4: 2;
+        uint32_t PA21: 2;
+        uint32_t RESERVED5: 2;
+        uint32_t PA22: 2;
+        uint32_t RESERVED6: 2;
+        uint32_t PA23: 2;
+        uint32_t RESERVED7: 2;
+    };
+    uint32_t Word;
+} GPIO_PAFUNC2_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PA24: 2;
+        uint32_t RESERVED0: 2;
+        uint32_t PA25: 2;
+        uint32_t RESERVED1: 2;
+        uint32_t PA26: 2;
+        uint32_t RESERVED2: 2;
+        uint32_t PA27: 2;
+        uint32_t RESERVED3: 2;
+        uint32_t PA28: 2;
+        uint32_t RESERVED4: 2;
+        uint32_t PA29: 2;
+        uint32_t RESERVED5: 2;
+        uint32_t PA30: 2;
+        uint32_t RESERVED6: 2;
+        uint32_t PA31: 2;
+        uint32_t RESERVED7: 2;
+    };
+    uint32_t Word;
+} GPIO_PAFUNC3_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t INEB_0: 1;
+        uint32_t INEB_1: 1;
+        uint32_t INEB_2: 1;
+        uint32_t INEB_3: 1;
+        uint32_t INEB_4: 1;
+        uint32_t INEB_5: 1;
+        uint32_t INEB_6: 1;
+        uint32_t INEB_7: 1;
+        uint32_t INEB_8: 1;
+        uint32_t INEB_9: 1;
+        uint32_t INEB_10: 1;
+        uint32_t INEB_11: 1;
+        uint32_t INEB_12: 1;
+        uint32_t INEB_13: 1;
+        uint32_t INEB_14: 1;
+        uint32_t INEB_15: 1;
+        uint32_t INEB_16: 1;
+        uint32_t INEB_17: 1;
+        uint32_t INEB_18: 1;
+        uint32_t INEB_19: 1;
+        uint32_t INEB_20: 1;
+        uint32_t INEB_21: 1;
+        uint32_t INEB_22: 1;
+        uint32_t INEB_23: 1;
+        uint32_t INEB_24: 1;
+        uint32_t INEB_25: 1;
+        uint32_t INEB_26: 1;
+        uint32_t INEB_27: 1;
+        uint32_t INEB_28: 1;
+        uint32_t INEB_29: 1;
+        uint32_t INEB_30: 1;
+        uint32_t INEB_31: 1;
+    };
+    uint32_t Word;
+} GPIO_PAINEB_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t ODE_0: 1;
+        uint32_t ODE_1: 1;
+        uint32_t ODE_2: 1;
+        uint32_t ODE_3: 1;
+        uint32_t ODE_4: 1;
+        uint32_t ODE_5: 1;
+        uint32_t ODE_6: 1;
+        uint32_t ODE_7: 1;
+        uint32_t ODE_8: 1;
+        uint32_t ODE_9: 1;
+        uint32_t ODE_10: 1;
+        uint32_t ODE_11: 1;
+        uint32_t ODE_12: 1;
+        uint32_t ODE_13: 1;
+        uint32_t ODE_14: 1;
+        uint32_t ODE_15: 1;
+        uint32_t ODE_16: 1;
+        uint32_t ODE_17: 1;
+        uint32_t ODE_18: 1;
+        uint32_t ODE_19: 1;
+        uint32_t ODE_20: 1;
+        uint32_t ODE_21: 1;
+        uint32_t ODE_22: 1;
+        uint32_t ODE_23: 1;
+        uint32_t ODE_24: 1;
+        uint32_t ODE_25: 1;
+        uint32_t ODE_26: 1;
+        uint32_t ODE_27: 1;
+        uint32_t ODE_28: 1;
+        uint32_t ODE_29: 1;
+        uint32_t ODE_30: 1;
+        uint32_t ODE_31: 1;
+    };
+    uint32_t Word;
+} GPIO_PAODE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PUE_0: 1;
+        uint32_t PUE_1: 1;
+        uint32_t PUE_2: 1;
+        uint32_t PUE_3: 1;
+        uint32_t PUE_4: 1;
+        uint32_t PUE_5: 1;
+        uint32_t PUE_6: 1;
+        uint32_t PUE_7: 1;
+        uint32_t PUE_8: 1;
+        uint32_t PUE_9: 1;
+        uint32_t PUE_10: 1;
+        uint32_t PUE_11: 1;
+        uint32_t PUE_12: 1;
+        uint32_t PUE_13: 1;
+        uint32_t PUE_14: 1;
+        uint32_t PUE_15: 1;
+        uint32_t PUE_16: 1;
+        uint32_t PUE_17: 1;
+        uint32_t PUE_18: 1;
+        uint32_t PUE_19: 1;
+        uint32_t PUE_20: 1;
+        uint32_t PUE_21: 1;
+        uint32_t PUE_22: 1;
+        uint32_t PUE_23: 1;
+        uint32_t PUE_24: 1;
+        uint32_t PUE_25: 1;
+        uint32_t PUE_26: 1;
+        uint32_t PUE_27: 1;
+        uint32_t PUE_28: 1;
+        uint32_t PUE_29: 1;
+        uint32_t PUE_30: 1;
+        uint32_t PUE_31: 1;
+    };
+    uint32_t Word;
+} GPIO_PAPUE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PDE_0: 1;
+        uint32_t PDE_1: 1;
+        uint32_t PDE_2: 1;
+        uint32_t PDE_3: 1;
+        uint32_t PDE_4: 1;
+        uint32_t PDE_5: 1;
+        uint32_t PDE_6: 1;
+        uint32_t PDE_7: 1;
+        uint32_t PDE_8: 1;
+        uint32_t PDE_9: 1;
+        uint32_t PDE_10: 1;
+        uint32_t PDE_11: 1;
+        uint32_t PDE_12: 1;
+        uint32_t PDE_13: 1;
+        uint32_t PDE_14: 1;
+        uint32_t PDE_15: 1;
+        uint32_t PDE_16: 1;
+        uint32_t PDE_17: 1;
+        uint32_t PDE_18: 1;
+        uint32_t PDE_19: 1;
+        uint32_t PDE_20: 1;
+        uint32_t PDE_21: 1;
+        uint32_t PDE_22: 1;
+        uint32_t PDE_23: 1;
+        uint32_t PDE_24: 1;
+        uint32_t PDE_25: 1;
+        uint32_t PDE_26: 1;
+        uint32_t PDE_27: 1;
+        uint32_t PDE_28: 1;
+        uint32_t PDE_29: 1;
+        uint32_t PDE_30: 1;
+        uint32_t PDE_31: 1;
+    };
+    uint32_t Word;
+} GPIO_PAPDE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t DS_0: 1;
+        uint32_t DS_1: 1;
+        uint32_t DS_2: 1;
+        uint32_t DS_3: 1;
+        uint32_t DS_4: 1;
+        uint32_t DS_5: 1;
+        uint32_t DS_6: 1;
+        uint32_t DS_7: 1;
+        uint32_t DS_8: 1;
+        uint32_t DS_9: 1;
+        uint32_t DS_10: 1;
+        uint32_t DS_11: 1;
+        uint32_t DS_12: 1;
+        uint32_t DS_13: 1;
+        uint32_t DS_14: 1;
+        uint32_t DS_15: 1;
+        uint32_t DS_16: 1;
+        uint32_t DS_17: 1;
+        uint32_t DS_18: 1;
+        uint32_t DS_19: 1;
+        uint32_t DS_20: 1;
+        uint32_t DS_21: 1;
+        uint32_t DS_22: 1;
+        uint32_t DS_23: 1;
+        uint32_t DS_24: 1;
+        uint32_t DS_25: 1;
+        uint32_t DS_26: 1;
+        uint32_t DS_27: 1;
+        uint32_t DS_28: 1;
+        uint32_t DS_29: 1;
+        uint32_t DS_30: 1;
+        uint32_t DS_31: 1;
+    };
+    uint32_t Word;
+} GPIO_PADS_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PORT_0: 1;
+        uint32_t PORT_1: 1;
+        uint32_t PORT_2: 1;
+        uint32_t PORT_3: 1;
+        uint32_t PORT_4: 1;
+        uint32_t PORT_5: 1;
+        uint32_t PORT_6: 1;
+        uint32_t PORT_7: 1;
+        uint32_t PORT_8: 1;
+        uint32_t PORT_9: 1;
+        uint32_t PORT_10: 1;
+        uint32_t PORT_11: 1;
+        uint32_t PORT_12: 1;
+        uint32_t PORT_13: 1;
+        uint32_t RESERVED0: 18;
+    };
+    uint32_t Word;
+} GPIO_PBPORT_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t DATA_0: 1;
+        uint32_t DATA_1: 1;
+        uint32_t DATA_2: 1;
+        uint32_t DATA_3: 1;
+        uint32_t DATA_4: 1;
+        uint32_t DATA_5: 1;
+        uint32_t DATA_6: 1;
+        uint32_t DATA_7: 1;
+        uint32_t DATA_8: 1;
+        uint32_t DATA_9: 1;
+        uint32_t DATA_10: 1;
+        uint32_t DATA_11: 1;
+        uint32_t DATA_12: 1;
+        uint32_t DATA_13: 1;
+        uint32_t RESERVED0: 18;
+    };
+    uint32_t Word;
+} GPIO_PBDATA_Typedef;
+
+typedef union
+{
+    uint32_t Word;
+} GPIO_PBDATABSR_Typedef;
+
+typedef union
+{
+    uint32_t Word;
+} GPIO_PBDATABCR_Typedef;
+
+typedef union
+{
+    uint32_t Word;
+} GPIO_PBDATABRR_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t DIR_0: 1;
+        uint32_t DIR_1: 1;
+        uint32_t DIR_2: 1;
+        uint32_t DIR_3: 1;
+        uint32_t DIR_4: 1;
+        uint32_t DIR_5: 1;
+        uint32_t DIR_6: 1;
+        uint32_t DIR_7: 1;
+        uint32_t DIR_8: 1;
+        uint32_t DIR_9: 1;
+        uint32_t DIR_10: 1;
+        uint32_t DIR_11: 1;
+        uint32_t DIR_12: 1;
+        uint32_t DIR_13: 1;
+        uint32_t RESERVED0: 18;
+    };
+    uint32_t Word;
+} GPIO_PBDIR_Typedef;
+
+typedef union
+{
+    uint32_t Word;
+} GPIO_PBDIRBSR_Typedef;
+
+typedef union
+{
+    uint32_t Word;
+} GPIO_PBDIRBCR_Typedef;
+
+typedef union
+{
+    uint32_t Word;
+} GPIO_PBDIRBRR_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PB0: 2;
+        uint32_t RESERVED0: 2;
+        uint32_t PB1: 2;
+        uint32_t RESERVED1: 2;
+        uint32_t PB2: 2;
+        uint32_t RESERVED2: 2;
+        uint32_t PB3: 2;
+        uint32_t RESERVED3: 2;
+        uint32_t PB4: 2;
+        uint32_t RESERVED4: 2;
+        uint32_t PB5: 2;
+        uint32_t RESERVED5: 2;
+        uint32_t PB6: 2;
+        uint32_t RESERVED6: 2;
+        uint32_t PB7: 2;
+        uint32_t RESERVED7: 2;
+    };
+    uint32_t Word;
+} GPIO_PBFUNC0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PB8: 2;
+        uint32_t RESERVED0: 2;
+        uint32_t PB9: 2;
+        uint32_t RESERVED1: 2;
+        uint32_t PB10: 2;
+        uint32_t RESERVED2: 2;
+        uint32_t PB11: 2;
+        uint32_t RESERVED3: 2;
+        uint32_t PB12: 2;
+        uint32_t RESERVED4: 2;
+        uint32_t PB13: 2;
+        uint32_t RESERVED5: 10;
+    };
+    uint32_t Word;
+} GPIO_PBFUNC1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t INEB_0: 1;
+        uint32_t INEB_1: 1;
+        uint32_t INEB_2: 1;
+        uint32_t INEB_3: 1;
+        uint32_t INEB_4: 1;
+        uint32_t INEB_5: 1;
+        uint32_t INEB_6: 1;
+        uint32_t INEB_7: 1;
+        uint32_t INEB_8: 1;
+        uint32_t INEB_9: 1;
+        uint32_t INEB_10: 1;
+        uint32_t INEB_11: 1;
+        uint32_t INEB_12: 1;
+        uint32_t INEB_13: 1;
+        uint32_t RESERVED0: 18;
+    };
+    uint32_t Word;
+} GPIO_PBINEB_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t ODE_0: 1;
+        uint32_t ODE_1: 1;
+        uint32_t ODE_2: 1;
+        uint32_t ODE_3: 1;
+        uint32_t ODE_4: 1;
+        uint32_t ODE_5: 1;
+        uint32_t ODE_6: 1;
+        uint32_t ODE_7: 1;
+        uint32_t ODE_8: 1;
+        uint32_t ODE_9: 1;
+        uint32_t ODE_10: 1;
+        uint32_t ODE_11: 1;
+        uint32_t ODE_12: 1;
+        uint32_t ODE_13: 1;
+        uint32_t RESERVED0: 18;
+    };
+    uint32_t Word;
+} GPIO_PBODE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PUEN_0: 1;
+        uint32_t PUEN_1: 1;
+        uint32_t PUEN_2: 1;
+        uint32_t PUEN_3: 1;
+        uint32_t PUEN_4: 1;
+        uint32_t PUEN_5: 1;
+        uint32_t PUEN_6: 1;
+        uint32_t PUEN_7: 1;
+        uint32_t PUEN_8: 1;
+        uint32_t PUEN_9: 1;
+        uint32_t PUEN_10: 1;
+        uint32_t PUEN_11: 1;
+        uint32_t PUEN_12: 1;
+        uint32_t PUEN_13: 1;
+        uint32_t RESERVED0: 18;
+    };
+    uint32_t Word;
+} GPIO_PBPUE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PDEN_0: 1;
+        uint32_t PDEN_1: 1;
+        uint32_t PDEN_2: 1;
+        uint32_t PDEN_3: 1;
+        uint32_t PDEN_4: 1;
+        uint32_t PDEN_5: 1;
+        uint32_t PDEN_6: 1;
+        uint32_t PDEN_7: 1;
+        uint32_t PDEN_8: 1;
+        uint32_t PDEN_9: 1;
+        uint32_t PDEN_10: 1;
+        uint32_t PDEN_11: 1;
+        uint32_t PDEN_12: 1;
+        uint32_t PDEN_13: 1;
+        uint32_t RESERVED0: 18;
+    };
+    uint32_t Word;
+} GPIO_PBPDE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t DS_0: 1;
+        uint32_t DS_1: 1;
+        uint32_t DS_2: 1;
+        uint32_t DS_3: 1;
+        uint32_t DS_4: 1;
+        uint32_t DS_5: 1;
+        uint32_t DS_6: 1;
+        uint32_t DS_7: 1;
+        uint32_t DS_8: 1;
+        uint32_t DS_9: 1;
+        uint32_t DS_10: 1;
+        uint32_t DS_11: 1;
+        uint32_t DS_12: 1;
+        uint32_t DS_13: 1;
+        uint32_t RESERVED0: 18;
+    };
+    uint32_t Word;
+} GPIO_PBDS_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PINTIE: 8;
+        uint32_t PMASK: 8;
+        uint32_t RESERVED0: 16;
+    };
+    uint32_t Word;
+} GPIO_PINTIE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PINTIF_0: 1;
+        uint32_t PINTIF_1: 1;
+        uint32_t PINTIF_2: 1;
+        uint32_t PINTIF_3: 1;
+        uint32_t PINTIF_4: 1;
+        uint32_t PINTIF_5: 1;
+        uint32_t PINTIF_6: 1;
+        uint32_t PINTIF_7: 1;
+        uint32_t RESERVED0: 24;
+    };
+    uint32_t Word;
+} GPIO_PINTIF_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PINT0SEL: 3;
+        uint32_t RESERVED0: 1;
+        uint32_t PINT1SEL: 3;
+        uint32_t RESERVED1: 1;
+        uint32_t PINT2SEL: 3;
+        uint32_t RESERVED2: 1;
+        uint32_t PINT3SEL: 3;
+        uint32_t RESERVED3: 1;
+        uint32_t PINT4SEL: 3;
+        uint32_t RESERVED4: 1;
+        uint32_t PINT5SEL: 3;
+        uint32_t RESERVED5: 1;
+        uint32_t PINT6SEL: 3;
+        uint32_t RESERVED6: 1;
+        uint32_t PINT7SEL: 3;
+        uint32_t RESERVED7: 1;
+    };
+    uint32_t Word;
+} GPIO_PINTSEL_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PINT0CFG: 3;
+        uint32_t RESERVED0: 1;
+        uint32_t PINT1CFG: 3;
+        uint32_t RESERVED1: 1;
+        uint32_t PINT2CFG: 3;
+        uint32_t RESERVED2: 1;
+        uint32_t PINT3CFG: 3;
+        uint32_t RESERVED3: 1;
+        uint32_t PINT4CFG: 3;
+        uint32_t RESERVED4: 1;
+        uint32_t PINT5CFG: 3;
+        uint32_t RESERVED5: 1;
+        uint32_t PINT6CFG: 3;
+        uint32_t RESERVED6: 1;
+        uint32_t PINT7CFG: 3;
+        uint32_t RESERVED7: 1;
+    };
+    uint32_t Word;
+} GPIO_PINTCFG_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t KINTIE: 8;
+        uint32_t KMASK: 8;
+        uint32_t RESERVED0: 16;
+    };
+    uint32_t Word;
+} GPIO_KINTIE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t KINTIF_0: 1;
+        uint32_t KINTIF_1: 1;
+        uint32_t KINTIF_2: 1;
+        uint32_t KINTIF_3: 1;
+        uint32_t KINTIF_4: 1;
+        uint32_t KINTIF_5: 1;
+        uint32_t KINTIF_6: 1;
+        uint32_t KINTIF_7: 1;
+        uint32_t RESERVED0: 24;
+    };
+    uint32_t Word;
+} GPIO_KINTIF_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t KINT0SEL: 3;
+        uint32_t RESERVED0: 1;
+        uint32_t KINT1SEL: 3;
+        uint32_t RESERVED1: 1;
+        uint32_t KINT2SEL: 3;
+        uint32_t RESERVED2: 1;
+        uint32_t KINT3SEL: 3;
+        uint32_t RESERVED3: 1;
+        uint32_t KINT4SEL: 3;
+        uint32_t RESERVED4: 1;
+        uint32_t KINT5SEL: 3;
+        uint32_t RESERVED5: 1;
+        uint32_t KINT6SEL: 3;
+        uint32_t RESERVED6: 1;
+        uint32_t KINT7SEL: 3;
+        uint32_t RESERVED7: 1;
+    };
+    uint32_t Word;
+} GPIO_KINTSEL_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t KINT0CFG: 3;
+        uint32_t RESERVED0: 1;
+        uint32_t KINT1CFG: 3;
+        uint32_t RESERVED1: 1;
+        uint32_t KINT2CFG: 3;
+        uint32_t RESERVED2: 1;
+        uint32_t KINT3CFG: 3;
+        uint32_t RESERVED3: 1;
+        uint32_t KINT4CFG: 3;
+        uint32_t RESERVED4: 1;
+        uint32_t KINT5CFG: 3;
+        uint32_t RESERVED5: 1;
+        uint32_t KINT6CFG: 3;
+        uint32_t RESERVED6: 1;
+        uint32_t KINT7CFG: 3;
+        uint32_t RESERVED7: 1;
+    };
+    uint32_t Word;
+} GPIO_KINTCFG_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t FLT_S_0: 1;
+        uint32_t FLT_S_1: 1;
+        uint32_t FLT_S_2: 1;
+        uint32_t FLT_S_3: 1;
+        uint32_t FLT_S_4: 1;
+        uint32_t FLT_S_5: 1;
+        uint32_t FLT_S_6: 1;
+        uint32_t FLT_S_7: 1;
+        uint32_t RESERVED0: 24;
+    };
+    uint32_t Word;
+} GPIO_IOINTFLTS_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t FLT0_SEL: 4;
+        uint32_t FLT1_SEL: 4;
+        uint32_t FLT2_SEL: 4;
+        uint32_t FLT3_SEL: 4;
+        uint32_t RESERVED0: 16;
+    };
+    uint32_t Word;
+} GPIO_TMRFLTSEL_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TX0PS: 2;
+        uint32_t RESERVED0: 2;
+        uint32_t TX0PLV: 1;
+        uint32_t TX0_S: 2;
+        uint32_t RESERVED1: 1;
+        uint32_t TX1PS: 2;
+        uint32_t RESERVED2: 2;
+        uint32_t TX1PLV: 1;
+        uint32_t TX1_S: 2;
+        uint32_t RESERVED3: 1;
+        uint32_t TX2PS: 2;
+        uint32_t RESERVED4: 2;
+        uint32_t TX2PLV: 1;
+        uint32_t TX2_S: 2;
+        uint32_t RESERVED5: 1;
+        uint32_t TX3PS: 2;
+        uint32_t RESERVED6: 2;
+        uint32_t TX3PLV: 1;
+        uint32_t TX3_S: 2;
+        uint32_t RESERVED7: 1;
+    };
+    uint32_t Word;
+} GPIO_TXPWM_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t BUZEN: 1;
+        uint32_t RESERVED0: 7;
+        uint32_t BUZ_LOAD: 20;
+        uint32_t RESERVED1: 4;
+    };
+    uint32_t Word;
+} GPIO_BUZC_Typedef;
+
+typedef struct
+{
+    __I GPIO_PAPORT_Typedef PAPORT;
+    uint32_t RESERVED0[3] ;
+    __IO GPIO_PADATA_Typedef PADATA;
+    __O GPIO_PADATABSR_Typedef PADATABSR;
+    __O GPIO_PADATABCR_Typedef PADATABCR;
+    __O GPIO_PADATABRR_Typedef PADATABRR;
+    __IO GPIO_PADIR_Typedef PADIR;
+    __O GPIO_PADIRBSR_Typedef PADIRBSR;
+    __O GPIO_PADIRBCR_Typedef PADIRBCR;
+    __O GPIO_PADIRBRR_Typedef PADIRBRR;
+    __IO GPIO_PAFUNC0_Typedef PAFUNC0;
+    __IO GPIO_PAFUNC1_Typedef PAFUNC1;
+    __IO GPIO_PAFUNC2_Typedef PAFUNC2;
+    __IO GPIO_PAFUNC3_Typedef PAFUNC3;
+    __IO GPIO_PAINEB_Typedef PAINEB;
+    __IO GPIO_PAODE_Typedef PAODE;
+    __IO GPIO_PAPUE_Typedef PAPUE;
+    __IO GPIO_PAPDE_Typedef PAPDE;
+    __IO GPIO_PADS_Typedef PADS;
+    uint32_t RESERVED1[11] ;
+    __I GPIO_PBPORT_Typedef PBPORT;
+    uint32_t RESERVED2[3] ;
+    __IO GPIO_PBDATA_Typedef PBDATA;
+    __O GPIO_PBDATABSR_Typedef PBDATABSR;
+    __O GPIO_PBDATABCR_Typedef PBDATABCR;
+    __O GPIO_PBDATABRR_Typedef PBDATABRR;
+    __IO GPIO_PBDIR_Typedef PBDIR;
+    __O GPIO_PBDIRBSR_Typedef PBDIRBSR;
+    __O GPIO_PBDIRBCR_Typedef PBDIRBCR;
+    __O GPIO_PBDIRBRR_Typedef PBDIRBRR;
+    __IO GPIO_PBFUNC0_Typedef PBFUNC0;
+    __IO GPIO_PBFUNC1_Typedef PBFUNC1;
+    uint32_t RESERVED3[2] ;
+    __IO GPIO_PBINEB_Typedef PBINEB;
+    __IO GPIO_PBODE_Typedef PBODE;
+    __IO GPIO_PBPUE_Typedef PBPUE;
+    __IO GPIO_PBPDE_Typedef PBPDE;
+    __IO GPIO_PBDS_Typedef PBDS;
+    uint32_t RESERVED4[139] ;
+    __IO GPIO_PINTIE_Typedef PINTIE;
+    __IO GPIO_PINTIF_Typedef PINTIF;
+    __IO GPIO_PINTSEL_Typedef PINTSEL;
+    __IO GPIO_PINTCFG_Typedef PINTCFG;
+    __IO GPIO_KINTIE_Typedef KINTIE;
+    __IO GPIO_KINTIF_Typedef KINTIF;
+    __IO GPIO_KINTSEL_Typedef KINTSEL;
+    __IO GPIO_KINTCFG_Typedef KINTCFG;
+    uint32_t RESERVED5[4] ;
+    __IO GPIO_IOINTFLTS_Typedef IOINTFLTS;
+    uint32_t RESERVED6[3] ;
+    __IO GPIO_TMRFLTSEL_Typedef TMRFLTSEL;
+    uint32_t RESERVED7[15] ;
+    __IO GPIO_TXPWM_Typedef TXPWM;
+    uint32_t RESERVED8[3] ;
+    __IO GPIO_BUZC_Typedef BUZC;
+} GPIO_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t EN: 1;
+        uint32_t RST: 1;
+        uint32_t RESERVED0: 2;
+        uint32_t FLASH_REQ: 1;
+        uint32_t FLASH_ACK: 1;
+        uint32_t RESERVED1: 1;
+        uint32_t FLASH_FAIL: 1;
+        uint32_t FEWE: 1;
+        uint32_t SEWE: 1;
+        uint32_t RESERVED2: 22;
+    };
+    uint32_t Word;
+} IAP_CON_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t RESERVED0: 2;
+        uint32_t IAPCA: 8;
+        uint32_t IAPPA: 7;
+        uint32_t RESERVED1: 3;
+        uint32_t IFREN: 1;
+        uint32_t RESERVED2: 11;
+    };
+    uint32_t Word;
+} IAP_ADDR_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t DATA: 32;
+    };
+    uint32_t Word;
+} IAP_DATA_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TRIG: 32;
+    };
+    uint32_t Word;
+} IAP_TRIG_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t UL: 32;
+    };
+    uint32_t Word;
+} IAP_UL_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t BSY: 1;
+        uint32_t PERASE_END: 1;
+        uint32_t PROG_END: 1;
+        uint32_t TIMEOUT_ERR: 1;
+        uint32_t OP_ERR: 1;
+        uint32_t MERASE_END: 1;
+        uint32_t UERASE_END: 1;
+        uint32_t RESERVED0: 25;
+    };
+    uint32_t Word;
+} IAP_STA_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t IAP_WPROT: 32;
+    };
+    uint32_t Word;
+} IAP_WPROT0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t IAP_WPROT: 32;
+    };
+    uint32_t Word;
+} IAP_WPROT1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t IAP_WPROT: 1;
+        uint32_t RESERVED0: 31;
+    };
+    uint32_t Word;
+} IAP_WPROT2_Typedef;
+
+typedef struct
+{
+    __IO IAP_CON_Typedef CON;
+    __IO IAP_ADDR_Typedef ADDR;
+    __IO IAP_DATA_Typedef DATA;
+    __IO IAP_TRIG_Typedef TRIG;
+    __IO IAP_UL_Typedef UL;
+    __IO IAP_STA_Typedef STA;
+    __IO IAP_WPROT0_Typedef WPROT0;
+    __IO IAP_WPROT1_Typedef WPROT1;
+    __IO IAP_WPROT2_Typedef WPROT2;
+} IAP_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t DR: 12;
+        uint32_t RESERVED0: 20;
+    };
+    uint32_t Word;
+} ADC_DR_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t EN: 1;
+        uint32_t TRIG: 1;
+        uint32_t ACP_EN: 1;
+        uint32_t RESERVED0: 1;
+        uint32_t BIT_SEL: 2;
+        uint32_t RESERVED1: 26;
+    };
+    uint32_t Word;
+} ADC_CON0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t CLKDIV: 3;
+        uint32_t RESERVED0: 1;
+        uint32_t CLKS: 2;
+        uint32_t RESERVED1: 2;
+        uint32_t VREFP: 2;
+        uint32_t VREFN: 1;
+        uint32_t VRBUF_EN: 1;
+        uint32_t SMPS: 1;
+        uint32_t SMPON: 1;
+        uint32_t HSEN: 1;
+        uint32_t RESERVED2: 1;
+        uint32_t ST: 5;
+        uint32_t RESERVED3: 3;
+        uint32_t VCMBUF_EN: 1;
+        uint32_t VCMBUF_HS: 1;
+        uint32_t RESERVED4: 6;
+    };
+    uint32_t Word;
+} ADC_CON1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t CHS: 5;
+        uint32_t RESERVED0: 3;
+        uint32_t VDD5_FLAG_EN: 1;
+        uint32_t RESERVED1: 23;
+    };
+    uint32_t Word;
+} ADC_CHS_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t IE: 1;
+        uint32_t ACPMINIE: 1;
+        uint32_t ACPMAXIE: 1;
+        uint32_t ACPOVIE: 1;
+        uint32_t RESERVED0: 28;
+    };
+    uint32_t Word;
+} ADC_IE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t IF: 1;
+        uint32_t ACPMINIF: 1;
+        uint32_t ACPMAXIF: 1;
+        uint32_t ACPOVIF: 1;
+        uint32_t RESERVED0: 28;
+    };
+    uint32_t Word;
+} ADC_IF_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t OVFL_TIME: 12;
+        uint32_t RESERVED0: 4;
+        uint32_t TIMES: 2;
+        uint32_t RESERVED1: 2;
+        uint32_t CLKS: 1;
+        uint32_t RESERVED2: 11;
+    };
+    uint32_t Word;
+} ADC_ACPC_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t CMP_MIN: 12;
+        uint32_t RESERVED0: 4;
+        uint32_t CMP_MAX: 12;
+        uint32_t RESERVED1: 4;
+    };
+    uint32_t Word;
+} ADC_ACPCMP_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MEAN_DATA: 12;
+        uint32_t RESERVED0: 20;
+    };
+    uint32_t Word;
+} ADC_ACPMEAN_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t VREF_EN: 1;
+        uint32_t RESERVED2: 1;
+        uint32_t IREF_EN: 1;
+        uint32_t RESERVED0: 1;
+        uint32_t VDET_EN: 1;
+        uint32_t VDET_SEL: 1;
+        uint32_t RESERVED1: 26;
+    };
+    uint32_t Word;
+} ADC_VREFCON_Typedef;
+
+typedef struct
+{
+    __I ADC_DR_Typedef DR;
+    __IO ADC_CON0_Typedef CON0;
+    __IO ADC_CON1_Typedef CON1;
+    __IO ADC_CHS_Typedef CHS;
+    __IO ADC_IE_Typedef IE;
+    __IO ADC_IF_Typedef IF;
+    uint32_t RESERVED0[4] ;
+    __IO ADC_ACPC_Typedef ACPC;
+    uint32_t RESERVED1 ;
+    __IO ADC_ACPCMP_Typedef ACPCMP;
+    __I ADC_ACPMEAN_Typedef ACPMEAN;
+    uint32_t RESERVED2[2] ;
+    __IO ADC_VREFCON_Typedef VREFCON;
+} ADC_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TMUP: 1;
+        uint32_t TMWR: 1;
+        uint32_t HSWI: 1;
+        uint32_t RESERVED0: 1;
+        uint32_t CLKS: 2;
+        uint32_t XST: 1;
+        uint32_t PON: 1;
+        uint32_t RESERVED1: 24;
+    };
+    uint32_t Word;
+} RTC_CON_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t CALF: 8;
+        uint32_t DEV: 1;
+        uint32_t COCR: 3;
+        uint32_t CLKC: 1;
+        uint32_t RESERVED0: 19;
+    };
+    uint32_t Word;
+} RTC_CAL_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t WM: 7;
+        uint32_t RESERVED0: 1;
+        uint32_t WH: 6;
+        uint32_t RESERVED1: 2;
+        uint32_t WW: 7;
+        uint32_t RESERVED2: 9;
+    };
+    uint32_t Word;
+} RTC_WA_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t DM: 7;
+        uint32_t RESERVED0: 1;
+        uint32_t DH: 6;
+        uint32_t RESERVED1: 18;
+    };
+    uint32_t Word;
+} RTC_DA_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t SEC: 7;
+        uint32_t RESERVED0: 1;
+        uint32_t MIN: 7;
+        uint32_t RESERVED1: 1;
+        uint32_t HOUR: 6;
+        uint32_t RESERVED2: 10;
+    };
+    uint32_t Word;
+} RTC_HMS_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t WEEK: 7;
+        uint32_t RESERVED0: 1;
+        uint32_t DAY: 6;
+        uint32_t RESERVED1: 2;
+        uint32_t MON: 5;
+        uint32_t RESERVED2: 3;
+        uint32_t YEAR: 8;
+    };
+    uint32_t Word;
+} RTC_YMDW_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t SCDIE: 1;
+        uint32_t MINIE: 1;
+        uint32_t HORIE: 1;
+        uint32_t DAYIE: 1;
+        uint32_t MONIE: 1;
+        uint32_t RESERVED0: 3;
+        uint32_t DALE: 1;
+        uint32_t WALE: 1;
+        uint32_t RESERVED1: 22;
+    };
+    uint32_t Word;
+} RTC_IE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t SCDIF: 1;
+        uint32_t MINIF: 1;
+        uint32_t HORIF: 1;
+        uint32_t DAYIF: 1;
+        uint32_t MONIF: 1;
+        uint32_t RESERVED0: 3;
+        uint32_t DAFG: 1;
+        uint32_t WAFG: 1;
+        uint32_t RESERVED1: 22;
+    };
+    uint32_t Word;
+} RTC_IF_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t WP: 32;
+    };
+    uint32_t Word;
+} RTC_WP_Typedef;
+
+typedef struct
+{
+    __IO RTC_CON_Typedef CON;
+    __IO RTC_CAL_Typedef CAL;
+    __IO RTC_WA_Typedef WA;
+    __IO RTC_DA_Typedef DA;
+    __IO RTC_HMS_Typedef HMS;
+    __IO RTC_YMDW_Typedef YMDW;
+    __IO RTC_IE_Typedef IE;
+    __IO RTC_IF_Typedef IF;
+    __IO RTC_WP_Typedef WP;
+} RTC_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t LOAD: 32;
+    };
+    uint32_t Word;
+} IWDT_LOAD_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t VALUE: 32;
+    };
+    uint32_t Word;
+} IWDT_VALUE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t EN: 1;
+        uint32_t IE: 1;
+        uint32_t RSTEN: 1;
+        uint32_t CLKS: 1;
+        uint32_t RESERVED0: 28;
+    };
+    uint32_t Word;
+} IWDT_CON_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t INTCLR: 32;
+    };
+    uint32_t Word;
+} IWDT_INTCLR_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t WDTIF: 1;
+        uint32_t RESERVED0: 31;
+    };
+    uint32_t Word;
+} IWDT_RIS_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t LOCK: 1;
+        uint32_t RESERVED0: 31;
+    };
+    uint32_t Word;
+} IWDT_LOCK_Typedef;
+
+typedef struct
+{
+    __O IWDT_LOAD_Typedef LOAD;
+    __I IWDT_VALUE_Typedef VALUE;
+    __IO IWDT_CON_Typedef CON;
+    __O IWDT_INTCLR_Typedef INTCLR;
+    __I IWDT_RIS_Typedef RIS;
+    uint32_t RESERVED0[59] ;
+    __IO IWDT_LOCK_Typedef LOCK;
+} IWDT_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t LOAD: 32;
+    };
+    uint32_t Word;
+} WWDT_LOAD_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t VALUE: 32;
+    };
+    uint32_t Word;
+} WWDT_VALUE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t EN: 1;
+        uint32_t IE: 1;
+        uint32_t RSTEN: 1;
+        uint32_t CLKS: 1;
+        uint32_t WWDTWIN: 2;
+        uint32_t RESERVED0: 26;
+    };
+    uint32_t Word;
+} WWDT_CON_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t INTCLR: 32;
+    };
+    uint32_t Word;
+} WWDT_INTCLR_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t WWDTIF: 1;
+        uint32_t RESERVED0: 31;
+    };
+    uint32_t Word;
+} WWDT_RIS_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t LOCK: 1;
+        uint32_t RESERVED0: 31;
+    };
+    uint32_t Word;
+} WWDT_LOCK_Typedef;
+
+typedef struct
+{
+    __O WWDT_LOAD_Typedef LOAD;
+    __I WWDT_VALUE_Typedef VALUE;
+    __IO WWDT_CON_Typedef CON;
+    __O WWDT_INTCLR_Typedef INTCLR;
+    __I WWDT_RIS_Typedef RIS;
+    uint32_t RESERVED0[59] ;
+    __IO WWDT_LOCK_Typedef LOCK;
+} WWDT_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t CNT: 16;
+        uint32_t RESERVED0: 16;
+    };
+    uint32_t Word;
+} T16N_CNT_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PRECNT: 8;
+        uint32_t RESERVED0: 24;
+    };
+    uint32_t Word;
+} T16N_PRECNT_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PREMAT: 8;
+        uint32_t RESERVED0: 24;
+    };
+    uint32_t Word;
+} T16N_PREMAT_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t EN: 1;
+        uint32_t CS: 2;
+        uint32_t SYNC: 1;
+        uint32_t EDGE: 2;
+        uint32_t MOD: 2;
+        uint32_t MAT0S: 2;
+        uint32_t MAT1S: 2;
+        uint32_t MAT2S: 2;
+        uint32_t MAT3S: 2;
+        uint32_t ASYWEN: 1;
+        uint32_t RESERVED0: 15;
+    };
+    uint32_t Word;
+} T16N_CON0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t CAPPE: 1;
+        uint32_t CAPNE: 1;
+        uint32_t CAPIS0: 1;
+        uint32_t CAPIS1: 1;
+        uint32_t CAPT: 4;
+        uint32_t CAPL0: 1;
+        uint32_t CAPL1: 1;
+        uint32_t RESERVED0: 22;
+    };
+    uint32_t Word;
+} T16N_CON1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MOE0: 1;
+        uint32_t MOE1: 1;
+        uint32_t POL0: 1;
+        uint32_t POL1: 1;
+        uint32_t MOM0: 2;
+        uint32_t MOM1: 2;
+        uint32_t MOM2: 2;
+        uint32_t MOM3: 2;
+        uint32_t PBKEN: 1;
+        uint32_t PBKPS: 1;
+        uint32_t PBKF: 1;
+        uint32_t RESERVED0: 1;
+        uint32_t PBKS: 3;
+        uint32_t RESERVED1: 1;
+        uint32_t PBKL0: 1;
+        uint32_t PBKL1: 1;
+        uint32_t RESERVED2: 10;
+    };
+    uint32_t Word;
+} T16N_CON2_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT0IE: 1;
+        uint32_t MAT1IE: 1;
+        uint32_t MAT2IE: 1;
+        uint32_t MAT3IE: 1;
+        uint32_t OVIE: 1;
+        uint32_t CAP0IE: 1;
+        uint32_t CAP1IE: 1;
+        uint32_t PBKIE: 1;
+        uint32_t RESERVED0: 24;
+    };
+    uint32_t Word;
+} T16N_IE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT0IF: 1;
+        uint32_t MAT1IF: 1;
+        uint32_t MAT2IF: 1;
+        uint32_t MAT3IF: 1;
+        uint32_t OVIF: 1;
+        uint32_t CAP0IF: 1;
+        uint32_t CAP1IF: 1;
+        uint32_t PBKIF: 1;
+        uint32_t RESERVED0: 24;
+    };
+    uint32_t Word;
+} T16N_IF_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT0TAR: 1;
+        uint32_t MAT1TAR: 1;
+        uint32_t MAT2TAR: 1;
+        uint32_t MAT3TAR: 1;
+        uint32_t OVTAR: 1;
+        uint32_t RESERVED0: 27;
+    };
+    uint32_t Word;
+} T16N_TRG_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT0: 16;
+        uint32_t RESERVED0: 16;
+    };
+    uint32_t Word;
+} T16N_MAT0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT1: 16;
+        uint32_t RESERVED0: 16;
+    };
+    uint32_t Word;
+} T16N_MAT1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT2: 16;
+        uint32_t RESERVED0: 16;
+    };
+    uint32_t Word;
+} T16N_MAT2_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT3: 16;
+        uint32_t RESERVED0: 16;
+    };
+    uint32_t Word;
+} T16N_MAT3_Typedef;
+
+typedef struct
+{
+    __IO T16N_CNT_Typedef CNT;
+    uint32_t RESERVED0;
+    __IO T16N_PRECNT_Typedef PRECNT;
+    __IO T16N_PREMAT_Typedef PREMAT;
+    __IO T16N_CON0_Typedef CON0;
+    __IO T16N_CON1_Typedef CON1;
+    __IO T16N_CON2_Typedef CON2;
+    uint32_t RESERVED1;
+    __IO T16N_IE_Typedef IE;
+    __IO T16N_IF_Typedef IF;
+    __IO T16N_TRG_Typedef TRG;
+    uint32_t RESERVED2;
+    __IO T16N_MAT0_Typedef MAT0;
+    __IO T16N_MAT1_Typedef MAT1;
+    __IO T16N_MAT2_Typedef MAT2;
+    __IO T16N_MAT3_Typedef MAT3;
+} T16N_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t CNT: 32;
+    };
+    uint32_t Word;
+} T32N_CNT_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PRECNT: 8;
+        uint32_t RESERVED0: 24;
+    };
+    uint32_t Word;
+} T32N_PRECNT_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t PREMAT: 8;
+        uint32_t RESERVED0: 24;
+    };
+    uint32_t Word;
+} T32N_PREMAT_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t EN: 1;
+        uint32_t CS: 2;
+        uint32_t SYNC: 1;
+        uint32_t EDGE: 2;
+        uint32_t MOD: 2;
+        uint32_t MAT0S: 2;
+        uint32_t MAT1S: 2;
+        uint32_t MAT2S: 2;
+        uint32_t MAT3S: 2;
+        uint32_t ASYNC_WREN: 1;
+        uint32_t RESERVED0: 15;
+    };
+    uint32_t Word;
+} T32N_CON0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t CAPPE: 1;
+        uint32_t CAPNE: 1;
+        uint32_t CAPIS0: 1;
+        uint32_t CAPIS1: 1;
+        uint32_t CAPT: 4;
+        uint32_t CAPL0: 1;
+        uint32_t CAPL1: 1;
+        uint32_t RESERVED0: 22;
+    };
+    uint32_t Word;
+} T32N_CON1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MOE0: 1;
+        uint32_t MOE1: 1;
+        uint32_t POL0: 1;
+        uint32_t POL1: 1;
+        uint32_t MOM0: 2;
+        uint32_t MOM1: 2;
+        uint32_t MOM2: 2;
+        uint32_t MOM3: 2;
+        uint32_t RESERVED0: 20;
+    };
+    uint32_t Word;
+} T32N_CON2_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT0IE: 1;
+        uint32_t MAT1IE: 1;
+        uint32_t MAT2IE: 1;
+        uint32_t MAT3IE: 1;
+        uint32_t OVIE: 1;
+        uint32_t CAP0IE: 1;
+        uint32_t CAP1IE: 1;
+        uint32_t RESERVED0: 25;
+    };
+    uint32_t Word;
+} T32N_IE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT0IF: 1;
+        uint32_t MAT1IF: 1;
+        uint32_t MAT2IF: 1;
+        uint32_t MAT3IF: 1;
+        uint32_t OVIF: 1;
+        uint32_t CAP0IF: 1;
+        uint32_t CAP1IF: 1;
+        uint32_t RESERVED0: 25;
+    };
+    uint32_t Word;
+} T32N_IF_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT0TAR: 1;
+        uint32_t MAT1TAR: 1;
+        uint32_t MAT2TAR: 1;
+        uint32_t MAT3TAR: 1;
+        uint32_t OVTAR: 1;
+        uint32_t RESERVED0: 27;
+    };
+    uint32_t Word;
+} T32N_TRG_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT0: 32;
+    };
+    uint32_t Word;
+} T32N_MAT0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT1: 32;
+    };
+    uint32_t Word;
+} T32N_MAT1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT2: 32;
+    };
+    uint32_t Word;
+} T32N_MAT2_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MAT3: 32;
+    };
+    uint32_t Word;
+} T32N_MAT3_Typedef;
+
+typedef struct
+{
+    __IO T32N_CNT_Typedef CNT;
+    uint32_t RESERVED0;
+    __IO T32N_PRECNT_Typedef PRECNT;
+    __IO T32N_PREMAT_Typedef PREMAT;
+    __IO T32N_CON0_Typedef CON0;
+    __IO T32N_CON1_Typedef CON1;
+    __IO T32N_CON2_Typedef CON2;
+    uint32_t RESERVED1;
+    __IO T32N_IE_Typedef IE;
+    __IO T32N_IF_Typedef IF;
+    __IO T32N_TRG_Typedef TRG;
+    uint32_t RESERVED2;
+    __IO T32N_MAT0_Typedef MAT0;
+    __IO T32N_MAT1_Typedef MAT1;
+    __IO T32N_MAT2_Typedef MAT2;
+    __IO T32N_MAT3_Typedef MAT3;
+} T32N_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TXEN: 1;
+        uint32_t TRST: 1;
+        uint32_t TXFS: 1;
+        uint32_t RESERVED0: 1;
+        uint32_t TXMOD: 3;
+        uint32_t TXP: 1;
+        uint32_t RXEN: 1;
+        uint32_t RRST: 1;
+        uint32_t RESERVED1: 2;
+        uint32_t RXMOD: 3;
+        uint32_t RXP: 1;
+        uint32_t RESERVED2: 12;
+        uint32_t BCS: 3;
+        uint32_t RESERVED3: 1;
+    };
+    uint32_t Word;
+} UART_CON_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t BRR: 11;
+        uint32_t RESERVED0: 21;
+    };
+    uint32_t Word;
+} UART_BRR_Typedef;
+
+typedef union
+{
+    uint8_t Byte[4];
+    uint16_t HalfWord[2];
+    uint32_t Word;
+} UART_TBW_Typedef;
+
+typedef union
+{
+    uint8_t Byte[4];
+    uint16_t HalfWord[2];
+    uint32_t Word;
+} UART_RBR_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TB0: 9;
+        uint32_t RESERVED0: 3;
+        uint32_t TP0: 1;
+        uint32_t TBEF0: 1;
+        uint32_t RESERVED1: 2;
+        uint32_t TB1: 9;
+        uint32_t RESERVED2: 3;
+        uint32_t TP1: 1;
+        uint32_t TBEF1: 1;
+        uint32_t RESERVED3: 2;
+    };
+    uint32_t Word;
+} UART_TB01_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TB2: 9;
+        uint32_t RESERVED0: 3;
+        uint32_t TP2: 1;
+        uint32_t TBEF2: 1;
+        uint32_t RESERVED1: 2;
+        uint32_t TB3: 9;
+        uint32_t RESERVED2: 3;
+        uint32_t TP3: 1;
+        uint32_t TBEF3: 1;
+        uint32_t RESERVED3: 2;
+    };
+    uint32_t Word;
+} UART_TB23_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t RB0: 9;
+        uint32_t RESERVED0: 3;
+        uint32_t RP0: 1;
+        uint32_t RBFF0: 1;
+        uint32_t FE0: 1;
+        uint32_t PE0: 1;
+        uint32_t RB1: 9;
+        uint32_t RESERVED1: 3;
+        uint32_t RP1: 1;
+        uint32_t RBFF1: 1;
+        uint32_t FE1: 1;
+        uint32_t PE1: 1;
+    };
+    uint32_t Word;
+} UART_RB01_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t RB2: 9;
+        uint32_t RESERVED0: 3;
+        uint32_t RP2: 1;
+        uint32_t RBFF2: 1;
+        uint32_t FE2: 1;
+        uint32_t PE2: 1;
+        uint32_t RB3: 9;
+        uint32_t RESERVED1: 3;
+        uint32_t RP3: 1;
+        uint32_t RBFF3: 1;
+        uint32_t FE3: 1;
+        uint32_t PE3: 1;
+    };
+    uint32_t Word;
+} UART_RB23_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TBIE: 1;
+        uint32_t RBIE: 1;
+        uint32_t ROIE: 1;
+        uint32_t FEIE: 1;
+        uint32_t PEIE: 1;
+        uint32_t TBEIE: 1;
+        uint32_t RESERVED0: 2;
+        uint32_t TBIM: 2;
+        uint32_t RBIM: 2;
+        uint32_t TIDIE: 1;
+        uint32_t RIDIE: 1;
+        uint32_t RESERVED1: 18;
+    };
+    uint32_t Word;
+} UART_IE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TBIF: 1;
+        uint32_t RBIF: 1;
+        uint32_t ROIF: 1;
+        uint32_t FEIF: 1;
+        uint32_t PEIF: 1;
+        uint32_t TBEIF: 1;
+        uint32_t RESERVED0: 6;
+        uint32_t TIDIF: 1;
+        uint32_t RIDIF: 1;
+        uint32_t RESERVED1: 18;
+    };
+    uint32_t Word;
+} UART_IF_Typedef;
+
+typedef struct
+{
+    __IO UART_CON_Typedef CON;
+    __IO UART_BRR_Typedef BRR;
+    __O UART_TBW_Typedef TBW;
+    __I UART_RBR_Typedef RBR;
+    __I UART_TB01_Typedef TB01;
+    __I UART_TB23_Typedef TB23;
+    __I UART_RB01_Typedef RB01;
+    __I UART_RB23_Typedef RB23;
+    __IO UART_IE_Typedef IE;
+    __IO UART_IF_Typedef IF;
+} UART_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t EN: 1;
+        uint32_t RST: 1;
+        uint32_t MS: 1;
+        uint32_t REN: 1;
+        uint32_t RESERVED0: 1;
+        uint32_t DRE: 1;
+        uint32_t DFS: 2;
+        uint32_t RESERVED1: 8;
+        uint32_t TME: 1;
+        uint32_t TMS: 1;
+        uint32_t TMP: 6;
+        uint32_t DW: 3;
+        uint32_t RESERVED2: 3;
+        uint32_t TXCLR: 1;
+        uint32_t RXCLR: 1;
+    };
+    uint32_t Word;
+} SPI_CON_Typedef;
+
+typedef union
+{
+    uint8_t Byte[4];
+    uint16_t HalfWord[2];
+    uint32_t Word;
+} SPI_TBW_Typedef;
+
+typedef union
+{
+    uint8_t Byte[4];
+    uint16_t HalfWord[2];
+    uint32_t Word;
+} SPI_RBR_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TBIE: 1;
+        uint32_t RBIE: 1;
+        uint32_t TEIE: 1;
+        uint32_t ROIE: 1;
+        uint32_t IDIE: 1;
+        uint32_t NSSIE: 1;
+        uint32_t TBWEIE: 1;
+        uint32_t RESERVED0: 1;
+        uint32_t TBIM: 2;
+        uint32_t RBIM: 2;
+        uint32_t RESERVED1: 20;
+    };
+    uint32_t Word;
+} SPI_IE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TBIF: 1;
+        uint32_t RBIF: 1;
+        uint32_t TEIF: 1;
+        uint32_t ROIF: 1;
+        uint32_t IDIF: 1;
+        uint32_t NSSIF: 1;
+        uint32_t TBWEIF: 1;
+        uint32_t RESERVED0: 25;
+    };
+    uint32_t Word;
+} SPI_IF_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TB0: 8;
+        uint32_t TB1: 8;
+        uint32_t TB2: 8;
+        uint32_t TB3: 8;
+    };
+    uint32_t Word;
+} SPI_TB_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t RB0: 8;
+        uint32_t RB1: 8;
+        uint32_t RB2: 8;
+        uint32_t RB3: 8;
+    };
+    uint32_t Word;
+} SPI_RB_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t RESERVED0: 7;
+        uint32_t NSS: 1;
+        uint32_t TBEF0: 1;
+        uint32_t TBEF1: 1;
+        uint32_t TBEF2: 1;
+        uint32_t TBEF3: 1;
+        uint32_t RBFF0: 1;
+        uint32_t RBFF1: 1;
+        uint32_t RBFF2: 1;
+        uint32_t RBFF3: 1;
+        uint32_t IDLE: 1;
+        uint32_t RESERVED1: 15;
+    };
+    uint32_t Word;
+} SPI_STA_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t CKS: 10;
+        uint32_t RESERVED0: 22;
+    };
+    uint32_t Word;
+} SPI_CKS_Typedef;
+
+typedef struct
+{
+    __IO SPI_CON_Typedef CON;
+    uint32_t RESERVED0 ;
+    __O SPI_TBW_Typedef TBW;
+    __I SPI_RBR_Typedef RBR;
+    __IO SPI_IE_Typedef IE;
+    __IO SPI_IF_Typedef IF;
+    __I SPI_TB_Typedef TB;
+    __I SPI_RB_Typedef RB;
+    __I SPI_STA_Typedef STA;
+    __IO SPI_CKS_Typedef CKS;
+} SPI_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t EN: 1;
+        uint32_t RST: 1;
+        uint32_t SCKOD: 1;
+        uint32_t SDAOD: 1;
+        uint32_t SCKSE: 1;
+        uint32_t SDASE: 1;
+        uint32_t RESERVED0: 1;
+        uint32_t TJE: 1;
+        uint32_t TJP: 8;
+        uint32_t RW: 1;
+        uint32_t SA: 7;
+        uint32_t RESERVED1: 8;
+    };
+    uint32_t Word;
+} I2C_CON_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t MS: 1;
+        uint32_t RDM: 3;
+        uint32_t CSE: 1;
+        uint32_t ANAE: 1;
+        uint32_t SRAE: 1;
+        uint32_t SPAE: 1;
+        uint32_t ADLY: 3;
+        uint32_t ADE: 1;
+        uint32_t TIS: 4;
+        uint32_t SRT: 1;
+        uint32_t SPT: 1;
+        uint32_t RDT: 1;
+        uint32_t BLD: 1;
+        uint32_t RESERVED0: 4;
+        uint32_t TAS: 1;
+        uint32_t RESERVED1: 7;
+    };
+    uint32_t Word;
+} I2C_MOD_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t SRIE: 1;
+        uint32_t SPIE: 1;
+        uint32_t TBIE: 1;
+        uint32_t RBIE: 1;
+        uint32_t TEIE: 1;
+        uint32_t ROIE: 1;
+        uint32_t NAIE: 1;
+        uint32_t TBWEIE: 1;
+        uint32_t TBIM: 2;
+        uint32_t RBIM: 2;
+        uint32_t TIDLEIE: 1;
+        uint32_t RESERVED0: 19;
+    };
+    uint32_t Word;
+} I2C_IE_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t SRIF: 1;
+        uint32_t SPIF: 1;
+        uint32_t TBIF: 1;
+        uint32_t RBIF: 1;
+        uint32_t TEIF: 1;
+        uint32_t ROIF: 1;
+        uint32_t NAIF: 1;
+        uint32_t TBWEIF: 1;
+        uint32_t RESERVED0: 4;
+        uint32_t TIDLEIF: 1;
+        uint32_t RESERVED1: 19;
+    };
+    uint32_t Word;
+} I2C_IF_Typedef;
+
+typedef union
+{
+    uint8_t Byte[4];
+    uint16_t HalfWord[2];
+    uint32_t Word;
+} I2C_TBW_Typedef;
+
+typedef union
+{
+    uint8_t Byte[4];
+    uint16_t HalfWord[2];
+    uint32_t Word;
+} I2C_RBR_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t TB0: 8;
+        uint32_t TB1: 8;
+        uint32_t TB2: 8;
+        uint32_t TB3: 8;
+    };
+    uint32_t Word;
+} I2C_TB_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t RB0: 8;
+        uint32_t RB1: 8;
+        uint32_t RB2: 8;
+        uint32_t RB3: 8;
+    };
+    uint32_t Word;
+} I2C_RB_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t RESERVED0: 8;
+        uint32_t TBEF0: 1;
+        uint32_t TBEF1: 1;
+        uint32_t TBEF2: 1;
+        uint32_t TBEF3: 1;
+        uint32_t RBFF0: 1;
+        uint32_t RBFF1: 1;
+        uint32_t RBFF2: 1;
+        uint32_t RBFF3: 1;
+        uint32_t ACK: 1;
+        uint32_t IDLE: 1;
+        uint32_t RESERVED1: 14;
+    };
+    uint32_t Word;
+} I2C_STA_Typedef;
+
+typedef struct
+{
+    __IO I2C_CON_Typedef CON;
+    __IO I2C_MOD_Typedef MOD;
+    __IO I2C_IE_Typedef IE;
+    __IO I2C_IF_Typedef IF;
+    __O I2C_TBW_Typedef TBW;
+    __I I2C_RBR_Typedef RBR;
+    __I I2C_TB_Typedef TB;
+    __I I2C_RB_Typedef RB;
+    __I I2C_STA_Typedef STA;
+} I2C_TypeDef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t AES_DATA0: 32;
+    };
+    uint32_t Word;
+} AES_DATA0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t AES_DATA1: 32;
+    };
+    uint32_t Word;
+} AES_DATA1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t AES_DATA2: 32;
+    };
+    uint32_t Word;
+} AES_DATA2_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t AES_DATA3: 32;
+    };
+    uint32_t Word;
+} AES_DATA3_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t AES_KEY0: 32;
+    };
+    uint32_t Word;
+} AES_KEY0_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t AES_KEY1: 32;
+    };
+    uint32_t Word;
+} AES_KEY1_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t AES_KEY2: 32;
+    };
+    uint32_t Word;
+} AES_KEY2_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t AES_KEY3: 32;
+    };
+    uint32_t Word;
+} AES_KEY3_Typedef;
+
+typedef union
+{
+    struct
+    {
+        uint32_t GO_DONE: 1;
+        uint32_t ENCRYPT: 1;
+        uint32_t RESERVED0: 4;
+        uint32_t IE: 1;
+        uint32_t IF: 1;
+        uint32_t RESERVED1: 24;
+    };
+    uint32_t Word;
+} AES_CON_Typedef;
+
+typedef struct
+{
+    __IO AES_DATA0_Typedef DATA0;
+    __IO AES_DATA1_Typedef DATA1;
+    __IO AES_DATA2_Typedef DATA2;
+    __IO AES_DATA3_Typedef DATA3;
+    __IO AES_KEY0_Typedef KEY0;
+    __IO AES_KEY1_Typedef KEY1;
+    __IO AES_KEY2_Typedef KEY2;
+    __IO AES_KEY3_Typedef KEY3;
+    __IO AES_CON_Typedef CON;
+} AES_TypeDef;
+
+/******************************************************************************/
+/* 物理地址映射 */
+/******************************************************************************/
+
+/* Base addresses */
+#define FLASH_BASE (0x00000000UL)
+#define SRAM_BASE (0x20000000UL)
+#define APB_BASE (0x40000000UL)
+#define RAM_BASE (0x60000000UL)
+
+/* APB peripherals */
+#define SCU_BASE (APB_BASE + 0x00000)
+#define CRC_BASE (APB_BASE + 0x00C00)
+#define GPIO_BASE (APB_BASE + 0x20000)
+#define IAP_BASE (APB_BASE + 0x00800)
+#define ADC_BASE (APB_BASE + 0x01000)
+#define RTC_BASE (APB_BASE + 0x01400)
+#define IWDT_BASE (APB_BASE + 0x01C00)
+#define WWDT_BASE (APB_BASE + 0x01800)
+#define T16N0_BASE (APB_BASE + 0x02000)
+#define T16N1_BASE (APB_BASE + 0x02400)
+#define T16N2_BASE (APB_BASE + 0x02800)
+#define T16N3_BASE (APB_BASE + 0x02C00)
+#define T32N0_BASE (APB_BASE + 0x04000)
+#define UART0_BASE (APB_BASE + 0x06000)
+#define UART1_BASE (APB_BASE + 0x06400)
+#define UART2_BASE (APB_BASE + 0x06800)
+#define UART3_BASE (APB_BASE + 0x06C00)
+#define UART4_BASE (APB_BASE + 0x07000)
+#define UART5_BASE (APB_BASE + 0x07400)
+#define SPI0_BASE (APB_BASE + 0x08000)
+#define I2C0_BASE (APB_BASE + 0x09000)
+#define AES_BASE (APB_BASE + 0x0A000)
+
+/******************************************************************************/
+/* 外设定义 */
+/******************************************************************************/
+#define SCU ((SCU_TypeDef *) SCU_BASE )
+#define CRC ((CRC_TypeDef *) CRC_BASE )
+#define GPIO ((GPIO_TypeDef *) GPIO_BASE )
+#define IAP ((IAP_TypeDef *) IAP_BASE )
+#define ADC ((ADC_TypeDef *) ADC_BASE )
+#define RTC ((RTC_TypeDef *) RTC_BASE )
+#define IWDT ((IWDT_TypeDef *) IWDT_BASE )
+#define WWDT ((WWDT_TypeDef *) WWDT_BASE )
+#define T16N0 ((T16N_TypeDef *) T16N0_BASE )
+#define T16N1 ((T16N_TypeDef *) T16N1_BASE )
+#define T16N2 ((T16N_TypeDef *) T16N2_BASE )
+#define T16N3 ((T16N_TypeDef *) T16N3_BASE )
+#define T32N0 ((T32N_TypeDef *) T32N0_BASE )
+#define UART0 ((UART_TypeDef *) UART0_BASE )
+#define UART1 ((UART_TypeDef *) UART1_BASE )
+#define UART2 ((UART_TypeDef *) UART2_BASE )
+#define UART3 ((UART_TypeDef *) UART3_BASE )
+#define UART4 ((UART_TypeDef *) UART4_BASE )
+#define UART5 ((UART_TypeDef *) UART5_BASE )
+#define SPI0 ((SPI_TypeDef *) SPI0_BASE )
+#define I2C0 ((I2C_TypeDef *) I2C0_BASE )
+#define AES ((AES_TypeDef *) AES_BASE )
+
+
+#endif

+ 668 - 0
bsp/essemi/es8p508x/libraries/CMSIS/core_cm0.h

@@ -0,0 +1,668 @@
+/**************************************************************************//**
+ * @file     core_cm0.h
+ * @brief    CMSIS Cortex-M0 Core Peripheral Access Layer Header File
+ * @version  V3.02
+ * @date     16. July 2012
+ *
+ * @note
+ * Copyright (C) 2009-2012 ARM Limited. All rights reserved.
+ *
+ * @par
+ * ARM Limited (ARM) is supplying this software for use with Cortex-M
+ * processor based microcontrollers.  This file can be freely distributed
+ * within development tools that are supporting such ARM based processors.
+ *
+ * @par
+ * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
+ * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
+ * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
+ * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ ******************************************************************************/
+#if defined ( __ICCARM__ )
+ #pragma system_include  /* treat file as system include file for MISRA check */
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#ifndef __CORE_CM0_H_GENERIC
+#define __CORE_CM0_H_GENERIC
+
+/** \page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions
+  CMSIS violates the following MISRA-C:2004 rules:
+
+   \li Required Rule 8.5, object/function definition in header file.<br>
+     Function definitions in header files are used to allow 'inlining'.
+
+   \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
+     Unions are used for effective representation of core registers.
+
+   \li Advisory Rule 19.7, Function-like macro defined.<br>
+     Function-like macros are used to allow more efficient code.
+ */
+
+
+/*******************************************************************************
+ *                 CMSIS definitions
+ ******************************************************************************/
+/** \ingroup Cortex_M0
+  @{
+ */
+
+/*  CMSIS CM0 definitions */
+#define __CM0_CMSIS_VERSION_MAIN  (0x03)                                   /*!< [31:16] CMSIS HAL main version   */
+#define __CM0_CMSIS_VERSION_SUB   (0x01)                                   /*!< [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 ( __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 ( __GNUC__ )
+  #define __ASM            __asm                                      /*!< asm keyword for GNU Compiler          */
+  #define __INLINE         inline                                     /*!< inline keyword for GNU 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
+
+#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 ( __ICCARM__ )
+  #if defined __ARMVFP__
+    #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 ( __TASKING__ )
+  #if defined __FPU_VFP__
+    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+#endif
+
+#include <stdint.h>                      /* standard types definitions                      */
+#include <core_cmInstr.h>                /* Core Instruction Access                         */
+#include <core_cmFunc.h>                 /* Core Function Access                            */
+
+
+#endif /* __CORE_CM0_H_GENERIC */
+
+#ifndef __CMSIS_GENERIC
+
+#ifndef __CORE_CM0_H_DEPENDANT
+#define __CORE_CM0_H_DEPENDANT
+
+/* check device defines and use defaults */
+#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
+#endif
+
+/* IO definitions (access restrictions to peripheral registers) */
+/**
+    \defgroup CMSIS_glob_defs CMSIS Global Defines
+
+    <strong>IO Type Qualifiers</strong> are used
+    \li to specify the access to peripheral variables.
+    \li for automatic generation of peripheral register debug information.
+*/
+#ifdef __cplusplus
+  #define   __I     volatile             /*!< Defines 'read only' permissions                 */
+#else
+  #define   __I     volatile const       /*!< Defines 'read only' permissions                 */
+#endif
+#define     __O     volatile             /*!< Defines 'write only' permissions                */
+#define     __IO    volatile             /*!< Defines 'read / write' permissions              */
+
+/*@} end of group Cortex_M0 */
+
+
+
+/*******************************************************************************
+ *                 Register Abstraction
+  Core Register contain:
+  - Core Register
+  - Core NVIC Register
+  - Core SCB Register
+  - Core SysTick Register
+ ******************************************************************************/
+/** \defgroup CMSIS_core_register Defines and Type Definitions
+    \brief Type definitions and defines for Cortex-M processor based devices.
+*/
+
+/** \ingroup    CMSIS_core_register
+    \defgroup   CMSIS_CORE  Status and Control Registers
+    \brief  Core Register type definitions.
+  @{
+ */
+
+/** \brief  Union type to access the Application Program Status Register (APSR).
+ */
+typedef union
+{
+  struct
+  {
+#if (__CORTEX_M != 0x04)
+    uint32_t _reserved0:27;              /*!< bit:  0..26  Reserved                           */
+#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                           */
+#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).
+ */
+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                   */
+#if (__CORTEX_M != 0x04)
+    uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved                           */
+#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                           */
+#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).
+ */
+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)
+    \brief      Type definitions for the NVIC Registers
+  @{
+ */
+
+/** \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
+    \defgroup CMSIS_SCB     System Control Block (SCB)
+    \brief      Type definitions for the System Control Block Registers
+  @{
+ */
+
+/** \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;
+
+/* 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_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_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 */
+
+/* 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_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_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_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_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 */
+
+/* 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_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_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 */
+
+/* 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_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 */
+
+/* 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_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 */
+#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
+    \defgroup CMSIS_SysTick     System Tick Timer (SysTick)
+    \brief      Type definitions for the System Timer Registers.
+  @{
+ */
+
+/** \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;
+
+/* 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_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_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 */
+#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 */
+#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 */
+#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_TENMS_Pos             0                                             /*!< SysTick CALIB: TENMS Position */
+#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick CALIB: TENMS Mask */
+
+/*@} end of group CMSIS_SysTick */
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)
+    \brief      Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR)
+                are only accessible over DAP and not via processor. Therefore
+                they are not covered by the Cortex-M0 header file.
+  @{
+ */
+/*@} end of group CMSIS_CoreDebug */
+
+
+/** \ingroup    CMSIS_core_register
+    \defgroup   CMSIS_core_base     Core Definitions
+    \brief      Definitions for base addresses, unions, and structures.
+  @{
+ */
+
+/* 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          */
+
+
+/*@} */
+
+
+
+/*******************************************************************************
+ *                Hardware Abstraction Layer
+  Core Function Interface contains:
+  - Core NVIC Functions
+  - Core SysTick Functions
+  - Core Register Access Functions
+ ******************************************************************************/
+/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
+*/
+
+
+
+/* ##########################   NVIC functions  #################################### */
+/** \ingroup  CMSIS_Core_FunctionInterface
+    \defgroup CMSIS_Core_NVICFunctions NVIC Functions
+    \brief      Functions that manage interrupts and exceptions via the NVIC.
+    @{
+ */
+
+/* Interrupt Priorities are WORD accessible only under ARMv6M                   */
+/* 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)     )
+
+
+/** \brief  Enable External Interrupt
+
+    The function enables a device-specific interrupt in the NVIC interrupt controller.
+
+    \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));
+}
+
+
+/** \brief  Disable External Interrupt
+
+    The function disables a device-specific interrupt in the NVIC interrupt controller.
+
+    \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));
+}
+
+
+/** \brief  Get Pending Interrupt
+
+    The function reads the pending register in the NVIC and returns the pending bit
+    for the specified interrupt.
+
+    \param [in]      IRQn  Interrupt number.
+
+    \return             0  Interrupt status is not 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));
+}
+
+
+/** \brief  Set Pending Interrupt
+
+    The function sets the pending bit of an external interrupt.
+
+    \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));
+}
+
+
+/** \brief  Clear Pending Interrupt
+
+    The function clears the pending bit of an external interrupt.
+
+    \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 */
+}
+
+
+/** \brief  Set Interrupt Priority
+
+    The function sets the priority of an interrupt.
+
+    \note The priority cannot be set for every core interrupt.
+
+    \param [in]      IRQn  Interrupt number.
+    \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
+
+    The function reads the priority of an interrupt. The interrupt
+    number can be positive to specify an external (device specific)
+    interrupt, or negative to specify an internal (core) interrupt.
+
+
+    \param [in]   IRQn  Interrupt number.
+    \return             Interrupt Priority. Value is aligned automatically to the implemented
+                        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) ) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for Cortex-M0 system interrupts */
+  else {
+    return((uint32_t)((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for device specific interrupts  */
+}
+
+
+/** \brief  System Reset
+
+    The function initiates a system reset request to reset the MCU.
+ */
+__STATIC_INLINE void NVIC_SystemReset(void)
+{
+  __DSB();                                                     /* Ensure all outstanding memory accesses included
+                                                                  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 */
+}
+
+/*@} end of CMSIS_Core_NVICFunctions */
+
+
+
+/* ##################################    SysTick function  ############################################ */
+/** \ingroup  CMSIS_Core_FunctionInterface
+    \defgroup CMSIS_Core_SysTickFunctions SysTick Functions
+    \brief      Functions that configure the System.
+  @{
+ */
+
+#if (__Vendor_SysTickConfig == 0)
+
+/** \brief  System Tick Configuration
+
+    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.
+
+    \param [in]  ticks  Number of ticks between two interrupts.
+
+    \return          0  Function succeeded.
+    \return          1  Function failed.
+
+    \note     When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
+    function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
+    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 */
+}
+
+#endif
+
+/*@} end of CMSIS_Core_SysTickFunctions */
+
+
+
+
+#endif /* __CORE_CM0_H_DEPENDANT */
+
+#endif /* __CMSIS_GENERIC */
+
+#ifdef __cplusplus
+}
+#endif

+ 636 - 0
bsp/essemi/es8p508x/libraries/CMSIS/core_cmFunc.h

@@ -0,0 +1,636 @@
+/**************************************************************************//**
+ * @file     core_cmFunc.h
+ * @brief    CMSIS Cortex-M Core Function Access Header File
+ * @version  V3.20
+ * @date     25. February 2013
+ *
+ * @note
+ *
+ ******************************************************************************/
+/* Copyright (c) 2009 - 2013 ARM LIMITED
+
+   All rights reserved.
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+   - Neither the name of ARM nor the names of its contributors may be used
+     to endorse or promote products derived from this software without
+     specific prior written permission.
+   *
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+   ---------------------------------------------------------------------------*/
+
+
+#ifndef __CORE_CMFUNC_H
+#define __CORE_CMFUNC_H
+
+
+/* ###########################  Core Function Access  ########################### */
+/** \ingroup  CMSIS_Core_FunctionInterface
+    \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
+  @{
+ */
+
+#if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
+/* ARM armcc specific functions */
+
+#if (__ARMCC_VERSION < 400677)
+  #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
+#endif
+
+/* intrinsic void __enable_irq();     */
+/* intrinsic void __disable_irq();    */
+
+/** \brief  Get Control Register
+
+    This function returns the content of the Control Register.
+
+    \return               Control Register value
+ */
+__STATIC_INLINE uint32_t __get_CONTROL(void)
+{
+  register uint32_t __regControl         __ASM("control");
+  return(__regControl);
+}
+
+
+/** \brief  Set Control Register
+
+    This function writes the given value to the Control Register.
+
+    \param [in]    control  Control Register value to set
+ */
+__STATIC_INLINE void __set_CONTROL(uint32_t control)
+{
+  register uint32_t __regControl         __ASM("control");
+  __regControl = control;
+}
+
+
+/** \brief  Get IPSR Register
+
+    This function returns the content of the IPSR Register.
+
+    \return               IPSR Register value
+ */
+__STATIC_INLINE uint32_t __get_IPSR(void)
+{
+  register uint32_t __regIPSR          __ASM("ipsr");
+  return(__regIPSR);
+}
+
+
+/** \brief  Get APSR Register
+
+    This function returns the content of the APSR Register.
+
+    \return               APSR Register value
+ */
+__STATIC_INLINE uint32_t __get_APSR(void)
+{
+  register uint32_t __regAPSR          __ASM("apsr");
+  return(__regAPSR);
+}
+
+
+/** \brief  Get xPSR Register
+
+    This function returns the content of the xPSR Register.
+
+    \return               xPSR Register value
+ */
+__STATIC_INLINE uint32_t __get_xPSR(void)
+{
+  register uint32_t __regXPSR          __ASM("xpsr");
+  return(__regXPSR);
+}
+
+
+/** \brief  Get Process Stack Pointer
+
+    This function returns the current value of the Process Stack Pointer (PSP).
+
+    \return               PSP Register value
+ */
+__STATIC_INLINE uint32_t __get_PSP(void)
+{
+  register uint32_t __regProcessStackPointer  __ASM("psp");
+  return(__regProcessStackPointer);
+}
+
+
+/** \brief  Set Process Stack Pointer
+
+    This function assigns the given value to the Process Stack Pointer (PSP).
+
+    \param [in]    topOfProcStack  Process Stack Pointer value to set
+ */
+__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
+{
+  register uint32_t __regProcessStackPointer  __ASM("psp");
+  __regProcessStackPointer = topOfProcStack;
+}
+
+
+/** \brief  Get Main Stack Pointer
+
+    This function returns the current value of the Main Stack Pointer (MSP).
+
+    \return               MSP Register value
+ */
+__STATIC_INLINE uint32_t __get_MSP(void)
+{
+  register uint32_t __regMainStackPointer     __ASM("msp");
+  return(__regMainStackPointer);
+}
+
+
+/** \brief  Set Main Stack Pointer
+
+    This function assigns the given value to the Main Stack Pointer (MSP).
+
+    \param [in]    topOfMainStack  Main Stack Pointer value to set
+ */
+__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
+{
+  register uint32_t __regMainStackPointer     __ASM("msp");
+  __regMainStackPointer = topOfMainStack;
+}
+
+
+/** \brief  Get Priority Mask
+
+    This function returns the current state of the priority mask bit from the Priority Mask Register.
+
+    \return               Priority Mask value
+ */
+__STATIC_INLINE uint32_t __get_PRIMASK(void)
+{
+  register uint32_t __regPriMask         __ASM("primask");
+  return(__regPriMask);
+}
+
+
+/** \brief  Set Priority Mask
+
+    This function assigns the given value to the Priority Mask Register.
+
+    \param [in]    priMask  Priority Mask
+ */
+__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
+{
+  register uint32_t __regPriMask         __ASM("primask");
+  __regPriMask = (priMask);
+}
+
+
+#if       (__CORTEX_M >= 0x03)
+
+/** \brief  Enable FIQ
+
+    This function enables FIQ interrupts by clearing the F-bit in the CPSR.
+    Can only be executed in Privileged modes.
+ */
+#define __enable_fault_irq                __enable_fiq
+
+
+/** \brief  Disable FIQ
+
+    This function disables FIQ interrupts by setting the F-bit in the CPSR.
+    Can only be executed in Privileged modes.
+ */
+#define __disable_fault_irq               __disable_fiq
+
+
+/** \brief  Get Base Priority
+
+    This function returns the current value of the Base Priority register.
+
+    \return               Base Priority register value
+ */
+__STATIC_INLINE uint32_t  __get_BASEPRI(void)
+{
+  register uint32_t __regBasePri         __ASM("basepri");
+  return(__regBasePri);
+}
+
+
+/** \brief  Set Base Priority
+
+    This function assigns the given value to the Base Priority register.
+
+    \param [in]    basePri  Base Priority value to set
+ */
+__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
+{
+  register uint32_t __regBasePri         __ASM("basepri");
+  __regBasePri = (basePri & 0xff);
+}
+
+
+/** \brief  Get Fault Mask
+
+    This function returns the current value of the Fault Mask register.
+
+    \return               Fault Mask register value
+ */
+__STATIC_INLINE uint32_t __get_FAULTMASK(void)
+{
+  register uint32_t __regFaultMask       __ASM("faultmask");
+  return(__regFaultMask);
+}
+
+
+/** \brief  Set Fault Mask
+
+    This function assigns the given value to the Fault Mask register.
+
+    \param [in]    faultMask  Fault Mask value to set
+ */
+__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
+{
+  register uint32_t __regFaultMask       __ASM("faultmask");
+  __regFaultMask = (faultMask & (uint32_t)1);
+}
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+
+#if       (__CORTEX_M == 0x04)
+
+/** \brief  Get FPSCR
+
+    This function returns the current value of the Floating Point Status/Control register.
+
+    \return               Floating Point Status/Control register value
+ */
+__STATIC_INLINE uint32_t __get_FPSCR(void)
+{
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+  register uint32_t __regfpscr         __ASM("fpscr");
+  return(__regfpscr);
+#else
+   return(0);
+#endif
+}
+
+
+/** \brief  Set FPSCR
+
+    This function assigns the given value to the Floating Point Status/Control register.
+
+    \param [in]    fpscr  Floating Point Status/Control value to set
+ */
+__STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
+{
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+  register uint32_t __regfpscr         __ASM("fpscr");
+  __regfpscr = (fpscr);
+#endif
+}
+
+#endif /* (__CORTEX_M == 0x04) */
+
+
+#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
+/* IAR iccarm specific functions */
+
+#include <cmsis_iar.h>
+
+
+#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
+/* TI CCS specific functions */
+
+#include <cmsis_ccs.h>
+
+
+#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
+/* GNU gcc specific functions */
+
+/** \brief  Enable IRQ Interrupts
+
+  This function enables IRQ interrupts by clearing the I-bit in the CPSR.
+  Can only be executed in Privileged modes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
+{
+  __ASM volatile ("cpsie i" : : : "memory");
+}
+
+
+/** \brief  Disable IRQ Interrupts
+
+  This function disables IRQ interrupts by setting the I-bit in the CPSR.
+  Can only be executed in Privileged modes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
+{
+  __ASM volatile ("cpsid i" : : : "memory");
+}
+
+
+/** \brief  Get Control Register
+
+    This function returns the content of the Control Register.
+
+    \return               Control Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, control" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Control Register
+
+    This function writes the given value to the Control Register.
+
+    \param [in]    control  Control Register value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control)
+{
+  __ASM volatile ("MSR control, %0" : : "r" (control) : "memory");
+}
+
+
+/** \brief  Get IPSR Register
+
+    This function returns the content of the IPSR Register.
+
+    \return               IPSR Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Get APSR Register
+
+    This function returns the content of the APSR Register.
+
+    \return               APSR Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, apsr" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Get xPSR Register
+
+    This function returns the content of the xPSR Register.
+
+    \return               xPSR Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, xpsr" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Get Process Stack Pointer
+
+    This function returns the current value of the Process Stack Pointer (PSP).
+
+    \return               PSP Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void)
+{
+  register uint32_t result;
+
+  __ASM volatile ("MRS %0, psp\n"  : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Process Stack Pointer
+
+    This function assigns the given value to the Process Stack Pointer (PSP).
+
+    \param [in]    topOfProcStack  Process Stack Pointer value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
+{
+  __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp");
+}
+
+
+/** \brief  Get Main Stack Pointer
+
+    This function returns the current value of the Main Stack Pointer (MSP).
+
+    \return               MSP Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
+{
+  register uint32_t result;
+
+  __ASM volatile ("MRS %0, msp\n" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Main Stack Pointer
+
+    This function assigns the given value to the Main Stack Pointer (MSP).
+
+    \param [in]    topOfMainStack  Main Stack Pointer value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
+{
+  __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp");
+}
+
+
+/** \brief  Get Priority Mask
+
+    This function returns the current state of the priority mask bit from the Priority Mask Register.
+
+    \return               Priority Mask value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, primask" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Priority Mask
+
+    This function assigns the given value to the Priority Mask Register.
+
+    \param [in]    priMask  Priority Mask
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
+{
+  __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
+}
+
+
+#if       (__CORTEX_M >= 0x03)
+
+/** \brief  Enable FIQ
+
+    This function enables FIQ interrupts by clearing the F-bit in the CPSR.
+    Can only be executed in Privileged modes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void)
+{
+  __ASM volatile ("cpsie f" : : : "memory");
+}
+
+
+/** \brief  Disable FIQ
+
+    This function disables FIQ interrupts by setting the F-bit in the CPSR.
+    Can only be executed in Privileged modes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void)
+{
+  __ASM volatile ("cpsid f" : : : "memory");
+}
+
+
+/** \brief  Get Base Priority
+
+    This function returns the current value of the Base Priority register.
+
+    \return               Base Priority register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Base Priority
+
+    This function assigns the given value to the Base Priority register.
+
+    \param [in]    basePri  Base Priority value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value)
+{
+  __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory");
+}
+
+
+/** \brief  Get Fault Mask
+
+    This function returns the current value of the Fault Mask register.
+
+    \return               Fault Mask register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Fault Mask
+
+    This function assigns the given value to the Fault Mask register.
+
+    \param [in]    faultMask  Fault Mask value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
+{
+  __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory");
+}
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+
+#if       (__CORTEX_M == 0x04)
+
+/** \brief  Get FPSCR
+
+    This function returns the current value of the Floating Point Status/Control register.
+
+    \return               Floating Point Status/Control register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)
+{
+#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);
+#else
+   return(0);
+#endif
+}
+
+
+/** \brief  Set FPSCR
+
+    This function assigns the given value to the Floating Point Status/Control register.
+
+    \param [in]    fpscr  Floating Point Status/Control value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
+{
+#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 ("");
+#endif
+}
+
+#endif /* (__CORTEX_M == 0x04) */
+
+
+#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
+/* TASKING carm specific functions */
+
+/*
+ * The CMSIS functions have been implemented as intrinsics in the compiler.
+ * Please use "carm -?i" to get an up to date list of all instrinsics,
+ * Including the CMSIS ones.
+ */
+
+#endif
+
+/*@} end of CMSIS_Core_RegAccFunctions */
+
+
+#endif /* __CORE_CMFUNC_H */

+ 688 - 0
bsp/essemi/es8p508x/libraries/CMSIS/core_cmInstr.h

@@ -0,0 +1,688 @@
+/**************************************************************************//**
+ * @file     core_cmInstr.h
+ * @brief    CMSIS Cortex-M Core Instruction Access Header File
+ * @version  V3.20
+ * @date     05. March 2013
+ *
+ * @note
+ *
+ ******************************************************************************/
+/* Copyright (c) 2009 - 2013 ARM LIMITED
+
+   All rights reserved.
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+   - Neither the name of ARM nor the names of its contributors may be used
+     to endorse or promote products derived from this software without
+     specific prior written permission.
+   *
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+   ---------------------------------------------------------------------------*/
+
+
+#ifndef __CORE_CMINSTR_H
+#define __CORE_CMINSTR_H
+
+
+/* ##########################  Core Instruction Access  ######################### */
+/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
+  Access to dedicated instructions
+  @{
+*/
+
+#if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
+/* ARM armcc specific functions */
+
+#if (__ARMCC_VERSION < 400677)
+  #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
+#endif
+
+
+/** \brief  No Operation
+
+    No Operation does nothing. This instruction can be used for code alignment purposes.
+ */
+#define __NOP                             __nop
+
+
+/** \brief  Wait For Interrupt
+
+    Wait For Interrupt is a hint instruction that suspends execution
+    until one of a number of events occurs.
+ */
+#define __WFI                             __wfi
+
+
+/** \brief  Wait For Event
+
+    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.
+ */
+#define __WFE                             __wfe
+
+
+/** \brief  Send Event
+
+    Send Event is a hint instruction. It causes an event to be signaled to the CPU.
+ */
+#define __SEV                             __sev
+
+
+/** \brief  Instruction Synchronization Barrier
+
+    Instruction Synchronization Barrier flushes the pipeline in the processor,
+    so that all instructions following the ISB are fetched from cache or
+    memory, after the instruction has been completed.
+ */
+#define __ISB()                           __isb(0xF)
+
+
+/** \brief  Data Synchronization Barrier
+
+    This function acts as a special kind of Data Memory Barrier.
+    It completes when all explicit memory accesses before this instruction complete.
+ */
+#define __DSB()                           __dsb(0xF)
+
+
+/** \brief  Data Memory Barrier
+
+    This function ensures the apparent order of the explicit memory operations before
+    and after the instruction, without ensuring their completion.
+ */
+#define __DMB()                           __dmb(0xF)
+
+
+/** \brief  Reverse byte order (32 bit)
+
+    This function reverses the byte order in integer value.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+#define __REV                             __rev
+
+
+/** \brief  Reverse byte order (16 bit)
+
+    This function reverses the byte order in two unsigned short values.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+#ifndef __NO_EMBEDDED_ASM
+__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
+{
+  rev16 r0, r0
+  bx lr
+}
+#endif
+
+/** \brief  Reverse byte order in signed short value
+
+    This function reverses the byte order in a signed short value with sign extension to integer.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+#ifndef __NO_EMBEDDED_ASM
+__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)
+{
+  revsh r0, r0
+  bx lr
+}
+#endif
+
+
+/** \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.
+
+    \param [in]    value  Value to rotate
+    \param [in]    value  Number of Bits to rotate
+    \return               Rotated value
+ */
+#define __ROR                             __ror
+
+
+/** \brief  Breakpoint
+
+    This function causes the processor to enter Debug state.
+    Debug tools can use this to investigate system state when the instruction at a particular address is reached.
+
+    \param [in]    value  is ignored by the processor.
+                   If required, a debugger can use it to store additional information about the breakpoint.
+ */
+#define __BKPT(value)                       __breakpoint(value)
+
+
+#if       (__CORTEX_M >= 0x03)
+
+/** \brief  Reverse bit order of value
+
+    This function reverses the bit order of the given value.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+#define __RBIT                            __rbit
+
+
+/** \brief  LDR Exclusive (8 bit)
+
+    This function performs a exclusive LDR command for 8 bit value.
+
+    \param [in]    ptr  Pointer to data
+    \return             value of type uint8_t at (*ptr)
+ */
+#define __LDREXB(ptr)                     ((uint8_t ) __ldrex(ptr))
+
+
+/** \brief  LDR Exclusive (16 bit)
+
+    This function performs a exclusive LDR command for 16 bit values.
+
+    \param [in]    ptr  Pointer to data
+    \return        value of type uint16_t at (*ptr)
+ */
+#define __LDREXH(ptr)                     ((uint16_t) __ldrex(ptr))
+
+
+/** \brief  LDR Exclusive (32 bit)
+
+    This function performs a exclusive LDR command for 32 bit values.
+
+    \param [in]    ptr  Pointer to data
+    \return        value of type uint32_t at (*ptr)
+ */
+#define __LDREXW(ptr)                     ((uint32_t ) __ldrex(ptr))
+
+
+/** \brief  STR Exclusive (8 bit)
+
+    This function performs a exclusive STR command for 8 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+#define __STREXB(value, ptr)              __strex(value, ptr)
+
+
+/** \brief  STR Exclusive (16 bit)
+
+    This function performs a exclusive STR command for 16 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+#define __STREXH(value, ptr)              __strex(value, ptr)
+
+
+/** \brief  STR Exclusive (32 bit)
+
+    This function performs a exclusive STR command for 32 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+#define __STREXW(value, ptr)              __strex(value, ptr)
+
+
+/** \brief  Remove the exclusive lock
+
+    This function removes the exclusive lock which is created by LDREX.
+
+ */
+#define __CLREX                           __clrex
+
+
+/** \brief  Signed Saturate
+
+    This function saturates a signed value.
+
+    \param [in]  value  Value to be saturated
+    \param [in]    sat  Bit position to saturate to (1..32)
+    \return             Saturated value
+ */
+#define __SSAT                            __ssat
+
+
+/** \brief  Unsigned Saturate
+
+    This function saturates an unsigned value.
+
+    \param [in]  value  Value to be saturated
+    \param [in]    sat  Bit position to saturate to (0..31)
+    \return             Saturated value
+ */
+#define __USAT                            __usat
+
+
+/** \brief  Count leading zeros
+
+    This function counts the number of leading zeros of a data value.
+
+    \param [in]  value  Value to count the leading zeros
+    \return             number of leading zeros in value
+ */
+#define __CLZ                             __clz
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+
+
+#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
+/* IAR iccarm specific functions */
+
+#include <cmsis_iar.h>
+
+
+#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
+/* TI CCS specific functions */
+
+#include <cmsis_ccs.h>
+
+
+#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
+/* GNU gcc specific functions */
+
+/* Define macros for porting to both thumb1 and thumb2.
+ * For thumb1, use low register (r0-r7), specified by constrant "l"
+ * 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)
+#else
+#define __CMSIS_GCC_OUT_REG(r) "=r" (r)
+#define __CMSIS_GCC_USE_REG(r) "r" (r)
+#endif
+
+/** \brief  No Operation
+
+    No Operation does nothing. This instruction can be used for code alignment purposes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void)
+{
+  __ASM volatile ("nop");
+}
+
+
+/** \brief  Wait For Interrupt
+
+    Wait For Interrupt is a hint instruction that suspends execution
+    until one of a number of events occurs.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void)
+{
+  __ASM volatile ("wfi");
+}
+
+
+/** \brief  Wait For Event
+
+    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.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void)
+{
+  __ASM volatile ("wfe");
+}
+
+
+/** \brief  Send Event
+
+    Send Event is a hint instruction. It causes an event to be signaled to the CPU.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void)
+{
+  __ASM volatile ("sev");
+}
+
+
+/** \brief  Instruction Synchronization Barrier
+
+    Instruction Synchronization Barrier flushes the pipeline in the processor,
+    so that all instructions following the ISB are fetched from cache or
+    memory, after the instruction has been completed.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void)
+{
+  __ASM volatile ("isb");
+}
+
+
+/** \brief  Data Synchronization Barrier
+
+    This function acts as a special kind of Data Memory Barrier.
+    It completes when all explicit memory accesses before this instruction complete.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void)
+{
+  __ASM volatile ("dsb");
+}
+
+
+/** \brief  Data Memory Barrier
+
+    This function ensures the apparent order of the explicit memory operations before
+    and after the instruction, without ensuring their completion.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void)
+{
+  __ASM volatile ("dmb");
+}
+
+
+/** \brief  Reverse byte order (32 bit)
+
+    This function reverses the byte order in integer value.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value)
+{
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+  return __builtin_bswap32(value);
+#else
+  uint32_t result;
+
+  __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+  return(result);
+#endif
+}
+
+
+/** \brief  Reverse byte order (16 bit)
+
+    This function reverses the byte order in two unsigned short values.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value)
+{
+  uint32_t 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
+
+    This function reverses the byte order in a signed short value with sign extension to integer.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value)
+{
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+  return (short)__builtin_bswap16(value);
+#else
+  uint32_t result;
+
+  __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+  return(result);
+#endif
+}
+
+
+/** \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.
+
+    \param [in]    value  Value to rotate
+    \param [in]    value  Number of Bits to rotate
+    \return               Rotated value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
+{
+  return (op1 >> op2) | (op1 << (32 - op2)); 
+}
+
+
+/** \brief  Breakpoint
+
+    This function causes the processor to enter Debug state.
+    Debug tools can use this to investigate system state when the instruction at a particular address is reached.
+
+    \param [in]    value  is ignored by the processor.
+                   If required, a debugger can use it to store additional information about the breakpoint.
+ */
+#define __BKPT(value)                       __ASM volatile ("bkpt "#value)
+
+
+#if       (__CORTEX_M >= 0x03)
+
+/** \brief  Reverse bit order of value
+
+    This function reverses the bit order of the given value.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
+{
+  uint32_t result;
+
+   __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
+   return(result);
+}
+
+
+/** \brief  LDR Exclusive (8 bit)
+
+    This function performs a exclusive LDR command for 8 bit value.
+
+    \param [in]    ptr  Pointer to data
+    \return             value of type uint8_t at (*ptr)
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr)
+{
+    uint32_t result;
+
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+   __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) );
+#else
+    /* 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.
+    */
+   __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
+#endif
+   return(result);
+}
+
+
+/** \brief  LDR Exclusive (16 bit)
+
+    This function performs a exclusive LDR command for 16 bit values.
+
+    \param [in]    ptr  Pointer to data
+    \return        value of type uint16_t at (*ptr)
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)
+{
+    uint32_t result;
+
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+   __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) );
+#else
+    /* 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.
+    */
+   __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
+#endif
+   return(result);
+}
+
+
+/** \brief  LDR Exclusive (32 bit)
+
+    This function performs a exclusive LDR command for 32 bit values.
+
+    \param [in]    ptr  Pointer to data
+    \return        value of type uint32_t at (*ptr)
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr)
+{
+    uint32_t result;
+
+   __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
+   return(result);
+}
+
+
+/** \brief  STR Exclusive (8 bit)
+
+    This function performs a exclusive STR command for 8 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
+{
+   uint32_t result;
+
+   __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
+   return(result);
+}
+
+
+/** \brief  STR Exclusive (16 bit)
+
+    This function performs a exclusive STR command for 16 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
+{
+   uint32_t result;
+
+   __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
+   return(result);
+}
+
+
+/** \brief  STR Exclusive (32 bit)
+
+    This function performs a exclusive STR command for 32 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
+{
+   uint32_t result;
+
+   __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
+   return(result);
+}
+
+
+/** \brief  Remove the exclusive lock
+
+    This function removes the exclusive lock which is created by LDREX.
+
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void)
+{
+  __ASM volatile ("clrex" ::: "memory");
+}
+
+
+/** \brief  Signed Saturate
+
+    This function saturates a signed value.
+
+    \param [in]  value  Value to be saturated
+    \param [in]    sat  Bit position to saturate to (1..32)
+    \return             Saturated value
+ */
+#define __SSAT(ARG1,ARG2) \
+({                          \
+  uint32_t __RES, __ARG1 = (ARG1); \
+  __ASM ("ssat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
+  __RES; \
+ })
+
+
+/** \brief  Unsigned Saturate
+
+    This function saturates an unsigned value.
+
+    \param [in]  value  Value to be saturated
+    \param [in]    sat  Bit position to saturate to (0..31)
+    \return             Saturated value
+ */
+#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
+
+    This function counts the number of leading zeros of a data value.
+
+    \param [in]  value  Value to count the leading zeros
+    \return             number of leading zeros in value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value)
+{
+   uint32_t result;
+
+  __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) );
+  return(result);
+}
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+
+
+
+#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
+/* TASKING carm specific functions */
+
+/*
+ * The CMSIS functions have been implemented as intrinsics in the compiler.
+ * Please use "carm -?i" to get an up to date list of all intrinsics,
+ * Including the CMSIS ones.
+ */
+
+#endif
+
+/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
+
+#endif /* __CORE_CMINSTR_H */

+ 233 - 0
bsp/essemi/es8p508x/libraries/CMSIS/startup_ES8P508x.s

@@ -0,0 +1,233 @@
+;*******************************************************************************
+; *file       : startup_ES8P508x.s
+; *description: ES8P508x Device Startup File
+; *author     : Eastsoft MCU Software Team
+; *version    : V0.01
+; *data       : 6/30/2017
+;
+; *Copyright (C) 2017 Shanghai Eastsoft Microelectronics Co., Ltd.
+; *
+; * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
+; * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+; * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
+; * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
+; * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+;*******************************************************************************
+
+
+; <h> Stack Configuration
+;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Stack_Size      EQU     0x00000400
+
+                AREA    STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem       SPACE   Stack_Size
+__initial_sp
+
+
+; <h> Heap Configuration
+;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Heap_Size       EQU     0x00000400
+
+                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+Heap_Mem        SPACE   Heap_Size
+__heap_limit
+
+                PRESERVE8
+                THUMB
+
+; Vector Table Mapped to Address 0 at Reset
+
+                AREA    RESET, DATA, READONLY
+                EXPORT  __Vectors
+
+__Vectors       DCD     __initial_sp              ; Top of Stack
+                DCD     Reset_IRQHandler          ; Reset Handler
+                DCD     NMI_IRQHandler            ; NMI Handler
+                DCD     HardFault_IRQHandler      ; HardFault Handler
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     SVC_IRQHandler            ; SVCall Handler
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     PendSV_Handler         ; PendSV Handler
+                DCD     SysTick_Handler        ; SysTick Handler
+
+                ; External Interrupts
+                DCD     PINT0_IRQHandler          ;16, PINT0 IRQHandler
+                DCD     PINT1_IRQHandler          ;17, PINT1 IRQHandler
+                DCD     PINT2_IRQHandler          ;18, PINT2 IRQHandler
+                DCD     PINT3_IRQHandler          ;19, PINT3 IRQHandler
+                DCD     PINT4_IRQHandler          ;20, PINT4 IRQHandler
+                DCD     PINT5_IRQHandler          ;21, PINT5 IRQHandler
+                DCD     PINT6_IRQHandler          ;22, PINT6 IRQHandler
+                DCD     PINT7_IRQHandler          ;23, PINT7 IRQHandler
+                DCD     T16N0_IRQHandler          ;24, T16N0 IRQHandler
+                DCD     T16N1_IRQHandler          ;25, T16N1 IRQHandler
+                DCD     T16N2_IRQHandler          ;26, T16N2 IRQHandler
+                DCD     T16N3_IRQHandler          ;27, T16N3 IRQHandler
+                DCD     T32N0_IRQHandler          ;28, T32N0 IRQHandler
+                DCD     0                         ;29, Reserved
+                DCD     IWDT_IRQHandler           ;30, IWDT IRQHandler
+                DCD     WWDT_IRQHandler           ;31, WWDT IRQHandler
+                DCD     CCM_IRQHandler            ;32, WDT IRQHandler
+                DCD     PLK_IRQHandler            ;33, PLK IRQHandler
+                DCD     LVD_IRQHandler            ;34, LVD IRQHandler
+                DCD     KINT_IRQHandler           ;35, KINT IRQHandler
+                DCD     RTC_IRQHandler            ;36, RTC IRQHandler
+                DCD     ADC_IRQHandler            ;37, ADC IRQHandler
+                DCD     0                         ;38, Reserved
+                DCD     AES_IRQHandler            ;39, AES IRQHandler
+                DCD     UART0_IRQHandler          ;40, UART0 IRQHandler
+                DCD     UART1_IRQHandler          ;41, UART1 IRQHandler
+                DCD     UART2_IRQHandler          ;42, UART2 IRQHandler
+                DCD     UART3_IRQHandler          ;43, UART3 IRQHandler
+                DCD     UART4_IRQHandler          ;44, UART4 IRQHandler
+                DCD     UART5_IRQHandler          ;45, UART5 IRQHandler
+                DCD     SPI0_IRQHandler           ;46, SPI0 IRQHandler
+                DCD     I2C0_IRQHandler           ;47, I2C0 IRQHandler
+
+                AREA    |.text|, CODE, READONLY
+					
+; Reset Handler
+
+Reset_IRQHandler   PROC
+                EXPORT  Reset_IRQHandler             [WEAK]
+                IMPORT  __main
+                IMPORT  SystemInit									
+                LDR     R0, =SystemInit
+                BLX     R0
+                LDR     R0, =__main
+                BX      R0
+                ENDP
+
+; Dummy Exception IRQHandlers (infinite loops which can be modified)
+
+NMI_IRQHandler     PROC
+                EXPORT  NMI_IRQHandler               [WEAK]
+                B       .
+                ENDP
+HardFault_IRQHandler	PROC
+				EXPORT  HardFault_IRQHandler         [WEAK]
+				B       .
+                ENDP
+SVC_IRQHandler     PROC
+                EXPORT  SVC_IRQHandler               [WEAK]
+                B       .
+                ENDP
+PendSV_Handler  PROC
+                EXPORT  PendSV_Handler            [WEAK]
+				B       .
+                ENDP
+SysTick_Handler PROC
+                EXPORT  SysTick_Handler           [WEAK]
+                B       .
+                ENDP
+
+Default_IRQHandler PROC
+                EXPORT  PINT0_IRQHandler   [WEAK]
+                EXPORT  PINT1_IRQHandler   [WEAK]
+                EXPORT  PINT2_IRQHandler   [WEAK]
+                EXPORT  PINT3_IRQHandler   [WEAK]
+                EXPORT  PINT4_IRQHandler   [WEAK]
+                EXPORT  PINT5_IRQHandler   [WEAK]
+                EXPORT  PINT6_IRQHandler   [WEAK]
+                EXPORT  PINT7_IRQHandler   [WEAK]
+                EXPORT  T16N0_IRQHandler   [WEAK]
+                EXPORT  T16N1_IRQHandler   [WEAK]
+                EXPORT  T16N2_IRQHandler   [WEAK]
+                EXPORT  T16N3_IRQHandler   [WEAK]
+                EXPORT  T32N0_IRQHandler   [WEAK]
+                EXPORT  IWDT_IRQHandler    [WEAK]
+                EXPORT  WWDT_IRQHandler    [WEAK]
+                EXPORT  CCM_IRQHandler     [WEAK]
+                EXPORT  PLK_IRQHandler     [WEAK]
+                EXPORT  LVD_IRQHandler     [WEAK]
+                EXPORT  KINT_IRQHandler    [WEAK]
+                EXPORT  RTC_IRQHandler     [WEAK]
+                EXPORT  ADC_IRQHandler     [WEAK]
+                EXPORT  AES_IRQHandler     [WEAK]
+                EXPORT  UART0_IRQHandler   [WEAK]
+                EXPORT  UART1_IRQHandler   [WEAK]
+                EXPORT  UART2_IRQHandler   [WEAK]
+                EXPORT  UART3_IRQHandler   [WEAK]
+                EXPORT  UART4_IRQHandler   [WEAK]
+                EXPORT  UART5_IRQHandler   [WEAK]
+                EXPORT  SPI0_IRQHandler    [WEAK]
+                EXPORT  I2C0_IRQHandler    [WEAK]
+
+
+
+PINT0_IRQHandler  
+PINT1_IRQHandler  
+PINT2_IRQHandler  
+PINT3_IRQHandler  
+PINT4_IRQHandler  
+PINT5_IRQHandler  
+PINT6_IRQHandler  
+PINT7_IRQHandler  
+T16N0_IRQHandler  
+T16N1_IRQHandler  
+T16N2_IRQHandler  
+T16N3_IRQHandler  
+T32N0_IRQHandler               
+IWDT_IRQHandler   
+WWDT_IRQHandler   
+CCM_IRQHandler    
+PLK_IRQHandler    
+LVD_IRQHandler    
+KINT_IRQHandler   
+RTC_IRQHandler    
+ADC_IRQHandler           
+AES_IRQHandler    
+UART0_IRQHandler  
+UART1_IRQHandler  
+UART2_IRQHandler  
+UART3_IRQHandler  
+UART4_IRQHandler  
+UART5_IRQHandler  
+SPI0_IRQHandler   
+I2C0_IRQHandler   
+
+                B       .
+				
+                ENDP
+	
+
+
+                ALIGN
+					
+; User Initial Stack & Heap
+
+                IF      :DEF:__MICROLIB
+
+                EXPORT  __initial_sp
+                EXPORT  __heap_base
+                EXPORT  __heap_limit
+
+                ELSE
+
+                IMPORT  __use_two_region_memory
+                EXPORT  __user_initial_stackheap
+__user_initial_stackheap
+
+                LDR     R0, =  Heap_Mem
+                LDR     R1, =(Stack_Mem + Stack_Size)
+                LDR     R2, = (Heap_Mem +  Heap_Size)
+                LDR     R3, = Stack_Mem
+                BX      LR
+
+                ALIGN
+
+                ENDIF
+
+                END

+ 76 - 0
bsp/essemi/es8p508x/libraries/CMSIS/system_ES8P508x.c

@@ -0,0 +1,76 @@
+/***************************************************************
+*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+*文件名:  system_ES8P508x.c
+*作  者:  Liut
+*版  本:  V1.00
+*日  期:  2017/07/14
+*描  述:  库函数配置文件
+*备  注:  适用于 ES8P508x芯片
+           本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+***************************************************************/
+#include "system_ES8P508x.h"
+#include "lib_config.h"
+
+uint32_t SystemCoreClock = 48000000;
+
+
+/***************************************************************
+函数名:SystemCoreClockUpdate
+描  述:系统时钟配置为内部时钟20MHZ,同时设置SystemCoreClock
+输入值:无
+输出值:无
+返回值:无
+***************************************************************/
+void SystemCoreClockUpdate (void)
+{
+    uint32_t Prot_Temp;
+    uint16_t Count=0;
+    SystemClockSelect(SCU_SysClk_HRC , CLK_SEL_HRC);        //选择系统时钟为HRC时钟
+    PLLClock_Config(DISABLE, SCU_PLL_HRC, SCU_PLL_48M,ENABLE);    //PLL禁止
+    Prot_Temp = SCU->PROT.PROT;
+    if(Prot_Temp != 0)                                      //写保护了
+        {SCU->PROT.Word = 0x55AA6996;}                      //解锁
+
+    SCU->SCLKEN1.HRC_EN = 1;                                //使能内部20MHZ
+    do
+    {
+        Count++;
+    }
+    while((SCU->SCLKEN1.HRC_RDY == 0)&&(Count != 0xFFF));   //等待时钟开启
+
+    if(Count == 0xFFF)
+    {
+        return ;
+    }
+
+    SCU->SCLKEN0.SYSCLK_DIV = 0;                            //系统时钟后分频1:1
+
+    switch(SCU->SCLKEN0.CLK_SEL)
+    {
+        case 0:
+            SystemCoreClock = 20000000;                     //HRC
+            break;
+        case 1:
+            SystemCoreClock = 32000;                        //LRC
+            break;
+        default:
+            break;
+    }
+
+    if(Prot_Temp != 0)                                      //写保护了
+        {SCU->PROT.Word = 0x00000000;}                      //打开写保护
+}
+
+/***************************************************************
+函数名:SystemInit
+描  述:系统初始化,设置时钟
+输入值:无
+输出值:无
+返回值:无
+***************************************************************/
+void SystemInit (void)
+{
+    SystemCoreClockUpdate();
+}
+
+/*************************END OF FILE**********************/

+ 23 - 0
bsp/essemi/es8p508x/libraries/CMSIS/system_ES8P508x.h

@@ -0,0 +1,23 @@
+/***************************************************************
+*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+*文件名:  system_ES8P508x.h
+*作  者:  Liut
+*版  本:  V1.00
+*日  期:  2017/07/14
+*描  述:  库函数配置文件
+*备  注:  适用于 ES8P508x芯片
+           本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+***************************************************************/
+#ifndef __SYSTEMES8P508x_H__
+#define __SYSTEMES8P508x_H__
+
+#include "ES8P508x.h"
+#include "type.h"
+
+extern uint32_t SystemCoreClock;
+extern void SystemInit(void);
+extern void SystemCoreClockUpdate(void);
+
+#endif
+
+/*************************END OF FILE**********************/

+ 17 - 0
bsp/essemi/es8p508x/libraries/Library/Include/irqhandler.h

@@ -0,0 +1,17 @@
+
+#ifndef __IRQHANDLER_H__
+#define __IRQHANDLER_H__
+
+#include "ES8P508x.h"
+
+extern void systick_irq_cbk(void);
+
+/************ÖжϺ¯ÊýÉùÃ÷***********/
+void NMI_IRQHandler(void);
+void HardFault_IRQHandler(void);
+void SVC_IRQHandler(void);
+void PendSV_IRQHandler(void);
+void SysTick_IRQHandler(void);
+
+#endif
+

+ 239 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_adc.h

@@ -0,0 +1,239 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_timer.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  ADC模块库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBADC_H__
+#define __LIBADC_H__
+
+#include "ES8P508x.h"
+#include "type.h"
+
+/* 内部参考电压选择 */
+typedef enum {
+	ADC_VREF_SEL_2_0 = 0,	/* 内部参考电压2.048v*/
+	ADC_VREF_SEL_1_6 = 1,	/* 内部参考电压1.6v*/
+	ADC_VREF_SEL_MAX = 1,
+}ADC_TYPE_VREF_SEL;
+
+/* ADC时钟源选择 */
+typedef enum
+{
+    ADC_ClkS_PCLK = 0x0 ,   //时钟:PCLK
+    ADC_ClkS_PLL = 0x1 ,    //时钟:PLL
+    ADC_ClkS_32K = 0x2 ,    //时钟:ADCCLK(32KHZ)
+}ADC_TYPE_CLKS;
+
+/* ADC时钟源预分频 */
+typedef enum
+{
+    ADC_ClkDiv_1 = 0x0 ,   //预分频:1:1
+    ADC_ClkDiv_2 = 0x1 ,   //预分频:1:2
+    ADC_ClkDiv_4 = 0x2 ,   //预分频:1:4
+    ADC_ClkDiv_8 = 0x3 ,   //预分频:1:8
+    ADC_ClkDiv_16 = 0x4 ,  //预分频:1:16
+    ADC_ClkDiv_32 = 0x5 ,  //预分频:1:32
+    ADC_ClkDiv_64 = 0x6 ,  //预分频:1:64
+    ADC_ClkDiv_256 = 0x7 , //预分频:1:256
+}ADC_TYPE_CLKDIV;
+
+/* 正向参考电压选择 */
+typedef enum
+{
+    ADC_VrefP_Vcc = 0x0 ,    //正向参考电压:VDD电压
+    ADC_VrefP_Exter = 0x3 ,  //正向参考电压:外部参考电压
+}ADC_TYPE_VREFP;
+
+/* 采样模式选择 */
+typedef enum
+{
+    ADC_SMPS_SOFT = 0,      /* 软件控制 */
+    ADC_SMPS_HARD = 1,  /* 硬件控制 */
+}ADC_TYPE_SMPS;
+
+
+/* 转换速度选择 */
+typedef enum
+{
+    ADC_ConvSpeed_Low = 0x0 ,  //AD转换速度:低速
+    ADC_ConvSpeed_High = 0x1 , //AD转换速度:高速
+}ADC_TYPE_HSEN;
+
+/* ADC通道选择 */
+typedef enum
+{
+    ADC_CHS_AIN0 = 0,       /* 通道 0 */
+    ADC_CHS_AIN1 = 1,       /* 通道 1 */
+    ADC_CHS_AIN2 = 2,       /* 通道 2 */
+    ADC_CHS_AIN3 = 3,       /* 通道 3 */
+    ADC_CHS_AIN4 = 4,       /* 通道 4 */
+    ADC_CHS_AIN5 = 5,       /* 通道 5 */
+    ADC_CHS_AIN6 = 6,       /* 通道 6 */
+    ADC_CHS_AIN7 = 7,       /* 通道 7 */
+    ADC_CHS_AIN8 = 8,       /* 通道 8 */
+    ADC_CHS_AIN9 = 9,       /* 通道 9 */
+    ADC_CHS_AIN10 = 10,     /* 通道 10 */
+    ADC_CHS_AIN11 = 11,     /* 通道 11 */
+    ADC_CHS_AIN12 = 12,     /* 通道 12 */
+    ADC_CHS_AIN13 = 13,     /* 通道 13 */
+    ADC_CHS_AIN14 = 14,     /* 通道 14 */
+    ADC_CHS_AIN15 = 15,     /* 通道 15 */
+}ADC_TYPE_CHS;
+
+/*ADC core功耗选择位*/
+typedef enum
+{
+    ADC_LP_86ua = 2,     //ADC Core 功耗为86,推荐使用
+    ADC_LP_215ua = 0,    //ADC Core 功耗为215uA
+    ADC_LP_120ua = 1,    //ADC Core 功耗为120uA
+    ADC_LP_70ua = 3,    //ADC Core 功耗为70uA
+}ADC_TYPE_BUFLP;
+
+/*ADC 输入buff功耗选择位*/
+typedef enum
+{
+    ADC_BUFF_0ua = 0,     //ADC 输入buff功耗为0uA,推荐使用
+    ADC_BUFF_34ua = 1,    //ADC 输入buff功耗为34uA
+    ADC_BUFF_95ua = 2,     //ADC 输入buff功耗为95uA
+}ADC_TYPE_BUFEN;
+
+/* ADC IF 状态 */
+typedef enum 
+{
+    ADC_IF = 0x01,
+    ADC_IF_ACPMIN = 0x02,
+    ADC_IF_ACPMAX =0x04,
+    ADC_IF_ACPOVER = 0x08,
+}ADC_TYPE_IF;
+
+/* ADC IE 状态 */
+typedef enum 
+{
+    ADC_IE = 0x01,
+    ADC_IE_ACPMIN = 0x02,
+    ADC_IE_ACPMAX =0x04,
+    ADC_IE_ACPOVER = 0x08,
+}ADC_TYPE_IE;
+
+/* ADC初始化配置结构体定义 */
+typedef struct
+{
+    ADC_TYPE_CLKS  ADC_ClkS;      //ADCCON1:bit3 ADC时钟源选择 
+    ADC_TYPE_CLKDIV  ADC_ClkDiv;  //ADCCON1:bit2-0 ADC时钟源预分频 
+    ADC_TYPE_VREFP  ADC_VrefP;    //ADCCON1:bit9-8 ADC正向参考电压选择
+    ADC_TYPE_SMPS  ADC_SampS;     //ADCCON1:bit12 ADC采样模式选择
+    ADC_TYPE_CHS  ADC_ChS;        //ADCCHS:bit0-3 ADC模拟通道选择
+		//ADC_TYPE_VREF_SEL VREF_SEL;	  //参考电压选择
+		uint8_t ST;							      //硬件采样时间 (当控制模式为硬件时设置) 0~31
+    TYPE_FUNCEN ADC_VREFN;        //负向参考电压选择位
+    TYPE_FUNCEN ADC_VRBUF_EN;
+}ADC_InitStruType;
+
+/* 自动比较低阀值 选择*/
+typedef enum
+{
+    ADC_ACP_MIN_MIN = 0x0,      /* 容许的最小低阀值*/
+    ADC_ACP_MIN_MAX = 0xfff,    /* 容许的最大低阀值*/
+}ADC_TYPE_ACP_MIN;
+
+/* 自动比较高阀值 选择*/
+typedef enum
+{
+    ADC_ACP_MAX_MIN = 0x0,  /* 容许的最小高阀值*/
+    ADC_ACP_MAX_MAX = 0xfff,    /* 容许的最大高阀值*/
+}ADC_TYPE_ACP_MAX;
+
+/* 每次自动转换比较溢出时间选择 */
+typedef enum
+{
+    ADC_ACPC_OVFL_TIME_MAX = 0x9c3, /* 容许的最大溢出时间 */
+}ADC_TYPE_ACPC_OVFL_TIME;
+
+/* 自动转换比较次数 */
+typedef enum
+{
+    ADC_ACPC_TIMES_1 = 0,   /* 1次 */
+    ADC_ACPC_TIMES_2 = 1,   /* 2次 */
+    ADC_ACPC_TIMES_4 = 2,   /* 4次 */
+    ADC_ACPC_TIMES_8 = 3,   /* 8次 */
+    ADC_ACPC_TIMES_MAX = 3,
+}ADC_TYPE_ACPC_TIMES;
+
+/* ACP溢出时钟的时钟源 */
+typedef enum
+{
+    ADC_ACPC_CLKS_PCLK = 0,              /* PCLK */
+    ADC_ACPC_CLKS_LRC = 1,               /* LRC(32KHz) */
+}ADC_TYPE_ACPC_CLKS;
+
+typedef FuncState ADC_TYPE_CHOP_EN1, ADC_TYPE_CHOP_EN;
+typedef FuncState ADC_TYPE_VREF_EN,ADC_TYPE_IREF_EN;
+typedef FuncState ADC_TYPE_EN,ADC_TYPE_ACP_EN;
+
+/* 自动比较功能初始化结构体*/
+typedef struct
+{
+    ADC_TYPE_ACP_EN ACP_EN;                 /* 自动比较功能使能位*/
+    uint16_t ACPC_OVER_TIME;                /* 单次自动比较溢出时间(即使不想设置请设置成0) 0~0x9c3 */
+    ADC_TYPE_ACPC_TIMES ACPC_TIMES;         /* 单次自动比较次数(优先级高于溢出时间) */
+    uint16_t ACPC_MIN_TARGET;               /* 平均值最低阀值 (设置0xfff关闭) 0~0xfff */
+    uint16_t ACPC_MAX_TARGET;               /* 平均值最高阀值 (设置0x0关闭)     0~0xfff */
+}ADC_ACP_TypeDef;
+
+/************ADC模块宏定义***********/
+/* ADC使能控制 */
+#define ADC_Enable()  (ADC->CON0.EN = 0x1)
+#define ADC_Disable() (ADC->CON0.EN = 0x0)
+
+/* 自动比较功能使能*/
+#define ADC_ACP_Enable() (ADC->CON0.ACP_EN = 1)
+#define ADC_ACP_Disable() (ADC->CON0.ACP_EN = 0)
+
+/* ADC开始转换 */
+#define ADC_Start() (ADC->CON0.TRIG = 0x1)
+
+/* ADC采样软件控制 */
+#define ADC_SampStart() (ADC->CON1.SMPON = 0x1)
+#define ADC_SampStop()  (ADC->CON1.SMPON = 0x0)
+
+/* ADC VDD检测控制 */
+#define ADC_VDD5_FLAG_Enable() (ADC->CHS.VDD5_FLAG_EN = 0x1)
+#define ADC_VDD5_FLAG_Disable()  (ADC->CHS.VDD5_FLAG_EN = 0x0)
+
+/* ADC中断使能控制 */
+#define ADC_IE_Enable()  (ADC->IE.IE = 0x1)
+#define ADC_IE_Disable() (ADC->IE.IE = 0x0)
+
+#define ADC_ACPMINIE_Enable() (ADC->IE.ACPMINIE = 1)
+#define ADC_ACPMINIE_Disable() (ADC->IE.ACPMINIE = 0)
+
+#define ADC_ACPMAXIE_Enable() (ADC->IE.ACPMAXIE = 1)
+#define ADC_ACPMAXIE_Disable() (ADC->IE.ACPMAXIE = 0)
+
+#define ADC_ACPOVIE_Enable() (ADC->IE.ACPOVIE = 1)
+#define ADC_ACPOVIE_Disable() (ADC->IE.ACPOVIE = 0)
+
+/************ADC模块函数声明***********/
+void ADC_Init(ADC_InitStruType * ADC_InitStruct);
+void ADC_Set_CH(ADC_TYPE_CHS AdcCH);
+uint16_t ADC_GetConvValue(void);
+FlagStatus ADC_GetConvStatus(void);
+ErrorStatus ADC_ACPConfig(ADC_ACP_TypeDef *ADC_ACP_InitStruct);
+ErrorStatus ADC_SoftStart(void);
+ErrorStatus ADC_SoftStop(void);
+uint16_t ADC_GetACPMeanValue(void);
+uint16_t ADC_GetACPMinValue(void);
+uint16_t ADC_GetACPMaxValue(void);
+FlagStatus ADC_GetFlagStatus(ADC_TYPE_IF IFName);
+ITStatus ADC_GetITStatus(ADC_TYPE_IE IEName);
+ErrorStatus ADC_ClearIFStatus(ADC_TYPE_IF IFName);
+void ADC_Reset(void);
+
+#endif
+
+/*************************END OF FILE**********************/

+ 74 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_aes.h

@@ -0,0 +1,74 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_aes.c
+ *作  者:  zoux
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  AES模块库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBAES_H__
+#define __LIBAES_H__
+
+#include "ES8P508x.h"
+#include "type.h"
+
+/* 加密解密模式选择位 */
+typedef enum {
+	AES_MODE_DECRYPT = 0,	/* 解密 */
+	AES_MODE_ENCRYPT = 1,	/* 加密 */
+}AES_TYPE_MODE;
+
+/* 加密/解密控制位 */
+typedef enum {
+	AES_DONE_YES = 0,	/* 加密完成 */
+	AES_DONE_NO = 1,	/* 正在加密 */
+}AES_TYPE_DONE;
+
+/* 加解密数据结构体 */
+typedef struct {
+	uint32_t DATA[4];
+}AES_DATA_TypeDef;
+
+typedef enum {
+	AES_IF_IF = 0x80,
+}AES_TYPE_IF;
+
+typedef enum {
+	AES_IT_IT = 0x40,
+}AES_TYPE_IT;
+
+/* 加解密密钥结构体 */
+typedef struct {
+	uint32_t KEY[4];
+}AES_KEY_TypeDef;
+
+/* 加解密初始结构体 */
+typedef struct {
+	AES_TYPE_MODE MODE;	/* 加密或者解密 */
+}AES_InitStruType;
+
+/* 加解密使能,开始加密 */
+#define AES_Enable()	(AES->CON.GO_DONE = 1)
+/* 加密模块关闭 */
+#define AES_Disable()	(AES->CON.GO_DONE = 0)
+
+
+/********************* ADC模块函数声明 *********************/
+void AES_Init(AES_InitStruType * AES_InitStruct);
+void AES_WriteKey(uint32_t *AES_KEY);
+void AES_ReadKey(uint32_t * AES_KEY);
+
+void AES_WriteData(uint32_t *AES_DATA);
+void AES_ReadData(uint32_t * AES_DATA);
+
+void AES_ITConfig(AES_TYPE_IT AES_IE, TYPE_FUNCEN NewState);
+void AES_ClearITPendingBit(void);
+FlagStatus AES_GetFlagStatus(AES_TYPE_IF Flag);
+
+AES_TYPE_DONE AES_GetDoneStatus(void);
+void AES_Reset(void);
+
+#endif
+

+ 32 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_config.h

@@ -0,0 +1,32 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名:  lib_config.h
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  库函数配置文件
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBCONFIG_H__
+#define __LIBCONFIG_H__
+
+#include "lib_adc.h"
+#include "lib_iic.h"
+#include "lib_scs.h"
+#include "lib_scu.h"
+#include "lib_spi.h"
+#include "lib_timer.h"
+#include "lib_uart.h"
+#include "lib_wdt.h"
+#include "lib_flashiap.h"
+#include "lib_gpio.h"
+#include "lib_printf.h"
+#include "lib_iap.h"
+#include "lib_crc.h"
+#include "lib_aes.h"
+#include "lib_rtc.h"
+
+#endif
+
+/*************************END OF FILE**********************/

+ 93 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_crc.h

@@ -0,0 +1,93 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名:  
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBCRC_H
+#define __LIBCRC_H
+
+#include "ES8P508x.h"
+#include "type.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CRC_EmptayCheck_addr    0x10000010
+#define CRC_FlashVerify_addr    0x10000014
+#define CRC_UserCal_addr        0x10000018
+#define CRC_CheckReset_addr     0x1000001C
+
+typedef uint32_t (*CRC_EM)(void* address, uint32_t data_len);
+typedef uint32_t (*CRC_FL)(void* address, uint32_t data_len, uint32_t type);
+typedef uint32_t (*CRC_US)(void* address, uint32_t data_len, uint32_t type);
+typedef uint32_t (*CRC_CH)(void);
+	
+
+typedef enum
+{
+    CRC_XOROUT_NORMAL = 0x0,   //数据输出不取反
+    CRC_XOROUT_ANTI = (1U<<14),   //数据输出取反
+} CRC_XOROUT;
+
+typedef enum
+{
+    CRC_REFOUT_NORMAL = 0x0,   //数据输出正序
+    CRC_REFOUT_REVERSE = (1U<<13),   //数据输出倒序
+} CRC_REFOUT;
+
+typedef enum
+{
+    CRC_REFIN_NORMAL = 0x0,   //数据输入正序
+    CRC_REFIN_REVERSE = (1U<<12),   //数据输入倒序
+} CRC_REFIN;
+
+
+typedef enum
+{
+    CRC_MOD_CRC32 = 0x0,	     //CRC位宽为字节
+    CRC_MOD_CRC16 = (2U<<8),   //CRC位宽为半字
+    CRC_MOD_CRC16_CCITT = (3U<<8),   //CRC位宽为字
+} CRC_MOD_TYPE;
+
+typedef enum
+{
+    CRC_INIT_DATA_ALL_0 = 0x0,	     //CRC初始化数据全为0
+    CRC_INIT_DATA_ALL_1 = (1U<<3),   //CRC初始化数据全为1
+} CRC_INIT_DATA;
+
+typedef enum
+{
+    CRC_HS_TYPE_DISABLE = 0x0,	     //CRC高速模式禁止
+    CRC_HS_TYPE_ENABLE = (1U<<2),   //CRC高速模式使能,当CRC时钟小于24M时才能使能
+} CRC_HS_TYPE;
+
+
+/*CRC_CON 数据配置值结构体初始化*/
+typedef struct 
+{
+	CRC_XOROUT xorout;
+	CRC_REFOUT refout;
+	CRC_REFIN  refin;
+	CRC_MOD_TYPE mode;
+	CRC_INIT_DATA init_data_type;
+	CRC_HS_TYPE hs_type;
+} CRC_CONValueStruType;
+
+uint32_t CRC_getTypeValue(CRC_CONValueStruType con_value);
+uint32_t CRC_EmptayCheck(void* address, uint32_t data_len);
+uint32_t CRC_FlashVerify(void* address, uint32_t data_len, uint32_t type);
+uint32_t CRC_UserCal(void* address, uint32_t data_len, uint32_t type);
+uint32_t CRC_CheckReset(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/*************************END OF FILE**********************/

+ 44 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_flashiap.h

@@ -0,0 +1,44 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名: lib_flashiap.h
+ *作 者: Liut
+ *版 本: V1.00
+ *日 期: 2017/07/14
+ *描 述: flash读写库函数头文件
+ *备 注: 适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBIAP_H__
+#define __LIBIAP_H__
+
+#include "ES8P508x.h"
+#include "type.h"
+
+/*************IAP模块宏定义************/
+
+/* 寄存器解锁 */
+#define FlashIAP_RegUnLock() (IAP->UL.UL = 0x49415055)
+#define FlashIAP_RegLock()   (IAP->UL.UL = 0x00000000)
+
+/* 使能IAP */
+#define FlashIAP_Enable()  (IAP->CON.EN = 0x1)
+#define FlashIAP_Disable() (IAP->CON.EN = 0x0)
+
+/* 访问IAP请求 */
+#define FlashIAP_REQ() (IAP->CON.FLASH_REQ = 0x1)
+
+/************Flash模块函数声明***********/
+ErrorStatus FlashIap_Close_WPROT(uint8_t Page);
+ErrorStatus FlashIap_Open_WPROT(uint8_t Page);
+ErrorStatus FlashIap_CloseAll_WPROT(void);
+ErrorStatus FlashIap_OpenAll_WPROT(void);
+ErrorStatus FlashIap_Unlock(void);
+ErrorStatus FlashIap_WriteEnd(void);
+ErrorStatus FlashIap_ErasePage(uint8_t Page_Addr);
+ErrorStatus FlashIap_WriteCont(uint8_t Unit_addr, uint8_t Page_addr, uint32_t Data32);
+ErrorStatus FlashIap_WriteWord(uint8_t Unit_addr, uint8_t Page_addr, uint32_t Data32);
+ErrorStatus Flash_Read(uint32_t * Ram_Addr, uint32_t Flash_Addr, uint8_t Len);
+
+#endif
+/*************************END OF FILE**********************/
+

+ 243 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_gpio.h

@@ -0,0 +1,243 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名: lib_gpio.h
+ *作 者: Liut
+ *版 本: V1.00
+ *日 期: 2017/07/14
+ *描 述: GPIO模块及外部中断、按键中断库函数头文件
+ *备 注: 适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBGPIO_H__
+#define __LIBGPIO_H__
+
+#include "ES8P508x.h"
+#include "type.h"
+
+/*状态定义*/
+
+/*端口定义*/
+typedef enum
+{
+    GPIOA = 0x0 ,
+    GPIOB = 0x1 ,
+}GPIO_TYPE;
+
+/*引脚定义*/
+typedef enum
+{
+    GPIO_Pin_0 = 0x00,
+    GPIO_Pin_1 = 0x01,
+    GPIO_Pin_2 = 0x02,
+    GPIO_Pin_3 = 0x03,
+    GPIO_Pin_4 = 0x04,
+    GPIO_Pin_5 = 0x05,
+    GPIO_Pin_6 = 0x06,
+    GPIO_Pin_7 = 0x07,
+    GPIO_Pin_8 = 0x08,
+    GPIO_Pin_9 = 0x09,
+    GPIO_Pin_10 = 0x0A,
+    GPIO_Pin_11 = 0x0B,
+    GPIO_Pin_12 = 0x0C,
+    GPIO_Pin_13 = 0x0D,
+    GPIO_Pin_14 = 0x0E,
+    GPIO_Pin_15 = 0x0F,
+    GPIO_Pin_16 = 0x10,
+    GPIO_Pin_17 = 0x11,
+    GPIO_Pin_18 = 0x12,
+    GPIO_Pin_19 = 0x13,
+    GPIO_Pin_20 = 0x14,
+    GPIO_Pin_21 = 0x15,
+    GPIO_Pin_22 = 0x16,
+    GPIO_Pin_23 = 0x17,
+    GPIO_Pin_24 = 0x18,
+    GPIO_Pin_25 = 0x19,
+    GPIO_Pin_26 = 0x1A,
+    GPIO_Pin_27 = 0x1B,
+    GPIO_Pin_28 = 0x1C,
+    GPIO_Pin_29 = 0x1D,
+    GPIO_Pin_30 = 0x1E,
+    GPIO_Pin_31 = 0x1F,
+}GPIO_TYPE_PIN;
+
+/* 引脚功能选择 */
+typedef enum
+{
+    GPIO_Func_0 = 0x0 ,
+    GPIO_Func_1 = 0x1 ,
+    GPIO_Func_2 = 0x2 ,
+    GPIO_Func_3 = 0x3 ,
+}GPIO_TYPE_FUNC;
+
+/* 引脚方向选择 */
+typedef enum
+{
+    GPIO_Dir_Out = 0x0 ,
+    GPIO_Dir_In = 0x1 ,
+}GPIO_TYPE_DIR;
+
+/* 引脚输出电流驱动能力选择 */
+typedef enum
+{
+    GPIO_DS_Output_Normal = 0,  // 普通电流输出
+    GPIO_DS_Output_Strong = 1,  // 强电流输出
+} GPIO_TYPE_DS;
+
+/* 引脚信号类型 */
+typedef enum {
+	GPIO_Pin_Signal_Digital = 0,	// 数字信号引脚
+	GPIO_Pin_Signal_Analog = 1,	  // 模拟信号引脚
+} GPIO_Pin_Signal;	
+
+/* 引脚输入弱上拉使能 */
+typedef enum {
+	GPIO_PUE_Input_Disable = 0,	// 弱上拉禁止
+	GPIO_PUE_Input_Enable = 1,	// 弱上拉使能
+} GPIO_PUE_Input;
+
+/* 引脚输入弱下拉使能 */
+typedef enum {
+	GPIO_PDE_Input_Disable = 0,	// 弱下拉禁止
+	GPIO_PDE_Input_Enable = 1,	// 弱下拉使能
+} GPIO_PDE_Input;
+
+
+/* 引脚输出开漏使能位 */
+typedef enum {
+	GPIO_ODE_Output_Disable = 0,	// 开漏禁止
+	GPIO_ODE_Output_Enable = 1,	// 开漏使能
+} GPIO_ODE_Output;
+
+/* GPIO初始化配置结构体定义 */
+typedef struct
+{
+	  GPIO_Pin_Signal GPIO_Signal;		/* 引脚上的信号类型,只有模拟和数字两种 */
+    GPIO_TYPE_FUNC GPIO_Func;       //引脚功能选择
+    GPIO_TYPE_DIR GPIO_Direction;   //方向选择
+    GPIO_PUE_Input GPIO_PUEN;          //上拉使能
+    GPIO_PDE_Input GPIO_PDEN;          //下拉使能
+    GPIO_ODE_Output GPIO_OD;            //输出模式开漏使能
+    GPIO_TYPE_DS GPIO_DS;           //驱动电流控制
+}GPIO_InitStruType;
+
+/* PINT */
+typedef enum
+{
+    PINT0 = 0x0 ,
+    PINT1 = 0x1 ,
+    PINT2 = 0x2 ,
+    PINT3 = 0x3 ,
+    PINT4 = 0x4 ,
+    PINT5 = 0x5 ,
+    PINT6 = 0x6 ,
+    PINT7 = 0x7 ,
+}PINT_TYPE;
+
+/* PINT SEL */
+typedef enum
+{
+    PINT_SEL0 = 0x0 ,
+    PINT_SEL1 = 0x1 ,
+    PINT_SEL2 = 0x2 ,
+    PINT_SEL3 = 0x3 ,
+    PINT_SEL4 = 0x4 ,
+    PINT_SEL5 = 0x5 ,
+    PINT_SEL6 = 0x6 ,
+    PINT_SEL7 = 0x7 ,
+}PINT_TYPE_SEL;
+
+/* PINT Trigger */
+typedef enum
+{
+    PINT_Trig_Rise = 0x0 ,
+    PINT_Trig_Fall = 0x1 ,
+    PINT_Trig_High = 0x2 ,
+    PINT_Trig_Low = 0x3 ,
+    PINT_Trig_Change = 0x4 ,
+}PINT_TYPE_TRIG;
+
+
+/* PINT中断标志 */
+typedef enum
+{
+    PINT_IT_PINT0 = 0x01 ,
+    PINT_IT_PINT1 = 0x02 ,
+    PINT_IT_PINT2 = 0x04 ,
+    PINT_IT_PINT3 = 0x08 ,
+    PINT_IT_PINT4 = 0x10 ,
+    PINT_IT_PINT5 = 0x20 ,
+    PINT_IT_PINT6 = 0x40 ,
+    PINT_IT_PINT7 = 0x80 ,
+    PINT_IT_PINTAll = 0xFF ,
+}PINT_TYPE_IT;
+
+/* PINT使能控制 */
+#define PINT0_Enable() (GPIO->PINTIE.PINTIE |= 0X1)
+#define PINT1_Enable() (GPIO->PINTIE.PINTIE |= 0x2)
+#define PINT2_Enable() (GPIO->PINTIE.PINTIE |= 0x4)
+#define PINT3_Enable() (GPIO->PINTIE.PINTIE |= 0x8)
+#define PINT4_Enable() (GPIO->PINTIE.PINTIE |= 0x10)
+#define PINT5_Enable() (GPIO->PINTIE.PINTIE |= 0x20)
+#define PINT6_Enable() (GPIO->PINTIE.PINTIE |= 0x40)
+#define PINT7_Enable() (GPIO->PINTIE.PINTIE |= 0x80)
+#define PINT0_Disable() (GPIO->PINTIE.PINTIE &= ~0x01)
+#define PINT1_Disable() (GPIO->PINTIE.PINTIE &= ~0x02)
+#define PINT2_Disable() (GPIO->PINTIE.PINTIE &= ~0x04)
+#define PINT3_Disable() (GPIO->PINTIE.PINTIE &= ~0x08)
+#define PINT4_Disable() (GPIO->PINTIE.PINTIE &= ~0x10)
+#define PINT5_Disable() (GPIO->PINTIE.PINTIE &= ~0x20)
+#define PINT6_Disable() (GPIO->PINTIE.PINTIE &= ~0x40)
+#define PINT7_Disable() (GPIO->PINTIE.PINTIE &= ~0x80)
+
+/* PINT屏蔽使能控制 */
+#define PINT0_MaskEnable()   (GPIO->PINTIE.PMASK |= 0X01)
+#define PINT1_MaskEnable()   (GPIO->PINTIE.PMASK |= 0x02)
+#define PINT2_MaskEnable()   (GPIO->PINTIE.PMASK |= 0x04)
+#define PINT3_MaskEnable()   (GPIO->PINTIE.PMASK |= 0x08)
+#define PINT4_MaskEnable()   (GPIO->PINTIE.PMASK |= 0x10)
+#define PINT5_MaskEnable()   (GPIO->PINTIE.PMASK |= 0x20)
+#define PINT6_MaskEnable()   (GPIO->PINTIE.PMASK |= 0x40)
+#define PINT7_MaskEnable()   (GPIO->PINTIE.PMASK |= 0x80)
+#define PINT0_MaskDisable()  (GPIO->PINTIE.PMASK &= ~0x01)
+#define PINT1_MaskDisable()  (GPIO->PINTIE.PMASK &= ~0x02)
+#define PINT2_MaskDisable()  (GPIO->PINTIE.PMASK &= ~0x04)
+#define PINT3_MaskDisable()  (GPIO->PINTIE.PMASK &= ~0x08)
+#define PINT4_MaskDisable()  (GPIO->PINTIE.PMASK &= ~0x10)
+#define PINT5_MaskDisable()  (GPIO->PINTIE.PMASK &= ~0x20)
+#define PINT6_MaskDisable()  (GPIO->PINTIE.PMASK &= ~0x40)
+#define PINT7_MaskDisable()  (GPIO->PINTIE.PMASK &= ~0x80)
+
+/* PINT清除所有中断标记 */
+#define PINT_ClearAllITPending() (GPIO->PIF.Word = (uint32_t)0xff)
+
+void GPIO_Init(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_InitStruType* GPIO_InitStruct);
+void GPIO_Write(GPIO_TYPE GPIOx, uint32_t Value);
+uint32_t GPIO_Read(GPIO_TYPE GPIOx);
+PinStatus GPIO_ReadBit(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx);
+void GPIOA_SetBit(GPIO_TYPE_PIN PINx);
+void GPIOA_ResetBit(GPIO_TYPE_PIN PINx);
+void GPIOA_ToggleBit(GPIO_TYPE_PIN PINx);
+void GPIOB_SetBit(GPIO_TYPE_PIN PINx);
+void GPIOB_ResetBit(GPIO_TYPE_PIN PINx);
+void GPIOB_ToggleBit(GPIO_TYPE_PIN PINx);
+void GPIOA_SetDirection(GPIO_TYPE_PIN PINx, GPIO_TYPE_DIR Dir_Type);
+void GPIOB_SetDirection(GPIO_TYPE_PIN PINx, GPIO_TYPE_DIR Dir_Type);
+void PINT_Config(PINT_TYPE PINTx, PINT_TYPE_SEL SELx, PINT_TYPE_TRIG TRIGx);
+void GPIO_SetSingalTypeFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_Pin_Signal GPIO_Signal);
+void GPIO_SetDirRegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_TYPE_DIR Dir);
+void GPIO_SetODERegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_ODE_Output ODE);
+void GPIO_SetDSRegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_TYPE_DS DS);
+void GPIO_SetPUERegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_PUE_Input PUE);
+void GPIO_SetPDERegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_PDE_Input PDE);
+void GPIO_SetFuncxRegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_TYPE_FUNC Func);
+FlagStatus PINT_GetIFStatus(PINT_TYPE_IT PINT_Flag);
+FlagStatus PINT_GetITStatus(PINT_TYPE_IT PINT_Flag);
+void PINT_ClearITPendingBit(PINT_TYPE_IT PINT_Flag);
+
+#endif
+
+
+
+
+
+

+ 42 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_iap.h

@@ -0,0 +1,42 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名:  
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __ES8P508x_IAP_TABLE_H
+#define __ES8P508x_IAP_TABLE_H
+
+#include "ES8P508x.h"
+#include "type.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define IAP_PageProgram_addr    0x10000008
+#define IAP_PageErase_addr      0x10000000
+#define IAP_WordProgram_addr    0x10000004
+
+typedef ErrorStatus (*IAP_PE)(uint32_t address);
+typedef ErrorStatus (*IAP_WP)(uint32_t address, uint32_t data);
+typedef ErrorStatus (*IAP_PP)(uint32_t address, uint32_t data[], uint32_t length, uint32_t erase);
+
+ErrorStatus IAP_PageErase(uint32_t address);
+ErrorStatus IAP_WordProgram(uint32_t address, uint32_t data);
+ErrorStatus IAP_PageProgram(uint32_t address, uint32_t data[], uint32_t length, uint32_t erase);
+ErrorStatus IAPRead(uint32_t *Ram_Addr, uint32_t Flash_Addr, uint8_t Len);
+
+#define PageEraseEnable             0x00000001
+#define PageEraseDisable            0x00000000
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/*************************END OF FILE**********************/

+ 229 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_iic.h

@@ -0,0 +1,229 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名: lib_iic.h
+ *作 者: Liut
+ *版 本: V1.00
+ *日 期: 2017/07/14
+ *描 述: I2C模块库函数头文件
+ *备 注: 适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBIIC_H__
+#define __LIBIIC_H__
+
+#include "ES8P508x.h"
+#include "type.h"
+#include "system_ES8P508x.h"
+
+/* 引脚开漏设置 */
+typedef enum
+{
+    I2C_PinMode_PP = 0x0 , //端口输出模式:推挽
+    I2C_PinMode_OD = 0x1 , //端口输出模式:开漏
+}I2C_TYPE_PINOD;
+
+/* 工作模式 */
+typedef enum
+{
+    I2C_Mode_Master = 0x0 , //工作模式:主
+    I2C_Mode_Slave = 0x1 ,  //工作模式:从
+}I2C_TYPE_MODE;
+
+/* 应答延时 */
+typedef enum
+{
+    I2C_AckDelay_0P5 = 0x0 , //应答延时:0.5个时钟周期
+    I2C_AckDelay_1 = 0x1 ,   //应答延时:1个时钟周期
+    I2C_AckDelay_1P5 = 0x2 , //应答延时:1.5个时钟周期
+    I2C_AckDelay_2 = 0x3 ,   //应答延时:2个时钟周期
+    I2C_AckDelay_2P5 = 0x4 , //应答延时:2.5个时钟周期
+    I2C_AckDelay_3 = 0x5 ,   //应答延时:3个时钟周期
+    I2C_AckDelay_3P5 = 0x6 , //应答延时:3.5个时钟周期
+    I2C_AckDelay_4 = 0x7 ,   //应答延时:4个时钟周期
+}I2C_TYPE_ADLY;
+
+/* 接收模式 */
+typedef enum
+{
+    I2C_RecMode_0 = 0x0 , //接收模式:接收1字节,发送ACK
+    I2C_RecMode_1 = 0x1 , //接收模式:接收1字节,发送NACK
+    I2C_RecMode_2 = 0x2 , //接收模式:接收2字节,每字节发送ACK
+    I2C_RecMode_3 = 0x3 , //接收模式:接收2字节,前一字节发送ACK,后一字节发送NACK
+    I2C_RecMode_4 = 0x4 , //接收模式:接收4字节,每字节发送ACK
+    I2C_RecMode_5 = 0x5 , //接收模式:接收4字节,前3字节发送ACK,后一字节发送NACK
+    I2C_RecMode_6 = 0x6,  //接收模式:连续接收,每个字节发送ACK
+    I2C_RecMode_7 = 0x7,  //接收模式:完成该字节接收,发送NACK
+}I2C_TYPE_RECMODE;
+
+/* 数据帧传输间隔 */
+typedef enum
+{
+    I2C_TI_Disable = 0x0 , //数据帧传输间隔:0
+    I2C_TI_1 = 0x1 ,       //数据帧传输间隔:1
+    I2C_TI_2 = 0x2 ,       //数据帧传输间隔:2
+    I2C_TI_3 = 0x3 ,       //数据帧传输间隔:3
+    I2C_TI_4 = 0x4 ,       //数据帧传输间隔:4
+    I2C_TI_5 = 0x5 ,       //数据帧传输间隔:5
+    I2C_TI_6 = 0x6 ,       //数据帧传输间隔:6
+    I2C_TI_7 = 0x7 ,       //数据帧传输间隔:7
+    I2C_TI_8 = 0x8 ,       //数据帧传输间隔:8
+    I2C_TI_9 = 0x9 ,       //数据帧传输间隔:9
+    I2C_TI_10 = 0xA ,      //数据帧传输间隔:10
+    I2C_TI_11 = 0xB ,      //数据帧传输间隔:11
+    I2C_TI_12 = 0xC ,      //数据帧传输间隔:12
+    I2C_TI_13 = 0xD ,      //数据帧传输间隔:13
+    I2C_TI_14 = 0xE ,      //数据帧传输间隔:14
+    I2C_TI_15 = 0xF ,      //数据帧传输间隔:15
+}I2C_TYPE_TIS;
+
+/* I2C初始化配置结构体定义 */
+typedef struct
+{
+    I2C_TYPE_PINOD  I2C_SclOd; //SCL端口输出模式
+
+    I2C_TYPE_PINOD  I2C_SdaOd; //SDA端口输出模式
+
+    TYPE_FUNCEN  I2C_16XSamp;  //端口16倍速采样使能
+
+    uint32_t  I2C_Clk;         //I2C频率
+
+    I2C_TYPE_MODE  I2C_Mode;   //工作模式
+
+    TYPE_FUNCEN  I2C_AutoStop; //自动停止
+
+    TYPE_FUNCEN  I2C_AutoCall; //自动寻呼
+}I2C_InitStruType;
+
+/* 发送、接收中断模式 */
+typedef enum
+{
+    I2C_TRBIM_Byte = 0x0 ,     //字节满产生中断
+    I2C_TRBIM_HalfWord = 0x1 , //半字满产生中断
+    I2C_TRBIM_Word = 0x2 ,     //字满产生中断
+}I2C_TYPE_TRBIM;
+
+
+/* 读写模式 */
+typedef enum
+{
+    I2C_Mode_Write = 0x0 , 
+    I2C_Mode_Read = 0x1 ,
+}I2C_TYPE_RWMODE;
+
+/* 中断使能标志位 */
+typedef enum
+{
+    I2C_IT_SR = 0x0001 ,   //起始位
+    I2C_IT_SP = 0x0002 ,   //停止位
+    I2C_IT_TB = 0x0004 ,   //发送缓冲空
+    I2C_IT_RB = 0x0008 ,   //接收缓冲满
+    I2C_IT_TE = 0x0010 ,   //发送数据错误
+    I2C_IT_RO = 0x0020 ,   //接收数据溢出
+    I2C_IT_NA = 0x0040 ,   //未应答NACK
+    I2C_IT_TBWE = 0x0080 , //发送数据写错误
+    I2C_IT_TIDLE = 0x01000 , //发送空闲中断
+}I2C_TYPE_IT;
+
+/* 中断标志位 */
+typedef enum
+{
+    I2C_Flag_SR = 0x0001 ,    //起始位
+    I2C_Flag_SP = 0x0002 ,    //停止位
+    I2C_Flag_TB = 0x0004 ,    //发送缓冲空
+    I2C_Flag_RB = 0x0008 ,    //接收缓冲满
+    I2C_Flag_TE = 0x0010 ,    //发送数据错误
+    I2C_Flag_RO = 0x0020 ,    //接收数据溢出
+    I2C_Flag_NA = 0x0040 ,    //未应答NACK
+    I2C_Flag_TBWE = 0x0080,  //发送数据写错误中断标志位
+    I2C_Flag_TIDLE= 0X1000,  //I2C 发送空闲中断标志位
+}I2C_TYPE_FLAG;
+
+
+/* 标志清除 */
+typedef enum
+{
+    I2C_Clr_SR = 0x0001 ,   //起始位
+    I2C_Clr_SP = 0x0002 ,   //停止位
+    I2C_Clr_TE = 0x0010 ,   //发送数据错误
+    I2C_Clr_RO = 0x0020 ,   //接收数据溢出
+    I2C_Clr_NA = 0x0040 ,   //未应答NACK
+    I2C_Clr_TBWE = 0x0080 , //发送数据写错误
+    I2C_Clr_TIDLE= 0X01000,  //I2C 发送空闲
+}I2C_CLR_IF;
+
+
+/*************I2C模块宏定义************/
+
+/* I2C模块使能控制 */
+#define I2C_Enable() (I2C0->CON.EN = 1)
+#define I2C_Disable() (I2C0->CON.EN = 0)
+
+/* I2C模块复位 */
+#define I2C_Reset() (I2C0->CON.RST = 1)
+
+/* I2C时基使能控制 */
+#define I2C_TJEnable() (I2C0->CON.TJE = 1)
+#define I2C_TJDisable() (I2C0->CON.TJE = 0)
+
+/* I2C主控模式读写控制 */
+#define I2C_Read() (I2C0->CON.RW = 1)
+#define I2C_Write() (I2C0->CON.RW = 0)
+
+/* I2C时钟自动下拉等待使能控制(仅从机模式支持) */
+#define I2C_CSEnable() (I2C0->MOD.CSE = 1)
+#define I2C_CSDisable() (I2C0->MOD.CSE = 0)
+
+/* I2C自动发送未应答使能控制(仅从机模式支持) */
+#define I2C_ANAEnable() (I2C0->MOD.ANAE = 1)
+#define I2C_ANADisable() (I2C0->MOD.ANAE = 0)
+
+/* I2C自动寻呼使能控制(仅主机模式支持) */
+#define I2C_SRAEnable() (I2C0->MOD.SRAE = 1)
+#define I2C_SRADisable() (I2C0->MOD.SRAE = 0)
+
+/* I2C自动结束使能控制(仅主机模式支持) */
+#define I2C_SPAEnable() (I2C0->MOD.SPAE = 1)
+#define I2C_SPADisable() (I2C0->MOD.SPAE = 0)
+
+/* I2C起始位触发(仅主机模式支持) */
+#define I2C_SRTrigger() (I2C0->MOD.SRT=1)
+
+/* I2C停止位触发(仅主机模式支持) */
+#define I2C_SPTrigger() (I2C0->MOD.SPT = 1)
+
+/* I2C接收数据触发(仅主机模式支持) */
+#define I2C_RDTrigger() (I2C0->MOD.RDT = 1)
+
+
+/* I2C总线释放 */
+#define I2C_Release() (I2C0->MOD.BLD = 1)
+
+/* I2C发送应答设置(仅从机模式支持) */
+#define I2C_TACK() (I2C0->MOD.TAS = 1)
+#define I2C_TNACK() (I2C0->MOD.TAS = 0)
+
+/************I2C模块函数声明***********/
+void I2C_Init(I2C_InitStruType* I2C_InitStruct);
+void I2C_ITConfig(I2C_TYPE_IT I2C_IT,TYPE_FUNCEN NewState);
+void I2C_SendAddress(uint8_t I2C_Address,I2C_TYPE_RWMODE Mode);
+void I2C_SetAddress(uint8_t I2C_Address);
+void I2C_RecModeConfig(I2C_TYPE_RECMODE RecType);
+void I2C_TBIMConfig(I2C_TYPE_TRBIM Type);
+void I2C_RBIMConfig(I2C_TYPE_TRBIM Type);
+void I2C_AckDelay(I2C_TYPE_ADLY Type,TYPE_FUNCEN NewStatus);
+void I2C_TISConfig(I2C_TYPE_TIS Time);
+void I2C_SendByte(uint8_t Byte);
+void I2C_SendHalfWord(uint16_t HalfWord);
+void I2C_SendWord(uint32_t Word);
+uint8_t I2C_RecByte(void);
+uint16_t I2C_RecHalfWord(void);
+uint32_t I2C_RecWord(void);
+I2C_TYPE_RWMODE I2C_GetRWMode(void);
+FlagStatus I2C_GetTBStatus(void);
+FlagStatus I2C_GetFlagStatus(I2C_TYPE_FLAG I2C_Flag);
+FlagStatus I2C_GetITStatus( I2C_TYPE_IT I2C_Flag);
+void I2C_ClearITPendingBit(I2C_CLR_IF I2C_IT);
+
+#endif
+
+/*************************END OF FILE**********************/

+ 33 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_printf.h

@@ -0,0 +1,33 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名:  lib_printf.h
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  串口打印库函数头文件
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBPRINTF_H__
+#define __LIBPRINTF_H__
+
+#include "lib_uart.h"
+#include <stdio.h>
+#include "type.h"
+
+int fputc(int ch, FILE *f);
+static char *itoa(int value, char *string, int radix);
+ErrorStatus UART_printf(uint8_t *Data,...);
+
+#ifdef __clang__ 
+ErrorStatus UART_printf(uint8_t *Data, ...);
+
+#elif defined __CC_ARM
+
+#define UART_printf  printf
+
+#endif
+
+#endif
+
+/*************************END OF FILE**********************/

+ 84 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_rtc.h

@@ -0,0 +1,84 @@
+/*********************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名:  lib_rtc.h
+ *作  者:  WangMX
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  RTC模块程序头文件
+ *备  注:  适用于HRSDK-GDB-ES8P508x V1.1
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ **********************************************************/
+#ifndef __LIBRTC_H__
+#define __LIBRTC_H__
+
+#include "ES8P508x.h"
+#include "type.h"
+
+/*RTC时钟源选择*/
+typedef enum
+{
+    RTC_LOSC = 0x0,     //外部32768HZ时钟 RTC精确计时
+    RTC_LRC  = 0x1,     //内部LRC时钟 RTC非精确计时
+    RTC_PLCK_256 = 0x2, //PLCLK/256 RTC用作普通计数器
+    RTC_PLCK = 0x3,     //PCLK RTC用作普通计数器
+}RTC_TYPE_CLKS;
+
+/*RTC时钟12/24小时制选择*/
+typedef enum
+{
+    RTC_HOUR12 = 0x0, //12小时制
+    RTC_HOUR24 = 0x1, //24小时制
+}RTC_TYPE_TIME;
+
+/* RTC中断源选择 */
+typedef enum {
+    RTC_Interrupt_Source_Second = 0x001,    // 秒中断
+    RTC_Interrupt_Source_Minute = 0x002,    // 分中断
+    RTC_Interrupt_Source_Hour = 0x004,      // 小时中断
+    RTC_Interrupt_Source_Day = 0x008,       // 天中断
+    RTC_Interrupt_Source_Month = 0x010,     // 月中断
+    RTC_Interrupt_Source_DayALE = 0x100,    // 日闹钟中断
+    RTC_Interrupt_Source_WeekALE = 0x200,   // 周闹钟中断
+} RTC_Interrupt_Source;
+
+
+/********************* RTC模块函数声明 *********************/
+void RTC_Init(RTC_TYPE_CLKS CLKx,RTC_TYPE_TIME HOURx);
+uint32_t RTC_ReadHourmode(void);
+uint32_t RTC_ReadSecond(void);
+uint32_t RTC_ReadMinute(void);
+uint32_t RTC_ReadHour(uint32_t *meridiem);
+uint32_t RTC_ReadDay(void);
+uint32_t RTC_ReadMonth(void);
+uint32_t RTC_ReadYear(void);
+uint32_t RTC_ReadWeek(void);
+
+ErrorStatus RTC_WriteSecond(uint32_t second);
+ErrorStatus RTC_WriteMinute(uint32_t minute);
+ErrorStatus RTC_WriteHour(uint32_t hour, uint32_t meridiem);
+ErrorStatus RTC_WriteDay(uint32_t day);
+ErrorStatus RTC_WriteMonth(uint32_t month);
+ErrorStatus RTC_WriteYear(uint32_t year);
+ErrorStatus RTC_WriteWeek(uint32_t week);
+
+uint32_t RTC_ReadWeekAlarmMinute(void);
+uint32_t RTC_ReadWeekAlarmHour(uint32_t *meridiem);
+uint32_t RTC_ReadWeekAlarmWeek(void);
+uint32_t RTC_ReadDayAlarmMinute(void);
+uint32_t RTC_ReadDayAlarmHour(uint32_t *meridiem);
+
+ErrorStatus RTC_WriteWeekAlarmMinute(uint32_t minute);
+ErrorStatus RTC_WriteWeekAlarmHour(uint32_t hour, uint32_t meridiem);
+ErrorStatus RTC_WriteWeekAlarmWeek(uint32_t week);
+ErrorStatus RTC_WriteDayAlarmMinute(uint32_t minute);
+ErrorStatus RTC_WriteDayAlarmHour(uint32_t hour, uint32_t meridiem);
+
+void RTC_InterruptEnable(RTC_Interrupt_Source src);
+void RTC_InterruptDisable(RTC_Interrupt_Source src);
+ITStatus RTC_GetITStatus(RTC_Interrupt_Source src);
+FlagStatus RTC_GetFlagStatus(RTC_Interrupt_Source src);
+void RTC_ClearITPendingBit(RTC_Interrupt_Source src);
+
+#endif
+
+/*************************END OF FILE**********************/

+ 98 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_scs.h

@@ -0,0 +1,98 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名: lib_scs.h
+ *作 者: Liut
+ *版 本: V1.00
+ *日 期: 2017/07/14
+ *描 述: 内核模块库函数头文件
+ *备 注: 适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBNVIC_H__
+#define __LIBNVIC_H__
+
+#include "ES8P508x.h"
+#include "type.h"
+
+/* 中断源选择 */
+typedef enum
+{
+    NVIC_PINT0_IRQn = 0,
+    NVIC_PINT1_IRQn = 1,
+    NVIC_PINT2_IRQn = 2,
+    NVIC_PINT3_IRQn = 3,
+    NVIC_PINT4_IRQn = 4,
+    NVIC_PINT5_IRQn = 5,
+    NVIC_PINT6_IRQn = 6,
+    NVIC_PINT7_IRQn = 7,
+    NVIC_T16N0_IRQn = 8,
+    NVIC_T16N1_IRQn = 9,
+    NVIC_T16N2_IRQn = 10,
+    NVIC_T16N3_IRQn = 11,
+    NVIC_T32N0_IRQn = 12,
+    NVIC_IWDT_IRQn = 14,
+    NVIC_WWDT_IRQn = 15,
+    NVIC_CCM_IRQn = 16,
+    NVIC_PLK_IRQn = 17,
+    NVIC_LVD_IRQn = 18,
+    NVIC_KINT_IRQn = 19,
+    NVIC_RTC_IRQn = 20,
+    NVIC_ADC_IRQn = 21,
+    NVIC_AES_IRQn = 23,
+    NVIC_UART0_IRQn = 24,
+    NVIC_UART1_IRQn = 25,
+    NVIC_UART2_IRQn = 26,
+    NVIC_UART3_IRQn = 27,
+    NVIC_UART4_IRQn = 28,
+    NVIC_UART5_IRQn = 29,
+    NVIC_SPI0_IRQn = 30,
+    NVIC_I2C0_IRQn = 31,
+}NVIC_IRQChannel;
+
+/* 优先级 */
+typedef enum
+{
+    NVIC_Priority_0 = 0x0 ,
+    NVIC_Priority_1 = 0x1 ,
+    NVIC_Priority_2 = 0x2 ,
+    NVIC_Priority_3 = 0x3 ,
+}NVIC_IRQPriority;
+
+/* 休眠模式 */
+typedef enum
+{
+    SCB_LP_SleepOnExit = 0x02 , //从ISR中断处理程序返回到线程模式时,是否休眠
+    SCB_LP_SleepDeep = 0x04 ,   //深度睡眠
+    SCB_LP_SEVOPend = 0x10 ,    //中断挂起时,是否作为唤醒的选择位
+}SCB_TYPE_SCR;
+
+/* SysTick时钟源选择 */
+typedef enum
+{
+    SysTick_ClkS_Base = 0x0 , //基准时钟(Hclk/3)
+    SysTick_ClkS_Cpu = 0x1 ,  //处理器时钟(Hclk)
+}SYST_TYPE_CLKS;
+
+/* SysTick初始化配置结构体定义 */
+typedef struct
+{
+    uint32_t  SysTick_Value;           //递减数值:24位,右对齐
+    SYST_TYPE_CLKS  SysTick_ClkSource; //时钟源选择
+    TYPE_FUNCEN  SysTick_ITEnable;     //中断使能、失能
+}SYSTICK_InitStruType;
+
+/**************模块宏定义*************/
+
+/*SysTick使能*/
+#define SysTick_Enable()  (SysTick->CTRL |= 0x00000001)
+#define SysTick_Disable() (SysTick->CTRL &= 0xFFFFFFFE)
+
+/************SCS模块函数声明***********/
+void NVIC_Init(NVIC_IRQChannel Channel,NVIC_IRQPriority Priority,TYPE_FUNCEN Cmd);
+void SCB_SystemLPConfig(SCB_TYPE_SCR LowPowerMode, TYPE_FUNCEN NewState);
+uint32_t SCB_GetCpuID(void);
+void SysTick_Init(SYSTICK_InitStruType* SysT_InitStruct);
+ 
+#endif
+
+/*************************END OF FILE**********************/

+ 314 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_scu.h

@@ -0,0 +1,314 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名: lib_scu.h
+ *作 者: Liut
+ *版 本: V1.00
+ *日 期: 2017/07/14
+ *描 述: 内核模块库函数头文件
+ *备 注: 适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBSCU_H
+#define __LIBSCU_H
+
+#include "system_ES8P508x.h"
+#include "ES8P508x.h"
+#include "type.h"
+
+/* NMI不可屏蔽中断选择 */
+typedef enum
+{
+    SCU_PINT0_IRQn = 0,
+    SCU_PINT1_IRQn = 1,
+    SCU_PINT2_IRQn = 2,
+    SCU_PINT3_IRQn = 3,
+    SCU_PINT4_IRQn = 4,
+    SCU_PINT5_IRQn = 5,
+    SCU_PINT6_IRQn = 6,
+    SCU_PINT7_IRQn = 7,
+    SCU_T16N0_IRQn = 8,
+    SCU_T16N1_IRQn = 9,
+    SCU_T16N2_IRQn = 10,
+    SCU_T16N3_IRQn = 11,
+    SCU_T32N0_IRQn = 12,
+    SCU_IWDT_IRQn = 14,
+    SCU_WWDT_IRQn = 15,
+    SCU_CCM_IRQn = 16,
+    SCU_PLK_IRQn = 17,
+    SCU_LVD_IRQn = 18,
+    SCU_KINT_IRQn = 19,
+    SCU_RTC_IRQn = 20,
+    SCU_ADC_IRQn = 21,
+    SCU_AES_IRQn = 23,
+    SCU_UART0_IRQn = 24,
+    SCU_UART1_IRQn = 25,
+    SCU_UART2_IRQn = 26,
+    SCU_UART3_IRQn = 27,
+    SCU_UART4_IRQn = 28,
+    SCU_UART5_IRQn = 29,
+    SCU_SPI0_IRQn = 30,
+    SCU_I2C0_IRQn = 31,
+}SCU_TYPE_NMICS;
+
+/* PWRC复位状态寄存器标志位 */
+typedef enum
+{
+    SCU_PWRC_PORF= 0X00001,         //POR复位标志位
+    SCU_PWRC_RRCF = 0X00002,        //PORC复位标志位
+    SCU_PWRC_PORRSTF = 0x00004,     //POR总复位标志
+    SCU_PWRC_BORF = 0x00008,        //BOR总复位标志
+    SCU_PWRC_WWDTRSTF = 0x00010,    //WWDT复位标志
+    SCU_PWRC_IWDTRSTF = 0x00020,    //IWDT复位标志
+    SCU_PWRC_MRSTF = 0x00040,       //MRSTn复位标志
+    SCU_PWRC_SOFTRSTF = 0x00080,    //软件复位标志
+}SCU_TYPE_PWRC;
+
+/* LVD寄存器标志位 */
+typedef enum
+{
+    SCU_LVDFlag_IF = 0x0100,  //LVD中断标志
+    SCU_LVDFlag_Out = 0x8000, //输出状态位
+}SCU_TYPE_LVD0CON;
+
+/* 时钟选择 */
+typedef enum
+{
+    SCU_SysClk_HRC  = 0x0 ,  //内部20MHZ RC时钟
+    SCU_SysClk_XTAL = 0x1 ,   //外部晶振主时钟
+    SCU_SysClk_PLL  = 0x2 ,   //PLL
+}SCU_TYPE_SYSCLK;
+
+/*clk_sel时钟源选择*/
+typedef enum
+{
+    CLK_SEL_HRC    = 0x0,   //HRC 20M
+    CLK_SEL_LRC    = 0x1,   //LRC 32KHz
+    CLK_SEL_XTAL   = 0x2,   //外接晶振XTAL
+}SCU_TYPE_CLK_SEL;
+
+/* PLL时钟源选择 */
+typedef enum
+{
+    SCU_PLL_HRC   = 0x0 ,   //PLL时钟源HRC
+    SCU_PLL_LRC  = 0x2 ,    //PLL时钟源LRC
+    SCU_PLL_XTAL_32K  = 0x3 ,    //PLL时钟源XTAL
+    SCU_PLL_XTAL_4M  = 0x4 ,    //PLL时钟源XTAL
+    SCU_PLL_XTAL_8M  = 0x5,     //PLL时钟源XTAL
+    SCU_PLL_XTAL_16M = 0x6,     //PLL时钟源XTAL
+    SCU_PLL_XTAL_20M = 0x7,     //PLL时钟源XTAL
+} SCU_PLL_Origin;
+
+/* PLL时钟输出频率旋择 */
+typedef enum
+{
+    SCU_PLL_32M   = 0x0 ,   //PLL时钟输出为32MHz
+    SCU_PLL_48M   = 0x1 ,   //PLL时钟输出为48Mhz
+} SCU_PLL_Out;
+
+/************SCU模块宏定义***********/
+/* SCU写保护控制 */
+#define SCU_RegUnLock() (SCU->PROT.Word = 0x55AA6996)
+#define SCU_RegLock()   (SCU->PROT.Word = 0x00000000)
+
+/* NMI使能控制 */
+#define SCU_NMI_Enable()  (SCU->NMICON.NMIEN = 0x1)
+#define SCU_NMI_Disable() (SCU->NMICON.NMIEN = 0x0)
+
+/*-------LVD模块-------*/
+
+/* LVD使能控制 */
+#define SCU_LVD_Enable()  (SCU->LVDCON.EN = 0x1)
+#define SCU_LVD_Disable() (SCU->LVDCON.EN = 0x0)
+
+/* LVD滤波使能控制 */
+#define SCU_LVDFLT_Enable()  (SCU->LVDCON.FLTEN = 0x1)
+#define SCU_LVDFLT_Disable() (SCU->LVDCON.FLTEN = 0x0)
+
+/* LVD触发电压选择 */
+#define SCU_LVDVS_2V0() (SCU->LVDCON.VS = 0x0)
+#define SCU_LVDVS_2V1() (SCU->LVDCON.VS = 0x1)
+#define SCU_LVDVS_2V2() (SCU->LVDCON.VS = 0x2)
+#define SCU_LVDVS_2V4() (SCU->LVDCON.VS = 0x3)
+#define SCU_LVDVS_2V6() (SCU->LVDCON.VS = 0x4)
+#define SCU_LVDVS_2V8() (SCU->LVDCON.VS = 0x5)
+#define SCU_LVDVS_3V0() (SCU->LVDCON.VS = 0x6)
+#define SCU_LVDVS_3V6() (SCU->LVDCON.VS = 0x7)
+#define SCU_LVDVS_4V()  (SCU->LVDCON.VS = 0x8)
+#define SCU_LVDVS_4V6() (SCU->LVDCON.VS = 0x9)
+#define SCU_LVDVS_2V3() (SCU->LVDCON.VS = 0xA)
+#define SCU_LVDVS_LVDIN() (SCU->LVDCON.VS = 0xE)
+
+/* LVD中断使能控制 */
+#define SCU_LVDIT_Enable()  (SCU->LVDCON.IE = 0x1)
+#define SCU_LVDIT_Disable() (SCU->LVDCON.IE = 0x0)
+
+/* LVD中断标志位清除 */
+#define SCU_LVDClearIFBit() (SCU->LVDCON.IF = 1)
+
+/* LVD中断产生模式选择 */
+#define SCU_LVDIFS_Rise() (SCU->LVDCON.IFS = 0x0) //LVDO上升沿产生中断
+#define SCU_LVDIFS_Fall() (SCU->LVDCON.IFS = 0x1) //LVDO下降沿产生中断
+#define SCU_LVDIFS_High() (SCU->LVDCON.IFS = 0x2) //LVDO高电平产生中断
+#define SCU_LVDIFS_Low()  (SCU->LVDCON.IFS = 0x3)   //LVDO低电平产生中断 
+#define SCU_LVDIFS_Change() (SCU->LVDCON.IFS = 0x4) //LVDO电平变化产生中断
+
+/* FLASH访问等待时间选择 */
+#define SCU_FlashWait_1Tclk()  (SCU->FLASHWAIT.ACCT = 0x0)
+#define SCU_FlashWait_2Tclk()  (SCU->FLASHWAIT.ACCT = 0x1)
+#define SCU_FlashWait_3Tclk()  (SCU->FLASHWAIT.ACCT = 0x2)
+#define SCU_FlashWait_4Tclk()  (SCU->FLASHWAIT.ACCT = 0x3)
+#define SCU_FlashWait_5Tclk()  (SCU->FLASHWAIT.ACCT = 0x4)
+#define SCU_FlashWait_6Tclk()  (SCU->FLASHWAIT.ACCT = 0x5)
+#define SCU_FlashWait_7Tclk()  (SCU->FLASHWAIT.ACCT = 0x6)
+#define SCU_FlashWait_8Tclk()  (SCU->FLASHWAIT.ACCT = 0x7)
+#define SCU_FlashWait_9Tclk()  (SCU->FLASHWAIT.ACCT = 0x8)
+#define SCU_FlashWait_10Tclk() (SCU->FLASHWAIT.ACCT = 0x9)
+#define SCU_FlashWait_11Tclk() (SCU->FLASHWAIT.ACCT = 0xA)
+#define SCU_FlashWait_12Tclk() (SCU->FLASHWAIT.ACCT = 0xB)
+#define SCU_FlashWait_13Tclk() (SCU->FLASHWAIT.ACCT = 0xC)
+#define SCU_FlashWait_14Tclk() (SCU->FLASHWAIT.ACCT = 0xD)
+#define SCU_FlashWait_15Tclk() (SCU->FLASHWAIT.ACCT = 0xE)
+#define SCU_FlashWait_16Tclk() (SCU->FLASHWAIT.ACCT = 0xF)
+
+/* 系统时钟后分频选择 */
+#define SCU_SysClk_Div1()   (SCU->SCLKEN0.SYSCLK_DIV = 0)
+#define SCU_SysClk_Div2()   (SCU->SCLKEN0.SYSCLK_DIV = 1)
+#define SCU_SysClk_Div4()   (SCU->SCLKEN0.SYSCLK_DIV = 2)
+#define SCU_SysClk_Div8()  (SCU->SCLKEN0.SYSCLK_DIV = 3)
+#define SCU_SysClk_Div16()  (SCU->SCLKEN0.SYSCLK_DIV = 4)
+#define SCU_SysClk_Div32()  (SCU->SCLKEN0.SYSCLK_DIV = 5)
+#define SCU_SysClk_Div64()  (SCU->SCLKEN0.SYSCLK_DIV = 6)
+#define SCU_SysClk_Div128() (SCU->SCLKEN0.SYSCLK_DIV = 7)
+
+/* HRC使能控制 (内部20Mhz) */
+#define SCU_HRC_Enable()  (SCU->SCLKEN1.HRC_EN = 1)
+#define SCU_HRC_Disable() (SCU->SCLKEN1.HRC_EN = 0)
+
+/* XTAL使能控制 */
+#define SCU_XTAL_Enable()  (SCU->SCLKEN1.XTAL_EN = 1)
+#define SCU_XTAL_Disable() (SCU->SCLKEN1.XTAL_EN = 0)
+
+/* PLL模式使能控制 */
+#define SCU_PLL_Enable()  (SCU->SCLKEN1.PLL_EN = 1)
+#define SCU_PLL_Disable() (SCU->SCLKEN1.PLL_EN = 0)
+
+/*-------外设时钟控制-------*/
+/* SCU时钟使能控制 */
+#define SCU_SCUCLK_Enable()  (SCU->PCLKEN0.SCU_EN = 1)
+#define SCU_SCUCLK_Disable() (SCU->PCLKEN0.SCU_EN = 0)
+
+/* GPIO时钟使能控制 */
+#define SCU_GPIOCLK_Enable()  (SCU->PCLKEN0.GPIO_EN = 1)
+#define SCU_GPIOCLK_Disable() (SCU->PCLKEN0.GPIO_EN = 0)
+
+/* FLASH IAP时钟使能控制 */
+#define SCU_IAPCLK_Enable()  (SCU->PCLKEN0.IAP_EN = 1)
+#define SCU_IAPCLK_Disable() (SCU->PCLKEN0.IAP_EN = 0)
+
+/* CRC时钟使能控制 */
+#define SCU_CRCCLK_Enable()  (SCU->PCLKEN0.CRC_EN = 1)
+#define SCU_CRCCLK_Disable() (SCU->PCLKEN0.CRC_EN = 0)
+
+/* ADC时钟使能控制 */
+#define SCU_ADCCLK_Enable()  (SCU->PCLKEN0.ADC_EN = 1)
+#define SCU_ADCCLK_Disable() (SCU->PCLKEN0.ADC_EN = 0)
+
+/* RTC时钟使能控制 */
+#define SCU_RTCCLK_Enable()  (SCU->PCLKEN0.RTC_EN = 1)
+#define SCU_RTCCLK_Disable() (SCU->PCLKEN0.RTC_EN = 0)
+
+/* IWDT时钟使能控制 */
+#define SCU_IWDTCLK_Enable()  (SCU->PCLKEN0.IWDT_EN = 1)
+#define SCU_IWDTCLK_Disable() (SCU->PCLKEN0.IWDT_EN = 0)
+
+/* WWDT时钟使能控制 */
+#define SCU_WWDTCLK_Enable()  (SCU->PCLKEN0.WWDT_EN = 1)
+#define SCU_WWDTCLK_Disable() (SCU->PCLKEN0.WWDT_EN = 0)
+
+/* AES时钟使能控制 */
+#define SCU_AESCLK_Enable()  (SCU->PCLKEN0.AES_EN = 1)
+#define SCU_AESCLK_Disable() (SCU->PCLKEN0.AES_EN = 0)
+
+/* T16N0时钟使能控制 */
+#define SCU_T16N0CLK_Enable()  (SCU->PCLKEN1.T16N0_EN = 1)
+#define SCU_T16N0CLK_Disable() (SCU->PCLKEN1.T16N0_EN = 0)
+
+/* T16N1时钟使能控制 */
+#define SCU_T16N1CLK_Enable()  (SCU->PCLKEN1.T16N1_EN = 1)
+#define SCU_T16N1CLK_Disable() (SCU->PCLKEN1.T16N1_EN = 0)
+
+/* T16N2时钟使能控制 */
+#define SCU_T16N2CLK_Enable()  (SCU->PCLKEN1.T16N2_EN = 1)
+#define SCU_T16N2CLK_Disable() (SCU->PCLKEN1.T16N2_EN = 0)
+
+/* T16N3时钟使能控制 */
+#define SCU_T16N3CLK_Enable()  (SCU->PCLKEN1.T16N3_EN = 1)
+#define SCU_T16N3CLK_Disable() (SCU->PCLKEN1.T16N3_EN = 0)
+
+/* T32N0时钟使能控制 */
+#define SCU_T32N0CLK_Enable()  (SCU->PCLKEN1.T32N0_EN = 1)
+#define SCU_T32N0CLK_Disable() (SCU->PCLKEN1.T32N0_EN = 0)
+
+/* UART0时钟使能控制 */
+#define SCU_UART0CLK_Enable()  (SCU->PCLKEN1.UART0_EN = 1)
+#define SCU_UART0CLK_Disable() (SCU->PCLKEN1.UART0_EN = 0)
+
+/* UART1时钟使能控制 */
+#define SCU_UART1CLK_Enable()  (SCU->PCLKEN1.UART1_EN = 1)
+#define SCU_UART1CLK_Disable() (SCU->PCLKEN1.UART1_EN = 0)
+
+/* UART2时钟使能控制 */
+#define SCU_UART2CLK_Enable()  (SCU->PCLKEN1.UART2_EN = 1)
+#define SCU_UART2CLK_Disable() (SCU->PCLKEN1.UART2_EN = 0)
+
+/* UART3时钟使能控制 */
+#define SCU_UART3CLK_Enable()  (SCU->PCLKEN1.UART3_EN = 1)
+#define SCU_UART3CLK_Disable() (SCU->PCLKEN1.UART3_EN = 0)
+
+/* UART4时钟使能控制 */
+#define SCU_UART4CLK_Enable()  (SCU->PCLKEN1.UART4_EN = 1)
+#define SCU_UART4CLK_Disable() (SCU->PCLKEN1.UART4_EN = 0)
+
+/* UART5时钟使能控制 */
+#define SCU_UART5CLK_Enable()  (SCU->PCLKEN1.UART5_EN = 1)
+#define SCU_UART5CLK_Disable() (SCU->PCLKEN1.UART5_EN = 0)
+
+/* SPI0时钟使能控制 */
+#define SCU_SPI0CLK_Enable()  (SCU->PCLKEN1.SPI0_EN = 1)
+#define SCU_SPI0CLK_Disable() (SCU->PCLKEN1.SPI0_EN = 0)
+
+/* IIC0时钟使能控制 */
+#define SCU_IIC0CLK_Enable()  (SCU->PCLKEN1.I2C0_EN = 1)
+#define SCU_IIC0CLK_Disable() (SCU->PCLKEN1.I2C0_EN = 0)
+
+/* 中断向量表重映射使能控制 */
+#define SCU_TBLRemap_Enable()  (SCU->TBLREMAPEN.EN= 1)
+#define SCU_TBLRemap_Disable() (SCU->TBLREMAPEN.EN= 0)
+
+/* 中断向量表偏移寄存器 x最大为2^24=16777216 */
+#define SCU_TBL_Offset(x) (SCU->TBLOFF.TBLOFF = (uint32_t)x)
+
+/************SCU模块函数声明***********/
+void SCU_OpenXTAL(void);
+void SCU_NMISelect(SCU_TYPE_NMICS NMI_Type);
+FlagStatus SCU_GetPWRCFlagStatus(SCU_TYPE_PWRC PWRC_Flag);
+void SCU_ClearPWRCFlagBit(SCU_TYPE_PWRC PWRC_Flag);
+FlagStatus SCU_GetLVDFlagStatus(SCU_TYPE_LVD0CON LVD_Flag);
+void SCU_SysClkSelect(SCU_TYPE_SYSCLK Sysclk);
+SCU_TYPE_SYSCLK SCU_GetSysClk(void);
+FlagStatus SCU_HRCReadyFlag(void);
+FlagStatus  SCU_XTALReadyFlag(void);
+FlagStatus  SCU_PLLReadyFlag(void);
+void SystemClockConfig(void);
+void SystemClockConfig_1(void);
+void DeviceClockAllEnable(void);
+void DeviceClockAllDisable(void);
+void SystemClockSelect(SCU_TYPE_SYSCLK SYSCLKx , SCU_TYPE_CLK_SEL CLK_SEL);
+void PLLClock_Config(TYPE_FUNCEN pll_en , SCU_PLL_Origin  pll_origin ,SCU_PLL_Out pll_out,TYPE_FUNCEN sys_pll);
+#endif
+/*************************END OF FILE**********************/
+
+
+
+
+

+ 141 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_spi.h

@@ -0,0 +1,141 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名: lib_spi.h
+ *作 者: Liut
+ *版 本: V1.00
+ *日 期: 2017/07/14
+ *描 述: SPI模块库函数头文件
+ *备 注: 适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBSPI_H__
+#define __LIBSPI_H__
+
+#include "system_ES8P508x.h"
+#include "ES8P508x.h"
+#include "type.h"
+
+/* 通信数据格式 */
+typedef enum
+{
+    SPI_RiseSendFallRec = 0x0 , //通信数据格式:上升沿发送(先),下降沿接收(后)
+    SPI_FallSendRiseRec = 0x1 , //通信数据格式:下降沿发送(先),上升沿接收(后)
+    SPI_RiseRecFallSend = 0x2 , //通信数据格式:上升沿接收(先),下降沿发送(后)
+    SPI_FallRecRiseSend = 0x3 , //通信数据格式:下降沿接收(先),上升沿发送(后)
+}SPI_TYPE_DFS;
+
+/* 通讯模式 */
+typedef enum
+{
+    SPI_Mode_Master = 0x0 , //通讯模式:主控
+    SPI_Mode_Slave = 0x1 ,  //通讯模式:从动
+}SPI_TYPE_MODE;
+
+/* ADC初始化配置结构体定义 */
+typedef struct
+{
+    uint32_t  SPI_Freq;          //SPI频率 
+
+    SPI_TYPE_DFS  SPI_Df;        //通讯数据格式
+
+    SPI_TYPE_MODE  SPI_Mode;     //通讯模式
+
+    uint8_t SPI_DW;             //发送帧位宽
+
+    TYPE_FUNCEN  SPI_DelayRec;   //延时接收使能
+
+    TYPE_FUNCEN  SPI_DelaySend;  //发送间隔使能
+
+    uint8_t  SPI_SendDelayPeroid;//发送间隔周期
+
+}SPI_InitStruType;
+
+/* 标志位 */
+typedef enum
+{
+    SPI_Flag_TB = 0x00000001,
+    SPI_Flag_RB = 0x00000002,
+    SPI_Flag_TE = 0x00000004,
+    SPI_Flag_RO = 0x00000008,
+    SPI_Flag_ID = 0x00000010,
+    SPI_Flag_NSSIF = 0x00000020,
+    SPI_Flag_TBWE = 0x00000040,
+    SPI_Flag_NSS = 0x00000080,
+    SPI_Flag_TBEF0 = 0x00000100,
+    SPI_Flag_TBEF1 = 0x00000200,
+    SPI_Flag_TBEF2 = 0x00000400,
+    SPI_Flag_TBEF3 = 0x00000800,
+    SPI_Flag_RBFF0 = 0x00001000,
+    SPI_Flag_RBFF1 = 0x00002000,
+    SPI_Flag_RBFF2 = 0x00004000,
+    SPI_Flag_RBFF3 = 0x00008000,
+    SPI_Flag_IDLE = 0x00010000,
+    SPI_Flag_TMS = 0x00020000,
+}SPI_TYPE_FLAG;
+
+/* 中断模式选择 */
+typedef enum
+{
+    SPI_IType_BYTE = 0x0 ,
+    SPI_IType_HALFWORD = 0x1 ,
+    SPI_IType_WORD = 0x2 ,
+}SPI_TYPE_TRBIM;
+
+/* SPI中断 */
+typedef enum
+{
+    SPI_IT_TB = 0x01 ,
+    SPI_IT_RB = 0x02 ,
+    SPI_IT_TE = 0x04 ,
+    SPI_IT_RO = 0x08 ,
+    SPI_IT_ID = 0x10 ,
+    SPI_IT_NSS = 0x20 ,
+    SPI_IT_TBWE = 0x40 ,
+}SPI_TYPE_IT;
+
+/* SPI清除中断标志 */
+typedef enum
+{
+    SPI_Clr_TE = 0x04 ,
+    SPI_Clr_RO = 0x08 ,
+    SPI_Clr_ID = 0x10 ,
+    SPI_Clr_NSS = 0x20 ,
+    SPI_Clr_TBWE = 0x40 ,
+}SPI_CLR_IF;
+
+/************SPI模块宏定义***********/
+
+/* SPI使能控制 */
+#define SPI_Enable()  (SPI0->CON.EN = 1)
+#define SPI_Disable() (SPI0->CON.EN = 0)
+
+/* SPI接收使能控制 */
+#define SPI_RecEnable()  (SPI0->CON.REN = 1)
+#define SPI_RecDisable() (SPI0->CON.REN = 0)
+
+/* SPI软件复位 */
+#define SPI_Rst() (SPI0->CON.RST = 1)
+
+/* SPI缓冲器清空 */
+#define SPI_RX_CLR() (SPI0->CON.RXCLR = 1)
+#define SPI_TX_CLR() (SPI0->CON.TXCLR = 1)
+
+/************SPI模块函数声明***********/
+void SPI_Init(SPI_InitStruType* SPI_InitStruct);
+void SPI_ITConfig(SPI_TYPE_IT SPI_IE,TYPE_FUNCEN NewState);
+void SPI_DataFormatConfig(SPI_TYPE_DFS Type);
+void SPI_SendByte(uint8_t Temp);
+void SPI_SendHalfWord(uint16_t Temp);
+void SPI_SendWord(uint32_t Temp);
+uint8_t SPI_RecByte(void);
+uint16_t SPI_RecHalfWord(void);
+uint32_t SPI_RecWord(void);
+void SPI_TBIMConfig(SPI_TYPE_TRBIM Type);
+void SPI_RBIMConfig(SPI_TYPE_TRBIM Type);
+FlagStatus SPI_GetFlagStatus(SPI_TYPE_FLAG Flag);
+ITStatus SPI_GetITStatus(SPI_TYPE_IT Flag);
+void SPI_ClearITPendingBit(SPI_CLR_IF Flag);
+
+#endif
+
+/*************************END OF FILE**********************/

+ 310 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_timer.h

@@ -0,0 +1,310 @@
+/******************************************************************************************
+ * Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ * 文件名:  lib_timer.h
+ * 作  者:  Liut
+ * 版  本:  V1.00
+ * 日  期:  2017/07/14
+ * 描  述:  16位定时器/计数器、32位定时器/计数器库函数头文件
+ * 备  注:  适用于ES8P508x系列芯片
+ *          本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ *******************************************************************************************/
+#ifndef __LIBTIMER_H__
+#define __LIBTIMER_H__
+
+#include "ES8P508x.h"
+#include "type.h"
+
+/* 时钟源选择 */
+typedef enum
+{
+    TIM_ClkS_PCLK = 0x0 , //时钟源选择:内部PCLK
+    TIM_ClkS_CK0 = 0x1 ,  //时钟源选择:外部CK0时钟输入
+    TIM_ClkS_CK1 = 0x2 ,  //时钟源选择:外部CK1时钟输入
+}TIM_TYPE_CLKS;
+
+/* 外部时钟计数边沿选择 */
+typedef enum
+{
+    TIM_EDGE_Rise = 0x0 , //外部时钟计数边沿选择:上升沿
+    TIM_EDGE_Fall = 0x1 , //外部时钟计数边沿选择:下降沿
+    TIM_EDGE_All = 0x2 ,  //外部时钟计数边沿选择:所有
+}TIM_TYPE_EDGE;
+
+
+/* 工作模式选择 */
+typedef enum
+{
+    TIM_Mode_TC0 = 0x0 , //工作模式:定时、计数模式
+    TIM_Mode_TC1 = 0x1 , //工作模式:定时、计数模式
+    TIM_Mode_CAP = 0x2 , //工作模式:捕捉模式
+    TIM_Mode_PWM = 0x3 , //工作模式:调制模式
+}TIM_TYPE_MODE;
+
+/* TIM初始化配置结构体定义 */
+typedef struct
+{
+    TIM_TYPE_CLKS  TIM_ClkS; //时钟源选择
+    TYPE_FUNCEN  TIM_SYNC;   //外部时钟同步
+    TIM_TYPE_EDGE  TIM_EDGE; //外部时钟计数边沿选择
+    TIM_TYPE_MODE  TIM_Mode; //工作模式选择
+}TIM_BaseInitStruType;
+
+/* 匹配寄存器值匹配后的工作模式 */
+typedef enum
+{
+    TIM_Go_No = 0x0 ,    //匹配寄存器值匹配后的工作模式:继续计数,不产生中断
+    TIM_Hold_Int = 0x1 , //匹配寄存器值匹配后的工作模式:保持计数,产生中断
+    TIM_Clr_Int = 0x2 ,  //匹配寄存器值匹配后的工作模式:清零并重新计数,产生中断
+    TIM_Go_Int = 0x3 ,   //匹配寄存器值匹配后的工作模式:继续计数,产生中断
+}TIM_TYPE_MATCON;
+
+/* 匹配寄存器值匹配后输出端口的工作模式 */
+typedef enum
+{
+    TIM_Out_Hold = 0x0 ,   //匹配寄存器值匹配后输出端口的工作模式:保持
+    TIM_Out_Low = 0x1 ,    //匹配寄存器值匹配后输出端口的工作模式:清0
+    TIM_Out_High = 0x2 ,   //匹配寄存器值匹配后输出端口的工作模式:置1
+    TIM_Out_Switch = 0x3 , //匹配寄存器值匹配后输出端口的工作模式:取反
+}TIM_TYPE_MATOUT;
+
+/* 捕捉次数控制 */
+typedef enum
+{
+    TIM_CapTime_1 = 0x0 , //捕捉次数控制:1
+    TIM_CapTime_2 = 0x1 , //捕捉次数控制:2
+    TIM_CapTime_3 = 0x2 , //捕捉次数控制:3
+    TIM_CapTime_4 = 0x3 , //捕捉次数控制:4
+    TIM_CapTime_5 = 0x4 , //捕捉次数控制:5
+    TIM_CapTime_6 = 0x5 , //捕捉次数控制:6
+    TIM_CapTime_7 = 0x6 , //捕捉次数控制:7
+    TIM_CapTime_8 = 0x7 , //捕捉次数控制:8
+    TIM_CapTime_9 = 0x8 , //捕捉次数控制:9
+    TIM_CapTime_10 = 0x9 , //捕捉次数控制:10
+    TIM_CapTime_11 = 0xA , //捕捉次数控制:11
+    TIM_CapTime_12 = 0xB , //捕捉次数控制:12
+    TIM_CapTime_13 = 0xC , //捕捉次数控制:13
+    TIM_CapTime_14 = 0xD , //捕捉次数控制:14
+    TIM_CapTime_15 = 0xE , //捕捉次数控制:15
+    TIM_CapTime_16 = 0xF , //捕捉次数控制:16
+}TIM_TYPE_CAPT;
+
+/* PWM输出极性类型 */
+typedef enum
+{
+    POSITIVE = 0X00,   //正极性
+    NEGATIVE = 0X01,   //负极性
+}T16Nx_PWMOUT_POLAR_Type;
+
+/* 调制功能初始化结构体定义 */
+typedef struct
+{
+    TYPE_FUNCEN  T16Nx_MOE0;   //输出端口0使能
+    TYPE_FUNCEN  T16Nx_MOE1;   //输出端口1使能
+    T16Nx_PWMOUT_POLAR_Type  T16Nx_POL0;    //T16NxOUT0输出极性选择位
+    T16Nx_PWMOUT_POLAR_Type  T16Nx_POL1;    //T16NxOUT1输出极性选择位 
+}T16Nx_PWMInitStruType;
+
+/* 捕捉功能初始化结构体定义 */
+typedef struct
+{
+    TYPE_FUNCEN  TIM_CapRise; //上升沿捕捉使能
+    TYPE_FUNCEN  TIM_CapFall; //下降沿捕捉使能
+    TYPE_FUNCEN  TIM_CapIS0;  //输入端口0使能
+    TYPE_FUNCEN  TIM_CapIS1;  //输入端口1使能
+    TIM_TYPE_CAPT  TIM_CapTime; //捕捉次数控制
+}TIM_CapInitStruType;
+
+/* PWM刹车输出电平 */
+typedef enum
+{
+    PWMBKOUT_Low = 0,
+    PWMBKOUT_High = 1,
+}T16Nx_PWMBKOUT_LEVEl;
+
+/* PWM刹车信号极性选择 */
+typedef enum
+{
+    PWMBKP_High = 0,
+    PWMBKP_Low = 1,     
+}T16Nx_PWMBKP_LEVEl;
+
+/*PWM刹车信号源选择*/
+typedef enum
+{
+    PWMBKPS_PINT0 = 0,
+    PWMBKPS_PINT1 = 1,
+    PWMBKPS_PINT2 = 2,
+    PWMBKPS_PINT3 = 3,
+    PWMBKPS_PINT4 = 4,
+    PWMBKPS_PINT5 = 5,
+    PWMBKPS_PINT6 = 6,
+    PWMBKPS_PINT7 = 7,
+}T16Nx_PWMBKP_S;
+
+/*PWM输出刹车控制*/
+typedef struct
+{
+
+    T16Nx_PWMBKOUT_LEVEl T16Nx_PWMBKL0;         //PWM通道0刹车输出电平选择
+    T16Nx_PWMBKOUT_LEVEl T16Nx_PWMBKL1;         //PWM通道1刹车输出电平选择
+    T16Nx_PWMBKP_S T16Nx_PWMBKS;                //PWM通道信号源选择
+    T16Nx_PWMBKP_LEVEl T16Nx_PWMBKPS;           //PWM通道刹车信号极性选择
+    TYPE_FUNCEN T16Nx_PWMBKEN;                  //PWM刹车使能
+}T16Nx_PWMBK_Type;
+
+/* 中断配置 */
+typedef enum
+{
+    TIM_IT_MAT0 = 0x01 ,
+    TIM_IT_MAT1 = 0x02 ,
+    TIM_IT_MAT2 = 0x04 ,
+    TIM_IT_MAT3 = 0x08 ,
+    TIM_IT_N = 0x10 ,
+    TIM_IT_CAP0 = 0x20 ,
+    TIM_IT_CAP1 = 0x40 ,
+    TIM_IT_PBK = 0x80 ,
+}TIM_TYPE_IT;
+
+typedef enum
+{
+    TIM_IF_MAT0 = 0x01 ,
+    TIM_IF_MAT1 = 0x02 ,
+    TIM_IF_MAT2 = 0x04 ,
+    TIM_IF_MAT3 = 0x08 ,
+    TIM_IF_N = 0x10 ,
+    TIM_IF_CAP0 = 0x20 ,
+    TIM_IF_CAP1 = 0x40 ,
+    TIM_IF_PBK = 0x80 ,
+}TIM_TYPE_IF;
+
+/* 匹配寄存器 */
+typedef enum
+{
+    TIM_MAT0 = 0x00 ,
+    TIM_MAT1 = 0x01 ,
+    TIM_MAT2 = 0x02 ,
+    TIM_MAT3 = 0x03 ,
+}TIM_TYPE_MATX;
+
+/*T16N ADC触发使能控制*/
+typedef enum
+{
+    T16Nx_MAT0 = 0x02,         //PWM通道0匹配0触发使能
+    T16Nx_MAT1 = 0x04,         //PWM通道0匹配1触发使能
+    T16Nx_MAT2 = 0x20,         //PWM通道1匹配2触发使能
+    T16Nx_MAT3 = 0x40,         //PWM通道1匹配3触发使能
+}T16Nx_PWMTRG_type;
+
+/*************TIM模块宏定义************/
+
+/* TIM模块使能控制 */
+#define T16N0_Enable() (T16N0->CON0.EN = 1)
+#define T16N1_Enable() (T16N1->CON0.EN = 1)
+#define T16N2_Enable() (T16N2->CON0.EN = 1)
+#define T16N3_Enable() (T16N3->CON0.EN = 1)
+#define T32N0_Enable() (T32N0->CON0.EN = 1)
+#define T16N0_Disable() (T16N0->CON0.EN = 0)
+#define T16N1_Disable() (T16N1->CON0.EN = 0)
+#define T16N2_Disable() (T16N2->CON0.EN = 0)
+#define T16N3_Disable() (T16N3->CON0.EN = 0)
+#define T32N0_Disable() (T32N0->CON0.EN = 0)
+
+/* 异步写使能控制 */
+#define T16N0_ASYNCWR_Enable() (T16N0->CON0.ASYWEN = 1)
+#define T16N1_ASYNCWR_Enable() (T16N1->CON0.ASYWEN = 1)
+#define T16N2_ASYNCWR_Enable() (T16N2->CON0.ASYWEN = 1)
+#define T16N3_ASYNCWR_Enable() (T16N3->CON0.ASYWEN = 1)
+#define T32N0_ASYNCWR_Enable() (T32N0->CON0.ASYNCWREN = 1)
+#define T16N0_ASYNCWR_Disable() (T16N0->CON0.ASYWEN= 0)
+#define T16N1_ASYNCWR_Disable() (T16N1->CON0.ASYWEN = 0)
+#define T16N2_ASYNCWR_Disable() (T16N2->CON0.ASYWEN = 0)
+#define T16N3_ASYNCWR_Disable() (T16N3->CON0.ASYWEN = 0)
+#define T32N0_ASYNCWR_Disable() (T32N0->CON0.ASYNCWREN = 0)
+
+/* PWM输出使能控制 */
+#define T16N0_PwmOut0_Enable() (T16N0->CON2.MOE0 = 1)
+#define T16N1_PwmOut0_Enable() (T16N1->CON2.MOE0 = 1)
+#define T16N2_PwmOut0_Enable() (T16N2->CON2.MOE0 = 1)
+#define T16N3_PwmOut0_Enable() (T16N3->CON2.MOE0 = 1)
+#define T32N0_PwmOut0_Enable() (T32N0->CON2.MOE0 = 1)
+#define T16N0_PwmOut1_Enable() (T16N0->CON2.MOE1 = 1)
+#define T16N1_PwmOut1_Enable() (T16N1->CON2.MOE1 = 1)
+#define T16N2_PwmOut1_Enable() (T16N2->CON2.MOE1 = 1)
+#define T16N3_PwmOut1_Enable() (T16N3->CON2.MOE1 = 1)
+#define T32N0_PwmOut1_Enable() (T32N0->CON2.MOE1 = 1)
+#define T16N0_PwmOut0_Disable() (T16N0->CON2.MOE0 = 0)
+#define T16N1_PwmOut0_Disable() (T16N1->CON2.MOE0 = 0)
+#define T16N2_PwmOut0_Disable() (T16N2->CON2.MOE0 = 0)
+#define T16N3_PwmOut0_Disable() (T16N3->CON2.MOE0 = 0)
+#define T32N0_PwmOut0_Disable() (T32N0->CON2.MOE0 = 0)
+#define T16N0_PwmOut1_Disable() (T16N0->CON2.MOE1 = 0)
+#define T16N1_PwmOut1_Disable() (T16N1->CON2.MOE1 = 0)
+#define T16N2_PwmOut1_Disable() (T16N2->CON2.MOE1 = 0)
+#define T16N3_PwmOut1_Disable() (T16N3->CON2.MOE1 = 0)
+#define T32N0_PwmOut1_Disable() (T32N0->CON2.MOE1 = 0)
+
+/************T16模块函数声明***********/
+void T16Nx_BaseInit(T16N_TypeDef* T16Nx,TIM_BaseInitStruType* TIM_BaseInitStruct);
+void T16Nx_CapInit(T16N_TypeDef* T16Nx,TIM_CapInitStruType* TIM_CapInitStruct);
+void T16Nx_MAT0ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_MATCON Type);
+void T16Nx_MAT1ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_MATCON Type);
+void T16Nx_MAT2ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_MATCON Type);
+void T16Nx_MAT3ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_MATCON Type);
+void T16Nx_MAT0Out0Config(T16N_TypeDef* T16Nx,TIM_TYPE_MATOUT Type);
+void T16Nx_MAT1Out0Config(T16N_TypeDef* T16Nx,TIM_TYPE_MATOUT Type);
+void T16Nx_MAT2Out1Config(T16N_TypeDef* T16Nx,TIM_TYPE_MATOUT Type);
+void T16Nx_MAT3Out1Config(T16N_TypeDef* T16Nx,TIM_TYPE_MATOUT Type);
+void T16Nx_ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_IT Type,TYPE_FUNCEN NewState);
+void T16Nx_PWMOutConfig(T16N_TypeDef* T16Nx,T16Nx_PWMInitStruType* T16Nx_PWMInitStruct);
+void T16Nx_PWMBK_Config(T16N_TypeDef* T16Nx,T16Nx_PWMBK_Type* type);
+void T16Nx_TRG_Config(T16N_TypeDef* T16Nx,T16Nx_PWMTRG_type Type,TYPE_FUNCEN NewState);
+FlagStatus T16Nx_GetPWMBKF(T16N_TypeDef* T16Nx);
+void T16Nx_ResetPWMBKF(T16N_TypeDef* T16Nx);
+void T16Nx_SetCNT(T16N_TypeDef* T16Nx,uint16_t Value);
+void T16Nx_SetPRECNT(T16N_TypeDef* T16Nx,uint8_t Value);
+void T16Nx_SetPREMAT(T16N_TypeDef* T16Nx,uint8_t Value);
+void T16Nx_SetMAT0(T16N_TypeDef* T16Nx,uint16_t Value);
+void T16Nx_SetMAT1(T16N_TypeDef* T16Nx,uint16_t Value);
+void T16Nx_SetMAT2(T16N_TypeDef* T16Nx,uint16_t Value);
+void T16Nx_SetMAT3(T16N_TypeDef* T16Nx,uint16_t Value);
+uint16_t T16Nx_GetMAT0(T16N_TypeDef* T16Nx);
+uint16_t T16Nx_GetMAT1(T16N_TypeDef* T16Nx);
+uint16_t T16Nx_GetMAT2(T16N_TypeDef* T16Nx);
+uint16_t T16Nx_GetMAT3(T16N_TypeDef* T16Nx);
+uint16_t T16Nx_GetCNT(T16N_TypeDef* T16Nx);
+uint8_t T16Nx_GetPRECNT(T16N_TypeDef* T16Nx);
+FlagStatus T16Nx_GetFlagStatus(T16N_TypeDef* T16Nx,TIM_TYPE_IF TIM_Flag);
+ITStatus T16Nx_GetITStatus(T16N_TypeDef* T16Nx,TIM_TYPE_IT TIM_Flag);
+void T16Nx_ClearIFPendingBit(T16N_TypeDef* T16Nx,TIM_TYPE_IF TIM_Flag);
+/************************************T32模块函数声明********************************************************/
+void T32Nx_BaseInit(T32N_TypeDef* T32Nx,TIM_BaseInitStruType* TIM_BaseInitStruct);
+void T32Nx_CapInit(T32N_TypeDef* T32Nx,TIM_CapInitStruType* TIM_CapInitStruct);
+void T32Nx_MAT0ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_MATCON Type);
+void T32Nx_MAT1ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_MATCON Type);
+void T32Nx_MAT2ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_MATCON Type);
+void T32Nx_MAT3ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_MATCON Type);
+void T32Nx_MAT0Out0Config(T32N_TypeDef* T32Nx,TIM_TYPE_MATOUT Type);
+void T32Nx_MAT1Out0Config(T32N_TypeDef* T32Nx,TIM_TYPE_MATOUT Type);
+void T32Nx_MAT2Out1Config(T32N_TypeDef* T32Nx,TIM_TYPE_MATOUT Type);
+void T32Nx_MAT3Out1Config(T32N_TypeDef* T32Nx,TIM_TYPE_MATOUT Type);
+void T32Nx_ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_IT Type,TYPE_FUNCEN NewState);
+void T32Nx_SetCNT(T32N_TypeDef* T16Nx,uint32_t Value);
+void T32Nx_SetPRECNT(T32N_TypeDef* T32Nx,uint8_t Value);
+void T32Nx_SetPREMAT(T32N_TypeDef* T32Nx,uint8_t Value);
+void T32Nx_SetMAT0(T32N_TypeDef* T32Nx,uint32_t Value);
+void T32Nx_SetMAT1(T32N_TypeDef* T32Nx,uint32_t Value);
+void T32Nx_SetMAT2(T32N_TypeDef* T32Nx,uint32_t Value);
+void T32Nx_SetMAT3(T32N_TypeDef* T32Nx,uint32_t Value);
+uint32_t T32Nx_GetMAT0(T32N_TypeDef* T32Nx);
+uint32_t T32Nx_GetMAT1(T32N_TypeDef* T32Nx);
+uint32_t T32Nx_GetMAT2(T32N_TypeDef* T32Nx);
+uint32_t T32Nx_GetMAT3(T32N_TypeDef* T32Nx);
+uint32_t T32Nx_GetCNT(T32N_TypeDef* T32Nx);
+uint8_t T32Nx_GetPRECNT(T32N_TypeDef* T32Nx);
+FlagStatus T32Nx_GetFlagStatus(T32N_TypeDef* T32Nx,TIM_TYPE_IF TIM_Flag);
+ITStatus T32Nx_GetITStatus(T32N_TypeDef* T32Nx,TIM_TYPE_IT TIM_Flag);
+void T32Nx_ClearIFPendingBit(T32N_TypeDef* T32Nx,TIM_TYPE_IF TIM_Flag);
+
+#endif
+
+/*************************END OF FILE**********************/

+ 171 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_uart.h

@@ -0,0 +1,171 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名: lib_uart.h
+ *作 者: Liut
+ *版 本: V1.00
+ *日 期: 2017/07/14
+ *描 述: UART模块库函数头文件
+ *备 注: 适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBUART_H__
+#define __LIBUART_H__
+
+#include "ES8P508x.h"
+#include "type.h"
+#include "system_ES8P508x.h"
+
+/* 发送帧停止位选择 */
+typedef enum
+{
+    UART_StopBits_1 = 0x0 , //发送帧停止位:1位
+    UART_StopBits_2 = 0x1 , //发送帧停止位:2位
+}UART_TYPE_TXFS;
+
+/* 数据格式 */
+typedef enum
+{
+    UART_DataMode_7 = 0x0 ,    //数据格式:7位数据
+    UART_DataMode_8 = 0x1 ,    //数据格式:8位数据
+    UART_DataMode_9 = 0x2 ,    //数据格式:9位数据
+    UART_DataMode_7Odd = 0x4 , //数据格式:7位数据+奇校验
+    UART_DataMode_7Even = 0x5 , //数据格式:7位数据+偶校验
+    UART_DataMode_8Odd = 0x6 , //数据格式:8位数据+奇校验
+    UART_DataMode_8Even = 0x7 , //数据格式:8位数据+偶校验
+}UART_TYPE_DATAMOD;
+
+/* 端口极性 */
+typedef enum
+{
+    UART_Polar_Normal = 0x0 ,   //发送端口极性:正常
+    UART_Polar_Opposite = 0x1 , //发送端口极性:反向
+}UART_TYPE_RTXP;
+
+/* 波特率发生器时钟选择 */
+typedef enum
+{
+    UART_Clock_1 = 0x1 , //波特率发生器时钟:PCLK
+    UART_Clock_2 = 0x2 , //波特率发生器时钟:PCLK/2
+    UART_Clock_4 = 0x3 , //波特率发生器时钟:PCLK/4
+	  UART_Clock_8 = 0x4 , //波特率发生器时钟:PCLK/8
+	  
+}UART_TYPE_BCS;
+
+/* UART初始化配置结构体定义 */
+typedef struct
+{
+    UART_TYPE_TXFS  UART_StopBits;  //发送帧停止位选择
+    UART_TYPE_DATAMOD  UART_TxMode; //发送数据帧格式
+    UART_TYPE_RTXP  UART_TxPolar;   //发送端口极性
+    UART_TYPE_DATAMOD  UART_RxMode; //接收数据帧格式
+    UART_TYPE_RTXP  UART_RxPolar;   //接收端口极性
+    uint32_t  UART_BaudRate;        //传输波特率
+    UART_TYPE_BCS  UART_ClockSet;   //波特率发生器时钟选择
+}UART_InitStruType;
+
+/* 中断选择 */
+typedef enum
+{
+    UART_IT_TB = 0x0001 ,
+    UART_IT_RB = 0x0002 ,
+    UART_IT_RO = 0x0004 ,
+    UART_IT_FE = 0x0008 ,
+    UART_IT_PE = 0x0010 ,
+    UART_IT_TBWE = 0x0020 ,
+    UART_IT_TXIDLE = 0x1000 ,
+    UART_IT_RXIDLE = 0x2000 ,
+}UART_TYPE_IT;
+
+/* 标志位 */
+typedef enum
+{
+	  UART_FLAG_TB = 0x0001 ,
+    UART_FLAG_RB = 0x0002 ,
+    UART_FLAG_RO = 0x0004 ,
+    UART_FLAG_FE = 0x0008 ,
+    UART_FLAG_PE = 0x0010 ,
+    UART_FLAG_TBWE = 0x0020 ,
+    UART_FLAG_TXIDLE = 0x1000 ,
+    UART_FLAG_RXIDLE = 0x2000 ,
+}UART_TYPE_FLAG;
+
+/*  清除中断标志位 */
+typedef enum
+{
+    UART_Clr_RO = 0x0004 ,
+    UART_Clr_FE = 0x0008 ,
+    UART_Clr_PE = 0x0010 ,
+    UART_Clr_TBWE = 0x0020 ,
+}UART_CLR_IF;
+
+/* 发送、接收中断模式 */
+typedef enum
+{
+    UART_TRBIM_Byte = 0x0 ,     //中断:字节
+    UART_TRBIM_HalfWord = 0x1 , //中断:半字
+    UART_TRBIM_Word = 0x2 ,     //中断:字
+}UART_TYPE_TRBIM;
+
+/*************UART模块宏定义************/
+/* 发送使能控制 */
+#define UART0_TxEnable() (UART0->CON.TXEN = 1)
+#define UART1_TxEnable() (UART1->CON.TXEN = 1)
+#define UART2_TxEnable() (UART2->CON.TXEN = 1)
+#define UART3_TxEnable() (UART3->CON.TXEN = 1)
+#define UART4_TxEnable() (UART4->CON.TXEN = 1)
+#define UART5_TxEnable() (UART5->CON.TXEN = 1)
+#define UART0_TxDisable() (UART0->CON.TXEN = 0)
+#define UART1_TxDisable() (UART1->CON.TXEN = 0)
+#define UART2_TxDisable() (UART2->CON.TXEN = 0)
+#define UART3_TxDisable() (UART3->CON.TXEN = 0)
+#define UART4_TxDisable() (UART4->CON.TXEN = 0)
+#define UART5_TxDisable() (UART5->CON.TXEN = 0)
+
+/* 接收使能控制 */
+#define UART0_RxEnable() (UART0->CON.RXEN = 1)
+#define UART1_RxEnable() (UART1->CON.RXEN = 1)
+#define UART2_RxEnable() (UART2->CON.RXEN = 1)
+#define UART3_RxEnable() (UART3->CON.RXEN = 1)
+#define UART4_RxEnable() (UART4->CON.RXEN = 1)
+#define UART5_RxEnable() (UART5->CON.RXEN = 1)
+#define UART0_RxDisable() (UART0->CON.RXEN = 0)
+#define UART1_RxDisable() (UART1->CON.RXEN = 0)
+#define UART2_RxDisable() (UART2->CON.RXEN = 0)
+#define UART3_RxDisable() (UART3->CON.RXEN = 0)
+#define UART4_RxDisable() (UART4->CON.RXEN = 0)
+#define UART5_RxDisable() (UART5->CON.RXEN = 0)
+
+/* 发送器复位 */
+#define UART0_TxRst() (UART0->CON.TRST = 1)
+#define UART1_TxRst() (UART1->CON.TRST = 1)
+#define UART2_TxRst() (UART2->CON.TRST = 1)
+#define UART3_TxRst() (UART3->CON.TRST = 1)
+#define UART4_TxRst() (UART4->CON.TRST = 1)
+#define UART5_TxRst() (UART5->CON.TRST = 1)
+
+/* 接收器复位 */
+#define UART0_RxRst() (UART0->CON.RRST = 1)
+#define UART1_RxRst() (UART1->CON.RRST = 1)
+#define UART2_RxRst() (UART2->CON.RRST = 1)
+#define UART3_RxRst() (UART3->CON.RRST = 1)
+#define UART4_RxRst() (UART4->CON.RRST = 1)
+#define UART5_RxRst() (UART5->CON.RRST = 1)
+
+/************UART模块函数声明***********/
+void UART_Init(UART_TypeDef* UARTx,UART_InitStruType* UART_InitStruct);
+void UART_ITConfig(UART_TypeDef* UARTx,UART_TYPE_IT UART_IT,TYPE_FUNCEN NewState);
+void UART_TBIMConfig(UART_TypeDef* UARTx,UART_TYPE_TRBIM Type);
+void UART_RBIMConfig(UART_TypeDef* UARTx,UART_TYPE_TRBIM Type);
+void UART_SendByte(UART_TypeDef* UARTx,uint8_t Temp08);
+void UART_SendHalfWord(UART_TypeDef* UARTx,uint16_t Temp16);
+void UART_SendWord(UART_TypeDef* UARTx,uint32_t Temp32);
+uint8_t UART_RecByte(UART_TypeDef* UARTx);
+uint16_t UART_RecHalfWord(UART_TypeDef* UARTx);
+uint32_t UART_RecWord(UART_TypeDef* UARTx);
+FlagStatus UART_GetFlagStatus(UART_TypeDef* UARTx,UART_TYPE_FLAG UART_Flag);
+ITStatus UART_GetITStatus(UART_TypeDef* UARTx,UART_TYPE_IT UART_Flag);
+void UART_ClearITPendingBit(UART_TypeDef* UARTx,UART_CLR_IF UART_Flag);
+
+#endif
+
+/*************************END OF FILE**********************/

+ 100 - 0
bsp/essemi/es8p508x/libraries/Library/Include/lib_wdt.h

@@ -0,0 +1,100 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_wdt.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/02/04
+ *描  述:  看门狗模块库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#ifndef __LIBWDT_H__
+#define __LIBWDT_H__
+
+#include "system_ES8P508x.h"
+#include "ES8P508x.h"
+#include "type.h"
+
+/* WDT时钟选择 */
+typedef enum
+{
+    WDT_CLOCK_PCLK = 0x0,   //PCLK
+    WDT_CLOCK_WDT  = 0x1,   //WDT时钟源,32kHz
+} WDT_TYPE_CLKS;
+
+/* 初始化结构体 */
+typedef struct
+{
+    uint32_t WDT_Tms;       //定时时间,单位ms 
+    TYPE_FUNCEN WDT_IE;     //中断使能
+    TYPE_FUNCEN WDT_Rst;    //复位使能
+    WDT_TYPE_CLKS WDT_Clock;//时钟选择
+} IWDT_InitStruType;
+
+typedef enum
+{
+    WDT_WIN_25 = 0x0,   //25%窗口内禁止喂狗,窗口内喂狗产生复位
+    WDT_WIN_50 = 0x1,   //50%窗口内禁止喂狗,窗口内喂狗产生复位
+    WDT_WIN_75 = 0x2,   //75%窗口内禁止喂狗,窗口内喂狗产生复位
+    WDT_WIN_100 = 0x3,  //不禁止喂狗,喂狗将使看门狗计数器重载
+} WDT_TYPE_WIN;
+
+/* 初始化结构体 */
+typedef struct
+{
+    uint32_t WDT_Tms;       //定时时间,单位ms 
+    TYPE_FUNCEN WDT_IE;     //中断使能
+    TYPE_FUNCEN WDT_Rst;    //复位使能
+    WDT_TYPE_CLKS WDT_Clock;//时钟选择
+    WDT_TYPE_WIN WDT_Win;   //禁止喂狗窗口
+} WWDT_InitStruType;
+
+#define IWDT_RegUnLock()     (IWDT->LOCK.Word = 0x1ACCE551)
+#define IWDT_RegLock()       (IWDT->LOCK.Word = 0x0)
+
+#define IWDT_Enable()        {IWDT_RegUnLock();IWDT->CON.EN = 1;IWDT_RegLock();}
+#define IWDT_Disable()       {IWDT_RegUnLock();IWDT->CON.EN = 0;IWDT_RegLock();}
+
+#define IWDT_Clear()         {IWDT_RegUnLock();IWDT->INTCLR.INTCLR = 0;IWDT_RegLock();}
+
+#define IWDT_ITEnable()      {IWDT_RegUnLock();IWDT->CON.IE = 1;IWDT_RegLock();}
+#define IWDT_ITDisable()     {IWDT_RegUnLock();IWDT->CON.IE = 0;IWDT_RegLock();}
+
+#define IWDT_RstEnable()     {IWDT_RegUnLock();IWDT->CON.RSTEN = 1;IWDT_RegLock();}
+#define IWDT_RstDisable()    {IWDT_RegUnLock();IWDT->CON.RSTEN = 0;IWDT_RegLock();}
+
+#define IWDT_CLOCK_PCLK()    {IWDT_RegUnLock();IWDT->CON.CLKS = 0;IWDT_RegLock();}
+#define IWDT_CLOCK_WDT()     {IWDT_RegUnLock();IWDT->CON.CLKS = 1;IWDT_RegLock();}
+
+#define WWDT_RegUnLock()     (WWDT->LOCK.Word = 0x1ACCE551)
+#define WWDT_RegLock()       (WWDT->LOCK.Word = 0x0)
+
+#define WWDT_Enable()        {WWDT_RegUnLock();WWDT->CON.EN = 1;WWDT_RegLock();}
+#define WWDT_Disable()       {WWDT_RegUnLock();WWDT->CON.EN = 0;WWDT_RegLock();}
+
+#define WWDT_Clear()         {WWDT_RegUnLock();WWDT->INTCLR.INTCLR = 0;WWDT_RegLock();}
+
+#define WWDT_ITEnable()      {WWDT_RegUnLock();WWDT->CON.IE = 1;WWDT_RegLock();}
+#define WWDT_ITDisable()     {WWDT_RegUnLock();WWDT->CON.IE = 0;WWDT_RegLock();}
+
+#define WWDT_RstEnable()     {WWDT_RegUnLock();WWDT->CON.RSTEN = 1;WWDT_RegLock();}
+#define WWDT_RstDisable()    {WWDT_RegUnLock();WWDT->CON.RSTEN = 0;WWDT_RegLock();}
+
+#define WWDT_CLOCK_PCLK()    {WWDT_RegUnLock();WWDT->CON.CLKS = 0;WWDT_RegLock();}
+#define WWDT_CLOCK_WDT()     {WWDT_RegUnLock();WWDT->CON.CLKS = 1;WWDT_RegLock();}
+
+void IWDT_Init(IWDT_InitStruType *IWDT_InitStruct);
+void IWDT_SetReloadValue(uint32_t Value);
+uint32_t IWDT_GetValue(void);
+FlagStatus IWDT_GetFlagStatus(void);
+FlagStatus IWDT_GetITStatus(void);
+void WWDT_Init(WWDT_InitStruType *WDT_InitStruct);
+void WWDT_SetReloadValue(uint32_t Value);
+uint32_t WWDT_GetValue(void);
+FlagStatus WWDT_GetFlagStatus(void);
+FlagStatus WWDT_GetITStatus(void);
+
+#endif
+
+/*************************END OF FILE**********************/
+

+ 19 - 0
bsp/essemi/es8p508x/libraries/Library/Include/type.h

@@ -0,0 +1,19 @@
+/*********************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名:  type.h
+ *作  者:  Liut 
+ *版  本:  V1.01
+ *日  期:  2017/11/01
+ *描  述:  type define
+ *备  注:  适用于HRSDK-GDB-8P508x
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ **********************************************************/
+#ifndef __TYPE_H__
+#define __TYPE_H__
+
+typedef enum {DISABLE = 0, ENABLE = !DISABLE} TYPE_FUNCEN,FuncState,TYPE_PINTIE,TYPE_PINTMASK,TYPE_BUZZEN;
+typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus, PinStatus;
+typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
+
+
+#endif

+ 27 - 0
bsp/essemi/es8p508x/libraries/Library/Source/irqhandler.c

@@ -0,0 +1,27 @@
+#include "irqhandler.h"
+
+void NMI_IRQHandler(void)
+{
+
+}
+
+void HardFault_IRQHandler(void)
+{
+    while(1)
+    {
+    }
+}
+
+void SVC_IRQHandler(void)
+{
+
+}
+
+void PendSV_IRQHandler(void)
+{
+
+}
+void SysTick_Handler(void)
+{
+    systick_irq_cbk();
+}

+ 301 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_adc.c

@@ -0,0 +1,301 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_timer.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  ADC模块库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_adc.h"
+
+/***************************************************************
+  函数名:ADC_Init
+  描  述:初始化ADC模块
+  输入值:初始化配置结构体地址
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void ADC_Init(ADC_InitStruType * ADC_InitStruct)
+{
+		ADC->VREFCON.VREF_EN = ENABLE;    //内部VREFP使能
+	  ADC->VREFCON.IREF_EN = ENABLE;    //IREF使能位
+	  ADC->CON1.VCMBUF_EN = ENABLE;     //ADC共模电压VCM BUF使能
+	  ADC ->CON1.VCMBUF_HS = ENABLE;    //ADC共模电压VCM BUF高速模式使能
+	  ADC->CON1.HSEN = ENABLE;          //ADC转换速度:高速 
+	  ADC->CHS.VDD5_FLAG_EN = DISABLE;        //屏蔽VDD检测控制
+	
+    ADC->CON1.CLKS = ADC_InitStruct->ADC_ClkS;     //ADCCON1:bit3 ADC时钟源选择
+    ADC->CON1.CLKDIV = ADC_InitStruct->ADC_ClkDiv; //ADCCON1:bit2-0 ADC时钟源预分频
+    ADC->CON1.VREFP = ADC_InitStruct->ADC_VrefP;   //ADCCON1:bit9-8 ADC正向参考电压选择
+    ADC->CON1.SMPS = ADC_InitStruct->ADC_SampS;    //ADCCON1:bit12 ADC采样模式选择
+    ADC->CHS.CHS = ADC_InitStruct->ADC_ChS;        //ADCCHS:bit0-3 ADC模拟通道选择
+		ADC->CON1.ST = ADC_InitStruct->ST;             //ADCCON1:bit20-16 ADC采样时间选择 ST*2+1个Tadclk 
+	  //ADC->VREFCON.VREF_SEL=ADC_InitStruct->VREF_SEL;//内部参考电压选择
+	
+    ADC->CON1.VREFN = ADC_InitStruct->ADC_VREFN;                    //负向参考电压使能位
+    ADC->CON1.VRBUF_EN = ADC_InitStruct->ADC_VRBUF_EN;              //VREF BUF使能位
+}
+
+
+/***************************************************************
+  函数名:ADC_Set_CH
+  描  述:选择ADC模拟通道
+  输入值:通道
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void ADC_Set_CH(ADC_TYPE_CHS AdcCH)
+{
+    ADC->CHS.CHS = AdcCH;
+}
+
+/***************************************************************
+  函数名:ADC_GetConvValue
+  描  述:获取ADC转换结果
+  输入值:无
+  输出值:无
+  返回值:转换值
+ ***************************************************************/
+uint16_t ADC_GetConvValue(void)
+{   
+    return ((uint16_t)ADC->DR.DR);
+}
+
+/***************************************************************
+  函数名:ADC_GetConvStatus
+  描  述:获取ADC转换状态
+  输入值:无
+  输出值:无
+  返回值:RESET(完成)/SET(正在转换)
+ ***************************************************************/
+FlagStatus ADC_GetConvStatus(void)
+{
+    FlagStatus bitstatus = RESET;
+
+    /* 检测转换状态寄存器 */
+    if ((ADC->CON0.TRIG != (uint32_t)RESET))
+        bitstatus = SET;                    //正在转换
+    else
+        bitstatus = RESET;                  //转换完成
+
+    return  bitstatus;
+}
+
+/***************************************************************
+  函数名:ADC_ACPConfig
+  描  述:ADC 自动比较功能初始化
+  输入值:ADC_ACP_InitStruct 自动比较功能初始化结构体
+  输出值:无
+  返回值:SUCCESS 成功
+  ERROR 失败
+ ***************************************************************/
+ErrorStatus ADC_ACPConfig(ADC_ACP_TypeDef *ADC_ACP_InitStruct)
+{
+    if(ADC_ACP_InitStruct->ACPC_OVER_TIME > ADC_ACPC_OVFL_TIME_MAX
+       ||ADC_ACP_InitStruct->ACPC_TIMES > ADC_ACPC_TIMES_MAX
+       ||ADC_ACP_InitStruct->ACPC_MIN_TARGET > ADC_ACP_MIN_MAX
+       ||ADC_ACP_InitStruct->ACPC_MAX_TARGET > ADC_ACP_MAX_MAX)
+    {
+        return ERROR;
+    }
+
+    if(ADC_ACP_InitStruct->ACP_EN == ENABLE)
+    {
+        if(ADC->CON1.CLKS == ADC_ClkS_PCLK)
+        {
+            ADC->ACPC.CLKS = ADC_ACPC_CLKS_PCLK;
+        }
+        else
+        {
+            ADC->ACPC.CLKS = ADC_ACPC_CLKS_LRC;
+        }
+
+        ADC->ACPC.OVFL_TIME = ADC_ACP_InitStruct ->ACPC_OVER_TIME;
+        ADC->ACPC.TIMES = ADC_ACP_InitStruct->ACPC_TIMES;
+        ADC->IE.ACPOVIE = ENABLE;
+
+        /* 假设用户将高阀值设置成0(最小值),我们可以认为其想关闭该功能 */
+        if(ADC_ACP_InitStruct ->ACPC_MAX_TARGET ==0x0)
+        {
+            ADC->IE.ACPMAXIE = DISABLE;
+        }
+        else
+        {
+            ADC->ACPCMP.CMP_MAX =ADC_ACP_InitStruct ->ACPC_MAX_TARGET;
+            ADC->IE.ACPMAXIE = ENABLE;
+        }
+
+        /* 假设用户将低阀值设置成0xfff(最大值),我们可以认为其想关闭该功能 */
+        if(ADC_ACP_InitStruct ->ACPC_MIN_TARGET == 0xfff)
+        {
+            ADC->IE.ACPMINIE = DISABLE;
+        }
+        else
+        {
+            ADC->ACPCMP.CMP_MIN =ADC_ACP_InitStruct ->ACPC_MIN_TARGET;
+            ADC->IE.ACPMINIE = ENABLE;
+        }
+
+        ADC->CON0.ACP_EN = ENABLE;
+
+    }
+    else
+    {
+        ADC->CON0.ACP_EN = DISABLE;
+    }
+
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:ADC_SampStart
+  描  述:ADC 采样软件控制-启动函数
+  输入值:无
+  输出值:无
+  返回值:SUCCESS 成功
+  ERROR 失败
+ ***************************************************************/
+ErrorStatus ADC_SoftStart(void)
+{
+    if(ADC->CON1.SMPS == ADC_SMPS_HARD)
+        return ERROR;
+
+    ADC ->CON1.SMPON = SET;
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:ADC_SampStop
+  描  述:ADC 采样软件控制-停止函数
+  输入值:无
+  输出值:无
+  返回值:SUCCESS 成功
+  ERROR 失败
+ ***************************************************************/
+ErrorStatus ADC_SoftStop(void)
+{
+    if(ADC->CON1.SMPS == ADC_SMPS_HARD)
+        return ERROR;
+
+    ADC->CON1.SMPON = RESET;
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:ADC_GetACPMeanValue
+  描  述:ADC 获得单次自动比较平均值
+  输入值:无
+  输出值:无
+  返回值:采样数据
+ ***************************************************************/
+uint16_t ADC_GetACPMeanValue(void)
+{
+    return ((uint16_t)ADC->ACPMEAN.MEAN_DATA);
+}
+
+/***************************************************************
+  函数名:ADC_GetACPMINValue
+  描  述:ADC 获得单次自动比较平均值
+  输入值:无
+  输出值:无
+  返回值:采样数据
+ ***************************************************************/
+uint16_t ADC_GetACPMinValue(void)
+{
+    return ((uint16_t)ADC->ACPCMP.CMP_MIN);
+}
+
+/***************************************************************
+  函数名:ADC_GetACPMAXValue
+  描  述:ADC 获得单次自动比较平均值
+  输入值:无
+  输出值:无
+  返回值:采样数据
+ ***************************************************************/
+uint16_t ADC_GetACPMaxValue(void)
+{
+    return ((uint16_t)ADC->ACPCMP.CMP_MAX);
+}
+
+/***************************************************************
+  函数名:ADC_GetFlagStatus
+  描  述:读取ADC标志位状态
+  输入值:IFName:ADC中断标志
+  输出值:无
+  返回值:SET/RESET
+ ***************************************************************/
+FlagStatus ADC_GetFlagStatus(ADC_TYPE_IF IFName)
+{
+    FlagStatus bitstatus = RESET;
+
+    /* 检查中断标志位 */
+    if (((ADC->IF.Word & IFName) != (uint32_t)RESET))
+        bitstatus = SET;                    //转换完成
+    else
+        bitstatus = RESET;                  //无中断
+
+    return  bitstatus;
+}
+
+/***************************************************************
+  函数名:ADC_GetITStatus
+  描  述:读取ADC中断状态,未使能相应中断时不会返回SET
+  输入值:无
+  输出值:无
+  返回值:SET(中断)/RESET(无中断)
+ ***************************************************************/
+ITStatus ADC_GetITStatus(ADC_TYPE_IE IEName)
+{
+    ITStatus bitstatus = RESET;
+
+    /* 检查中断标志位 */
+    if (((ADC->IE.Word & IEName) != (uint32_t)RESET))
+        bitstatus = SET;                    //转换完成,进中断
+    else
+        bitstatus = RESET;                  //无中断
+
+    return  bitstatus;
+}
+
+/***************************************************************
+  函数名:ADC_ClearIFStatus
+  描  述:ADC 清除特定类型中断
+  输入值:IFName 中断类型选择
+  ADC_IF            ADC中断
+  ADC_IF_ACPMIN 自动转换低阀值超出中断
+  ADC_IF_ACPMAX 自动转换高阀值超出中断
+  ADC_IF_ACPOVER    自动转换溢出中断
+  输出值:无
+  返回值:SUCCESS 成功
+  ERROR 失败
+ ***************************************************************/
+ErrorStatus ADC_ClearIFStatus(ADC_TYPE_IF IFName)
+{
+    ADC->IF.Word = (uint32_t)IFName;
+
+    return SUCCESS;
+}
+/***************************************************************
+  函数名:ADC_Reset
+  描  述:ADC复位
+  输入值:无
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void ADC_Reset(void)
+{
+    ADC->CON0.Word = 0x00000030;
+    ADC->CON1.Word = 0x00041000;
+    ADC->CHS.Word = 0x00000100;
+    ADC->IE.Word = 0x00000000;
+    ADC->IF.Word = 0x00000000;
+    ADC->ACPC.Word = 0x00000000;
+    ADC->ACPCMP.Word = 0x0FFF0000;
+    ADC->VREFCON.Word = 0x00000000;
+}
+
+/*************************END OF FILE**********************/
+
+

+ 222 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_aes.c

@@ -0,0 +1,222 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名:  
+ *作  者:  AE 
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  
+ *备  注:  适用于 ES8P508芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_aes.h"
+
+/***************************************************************
+函数名:AES_Init
+描  述:AES功能初始化函数
+输入值:AES_InitStruct 初始化结构体
+输出值:无
+返回值:无
+***************************************************************/
+void AES_Init(AES_InitStruType * AES_InitStruct)
+{
+
+
+	AES_Reset();
+
+	AES->CON.ENCRYPT = AES_InitStruct->MODE;
+	return;
+}
+
+/***************************************************************
+函数名:AES_WriteKey
+描  述:AES写入密钥函数
+输入值:AES_KEY 待写入密钥
+输出值:无
+返回值:无
+***************************************************************/
+void AES_WriteKey(uint32_t *AES_KEY)
+{
+	uint32_t *address = AES_KEY;
+	
+	AES->KEY3.AES_KEY3 = *address;
+	address ++;
+	AES->KEY2.AES_KEY2 = *address;
+	address ++;
+	AES->KEY1.AES_KEY1 = *address;
+	address ++;
+	AES->KEY0.AES_KEY0 = *address;
+}
+
+/***************************************************************
+函数名:AES_ReadKey
+描  述:AES读出密钥函数
+输入值:无
+输出值:AES_DATA读出密钥存放位置
+返回值:无
+***************************************************************/
+void AES_ReadKey(uint32_t * AES_KEY)
+{
+	uint32_t *address = AES_KEY;
+	
+	*address = AES->KEY3.AES_KEY3;
+	address ++;
+	*address = AES->KEY2.AES_KEY2;
+	address ++;
+	*address = AES->KEY1.AES_KEY1;
+	address ++;
+	*address = AES->KEY0.AES_KEY0;
+	return;
+}
+
+/***************************************************************
+函数名:AES_WriteData
+描  述:AES写入数据函数
+输入值:AES_DATA 待写入数据
+输出值:无
+返回值:无
+***************************************************************/
+void AES_WriteData(uint32_t *AES_DATA)
+{
+	uint32_t *address = AES_DATA;
+	
+	AES->DATA3.AES_DATA3 = *address;
+	address ++;
+	AES->DATA2.AES_DATA2 = *address;
+	address ++;
+	AES->DATA1.AES_DATA1 = *address;
+	address ++;
+	AES->DATA0.AES_DATA0 = *address;
+}
+
+/***************************************************************
+函数名:AES_WriteData
+描  述:AES读出数据函数
+输入值:无
+输出值:AES_DATA读出数据存放位置
+返回值:无
+***************************************************************/
+void AES_ReadData(uint32_t * AES_DATA)
+{
+	uint32_t *address = AES_DATA;
+	
+	*address = AES->DATA3.AES_DATA3;
+	address ++;
+	*address = AES->DATA2.AES_DATA2;
+	address ++;
+	*address = AES->DATA1.AES_DATA1;
+	address ++;
+	*address = AES->DATA0.AES_DATA0;
+	return;
+}
+
+/***************************************************************
+函数名:AES_ITConfig
+描  述:AES中断使能
+输入值:AES_IE
+	NewState Enable/Disable
+输出值:无
+返回值:无
+***************************************************************/
+void AES_ITConfig(AES_TYPE_IT AES_IE, TYPE_FUNCEN NewState)
+{
+	uint32_t Word = AES->CON.Word&0xffffff8e;
+	
+	if(AES->CON.GO_DONE == 1)
+	{
+		return;
+	}
+	
+	if (NewState == ENABLE)
+		Word |= (uint32_t)AES_IE;
+	else
+		
+		Word &= ~(uint32_t)AES_IE;
+
+	AES->CON.Word = Word;
+	return;
+
+}
+
+/***************************************************************
+函数名:AES_GetFlagStatus
+描  述:AES获得特定中断标志函数
+输入值:IFName 
+		AES_IF_IF 加解密完成中断
+输出值:无
+返回值:中断标志与否
+***************************************************************/
+FlagStatus AES_GetFlagStatus(AES_TYPE_IF IFName)
+{
+
+	if(AES->CON.Word & IFName) {
+		return SET;
+	}
+	return RESET;
+}
+
+/***************************************************************
+函数名:AES_ClearITPendingBit
+描  述:AES清除特定中断标志函数
+输入值:IFName 
+		AES_IF_DONE 加解密完成中断
+输出值:无
+返回值:无
+***************************************************************/
+void AES_ClearITPendingBit(void)
+{
+	/* 考虑到IF与GO_DONE在同一个word中,对IF赋值可能会存在一些问题 
+	 * 例如GO_DONE是1时,取值,随后GO_DONE变成0,而赋值会以原来的1再对其进行赋值
+	 * 该部分需要进行测试
+	 */
+	
+	if(AES->CON.GO_DONE == SET)
+	{
+		return;
+	}
+
+	AES->CON.IF = SET;
+
+	return;
+}
+
+/***************************************************************
+函数名:AES_GetDoneStatus
+描  述:AES获得是否加/解密完成
+输入值:无
+输出值:无
+返回值:AES_DONE_NO 加密未完成
+	AES_DONE_YES 未加密或者加密已经完成
+***************************************************************/
+AES_TYPE_DONE AES_GetDoneStatus(void)
+{
+	if(AES->CON.GO_DONE == 1)
+	{
+		return AES_DONE_NO;
+	}
+
+	return AES_DONE_YES;
+}
+
+/***************************************************************
+函数名:AES_Reset
+描  述:AES复位
+输入值:无
+输出值:无
+返回值:无
+***************************************************************/
+void AES_Reset(void)
+{
+	AES->DATA0.Word = 0x00000000;
+	AES->DATA1.Word = 0x00000000;
+	AES->DATA2.Word = 0x00000000;
+	AES->DATA3.Word = 0x00000000;
+
+	AES->KEY0.Word = 0x00000000;
+	AES->KEY1.Word = 0x00000000;
+	AES->KEY2.Word = 0x00000000;
+	AES->KEY3.Word = 0x00000000;
+
+	AES->CON.Word = 0x00000000;
+}
+
+

+ 96 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_crc.c

@@ -0,0 +1,96 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名:  
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_crc.h"
+
+ /***************************************************************
+  函数名:CRC_getTypeValue
+  描  述:配置并返回一个CRC_CON配置参数
+  输入值:con_value CRC_CON 数据配置值结构体
+  返回值:CRC_CON配置值
+ ***************************************************************/
+uint32_t CRC_getTypeValue(CRC_CONValueStruType con_value)
+{
+	uint32_t type =0;
+	type = (con_value.xorout | con_value.refout | con_value.refin |\
+		con_value.mode|con_value.hs_type|con_value.init_data_type);
+	return type;
+}
+
+ /***************************************************************
+  函数名:CRC_EmptayCheck
+  描  述:查空函数
+  输入值:address: 查空区域首地址, data_len:查空区域字节长度
+  返回值:1:成功,0 :失败
+ ***************************************************************/
+uint32_t CRC_EmptayCheck(void* address, uint32_t data_len)
+{
+    CRC_EM CRC_EmptayCheck = (CRC_EM)(*(uint32_t *)CRC_EmptayCheck_addr);
+
+    uint32_t result;
+    __ASM("CPSID i");
+    result = (*CRC_EmptayCheck)(address, data_len);
+    __ASM("CPSIE i");
+    return result;
+}
+
+ /***************************************************************
+  函数名:CRC_FlashVerify
+  描  述:FLASH校验函数
+  输入值:address: 校验区域首地址, data_len:校验区域字节长度, type:校验方式配置
+  返回值:CRC校验码
+ ***************************************************************/
+uint32_t CRC_FlashVerify(void* address, uint32_t data_len, uint32_t type)
+{
+    CRC_FL CRC_FlashVerify = (CRC_FL)(*(uint32_t *)CRC_FlashVerify_addr);
+
+    uint32_t result;
+    __ASM("CPSID i");
+    result = (*CRC_FlashVerify)(address, data_len, type);
+    __ASM("CPSIE i");
+    return result;
+}
+
+ /***************************************************************
+  函数名:CRC_UserCal
+  描  述:用户数据校验函数
+  输入值:address: 用户校验数据首地址, data_len:校验区域字节长度, type:校验方式配置
+  返回值:CRC校验码
+ ***************************************************************/
+uint32_t CRC_UserCal(void* address, uint32_t data_len, uint32_t type)
+{
+    CRC_US CRC_UserCal = (CRC_US)(*(uint32_t *)CRC_UserCal_addr);
+
+    uint32_t result;
+    __ASM("CPSID i");
+    result = (*CRC_UserCal)(address, data_len, type);
+    __ASM("CPSIE i");
+    return  result;
+}
+
+ /***************************************************************
+  函数名:CRC_CheckReset
+  描  述:CRC复位查询函数
+  输入值:无
+  返回值:复位标志,1:有复位标志,0:无复位标志
+ ***************************************************************/
+uint32_t CRC_CheckReset(void)
+{
+    CRC_CH CRC_CheckReset = (CRC_CH)(*(uint32_t *)CRC_CheckReset_addr);
+
+    uint32_t result;
+    __ASM("CPSID i");
+    result = (*CRC_CheckReset)();
+    __ASM("CPSIE i");
+    return result;
+}
+
+/************************END OF FILE**************************/
+

+ 355 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_flashiap.c

@@ -0,0 +1,355 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_flashiap.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  flash读写库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_flashiap.h"
+
+/***************************************************************
+  函数名:FlashIap_Close_WPROT
+  描  述:IAP关闭写保护
+  输入值:Page:0-63,每page对应2K字节,64 为INFO区
+  输出值:无
+  返回值:成功、失败
+ ***************************************************************/
+ErrorStatus FlashIap_Close_WPROT(uint8_t Page)
+{
+    if(Page > 64)
+        return ERROR;
+
+    if(Page == 64)
+    {
+        IAP->WPROT2.Word = 0x00000000;
+        return SUCCESS;
+    }
+
+    if(Page < 32)
+    {
+        IAP->WPROT0.Word &=~ ((uint32_t)0x1 << Page);
+    }
+    else
+    {
+        Page -= 32;
+        IAP->WPROT1.Word &=~ ((uint32_t)0x1 << Page);
+    }
+
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:FlashIap_Open_WPROT
+  描  述:IAP开启写保护
+  输入值:Page:0-63,每page对应2K字节,,64 为INFO区
+  输出值:无
+  返回值:成功、失败
+ ***************************************************************/
+ErrorStatus FlashIap_Open_WPROT(uint8_t Page)
+{
+    if(Page > 64)
+        return ERROR;
+
+    if(Page == 64)
+    {
+        IAP->WPROT2.Word = 0x00000001;
+        return SUCCESS;
+    }
+
+    if(Page < 32)
+    {
+        IAP->WPROT0.Word &=~ ((uint32_t)0x1 << Page);
+        IAP->WPROT0.Word |=  ((uint32_t)0x1 << Page);
+    }
+    else
+    {
+        Page -= 32;
+        IAP->WPROT1.Word &=~ ((uint32_t)0x1 << Page);
+        IAP->WPROT1.Word |=  ((uint32_t)0x1 << Page);
+    }
+
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:FlashIap_CloseAll_WPROT
+  描  述:IAP关闭所有写保护
+  输入值:Page:0-63,每page对应2K字节
+  输出值:无
+  返回值:成功、失败
+ ***************************************************************/
+ErrorStatus FlashIap_CloseAll_WPROT(void)
+{
+    IAP->WPROT0.Word = 0x00000000;
+    IAP->WPROT1.Word = 0x00000000;
+    IAP->WPROT2.Word = 0x00000000;
+
+    return SUCCESS;
+}
+/***************************************************************
+  函数名:FlashIap_OpenAll_WPROT
+  描  述:IAP打开所有写保护
+  输入值:
+  输出值:无
+  返回值:成功、失败
+ ***************************************************************/
+ErrorStatus FlashIap_OpenAll_WPROT(void)
+{
+    IAP->WPROT0.Word = 0xFFFFFFFF;
+    IAP->WPROT1.Word = 0xFFFFFFFF;
+    IAP->WPROT2.Word = 0xFFFFFFFF;
+
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:FlashIap_Unlock
+  描  述:IAP解锁与访问请求
+  输入值:无
+  输出值:无
+  返回值:成功、失败
+ ***************************************************************/
+ErrorStatus FlashIap_Unlock(void)
+{
+    uint16_t Temp16;
+
+    FlashIAP_RegUnLock();              //解锁 IAP
+
+    FlashIAP_Enable();                 //使能IAP
+
+    FlashIAP_REQ();                    //访问请求
+
+    for(Temp16 = 0; Temp16 < 0xFFFF; Temp16++)    //等待FLASH应答信号
+    {
+        if(IAP->CON.FLASH_ACK != 0)
+            break;
+    }
+
+    if(Temp16 == 0xFFFF)
+        return ERROR;
+    else
+        return SUCCESS;
+}
+
+/***************************************************************
+  函数名:FlashIap_WriteEnd
+  描  述:IAP写结束
+  输入值:无
+  输出值:无
+  返回值:成功、失败
+ ***************************************************************/
+ErrorStatus FlashIap_WriteEnd(void)
+{
+    uint32_t  Temp32;
+
+    FlashIAP_RegUnLock();                           //IAP解锁
+
+    IAP->CON.Word &= 0xFFFFFFEE;                    //IAP访问FLASH请求(结束)
+
+    for(Temp32 = 0; Temp32 < 0xFFFF; Temp32++)      //等待FLASH应答信号(结束)
+    {
+        if(IAP->CON.FLASH_ACK == 0)
+            break;
+    }
+
+    if(Temp32 == 0xFFFF)
+        return ERROR;
+    else
+        return SUCCESS;
+}
+
+/***************************************************************
+  函数名:FlashIap_ErasePage
+  描  述:IAP页擦除
+  输入值:Page_Addr:页地址
+  输出值:无
+  返回值:成功、失败
+ ***************************************************************/
+ErrorStatus FlashIap_ErasePage(uint8_t Page_Addr)
+{
+    uint16_t  Temp16;
+    uint32_t temp;
+
+    temp = __get_PRIMASK();                 //获取PRIMASK寄存器当前状态
+    __disable_irq();                        //屏蔽所有中断
+
+    if(FlashIap_Unlock() == ERROR)
+    {
+        __set_PRIMASK(temp);                //恢复PRIMASK寄存器状态
+        return ERROR;
+    }
+
+    if(FlashIap_CloseAll_WPROT() == ERROR)
+    {
+        __set_PRIMASK(temp);
+        return ERROR;
+    }
+
+    IAP->ADDR.IAPPA = Page_Addr;            //输入页地址   
+
+    IAP->TRIG.TRIG = 0x00005EA1;            //输入编程命令
+
+    for(Temp16 = 0; Temp16 < 0xFFFF; Temp16++)  
+    {                                       //判断IAP工作状态
+        if((IAP->STA.Word & (uint32_t)0x01) == (uint32_t)0x00)
+            break;
+    }
+
+    if(Temp16 == 0xFFFF)
+    {
+        __set_PRIMASK(temp);                //恢复PRIMASK寄存器状态
+        return ERROR;
+    }
+
+    for(Temp16 = 0; Temp16 < 0xFFFF; Temp16++)  
+    {
+        if((IAP->STA.Word & (uint32_t)0x02) == (uint32_t)0x02) //判断IAP页擦除标志
+            break;
+    }
+
+    if(Temp16 == 0xFFFF)
+    {
+        __set_PRIMASK(temp);                //恢复PRIMASK寄存器状态
+        return ERROR;
+    }
+
+    if(FlashIap_WriteEnd() == ERROR)
+    {
+        __set_PRIMASK(temp);                //恢复PRIMASK寄存器状态
+        return ERROR;
+    }
+
+    if(FlashIap_OpenAll_WPROT() == ERROR)
+    {
+        __set_PRIMASK(temp);
+        return ERROR;
+    }
+
+    __set_PRIMASK(temp);                    //恢复PRIMASK寄存器状态
+
+    return SUCCESS;
+}  
+
+/***************************************************************
+  函数名:FlashIap_WriteCont
+  描  述:IAP连续写
+  输入值:Unit_addr:单元地址 、 Page_addr:页地址 、 Data32:数据
+  输出值:无
+  返回值:成功、失败
+ ***************************************************************/
+ErrorStatus FlashIap_WriteCont(uint8_t Unit_addr, uint8_t Page_addr, uint32_t Data32)
+{
+    uint16_t  temp16;
+
+    IAP->ADDR.IAPPA = Page_addr;       //输入地址 
+    IAP->ADDR.IAPCA = Unit_addr;
+
+    IAP->DATA.DATA = Data32;          //输入数据
+    IAP->TRIG.TRIG = 0x00005DA2;      //输入编程命令
+
+    for(temp16 = 0; temp16 < 0xFFFF; temp16++)
+    {
+        if((IAP->STA.Word & (uint32_t)0x01) == (uint32_t)0x00)  //判断IAP工作状态
+            break;
+    }
+
+    if(temp16 == 0xFFFF)
+        return ERROR;
+
+    for(temp16 = 0; temp16 < 0xFFFF; temp16++)
+    {
+        if((IAP->STA.Word & 0x04)==0x04)  //判断IAP编程结束标志
+            break;
+    }
+
+    if(temp16 == 0xFFFF)
+        return ERROR;
+
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:FlashIap_WriteWord
+  描  述:IAP写一个字
+  输入值:Unit_addr:单元地址 、 Page_addr:页地址 、 Data32:数据
+  输出值:无
+  返回值:成功、失败
+ ***************************************************************/
+ErrorStatus FlashIap_WriteWord(uint8_t Unit_addr, uint8_t Page_addr, uint32_t Data32)
+{
+    uint32_t temp;
+
+    temp = __get_PRIMASK();                 //获取PRIMASK寄存器当前状态
+    __disable_irq();                        //屏蔽所有中断
+
+    if(FlashIap_Unlock() == ERROR)
+    {
+        __set_PRIMASK(temp);                //恢复PRIMASK寄存器状态
+        return ERROR;
+    }
+
+    if(FlashIap_CloseAll_WPROT() == ERROR)
+    {
+        __set_PRIMASK(temp);                //关闭所有写保护状态
+        return ERROR;
+    }
+
+    if(FlashIap_WriteCont(Unit_addr, Page_addr, Data32) == ERROR)
+    {
+        __set_PRIMASK(temp);                //恢复PRIMASK寄存器状态
+        return ERROR;
+    }
+
+    if(FlashIap_WriteEnd() == ERROR)
+    {
+        __set_PRIMASK(temp);                //恢复PRIMASK寄存器状态
+        return ERROR;
+    }
+
+    if(FlashIap_OpenAll_WPROT() == ERROR)
+    {
+        __set_PRIMASK(temp);                //打开所有写保护状态
+        return ERROR;
+    }
+
+    __set_PRIMASK(temp);                    //恢复PRIMASK寄存器状态
+
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:Flash_Read
+  描  述:Flash读数据
+  输入值:Ram_Addr:读出数据的存放地址 、 Flash_Addr:Flash地址(0x00000000 ~ 0x0001FFFF)、 Len:读取的字长度
+  输出值:读出的数据
+  返回值:成功、失败
+ ***************************************************************/
+ErrorStatus Flash_Read(uint32_t * Ram_Addr, uint32_t Flash_Addr,  uint8_t Len)
+{
+    uint8_t  i;
+    uint32_t *ram_addr32;
+    const uint32_t *flash_addr32;
+
+    ram_addr32 = (uint32_t *)Ram_Addr;
+    flash_addr32 = (const uint32_t *)Flash_Addr;
+
+    if((Len == 0) & (Len>(0x20000 - Flash_Addr) / 4))  //判断读取长度是否合法
+    {
+        return ERROR;
+    }
+
+    for(i=0; i<Len; i++)
+    {
+        *ram_addr32 = *flash_addr32;
+        ram_addr32++;
+        flash_addr32++;
+    }
+
+    return SUCCESS;
+}
+
+/*************************END OF FILE**********************/
+

+ 619 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_gpio.c

@@ -0,0 +1,619 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名: lib_gpio.c
+ *作 者: Liut
+ *版 本: V1.00
+ *日 期: 2017/07/14
+ *描 述: flash读写库函数头文件
+ *备 注: 适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_gpio.h"
+extern uint32_t SystemCoreClock;
+/***************************************************************
+  函数名:GPIO_Init
+  描  述:GPIO初始化
+  输入值:GPIOx:可以是GPIOA/GPIOB 、 PINx:根据芯片选择需要的引脚 、 GPIO_InitStruct:初始化配置结构体地址
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIO_Init(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_InitStruType* GPIO_InitStruct)
+{
+	if (GPIO_InitStruct->GPIO_Signal == GPIO_Pin_Signal_Analog) {
+		GPIO_SetSingalTypeFromPin(GPIOx, PINx, GPIO_Pin_Signal_Analog);
+		GPIO_SetDirRegFromPin(GPIOx, PINx, GPIO_Dir_In);
+		GPIO_SetFuncxRegFromPin(GPIOx, PINx, GPIO_Func_0);
+	} 
+	else {
+		GPIO_SetSingalTypeFromPin(GPIOx, PINx, GPIO_Pin_Signal_Digital);
+		GPIO_SetDirRegFromPin(GPIOx, PINx, GPIO_InitStruct->GPIO_Direction);
+		GPIO_SetFuncxRegFromPin(GPIOx, PINx, GPIO_InitStruct->GPIO_Func);
+
+		if (GPIO_InitStruct->GPIO_Direction == GPIO_Dir_Out) {
+			GPIO_SetODERegFromPin(GPIOx, PINx, GPIO_InitStruct->GPIO_OD);
+			GPIO_SetDSRegFromPin(GPIOx, PINx, GPIO_InitStruct->GPIO_DS);
+		} 
+		GPIO_SetPUERegFromPin(GPIOx, PINx, GPIO_InitStruct->GPIO_PUEN);
+		GPIO_SetPDERegFromPin(GPIOx, PINx, GPIO_InitStruct->GPIO_PDEN);
+	}
+}
+
+/***************************************************************
+  函数名:GPIO_SetFuncxRegFromPin
+  描  述:设置GPIO引脚的功能复用
+  输入值:Pin:目的引脚
+  Func:功能复用编号
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIO_SetFuncxRegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_TYPE_FUNC Func)
+{
+	uint32_t value;
+
+	switch (Func) {
+		case GPIO_Func_0:
+			value = 0;
+			break;
+		case GPIO_Func_1:
+			value = 1;
+			break;
+		case GPIO_Func_2:
+			value = 2;
+			break;
+		case GPIO_Func_3:
+			value = 3;
+			break;
+		default:
+			value = 0;
+			break;
+	}
+
+	/* 引脚功能设置 */
+	if(GPIOx == GPIOB){
+	  switch (PINx) {
+		  case GPIO_Pin_0:
+			  GPIO->PBFUNC0.PB0 = value;
+			  break;
+		  case GPIO_Pin_1:
+			  GPIO->PBFUNC0.PB1 = value;
+			  break;
+		  case GPIO_Pin_2:
+			  GPIO->PBFUNC0.PB2 = value;
+			  break;
+		  case GPIO_Pin_3:
+			  GPIO->PBFUNC0.PB3 = value;
+		    break;
+	    case GPIO_Pin_4:
+		    GPIO->PBFUNC0.PB4 = value;
+			  break;
+		  case GPIO_Pin_5:
+			  GPIO->PBFUNC0.PB5 = value;
+			  break;
+		  case GPIO_Pin_6:
+			  GPIO->PBFUNC0.PB6 = value;
+			  break;
+		  case GPIO_Pin_7:
+			  GPIO->PBFUNC0.PB7 = value;
+			  break;
+		  case GPIO_Pin_8:
+			  GPIO->PBFUNC1.PB8 = value;
+			  break;
+		  case GPIO_Pin_9:
+			  GPIO->PBFUNC1.PB9 = value;
+			  break;
+		  case GPIO_Pin_10:
+			  GPIO->PBFUNC1.PB10 = value;
+			  break;
+		  case GPIO_Pin_11:
+			  GPIO->PBFUNC1.PB11 = value;
+			  break;
+		  case GPIO_Pin_12:
+			  GPIO->PBFUNC1.PB12 = value;
+			  break;
+		  case GPIO_Pin_13:
+			  GPIO->PBFUNC1.PB13 = value;
+			  break;
+			default:
+				break;
+		}
+	}
+		
+	else{
+		switch (PINx) {
+		  case GPIO_Pin_0:
+			  GPIO->PAFUNC0.PA0 = value;
+			  break;
+		  case GPIO_Pin_1:
+			  GPIO->PAFUNC0.PA1 = value;
+			  break;
+		  case GPIO_Pin_2:
+			  GPIO->PAFUNC0.PA2 = value;
+			  break;
+		  case GPIO_Pin_3:
+			  GPIO->PAFUNC0.PA3 = value;
+			  break;
+		  case GPIO_Pin_4:
+			  GPIO->PAFUNC0.PA4 = value;
+			  break;
+		  case GPIO_Pin_5:
+			  GPIO->PAFUNC0.PA5 = value;
+			  break;
+		  case GPIO_Pin_6:
+			  GPIO->PAFUNC0.PA6 = value;
+			  break;
+		  case GPIO_Pin_7:
+				GPIO->PAFUNC0.PA7 = value;
+				break;
+			case GPIO_Pin_8:
+				GPIO->PAFUNC1.PA8 = value;
+				break;
+			case GPIO_Pin_9:
+				GPIO->PAFUNC1.PA9 = value;
+				break;
+			case GPIO_Pin_10:
+				GPIO->PAFUNC1.PA10 = value;
+				break;
+			case GPIO_Pin_11:
+				GPIO->PAFUNC1.PA11 = value;
+				break;
+			case GPIO_Pin_12:
+				GPIO->PAFUNC1.PA12 = value;
+				break;
+			case GPIO_Pin_13:
+				GPIO->PAFUNC1.PA13 = value;
+				break;
+			case GPIO_Pin_14:
+				GPIO->PAFUNC1.PA14 = value;
+				break;
+			case GPIO_Pin_15:
+				GPIO->PAFUNC1.PA15 = value;
+				break;
+			case GPIO_Pin_16:
+				GPIO->PAFUNC2.PA16 = value;
+				break;
+			case GPIO_Pin_17:
+				GPIO->PAFUNC2.PA17 = value;
+				break;
+			case GPIO_Pin_18:
+				GPIO->PAFUNC2.PA18 = value;
+				break;
+			case GPIO_Pin_19:
+				GPIO->PAFUNC2.PA19 = value;
+				break;
+			case GPIO_Pin_20:
+				GPIO->PAFUNC2.PA20 = value;
+				break;
+			case GPIO_Pin_21:
+				GPIO->PAFUNC2.PA21 = value;
+				break;
+			case GPIO_Pin_22:
+				GPIO->PAFUNC2.PA22 = value;
+				break;
+			case GPIO_Pin_23:
+				GPIO->PAFUNC2.PA23 = value;
+				break;
+			case GPIO_Pin_24:
+				GPIO->PAFUNC3.PA24 = value;
+				break;
+			case GPIO_Pin_25:
+				GPIO->PAFUNC3.PA25 = value;
+				break;
+			case GPIO_Pin_26:
+				GPIO->PAFUNC3.PA26 = value;
+				break;
+			case GPIO_Pin_27:
+				GPIO->PAFUNC3.PA27 = value;
+				break;
+			case GPIO_Pin_28:
+				GPIO->PAFUNC3.PA28 = value;
+				break;
+			case GPIO_Pin_29:
+				GPIO->PAFUNC3.PA29 = value;
+				break;
+			case GPIO_Pin_30:
+				GPIO->PAFUNC3.PA30 = value;
+				break;
+			case GPIO_Pin_31:
+				GPIO->PAFUNC3.PA31 = value;
+				break;
+			default:
+				break;
+		}
+	}
+	return;
+}
+
+/***************************************************************
+  函数名:GPIO_SetSingalTypeFromPin
+  描  述:设置引脚的信号类型
+  输入值:Pin: 目的引脚
+  Signal: 引脚的信号类型
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIO_SetSingalTypeFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_Pin_Signal GPIO_Signal)
+{
+	if(GPIOx == GPIOB) {
+		if (GPIO_Signal == GPIO_Pin_Signal_Digital)
+			GPIO->PBINEB.Word &= (~(1 << PINx));
+		else
+			GPIO->PBINEB.Word |= (1 << PINx);
+	} 
+	else{
+		if (GPIO_Signal == GPIO_Pin_Signal_Digital)
+			GPIO->PAINEB.Word &= (~(1 << PINx));
+		else
+			GPIO->PAINEB.Word |= (1 << PINx);
+	}
+
+	return;
+}
+
+/***************************************************************
+  函数名:GPIO_SetDirRegFromPin
+  描  述:设置引脚的输入或输出方向
+  输入值:Pin: 目的引脚
+  Dir:引脚方向
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIO_SetDirRegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_TYPE_DIR Dir)
+{
+	if (GPIOx == GPIOB) {
+		if (Dir == GPIO_Dir_In)
+			GPIO->PBDIRBSR.Word = (1 << PINx);
+		else
+			GPIO->PBDIRBCR.Word = (1 << PINx);
+	} 
+	else {
+		if (Dir == GPIO_Dir_In)
+			GPIO->PADIRBSR.Word = (1 << PINx);
+		else
+			GPIO->PADIRBCR.Word = (1 << PINx);
+	}
+
+	return;
+}
+
+/***************************************************************
+  函数名:GPIO_SetODERegFromPin
+  描  述:设置引脚的输出开漏方式
+  输入值:Pin: 目的引脚
+ODE: 输出开漏方式
+输出值:无
+返回值:无
+ ***************************************************************/
+void GPIO_SetODERegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_ODE_Output ODE)
+{
+	if (GPIOx == GPIOB) {
+		if (ODE == GPIO_ODE_Output_Disable)
+			GPIO->PBODE.Word &= (~(1 << PINx));
+		else
+			GPIO->PBODE.Word |= (1 << PINx);
+	} 
+	else {
+		if (ODE == GPIO_ODE_Output_Disable)
+			GPIO->PAODE.Word &= (~(1 << PINx));
+		else
+			GPIO->PAODE.Word |= (1 << PINx);
+	}
+
+	return;
+}
+
+/***************************************************************
+  函数名:GPIO_SetDSRegFromPin
+  描  述:设置引脚的输出驱动能力
+  输入值:Pin: 目的引脚
+DS: 电流驱动方式
+输出值:无
+返回值:无
+ ***************************************************************/
+void GPIO_SetDSRegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_TYPE_DS DS)
+{
+	if (GPIOx == GPIOB) {
+		if (DS == GPIO_DS_Output_Normal)
+			GPIO->PBDS.Word &= (~(1 << PINx));
+		else
+			GPIO->PBDS.Word |= (1 << PINx);
+	} 
+	else {
+		if (DS == GPIO_DS_Output_Normal)
+			GPIO->PADS.Word &= (~(1 << PINx));
+		else
+			GPIO->PADS.Word |= (1 << PINx);
+	}
+
+	return;
+}
+
+/***************************************************************
+  函数名:GPIO_SetPUERegFromPin
+  描  述:设置引脚的弱上拉方式
+  输入值:Pin: 目的引脚
+PUE: 弱上拉方式
+输出值:无
+返回值:无
+ ***************************************************************/
+void GPIO_SetPUERegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_PUE_Input PUE)
+{
+	if (GPIOx == GPIOB) {
+		if (PUE == GPIO_PUE_Input_Disable)
+			GPIO->PBPUE.Word &= (~(1 << PINx));
+		else
+			GPIO->PBPUE.Word |= (1 << PINx);
+	} 
+	else {
+		if (PUE == GPIO_PUE_Input_Disable)
+			GPIO->PAPUE.Word &= (~(1 << PINx));
+		else
+			GPIO->PAPUE.Word |= (1 << PINx);
+	}
+}
+
+/***************************************************************
+  函数名:GPIO_SetPDERegFromPin
+  描  述:设置引脚的弱下拉方式
+  输入值:Pin: 目的引脚
+  PDE:弱下拉方式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIO_SetPDERegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_PDE_Input PDE)
+{
+	if (GPIOx == GPIOB) {
+		if (PDE == GPIO_PDE_Input_Disable)
+			GPIO->PBPDE.Word &= (~(1 << PINx));
+		else
+			GPIO->PBPDE.Word |= (1 << PINx);
+	} 
+	else {
+		if (PDE == GPIO_PDE_Input_Disable)
+			GPIO->PAPDE.Word &= (~(1 << PINx));
+		else
+			GPIO->PAPDE.Word |= (1 << PINx);
+	}
+
+	return;
+}
+
+/***************************************************************
+  函数名:GPIO_Write
+  描  述:GPIO端口写数据
+  输入值:GPIOx:可以是GPIOA/GPIOB 、 Value要写的数据——注意:有些不存在的引脚,设置的值相对应的位是无作用的
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIO_Write(GPIO_TYPE GPIOx, uint32_t Value)
+{
+    if(GPIOx == GPIOA)
+        GPIO->PADATA.Word = Value;
+    else if(GPIOx == GPIOB)
+        GPIO->PBDATA.Word = Value;
+}
+
+/***************************************************************
+  函数名:GPIO_Read
+  描  述:GPIO端口读数据
+  输入值:GPIOx:可以是GPIOA/GPIOB
+  输出值:无
+  返回值:读出的数据——注意:有些不存在的引脚,读出的值相对应的位是无效的
+ ***************************************************************/
+uint32_t GPIO_Read(GPIO_TYPE GPIOx)
+{
+    if(GPIOx == GPIOA)
+        return GPIO->PAPORT.Word;
+    else if(GPIOx == GPIOB)
+        return GPIO->PBPORT.Word;
+
+    return 0;
+}
+
+/***************************************************************
+  函数名:GPIO_ReadBit
+  描  述:GPIO端口读某位数据
+  输入值:GPIOx:可以是GPIOA/GPIOB 、 PINx:GPIO_Pin_0 —— GPIO_Pin_31
+  输出值:无
+  返回值:读出的数据——注意:有些不存在的引脚,读出的值是无效的
+ ***************************************************************/
+PinStatus GPIO_ReadBit(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx)
+{
+    PinStatus bitstatus = RESET;
+
+    if(GPIOx == GPIOA)
+    {
+        if((GPIO->PAPORT.Word&((uint32_t)0x1<<PINx)) != RESET)
+            bitstatus = SET;
+        else
+            bitstatus = RESET;
+    }
+    else if(GPIOx == GPIOB)
+    {
+        if((GPIO->PBPORT.Word&((uint32_t)0x1<<PINx)) != RESET)
+            bitstatus = SET;
+        else
+            bitstatus = RESET;
+    }
+
+    return bitstatus;
+}
+
+/***************************************************************
+  函数名:GPIOA_SetBit
+  描  述:GPIOA某引脚置1
+  输入值:PINx:可以是GPIO_Pin_0 —— GPIO_Pin_31
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIOA_SetBit(GPIO_TYPE_PIN PINx)
+{
+    GPIO->PADATABSR.Word = (uint32_t)0x1<<PINx;
+}
+
+/***************************************************************
+  函数名:GPIOA_ResetBit
+  描  述:GPIOA某引脚清0
+  输入值:PINx:可以是GPIO_Pin_0 —— GPIO_Pin_31
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIOA_ResetBit(GPIO_TYPE_PIN PINx)
+{
+    GPIO->PADATABCR.Word = (uint32_t)0x1<<PINx;
+}
+
+/***************************************************************
+  函数名:GPIOA_ToggleBit
+  描  述:GPIOA某引脚输出状态取反
+  输入值:PINx:可以是GPIO_Pin_0 —— GPIO_Pin_31
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIOA_ToggleBit(GPIO_TYPE_PIN PINx)
+{
+    GPIO->PADATABRR.Word = (uint32_t)0x1<<PINx;
+}
+
+/***************************************************************
+  函数名:GPIOB_SetBit
+  描  述:GPIOB某引脚置1
+  输入值:PINx:可以是GPIO_Pin_0 —— GPIO_Pin_13
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIOB_SetBit(GPIO_TYPE_PIN PINx)
+{
+    GPIO->PBDATABSR.Word = (uint32_t)0x1<<PINx;
+}
+
+/***************************************************************
+  函数名:GPIOB_ResetBit
+  描  述:GPIOB某引脚清0
+  输入值:PINx:可以是GPIO_Pin_0 —— GPIO_Pin_13
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIOB_ResetBit(GPIO_TYPE_PIN PINx)
+{
+    GPIO->PBDATABCR.Word = (uint32_t)0x1<<PINx;
+}
+
+/***************************************************************
+  函数名:GPIOB_ToggleBit
+  描  述:GPIOB某引脚输出状态取反
+  输入值:PINx:可以是GPIO_Pin_0 —— GPIO_Pin_13
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIOB_ToggleBit(GPIO_TYPE_PIN PINx)
+{
+    GPIO->PBDATABRR.Word = (uint32_t)0x1<<PINx; 
+}
+
+/***************************************************************
+  函数名:GPIOA_SetDirection
+  描  述:GPIOA某引脚设置方向
+  输入值:PINx:可以是GPIO_Pin_0 —— GPIO_Pin_31 、 Dir_Type:GPIO_Dir_Out/GPIO_Dir_In
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIOA_SetDirection(GPIO_TYPE_PIN PINx, GPIO_TYPE_DIR Dir_Type)
+{
+    GPIO->PADIR.Word &=~((uint32_t)0x1 << PINx);
+    GPIO->PADIR.Word |= ((uint32_t)Dir_Type <<PINx);
+}
+
+/***************************************************************
+  函数名:GPIOB_SetDirection
+  描  述:GPIOB某引脚设置方向
+  输入值:PINx:可以是GPIO_Pin_0 —— GPIO_Pin_13 、 Dir_Type:GPIO_Dir_Out/GPIO_Dir_In
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void GPIOB_SetDirection(GPIO_TYPE_PIN PINx, GPIO_TYPE_DIR Dir_Type)
+{
+    GPIO->PBDIR.Word &=~((uint32_t)0x1 << PINx);
+    GPIO->PBDIR.Word |= ((uint32_t)Dir_Type <<PINx);
+}
+/***************************************************************
+  函数名:Buzz_Config
+  描  述:Buzz配置
+  输入值:Buzz_en:Buzz是否使能;freq:频率
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void Buzz_Config(TYPE_BUZZEN buzz_en, uint32_t freq)
+{
+    GPIO->BUZC.BUZ_LOAD = (SystemCoreClock/(freq*2)) - 1;
+    GPIO->BUZC.BUZEN = buzz_en;
+}
+/***************************************************************
+  函数名:PINT_Config
+  描  述:PINT配置
+  输入值:PINTx:可选PINT0 —— PINT7 、 SELx:输入选择 、 TRIGx:触发选择
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void PINT_Config(PINT_TYPE PINTx, PINT_TYPE_SEL SELx, PINT_TYPE_TRIG TRIGx)
+{
+    GPIO->PINTSEL.Word &= ~((uint32_t)0x07<<(PINTx*4));
+    GPIO->PINTSEL.Word |=((uint32_t)SELx << (PINTx*4));   //sel选择
+
+    GPIO->PINTCFG.Word &= ~((uint32_t)0x07<<(PINTx*4));
+    GPIO->PINTCFG.Word |=((uint32_t)TRIGx << (PINTx*4));  //触发方式选择
+}
+
+/***************************************************************
+  函数名:PINT_GetIFStatus
+  描  述:PINT读取中断标志
+  输入值:PINTx:PINT0-PINT7
+  输出值:无
+  返回值:SET/RESET
+ ***************************************************************/
+FlagStatus PINT_GetIFStatus(PINT_TYPE_IT PINT_Flag)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((GPIO->PINTIF.Word & (uint32_t)PINT_Flag) != (uint32_t)RESET)
+        bitstatus = SET;
+    else   
+        bitstatus = RESET;
+
+    return  bitstatus;
+}
+
+/***************************************************************
+  函数名:PINT_GetITStatus
+  描  述:PINT读取中断标志
+  输入值:PINTx:PINT0-PINT7
+  输出值:无
+  返回值:SET/RESET
+ ***************************************************************/
+FlagStatus PINT_GetITStatus(PINT_TYPE_IT PINT_Flag)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((GPIO->PINTIF.Word & (uint32_t)PINT_Flag) != (uint32_t)RESET)
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return  bitstatus;
+}
+
+/***************************************************************
+  函数名:PINT_ClearITPendingBit
+  描  述:PINT清除中断标志
+  输入值:PINT中断类型
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void PINT_ClearITPendingBit(PINT_TYPE_IT PINT_Flag)
+{
+    GPIO->PINTIF.Word = (uint32_t)PINT_Flag;
+}
+
+/*************************END OF FILE**********************/
+
+
+

+ 97 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_iap.c

@@ -0,0 +1,97 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名:  
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  
+ *备  注:  适用于 ES8P508芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_iap.h"
+
+/*************************************************
+ * @brief  IAP 页擦除编程.回调固化在ROM中的程序
+ * @param  address: 页首地址
+ * @retval None
+ ***********************************************/
+ErrorStatus IAP_PageErase(uint32_t address)
+{
+    IAP_PE IAPPageErase = (IAP_PE)(*(uint32_t *)IAP_PageErase_addr);
+
+    ErrorStatus result;
+    __ASM("CPSID i");
+    result = (*IAPPageErase)(address);
+    __ASM("CPSIE i");
+    return  result;
+}
+
+/*************************************************
+ * @brief  IAP 单字自编程.回调固化在ROM中的程序
+ * @param  address: 编程首地址
+ * @param  data: 编程数据
+ * @retval None
+ ************************************************/
+ErrorStatus IAP_WordProgram(uint32_t address, uint32_t data)
+{
+    IAP_WP IAPWordProgram = (IAP_WP)(*(uint32_t *)IAP_WordProgram_addr);
+
+    ErrorStatus result;
+    __ASM("CPSID i");
+    result = (*IAPWordProgram)( address,  data);
+    __ASM("CPSIE i");
+    return  result;
+}
+
+/************************************************
+ * @brief  IAP 多字自编程.回调固化在ROM中的程序
+ * @param  address: 编程首地址
+ * @param  data[]: 编程数据
+ * @param  length: 编程数据长度(字节)
+ * @param  address: 编程页是否先擦除
+ *     @arg 0: 不擦除
+ *     @arg 1: 擦除
+ * @retval None
+ **********************************************/
+ErrorStatus IAP_PageProgram(uint32_t address, uint32_t data[], uint32_t length, uint32_t erase)  //@0x100001c5
+{
+    IAP_PP IAPPageProgram = (IAP_PP)(*(uint32_t *)IAP_PageProgram_addr);
+
+    ErrorStatus result;
+    __ASM("CPSID i");
+    result = (*IAPPageProgram)(address,data,length,erase);
+    __ASM("CPSIE i");
+    return  result;
+}
+/*************************************
+  函数名:IARead
+  描  述:Flash读
+  输入值:内存地址--读取数据的存放地址
+  Flash地址
+  读取数据的长度,单位为字(4字节)
+  返回值:成功/失败
+ **************************************/
+ErrorStatus IAPRead(uint32_t *Ram_Addr, uint32_t Flash_Addr, uint8_t Len)
+{
+    uint8_t i;
+    uint32_t *ram_addr;
+    const uint32_t *flash_addr;
+
+    ram_addr = Ram_Addr;
+    flash_addr = (const uint32_t *)Flash_Addr;
+
+    if (Len == 0)
+        return ERROR;
+
+    for (i = 0; i < Len; ++i)
+    {
+        *ram_addr = *flash_addr;
+        ++ram_addr;
+        ++flash_addr;
+    }
+
+    return SUCCESS;
+}
+
+/************************END OF FILE**************************/
+

+ 311 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_iic.c

@@ -0,0 +1,311 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_iic.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  IIC模块库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_iic.h"
+
+/***************************************************************
+  函数名:I2C_Init
+  描  述:I2C初始化
+  输入值:I2C_InitStruct:初始化配置结构体地址
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_Init(I2C_InitStruType* I2C_InitStruct)
+{
+    uint32_t temp;
+
+    if(I2C_InitStruct->I2C_Mode == I2C_Mode_Master)
+    {
+        if(I2C_InitStruct->I2C_16XSamp != DISABLE)
+            temp = SystemCoreClock/24/I2C_InitStruct->I2C_Clk - 1;
+        else
+            temp = SystemCoreClock/16/I2C_InitStruct->I2C_Clk - 1;
+
+        if(temp > 254)
+            temp = 255;
+
+        I2C0->CON.TJP = temp;      //设置时基定时器周期
+
+        I2C0->CON.TJE = 0x1;       //使能时基定时器
+    }
+
+    I2C0->CON.SDASE = I2C_InitStruct->I2C_16XSamp;  //16倍采样设置
+    I2C0->CON.SCKSE = I2C_InitStruct->I2C_16XSamp; 
+    I2C0->CON.SCKOD = I2C_InitStruct->I2C_SclOd;    //端口开漏设置
+    I2C0->CON.SDAOD = I2C_InitStruct->I2C_SdaOd;
+    I2C0->MOD.MS = I2C_InitStruct->I2C_Mode;       //主从模式设置
+    I2C0->MOD.SPAE = I2C_InitStruct->I2C_AutoStop; //自动停止设置
+    I2C0->MOD.SRAE = I2C_InitStruct->I2C_AutoCall; //自动寻呼设置
+}
+
+/***************************************************************
+  函数名:I2C_ITConfig
+  描  述:I2C中断配置
+  输入值:I2C_IT:需要配置的中断 、 NewState:使能或关闭
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_ITConfig(I2C_TYPE_IT I2C_IT,TYPE_FUNCEN NewState)
+{
+    if (NewState != DISABLE)
+        I2C0->IE.Word |= (uint32_t)I2C_IT;
+    else
+        I2C0->IE.Word &= ~((uint32_t)I2C_IT);
+}
+
+/***************************************************************
+  函数名:I2C_SendAddress
+  描  述:I2C发送从机地址
+  输入值:I2C_Address:7位从机地址,左对齐 0x00~0xfe 、 Mode:读或写
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_SendAddress(uint8_t I2C_Address,I2C_TYPE_RWMODE Mode)
+{
+    I2C0->CON.SA = I2C_Address>>1;
+    I2C0->CON.RW = Mode;
+}
+
+/***************************************************************
+  函数名:I2C_SetAddress
+  描  述:I2C设置地址(适用于从机模式)
+  输入值:I2C_Address:7位从机地址,左对齐 0x00~0xfe
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_SetAddress(uint8_t I2C_Address)
+{
+    I2C0->CON.SA = I2C_Address>>1;
+}
+
+/***************************************************************
+  函数名:I2C_RecModeConfig
+  描  述:I2C配置接收模式
+  输入值:RecType:接收模式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_RecModeConfig(I2C_TYPE_RECMODE RecType)
+{
+    I2C0->MOD.RDM = RecType;
+}
+
+/***************************************************************
+  函数名:I2C_TBIMConfig
+  描  述:I2C发送缓冲器空中断模式选择
+  输入值:Type:空中断模式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_TBIMConfig(I2C_TYPE_TRBIM Type)
+{
+    I2C0->IE.TBIM = Type;
+}
+
+/***************************************************************
+  函数名:I2C_RBIMConfig
+  描  述:I2C接收缓冲器满中断模式选择
+  输入值:Type:满中断模式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_RBIMConfig(I2C_TYPE_TRBIM Type)
+{
+    I2C0->IE.RBIM = Type;
+}
+
+/***************************************************************
+  函数名:I2C_AckDelay
+  描  述:I2C应答延时配置
+  输入值:Type:延时时间 、 NewStatus:使能、失能
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_AckDelay(I2C_TYPE_ADLY Type,TYPE_FUNCEN NewStatus)
+{
+    I2C0->MOD.ADLY = Type;
+    I2C0->MOD.ADE = NewStatus;
+}
+
+/***************************************************************
+  函数名:I2C_TISConfig
+  描  述:I2C数据帧传输间隔设置
+  输入值:Time:传输间隔
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_TISConfig(I2C_TYPE_TIS Time)
+{
+    I2C0->MOD.TIS = Time;
+}
+
+/***************************************************************
+  函数名:I2C_SendByte
+  描  述:I2C字节发送
+  输入值:Byte:字节数据
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_SendByte(uint8_t Byte)
+{
+    I2C0->TBW.Byte[0] = Byte;
+}
+
+/***************************************************************
+  函数名:I2C_SendHalfWord
+  描  述:I2C半字发送
+  输入值:HalfWord:半节数据
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_SendHalfWord(uint16_t HalfWord)
+{
+    I2C0->TBW.HalfWord[0] = HalfWord;
+}
+
+/***************************************************************
+  函数名:I2C_SendWord
+  描  述:I2C字发送
+  输入值:Word:字数据
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_SendWord(uint32_t Word)
+{
+    I2C0->TBW.Word = Word;
+}
+
+/***************************************************************
+  函数名:I2C_RecByte
+  描  述:I2C接收-字节
+  输入值:无
+  输出值:无
+  返回值:接收的数据
+ ***************************************************************/
+uint8_t I2C_RecByte(void)
+{
+    return I2C0->RBR.Byte[0] ;
+}
+
+/***************************************************************
+  函数名:I2C_RecHalfWord
+  描  述:I2C接收-半字
+  输入值:无
+  输出值:无
+  返回值:接收的数据
+ ***************************************************************/
+uint16_t I2C_RecHalfWord(void)
+{
+    return I2C0->RBR.HalfWord[0];
+}
+
+/***************************************************************
+  函数名:I2C_RecWord
+  描  述:I2C接收-字
+  输入值:无
+  输出值:无
+  返回值:接收的数据
+ ***************************************************************/
+uint32_t I2C_RecWord(void)
+{
+    return I2C0->RBR.Word ;
+}
+
+/***************************************************************
+  函数名:I2C_GetRWMode
+  描  述:I2C工作读写状态读取
+  输入值:无
+  输出值:无
+  返回值:读/写
+ ***************************************************************/
+I2C_TYPE_RWMODE I2C_GetRWMode(void)
+{
+    I2C_TYPE_RWMODE Status = I2C_Mode_Write;
+
+    if(I2C0->CON.RW != 0)
+        Status = I2C_Mode_Read;
+    else
+        Status = I2C_Mode_Write;
+
+    return Status;
+}
+
+/***************************************************************
+  函数名:I2C_GetTBStatus
+  描  述:I2C获取发送缓冲寄存器状态,TB0-TB3全空则返回SET,否则返回RESET
+  输入值:无
+  输出值:无
+  返回值:SET/RESET
+ ***************************************************************/
+FlagStatus I2C_GetTBStatus(void)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((I2C0->STA.Word&(uint32_t)0x0f00) != (uint32_t)0x0f00)
+        bitstatus = RESET;
+    else
+        bitstatus = SET;
+
+    return  bitstatus;
+}
+
+/***************************************************************
+  函数名:I2C_GetFlagStatus
+  描  述:I2C获取标志位状态
+  输入值:I2C_Flag:选择需要的标志位
+  输出值:无
+  返回值:SET/RESET
+ ***************************************************************/
+FlagStatus I2C_GetFlagStatus(I2C_TYPE_FLAG I2C_Flag)
+{
+    FlagStatus bitstatus = RESET;
+
+    if ((I2C0->IF.Word & (uint32_t)I2C_Flag) != RESET)
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return  bitstatus;
+}
+
+/*************************************
+  函数名:I2C_GetITStatus
+  描  述:获取中断使能状态
+  输入值:I2C_Flag 中断使能位
+  中断类型
+  返回值:SET/RESET
+ **************************************/
+FlagStatus I2C_GetITStatus( I2C_TYPE_IT I2C_Flag)
+{
+    FlagStatus status = RESET;
+
+    if ((I2C0->IE.Word & (uint32_t)I2C_Flag) == RESET)
+        return status;
+
+    if ((I2C0->IF.Word & (uint32_t)I2C_Flag) != RESET)
+        status = SET;
+
+    return status;
+}
+
+/***************************************************************
+  函数名:I2C_ClearITPendingBit
+  描  述:I2C中断标志清除
+  输入值:I2C_IT:标志位
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void I2C_ClearITPendingBit(I2C_CLR_IF I2C_IT)
+{
+    I2C0->IF.Word = (uint32_t)I2C_IT;
+}
+
+/*************************END OF FILE**********************/
+

+ 283 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_printf.c

@@ -0,0 +1,283 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_printf.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  串口打印库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_printf.h"
+#include <stdarg.h>
+
+/***************************************************************
+  函数名:fputc
+  描  述:重定向c库函数printf到UART
+  输入值:。。。
+  输出值:。。。
+  返回值:。。。
+ ***************************************************************/
+/*使用printf()函数需要调用微库:Use MicroLIB*/
+int fputc(int ch, FILE *f)
+{
+    FlagStatus Status = RESET;
+    uint32_t Count=0;
+
+#if defined  __PRINTF_USE_UART3__
+    UART_SendByte(UART3, (unsigned char) ch);
+    do
+    {
+        Status = UART_GetFlagStatus(UART3,UART_FLAG_TXIDLE);
+        Count++;
+    }while((Status == RESET)&&(Count != 0x1CE2));
+
+    if(Count == 0x1CE2)
+        return (EOF);
+
+#elif defined __PRINTF_USE_UART2__
+    UART_SendByte(UART2, (unsigned char) ch);
+    do
+    {
+        Status = UART_GetFlagStatus(UART2,UART_FLAG_TXIDLE);
+        Count++;
+    }while((Status == RESET)&&(Count != 0x1CE2));
+
+    if(Count == 0x1CE2)
+        return (EOF);
+
+#elif defined __PRINTF_USE_UART1__
+    UART_SendByte(UART1, (unsigned char) ch);
+    do
+    {
+        Status = UART_GetFlagStatus(UART1,UART_FLAG_TXIDLE);
+        Count++;
+    }while((Status == RESET)&&(Count != 0x1CE2));
+
+    if(Count == 0x1CE2)
+        return (EOF);
+
+#else
+    UART_SendByte(UART0, (unsigned char) ch);
+    do
+    {
+        Status = UART_GetFlagStatus(UART0,UART_FLAG_TXIDLE);
+        Count++;
+    }while((Status == RESET)&&(Count != 0x1CE2));
+
+    if(Count == 0x1CE2)
+        return (EOF);
+
+#endif
+    return (ch);
+}
+
+#ifdef __clang__     //当使用的是idesigner编译器时,则不调用微库
+/***************************************************************
+  描  述:将整形数据转换成字符串
+  输入值:   -radix =10 表示10进制,其他结果为0
+ *         -value 要转换的整形数
+ *         -buf 转换后的字符串
+ *         -radix = 10
+ 返回值:无
+ ***************************************************************/
+static char *itoa(int value, char *string, int radix)
+{
+    int i, d;
+    int flag = 0;
+    char *ptr = string;
+
+    /* This implementation only works for decimal numbers. */
+    if (radix != 10)
+    {
+        *ptr = 0;
+        return string;
+    }
+
+    if (!value)
+    {
+        *ptr++ = 0x30;
+        *ptr = 0;
+        return string;
+    }
+
+    /* if this is a negative value insert the minus sign. */
+    if (value < 0)
+    {
+        *ptr++ = '-';
+
+        /* Make the value positive. */
+        value *= -1;
+    }
+
+    for (i = 10000; i > 0; i /= 10)
+    {
+        d = value / i;
+
+        if (d || flag)
+        {
+            *ptr++ = (char)(d + 0x30);
+            value -= (d * i);
+            flag = 1;
+        }
+    }
+
+    /* Null terminate the string. */
+    *ptr = 0;
+
+    return string;
+}
+/***************************************************************
+  描  述:格式化输出,类似于C库中的printf,但这里没有用到C库
+  输入值:   -UARTx 串口通道,
+ *         -Data   要发送到串口的内容的指针
+ *         -...    其他参数
+ 返回值:无
+ 典型应用: UART_printf("\r\n this is a demo \r\n" );
+ *         UART1_printf("\r\n %d \r\n", i );
+ *         UART1_printf("\r\n %s \r\n", j );
+ ***************************************************************/
+/* 未调用C库的时候可以使用此函数代替C库中的printf,但功能无printf全,
+   只支持\r  \n  %d   %s */
+ErrorStatus UART_printf(uint8_t *Data,...)
+{
+		UART_TypeDef *UARTx;
+    const char *s;
+    int d;   
+    char buf[16];
+    ErrorStatus RET = SUCCESS;
+    FlagStatus Status = RESET;
+    uint32_t Count=0;
+    va_list ap;
+	
+/**
+	**
+	**使用宏定义选择使用哪一个串口
+	**
+***/
+#if defined  __PRINTF_USE_UART3__
+	
+	UARTx = UART3;
+	
+#elif defined __PRINTF_USE_UART2__
+	
+	UARTx = UART2;
+	
+#elif defined __PRINTF_USE_UART1__
+
+	UARTx = UART1;
+	
+#else
+
+	UARTx = UART0;
+	
+#endif		
+		
+    va_start(ap, Data);
+
+    while ( *Data != 0)                           // 判断是否到达字符串结束符
+    {
+        if ( *Data == 0x5c )                      //'\'
+        {
+            switch ( *++Data )
+            {
+                case 'r':                         //回车符
+                    Count=0;
+                    UART_SendByte(UARTx, 0x0d);
+                    do
+                    {
+                        Status = UART_GetFlagStatus(UARTx,UART_FLAG_TXIDLE);
+                        Count++;
+                    }while((Status == RESET)&&(Count != 0x1CE2));
+
+                    if(Count == 0x1CE2)
+                        RET = ERROR;
+
+                    Data ++;
+                    break;
+
+                case 'n':                         //换行符
+                    Count=0;
+                    UART_SendByte(UARTx, 0x0a);    
+                    do
+                    {
+                        Status = UART_GetFlagStatus(UARTx,UART_FLAG_TXIDLE);
+                        Count++;
+                    }while((Status == RESET)&&(Count != 0x1CE2));
+
+                    if(Count == 0x1CE2)
+                        RET = ERROR;
+
+                    Data ++;
+                    break;
+
+                default:
+                    Data ++;
+                    break;
+            }             
+        }
+        else if ( *Data == '%')
+        {
+            switch ( *++Data )
+            {                
+                case 's':                         //字符串
+                    s = va_arg(ap, const char *);
+                    for ( ; *s; s++) 
+                    {
+                        Count=0;
+                        UART_SendByte(UARTx,*s);
+                        do
+                        {
+                            Status = UART_GetFlagStatus(UARTx,UART_FLAG_TXIDLE);
+                            Count++;
+                        }while((Status == RESET)&&(Count != 0x1CE2));
+
+                        if(Count == 0x1CE2)
+                            RET = ERROR;
+                    }
+                    Data++;
+                    break;
+
+                case 'd':                         //十进制
+                    d = va_arg(ap, int);
+                    itoa(d, buf, 10);
+                    for (s = buf; *s; s++)  
+                    {
+                        Count=0;
+                        UART_SendByte(UARTx,*s);
+                        do
+                        {
+                            Status = UART_GetFlagStatus(UARTx,UART_FLAG_TXIDLE);
+                            Count++;
+                        }while((Status == RESET)&&(Count != 0x1CE2));
+
+                        if(Count == 0x1CE2)
+                            RET = ERROR;
+                    }
+                    Data++;
+                    break;
+                default:
+                    Data++;
+                    break;
+            }
+        } /* end of else if */
+        else 
+        {
+            Count=0;
+            UART_SendByte(UARTx, *Data++);
+            do
+            {
+                Status = UART_GetFlagStatus(UARTx,UART_FLAG_TXIDLE);
+                Count++;
+            }while((Status == RESET)&&(Count != 0x1CE2));
+
+            if(Count == 0x1CE2)
+                RET = ERROR;
+        }
+    }
+    return RET;
+}
+
+#endif
+/*************************END OF FILE**********************/
+

+ 1906 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_rtc.c

@@ -0,0 +1,1906 @@
+/*********************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
+ *文件名:  lib_rtc.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  RTC模块程序
+ *备  注:  适用于HRSDK-GDB-ES8P508 V1.1
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ **********************************************************/
+#include "lib_rtc.h"
+#include "lib_scu.h"
+
+/***************************************************************
+  函数名:RTC_Init
+  描  述:实时时钟初始化
+  输入值:CLKx:RTC时钟源选择;HOURx:12小时/24小时制选择
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void RTC_Init(RTC_TYPE_CLKS CLKx,RTC_TYPE_TIME HOURx)
+{
+    uint32_t flag;
+	
+		if(CLKx == RTC_LOSC )
+	  {
+		  uint32_t Prot_Temp;
+
+        Prot_Temp = SCU->PROT.PROT;
+
+        if(Prot_Temp != 0)         //写保护了
+            SCU_RegUnLock();       //解锁
+
+        SCU_XTAL_Enable();         //使能外部32kHZ			
+        while(SCU_XTALReadyFlag() != SET);      //等待时钟开启
+        
+				if(Prot_Temp != 0)     
+				    SCU_RegLock();        //打开写保护
+	  }
+		
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+    RTC->CON.PON = 0;               // 清零,使能RTC
+    RTC->CON.HSWI = HOURx;          // 24小时模式
+    RTC->CON.CLKS = CLKx;           // 时钟源选择32768Hz
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+}
+/***************************************************************
+  函数名:RTC_StartRead
+  描  述:启动实时时钟读流程
+  输入值:无
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void RTC_StartRead(void)
+{
+    RTC->CON.TMWR = 0;              // 操作类型是读
+    RTC->CON.TMUP = 1;              // 触发读操作
+    while (RTC->CON.TMUP == 1);     //等待读完成
+}
+
+/***************************************************************
+  函数名:RTC_ReadHourmode
+  描  述:读取小时模式
+  输入值:无
+  输出值:无
+  返回值:当前的小时模式
+ ***************************************************************/
+uint32_t RTC_ReadHourmode(void)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    result = RTC->CON.HSWI;
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    return result;
+}
+/***************************************************************
+  函数名:RTC_ReadSecond
+  描  述:读取秒
+  输入值:无
+  输出值:无
+  返回值:当前的秒
+ ***************************************************************/
+uint32_t RTC_ReadSecond(void)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    /* 计算时间 */
+    result = ((RTC->HMS.SEC & (uint32_t)0x01) * 1);
+    result += (((RTC->HMS.SEC >> 1) & (uint32_t)0x01) * 2);
+    result += (((RTC->HMS.SEC >> 2) & (uint32_t)0x01) * 4);
+    result += (((RTC->HMS.SEC >> 3) & (uint32_t)0x01) * 8);
+    result += (((RTC->HMS.SEC >> 4) & (uint32_t)0x01) * 10);
+    result += (((RTC->HMS.SEC >> 5) & (uint32_t)0x01) * 20);
+    result += (((RTC->HMS.SEC >> 6) & (uint32_t)0x01) * 40);
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    return result;
+}
+
+/***************************************************************
+  函数名:RTC_ReadMinute
+  描  述:读取分
+  输入值:无
+  输出值:无
+  返回值:当前的分
+ ***************************************************************/
+uint32_t RTC_ReadMinute(void)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    /* 计算时间 */
+    result = ((RTC->HMS.MIN & (uint32_t)0x01) * 1);
+    result += (((RTC->HMS.MIN >> 1) & (uint32_t)0x01) * 2);
+    result += (((RTC->HMS.MIN >> 2) & (uint32_t)0x01) * 4);
+    result += (((RTC->HMS.MIN >> 3) & (uint32_t)0x01) * 8);
+    result += (((RTC->HMS.MIN >> 4) & (uint32_t)0x01) * 10);
+    result += (((RTC->HMS.MIN >> 5) & (uint32_t)0x01) * 20);
+    result += (((RTC->HMS.MIN >> 6) & (uint32_t)0x01) * 40);
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    return result;
+}
+
+/***************************************************************
+  函数名:RTC_ReadHour
+  描  述:读取小时
+  输入值:无
+  输出值:无
+  返回值:当前的小时
+ ***************************************************************/
+uint32_t RTC_ReadHour(uint32_t *meridiem)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    /* 计算时间 */
+    result = ((RTC->HMS.HOUR & (uint32_t)0x01) * 1);
+    result += (((RTC->HMS.HOUR >> 1) & (uint32_t)0x01) * 2);
+    result += (((RTC->HMS.HOUR >> 2) & (uint32_t)0x01) * 4);
+    result += (((RTC->HMS.HOUR >> 3) & (uint32_t)0x01) * 8);
+    result += (((RTC->HMS.HOUR >> 4) & (uint32_t)0x01) * 10);
+
+    if(RTC_ReadHourmode() == RTC_HOUR24)                        //24小时模式:20小时
+    {
+        result += (((RTC->HMS.HOUR >> 5) & (uint32_t)0x01) * 20);
+    }
+    else                                                        //12小时模式:1 PM,0 AM
+    {
+        *meridiem = (((RTC->HMS.HOUR >> 5) & (uint32_t)0x01));
+    }
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    return result;
+}
+
+/***************************************************************
+  函数名:RTC_ReadDay
+  描  述:读取日
+  输入值:无
+  输出值:无
+  返回值:当前的日
+ ***************************************************************/
+uint32_t RTC_ReadDay(void)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    /* 计算时间 */
+    result = ((RTC->YMDW.DAY & (uint32_t)0x01) * 1);
+    result += (((RTC->YMDW.DAY >> 1) & (uint32_t)0x01) * 2);
+    result += (((RTC->YMDW.DAY >> 2) & (uint32_t)0x01) * 4);
+    result += (((RTC->YMDW.DAY >> 3) & (uint32_t)0x01) * 8);
+    result += (((RTC->YMDW.DAY >> 4) & (uint32_t)0x01) * 10);
+    result += (((RTC->YMDW.DAY >> 5) & (uint32_t)0x01) * 20);
+
+    /* 加入RTC写保护 */
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return result;
+}
+
+/***************************************************************
+  函数名:RTC_ReadMonth
+  描  述:读取月
+  输入值:无
+  输出值:无
+  返回值:当前的月
+ ***************************************************************/
+uint32_t RTC_ReadMonth(void)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    /* 计算时间 */
+    result = ((RTC->YMDW.MON & (uint32_t)0x01) * 1);
+    result += (((RTC->YMDW.MON >> 1) & (uint32_t)0x01) * 2);
+    result += (((RTC->YMDW.MON >> 2) & (uint32_t)0x01) * 4);
+    result += (((RTC->YMDW.MON >> 3) & (uint32_t)0x01) * 8);
+    result += (((RTC->YMDW.MON >> 4) & (uint32_t)0x01) * 10);
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    return result;
+}
+
+/***************************************************************
+  函数名:RTC_ReadYear
+  描  述:读取年
+  输入值:无
+  输出值:无
+  返回值:当前的年
+ ***************************************************************/
+uint32_t RTC_ReadYear(void)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    /* 计算时间 */
+    result = ((RTC->YMDW.YEAR & (uint32_t)0x01) * 1);
+    result += (((RTC->YMDW.YEAR >> 1) & (uint32_t)0x01) * 2);
+    result += (((RTC->YMDW.YEAR >> 2) & (uint32_t)0x01) * 4);
+    result += (((RTC->YMDW.YEAR >> 3) & (uint32_t)0x01) * 8);
+    result += (((RTC->YMDW.YEAR >> 4) & (uint32_t)0x01) * 10);
+    result += (((RTC->YMDW.YEAR >> 5) & (uint32_t)0x01) * 20);
+    result += (((RTC->YMDW.YEAR >> 6) & (uint32_t)0x01) * 40);
+    result += (((RTC->YMDW.YEAR >> 7) & (uint32_t)0x01) * 80);
+    result += 2000;
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    return result;
+}
+/***************************************************************
+  函数名:RTC_ReadWeek
+  描  述:读取星期
+  输入值:无
+  输出值:无
+  返回值:当前的星期
+ ***************************************************************/
+uint32_t RTC_ReadWeek(void)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    /* 计算时间 */
+    switch(RTC->YMDW.WEEK)
+    {
+        case 0x00: result = 0;break;
+        case 0x01: result = 1;break;
+        case 0x02: result = 2;break;
+        case 0x03: result = 3;break;
+        case 0x04: result = 4;break;
+        case 0x05: result = 5;break;
+        case 0x06: result = 6;break;
+        default:   result = 0;break;
+    }
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    return result;
+}
+
+/***************************************************************
+  函数名:RTC_StartRead
+  描  述:启动实时时钟写流程
+  输入值:无
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void RTC_StartWrite(void)
+{
+    /* 触发写操作步骤 */
+    RTC->CON.TMWR = 1;              // 操作类型是写
+    RTC->CON.TMUP = 1;              // 触发写操作
+    while (RTC->CON.TMUP == 1);     //等待写完成
+}
+
+/***************************************************************
+  函数名:RTC_WriteSecond
+  描  述:修改秒
+  输入值:second: 秒
+  输出值:无
+  返回值:无
+ ***************************************************************/
+ErrorStatus RTC_WriteSecond(uint32_t second)
+{
+    uint32_t flag = 0;
+    uint32_t sec_buf = 0;
+
+    /* 检查输入参数 */
+    if (second >= 60)
+        return ERROR;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 设置新的值 */
+    if (second >= 40)
+    {
+        sec_buf |= (uint32_t)1<<6;
+        second -= 40;
+    }
+    else
+    {
+        sec_buf &= ~(uint32_t)1<<6;
+    }
+
+    if (second >= 20)
+    {
+        sec_buf |= (uint32_t)1<<5;
+        second -= 20;
+    }
+    else
+    {
+        sec_buf &= ~(uint32_t)1<<5;
+    }
+
+    if (second >= 10)
+    {
+        sec_buf |= (uint32_t)1<<4;
+        second -= 10;
+    }
+    else
+    {
+        sec_buf &= ~(uint32_t)1<<4;
+    }
+
+    if (second >= 8)
+    {
+        sec_buf |= (uint32_t)1<<3;
+        second -= 8;
+    }
+    else
+    {
+        sec_buf &= ~(uint32_t)1<<3;
+    }
+
+    if (second >= 4)
+    {
+        sec_buf |= (uint32_t)1<<2;
+        second -= 4;
+    }
+    else
+    {
+        sec_buf &= ~(uint32_t)1<<2;
+    }
+
+    if (second >= 2)
+    {
+        sec_buf |= (uint32_t)1<<1;
+        second -= 2;
+    }
+    else
+    {
+        sec_buf &= ~(uint32_t)1<<1;
+    }
+
+    if (second >= 1)
+    {
+        sec_buf |= (uint32_t)1;
+        second -= 1;
+    }
+    else
+    {
+        sec_buf &= ~(uint32_t)1;
+    }
+
+    RTC->HMS.SEC = sec_buf;
+
+    /* 触发写操作步骤 */
+    RTC_StartWrite();
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:RTC_WriteMinute
+  描  述:修改秒
+  输入值:minute: 秒
+  输出值:无
+  返回值:无
+ ***************************************************************/
+ErrorStatus RTC_WriteMinute(uint32_t minute)
+{
+    uint32_t flag;
+    uint32_t min_buf = 0;
+
+    /* 检查输入参数 */
+    if (minute >= 60)
+        return ERROR;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 设置新的值 */
+    if (minute >= 40) 
+    {
+        min_buf |= (uint32_t)1<<6;
+        minute -= 40;
+    } 
+    else 
+    {
+        min_buf &= ~(uint32_t)1<<6;
+    }
+
+    if (minute >= 20) 
+    {
+        min_buf |= (uint32_t)1<<5;
+        minute -= 20;
+    } 
+    else 
+    {
+        min_buf &= ~(uint32_t)1<<5;
+    }
+
+    if (minute >= 10)
+    {
+        min_buf |= (uint32_t)1<<4;
+        minute -= 10;
+    } 
+    else 
+    {
+        min_buf &= ~(uint32_t)1<<4;
+    }
+
+    if (minute >= 8) 
+    {
+        min_buf |= (uint32_t)1<<3;
+        minute -= 8;
+    } 
+    else 
+    {
+        min_buf &= ~(uint32_t)1<<3;
+    }
+
+    if (minute >= 4) 
+    {
+        min_buf |= (uint32_t)1<<2;
+        minute -= 4;
+    } 
+    else 
+    {
+        min_buf &= ~(uint32_t)1<<2;
+    }
+
+    if (minute >= 2) 
+    {
+        min_buf |= (uint32_t)1<<1;
+        minute -= 2;
+    } 
+    else 
+    {
+        min_buf &= ~(uint32_t)1<<1;
+    }
+
+    if (minute >= 1) 
+    {
+        min_buf |= (uint32_t)1;
+        minute -= 1;
+    } 
+    else 
+    {
+        min_buf &= ~(uint32_t)1;
+    }
+
+    RTC->HMS.MIN = min_buf;
+
+    /* 触发写操作步骤 */
+    RTC_StartWrite();
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return SUCCESS;
+}
+
+
+/***************************************************************
+  函数名:RTC_WriteHour
+  描  述:修改时
+  输入值:hour: 时
+  输出值:无
+  返回值:无
+ ***************************************************************/
+ErrorStatus RTC_WriteHour(uint32_t hour, uint32_t meridiem)
+{
+    uint32_t flag,mode;
+    uint32_t hour_buf = 0;
+
+    /* 检查输入参数 */
+    if (hour >= 24)
+        return ERROR;
+
+    mode = RTC_ReadHourmode();
+
+    if(mode == RTC_HOUR12 && hour > 12)     //12小时模式不可大于12小时
+        return ERROR;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 设置新的值 */
+    if(mode == RTC_HOUR24)
+    {
+        if (hour >= 20)
+        {
+            hour_buf |= (uint32_t)1<<5;
+            hour -= 20;
+        }
+        else
+        {
+            hour_buf &= ~((uint32_t)1<<5);
+        }
+    }
+    else
+    {
+        if(meridiem == 1)
+            hour_buf |= (uint32_t)1<<5;
+        else
+            hour_buf &= ~((uint32_t)1<<5);
+    }
+
+    if (hour >= 10)
+    {
+        hour_buf |= (uint32_t)1<<4;
+        hour -= 10;
+    }
+    else
+    {
+        hour_buf &= ~((uint32_t)1<<4);
+    }
+
+    if (hour >= 8)
+    {
+        hour_buf |= (uint32_t)1<<3;
+        hour -= 8;
+    }
+    else
+    {
+        hour_buf &= ~((uint32_t)1<<3);
+    }
+
+    if (hour >= 4)
+    {
+        hour_buf |= (uint32_t)1<<2;
+        hour -= 4;
+    }
+    else
+    {
+        hour_buf &= ~((uint32_t)1<<2);
+    }
+
+    if (hour >= 2)
+    {
+        hour_buf |= (uint32_t)1<<1;
+        hour -= 2;
+    }
+    else
+    {
+        hour_buf &= ~((uint32_t)1<<1);
+    }
+
+    if (hour >= 1)
+    {
+        hour_buf |= (uint32_t)1;
+        hour -= 1;
+    }
+    else
+    {
+        hour_buf &= ~(uint32_t)1;
+    }
+
+    RTC->HMS.HOUR = hour_buf;
+
+    /* 触发写操作步骤 */
+    RTC_StartWrite();
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:RTC_WriteDay
+  描  述:修改日
+  输入值:day: 日
+  输出值:无
+  返回值:无
+ ***************************************************************/
+ErrorStatus RTC_WriteDay(uint32_t day)
+{
+    uint32_t flag;
+    uint32_t day_buf = 0;
+
+    /* 检查输入参数 */
+    if ((day == 0) || (day >= 32))
+        return ERROR;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 设置新的值 */
+    if (day >= 20) 
+    {
+        day_buf |= (uint32_t)1<<5;
+        day -= 20;
+    } 
+    else 
+    {
+        day_buf &= ~((uint32_t)1<<5);
+    }
+
+    if (day >= 10)
+    {
+        day_buf |= (uint32_t)1<<4;
+        day -= 10;
+    } 
+    else 
+    {
+        day_buf &= ~((uint32_t)1<<4);
+    }
+
+    if (day >= 8) 
+    {
+        day_buf |= (uint32_t)1<<3;
+        day -= 8;
+    } 
+    else 
+    {
+        day_buf &= ~((uint32_t)1<<3);
+    }
+
+    if (day >= 4) 
+    {
+        day_buf |= (uint32_t)1<<2;
+        day -= 4;
+    } 
+    else 
+    {
+        day_buf &= ~((uint32_t)1<<2);
+    }
+
+    if (day >= 2) 
+    {
+        day_buf |= (uint32_t)1<<1;
+        day -= 2;
+    } 
+    else 
+    {
+        day_buf &= ~((uint32_t)1<<1);
+    }
+
+    if (day >= 1)
+    {
+        day_buf |= (uint32_t)1;
+        day -= 1;
+    } 
+    else 
+    {
+        day_buf &= ~(uint32_t)1;
+    }
+
+    RTC->YMDW.DAY = day_buf;
+
+    /* 触发写操作步骤 */
+    RTC_StartWrite();
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return SUCCESS;
+}
+
+
+/***************************************************************
+  函数名:RTC_WriteMonth
+  描  述:修改月
+  输入值:month: 月
+  输出值:无
+  返回值:无
+ ***************************************************************/
+ErrorStatus RTC_WriteMonth(uint32_t month)
+{
+    uint32_t flag;
+    uint32_t month_buf = 0;
+
+    /* 检查输入参数 */
+    if ((month == 0) || (month >= 13))
+        return ERROR;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 设置新的值 */
+    if (month >= 10)
+    {
+        month_buf |= (uint32_t)1<<4;
+        month -= 10;
+    }
+    else
+    {
+        month_buf &= ~((uint32_t)1<<4);
+    }
+
+    if (month >= 8)
+    {
+        month_buf |= (uint32_t)1<<3;
+        month -= 8;
+    }
+    else
+    {
+        month_buf &= ~((uint32_t)1<<3);
+    }
+
+    if (month >= 4)
+    {
+        month_buf |= (uint32_t)1<<2;
+        month -= 4;
+    }
+    else
+    {
+        month_buf &= ~((uint32_t)1<<2);
+    }
+
+    if (month >= 2)
+    {
+        month_buf |= (uint32_t)1<<1;
+        month -= 2;
+    }
+    else
+    {
+        month_buf &= ~((uint32_t)1<<1);
+    }
+
+    if (month >= 1)
+    {
+        month_buf |= (uint32_t)1;
+        month -= 1;
+    }
+    else
+    {
+        month_buf &= ~(uint32_t)1;
+    }
+
+    RTC->YMDW.MON = month_buf;
+
+    /* 触发写操作步骤 */
+    RTC_StartWrite();
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:RTC_WriteYear
+  描  述:修改年
+  输入值:year: 年
+  输出值:无
+  返回值:无
+ ***************************************************************/
+ErrorStatus RTC_WriteYear(uint32_t year)
+{
+    uint32_t flag;
+    uint32_t year_buf = 0;
+
+    /* 检查输入参数 */
+    if ((year < 2000) || (year > 2099))
+        return ERROR;
+
+    /* 年转换 */
+    year -= 2000;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 设置新的值 */
+    if (year >= 80)
+    {
+        year_buf |= (uint32_t)1<<7;
+        year -= 80;
+    }
+    else
+    {
+        year_buf &= ~((uint32_t)1<<7);
+    }
+
+    if (year >= 40)
+    {
+        year_buf |= (uint32_t)1<<6;
+        year -= 40;
+    }
+    else
+    {
+        year_buf &= ~((uint32_t)1<<6);
+    }
+
+    if (year >= 20)
+    {
+        year_buf |= (uint32_t)1<<5;
+        year -= 20;
+    }
+    else
+    {
+        year_buf &= ~((uint32_t)1<<5);
+    }
+
+    if (year >= 10)
+    {
+        year_buf |= (uint32_t)1<<4;
+        year -= 10;
+    }
+    else
+    {
+        year_buf &= ~((uint32_t)1<<4);
+    }
+
+    if (year >= 8)
+    {
+        year_buf |= (uint32_t)1<<3;
+        year -= 8;
+    }
+    else
+    {
+        year_buf &= ~((uint32_t)1<<3);
+    }
+
+    if (year >= 4)
+    {
+        year_buf |= (uint32_t)1<<2;
+        year -= 4;
+    }
+    else
+    {
+        year_buf &= ~((uint32_t)1<<2);
+    }
+
+    if (year >= 2)
+    {
+        year_buf |= (uint32_t)1<<1;
+        year -= 2;
+    }
+    else
+    {
+        year_buf &= ~((uint32_t)1<<1);
+    }
+
+    if (year >= 1)
+    {
+        year_buf |= (uint32_t)1;
+        year -= 1;
+    }
+    else
+    {
+        year_buf &= ~(uint32_t)1;
+    }
+
+    RTC->YMDW.YEAR = year_buf;
+
+    /* 触发写操作步骤 */
+    RTC_StartWrite();
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:RTC_WriteWeek
+  描  述:修改星期
+  输入值:week: 星期(0-6)
+  输出值:无
+  返回值:无
+ ***************************************************************/
+ErrorStatus RTC_WriteWeek(uint32_t week)
+{
+    uint32_t flag;
+
+    /* 检查输入参数 */
+    if (week > 6)
+        return ERROR;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    RTC->YMDW.WEEK = week;
+
+    /* 触发写操作步骤 */
+    RTC->CON.TMWR = 1;      // 操作类型是写
+    RTC->CON.TMUP = 1;      // 触发写操作
+    while (RTC->CON.TMUP == 1);
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:RTC_ReadWeekAlarmMinute
+  描  述:读取分
+  输入值:无
+  输出值:无
+  返回值:当前的分
+ ***************************************************************/
+uint32_t RTC_ReadWeekAlarmMinute(void)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    /* 计算时间 */
+    result = ((RTC->WA.WM & (uint32_t)0x01) * 1);
+    result += (((RTC->WA.WM >> 1) & (uint32_t)0x01) * 2);
+    result += (((RTC->WA.WM >> 2) & (uint32_t)0x01) * 4);
+    result += (((RTC->WA.WM >> 3) & (uint32_t)0x01) * 8);
+    result += (((RTC->WA.WM >> 4) & (uint32_t)0x01) * 10);
+    result += (((RTC->WA.WM >> 5) & (uint32_t)0x01) * 20);
+    result += (((RTC->WA.WM >> 6) & (uint32_t)0x01) * 40);
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    return result;
+}
+
+/***************************************************************
+  函数名:RTC_ReadWeekAlarmHour
+  描  述:读取小时
+  输入值:无
+  输出值:无
+  返回值:当前的小时
+ ***************************************************************/
+uint32_t RTC_ReadWeekAlarmHour(uint32_t *meridiem)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    /* 计算时间 */
+    result = ((RTC->WA.WH & (uint32_t)0x01) * 1);
+    result += (((RTC->WA.WH >> 1) & (uint32_t)0x01) * 2);
+    result += (((RTC->WA.WH >> 2) & (uint32_t)0x01) * 4);
+    result += (((RTC->WA.WH >> 3) & (uint32_t)0x01) * 8);
+    result += (((RTC->WA.WH >> 4) & (uint32_t)0x01) * 10);
+
+    if(RTC_ReadHourmode() == RTC_HOUR24)                        //24小时模式:20小时
+    {
+        result += (((RTC->WA.WH >> 5) & (uint32_t)0x01) * 20);
+    }
+    else                                                        //12小时模式:1 PM,0 AM
+    {
+        *meridiem = (((RTC->WA.WH >> 5) & (uint32_t)0x01));
+    }
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    return result;
+}
+
+/***************************************************************
+  函数名:RTC_ReadWeekAlarmWeek
+  描  述:读取星期
+  输入值:无
+  输出值:无
+  返回值:当前的星期
+ ***************************************************************/
+uint32_t RTC_ReadWeekAlarmWeek(void)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    /* 计算时间 */
+    switch(RTC->WA.WW)
+    {
+        case 0x00: result = 0;break;
+        case 0x01: result = 1;break;
+        case 0x02: result = 2;break;
+        case 0x03: result = 3;break;
+        case 0x04: result = 4;break;
+        case 0x05: result = 5;break;
+        case 0x06: result = 6;break;
+        default:   result = 0;break;
+    }
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    return result;
+}
+
+
+/***************************************************************
+  函数名:RTC_ReadDayAlarmMinute
+  描  述:读取分钟
+  输入值:无
+  输出值:无
+  返回值:当前的分钟
+ ***************************************************************/
+uint32_t RTC_ReadDayAlarmMinute(void)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    /* 计算时间 */
+    result = ((RTC->DA.DM & (uint32_t)0x01) * 1);
+    result += (((RTC->DA.DM >> 1) & (uint32_t)0x01) * 2);
+    result += (((RTC->DA.DM >> 2) & (uint32_t)0x01) * 4);
+    result += (((RTC->DA.DM >> 3) & (uint32_t)0x01) * 8);
+    result += (((RTC->DA.DM >> 4) & (uint32_t)0x01) * 10);
+    result += (((RTC->DA.DM >> 5) & (uint32_t)0x01) * 20);
+    result += (((RTC->DA.DM >> 6) & (uint32_t)0x01) * 40);
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    return result;
+}
+
+/***************************************************************
+  函数名:RTC_ReadDaykAlarmHour
+  描  述:读取小时
+  输入值:无
+  输出值:无
+  返回值:当前的小时
+ ***************************************************************/
+uint32_t RTC_ReadDayAlarmHour(uint32_t *meridiem)
+{
+    uint32_t flag;
+    uint32_t result;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 触发读操作步骤 */
+    RTC_StartRead();
+
+    /* 计算时间 */
+    result = ((RTC->DA.DH & (uint32_t)0x01) * 1);
+    result += (((RTC->DA.DH >> 1) & (uint32_t)0x01) * 2);
+    result += (((RTC->DA.DH >> 2) & (uint32_t)0x01) * 4);
+    result += (((RTC->DA.DH >> 3) & (uint32_t)0x01) * 8);
+    result += (((RTC->DA.DH >> 4) & (uint32_t)0x01) * 10);
+
+    if(RTC_ReadHourmode() == RTC_HOUR24)                        //24小时模式:20小时
+    {
+        result += (((RTC->DA.DH >> 5) & (uint32_t)0x01) * 20);
+    }
+    else                                                        //12小时模式:1 PM,0 AM
+    {
+        *meridiem = (((RTC->DA.DH >> 5) & (uint32_t)0x01));
+    }
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    return result;
+}
+
+/***************************************************************
+  函数名:RTC_WriteWeekAlarmMinute
+  描  述:修改分钟
+  输入值:minute: 分钟
+  输出值:无
+  返回值:无
+ ***************************************************************/
+ErrorStatus RTC_WriteWeekAlarmMinute(uint32_t minute)
+{
+    uint32_t flag;
+    uint32_t minute_buf = 0;
+
+    /* 检查输入参数 */
+    if (minute >= 60)
+        return ERROR;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 设置新的值 */
+    if (minute >= 40)
+    {
+        minute_buf |= (uint32_t)1<<6;
+        minute -= 40;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1<<6;
+    }
+
+    if (minute >= 20)
+    {
+        minute_buf |= (uint32_t)1<<5;
+        minute -= 20;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1<<5;
+    }
+
+    if (minute >= 10)
+    {
+        minute_buf |= (uint32_t)1<<4;
+        minute -= 10;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1<<4;
+    }
+
+    if (minute >= 8)
+    {
+        minute_buf |= (uint32_t)1<<3;
+        minute -= 8;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1<<3;
+    }
+
+    if (minute >= 4)
+    {
+        minute_buf |= (uint32_t)1<<2;
+        minute -= 4;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1<<2;
+    }
+
+    if (minute >= 2)
+    {
+        minute_buf |= (uint32_t)1<<1;
+        minute -= 2;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1<<1;
+    }
+
+    if (minute >= 1)
+    {
+        minute_buf |= (uint32_t)1;
+        minute -= 1;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1;
+    }
+
+    RTC->WA.WM = minute_buf;
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:RTC_WriteWeekAlarmHour
+  描  述:修改小时
+  输入值:hour: 小时
+          meridiem:(仅在12小时模式时有效)
+                    0 AM
+                    1 PM
+  输出值:无
+  返回值:无
+ ***************************************************************/
+ErrorStatus RTC_WriteWeekAlarmHour(uint32_t hour, uint32_t meridiem)
+{
+    uint32_t flag,mode;
+    uint32_t hour_buf = 0;
+
+    /* 检查输入参数 */
+    if (hour >= 24)
+        return ERROR;
+
+    mode = RTC_ReadHourmode();
+
+    if(mode == RTC_HOUR12 && hour > 12)     //12小时模式不可大于12小时
+        return ERROR;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 设置新的值 */
+    if(mode == RTC_HOUR24)
+    {
+        if (hour >= 20)
+        {
+            hour_buf |= (uint32_t)1<<5;
+            hour -= 20;
+        }
+        else
+        {
+            hour_buf &= ~((uint32_t)1<<5);
+        }
+    }
+    else
+    {
+        if(meridiem == 1)
+            hour_buf |= (uint32_t)1<<5;
+        else
+            hour_buf &= ~((uint32_t)1<<5);
+    }
+
+    if (hour >= 10)
+    {
+        hour_buf |= (uint32_t)1<<4;
+        hour -= 10;
+    }
+    else
+    {
+        hour_buf &= ~((uint32_t)1<<4);
+    }
+
+    if (hour >= 8)
+    {
+        hour_buf |= (uint32_t)1<<3;
+        hour -= 8;
+    } 
+    else
+    {
+        hour_buf &= ~((uint32_t)1<<3);
+    }
+
+    if (hour >= 4)
+    {
+        hour_buf |= (uint32_t)1<<2;
+        hour -= 4;
+    } 
+    else
+    {
+        hour_buf &= ~((uint32_t)1<<2);
+    }
+
+    if (hour >= 2)
+    {
+        hour_buf |= (uint32_t)1<<1;
+        hour -= 2;
+    } 
+    else
+    {
+        hour_buf &= ~((uint32_t)1<<1);
+    }
+
+    if (hour >= 1)
+    {
+        hour_buf |= (uint32_t)1;
+        hour -= 1;
+    } 
+    else
+    {
+        hour_buf &= ~(uint32_t)1;
+    }
+
+    RTC->WA.WH = hour_buf;
+
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return SUCCESS;
+}
+/***************************************************************
+  函数名:RTC_WriteWeekAlarmWeek
+  描  述:修改星期
+  输入值:week: 星期(0-6)
+  输出值:无
+  返回值:无
+ ***************************************************************/
+ErrorStatus RTC_WriteWeekAlarmWeek(uint32_t week)
+{
+    uint32_t flag;
+
+    /* 检查输入参数 */
+    if (week > 6)
+        return ERROR;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    RTC->WA.WW = week;
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:RTC_WriteDayAlarmMinute
+  描  述:修改分钟
+  输入值:minute: 分钟
+  输出值:无
+  返回值:无
+ ***************************************************************/
+ErrorStatus RTC_WriteDayAlarmMinute(uint32_t minute)
+{
+    uint32_t flag,minute_buf;
+
+    /* 检查输入参数 */
+    if (minute >= 60)
+        return ERROR;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 设置新的值 */
+    if (minute >= 40)
+    {
+        minute_buf |= (uint32_t)1<<6;
+        minute -= 40;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1<<6;
+    }
+
+    if (minute >= 20)
+    {
+        minute_buf |= (uint32_t)1<<5;
+        minute -= 20;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1<<5;
+    }
+
+    if (minute >= 10)
+    {
+        minute_buf |= (uint32_t)1<<4;
+        minute -= 10;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1<<4;
+    }
+
+    if (minute >= 8)
+    {
+        minute_buf |= (uint32_t)1<<3;
+        minute -= 8;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1<<3;
+    }
+
+    if (minute >= 4)
+    {
+        minute_buf |= (uint32_t)1<<2;
+        minute -= 4;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1<<2;
+    }
+
+    if (minute >= 2)
+    {
+        minute_buf |= (uint32_t)1<<1;
+        minute -= 2;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1<<1;
+    }
+
+    if (minute >= 1)
+    {
+        minute_buf |= (uint32_t)1;
+        minute -= 1;
+    }
+    else
+    {
+        minute_buf &= ~(uint32_t)1;
+    }
+
+    RTC->DA.DM = minute_buf;
+
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return SUCCESS;
+}
+
+/***************************************************************
+  函数名:RTC_WriteDayAlarmHour
+  描  述:修改小时
+  输入值:hour: 小时
+          meridiem:(仅在12小时模式时有效)
+                    0 AM
+                    1 PM
+  输出值:无
+  返回值:无
+ ***************************************************************/
+ErrorStatus RTC_WriteDayAlarmHour(uint32_t hour, uint32_t meridiem)
+{
+    uint32_t flag,mode;
+    uint32_t hour_buf = 0;
+
+    /* 检查输入参数 */
+    if (hour >= 24)
+        return ERROR;
+
+    mode = RTC_ReadHourmode();
+
+    if(mode == RTC_HOUR12 && hour > 12)     //12小时模式不可大于12小时
+        return ERROR;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 设置新的值 */
+    if(mode == RTC_HOUR24)
+    {
+        if (hour >= 20)
+        {
+            hour_buf |= (uint32_t)1<<5;
+            hour -= 20;
+        }
+        else
+        {
+            hour_buf &= ~((uint32_t)1<<5);
+        }
+    }
+    else
+    {
+        if(meridiem == 1)
+            hour_buf |= (uint32_t)1<<5;
+        else
+            hour_buf &= ~((uint32_t)1<<5);
+    }
+
+    if (hour >= 10)
+    {
+        hour_buf |= (uint32_t)1<<4;
+        hour -= 10;
+    }
+    else
+    {
+        hour_buf &= ~((uint32_t)1<<4);
+    }
+
+    if (hour >= 8) 
+    {
+        hour_buf |= (uint32_t)1<<3;
+        hour -= 8;
+    }
+    else
+    {
+        hour_buf &= ~((uint32_t)1<<3);
+    }
+
+    if (hour >= 4) 
+    {
+        hour_buf |= (uint32_t)1<<2;
+        hour -= 4;
+    }
+    else
+    {
+        hour_buf &= ~((uint32_t)1<<2);
+    }
+
+    if (hour >= 2) 
+    {
+        hour_buf |= (uint32_t)1<<1;
+        hour -= 2;
+    }
+    else
+    {
+        hour_buf &= ~((uint32_t)1<<1);
+    }
+
+    if (hour >= 1) 
+    {
+        hour_buf |= (uint32_t)1;
+        hour -= 1;
+    }
+    else
+    {
+        hour_buf &= ~(uint32_t)1;
+    }
+
+    RTC->DA.DH = hour_buf;
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return SUCCESS;
+}
+
+
+/***************************************************************
+  函数名:RTC_InterruptEnable
+  描  述:使能实时时钟的某些中断
+  输入值:src: 实时时钟的中断源
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void RTC_InterruptEnable(RTC_Interrupt_Source src)
+{
+    uint32_t flag;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 设置新的值 */
+    switch (src)
+    {
+        case RTC_Interrupt_Source_Second:
+            RTC->IE.SCDIE = 1;
+            break;
+        case RTC_Interrupt_Source_Minute:
+            RTC->IE.MINIE = 1;
+            break;
+        case RTC_Interrupt_Source_Hour:
+            RTC->IE.HORIE = 1;
+            break;
+        case RTC_Interrupt_Source_Day:
+            RTC->IE.DAYIE = 1;
+            break;
+        case RTC_Interrupt_Source_Month:
+            RTC->IE.MONIE = 1;
+            break;
+        case RTC_Interrupt_Source_DayALE:
+            RTC->IE.DALE = 1;
+            break;
+        case RTC_Interrupt_Source_WeekALE:
+            RTC->IE.WALE = 1;
+            break;
+        default:
+            break;
+    }
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+
+    NVIC->ISER[0] |= (1 << 20); // 使能NVIC中断
+    return;
+}
+
+/***************************************************************
+  函数名:RTC_InterruptDisable
+  描  述:禁能实时时钟的某些中断
+  输入值:src: 实时时钟的中断源
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void RTC_InterruptDisable(RTC_Interrupt_Source src)
+{
+    uint32_t flag;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    /* 设置新的值 */
+    switch (src)
+    {
+        case RTC_Interrupt_Source_Second:
+            RTC->IE.SCDIE = 0;
+            break;
+        case RTC_Interrupt_Source_Minute:
+            RTC->IE.MINIE = 0;
+            break;
+        case RTC_Interrupt_Source_Hour:
+            RTC->IE.HORIE = 0;
+            break;
+        case RTC_Interrupt_Source_Day:
+            RTC->IE.DAYIE = 0;
+            break;
+        case RTC_Interrupt_Source_Month:
+            RTC->IE.MONIE = 0;
+            break;
+        case RTC_Interrupt_Source_DayALE:
+            RTC->IE.DALE = 0;
+            break;
+        case RTC_Interrupt_Source_WeekALE:
+            RTC->IE.WALE = 0;
+            break;
+        default:
+            break;
+    }
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return;
+}
+
+/***************************************************************
+  函数名:RTC_GetITStatus
+  描  述:读取实时时钟的某些中断状态
+  输入值:src: 实时时钟的中断源
+  输出值:无
+  返回值:中断标志
+ ***************************************************************/
+ITStatus RTC_GetITStatus(RTC_Interrupt_Source src)
+{
+    ITStatus result = RESET;
+
+    switch (src) 
+    {
+        case RTC_Interrupt_Source_Second:
+            if(RTC->IE.SCDIE)
+            result = SET;
+            break;
+        case RTC_Interrupt_Source_Minute:
+            if(RTC->IE.MINIE)
+                result = SET;
+            break;
+        case RTC_Interrupt_Source_Hour:
+            if(RTC->IE.HORIE)
+                result = SET;
+            break;
+        case RTC_Interrupt_Source_Day:
+            if(RTC->IE.DAYIE)
+                result = SET;
+            break;
+        case RTC_Interrupt_Source_Month:
+            if(RTC->IE.MONIE)
+                result = SET;
+            break;
+        case RTC_Interrupt_Source_DayALE:
+            if(RTC->IE.DALE)
+                result = SET;
+            break;
+        case RTC_Interrupt_Source_WeekALE:
+            if(RTC->IE.WALE)
+                result = SET;
+            break;
+        default:
+            result = RESET;
+            break;
+    }
+
+    return result;
+}
+
+/***************************************************************
+  函数名:RTC_GetFlagStatus
+  描  述:读取实时时钟的某些中断标志
+  输入值:src: 实时时钟的中断源
+  输出值:无
+  返回值:中断标志
+ ***************************************************************/
+FlagStatus RTC_GetFlagStatus(RTC_Interrupt_Source src)
+{
+    FlagStatus result = RESET;
+
+    switch (src) 
+    {
+        case RTC_Interrupt_Source_Second:
+            if(RTC->IF.SCDIF)
+                result = SET;
+            break;
+        case RTC_Interrupt_Source_Minute:
+            if(RTC->IF.MINIF)
+                result = SET;
+            break;
+        case RTC_Interrupt_Source_Hour:
+            if(RTC->IF.HORIF)
+                result = SET;
+            break;
+        case RTC_Interrupt_Source_Day:
+            if(RTC->IF.DAYIF)
+                result = SET;
+            break;
+        case RTC_Interrupt_Source_Month:
+            if(RTC->IF.MONIF)
+                result = SET;
+            break;
+        case RTC_Interrupt_Source_DayALE:
+            if(RTC->IF.DAFG)
+                result = SET;
+            break;
+        case RTC_Interrupt_Source_WeekALE:
+            if(RTC->IF.WAFG)
+                result = SET;
+            break;
+        default:
+            result = RESET;
+            break;
+    }
+
+    return result;
+}
+
+/***************************************************************
+  函数名:RTC_ClearITPendingBit
+  描  述:清除指定的中断标志位
+  输入值:src: 实时时钟的中断源
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void RTC_ClearITPendingBit(RTC_Interrupt_Source src)
+{
+    uint32_t flag;
+
+    /* 解除RTC写保护 */
+    flag = RTC->WP.WP;
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x55AAAA55;
+
+    switch (src)
+    {
+        case RTC_Interrupt_Source_Second:
+            RTC->IF.Word = RTC_Interrupt_Source_Second;
+            break;
+        case RTC_Interrupt_Source_Minute:
+            RTC->IF.Word = RTC_Interrupt_Source_Minute;
+            break;
+        case RTC_Interrupt_Source_Hour:
+            RTC->IF.Word = RTC_Interrupt_Source_Hour;
+            break;
+        case RTC_Interrupt_Source_Day:
+            RTC->IF.Word = RTC_Interrupt_Source_Day;
+            break;
+        case RTC_Interrupt_Source_Month:
+            RTC->IF.Word = RTC_Interrupt_Source_Month;
+            break;
+        case RTC_Interrupt_Source_DayALE:
+            RTC->IF.Word = RTC_Interrupt_Source_DayALE;
+            break;
+        case RTC_Interrupt_Source_WeekALE:
+            RTC->IF.Word = RTC_Interrupt_Source_WeekALE;
+            break;
+        default:
+
+            break;
+    }
+
+    /* 加入RTC写保护 */
+    if (flag == 0x00000000)
+        RTC->WP.WP = 0x00000000;
+    return;
+}
+
+/*************************END OF FILE**********************/
+
+

+ 97 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_scs.c

@@ -0,0 +1,97 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_scs.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  内核模块库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_scs.h"
+
+/***************************************************************
+  函数名:NVIC_Init
+  描  述:NVIC初始化配置
+  输入值:Channel:中断通道 、 Priority:中断优先级 、 Cmd:失能或使能
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void NVIC_Init(NVIC_IRQChannel Channel,NVIC_IRQPriority Priority,TYPE_FUNCEN Cmd)
+{
+    uint32_t tmppriority = 0x00;
+
+    if (Cmd != DISABLE)
+    {
+        /* Compute the Corresponding IRQ Priority */    
+        tmppriority = NVIC->IP[Channel >> 0x02];
+        tmppriority &= (uint32_t)(~(((uint32_t)0xFF) << ((Channel & 0x03) * 8)));
+        tmppriority |= (uint32_t)((((uint32_t)Priority << 6) & 0xFF) << ((Channel & 0x03) * 8));    
+
+        NVIC->IP[Channel >> 0x02] = tmppriority;
+
+        /* Enable the Selected IRQ Channels */
+        NVIC->ISER[0] = (uint32_t)0x01 << (Channel & (uint8_t)0x1F);
+    }
+    else
+    {
+        /* Disable the Selected IRQ Channels */
+        NVIC->ICER[0] = (uint32_t)0x01 << (Channel & (uint8_t)0x1F);
+    }
+}
+
+/***************************************************************
+  函数名:SCB_SystemLPConfig
+  描  述:配置系统休眠模式
+  输入值:LowPowerMode:休眠模式 、 NewState:使能、使能
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SCB_SystemLPConfig(SCB_TYPE_SCR LowPowerMode, TYPE_FUNCEN NewState)
+{
+    if (NewState != DISABLE)
+        SCB->SCR |= LowPowerMode;
+    else
+        SCB->SCR &= (uint32_t)(~(uint32_t)LowPowerMode);
+}
+
+/***************************************************************
+  函数名:SCB_GetCpuID
+  描  述:获取CPUID
+  输入值:无
+  输出值:无
+  返回值:32位ID值
+ ***************************************************************/
+uint32_t SCB_GetCpuID(void)
+{
+    return (SCB->CPUID);
+}
+
+/***************************************************************
+  函数名:SysTick_Init
+  描  述:SysTick初始化配置
+  输入值:初始化配置结构体地址
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SysTick_Init(SYSTICK_InitStruType* SysT_InitStruct)
+{
+    uint32_t temp32 = 0;
+
+    SysTick->LOAD = SysT_InitStruct->SysTick_Value;
+    SysTick->VAL = (uint32_t)0;
+
+    if(SysT_InitStruct->SysTick_ClkSource != SysTick_ClkS_Base)
+        temp32 |= 0x00000004;
+    else
+        temp32 &= 0xFFFFFFFB;
+
+    if(SysT_InitStruct->SysTick_ITEnable != DISABLE)
+        temp32 |= 0x00000002;
+    else
+        temp32 &= 0xFFFFFFFD;
+
+    SysTick->CTRL = temp32;
+}
+
+/*************************END OF FILE**********************/

+ 387 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_scu.c

@@ -0,0 +1,387 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_scu.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  系统控制模块库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_scu.h"
+
+/***************************************************************
+  函数名:SCU_OpenXTAL
+  描  述: 开启外部时钟
+  输入值:无
+  输出值:无
+  返回值:系统时钟源
+ ***************************************************************/
+void SCU_OpenXTAL(void)
+{
+	SCU_RegUnLock();
+	SCU->SCLKEN1.XTAL_EN = 1;
+	SCU->SCLKEN0.XTAL_LP = 0;
+	while(SCU->SCLKEN1.XTAL_RDY == 0); //等待外部时钟稳定
+	SCU_RegLock() ;
+}
+
+/***************************************************************
+  函数名:SCU_NMISelect
+  描  述:设置NMI不可屏蔽中断
+  输入值:不可屏蔽中断
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SCU_NMISelect(SCU_TYPE_NMICS NMI_Type)
+{
+	  SCU_RegUnLock();
+    SCU->NMICON.NMICS = NMI_Type;
+	  SCU_RegLock() ;
+}
+
+/***************************************************************
+  函数名:SCU_GetPWRCFlagStatus
+  描  述:获取PWRC复位状态寄存器标志位状态
+  输入值:PWRC寄存器标志位
+  输出值:无
+  返回值:RESET/SET
+ ***************************************************************/
+FlagStatus  SCU_GetPWRCFlagStatus(SCU_TYPE_PWRC PWRC_Flag)
+{
+    FlagStatus bitstatus = RESET;
+    if((SCU->PWRC.Word & (uint32_t)PWRC_Flag) != (uint32_t)RESET)
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return  bitstatus;
+}
+
+/***************************************************************
+  函数名:SCU_ClearPWRCFlagBit
+  描  述:清除PWRC复位状态寄存器标志位
+  输入值:PWRC寄存器标志位
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SCU_ClearPWRCFlagBit(SCU_TYPE_PWRC PWRC_Flag)
+{
+	  SCU_RegUnLock() ;
+    SCU->PWRC.Word &= ~((uint32_t)PWRC_Flag);
+	  SCU_RegLock() ;
+}
+
+/***************************************************************
+  函数名:SCU_GetLVDFlagStatus
+  描  述:获取LVDD寄存器标志位状态
+  输入值:LVD寄存器标志位
+  输出值:无
+  返回值:RESET/SET
+ ***************************************************************/
+FlagStatus  SCU_GetLVDFlagStatus(SCU_TYPE_LVD0CON LVD_Flag)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((SCU->LVDCON.Word & (uint32_t)LVD_Flag) != (uint32_t)RESET)
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return  bitstatus;
+}
+
+/***************************************************************
+  函数名:SCU_SysClkSelect
+  描  述:选择系统时钟
+  输入值:时钟源
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SCU_SysClkSelect(SCU_TYPE_SYSCLK Sysclk)
+{
+	  SCU_RegUnLock() ;
+    SCU->SCLKEN0.CLK_SEL = Sysclk;
+	  SCU_RegLock() ;
+}
+
+/***************************************************************
+  函数名:SCU_GetSysClk
+  描  述:获取系统时钟源
+  输入值:无
+  输出值:无
+  返回值:系统时钟源
+ ***************************************************************/
+SCU_TYPE_SYSCLK SCU_GetSysClk(void)
+{
+    return (SCU_TYPE_SYSCLK)(SCU->SCLKEN0.CLK_SEL);
+}
+
+/***************************************************************
+  函数名:SCU_HRCReadyFlag
+  描  述:获取HRC稳定标志位
+  输入值:无
+  输出值:无
+  返回值:RESET(不稳定)/SET(稳定)
+ ***************************************************************/
+FlagStatus SCU_HRCReadyFlag(void)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((SCU->SCLKEN1.HRC_RDY) != (uint32_t)RESET)
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return  bitstatus;
+}
+
+/***************************************************************
+  函数名:SCU_XTALReadyFlag
+  描  述:获取XTAL稳定标志位
+  输入值:无
+  输出值:无
+  返回值:RESET(不稳定)/SET(稳定)
+ ***************************************************************/
+FlagStatus  SCU_XTALReadyFlag(void)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((SCU->SCLKEN1.XTAL_RDY) != (uint32_t)RESET)
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return  bitstatus;
+}
+
+/***************************************************************
+  函数名:SCU_LOSCReadyFlag
+  描  述:获取LOSC稳定标志位
+  输入值:无
+  输出值:无
+  返回值:RESET(不稳定)/SET(稳定)
+ ***************************************************************/
+FlagStatus  SCU_PLLReadyFlag(void)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((SCU->SCLKEN1.PLL_RDY) != (uint32_t)RESET)
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return  bitstatus;
+}
+
+/***************************************************************
+ 函数名:SystemClockConfig
+ 描  述:系统时钟配置:内部时钟,20MHZ,打开所有外设时钟
+ 输入值:无
+ 输出值:无
+ 返回值:无
+***************************************************************/
+void SystemClockConfig(void)
+{
+    uint32_t Prot_Temp;
+
+    Prot_Temp = SCU->PROT.PROT;
+
+    if(Prot_Temp != 0)                      //写保护了
+        SCU_RegUnLock();                    //解锁
+
+    SCU_HRC_Enable();                       //使能内部20MHZ
+    while(SCU_HRCReadyFlag() != SET);       //等待时钟开启
+    SCU_SysClkSelect(SCU_SysClk_HRC);       //选择内部20MHZ为系统时钟
+	
+    SCU_SysClk_Div1();                      //系统时钟后分频1:1    
+    
+    SystemCoreClock = 20000000;
+
+    if(Prot_Temp != 0)                      //写保护了
+        SCU_RegLock();                      //打开写保护
+}
+
+/***************************************************************
+  函数名:DeviceClockAllEnable
+  描  述:打开所有外设时钟
+  输入值:无
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void DeviceClockAllEnable(void)
+{
+    uint32_t Prot_Temp;
+
+    Prot_Temp = SCU->PROT.PROT;
+    if(Prot_Temp != 0)                      //写保护了
+        SCU_RegUnLock();                    //解锁
+
+    SCU->PCLKEN0.Word = 0xFFFFFFFF;
+    SCU->PCLKEN1.Word = 0xFFFFFFFF;         //打开所有外设时钟
+
+    if(Prot_Temp != 0)                      //写保护了
+        SCU_RegLock();                      //打开写保护
+}
+
+/***************************************************************
+  函数名:DeviceClockAllDisable
+  描  述:关闭所有外设时钟
+  输入值:无
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void DeviceClockAllDisable(void)
+{
+    uint32_t Prot_Temp;
+
+    Prot_Temp = SCU->PROT.PROT;
+    if(Prot_Temp != 0)                      //写保护了
+        SCU_RegUnLock();                    //解锁
+
+    SCU->PCLKEN0.Word = 0x00000000;         //关闭所有外设时钟,scu无法关闭
+    SCU->PCLKEN1.Word = 0x00000000;
+
+    if(Prot_Temp != 0)                      //写保护了
+        SCU_RegLock();                  //打开写保护
+}
+
+/***************************************************************
+  函数名:SystemClockConfig
+  描  述:系统时钟选择
+  输入值:CLKx 系统时钟源选择
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SystemClockSelect(SCU_TYPE_SYSCLK SYSCLKx , SCU_TYPE_CLK_SEL CLK_SEL)
+{
+    SCU_RegUnLock();                        //解锁
+
+    switch(SYSCLKx)
+    {
+        case 0:
+            SCU_HRC_Enable();
+            while(SCU_HRCReadyFlag() != SET);
+            break;
+        case 1:
+            SCU_XTAL_Enable();
+            while(SCU_XTALReadyFlag() != SET);
+            break;
+        case 2:
+            SCU_PLL_Enable();
+            while(SCU_PLLReadyFlag() != SET);
+            break;
+        default:break;
+    }
+
+    SCU->SCLKEN0.SYSCLK_DIV = 0;
+    SCU->SCLKEN0.CLK_SEL = CLK_SEL;
+
+    SCU_RegLock();
+}
+
+
+/***************************************************************
+  函数名:PLLClock_Config
+  描  述:PLL时钟配置,并设置PLL时钟为系统时钟
+  输入值:pll_en:是否开启PLL,pll_origin:pll时钟源选择,pll_out:pll输出频率选择,sys_pll:系统时钟是否使用PLL时钟
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void PLLClock_Config(TYPE_FUNCEN pll_en , SCU_PLL_Origin  pll_origin ,SCU_PLL_Out pll_out,TYPE_FUNCEN sys_pll)
+{
+    SCU_RegUnLock();
+
+    if(pll_en == DISABLE)  //如果PLL配置为禁止,则直接禁止PLL,并返回
+    {
+        SCU->SCLKEN0.PLL_MUX = 0;
+        SCU->SCLKEN1.PLL_BYLOCK = 0;
+        SCU->SCLKEN0.CLKFLT_BY = 0x00;
+        SCU->SCLKEN1.PLL_EN = 0;
+        return;
+    }
+
+    if((pll_origin == SCU_PLL_HRC))         //如果使用内部高速时钟,需开启内部高速时钟
+    {
+        if(SCU->SCLKEN1.HRC_RDY == 0)
+        {
+            SCU->SCLKEN1.HRC_EN = 1;
+            while(SCU->SCLKEN1.HRC_RDY == 0);  //等待HRC开启
+        }
+    }
+
+    if((pll_origin == SCU_PLL_XTAL_32K)
+       || (pll_origin == SCU_PLL_XTAL_4M)
+       ||(pll_origin == SCU_PLL_XTAL_8M)
+       || (pll_origin == SCU_PLL_XTAL_16M)
+       || (pll_origin == SCU_PLL_XTAL_20M))          //如果使用外部时钟,需开启外部时钟
+    {
+        if(SCU->SCLKEN1.XTAL_RDY == 0)
+        {
+            SCU->SCLKEN1.XTAL_EN = 1;
+					  SCU->SCLKEN0.XTAL_LP = 0;
+            while(SCU->SCLKEN1.XTAL_RDY == 0);  //等待XTAL开启
+        }
+    }
+
+    switch(pll_origin)
+    {
+        case SCU_PLL_HRC:
+            SCU->SCLKEN1.PLL_REF_SEL = 0x00;
+            break;
+        case SCU_PLL_LRC:
+            SCU->SCLKEN1.PLL_REF_SEL = 0x02;
+            break;
+        case SCU_PLL_XTAL_32K:
+            SCU->SCLKEN1.PLL_REF_SEL = 0x03;
+            break;
+        case SCU_PLL_XTAL_4M:
+            SCU->SCLKEN1.PLL_REF_SEL = 0x04;
+            break;
+        case SCU_PLL_XTAL_8M:
+            SCU->SCLKEN1.PLL_REF_SEL = 0x05;
+            break;
+        case SCU_PLL_XTAL_16M:
+            SCU->SCLKEN1.PLL_REF_SEL = 0x06;
+            break;
+        case SCU_PLL_XTAL_20M:
+            SCU->SCLKEN1.PLL_REF_SEL = 0x07;
+            break;
+        default:
+            break;
+    }
+
+    SCU->SCLKEN1.PLL_48M_SEL = pll_out;   //配置PLL输出为32或48Mhz
+
+    SCU->SCLKEN1.PLL_EN = 1;
+    while(SCU->SCLKEN1.PLL_RDY == 0);
+
+
+    if(sys_pll == ENABLE)
+    {
+
+        if(pll_out == SCU_PLL_32M)
+        {
+          SCU->SCLKEN0.CLKFLT_BY = 0;
+        }
+        else
+        {
+          SCU->SCLKEN0.CLKFLT_BY = 0x55;  //48M 时钟滤波旁路
+        }
+        SCU->SCLKEN1.PLL_BYLOCK = 1;
+        SCU->SCLKEN0.PLL_MUX = 1;
+    }
+    else
+    {
+        SCU->SCLKEN0.PLL_MUX = 0;
+        SCU->SCLKEN1.PLL_BYLOCK = 0;
+        SCU->SCLKEN0.CLKFLT_BY = 0x00;
+    }
+
+    SCU_RegLock(); 
+}
+
+/*************************END OF FILE**********************/
+
+
+

+ 233 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_spi.c

@@ -0,0 +1,233 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_spi.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  SPI模块库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_spi.h"
+
+/***************************************************************
+  函数名:SPI0_Init
+  描  述:SPI初始化
+  输入值:初始化配置结构体地址
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SPI_Init(SPI_InitStruType* SPI_InitStruct)
+{
+    uint32_t Temp = 0;
+
+    Temp = SystemCoreClock / (SPI_InitStruct->SPI_Freq * 2);
+    if(Temp > 254)
+        Temp = 255;
+    
+    SPI0->CKS.CKS = Temp;
+    
+    SPI0->CON.DFS = SPI_InitStruct->SPI_Df;
+    SPI0->CON.MS = SPI_InitStruct->SPI_Mode;
+    SPI0->CON.DW = SPI_InitStruct->SPI_DW;
+    SPI0->CON.DRE = SPI_InitStruct->SPI_DelayRec;
+    SPI0->CON.TME = SPI_InitStruct->SPI_DelaySend;
+
+    Temp = (uint32_t)SPI_InitStruct->SPI_SendDelayPeroid - 1;
+    if(Temp > 62)
+        Temp = 63;
+
+    SPI0->CON.TMP = Temp;
+}
+
+/***************************************************************
+  函数名:SPI0_ITConfig
+  描  述:SPI中断配置
+  输入值:SPI_IE:中断类型 、 NewState:使能、失能
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SPI_ITConfig(SPI_TYPE_IT SPI_IE,TYPE_FUNCEN NewState)
+{
+    if(NewState != DISABLE)
+        SPI0->IE.Word |= (uint32_t)SPI_IE;
+    else
+        SPI0->IE.Word &= ~((uint32_t)SPI_IE);
+}
+
+/***************************************************************
+  函数名:SPI0_DataFormatConfig
+  描  述:SPI数据格式配置
+  输入值:数据格式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SPI_DataFormatConfig(SPI_TYPE_DFS Type)
+{
+    SPI0->CON.DFS = Type;
+}
+
+/***************************************************************
+  函数名:SPI0_SendByte
+  描  述:SPI发送一个字节(8位)
+  输入值:要发送的数据
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SPI_SendByte(uint8_t Temp)
+{
+    SPI0->TBW.Byte[0] = Temp;
+}
+
+/***************************************************************
+  函数名:SPI0_SendHalfWord
+  描  述:SPI发送一个半字(16位)
+  输入值:要发送的数据
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SPI_SendHalfWord(uint16_t Temp)
+{
+    SPI0->TBW.HalfWord[0] = Temp;
+}
+
+/***************************************************************
+  函数名:SPI0_SendWord
+  描  述:SPI发送一个字(32位)
+  输入值:要发送的数据
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SPI_SendWord(uint32_t Temp)
+{
+    SPI0->TBW.Word = Temp;
+}
+
+/***************************************************************
+  函数名:SPI0_RecByte
+  描  述:SPI接收一个字节
+  输入值:无
+  输出值:无
+  返回值:接收的数据
+ ***************************************************************/
+uint8_t SPI_RecByte(void)
+{
+    return SPI0->RBR.Byte[0];
+}
+
+/***************************************************************
+  函数名:SPI0_RecHalfWord
+  描  述:SPI接收一个半字
+  输入值:无
+  输出值:无
+  返回值:接收的数据
+ ***************************************************************/
+uint16_t SPI_RecHalfWord(void)
+{
+    return SPI0->RBR.HalfWord[0];
+}
+
+/***************************************************************
+  函数名:SPI0_RecWord
+  描  述:SPI接收一个字
+  输入值:无
+  输出值:无
+  返回值:接收的数据
+ ***************************************************************/
+uint32_t SPI_RecWord(void)
+{
+    return SPI0->RBR.Word;
+}
+
+/***************************************************************
+  函数名:SPI0_TBIMConfig
+  描  述:SPI发送缓冲器空中断模式选择
+  输入值:空中断模式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SPI_TBIMConfig(SPI_TYPE_TRBIM Type)
+{
+    SPI0->IE.TBIM = Type;
+}
+
+/***************************************************************
+  函数名:SPI0_RBIMConfig
+  描  述:SPI接收缓冲器满中断模式选择
+  输入值:满中断模式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SPI_RBIMConfig(SPI_TYPE_TRBIM Type)
+{
+    SPI0->IE.RBIM = Type;
+}
+
+/***************************************************************
+  函数名:SPI0_GetFlagStatus
+  描  述:SPI检查标志位状态
+  输入值:标志位
+  输出值:无
+  返回值:SET/RESET
+ ***************************************************************/
+FlagStatus SPI_GetFlagStatus(SPI_TYPE_FLAG Flag)
+{
+    FlagStatus bitstatus = RESET;
+
+    /* 读取寄存器 */
+    if((uint32_t)Flag <= 0x00000040)
+    {
+        if ((SPI0->IF.Word & Flag) != (uint32_t)RESET)
+            bitstatus = SET;
+        else
+            bitstatus = RESET;
+    }
+
+    else
+    {
+        if ((SPI0->STA.Word & Flag) != (uint32_t)RESET)
+            bitstatus = SET;
+        else
+            bitstatus = RESET;
+    }
+
+    return  bitstatus;
+}
+
+/***************************************************************
+  函数名:SPI0_GetITStatus
+  描  述:SPI检查中断状态,未使能相应中断时不会返回SET
+  输入值:中断标志位
+  输出值:无
+  返回值:SET/RESET
+ ***************************************************************/
+ITStatus SPI_GetITStatus(SPI_TYPE_IT Flag)
+{
+    FlagStatus bitstatus = RESET;
+    uint32_t itstatus = 0x0, itenable = 0x0;
+
+    itstatus = SPI0->IF.Word & (uint32_t)Flag;
+    itenable = SPI0->IE.Word & (uint32_t)Flag;
+
+    if ((itstatus != (uint32_t)RESET) && (itenable != (uint32_t)RESET))
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return  bitstatus;    
+}
+
+/***************************************************************
+  函数名:SPI0_ClearITPendingBit
+  描  述:SPI中断标志清除
+  输入值:标志位
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void SPI_ClearITPendingBit(SPI_CLR_IF Flag)
+{
+    SPI0->IF.Word = (uint32_t)Flag;
+}
+
+/*************************END OF FILE**********************/
+

+ 569 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_timer.c

@@ -0,0 +1,569 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_timer.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  定时器模块库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_timer.h"
+
+/***************************************************************
+  函数名:T16Nx_BaseInit
+  描  述:T16Nx基本初始化
+  输入值:T16Nx:可以是T16N0/1/2/3 、TIM_BaseInitStruct:初始化配置结构体地址
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_BaseInit(T16N_TypeDef* T16Nx,TIM_BaseInitStruType* TIM_BaseInitStruct)
+{
+    T16Nx->CON0.CS = TIM_BaseInitStruct->TIM_ClkS;
+    T16Nx->CON0.SYNC = TIM_BaseInitStruct->TIM_SYNC;
+    T16Nx->CON0.EDGE = TIM_BaseInitStruct->TIM_EDGE;
+    T16Nx->CON0.MOD = TIM_BaseInitStruct->TIM_Mode;
+}
+/***************************************************************
+  函数名:T32Nx_BaseInit
+  描  述:T32Nx基本初始化
+  输入值:T32Nx:可以是T32N0 、TIM_BaseInitStruct:初始化配置结构体地址
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T32Nx_BaseInit(T32N_TypeDef* T32Nx,TIM_BaseInitStruType* TIM_BaseInitStruct)
+{
+    T32Nx->CON0.CS = TIM_BaseInitStruct->TIM_ClkS;
+    T32Nx->CON0.SYNC = TIM_BaseInitStruct->TIM_SYNC;
+    T32Nx->CON0.EDGE = TIM_BaseInitStruct->TIM_EDGE;
+    T32Nx->CON0.MOD = TIM_BaseInitStruct->TIM_Mode;
+}
+/***************************************************************
+  函数名:T16Nx_CapInit
+  描  述:T16Nx捕捉初始化
+  输入值::T16Nx:可以是T16N0/1/2/3、 TIM_CapInitStruct:初始化配置结构体地址
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_CapInit(T16N_TypeDef* T16Nx,TIM_CapInitStruType* TIM_CapInitStruct)
+{
+    T16Nx->CON1.CAPPE = TIM_CapInitStruct->TIM_CapRise;
+    T16Nx->CON1.CAPNE = TIM_CapInitStruct->TIM_CapFall;
+    T16Nx->CON1.CAPIS0 = TIM_CapInitStruct->TIM_CapIS0;
+    T16Nx->CON1.CAPIS1 = TIM_CapInitStruct->TIM_CapIS1;
+    T16Nx->CON1.CAPT = TIM_CapInitStruct->TIM_CapTime;
+}
+/***************************************************************
+  函数名:T32Nx_CapInit
+  描  述:T32Nx捕捉初始化
+  输入值::T32Nx:可以是T32N0、 TIM_CapInitStruct:初始化配置结构体地址
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T32Nx_CapInit(T32N_TypeDef* T32Nx,TIM_CapInitStruType* TIM_CapInitStruct)
+{
+    T32Nx->CON1.CAPPE = TIM_CapInitStruct->TIM_CapRise;
+    T32Nx->CON1.CAPNE = TIM_CapInitStruct->TIM_CapFall;
+    T32Nx->CON1.CAPIS0 = TIM_CapInitStruct->TIM_CapIS0;
+    T32Nx->CON1.CAPIS1 = TIM_CapInitStruct->TIM_CapIS1;
+    T32Nx->CON1.CAPT = TIM_CapInitStruct->TIM_CapTime;
+}
+/***************************************************************
+  函数名:T16Nx_MATxITConfig
+  描  述:T16Nx匹配后的工作模式配置
+  输入值:T16Nx:可以是T16N0/1/2/3、 Type:匹配后的工作模式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_MAT0ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_MATCON Type)
+{
+    T16Nx->CON0.MAT0S = Type;
+}
+void T16Nx_MAT1ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_MATCON Type)
+{
+    T16Nx->CON0.MAT1S = Type;
+}
+void T16Nx_MAT2ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_MATCON Type)
+{
+    T16Nx->CON0.MAT2S = Type;
+}
+void T16Nx_MAT3ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_MATCON Type)
+{
+    T16Nx->CON0.MAT3S = Type;
+}
+/***************************************************************
+  函数名:T32Nx_MATxITConfig
+  描  述:T32Nx匹配后的工作模式配置
+  输入值:T32Nx:可以是T32N0、 Type:匹配后的工作模式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T32Nx_MAT0ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_MATCON Type)
+{
+    T32Nx->CON0.MAT0S = Type;
+}
+void T32Nx_MAT1ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_MATCON Type)
+{
+    T32Nx->CON0.MAT1S = Type;
+}
+void T32Nx_MAT2ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_MATCON Type)
+{
+    T32Nx->CON0.MAT2S = Type;
+}
+void T32Nx_MAT3ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_MATCON Type)
+{
+    T32Nx->CON0.MAT3S = Type;
+}
+/***************************************************************
+  函数名:T16Nx_MATxOutxConfig
+  描  述:T16Nx匹配后的输出端口的模式配置
+  输入值:T16Nx:可以是T16N0/1/2/3 、 Type:匹配后端口的工作模式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_MAT0Out0Config(T16N_TypeDef* T16Nx,TIM_TYPE_MATOUT Type)
+{
+    T16Nx->CON2.MOM0 = Type;
+}
+void T16Nx_MAT1Out0Config(T16N_TypeDef* T16Nx,TIM_TYPE_MATOUT Type)
+{
+    T16Nx->CON2.MOM1 = Type;
+}
+void T16Nx_MAT2Out1Config(T16N_TypeDef* T16Nx,TIM_TYPE_MATOUT Type)
+{
+    T16Nx->CON2.MOM2 = Type;
+}
+void T16Nx_MAT3Out1Config(T16N_TypeDef* T16Nx,TIM_TYPE_MATOUT Type)
+{
+    T16Nx->CON2.MOM3 = Type;
+}
+/***************************************************************
+  函数名:T32Nx_MATxOutxConfig
+  描  述:T32Nx匹配后的输出端口的模式配置
+  输入值:T32Nx:可以是T32N0 、 Type:匹配后端口的工作模式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T32Nx_MAT0Out0Config(T32N_TypeDef* T32Nx,TIM_TYPE_MATOUT Type)
+{
+    T32Nx->CON2.MOM0 = Type;
+}
+void T32Nx_MAT1Out0Config(T32N_TypeDef* T32Nx,TIM_TYPE_MATOUT Type)
+{
+    T32Nx->CON2.MOM1 = Type;
+}
+void T32Nx_MAT2Out1Config(T32N_TypeDef* T32Nx,TIM_TYPE_MATOUT Type)
+{
+    T32Nx->CON2.MOM2 = Type;
+}
+void T32Nx_MAT3Out1Config(T32N_TypeDef* T32Nx,TIM_TYPE_MATOUT Type)
+{
+    T32Nx->CON2.MOM3 = Type;
+}
+/***************************************************************
+  函数名:T16Nx_ITConfig
+  描  述:T16N中断配置
+  输入值:T16Nx:可以是T16N0/1/2/3、 Type:中断类型 、 NewState:使能/失能
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_IT Type,TYPE_FUNCEN NewState)
+{
+    if (NewState != DISABLE)
+        T16Nx->IE.Word |= (uint32_t)Type;
+    else
+        T16Nx->IE.Word &= (~(uint32_t)Type);
+}
+/***************************************************************
+  函数名:T32Nx_ITConfig
+  描  述:T32N中断配置
+  输入值:T32Nx:可以是T32N0、 Type:中断类型 、 NewState:使能/失能
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T32Nx_ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_IT Type,TYPE_FUNCEN NewState)
+{
+    if (NewState != DISABLE)
+        T32Nx->IE.Word|= (uint32_t)Type;
+    else
+        T32Nx->IE.Word &= (~(uint32_t)Type);
+}
+/***************************************************************
+  函数名:T16Nx_PWMOutConfig
+  描  述:T16N0OUT0,T16N1OUT0、T16N2OUT0、T16N3OUT0 输出配置。原理为使用uart的脉宽调制,因此不能与uart同时使用。
+  输入值:
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_PWMOutConfig(T16N_TypeDef* T16Nx,T16Nx_PWMInitStruType* T16Nx_PWMInitStruct)
+{
+    T16Nx->CON2.MOE0 = T16Nx_PWMInitStruct->T16Nx_MOE0;           //配置输出端口0是否使能
+    T16Nx->CON2.MOE1 = T16Nx_PWMInitStruct->T16Nx_MOE1;           //配置输出端口1是否使能
+    T16Nx->CON2.POL0 = T16Nx_PWMInitStruct->T16Nx_POL0;           //配置T16NxOut0输出极性
+    T16Nx->CON2.POL1 = T16Nx_PWMInitStruct->T16Nx_POL1;           //配置T16NxOut1输出极性
+}
+/***************************************************************
+  函数名:T16Nx_PWMBK_Config
+  描  述:配置PWM刹车功能
+  输入值:T16Nx:可以是T16N0/1/2/3 ,Type 配置PWM刹车结构体
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_PWMBK_Config(T16N_TypeDef* T16Nx,T16Nx_PWMBK_Type* type)
+{
+    T16Nx->CON2.PBKL0 = type->T16Nx_PWMBKL0;        //PWM通道0刹车输出电平选择
+    T16Nx->CON2.PBKL1 = type->T16Nx_PWMBKL1;        //PWM通道1刹车输出电平选择
+    T16Nx->CON2.PBKS = type->T16Nx_PWMBKS;          //PWM信号源选择
+    T16Nx->CON2.PBKPS = type->T16Nx_PWMBKPS;        //PWM通道刹车信号极性选择
+    T16Nx->CON2.PBKEN = type->T16Nx_PWMBKEN;        //PWM通道刹车使能
+}
+/***************************************************************
+  函数名:T16Nx_TRG_Config
+  描  述: 配置T16N ADC触发使能
+  输入值:T16Nx:可以是T16N0/1/2/3 
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_TRG_Config(T16N_TypeDef* T16Nx,T16Nx_PWMTRG_type Type,TYPE_FUNCEN NewState)
+{
+    if(Type == T16Nx_MAT0)
+        T16Nx->TRG.MAT0TAR = 1;
+    else if(Type == T16Nx_MAT1)
+        T16Nx->TRG.MAT1TAR = 1;
+    else if(Type == T16Nx_MAT2)
+        T16Nx->TRG.MAT2TAR = 1;
+    else if(Type == T16Nx_MAT3)
+        T16Nx->TRG.MAT3TAR = 1;
+
+    T16Nx->TRG.OVTAR = NewState;
+}
+/***************************************************************
+  函数名:T16Nx_GetPWMBKF
+  描  述:获取PWMBKF刹车标志位
+  输入值:T16Nx:可以是T16N0/1/2/3 
+  输出值:PWMBKF标志位的值。SET:发生刹车事件,RESET:未发生刹车事件
+  返回值:无
+ ***************************************************************/
+FlagStatus T16Nx_GetPWMBKF(T16N_TypeDef* T16Nx)
+{
+    if(T16Nx->CON2.PBKF == 1)
+        return SET;
+    else
+        return RESET;
+}
+/***************************************************************
+  函数名:T16Nx_ResetPWMBKF
+  描  述: 清除PWMBKF标志,标志清除后PWM端口恢复正常shuc
+  输入值:T16Nx:可以是T16N0/1/2/3 
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_ResetPWMBKF(T16N_TypeDef* T16Nx)
+{
+    T16Nx->CON2.PBKF = 1;
+}
+/***************************************************************
+  函数名:T16Nx_SetCNT
+  描  述:设置计数值
+  输入值:T16Nx:可以是T16N0/1/2/3、 Value:16位数值
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_SetCNT(T16N_TypeDef* T16Nx,uint16_t Value)
+{
+    T16Nx->CNT.CNT = Value;
+}
+/***************************************************************
+  函数名:T32Nx_SetCNT
+  描  述:设置计数值
+  输入值:T32Nx:可以是T32N0、 Value:32位数值(16位时右对齐)
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T32Nx_SetCNT(T32N_TypeDef* T32Nx,uint32_t Value)
+{
+    T32Nx->CNT.CNT = Value;
+}
+/***************************************************************
+  函数名:T16Nx_SetPRECNT
+  描  述:设置预分频计数寄存器值
+  输入值:T16Nx:可以是T16N0/1/2/3 、 Value:8位数值
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_SetPRECNT(T16N_TypeDef* T16Nx,uint8_t Value)
+{
+    T16Nx->PRECNT.PRECNT = Value;
+}
+/***************************************************************
+  函数名:T32Nx_SetPRECNT
+  描  述:设置预分频计数寄存器值
+  输入值:T32Nx:可以是T32N0、  Value:8位数值
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T32Nx_SetPRECNT(T32N_TypeDef* T32Nx,uint8_t Value)
+{
+    T32Nx->PRECNT.PRECNT = Value - 1;
+}
+/***************************************************************
+  函数名:T16Nx_SetPREMAT
+  描  述:设置预分频计数匹配寄存器值
+  输入值:T16Nx:可以是T16N0/1/2/3、 Value:8位数值
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_SetPREMAT(T16N_TypeDef* T16Nx,uint8_t Value)
+{
+    T16Nx->PREMAT.PREMAT = Value - 1;
+}
+/***************************************************************
+  函数名:T32Nx_SetPREMAT
+  描  述:设置预分频计数匹配寄存器值
+  输入值:T32Nx:可以是T32N0、 、 Value:8位数值
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T32Nx_SetPREMAT(T32N_TypeDef* T32Nx,uint8_t Value)
+{
+    T32Nx->PREMAT.PREMAT = Value - 1;
+}
+/***************************************************************
+  函数名:T16Nx_SetMATx
+  描  述:设置匹配寄存器
+  输入值:T16Nx:可以是T16N0/1/2/3、 MATx:可以是TIM_MAT0/1/2/3 、 Value:16位数值
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_SetMAT0(T16N_TypeDef* T16Nx,uint16_t Value)
+{
+    T16Nx->MAT0.MAT0 = Value;
+}
+void T16Nx_SetMAT1(T16N_TypeDef* T16Nx,uint16_t Value)
+{
+    T16Nx->MAT1.MAT1 = Value;
+}
+void T16Nx_SetMAT2(T16N_TypeDef* T16Nx,uint16_t Value)
+{
+    T16Nx->MAT2.MAT2 = Value;
+}
+void T16Nx_SetMAT3(T16N_TypeDef* T16Nx,uint16_t Value)
+{
+    T16Nx->MAT3.MAT3 = Value;
+}
+/***************************************************************
+  函数名:T32Nx_SetMATx
+  描  述:设置匹配寄存器
+  输入值:T32Nx:可以是T32N0、 MATx:可以是TIM_MAT0/1/2/3 、 Value:32位数值
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T32Nx_SetMAT0(T32N_TypeDef* T32Nx,uint32_t Value)
+{
+    T32Nx->MAT0.MAT0 = Value;
+}
+void T32Nx_SetMAT1(T32N_TypeDef* T32Nx,uint32_t Value)
+{
+    T32Nx->MAT1.MAT1 = Value;
+}
+void T32Nx_SetMAT2(T32N_TypeDef* T32Nx,uint32_t Value)
+{
+    T32Nx->MAT2.MAT2 = Value;
+}
+void T32Nx_SetMAT3(T32N_TypeDef* T32Nx,uint32_t Value)
+{
+    T32Nx->MAT3.MAT3 = Value;
+}
+/***************************************************************
+  函数名:T16Nx_GetMATx
+  描  述:读取匹配寄存器值
+  输入值:T16Nx:可以是T16N0/1/2/3
+  输出值:无
+  返回值:16位数值
+ ***************************************************************/
+uint16_t T16Nx_GetMAT0(T16N_TypeDef* T16Nx)
+{
+    return (T16Nx->MAT0.MAT0);
+}
+uint16_t T16Nx_GetMAT1(T16N_TypeDef* T16Nx)
+{
+    return (T16Nx->MAT1.MAT1);
+}
+uint16_t T16Nx_GetMAT2(T16N_TypeDef* T16Nx)
+{
+    return (T16Nx->MAT2.MAT2);
+}
+uint16_t T16Nx_GetMAT3(T16N_TypeDef* T16Nx)
+{
+    return (T16Nx->MAT3.MAT3);
+}
+/***************************************************************
+  函数名:T32Nx_GetMATx
+  描  述:读取匹配寄存器值
+  输入值:T32Nx:可以是T32N0/3 MATx:可以是TIM_MAT0/1/2/3
+  输出值:无
+  返回值:32位数值
+ ***************************************************************/
+uint32_t T32Nx_GetMAT0(T32N_TypeDef* T32Nx)
+{
+    return (T32Nx->MAT0.MAT0);
+}
+uint32_t T32Nx_GetMAT1(T32N_TypeDef* T32Nx)
+{
+    return (T32Nx->MAT1.MAT1);
+}
+uint32_t T32Nx_GetMAT2(T32N_TypeDef* T32Nx)
+{
+    return (T32Nx->MAT2.MAT2);
+}
+uint32_t T32Nx_GetMAT3(T32N_TypeDef* T32Nx)
+{
+    return (T32Nx->MAT3.MAT3);
+}
+/***************************************************************
+  函数名:T16Nx_GetCNT
+  描  述:读取计数寄存器值
+  输入值:T16Nx:可以是T16N0/1/2/3、
+  返回值:16位数值
+ ***************************************************************/
+uint16_t T16Nx_GetCNT(T16N_TypeDef* T16Nx)
+{
+    return (T16Nx->CNT.CNT);
+}
+/***************************************************************
+  函数名:T32Nx_GetCNT
+  描  述:读取计数寄存器值
+  输入值:T32Nx:可以是T32N0/3、
+  返回值:16/32位数值
+ ***************************************************************/
+uint32_t T32Nx_GetCNT(T32N_TypeDef* T32Nx)
+{
+    return (T32Nx->CNT.CNT);
+}
+/***************************************************************
+  函数名:T16Nx_GetPRECNT
+  描  述:读取预分频计数寄存器值
+  输入值:T16Nx:可以是T16N0/1/2/3
+  输出值:无
+  返回值:8位数值
+ ***************************************************************/
+uint8_t T16Nx_GetPRECNT(T16N_TypeDef* T16Nx)
+{
+    return (uint8_t)(T16Nx->PRECNT.PRECNT);
+}
+/***************************************************************
+  函数名:T32Nx_GetPRECNT
+  描  述:读取预分频计数寄存器值
+  输入值:T32Nx:可以是T32N0
+  输出值:无
+  返回值:8位数值
+ ***************************************************************/
+uint8_t T32Nx_GetPRECNT(T32N_TypeDef* T32Nx)
+{
+    return (uint8_t)(T32Nx->PRECNT.PRECNT);
+}
+/***************************************************************
+  函数名:T16Nx_GetFlagStatus
+  描  述:读取指定标志位
+  输入值:T16Nx:可以是T16N0/1/2/3、 TIM_Flag:中断标志位
+  输出值:无
+  返回值:RESET/SET
+ ***************************************************************/
+FlagStatus T16Nx_GetFlagStatus(T16N_TypeDef* T16Nx,TIM_TYPE_IF TIM_Flag)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((T16Nx->IF.Word & (uint32_t)TIM_Flag) != (uint32_t)RESET)
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return bitstatus;
+}
+/***************************************************************
+  函数名:T32Nx_GetFlagStatus
+  描  述:读取指定标志位
+  输入值:T32Nx:可以是T32N0、、 TIM_Flag:中断标志位
+  输出值:无
+  返回值:RESET/SET
+ ***************************************************************/
+FlagStatus T32Nx_GetFlagStatus(T32N_TypeDef* T32Nx,TIM_TYPE_IF TIM_Flag)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((T32Nx->IF.Word & (uint32_t)TIM_Flag) != (uint32_t)RESET)
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return bitstatus;
+}
+
+/***************************************************************
+  函数名:T16Nx_GetITStatus
+  描  述:读取指定中断标志位,未使能相应中断时不会返回SET
+  输入值:T16Nx:可以是T16N0/1/2/3、 TIM_Flag:中断标志位
+  输出值:无
+  返回值:RESET/SET
+ ***************************************************************/
+ITStatus T16Nx_GetITStatus(T16N_TypeDef* T16Nx,TIM_TYPE_IT TIM_Flag)
+{
+    ITStatus bitstatus = RESET;
+    uint32_t itstatus = 0x0, itenable = 0x0;
+
+    itstatus = T16Nx->IF.Word & (uint32_t)TIM_Flag;
+    itenable = T16Nx->IE.Word & (uint32_t)TIM_Flag;
+
+    if ((itstatus != (uint32_t)RESET) && (itenable != (uint32_t)RESET))
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return bitstatus;
+}
+/***************************************************************
+  函数名:T32Nx_GetITStatus
+  描  述:读取指定中断标志位,未使能相应中断时不会返回SET
+  输入值:T32Nx:可以是T32N0、 TIM_Flag:中断标志位
+  输出值:无
+  返回值:RESET/SET
+ ***************************************************************/
+ITStatus T32Nx_GetITStatus(T32N_TypeDef* T32Nx,TIM_TYPE_IT TIM_Flag)
+{
+    ITStatus bitstatus = RESET;
+    uint32_t itstatus = 0x0, itenable = 0x0;
+
+    itstatus = T32Nx->IF.Word  & (uint32_t)TIM_Flag;
+    itenable = T32Nx->IE.Word  & (uint32_t)TIM_Flag;
+
+    if ((itstatus != (uint32_t)RESET) && (itenable != (uint32_t)RESET))
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return bitstatus;
+}
+/***************************************************************
+  函数名:T16Nx_ClearIFPendingBit
+  描  述:清除指定的中断标志位
+  输入值:T16Nx:可以是T16N0/1/2/3、 TIM_Flag:中断标志位
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T16Nx_ClearIFPendingBit(T16N_TypeDef* T16Nx,TIM_TYPE_IF TIM_Flag)
+{
+    T16Nx->IF.Word = (uint32_t)TIM_Flag;
+}
+/***************************************************************
+  函数名:T32Nx_ClearIFPendingBit
+  描  述:清除指定的中断标志位
+  输入值:T32Nx:可以是T32N0、 TIM_Flag:中断标志位
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void T32Nx_ClearIFPendingBit(T32N_TypeDef* T32Nx,TIM_TYPE_IF TIM_Flag)
+{
+    T32Nx->IF.Word = (uint32_t)TIM_Flag;
+}
+
+/*************************END OF FILE**********************/

+ 198 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_uart.c

@@ -0,0 +1,198 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_uart.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/07/14
+ *描  述:  UART模块库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_uart.h"
+
+/***************************************************************
+  函数名:UART_Init
+  描  述:UART初始化
+  输入值:UARTx:可以是UART0/1/2/3/4/5 、 UART_InitStruct:初始化配置结构体地址
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void UART_Init(UART_TypeDef* UARTx,UART_InitStruType* UART_InitStruct)
+{
+    uint32_t BaudClockTemp = 0, BaudTemp = 0;
+
+    if(UART_InitStruct->UART_ClockSet == UART_Clock_1)
+    {
+        BaudClockTemp = (SystemCoreClock/16)%UART_InitStruct->UART_BaudRate;
+        if(UART_InitStruct->UART_BaudRate >= (2*BaudClockTemp))
+        {
+            BaudTemp = (SystemCoreClock/16/UART_InitStruct->UART_BaudRate)-1;
+        }
+        else
+        {
+            BaudTemp = SystemCoreClock/16/UART_InitStruct->UART_BaudRate;
+        }
+    }
+    else if(UART_InitStruct->UART_ClockSet == UART_Clock_2)
+    {
+        BaudClockTemp = (SystemCoreClock/32)%UART_InitStruct->UART_BaudRate;
+        if(UART_InitStruct->UART_BaudRate >= (2*BaudClockTemp))
+        {
+            BaudTemp = (SystemCoreClock/32/UART_InitStruct->UART_BaudRate)-1;
+        }
+        else
+        {
+            BaudTemp = SystemCoreClock/32/UART_InitStruct->UART_BaudRate;
+        }
+    }
+    else if(UART_InitStruct->UART_ClockSet == UART_Clock_4)
+    {
+        BaudClockTemp = (SystemCoreClock/64)%UART_InitStruct->UART_BaudRate;
+        if(UART_InitStruct->UART_BaudRate >= (2*BaudClockTemp))
+        {
+            BaudTemp = (SystemCoreClock/64/UART_InitStruct->UART_BaudRate)-1;
+        }
+        else
+        {
+            BaudTemp = SystemCoreClock/64/UART_InitStruct->UART_BaudRate;
+        }
+    }
+
+    if(BaudTemp > 2046)
+    {
+        BaudTemp = 2047;
+    }
+
+    UARTx->CON.BCS = UART_InitStruct->UART_ClockSet;
+    UARTx->BRR.BRR = BaudTemp ;
+
+    UARTx->CON.TXFS = UART_InitStruct->UART_StopBits;
+    UARTx->CON.TXMOD = UART_InitStruct->UART_TxMode;
+    UARTx->CON.TXP = UART_InitStruct->UART_TxPolar;
+    UARTx->CON.RXMOD = UART_InitStruct->UART_RxMode;
+    UARTx->CON.RXP = UART_InitStruct->UART_RxPolar;
+}
+/***************************************************************
+  函数名:UART_ITConfig
+  描  述:UART中断配置
+  输入值:UARTx:可以是UART0/1/2/3/4/5 、 UART_IT:中断类型 、 NewState:使能/失能
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void UART_ITConfig(UART_TypeDef* UARTx,UART_TYPE_IT UART_IT,TYPE_FUNCEN NewState)
+{
+    if (NewState != DISABLE)
+        UARTx->IE.Word = (UARTx->IE.Word & (uint32_t)0x0000FFFF) | (uint32_t) UART_IT;
+    else
+        UARTx->IE.Word = (UARTx->IE.Word & (uint32_t)0x0000FFFF) & (~((uint32_t) UART_IT));
+}
+/***************************************************************
+  函数名:UART_TBIMConfig
+  描  述:UART发送缓冲器空中断模式选择
+  输入值:UARTx:可以是UART0/1/2/3/4/5 、 Type:空中断模式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void UART_TBIMConfig(UART_TypeDef* UARTx,UART_TYPE_TRBIM Type)
+{
+    UARTx->IE.TBIM = Type;
+}
+/***************************************************************
+  函数名:UART_RBIMConfig
+  描  述:UART接收缓冲器满中断模式选择
+  输入值:UARTx:可以是UART0/1/2/3 、 Type:满中断模式
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void UART_RBIMConfig(UART_TypeDef* UARTx,UART_TYPE_TRBIM Type)
+{
+    UARTx->IE.RBIM = Type;
+}
+/***************************************************************
+  函数名:UART_Sendxxxx
+  描  述:UART发送字节、半字、字
+  输入值:UARTx:可以是UART0/1/2/3/4/5 、 数据
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void UART_SendByte(UART_TypeDef* UARTx,uint8_t Temp08)
+{
+    UARTx->TBW.Byte[0] = Temp08;
+}
+void UART_SendHalfWord(UART_TypeDef* UARTx,uint16_t Temp16)
+{
+    UARTx->TBW.HalfWord[0] = Temp16;
+}
+void UART_SendWord(UART_TypeDef* UARTx,uint32_t Temp32)
+{
+    UARTx->TBW.Word = Temp32;
+}
+/***************************************************************
+  函数名:UART_Recxxxx
+  描  述:UART接收字节、半字、字
+  输入值:UARTx:可以是UART0/1/2/3/4/5
+  输出值:无
+  返回值:数据
+ ***************************************************************/
+uint8_t UART_RecByte(UART_TypeDef* UARTx)
+{
+    return UARTx->RBR.Byte[0];
+}
+uint16_t UART_RecHalfWord(UART_TypeDef* UARTx)
+{
+    return UARTx->RBR.HalfWord[0];
+}
+uint32_t UART_RecWord(UART_TypeDef* UARTx)
+{
+    return UARTx->RBR.Word;
+}
+/***************************************************************
+  函数名:UART_GetFlagStatus
+  描  述:UART获取标志位状态
+  输入值:UARTx:可以是UART0/1/2/3/4/5 、 UART_Flag:标志位
+  输出值:无
+  返回值:SET/RESET
+ ***************************************************************/
+FlagStatus UART_GetFlagStatus(UART_TypeDef* UARTx,UART_TYPE_FLAG UART_Flag)
+{
+    FlagStatus bitstatus = RESET;
+
+    if ((UARTx->IF.Word & ((uint32_t)UART_Flag)) != RESET)
+        bitstatus = SET;
+    else
+        bitstatus = RESET;
+
+    return bitstatus;
+}
+
+/***************************************************************
+  函数名:UART_GetITStatus
+  描  述:UART获取中断状态
+  输入值:UARTx:可以是UART0/1/2/3/4/5 、 UART_Flag:标志位
+  输出值:无
+  返回值:SET/RESET
+ ***************************************************************/
+ITStatus UART_GetITStatus(UART_TypeDef* UARTx,UART_TYPE_IT UART_IT)
+{
+    FlagStatus bitstatus = RESET;
+
+    if((UARTx->IE.Word & ((uint32_t)UART_IT)) == 0)
+        bitstatus = RESET;
+    else
+        bitstatus = SET;
+
+    return bitstatus;
+}
+/***************************************************************
+  函数名:UART_ClearIFPendingBit
+  描  述:UART标志位清除
+  输入值:UARTx:可以是UART0/1/2/3/4/5、 UART_Flag:标志位
+  输出值:无
+  返回值:无
+ ***************************************************************/
+void UART_ClearIFPendingBit(UART_TypeDef* UARTx,UART_CLR_IF UART_Flag)
+{
+    UARTx->IF.Word = (uint32_t)UART_Flag;
+}
+
+/*************************END OF FILE**********************/

+ 172 - 0
bsp/essemi/es8p508x/libraries/Library/Source/lib_wdt.c

@@ -0,0 +1,172 @@
+/***************************************************************
+ *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
+ *文件名:  lib_wdt.c
+ *作  者:  Liut
+ *版  本:  V1.00
+ *日  期:  2017/02/04
+ *描  述:  看门狗模块库函数
+ *备  注:  适用于 ES8P508x芯片
+ 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
+ ***************************************************************/
+#include "lib_wdt.h"
+
+/*************************************
+  函数名:IWDT_Init
+  描  述:IWDT初始化
+  输入值:初始化结构体
+  返回值:无
+ **************************************/
+void IWDT_Init(IWDT_InitStruType *WDT_InitStruct)
+{
+    uint32_t tmp;
+
+    if (WDT_InitStruct->WDT_Clock != WDT_CLOCK_PCLK)
+        tmp = (uint32_t)(32 * WDT_InitStruct->WDT_Tms);
+    else
+        tmp = SystemCoreClock / 1000 * WDT_InitStruct->WDT_Tms;
+
+    IWDT->LOAD.LOAD = tmp;
+    IWDT->CON.CLKS = WDT_InitStruct->WDT_Clock;
+    IWDT->CON.IE = WDT_InitStruct->WDT_IE;
+    IWDT->CON.RSTEN = WDT_InitStruct->WDT_Rst;
+
+    return;
+}
+
+/*************************************
+  函数名:IWDT_SetReloadValue
+  描  述:设置WDT重载的初值
+  输入值:初始值,32-bit无符号整数
+  返回值:无
+ **************************************/
+void IWDT_SetReloadValue(uint32_t Value)
+{
+    IWDT->LOAD.LOAD = Value;
+    return;
+}
+
+/*************************************
+  函数名:IWDT_GetValue
+  描  述:获取WDT当前值
+  输入值:无
+  返回值:当前值
+ **************************************/
+uint32_t IWDT_GetValue(void)
+{
+    return (uint32_t)IWDT->VALUE.VALUE;
+}
+
+/*************************************
+  函数名:IWDT_GetFlagStatus
+  描  述:获取WDT中断状态
+  输入值:无
+  返回值:SET/RESET
+ **************************************/
+FlagStatus IWDT_GetFlagStatus(void)
+{
+    FlagStatus bitstatus = RESET;
+
+    if (IWDT->RIS.WDTIF != RESET)
+        bitstatus = SET;
+
+    return  bitstatus;
+}
+
+/*************************************
+  函数名:IWDT_GetITStatus
+  描  述:获取WDT使能中断状态
+  输入值:无
+  返回值:SET/RESET
+ **************************************/
+FlagStatus IWDT_GetITStatus(void)
+{
+    FlagStatus bitstatus = RESET;
+
+    if (IWDT->CON.IE != RESET)
+        bitstatus = SET;
+
+    return  bitstatus;
+}
+
+/*************************************
+  函数名:WWDT_Init
+  描  述:WWDT初始化
+  输入值:初始化结构体
+  返回值:无
+ **************************************/
+void WWDT_Init(WWDT_InitStruType *WDT_InitStruct)
+{
+    uint32_t tmp;
+
+    if (WDT_InitStruct->WDT_Clock != WDT_CLOCK_PCLK)
+        tmp = (uint32_t)(32 * WDT_InitStruct->WDT_Tms);
+    else
+        tmp = SystemCoreClock / 1000 * WDT_InitStruct->WDT_Tms;
+
+    WWDT->LOAD.LOAD = tmp;
+    WWDT->CON.CLKS = WDT_InitStruct->WDT_Clock;
+    WWDT->CON.IE = WDT_InitStruct->WDT_IE;
+    WWDT->CON.RSTEN = WDT_InitStruct->WDT_Rst;
+    WWDT->CON.WWDTWIN = WDT_InitStruct->WDT_Win;
+
+    return;
+}
+
+/*************************************
+  函数名:WWDT_SetReloadValue
+  描  述:设置WDT重载的初值
+  输入值:初始值,32-bit无符号整数
+  返回值:无
+ **************************************/
+void WWDT_SetReloadValue(uint32_t Value)
+{
+    WWDT->LOAD.LOAD = Value;
+    return;
+}
+
+/*************************************
+  函数名:WWDT_GetValue
+  描  述:获取WDT当前值
+  输入值:无
+  返回值:当前值
+ **************************************/
+uint32_t WWDT_GetValue(void)
+{
+    return (uint32_t)WWDT->VALUE.VALUE;
+}
+
+/*************************************
+  函数名:WWDT_GetFlagStatus
+  描  述:获取WDT中断状态
+  输入值:无
+  返回值:SET/RESET
+ **************************************/
+FlagStatus WWDT_GetFlagStatus(void)
+{
+    FlagStatus bitstatus = RESET;
+
+    if (WWDT->RIS.WWDTIF != RESET)
+        bitstatus = SET;
+
+    return  bitstatus;
+}
+
+/*************************************
+  函数名:WWDT_GetIEStatus
+  描  述:获取WDT中断使能状态
+  输入值:无
+  返回值:SET/RESET
+ **************************************/
+FlagStatus WWDT_GetITStatus(void)
+{
+    FlagStatus bitstatus = RESET;
+
+    if (WWDT->CON.IE != RESET)
+        bitstatus = SET;
+
+    return  bitstatus;
+}
+
+/*************************END OF FILE**********************/
+
+

+ 27 - 0
bsp/essemi/es8p508x/libraries/SConscript

@@ -0,0 +1,27 @@
+import rtconfig
+Import('RTT_ROOT')
+from building import *
+
+# get current directory
+cwd = GetCurrentDir()
+
+# The set of source files associated with this SConscript file.
+src = []
+
+src += Glob('Library/Source/*.c')
+src += ['CMSIS/system_ES8P508x.c']
+
+#add for startup script 
+if rtconfig.CROSS_TOOL == 'gcc':
+    src = src
+elif rtconfig.CROSS_TOOL == 'keil':
+    src = src + ['CMSIS/startup_ES8P508x.s']
+elif rtconfig.CROSS_TOOL == 'iar':
+    src = src
+
+path = [cwd + '/CMSIS',
+        cwd + '/Library/Include',]
+
+group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path)
+
+Return('group')

+ 174 - 0
bsp/essemi/es8p508x/project.uvopt

@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>rt-thread</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>20000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\build\keil\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>0</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>0</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments>-pCM0</SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>0</uSim>
+        <uTrg>1</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>1</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>1</sLrtime>
+        <nTsel>13</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon>BIN\CMSIS_AGDI.dll</pMon>
+      </DebugOpt>
+      <TargetDriverDllRegistry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>JL2CM3</Key>
+          <Name>-U12345678 -O78 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC800 -FN1 -FF0ES8P508x -FS00 -FL020000</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>CMSIS_AGDI</Key>
+          <Name>-X"essemi CMSIS-DAP" -U0001A000000A -O207 -S0 -C0 -P00 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -FO15 -FD20000000 -FC6000 -FN1 -FF0ES8P508x -FS00 -FL020000</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>UL2CM3</Key>
+          <Name>UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC6000 -FN1 -FF0ES8P508x -FS00000000 -FL020000)</Name>
+        </SetRegEntry>
+      </TargetDriverDllRegistry>
+      <Breakpoint/>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>0</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+</ProjectOpt>

+ 790 - 0
bsp/essemi/es8p508x/project.uvproj

@@ -0,0 +1,790 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+  <SchemaVersion>1.1</SchemaVersion>
+  <Header>### uVision Project, (C) Keil Software</Header>
+  <Targets>
+    <Target>
+      <TargetName>rt-thread</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>ES8P508xFLXX</Device>
+          <Vendor>ES</Vendor>
+          <Cpu>IRAM(0x20000000-0x20005FFF)  IROM(0x00000000-0x0001FFFF) CLOCK(20000000) CPUTYPE("Cortex-M0")</Cpu>
+          <FlashUtilSpec />
+          <StartupFile>"STARTUP\HR\startup_ES8P508x.s" ("ES8P508x Startup Code")</StartupFile>
+          <FlashDriverDll>UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC6000 -FN1 -FF0ES8P508x -FS00000000 -FL020000)</FlashDriverDll>
+          <DeviceId>0</DeviceId>
+          <RegisterFile>ES8P508x.h</RegisterFile>
+          <MemoryEnv />
+          <Cmp />
+          <Asm />
+          <Linker />
+          <OHString />
+          <InfinionOptionDll />
+          <SLE66CMisc />
+          <SLE66AMisc />
+          <SLE66LinkerMisc />
+          <SFDFile>SFD\HR\ES8P508x.SFR</SFDFile>
+          <bCustSvd>0</bCustSvd>
+          <UseEnv>0</UseEnv>
+          <BinPath />
+          <IncludePath />
+          <LibPath />
+          <RegisterFilePath>HR\</RegisterFilePath>
+          <DBRegisterFilePath>HR\</DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\build\keil\</OutputDirectory>
+          <OutputName>rt-thread</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\build\keil\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name />
+            <UserProg2Name />
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>fromelf --bin !L --output rtthread.bin</UserProg1Name>
+            <UserProg2Name>fromelf --text -c ".\build\keil\@L.axf" --output ".\build\keil\@L.txt"</UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString />
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument />
+          <IncludeLibraryModules />
+          <ComprImg>1</ComprImg>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments />
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments>-pCM0</SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments />
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments />
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>0</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>1</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>1</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>13</TargetSelection>
+          <SimDlls>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll />
+            <CpuDllArguments />
+            <PeripheralDll />
+            <PeripheralDllArguments />
+            <InitializationFile />
+            <Driver>BIN\CMSIS_AGDI.dll</Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+            <Capability>1</Capability>
+            <DriverSelection>4096</DriverSelection>
+          </Flash1>
+          <bUseTDR>1</bUseTDR>
+          <Flash2>BIN\UL2CM3.DLL</Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4 />
+          <pFcarmOut />
+          <pFcarmGrp />
+          <pFcArmRoot />
+          <FcArmLst>0</FcArmLst>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>0</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName />
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>1</hadIROM>
+            <hadIRAM>1</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>8</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>0</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>3</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>0</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>1</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>0</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>1</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x6000</Size>
+              </IRAM>
+              <IROM>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x20000</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x20000</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x6000</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector />
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>1</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>1</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls>--c99</MiscControls>
+              <Define />
+              <Undefine />
+              <IncludePath>.;..\..\..\include;applications;.;drivers;libraries\CMSIS;libraries\Library\Include;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m0;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\..\..\components\libc\compilers\common</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls />
+              <Define />
+              <Undefine />
+              <IncludePath />
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x20000000</DataAddressRange>
+            <ScatterFile />
+            <IncludeLibs />
+            <IncludeLibsPath />
+            <Misc />
+            <LinkerInputFile />
+            <DisabledWarnings />
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Kernel</GroupName>
+          <Files>
+            <File>
+              <FileName>clock.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\clock.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>components.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\components.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>device.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\device.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>idle.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\idle.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ipc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\ipc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>irq.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\irq.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>kservice.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\kservice.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mem.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\mem.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>mempool.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\mempool.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>object.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\object.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>scheduler.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\scheduler.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>signal.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\signal.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>thread.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\thread.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>timer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\src\timer.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Applications</GroupName>
+          <Files>
+            <File>
+              <FileName>main.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>applications\main.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Drivers</GroupName>
+          <Files>
+            <File>
+              <FileName>board.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers\board.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>drv_gpio.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers\drv_gpio.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>drv_uart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>drivers\drv_uart.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Libraries</GroupName>
+          <Files>
+            <File>
+              <FileName>irqhandler.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\irqhandler.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_adc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_adc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_aes.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_aes.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_crc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_crc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_flashiap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_flashiap.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_gpio.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_gpio.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_iap.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_iap.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_iic.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_iic.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_printf.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_printf.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_rtc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_rtc.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_scs.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_scs.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_scu.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_scu.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_spi.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_spi.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_timer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_timer.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_uart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_uart.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>lib_wdt.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\Library\Source\lib_wdt.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>system_ES8P508x.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>libraries\CMSIS\system_ES8P508x.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>startup_ES8P508x.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>libraries\CMSIS\startup_ES8P508x.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>cpu</GroupName>
+          <Files>
+            <File>
+              <FileName>backtrace.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\libcpu\arm\common\backtrace.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>div0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\libcpu\arm\common\div0.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>showmem.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\libcpu\arm\common\showmem.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>cpuport.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\libcpu\arm\cortex-m0\cpuport.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>context_rvds.S</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\libcpu\arm\cortex-m0\context_rvds.S</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>DeviceDrivers</GroupName>
+          <Files>
+            <File>
+              <FileName>pin.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\components\drivers\misc\pin.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>serial.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\components\drivers\serial\serial.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>completion.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\components\drivers\src\completion.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>dataqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\components\drivers\src\dataqueue.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>pipe.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\components\drivers\src\pipe.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ringblk_buf.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\components\drivers\src\ringblk_buf.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>ringbuffer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\components\drivers\src\ringbuffer.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>waitqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\components\drivers\src\waitqueue.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>workqueue.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\components\drivers\src\workqueue.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>finsh</GroupName>
+          <Files>
+            <File>
+              <FileName>shell.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\components\finsh\shell.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>cmd.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\components\finsh\cmd.c</FilePath>
+            </File>
+          </Files>
+          <Files>
+            <File>
+              <FileName>msh.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\components\finsh\msh.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+</Project>

+ 162 - 0
bsp/essemi/es8p508x/rtconfig.h

@@ -0,0 +1,162 @@
+#ifndef RT_CONFIG_H__
+#define RT_CONFIG_H__
+
+/* Automatically generated file; DO NOT EDIT. */
+/* RT-Thread Configuration */
+
+/* RT-Thread Kernel */
+
+#define RT_NAME_MAX 8
+#define RT_ALIGN_SIZE 4
+#define RT_THREAD_PRIORITY_32
+#define RT_THREAD_PRIORITY_MAX 32
+#define RT_TICK_PER_SECOND 100
+#define RT_USING_OVERFLOW_CHECK
+#define RT_USING_HOOK
+#define RT_USING_IDLE_HOOK
+#define RT_IDLE_HOOK_LIST_SIZE 4
+#define IDLE_THREAD_STACK_SIZE 256
+#define RT_DEBUG
+
+/* Inter-Thread communication */
+
+#define RT_USING_SEMAPHORE
+#define RT_USING_MUTEX
+#define RT_USING_EVENT
+#define RT_USING_MAILBOX
+#define RT_USING_MESSAGEQUEUE
+
+/* Memory Management */
+
+#define RT_USING_MEMPOOL
+#define RT_USING_SMALL_MEM
+#define RT_USING_HEAP
+
+/* Kernel Device Object */
+
+#define RT_USING_DEVICE
+#define RT_USING_CONSOLE
+#define RT_CONSOLEBUF_SIZE 128
+#define RT_CONSOLE_DEVICE_NAME "uart5"
+#define RT_VER_NUM 0x40002
+
+/* RT-Thread Components */
+
+#define RT_USING_COMPONENTS_INIT
+#define RT_USING_USER_MAIN
+#define RT_MAIN_THREAD_STACK_SIZE 2048
+#define RT_MAIN_THREAD_PRIORITY 10
+
+/* C++ features */
+
+
+/* Command shell */
+
+#define RT_USING_FINSH
+#define FINSH_THREAD_NAME "tshell"
+#define FINSH_USING_HISTORY
+#define FINSH_HISTORY_LINES 5
+#define FINSH_USING_SYMTAB
+#define FINSH_USING_DESCRIPTION
+#define FINSH_THREAD_PRIORITY 20
+#define FINSH_THREAD_STACK_SIZE 2048
+#define FINSH_CMD_SIZE 80
+#define FINSH_USING_MSH
+#define FINSH_USING_MSH_DEFAULT
+#define FINSH_USING_MSH_ONLY
+#define FINSH_ARG_MAX 10
+
+/* Device virtual file system */
+
+
+/* Device Drivers */
+
+#define RT_USING_DEVICE_IPC
+#define RT_PIPE_BUFSZ 512
+#define RT_USING_SERIAL
+#define RT_SERIAL_RB_BUFSZ 64
+#define RT_USING_PIN
+
+/* Using USB */
+
+
+/* POSIX layer and C standard library */
+
+
+/* Network */
+
+/* Socket abstraction layer */
+
+
+/* Network interface device */
+
+
+/* light weight TCP/IP stack */
+
+
+/* AT commands */
+
+
+/* VBUS(Virtual Software BUS) */
+
+
+/* Utilities */
+
+
+/* RT-Thread online packages */
+
+/* IoT - internet of things */
+
+
+/* Wi-Fi */
+
+/* Marvell WiFi */
+
+
+/* Wiced WiFi */
+
+
+/* IoT Cloud */
+
+
+/* security packages */
+
+
+/* language packages */
+
+
+/* multimedia packages */
+
+
+/* tools packages */
+
+
+/* system packages */
+
+
+/* peripheral libraries and drivers */
+
+
+/* miscellaneous packages */
+
+
+/* samples: kernel and components samples */
+
+#define SOC_ES8P508x
+
+/* Hardware Drivers Config */
+
+/* On-chip Peripheral Drivers */
+
+#define BSP_USING_GPIO
+
+/* UART Drivers */
+
+#define BSP_USING_UART5
+
+/* Onboard Peripheral Drivers */
+
+/* Offboard Peripheral Drivers */
+
+
+#endif

+ 135 - 0
bsp/essemi/es8p508x/rtconfig.py

@@ -0,0 +1,135 @@
+import os
+import sys
+
+# toolchains options
+CROSS_TOOL = 'keil'
+
+if os.getenv('RTT_CC'):
+    CROSS_TOOL = os.getenv('RTT_CC')
+
+# device options
+ARCH = 'arm'
+CPU = 'cortex-m0'
+
+# cross_tool provides the cross compiler
+# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR
+if  CROSS_TOOL  == 'gcc': # not support gcc yet
+    PLATFORM    = 'gcc'
+    EXEC_PATH   = 'C:/GCC'
+
+elif CROSS_TOOL == 'keil':
+    PLATFORM    = 'armcc'
+    EXEC_PATH   = 'C:/Keil'
+
+elif CROSS_TOOL == 'iar': # not support iar yet
+    PLATFORM    = 'iar'
+    EXEC_PATH   = 'C:/IAR'
+
+if os.getenv('RTT_EXEC_PATH'):
+    EXEC_PATH = os.getenv('RTT_EXEC_PATH')
+
+BUILD = 'debug'
+#BUILD = 'release'
+
+if PLATFORM == 'gcc':
+    # toolchains
+    PREFIX = 'arm-none-eabi-'
+    CC = PREFIX + 'gcc'
+    CXX = PREFIX + 'g++'
+    AS = PREFIX + 'gcc'
+    AR = PREFIX + 'ar'
+    LINK = PREFIX + 'gcc'
+    TARGET_EXT = 'elf'
+    SIZE = PREFIX + 'size'
+    OBJDUMP = PREFIX + 'objdump'
+    OBJCPY = PREFIX + 'objcopy'
+    DEVICE = ' -mcpu=' + CPU + ' -mthumb -ffunction-sections -fdata-sections'
+    CFLAGS = DEVICE
+    AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb'
+    LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,Reset_Handler -T drivers/linker_scripts/link.lds'
+
+    CPATH = ''
+    LPATH = ''
+
+    if BUILD == 'debug':
+        CFLAGS += ' -O0 -gdwarf-2 -g'
+        AFLAGS += ' -gdwarf-2'
+    else:
+        CFLAGS += ' -O2'
+
+    POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + OBJCPY + ' -O ihex $TARGET rtthread.hex\n' + SIZE + ' $TARGET \n'
+elif PLATFORM == 'armcc':
+    # toolchains
+    CC = 'armcc'
+    AS = 'armasm'
+    AR = 'armar'
+    LINK = 'armlink'
+    TARGET_EXT = 'axf'
+
+    DEVICE = ' --device DARMSTM'
+    CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99'
+    AFLAGS = DEVICE + ' --apcs=interwork '
+    LFLAGS = DEVICE + ' --scatter "drivers/linker_scripts/link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map  --strict'
+
+    CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include'
+    LFLAGS += ' --libpath ' + EXEC_PATH + '/ARM/ARMCC/lib'
+
+    CFLAGS += ' -D__MICROLIB '
+    AFLAGS += ' --pd "__MICROLIB SETA 1" '
+    LFLAGS += ' --library_type=microlib '
+    EXEC_PATH += '/ARM/ARMCC/bin'
+
+    if BUILD == 'debug':
+        CFLAGS += ' -g -O0'
+        AFLAGS += ' -g'
+    else:
+        CFLAGS += ' -O2'
+
+    POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET'
+
+elif PLATFORM == 'iar':
+    # toolchains
+    CC = 'iccarm'
+    AS = 'iasmarm'
+    AR = 'iarchive'
+    LINK = 'ilinkarm'
+    TARGET_EXT = 'out'
+
+    DEVICE = '-Dewarm'
+
+    CFLAGS = DEVICE
+    CFLAGS += ' --diag_suppress Pa050'
+    CFLAGS += ' --no_cse' 
+    CFLAGS += ' --no_unroll' 
+    CFLAGS += ' --no_inline' 
+    CFLAGS += ' --no_code_motion' 
+    CFLAGS += ' --no_tbaa' 
+    CFLAGS += ' --no_clustering' 
+    CFLAGS += ' --no_scheduling' 
+    CFLAGS += ' --endian=little' 
+    CFLAGS += ' --cpu=Cortex-M0' 
+    CFLAGS += ' -e' 
+    CFLAGS += ' --fpu=None'
+    CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"'    
+    CFLAGS += ' --silent'
+
+    AFLAGS = DEVICE
+    AFLAGS += ' -s+' 
+    AFLAGS += ' -w+' 
+    AFLAGS += ' -r' 
+    AFLAGS += ' --cpu Cortex-M0' 
+    AFLAGS += ' --fpu None' 
+    AFLAGS += ' -S'
+
+    LFLAGS = ' --config "drivers\linker_scripts\link.icf"'
+    LFLAGS += ' --redirect _Printf=_PrintfTiny' 
+    LFLAGS += ' --redirect _Scanf=_ScanfSmall' 
+    if BUILD == 'debug':
+        CFLAGS += ' --debug'
+        CFLAGS += ' -On'
+    else:
+        CFLAGS += ' -Oh'
+
+    LFLAGS += ' --entry __iar_program_start'
+    EXEC_PATH = EXEC_PATH + '/arm/bin/'
+    POST_ACTION = ''

+ 174 - 0
bsp/essemi/es8p508x/template.uvopt

@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>rt-thread</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>20000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\build\keil\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>0</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>0</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments>-pCM0</SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>0</uSim>
+        <uTrg>1</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>1</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>1</sLrtime>
+        <nTsel>13</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon>BIN\CMSIS_AGDI.dll</pMon>
+      </DebugOpt>
+      <TargetDriverDllRegistry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>JL2CM3</Key>
+          <Name>-U12345678 -O78 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC800 -FN1 -FF0ES8P508x -FS00 -FL020000</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>CMSIS_AGDI</Key>
+          <Name>-X"essemi CMSIS-DAP" -U0001A000000A -O207 -S0 -C0 -P00 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -FO15 -FD20000000 -FC6000 -FN1 -FF0ES8P508x -FS00 -FL020000</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>UL2CM3</Key>
+          <Name>UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC6000 -FN1 -FF0ES8P508x -FS00000000 -FL020000)</Name>
+        </SetRegEntry>
+      </TargetDriverDllRegistry>
+      <Breakpoint/>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>0</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+</ProjectOpt>

+ 400 - 0
bsp/essemi/es8p508x/template.uvproj

@@ -0,0 +1,400 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>rt-thread</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>ES8P508xFLXX</Device>
+          <Vendor>ES</Vendor>
+          <Cpu>IRAM(0x20000000-0x20005FFF)  IROM(0x00000000-0x0001FFFF) CLOCK(20000000) CPUTYPE("Cortex-M0")</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile>"STARTUP\HR\startup_ES8P508x.s" ("ES8P508x Startup Code")</StartupFile>
+          <FlashDriverDll>UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC6000 -FN1 -FF0ES8P508x -FS00000000 -FL020000)</FlashDriverDll>
+          <DeviceId>0</DeviceId>
+          <RegisterFile>ES8P508x.h</RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile>SFD\HR\ES8P508x.SFR</SFDFile>
+          <bCustSvd>0</bCustSvd>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath>HR\</RegisterFilePath>
+          <DBRegisterFilePath>HR\</DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\build\keil\</OutputDirectory>
+          <OutputName>rt-thread</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\build\keil\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>fromelf --bin !L --output rtthread.bin</UserProg1Name>
+            <UserProg2Name>fromelf --text -c ".\build\keil\@L.axf" --output ".\build\keil\@L.txt"</UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+          <ComprImg>1</ComprImg>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments>-pCM0</SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>0</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>1</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>1</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>13</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver>BIN\CMSIS_AGDI.dll</Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+            <Capability>1</Capability>
+            <DriverSelection>4096</DriverSelection>
+          </Flash1>
+          <bUseTDR>1</bUseTDR>
+          <Flash2>BIN\UL2CM3.DLL</Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4></Flash4>
+          <pFcarmOut></pFcarmOut>
+          <pFcarmGrp></pFcarmGrp>
+          <pFcArmRoot></pFcArmRoot>
+          <FcArmLst>0</FcArmLst>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>0</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>1</hadIROM>
+            <hadIRAM>1</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>8</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>0</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>3</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>0</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>1</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>0</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>1</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x6000</Size>
+              </IRAM>
+              <IROM>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x20000</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x20000</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x6000</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>1</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>1</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls>--c99</MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x20000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc>--map --first='startup_M451Series.o(RESET)' --datacompressor=off --info=inline --entry Reset_Handler</Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+    </Target>
+  </Targets>
+
+</Project>