summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTao_eternal <[email protected]>2021-05-09 15:32:09 +0800
committerTao_eternal <[email protected]>2021-05-09 15:32:09 +0800
commit7d0aa5bd348b221f59a37072a9ecb00664a1f313 (patch)
tree68e23692e79ccc34d4bf81dec45c01215d1eb70c
parent14d64a1dffa40fc09aa2afb11ca04bf3ac2ea9b5 (diff)
parent060183184b02575afd44e7ebc8a4eb4be55ca331 (diff)
Merge branch 'RT-Thread:master' into patch-1
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/.config562
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/Kconfig16
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/README.md76
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/SConscript14
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/SConstruct71
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/applications/SConscript16
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/applications/main.c31
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/Kconfig122
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/MCUX_Config.mex746
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/clock_config.c464
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/clock_config.h66
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/pin_mux.c81
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/pin_mux.h182
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/MIMXRT105x_QuadSPI_4KB_SEC.FLMbin0 -> 1509352 bytes
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/SConscript20
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/board.c138
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/board.h42
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/linker_scripts/link.icf95
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/linker_scripts/link.lds276
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/linker_scripts/link.sct112
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/board/ports/sdram_port.h49
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/figures/Arch_Mix.jpgbin0 -> 290625 bytes
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/project.uvoptx189
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/project.uvprojx755
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/rtconfig.h177
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/rtconfig.py162
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/template.uvoptx189
-rw-r--r--bsp/imxrt/imxrt1052-seeed-ArchMix/template.uvprojx391
-rw-r--r--bsp/imxrt/libraries/MIMXRT1050/SConscript4
-rw-r--r--bsp/swm320/libraries/CMSIS/DeviceSupport/SWM320.h15
-rw-r--r--bsp/swm320/libraries/CMSIS/DeviceSupport/startup/arm/startup_SWM320.s42
-rw-r--r--bsp/swm320/libraries/CMSIS/DeviceSupport/startup/gcc/startup_SWM320.s2
-rw-r--r--bsp/swm320/libraries/CMSIS/DeviceSupport/startup/iar/startup_SWM320.s2
-rw-r--r--bsp/swm320/libraries/CMSIS/DeviceSupport/system_SWM320.c51
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.c761
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.h122
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.c927
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.h210
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.c59
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.h39
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.c164
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.h23
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.c172
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.h26
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.c106
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.h6
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.c575
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.h34
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.c332
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.h44
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.c197
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.h126
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.c257
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.h38
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.c397
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.h740
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.c1173
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.h91
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.c556
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.h116
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.c1062
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.h202
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.c153
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.h123
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.c672
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.h131
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.c67
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.h42
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.c693
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.h35
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.c764
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.h132
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.c149
-rw-r--r--bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.h21
-rw-r--r--src/kservice.c2
-rw-r--r--tools/file_check.py7
76 files changed, 10913 insertions, 5791 deletions
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/.config b/bsp/imxrt/imxrt1052-seeed-ArchMix/.config
new file mode 100644
index 0000000000..585af44037
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/.config
@@ -0,0 +1,562 @@
+#
+# 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=1000
+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
+
+#
+# kservice optimization
+#
+# CONFIG_RT_KSERVICE_USING_STDLIB is not set
+# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set
+CONFIG_RT_DEBUG=y
+CONFIG_RT_DEBUG_COLOR=y
+# 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=y
+# CONFIG_RT_USING_NOHEAP is not set
+# CONFIG_RT_USING_SMALL_MEM is not set
+# CONFIG_RT_USING_SLAB is not set
+CONFIG_RT_USING_MEMHEAP_AS_HEAP=y
+# CONFIG_RT_USING_USERHEAP is not set
+# CONFIG_RT_USING_MEMTRACE is not set
+CONFIG_RT_USING_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="uart1"
+CONFIG_RT_VER_NUM=0x40003
+# 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=4096
+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=y
+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_PHY is not set
+CONFIG_RT_USING_PIN=y
+# CONFIG_RT_USING_ADC is not set
+# CONFIG_RT_USING_DAC is not set
+# CONFIG_RT_USING_PWM is not set
+# CONFIG_RT_USING_MTD_NOR is not set
+# CONFIG_RT_USING_MTD_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
+# CONFIG__RT_USB_DEVICE_NONE is not set
+# CONFIG__RT_USB_DEVICE_CDC is not set
+# CONFIG__RT_USB_DEVICE_MSTORAGE is not set
+# CONFIG__RT_USB_DEVICE_HID is not set
+# CONFIG__RT_USB_DEVICE_WINUSB is not set
+# CONFIG__RT_USB_DEVICE_AUDIO 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=y
+CONFIG_RT_LIBC_FIXED_TIMEZONE=8
+
+#
+# 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_LORAWAN_DRIVER is not set
+# CONFIG_PKG_USING_PAHOMQTT is not set
+# CONFIG_PKG_USING_UMQTT is not set
+# CONFIG_PKG_USING_WEBCLIENT is not set
+# CONFIG_PKG_USING_WEBNET is not set
+# CONFIG_PKG_USING_MONGOOSE is not set
+# CONFIG_PKG_USING_MYMQTT is not set
+# CONFIG_PKG_USING_KAWAII_MQTT is not set
+# CONFIG_PKG_USING_BC28_MQTT is not set
+# CONFIG_PKG_USING_WEBTERMINAL is not set
+# CONFIG_PKG_USING_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_CMUX 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_IOT_EXPLORER is not set
+# CONFIG_PKG_USING_JIOT-C-SDK is not set
+# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set
+# CONFIG_PKG_USING_JOYLINK is not set
+# CONFIG_PKG_USING_NIMBLE is not set
+# CONFIG_PKG_USING_OTA_DOWNLOADER is not set
+# CONFIG_PKG_USING_IPMSG is not set
+# CONFIG_PKG_USING_LSSDP is not set
+# CONFIG_PKG_USING_AIRKISS_OPEN is not set
+# CONFIG_PKG_USING_LIBRWS is not set
+# CONFIG_PKG_USING_TCPSERVER is not set
+# CONFIG_PKG_USING_PROTOBUF_C is not set
+# CONFIG_PKG_USING_DLT645 is not set
+# CONFIG_PKG_USING_QXWZ is not set
+# CONFIG_PKG_USING_SMTP_CLIENT is not set
+# CONFIG_PKG_USING_ABUP_FOTA is not set
+# CONFIG_PKG_USING_LIBCURL2RTT is not set
+# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set
+# CONFIG_PKG_USING_AGILE_TELNET is not set
+# CONFIG_PKG_USING_NMEALIB is not set
+# CONFIG_PKG_USING_AGILE_JSMN is not set
+# CONFIG_PKG_USING_PDULIB is not set
+# CONFIG_PKG_USING_BTSTACK is not set
+# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set
+# CONFIG_PKG_USING_WAYZ_IOTKIT is not set
+# CONFIG_PKG_USING_MAVLINK is not set
+# CONFIG_PKG_USING_RAPIDJSON is not set
+# CONFIG_PKG_USING_BSAL is not set
+# CONFIG_PKG_USING_AGILE_MODBUS is not set
+# CONFIG_PKG_USING_AGILE_FTP is not set
+# CONFIG_PKG_USING_EMBEDDEDPROTO is not set
+
+#
+# security packages
+#
+# CONFIG_PKG_USING_MBEDTLS is not set
+# CONFIG_PKG_USING_libsodium is not set
+# CONFIG_PKG_USING_TINYCRYPT is not set
+# CONFIG_PKG_USING_TFM is not set
+# CONFIG_PKG_USING_YD_CRYPTO is not set
+
+#
+# language packages
+#
+# 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
+# CONFIG_PKG_USING_PDFGEN is not set
+# CONFIG_PKG_USING_HELIX is not set
+# CONFIG_PKG_USING_AZUREGUIX is not set
+# CONFIG_PKG_USING_TOUCHGFX2RTT is not set
+# CONFIG_PKG_USING_NUEMWIN is not set
+
+#
+# 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_ULOG_FILE is not set
+# CONFIG_PKG_USING_LOGMGR is not set
+# CONFIG_PKG_USING_ADBD is not set
+# CONFIG_PKG_USING_COREMARK is not set
+# CONFIG_PKG_USING_DHRYSTONE is not set
+# CONFIG_PKG_USING_MEMORYPERF is not set
+# CONFIG_PKG_USING_NR_MICRO_SHELL is not set
+# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set
+# CONFIG_PKG_USING_LUNAR_CALENDAR is not set
+# CONFIG_PKG_USING_BS8116A is not set
+# CONFIG_PKG_USING_GPS_RMC is not set
+# CONFIG_PKG_USING_URLENCODE is not set
+# CONFIG_PKG_USING_UMCN is not set
+# CONFIG_PKG_USING_LWRB2RTT is not set
+# CONFIG_PKG_USING_CPU_USAGE is not set
+# CONFIG_PKG_USING_GBK2UTF8 is not set
+# CONFIG_PKG_USING_VCONSOLE is not set
+# CONFIG_PKG_USING_KDB is not set
+# CONFIG_PKG_USING_WAMR is not set
+# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set
+# CONFIG_PKG_USING_LWLOG is not set
+# CONFIG_PKG_USING_ANV_TRACE is not set
+# CONFIG_PKG_USING_ANV_MEMLEAK is not set
+# CONFIG_PKG_USING_ANV_TESTSUIT is not set
+# CONFIG_PKG_USING_ANV_BENCH is not set
+# CONFIG_PKG_USING_DEVMEM is not set
+# CONFIG_PKG_USING_REGEX is not set
+# CONFIG_PKG_USING_MEM_SANDBOX is not set
+# CONFIG_PKG_USING_SOLAR_TERMS is not set
+# CONFIG_PKG_USING_GAN_ZHI is not set
+
+#
+# system packages
+#
+# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_CAIRO is not set
+# CONFIG_PKG_USING_PIXMAN is not set
+# CONFIG_PKG_USING_PARTITION is not set
+# CONFIG_PKG_USING_FAL is not set
+# CONFIG_PKG_USING_FLASHDB is not set
+# CONFIG_PKG_USING_SQLITE is not set
+# CONFIG_PKG_USING_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_DFS_JFFS2 is not set
+# CONFIG_PKG_USING_DFS_UFFS is not set
+# CONFIG_PKG_USING_LWEXT4 is not set
+# CONFIG_PKG_USING_THREAD_POOL is not set
+# CONFIG_PKG_USING_ROBOTS is not set
+# CONFIG_PKG_USING_EV is not set
+# CONFIG_PKG_USING_SYSWATCH is not set
+# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set
+# CONFIG_PKG_USING_PLCCORE is not set
+# CONFIG_PKG_USING_RAMDISK is not set
+# CONFIG_PKG_USING_MININI is not set
+# CONFIG_PKG_USING_QBOOT is not set
+
+#
+# Micrium: Micrium software products porting for RT-Thread
+#
+# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set
+# CONFIG_PKG_USING_UCOSII_WRAPPER is not set
+# CONFIG_PKG_USING_UC_CRC is not set
+# CONFIG_PKG_USING_UC_CLK is not set
+# CONFIG_PKG_USING_UC_COMMON is not set
+# CONFIG_PKG_USING_UC_MODBUS is not set
+# CONFIG_PKG_USING_PPOOL is not set
+# CONFIG_PKG_USING_OPENAMP is not set
+# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set
+# CONFIG_PKG_USING_RT_MEMCPY_CM is not set
+# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set
+# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set
+# CONFIG_PKG_USING_QFPLIB_M3 is not set
+# CONFIG_PKG_USING_LPM is not set
+# CONFIG_PKG_USING_TLSF is not set
+# CONFIG_PKG_USING_EVENT_RECORDER 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_AS7341 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_LITTLED is not set
+# CONFIG_PKG_USING_LKDGUI is not set
+# CONFIG_PKG_USING_NRF5X_SDK is not set
+# CONFIG_PKG_USING_NRFX is not set
+# CONFIG_PKG_USING_WM_LIBRARIES is not set
+# CONFIG_PKG_USING_KENDRYTE_SDK is not set
+# CONFIG_PKG_USING_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_MAX17048 is not set
+# CONFIG_PKG_USING_RPLIDAR is not set
+# CONFIG_PKG_USING_AS608 is not set
+# CONFIG_PKG_USING_RC522 is not set
+# CONFIG_PKG_USING_WS2812B is not set
+# CONFIG_PKG_USING_EMBARC_BSP is not set
+# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set
+# CONFIG_PKG_USING_MULTI_RTIMER is not set
+# CONFIG_PKG_USING_MAX7219 is not set
+# CONFIG_PKG_USING_BEEP is not set
+# CONFIG_PKG_USING_EASYBLINK is not set
+# CONFIG_PKG_USING_PMS_SERIES is not set
+# CONFIG_PKG_USING_CAN_YMODEM is not set
+# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set
+# CONFIG_PKG_USING_QLED is not set
+# CONFIG_PKG_USING_PAJ7620 is not set
+# CONFIG_PKG_USING_AGILE_CONSOLE is not set
+# CONFIG_PKG_USING_LD3320 is not set
+# CONFIG_PKG_USING_WK2124 is not set
+# CONFIG_PKG_USING_LY68L6400 is not set
+# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_SSD1306 is not set
+# CONFIG_PKG_USING_QKEY is not set
+# CONFIG_PKG_USING_RS485 is not set
+# CONFIG_PKG_USING_NES is not set
+# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set
+# CONFIG_PKG_USING_VDEVICE is not set
+# CONFIG_PKG_USING_SGM706 is not set
+# CONFIG_PKG_USING_STM32WB55_SDK is not set
+# CONFIG_PKG_USING_RDA58XX is not set
+# CONFIG_PKG_USING_LIBNFC is not set
+# CONFIG_PKG_USING_MFOC is not set
+# CONFIG_PKG_USING_TMC51XX is not set
+# CONFIG_PKG_USING_TCA9534 is not set
+
+#
+# AI packages
+#
+# CONFIG_PKG_USING_LIBANN is not set
+# CONFIG_PKG_USING_NNOM is not set
+# CONFIG_PKG_USING_ONNX_BACKEND is not set
+# CONFIG_PKG_USING_ONNX_PARSER is not set
+# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set
+# CONFIG_PKG_USING_ELAPACK is not set
+# CONFIG_PKG_USING_ULAPACK is not set
+# CONFIG_PKG_USING_QUEST is not set
+# CONFIG_PKG_USING_NAXOS is not set
+
+#
+# miscellaneous packages
+#
+# 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_LZMA 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_KI is not set
+# CONFIG_PKG_USING_ARMv7M_DWT is not set
+# CONFIG_PKG_USING_VT100 is not set
+# CONFIG_PKG_USING_UKAL is not set
+# CONFIG_PKG_USING_CRCLIB is not set
+
+#
+# entertainment: terminal games and other interesting software packages
+#
+# CONFIG_PKG_USING_THREES is not set
+# CONFIG_PKG_USING_2048 is not set
+# CONFIG_PKG_USING_SNAKE is not set
+# CONFIG_PKG_USING_TETRIS is not set
+# CONFIG_PKG_USING_DONUT is not set
+# CONFIG_PKG_USING_ACLOCK is not set
+# CONFIG_PKG_USING_LWGPS is not set
+# CONFIG_PKG_USING_STATE_MACHINE is not set
+# CONFIG_PKG_USING_MCURSES is not set
+# CONFIG_PKG_USING_COWSAY is not set
+
+#
+# Hardware Drivers Config
+#
+CONFIG_SOC_IMXRT1052CVL5B=y
+
+#
+# Onboard Peripheral Drivers
+#
+# CONFIG_BSP_USING_SDRAM is not set
+
+#
+# On-chip Peripheral Drivers
+#
+CONFIG_BSP_USING_DMA=y
+CONFIG_BSP_USING_GPIO=y
+CONFIG_BSP_USING_LPUART=y
+CONFIG_BSP_USING_LPUART1=y
+# CONFIG_BSP_LPUART1_RX_USING_DMA is not set
+# CONFIG_BSP_LPUART1_TX_USING_DMA is not set
+# CONFIG_BSP_USING_LPUART4 is not set
+# CONFIG_BSP_USING_SPI is not set
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/Kconfig b/bsp/imxrt/imxrt1052-seeed-ArchMix/Kconfig
new file mode 100644
index 0000000000..c9221717cb
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/Kconfig
@@ -0,0 +1,16 @@
+mainmenu "RT-Thread Configuration"
+
+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"
+source "../libraries/Kconfig"
+source "board/Kconfig"
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/README.md b/bsp/imxrt/imxrt1052-seeed-ArchMix/README.md
new file mode 100644
index 0000000000..7d3d1195ac
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/README.md
@@ -0,0 +1,76 @@
+# Seeed i.MX RT1052 Arch Mix 开发板 BSP 说明
+
+## 简介
+
+![Arch_Mix](figures/Arch_Mix.jpg)
+
+Arch Mix 是 [Seeed Studio](https://www.seeedstudio.com/) 推出的一款基于 i.MX RT 1050 系列芯片的开发板,板载一颗 RGB 灯和一个用户按键,外扩 32M SDRAM,板载资源丰富,运行速度快(主频可达 600MHZ),并且支持外接 LCD 屏幕。Seeed Studio 是一家致力于促进开源硬件发展的服务型企业。目前,已经与众多设计者建立了紧密的合作关系,并且合作推出了涉及新媒体艺术、嵌入式平台、物联网、智能家居、便携式仪器等领域的一系列明星产品和方案。
+
+### 板载资源:
+
+| 硬件 | 描述 |
+| ---- | ---- |
+| 芯片 | i.MX RT 1052 |
+| 架构 | ARM Cortex-M7 |
+| 最高频率 | 600MHz |
+| 内部存储器 | 512KB SRAM |
+| 外部存储器 | 32M SDRAM、8M QSPI FLASH(存储代码) |
+
+## 编译说明
+
+Arch Mix 板级包支持MDK5﹑IAR开发环境和GCC编译器,以下是具体版本信息:
+
+| IDE/编译器 | 已测试版本 |
+| ---------- | --------- |
+| MDK5 | MDK525 |
+| IAR | IAR 8.11.3.13984 |
+| GCC | GCC 5.4.1 20160919 (release) |
+
+## BSP使用
+
+### 配置工程
+
+- 在 bsp 下打开 env 工具
+- 输入`menuconfig`命令配置工程,配置好之后保存退出。
+- 输入`scons --target=mdk5 -s`或`scons --target=iar`来生成需要的工程
+
+### 下载和仿真
+
+开发板支持 SWD 调试接口,连接外置仿真器后,就可以进行下载和仿真。
+
+> 注意:下载算法默认使用 board目录下的 MIMXRT105x_QuadSPI_4KB_SEC.FLM 文件,将此文件拷贝到 Keil5安装目录下 `ARM\Flash` 目录下即可。
+>
+> 下载失败时:先按下 `Reset 按键`,再按下 `Boot Mode 按键`,先松开 `Reset 按键`,再松开 `Boot Mode 按键`,即可进入`下载模式`。
+
+### 运行结果
+
+下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,绿色 DS1 会周期性闪烁。
+
+使用 TTL 转串口工具连接开发板上 RXD/TXD ,在终端工具里打开相应的串口(115200-N-8-1)。如果编译 & 烧写无误,当复位设备后,可以看到RT-Thread的输出信息:
+
+```
+ \ | /
+- RT - Thread Operating System
+ / | \ 4.0.3 build May 7 2021
+ 2006 - 2021 Copyright by rt-thread team
+msh >
+```
+
+## 驱动支持情况及计划
+
+| 驱动 | 支持情况 | 备注 |
+| ------ | ---- | ------ |
+| UART | 支持 | UART 1 |
+| GPIO | 支持 | GPIO1~GPIO5 |
+| IIC | 暂不支持 | |
+| SPI | 暂不支持 | |
+| LCD | 暂不支持 | |
+| RTC | 暂不支持 | |
+| SDIO | 暂不支持 | |
+| SDRAM | 支持 | 32M SDRAM,后面 2M 作为 Non Cache 区域 |
+
+## 联系人信息
+
+维护人:
+
+- [guozhanxin](https://github.com/Guozhanxin)
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/SConscript b/bsp/imxrt/imxrt1052-seeed-ArchMix/SConscript
new file mode 100644
index 0000000000..c7ef7659ec
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/SConscript
@@ -0,0 +1,14 @@
+# for module compiling
+import os
+from building import *
+
+cwd = GetCurrentDir()
+objs = []
+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')
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/SConstruct b/bsp/imxrt/imxrt1052-seeed-ArchMix/SConstruct
new file mode 100644
index 0000000000..9e5cd55bc0
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/SConstruct
@@ -0,0 +1,71 @@
+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
+DefaultEnvironment(tools=[])
+if rtconfig.PLATFORM == 'armcc':
+ env = Environment(tools = ['mingw'],
+ AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
+ CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
+ CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
+ AR = rtconfig.AR, ARFLAGS = '-rc',
+ LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS,
+ # overwrite cflags, because cflags has '--C99'
+ CXXCOM = '$CXX -o $TARGET --cpp -c $CXXFLAGS $_CCCOMCOM $SOURCES')
+else:
+ env = Environment(tools = ['mingw'],
+ AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
+ CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
+ CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
+ AR = rtconfig.AR, ARFLAGS = '-rc',
+ LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS,
+ CXXCOM = '$CXX -o $TARGET -c $CXXFLAGS $_CCCOMCOM $SOURCES')
+
+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 rtthread.map')
+
+Export('RTT_ROOT')
+Export('rtconfig')
+
+SDK_ROOT = os.path.abspath('./')
+
+if os.path.exists(SDK_ROOT + '/libraries'):
+ libraries_path_prefix = SDK_ROOT + '/libraries'
+else:
+ libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries'
+
+SDK_LIB = libraries_path_prefix
+Export('SDK_LIB')
+
+# prepare building environment
+objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
+
+imxrt_library = 'MIMXRT1050'
+rtconfig.BSP_LIBRARY_TYPE = imxrt_library
+
+# include libraries
+objs.extend(SConscript(os.path.join(libraries_path_prefix, imxrt_library, 'SConscript')))
+
+# include drivers
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript')))
+
+# make a building
+DoBuilding(TARGET, objs)
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/applications/SConscript b/bsp/imxrt/imxrt1052-seeed-ArchMix/applications/SConscript
new file mode 100644
index 0000000000..78952a658e
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/applications/SConscript
@@ -0,0 +1,16 @@
+import rtconfig
+from building import *
+
+cwd = GetCurrentDir()
+src = Glob('*.c')
+CPPPATH = [cwd]
+
+# add for startup script
+if rtconfig.CROSS_TOOL == 'gcc':
+ CPPDEFINES = ['__START=entry']
+else:
+ CPPDEFINES = []
+
+group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES=CPPDEFINES)
+
+Return('group')
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/applications/main.c b/bsp/imxrt/imxrt1052-seeed-ArchMix/applications/main.c
new file mode 100644
index 0000000000..86c7dfb31a
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/applications/main.c
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2017-10-10 Tanek first version
+ */
+
+#include <rtthread.h>
+#include <rtdevice.h>
+#include "drv_gpio.h"
+
+/* USER_LED_G,GPIO_IO01,GPIO_AD_B0_10 */
+#define LED0_PIN GET_PIN(1,10)
+
+int main(void)
+{
+ /* set LED0 pin mode to output */
+ rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
+
+ while (1)
+ {
+ rt_pin_write(LED0_PIN, PIN_HIGH);
+ rt_thread_mdelay(500);
+ rt_pin_write(LED0_PIN, PIN_LOW);
+ rt_thread_mdelay(500);
+ }
+}
+
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/Kconfig b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/Kconfig
new file mode 100644
index 0000000000..2644641ba5
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/Kconfig
@@ -0,0 +1,122 @@
+menu "Hardware Drivers Config"
+
+config SOC_IMXRT1052CVL5B
+ bool
+ select SOC_MIMXRT1050_SERIES
+ select RT_USING_COMPONENTS_INIT
+ select RT_USING_USER_MAIN
+ default y
+
+menu "Onboard Peripheral Drivers"
+
+ config BSP_USING_SDRAM
+ bool "Enable SDRAM"
+ default n
+
+endmenu
+
+menu "On-chip Peripheral Drivers"
+
+ config BSP_USING_DMA
+ bool "Enable DMA"
+ default n
+
+ config BSP_USING_GPIO
+ bool "Enable GPIO"
+ select RT_USING_PIN
+ default y
+
+ menuconfig BSP_USING_LPUART
+ bool "Enable UART"
+ select RT_USING_SERIAL
+ default y
+
+ if BSP_USING_LPUART
+ config BSP_USING_LPUART1
+ bool "Enable LPUART1"
+ default y
+
+ config BSP_LPUART1_RX_USING_DMA
+ bool "Enable LPUART1 RX DMA"
+ depends on BSP_USING_LPUART1
+ select BSP_USING_DMA
+ select RT_SERIAL_USING_DMA
+ default n
+
+ config BSP_LPUART1_RX_DMA_CHANNEL
+ depends on BSP_LPUART1_RX_USING_DMA
+ int "Set LPUART1 RX DMA channel (0-32)"
+ default 0
+
+ config BSP_LPUART1_TX_USING_DMA
+ bool "Enable LPUART1 TX DMA"
+ depends on BSP_USING_LPUART1
+ select BSP_USING_DMA
+ select RT_SERIAL_USING_DMA
+ default n
+
+ config BSP_LPUART1_TX_DMA_CHANNEL
+ depends on BSP_LPUART1_TX_USING_DMA
+ int "Set LPUART1 TX DMA channel (0-32)"
+ default 1
+
+ config BSP_USING_LPUART4
+ bool "Enable LPUART4"
+ default n
+
+ config BSP_LPUART4_RX_USING_DMA
+ bool "Enable LPUART4 RX DMA"
+ depends on BSP_USING_LPUART4
+ select BSP_USING_DMA
+ select RT_SERIAL_USING_DMA
+ default n
+
+ config BSP_LPUART4_RX_DMA_CHANNEL
+ depends on BSP_LPUART4_RX_USING_DMA
+ int "Set LPUART4 RX DMA channel (0-32)"
+ default 2
+
+ config BSP_LPUART4_TX_USING_DMA
+ bool "Enable LPUART4 TX DMA"
+ depends on BSP_USING_LPUART4
+ select BSP_USING_DMA
+ select RT_SERIAL_USING_DMA
+ default n
+
+ config BSP_LPUART4_TX_DMA_CHANNEL
+ depends on BSP_LPUART4_TX_USING_DMA
+ int "Set LPUART4 TX DMA channel (0-32)"
+ default 3
+ endif
+
+ menuconfig BSP_USING_SPI
+ bool "Enable SPI"
+ select RT_USING_SPI
+ select RT_USING_PIN
+ default n
+
+ if BSP_USING_SPI
+ config BSP_USING_SPI3
+ bool "Enable SPI3"
+ default n
+
+ config BSP_SPI3_USING_DMA
+ bool "Enable SPI3 DMA xfer"
+ depends on BSP_USING_SPI3
+ select BSP_USING_DMA
+ default n
+
+ config BSP_SPI3_RX_DMA_CHANNEL
+ depends on BSP_SPI3_USING_DMA
+ int "Set SPI3 RX DMA channel (0-32)"
+ default 4
+
+ config BSP_SPI3_TX_DMA_CHANNEL
+ depends on BSP_SPI3_USING_DMA
+ int "Set SPI3 TX DMA channel (0-32)"
+ default 5
+ endif
+
+endmenu
+
+endmenu
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/MCUX_Config.mex b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/MCUX_Config.mex
new file mode 100644
index 0000000000..bd254aa553
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/MCUX_Config.mex
@@ -0,0 +1,746 @@
+<?xml version="1.0" encoding= "UTF-8" ?>
+<configuration name="IMXRT1050-EVKB" version="1.5" xsi:schemaLocation="http://mcuxpresso.nxp.com/XSD/mex_configuration_1.5 http://mcuxpresso.nxp.com/XSD/mex_configuration_1.5.xsd" uuid="789fd1d3-821c-40a6-b04d-44ccc5a5d158" xmlns="http://mcuxpresso.nxp.com/XSD/mex_configuration_1.5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <common>
+ <processor>MIMXRT1052xxxxB</processor>
+ <package>MIMXRT1052DVL6B</package>
+ <board>IMXRT1050-EVKB</board>
+ <board_revision>A</board_revision>
+ <mcu_data>ksdk2_0</mcu_data>
+ <cores selected="core0">
+ <core name="Cortex-M7F" id="core0" description="M7 core"/>
+ </cores>
+ <description></description>
+ </common>
+ <preferences>
+ <validate_boot_init_only>false</validate_boot_init_only>
+ <generate_extended_information>false</generate_extended_information>
+ </preferences>
+ <tools>
+ <pins name="Pins" version="5.0" enabled="true" update_project_code="true">
+ <pins_profile>
+ <processor_version>5.0.2</processor_version>
+ <power_domains/>
+ </pins_profile>
+ <functions_list>
+ <function name="BOARD_InitPins">
+ <description>Configures pin routing and optionally pin electrical features.</description>
+ <options>
+ <callFromInitBoot>false</callFromInitBoot>
+ <coreID>core0</coreID>
+ <enableClock>true</enableClock>
+ </options>
+ <dependencies>
+ <dependency resourceType="Peripheral" resourceId="LPUART1" description="Peripheral LPUART1 is not initialized" problem_level="1" source="Pins:BOARD_InitPins">
+ <feature name="initialized" evaluation="equal">
+ <data>true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="Peripheral" resourceId="LPSPI3" description="Peripheral LPSPI3 is not initialized" problem_level="1" source="Pins:BOARD_InitPins">
+ <feature name="initialized" evaluation="equal">
+ <data>true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="Peripheral" resourceId="GPIO3" description="Peripheral GPIO3 is not initialized" problem_level="1" source="Pins:BOARD_InitPins">
+ <feature name="initialized" evaluation="equal">
+ <data>true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="Peripheral" resourceId="GPIO5" description="Peripheral GPIO5 is not initialized" problem_level="1" source="Pins:BOARD_InitPins">
+ <feature name="initialized" evaluation="equal">
+ <data>true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="Peripheral" resourceId="GPIO1" description="Peripheral GPIO1 is not initialized" problem_level="1" source="Pins:BOARD_InitPins">
+ <feature name="initialized" evaluation="equal">
+ <data>true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="Peripheral" resourceId="LCDIF" description="Peripheral LCDIF is not initialized" problem_level="1" source="Pins:BOARD_InitPins">
+ <feature name="initialized" evaluation="equal">
+ <data>true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.common" description="Pins initialization requires the COMMON Driver in the project." problem_level="2" source="Pins:BOARD_InitPins">
+ <feature name="enabled" evaluation="equal" configuration="core0">
+ <data>true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.iomuxc" description="Pins initialization requires the IOMUXC Driver in the project." problem_level="2" source="Pins:BOARD_InitPins">
+ <feature name="enabled" evaluation="equal" configuration="core0">
+ <data>true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.igpio" description="Pins initialization requires the IGPIO Driver in the project." problem_level="2" source="Pins:BOARD_InitPins">
+ <feature name="enabled" evaluation="equal" configuration="core0">
+ <data>true</data>
+ </feature>
+ </dependency>
+ </dependencies>
+ <pins>
+ <pin peripheral="LPUART1" signal="RX" pin_num="L14" pin_signal="GPIO_AD_B0_13"/>
+ <pin peripheral="LPUART1" signal="TX" pin_num="K14" pin_signal="GPIO_AD_B0_12"/>
+ <pin peripheral="LPSPI3" signal="SCK" pin_num="M14" pin_signal="GPIO_AD_B0_00"/>
+ <pin peripheral="LPSPI3" signal="SDI" pin_num="M11" pin_signal="GPIO_AD_B0_02"/>
+ <pin peripheral="LPSPI3" signal="SDO" pin_num="H10" pin_signal="GPIO_AD_B0_01"/>
+ <pin peripheral="LPSPI3" signal="PCS0" pin_num="G11" pin_signal="GPIO_AD_B0_03"/>
+ <pin peripheral="GPIO3" signal="gpio_io, 03" pin_num="M4" pin_signal="GPIO_SD_B1_03">
+ <pin_features>
+ <pin_feature name="direction" value="INPUT"/>
+ </pin_features>
+ </pin>
+ <pin peripheral="GPIO5" signal="gpio_io, 01" pin_num="K7" pin_signal="PMIC_ON_REQ">
+ <pin_features>
+ <pin_feature name="direction" value="INPUT"/>
+ </pin_features>
+ </pin>
+ <pin peripheral="GPIO1" signal="gpio_io, 05" pin_num="G14" pin_signal="GPIO_AD_B0_05">
+ <pin_features>
+ <pin_feature name="direction" value="INPUT"/>
+ </pin_features>
+ </pin>
+ <pin peripheral="GPIO3" signal="gpio_io, 26" pin_num="A7" pin_signal="GPIO_EMC_40">
+ <pin_features>
+ <pin_feature name="direction" value="INPUT"/>
+ </pin_features>
+ </pin>
+ <pin peripheral="LCDIF" signal="lcdif_clk" pin_num="D7" pin_signal="GPIO_B0_00"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 00" pin_num="C8" pin_signal="GPIO_B0_04"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 01" pin_num="B8" pin_signal="GPIO_B0_05"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 02" pin_num="A8" pin_signal="GPIO_B0_06"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 04" pin_num="B9" pin_signal="GPIO_B0_08"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 03" pin_num="A9" pin_signal="GPIO_B0_07"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 05" pin_num="C9" pin_signal="GPIO_B0_09"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 06" pin_num="D9" pin_signal="GPIO_B0_10"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 07" pin_num="A10" pin_signal="GPIO_B0_11"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 08" pin_num="C10" pin_signal="GPIO_B0_12"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 09" pin_num="D10" pin_signal="GPIO_B0_13"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 10" pin_num="E10" pin_signal="GPIO_B0_14"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 11" pin_num="E11" pin_signal="GPIO_B0_15"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 12" pin_num="A11" pin_signal="GPIO_B1_00"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 13" pin_num="B11" pin_signal="GPIO_B1_01"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 14" pin_num="C11" pin_signal="GPIO_B1_02"/>
+ <pin peripheral="LCDIF" signal="lcdif_data, 15" pin_num="D11" pin_signal="GPIO_B1_03"/>
+ <pin peripheral="LCDIF" signal="lcdif_enable" pin_num="E7" pin_signal="GPIO_B0_01"/>
+ <pin peripheral="LCDIF" signal="lcdif_hsync" pin_num="E8" pin_signal="GPIO_B0_02"/>
+ <pin peripheral="LCDIF" signal="lcdif_vsync" pin_num="D8" pin_signal="GPIO_B0_03"/>
+ </pins>
+ </function>
+ </functions_list>
+ </pins>
+ <clocks name="Clocks" version="5.0" enabled="true" update_project_code="true">
+ <clocks_profile>
+ <processor_version>5.0.2</processor_version>
+ </clocks_profile>
+ <clock_configurations>
+ <clock_configuration name="BOARD_BootClockRUN">
+ <description></description>
+ <options/>
+ <dependencies>
+ <dependency resourceType="PinSignal" resourceId="XTALOSC24M.rtc_xtali" description="&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) needs to be routed" problem_level="1" source="Clocks:BOARD_BootClockRUN">
+ <feature name="routed" evaluation="">
+ <data>true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PinSignal" resourceId="XTALOSC24M.rtc_xtali" description="&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) needs to have &apos;INPUT&apos; direction" problem_level="1" source="Clocks:BOARD_BootClockRUN">
+ <feature name="direction" evaluation="">
+ <data>INPUT</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PinSignal" resourceId="XTALOSC24M.rtc_xtalo" description="&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) needs to be routed" problem_level="1" source="Clocks:BOARD_BootClockRUN">
+ <feature name="routed" evaluation="">
+ <data>true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PinSignal" resourceId="XTALOSC24M.rtc_xtalo" description="&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) needs to have &apos;OUTPUT&apos; direction" problem_level="1" source="Clocks:BOARD_BootClockRUN">
+ <feature name="direction" evaluation="">
+ <data>OUTPUT</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PinSignal" resourceId="XTALOSC24M.xtali" description="&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) needs to be routed" problem_level="1" source="Clocks:BOARD_BootClockRUN">
+ <feature name="routed" evaluation="">
+ <data>true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PinSignal" resourceId="XTALOSC24M.xtali" description="&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) needs to have &apos;INPUT&apos; direction" problem_level="1" source="Clocks:BOARD_BootClockRUN">
+ <feature name="direction" evaluation="">
+ <data>INPUT</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PinSignal" resourceId="XTALOSC24M.xtalo" description="&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) needs to be routed" problem_level="1" source="Clocks:BOARD_BootClockRUN">
+ <feature name="routed" evaluation="">
+ <data>true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PinSignal" resourceId="XTALOSC24M.xtalo" description="&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) needs to have &apos;OUTPUT&apos; direction" problem_level="1" source="Clocks:BOARD_BootClockRUN">
+ <feature name="direction" evaluation="">
+ <data>OUTPUT</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.common" description="Clocks initialization requires the COMMON Driver in the project." problem_level="2" source="Clocks.BOARD_BootClockRUN">
+ <feature name="enabled" evaluation="equal" configuration="core0">
+ <data>true</data>
+ </feature>
+ </dependency>
+ </dependencies>
+ <clock_sources>
+ <clock_source id="XTALOSC24M.OSC.outFreq" value="24 MHz" locked="false" enabled="true"/>
+ <clock_source id="XTALOSC24M.RTC_OSC.outFreq" value="32.768 kHz" locked="false" enabled="true"/>
+ </clock_sources>
+ <clock_outputs>
+ <clock_output id="AHB_CLK_ROOT.outFreq" value="600 MHz" locked="false" accuracy=""/>
+ <clock_output id="CAN_CLK_ROOT.outFreq" value="40 MHz" locked="false" accuracy=""/>
+ <clock_output id="CKIL_SYNC_CLK_ROOT.outFreq" value="32.768 kHz" locked="false" accuracy=""/>
+ <clock_output id="CLK_1M.outFreq" value="1 MHz" locked="false" accuracy=""/>
+ <clock_output id="CLK_24M.outFreq" value="24 MHz" locked="false" accuracy=""/>
+ <clock_output id="CSI_CLK_ROOT.outFreq" value="12 MHz" locked="false" accuracy=""/>
+ <clock_output id="ENET1_TX_CLK.outFreq" value="2.4 MHz" locked="false" accuracy=""/>
+ <clock_output id="ENET_125M_CLK.outFreq" value="2.4 MHz" locked="false" accuracy=""/>
+ <clock_output id="ENET_25M_REF_CLK.outFreq" value="1.2 MHz" locked="false" accuracy=""/>
+ <clock_output id="FLEXIO1_CLK_ROOT.outFreq" value="30 MHz" locked="false" accuracy=""/>
+ <clock_output id="FLEXIO2_CLK_ROOT.outFreq" value="30 MHz" locked="false" accuracy=""/>
+ <clock_output id="FLEXSPI_CLK_ROOT.outFreq" value="2880/11 MHz" locked="false" accuracy=""/>
+ <clock_output id="GPT1_ipg_clk_highfreq.outFreq" value="75 MHz" locked="false" accuracy=""/>
+ <clock_output id="GPT2_ipg_clk_highfreq.outFreq" value="75 MHz" locked="false" accuracy=""/>
+ <clock_output id="IPG_CLK_ROOT.outFreq" value="150 MHz" locked="false" accuracy=""/>
+ <clock_output id="LCDIF_CLK_ROOT.outFreq" value="67.5/7 MHz" locked="false" accuracy=""/>
+ <clock_output id="LPI2C_CLK_ROOT.outFreq" value="60 MHz" locked="false" accuracy=""/>
+ <clock_output id="LPSPI_CLK_ROOT.outFreq" value="105.6 MHz" locked="false" accuracy=""/>
+ <clock_output id="LVDS1_CLK.outFreq" value="1.2 GHz" locked="false" accuracy=""/>
+ <clock_output id="MQS_MCLK.outFreq" value="1080/17 MHz" locked="false" accuracy=""/>
+ <clock_output id="PERCLK_CLK_ROOT.outFreq" value="75 MHz" locked="false" accuracy=""/>
+ <clock_output id="PLL7_MAIN_CLK.outFreq" value="24 MHz" locked="false" accuracy=""/>
+ <clock_output id="SAI1_CLK_ROOT.outFreq" value="1080/17 MHz" locked="false" accuracy=""/>
+ <clock_output id="SAI1_MCLK1.outFreq" value="1080/17 MHz" locked="false" accuracy=""/>
+ <clock_output id="SAI1_MCLK2.outFreq" value="1080/17 MHz" locked="false" accuracy=""/>
+ <clock_output id="SAI1_MCLK3.outFreq" value="30 MHz" locked="false" accuracy=""/>
+ <clock_output id="SAI2_CLK_ROOT.outFreq" value="1080/17 MHz" locked="false" accuracy=""/>
+ <clock_output id="SAI2_MCLK1.outFreq" value="1080/17 MHz" locked="false" accuracy=""/>
+ <clock_output id="SAI2_MCLK3.outFreq" value="30 MHz" locked="false" accuracy=""/>
+ <clock_output id="SAI3_CLK_ROOT.outFreq" value="1080/17 MHz" locked="false" accuracy=""/>
+ <clock_output id="SAI3_MCLK1.outFreq" value="1080/17 MHz" locked="false" accuracy=""/>
+ <clock_output id="SAI3_MCLK3.outFreq" value="30 MHz" locked="false" accuracy=""/>
+ <clock_output id="SEMC_CLK_ROOT.outFreq" value="75 MHz" locked="false" accuracy=""/>
+ <clock_output id="SPDIF0_CLK_ROOT.outFreq" value="30 MHz" locked="false" accuracy=""/>
+ <clock_output id="TRACE_CLK_ROOT.outFreq" value="352/3 MHz" locked="false" accuracy=""/>
+ <clock_output id="UART_CLK_ROOT.outFreq" value="80 MHz" locked="false" accuracy=""/>
+ <clock_output id="USDHC1_CLK_ROOT.outFreq" value="198 MHz" locked="false" accuracy=""/>
+ <clock_output id="USDHC2_CLK_ROOT.outFreq" value="198 MHz" locked="false" accuracy=""/>
+ </clock_outputs>
+ <clock_settings>
+ <setting id="CCM.AHB_PODF.scale" value="1" locked="true"/>
+ <setting id="CCM.ARM_PODF.scale" value="2" locked="true"/>
+ <setting id="CCM.FLEXSPI_PODF.scale" value="1" locked="true"/>
+ <setting id="CCM.FLEXSPI_SEL.sel" value="CCM_ANALOG.PLL3_PFD0_CLK" locked="false"/>
+ <setting id="CCM.LCDIF_PODF.scale" value="8" locked="true"/>
+ <setting id="CCM.LCDIF_PRED.scale" value="7" locked="true"/>
+ <setting id="CCM.LPSPI_PODF.scale" value="5" locked="true"/>
+ <setting id="CCM.PERCLK_PODF.scale" value="2" locked="true"/>
+ <setting id="CCM.SEMC_PODF.scale" value="8" locked="false"/>
+ <setting id="CCM.TRACE_PODF.scale" value="3" locked="true"/>
+ <setting id="CCM_ANALOG.PLL1_BYPASS.sel" value="CCM_ANALOG.PLL1" locked="false"/>
+ <setting id="CCM_ANALOG.PLL1_PREDIV.scale" value="1" locked="true"/>
+ <setting id="CCM_ANALOG.PLL1_VDIV.scale" value="50" locked="true"/>
+ <setting id="CCM_ANALOG.PLL2.denom" value="1" locked="true"/>
+ <setting id="CCM_ANALOG.PLL2.num" value="0" locked="true"/>
+ <setting id="CCM_ANALOG.PLL2_BYPASS.sel" value="CCM_ANALOG.PLL2_OUT_CLK" locked="false"/>
+ <setting id="CCM_ANALOG.PLL2_PFD0_BYPASS.sel" value="CCM_ANALOG.PLL2_PFD0" locked="false"/>
+ <setting id="CCM_ANALOG.PLL2_PFD1_BYPASS.sel" value="CCM_ANALOG.PLL2_PFD1" locked="false"/>
+ <setting id="CCM_ANALOG.PLL2_PFD2_BYPASS.sel" value="CCM_ANALOG.PLL2_PFD2" locked="false"/>
+ <setting id="CCM_ANALOG.PLL2_PFD3_BYPASS.sel" value="CCM_ANALOG.PLL2_PFD3" locked="false"/>
+ <setting id="CCM_ANALOG.PLL3_BYPASS.sel" value="CCM_ANALOG.PLL3" locked="false"/>
+ <setting id="CCM_ANALOG.PLL3_PFD0_BYPASS.sel" value="CCM_ANALOG.PLL3_PFD0" locked="false"/>
+ <setting id="CCM_ANALOG.PLL3_PFD0_DIV.scale" value="33" locked="true"/>
+ <setting id="CCM_ANALOG.PLL3_PFD0_MUL.scale" value="18" locked="true"/>
+ <setting id="CCM_ANALOG.PLL3_PFD1_BYPASS.sel" value="CCM_ANALOG.PLL3_PFD1" locked="false"/>
+ <setting id="CCM_ANALOG.PLL3_PFD2_BYPASS.sel" value="CCM_ANALOG.PLL3_PFD2" locked="false"/>
+ <setting id="CCM_ANALOG.PLL3_PFD3_BYPASS.sel" value="CCM_ANALOG.PLL3_PFD3" locked="false"/>
+ <setting id="CCM_ANALOG.PLL4.denom" value="50" locked="false"/>
+ <setting id="CCM_ANALOG.PLL4.div" value="47" locked="false"/>
+ <setting id="CCM_ANALOG.PLL5.denom" value="1" locked="false"/>
+ <setting id="CCM_ANALOG.PLL5.div" value="40" locked="false"/>
+ <setting id="CCM_ANALOG.PLL5.num" value="0" locked="false"/>
+ <setting id="CCM_ANALOG_PLL_ENET_POWERDOWN_CFG" value="Yes" locked="false"/>
+ <setting id="CCM_ANALOG_PLL_USB1_POWER_CFG" value="Yes" locked="false"/>
+ </clock_settings>
+ <called_from_default_init>true</called_from_default_init>
+ </clock_configuration>
+ </clock_configurations>
+ </clocks>
+ <periphs name="Peripherals" version="5.0" enabled="true" update_project_code="true">
+ <dependencies>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.lpuart" description="在工具链/IDE工程中未发现LPUART Driver。" problem_level="2" source="Peripherals">
+ <feature name="enabled" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.lpuart" description="工具链/IDE工程中LPUART Driver不被支持的版本。需要:${required_value},实际:${actual_value}。" problem_level="1" source="Peripherals">
+ <feature name="version" evaluation="equivalent">
+ <data type="Version">2.2.4</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.csi" description="在工具链/IDE工程中未发现CSI Driver。" problem_level="2" source="Peripherals">
+ <feature name="enabled" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.csi" description="工具链/IDE工程中CSI Driver不被支持的版本。需要:${required_value},实际:${actual_value}。" problem_level="1" source="Peripherals">
+ <feature name="version" evaluation="equivalent">
+ <data type="Version">2.0.0</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.lpi2c" description="在工具链/IDE工程中未发现LPI2C Driver。" problem_level="2" source="Peripherals">
+ <feature name="enabled" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.lpi2c" description="工具链/IDE工程中LPI2C Driver不被支持的版本。需要:${required_value},实际:${actual_value}。" problem_level="1" source="Peripherals">
+ <feature name="version" evaluation="equivalent">
+ <data type="Version">2.1.5</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.flexcan" description="在工具链/IDE工程中未发现FLEXCAN Driver。" problem_level="2" source="Peripherals">
+ <feature name="enabled" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.flexcan" description="工具链/IDE工程中FLEXCAN Driver不被支持的版本。需要:${required_value},实际:${actual_value}。" problem_level="1" source="Peripherals">
+ <feature name="version" evaluation="equivalent">
+ <data type="Version">2.3.0</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.elcdif" description="在工具链/IDE工程中未发现elcdif。" problem_level="2" source="Peripherals">
+ <feature name="enabled" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="SWComponent" resourceId="platform.drivers.elcdif" description="工具链/IDE工程中elcdif不被支持的版本。需要:${required_value},实际:${actual_value}。" problem_level="1" source="Peripherals">
+ <feature name="version" evaluation="equivalent">
+ <data type="Version">2.0.0</data>
+ </feature>
+ </dependency>
+ </dependencies>
+ <peripherals_profile>
+ <processor_version>5.0.2</processor_version>
+ </peripherals_profile>
+ <functional_groups>
+ <functional_group name="BOARD_InitPeripherals" uuid="a7525270-2da6-4556-8d91-4ab9d0edc0e2" called_from_default_init="true" id_prefix="" core="core0">
+ <description></description>
+ <options/>
+ <dependencies/>
+ <instances/>
+ </functional_group>
+ <functional_group name="BOARD_InitDEBUG_UARTPeripheral" uuid="349fb27f-4b94-48d1-9301-0d8812a93b69" called_from_default_init="false" id_prefix="BOARD_" core="core0">
+ <description></description>
+ <options/>
+ <dependencies>
+ <dependency resourceType="ClockOutput" resourceId="UART_CLK_ROOT" description="UART_CLK_ROOT is inactive." problem_level="2" source="Peripherals:BOARD_InitDEBUG_UARTPeripheral">
+ <feature name="frequency" evaluation="greaterThan">
+ <data type="Frequency" unit="Hz">0</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LPUART1.uart_tx" description="Signal TX of the peripheral LPUART1 is not routed." problem_level="1" source="Peripherals:BOARD_InitDEBUG_UARTPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LPUART1.uart_rx" description="Signal RX of the peripheral LPUART1 is not routed." problem_level="1" source="Peripherals:BOARD_InitDEBUG_UARTPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ </dependencies>
+ <instances>
+ <instance name="DEBUG_UART" type="lpuart" type_id="lpuart_bebe3e12b6ec22bbd14199038f2bf459" mode="polling" peripheral="LPUART1" enabled="true">
+ <config_set name="lpuartConfig_t">
+ <struct name="lpuartConfig">
+ <setting name="clockSource" value="LpuartClock"/>
+ <setting name="lpuartSrcClkFreq" value="BOARD_BootClockRUN"/>
+ <setting name="baudRate_Bps" value="115200"/>
+ <setting name="parityMode" value="kLPUART_ParityDisabled"/>
+ <setting name="dataBitsCount" value="kLPUART_EightDataBits"/>
+ <setting name="isMsb" value="false"/>
+ <setting name="stopBitCount" value="kLPUART_OneStopBit"/>
+ <setting name="txFifoWatermark" value="0"/>
+ <setting name="rxFifoWatermark" value="1"/>
+ <setting name="enableRxRTS" value="false"/>
+ <setting name="enableTxCTS" value="false"/>
+ <setting name="txCtsSource" value="kLPUART_CtsSourcePin"/>
+ <setting name="txCtsConfig" value="kLPUART_CtsSampleAtStart"/>
+ <setting name="rxIdleType" value="kLPUART_IdleTypeStartBit"/>
+ <setting name="rxIdleConfig" value="kLPUART_IdleCharacter1"/>
+ <setting name="enableTx" value="true"/>
+ <setting name="enableRx" value="true"/>
+ </struct>
+ </config_set>
+ </instance>
+ </instances>
+ </functional_group>
+ <functional_group name="BOARD_InitCSIPeripheral" uuid="c2f7f41b-38a0-4dd3-b029-256048cc18c3" called_from_default_init="false" id_prefix="BOARD_" core="core0">
+ <description></description>
+ <options/>
+ <dependencies>
+ <dependency resourceType="ClockOutput" resourceId="IPG_CLK_ROOT" description="IPG_CLK_ROOT is inactive." problem_level="2" source="Peripherals:BOARD_InitCSIPeripheral">
+ <feature name="frequency" evaluation="greaterThan">
+ <data type="Frequency" unit="Hz">0</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="ClockOutput" resourceId="CSI_CLK_ROOT" description="CSI_CLK_ROOT is inactive." problem_level="2" source="Peripherals:BOARD_InitCSIPeripheral">
+ <feature name="frequency" evaluation="greaterThan">
+ <data type="Frequency" unit="Hz">0</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="ClockOutput" resourceId="LPI2C_CLK_ROOT" description="LPI2C_CLK_ROOT is inactive." problem_level="2" source="Peripherals:BOARD_InitCSIPeripheral">
+ <feature name="frequency" evaluation="greaterThan">
+ <data type="Frequency" unit="Hz">0</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LPI2C1.lpi2c_scl" description="Signal serial clock of the peripheral LPI2C1 is not routed." problem_level="1" source="Peripherals:BOARD_InitCSIPeripheral">
+ <feature name="routed" evaluation="">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LPI2C1.lpi2c_sda" description="Signal serial data of the peripheral LPI2C1 is not routed." problem_level="1" source="Peripherals:BOARD_InitCSIPeripheral">
+ <feature name="routed" evaluation="">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ </dependencies>
+ <instances>
+ <instance name="CSI" type="csi" type_id="csi_b2cf1faba8074e676ac4be93ec552c5a" mode="interrupt" peripheral="CSI" enabled="true">
+ <config_set name="fsl_csi" quick_selection="QuickSelection1">
+ <struct name="clockConfig">
+ <setting name="clockSource" value="BusInterfaceClock"/>
+ <setting name="clockSourceFreq" value="BOARD_BootClockRUN"/>
+ <setting name="masterClockSource" value="CsiClock"/>
+ <setting name="masterClockSourceFreq" value="BOARD_BootClockRUN"/>
+ </struct>
+ <struct name="config">
+ <setting name="format" value="RGB565"/>
+ <setting name="i_width" value="320"/>
+ <setting name="i_height" value="240"/>
+ <setting name="dataBus" value="kCSI_DataBus8Bit"/>
+ <setting name="workMode" value="kCSI_GatedClockMode"/>
+ <setting name="useExtVsync" value="true"/>
+ <set name="polarityFlags">
+ <selected/>
+ </set>
+ <struct name="buffers_config">
+ <setting name="bufferName" value="defaultBuffer"/>
+ <setting name="bufCount" value="4"/>
+ <setting name="bufferAlign" value="64"/>
+ </struct>
+ </struct>
+ <struct name="interruptsCfg">
+ <setting name="isInterruptEnabled" value="false"/>
+ <set name="interruptSources">
+ <selected/>
+ </set>
+ <struct name="interrupt">
+ <setting name="IRQn" value="CSI_IRQn"/>
+ <setting name="enable_priority" value="false"/>
+ <setting name="enable_custom_name" value="false"/>
+ </struct>
+ </struct>
+ </config_set>
+ </instance>
+ <instance name="CSI_LPI2C" type="lpi2c" type_id="lpi2c_db68d4f4f06a22e25ab51fe9bd6db4d2" mode="master" peripheral="LPI2C1" enabled="true">
+ <config_set name="main" quick_selection="qs_interrupt">
+ <setting name="clockSource" value="Lpi2cClock"/>
+ <setting name="clockSourceFreq" value="BOARD_BootClockRUN"/>
+ <struct name="interrupt">
+ <setting name="IRQn" value="LPI2C1_IRQn"/>
+ <setting name="enable_priority" value="false"/>
+ <setting name="enable_custom_name" value="false"/>
+ </struct>
+ </config_set>
+ <config_set name="master" quick_selection="qs_master_transfer">
+ <setting name="mode" value="transfer"/>
+ <struct name="config">
+ <setting name="enableMaster" value="true"/>
+ <setting name="enableDoze" value="true"/>
+ <setting name="debugEnable" value="false"/>
+ <setting name="ignoreAck" value="false"/>
+ <setting name="pinConfig" value="kLPI2C_2PinOpenDrain"/>
+ <setting name="baudRate_Hz" value="100000"/>
+ <setting name="busIdleTimeout_ns" value="0"/>
+ <setting name="pinLowTimeout_ns" value="0"/>
+ <setting name="sdaGlitchFilterWidth_ns" value="0"/>
+ <setting name="sclGlitchFilterWidth_ns" value="0"/>
+ <struct name="hostRequest">
+ <setting name="enable" value="false"/>
+ <setting name="source" value="kLPI2C_HostRequestExternalPin"/>
+ <setting name="polarity" value="kLPI2C_HostRequestPinActiveHigh"/>
+ </struct>
+ </struct>
+ <struct name="transfer">
+ <setting name="blocking" value="false"/>
+ <set name="flags">
+ <selected/>
+ </set>
+ <setting name="slaveAddress" value="0"/>
+ <setting name="direction" value="kLPI2C_Write"/>
+ <setting name="subaddress" value="0"/>
+ <setting name="subaddressSize" value="1"/>
+ <setting name="dataSize" value="1"/>
+ <struct name="callback">
+ <setting name="name" value=""/>
+ <setting name="userData" value=""/>
+ </struct>
+ </struct>
+ </config_set>
+ </instance>
+ </instances>
+ </functional_group>
+ <functional_group name="BOARD_InitCANPeripheral" uuid="4dc2cf03-00b0-4336-be06-30cc1e4cf843" called_from_default_init="false" id_prefix="BOARD_" core="core0">
+ <description></description>
+ <options/>
+ <dependencies>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="CAN2.can_rxd" description="Signal RX of the peripheral CAN2 is not routed." problem_level="1" source="Peripherals:BOARD_InitCANPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="CAN2.can_txd" description="Signal TX of the peripheral CAN2 is not routed." problem_level="1" source="Peripherals:BOARD_InitCANPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="ClockOutput" resourceId="CAN_CLK_ROOT" description="CAN_CLK_ROOT is inactive." problem_level="1" source="Peripherals:BOARD_InitCANPeripheral">
+ <feature name="frequency" evaluation="greaterThan">
+ <data type="Frequency" unit="Hz">0</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="ClockOutput" resourceId="CAN_CLK_ROOT" description="CAN_CLK_ROOT is inactive." problem_level="2" source="Peripherals:BOARD_InitCANPeripheral">
+ <feature name="frequency" evaluation="greaterThan">
+ <data type="Frequency" unit="Hz">0</data>
+ </feature>
+ </dependency>
+ </dependencies>
+ <instances>
+ <instance name="CAN" type="flexcan" type_id="flexcan_d4764a197c0db35c88f36862312557e4" mode="interrupts" peripheral="CAN2" enabled="true">
+ <config_set name="interruptsCfg">
+ <setting name="messageBufferIrqs" value="0"/>
+ <setting name="messageBufferIrqs2" value="0"/>
+ <set name="interruptsEnable">
+ <selected/>
+ </set>
+ <setting name="enable_irq" value="false"/>
+ <struct name="interrupt_shared">
+ <setting name="IRQn" value="CAN2_IRQn"/>
+ <setting name="enable_priority" value="false"/>
+ <setting name="enable_custom_name" value="false"/>
+ </struct>
+ </config_set>
+ <config_set name="fsl_flexcan" quick_selection="default">
+ <struct name="can_config">
+ <setting name="clockSource" value="kFLEXCAN_ClkSrcOsc"/>
+ <setting name="clockSourceFreq" value="BOARD_BootClockRUN"/>
+ <setting name="wakeupSrc" value="kFLEXCAN_WakeupSrcUnfiltered"/>
+ <setting name="baudRate" value="1000000"/>
+ <setting name="maxMbNum" value="16"/>
+ <setting name="enableLoopBack" value="false"/>
+ <setting name="enableTimerSync" value="true"/>
+ <setting name="enableSelfWakeup" value="false"/>
+ <setting name="enableIndividMask" value="false"/>
+ <struct name="timingConfig">
+ <setting name="propSeg" value="2"/>
+ <setting name="phaseSeg1" value="4"/>
+ <setting name="phaseSeg2" value="3"/>
+ <setting name="rJumpwidth" value="2"/>
+ <struct name="bitTime"/>
+ </struct>
+ </struct>
+ <setting name="enableRxFIFO" value="false"/>
+ <struct name="rxFIFO">
+ <setting name="idFilterTable" value=""/>
+ <setting name="idFilterNum" value="num0"/>
+ <setting name="idFilterType" value="kFLEXCAN_RxFifoFilterTypeA"/>
+ <setting name="priority" value="kFLEXCAN_RxFifoPrioLow"/>
+ </struct>
+ <array name="channels">
+ <struct name="0">
+ <setting name="mbID" value="0"/>
+ <setting name="mbType" value="mbRx"/>
+ <struct name="rxMb">
+ <setting name="id" value="0"/>
+ <setting name="format" value="kFLEXCAN_FrameFormatStandard"/>
+ <setting name="type" value="kFLEXCAN_FrameTypeData"/>
+ </struct>
+ </struct>
+ <struct name="1">
+ <setting name="mbID" value="1"/>
+ <setting name="mbType" value="mbTx"/>
+ <struct name="rxMb">
+ <setting name="id" value="0"/>
+ <setting name="format" value="kFLEXCAN_FrameFormatStandard"/>
+ <setting name="type" value="kFLEXCAN_FrameTypeData"/>
+ </struct>
+ </struct>
+ </array>
+ </config_set>
+ </instance>
+ </instances>
+ </functional_group>
+ <functional_group name="BOARD_InitLCDPeripheral" uuid="0f5eb822-e506-454e-be21-fe933a29ab72" called_from_default_init="false" id_prefix="BOARD_" core="core0">
+ <description></description>
+ <options/>
+ <dependencies>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_clk" description="Signal CLK of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_enable" description="Signal ENABLE of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_hsync" description="Signal HSYNC of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_vsync" description="Signal VSYNC of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.00" description="Signal DATA of the channel 00 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.01" description="Signal DATA of the channel 01 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.02" description="Signal DATA of the channel 02 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.03" description="Signal DATA of the channel 03 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.04" description="Signal DATA of the channel 04 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.05" description="Signal DATA of the channel 05 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.06" description="Signal DATA of the channel 06 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.07" description="Signal DATA of the channel 07 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.08" description="Signal DATA of the channel 08 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.09" description="Signal DATA of the channel 09 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.10" description="Signal DATA of the channel 10 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.11" description="Signal DATA of the channel 11 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.12" description="Signal DATA of the channel 12 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.13" description="Signal DATA of the channel 13 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.14" description="Signal DATA of the channel 14 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="PeripheralUnifiedSignal" resourceId="LCDIF.lcdif_data.15" description="Signal DATA of the channel 15 of the peripheral LCDIF is not routed." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="routed" evaluation="equal">
+ <data type="Boolean">true</data>
+ </feature>
+ </dependency>
+ <dependency resourceType="ClockOutput" resourceId="LCDIF_CLK_ROOT" description="LCDIF_CLK_ROOT is inactive." problem_level="1" source="Peripherals:BOARD_InitLCDPeripheral">
+ <feature name="frequency" evaluation="greaterThan">
+ <data type="Frequency" unit="Hz">0</data>
+ </feature>
+ </dependency>
+ </dependencies>
+ <instances>
+ <instance name="LCD" type="elcdif" type_id="elcdif_1c39bcb43ed1a24bc8980672c7378576" mode="rgbMode" peripheral="LCDIF" enabled="true">
+ <config_set name="fsl_elcdif">
+ <struct name="config">
+ <setting name="panelWidthInt" value="480"/>
+ <setting name="panelHeightInt" value="272"/>
+ <setting name="hsw" value="41"/>
+ <setting name="hfp" value="4"/>
+ <setting name="hbp" value="8"/>
+ <setting name="vsw" value="10"/>
+ <setting name="vfp" value="4"/>
+ <setting name="vbp" value="2"/>
+ <setting name="frameRate" value="60 Hz"/>
+ <struct name="polarityFlags_st">
+ <setting name="vSyncActive" value="kELCDIF_VsyncActiveLow"/>
+ <setting name="hSyncActive" value="kELCDIF_HsyncActiveLow"/>
+ <setting name="dataEnableActive" value="kELCDIF_DataEnableActiveLow"/>
+ <setting name="driveDataClkEdge" value="kELCDIF_DriveDataOnFallingClkEdge"/>
+ </struct>
+ <setting name="bufferName" value="defaultBuffer"/>
+ <setting name="bufferAlign" value="64"/>
+ <setting name="pixelFormat" value="kELCDIF_PixelFormatRGB565"/>
+ <setting name="dataBus" value="kELCDIF_DataBus16Bit"/>
+ <setting name="enablePxpHandShake" value="false"/>
+ <setting name="start" value="false"/>
+ </struct>
+ <setting name="isInterruptEnabled" value="true"/>
+ <set name="elcdifInterruptSources">
+ <selected>
+ <id>kELCDIF_CurFrameDoneInterruptEnable</id>
+ </selected>
+ </set>
+ <struct name="interrupt">
+ <setting name="IRQn" value="LCDIF_IRQn"/>
+ <setting name="enable_priority" value="false"/>
+ <setting name="enable_custom_name" value="false"/>
+ </struct>
+ </config_set>
+ </instance>
+ </instances>
+ </functional_group>
+ </functional_groups>
+ <components>
+ <component name="system" type_id="system_54b53072540eeeb8f8e9343e71f28176">
+ <config_set_global name="global_system_definitions"/>
+ </component>
+ </components>
+ </periphs>
+ <common name="common" version="1.0" enabled="true" update_project_code="true">
+ <core name="core0" role="primary" project_name="Project"/>
+ </common>
+ </tools>
+</configuration> \ No newline at end of file
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/clock_config.c b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/clock_config.c
new file mode 100644
index 0000000000..87b20a1e25
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/clock_config.c
@@ -0,0 +1,464 @@
+/*
+ * How to setup clock using clock driver functions:
+ *
+ * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.
+ *
+ * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.
+ *
+ * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.
+ *
+ * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.
+ *
+ * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.
+ *
+ */
+
+/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
+!!GlobalInfo
+product: Clocks v5.0
+processor: MIMXRT1052xxxxB
+package_id: MIMXRT1052DVL6B
+mcu_data: ksdk2_0
+processor_version: 5.0.2
+board: IMXRT1050-EVKB
+ * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
+
+#include "clock_config.h"
+#include "fsl_iomuxc.h"
+
+/*******************************************************************************
+ * Definitions
+ ******************************************************************************/
+
+/*******************************************************************************
+ * Variables
+ ******************************************************************************/
+/* System clock frequency. */
+extern uint32_t SystemCoreClock;
+
+/*******************************************************************************
+ ************************ BOARD_InitBootClocks function ************************
+ ******************************************************************************/
+void BOARD_InitBootClocks(void)
+{
+ BOARD_BootClockRUN();
+}
+
+/*******************************************************************************
+ ********************** Configuration BOARD_BootClockRUN ***********************
+ ******************************************************************************/
+/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
+!!Configuration
+name: BOARD_BootClockRUN
+called_from_default_init: true
+outputs:
+- {id: AHB_CLK_ROOT.outFreq, value: 600 MHz}
+- {id: CAN_CLK_ROOT.outFreq, value: 40 MHz}
+- {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}
+- {id: CLK_1M.outFreq, value: 1 MHz}
+- {id: CLK_24M.outFreq, value: 24 MHz}
+- {id: CSI_CLK_ROOT.outFreq, value: 12 MHz}
+- {id: ENET1_TX_CLK.outFreq, value: 2.4 MHz}
+- {id: ENET_125M_CLK.outFreq, value: 2.4 MHz}
+- {id: ENET_25M_REF_CLK.outFreq, value: 1.2 MHz}
+- {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}
+- {id: FLEXIO2_CLK_ROOT.outFreq, value: 30 MHz}
+- {id: FLEXSPI_CLK_ROOT.outFreq, value: 2880/11 MHz}
+- {id: GPT1_ipg_clk_highfreq.outFreq, value: 75 MHz}
+- {id: GPT2_ipg_clk_highfreq.outFreq, value: 75 MHz}
+- {id: IPG_CLK_ROOT.outFreq, value: 150 MHz}
+- {id: LCDIF_CLK_ROOT.outFreq, value: 67.5/7 MHz}
+- {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}
+- {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}
+- {id: LVDS1_CLK.outFreq, value: 1.2 GHz}
+- {id: MQS_MCLK.outFreq, value: 1080/17 MHz}
+- {id: PERCLK_CLK_ROOT.outFreq, value: 75 MHz}
+- {id: PLL7_MAIN_CLK.outFreq, value: 24 MHz}
+- {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}
+- {id: SAI1_MCLK1.outFreq, value: 1080/17 MHz}
+- {id: SAI1_MCLK2.outFreq, value: 1080/17 MHz}
+- {id: SAI1_MCLK3.outFreq, value: 30 MHz}
+- {id: SAI2_CLK_ROOT.outFreq, value: 1080/17 MHz}
+- {id: SAI2_MCLK1.outFreq, value: 1080/17 MHz}
+- {id: SAI2_MCLK3.outFreq, value: 30 MHz}
+- {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}
+- {id: SAI3_MCLK1.outFreq, value: 1080/17 MHz}
+- {id: SAI3_MCLK3.outFreq, value: 30 MHz}
+- {id: SEMC_CLK_ROOT.outFreq, value: 75 MHz}
+- {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}
+- {id: TRACE_CLK_ROOT.outFreq, value: 352/3 MHz}
+- {id: UART_CLK_ROOT.outFreq, value: 80 MHz}
+- {id: USDHC1_CLK_ROOT.outFreq, value: 198 MHz}
+- {id: USDHC2_CLK_ROOT.outFreq, value: 198 MHz}
+settings:
+- {id: CCM.AHB_PODF.scale, value: '1', locked: true}
+- {id: CCM.ARM_PODF.scale, value: '2', locked: true}
+- {id: CCM.FLEXSPI_PODF.scale, value: '1', locked: true}
+- {id: CCM.FLEXSPI_SEL.sel, value: CCM_ANALOG.PLL3_PFD0_CLK}
+- {id: CCM.LCDIF_PODF.scale, value: '8', locked: true}
+- {id: CCM.LCDIF_PRED.scale, value: '7', locked: true}
+- {id: CCM.LPSPI_PODF.scale, value: '5', locked: true}
+- {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}
+- {id: CCM.SEMC_PODF.scale, value: '8'}
+- {id: CCM.TRACE_PODF.scale, value: '3', locked: true}
+- {id: CCM_ANALOG.PLL1_BYPASS.sel, value: CCM_ANALOG.PLL1}
+- {id: CCM_ANALOG.PLL1_PREDIV.scale, value: '1', locked: true}
+- {id: CCM_ANALOG.PLL1_VDIV.scale, value: '50', locked: true}
+- {id: CCM_ANALOG.PLL2.denom, value: '1', locked: true}
+- {id: CCM_ANALOG.PLL2.num, value: '0', locked: true}
+- {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}
+- {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}
+- {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}
+- {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}
+- {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}
+- {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}
+- {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}
+- {id: CCM_ANALOG.PLL3_PFD0_DIV.scale, value: '33', locked: true}
+- {id: CCM_ANALOG.PLL3_PFD0_MUL.scale, value: '18', locked: true}
+- {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}
+- {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}
+- {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}
+- {id: CCM_ANALOG.PLL4.denom, value: '50'}
+- {id: CCM_ANALOG.PLL4.div, value: '47'}
+- {id: CCM_ANALOG.PLL5.denom, value: '1'}
+- {id: CCM_ANALOG.PLL5.div, value: '40'}
+- {id: CCM_ANALOG.PLL5.num, value: '0'}
+- {id: CCM_ANALOG_PLL_ENET_POWERDOWN_CFG, value: 'Yes'}
+- {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}
+sources:
+- {id: XTALOSC24M.OSC.outFreq, value: 24 MHz, enabled: true}
+- {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}
+ * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
+
+/*******************************************************************************
+ * Variables for BOARD_BootClockRUN configuration
+ ******************************************************************************/
+const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN =
+ {
+ .loopDivider = 100, /* PLL loop divider, Fout = Fin * 50 */
+ .src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
+ };
+const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN =
+ {
+ .loopDivider = 1, /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */
+ .numerator = 0, /* 30 bit numerator of fractional loop divider */
+ .denominator = 1, /* 30 bit denominator of fractional loop divider */
+ .src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
+ };
+const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN =
+ {
+ .loopDivider = 0, /* PLL loop divider, Fout = Fin * 20 */
+ .src = 0, /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */
+ };
+/*******************************************************************************
+ * Code for BOARD_BootClockRUN configuration
+ ******************************************************************************/
+void BOARD_BootClockRUN(void)
+{
+ /* Init RTC OSC clock frequency. */
+ CLOCK_SetRtcXtalFreq(32768U);
+ /* Enable 1MHz clock output. */
+ XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;
+ /* Use free 1MHz clock output. */
+ XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;
+ /* Set XTAL 24MHz clock frequency. */
+ CLOCK_SetXtalFreq(24000000U);
+ /* Enable XTAL 24MHz clock source. */
+ CLOCK_InitExternalClk(0);
+ /* Enable internal RC. */
+ CLOCK_InitRcOsc24M();
+ /* Switch clock source to external OSC. */
+ CLOCK_SwitchOsc(kCLOCK_XtalOsc);
+ /* Set Oscillator ready counter value. */
+ CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);
+ /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */
+ CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */
+ CLOCK_SetMux(kCLOCK_PeriphMux, 1); /* Set PERIPH_CLK MUX to PERIPH_CLK2 */
+ /* Setting the VDD_SOC to 1.275V. It is necessary to config AHB to 600Mhz. */
+ DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x13);
+ /* Waiting for DCDC_STS_DC_OK bit is asserted */
+ while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0))
+ {
+ }
+ /* Set AHB_PODF. */
+ CLOCK_SetDiv(kCLOCK_AhbDiv, 0);
+ /* Disable IPG clock gate. */
+ CLOCK_DisableClock(kCLOCK_Adc1);
+ CLOCK_DisableClock(kCLOCK_Adc2);
+ CLOCK_DisableClock(kCLOCK_Xbar1);
+ CLOCK_DisableClock(kCLOCK_Xbar2);
+ CLOCK_DisableClock(kCLOCK_Xbar3);
+ /* Set IPG_PODF. */
+ CLOCK_SetDiv(kCLOCK_IpgDiv, 3);
+ /* Set ARM_PODF. */
+ CLOCK_SetDiv(kCLOCK_ArmDiv, 1);
+ /* Set PERIPH_CLK2_PODF. */
+ CLOCK_SetDiv(kCLOCK_PeriphClk2Div, 0);
+ /* Disable PERCLK clock gate. */
+ CLOCK_DisableClock(kCLOCK_Gpt1);
+ CLOCK_DisableClock(kCLOCK_Gpt1S);
+ CLOCK_DisableClock(kCLOCK_Gpt2);
+ CLOCK_DisableClock(kCLOCK_Gpt2S);
+ CLOCK_DisableClock(kCLOCK_Pit);
+ /* Set PERCLK_PODF. */
+ CLOCK_SetDiv(kCLOCK_PerclkDiv, 1);
+ /* Disable USDHC1 clock gate. */
+ CLOCK_DisableClock(kCLOCK_Usdhc1);
+ /* Set USDHC1_PODF. */
+ CLOCK_SetDiv(kCLOCK_Usdhc1Div, 1);
+ /* Set Usdhc1 clock source. */
+ CLOCK_SetMux(kCLOCK_Usdhc1Mux, 0);
+ /* Disable USDHC2 clock gate. */
+ CLOCK_DisableClock(kCLOCK_Usdhc2);
+ /* Set USDHC2_PODF. */
+ CLOCK_SetDiv(kCLOCK_Usdhc2Div, 1);
+ /* Set Usdhc2 clock source. */
+ CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0);
+ /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.
+ * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.
+ * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/
+#ifndef SKIP_SYSCLK_INIT
+ /* Disable Semc clock gate. */
+ CLOCK_DisableClock(kCLOCK_Semc);
+ /* Set SEMC_PODF. */
+ CLOCK_SetDiv(kCLOCK_SemcDiv, 7);
+ /* Set Semc alt clock source. */
+ CLOCK_SetMux(kCLOCK_SemcAltMux, 0);
+ /* Set Semc clock source. */
+ CLOCK_SetMux(kCLOCK_SemcMux, 0);
+#endif
+ /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.
+ * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.
+ * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/
+#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))
+ /* Disable Flexspi clock gate. */
+ CLOCK_DisableClock(kCLOCK_FlexSpi);
+ /* Set FLEXSPI_PODF. */
+ CLOCK_SetDiv(kCLOCK_FlexspiDiv, 0);
+ /* Set Flexspi clock source. */
+ CLOCK_SetMux(kCLOCK_FlexspiMux, 3);
+#endif
+ /* Disable CSI clock gate. */
+ CLOCK_DisableClock(kCLOCK_Csi);
+ /* Set CSI_PODF. */
+ CLOCK_SetDiv(kCLOCK_CsiDiv, 1);
+ /* Set Csi clock source. */
+ CLOCK_SetMux(kCLOCK_CsiMux, 0);
+ /* Disable LPSPI clock gate. */
+ CLOCK_DisableClock(kCLOCK_Lpspi1);
+ CLOCK_DisableClock(kCLOCK_Lpspi2);
+ CLOCK_DisableClock(kCLOCK_Lpspi3);
+ CLOCK_DisableClock(kCLOCK_Lpspi4);
+ /* Set LPSPI_PODF. */
+ CLOCK_SetDiv(kCLOCK_LpspiDiv, 4);
+ /* Set Lpspi clock source. */
+ CLOCK_SetMux(kCLOCK_LpspiMux, 2);
+ /* Disable TRACE clock gate. */
+ CLOCK_DisableClock(kCLOCK_Trace);
+ /* Set TRACE_PODF. */
+ CLOCK_SetDiv(kCLOCK_TraceDiv, 2);
+ /* Set Trace clock source. */
+ CLOCK_SetMux(kCLOCK_TraceMux, 2);
+ /* Disable SAI1 clock gate. */
+ CLOCK_DisableClock(kCLOCK_Sai1);
+ /* Set SAI1_CLK_PRED. */
+ CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);
+ /* Set SAI1_CLK_PODF. */
+ CLOCK_SetDiv(kCLOCK_Sai1Div, 1);
+ /* Set Sai1 clock source. */
+ CLOCK_SetMux(kCLOCK_Sai1Mux, 0);
+ /* Disable SAI2 clock gate. */
+ CLOCK_DisableClock(kCLOCK_Sai2);
+ /* Set SAI2_CLK_PRED. */
+ CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3);
+ /* Set SAI2_CLK_PODF. */
+ CLOCK_SetDiv(kCLOCK_Sai2Div, 1);
+ /* Set Sai2 clock source. */
+ CLOCK_SetMux(kCLOCK_Sai2Mux, 0);
+ /* Disable SAI3 clock gate. */
+ CLOCK_DisableClock(kCLOCK_Sai3);
+ /* Set SAI3_CLK_PRED. */
+ CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);
+ /* Set SAI3_CLK_PODF. */
+ CLOCK_SetDiv(kCLOCK_Sai3Div, 1);
+ /* Set Sai3 clock source. */
+ CLOCK_SetMux(kCLOCK_Sai3Mux, 0);
+ /* Disable Lpi2c clock gate. */
+ CLOCK_DisableClock(kCLOCK_Lpi2c1);
+ CLOCK_DisableClock(kCLOCK_Lpi2c2);
+ CLOCK_DisableClock(kCLOCK_Lpi2c3);
+ /* Set LPI2C_CLK_PODF. */
+ CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);
+ /* Set Lpi2c clock source. */
+ CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);
+ /* Disable CAN clock gate. */
+ CLOCK_DisableClock(kCLOCK_Can1);
+ CLOCK_DisableClock(kCLOCK_Can2);
+ CLOCK_DisableClock(kCLOCK_Can1S);
+ CLOCK_DisableClock(kCLOCK_Can2S);
+ /* Set CAN_CLK_PODF. */
+ CLOCK_SetDiv(kCLOCK_CanDiv, 1);
+ /* Set Can clock source. */
+ CLOCK_SetMux(kCLOCK_CanMux, 2);
+ /* Disable UART clock gate. */
+ CLOCK_DisableClock(kCLOCK_Lpuart1);
+ CLOCK_DisableClock(kCLOCK_Lpuart2);
+ CLOCK_DisableClock(kCLOCK_Lpuart3);
+ CLOCK_DisableClock(kCLOCK_Lpuart4);
+ CLOCK_DisableClock(kCLOCK_Lpuart5);
+ CLOCK_DisableClock(kCLOCK_Lpuart6);
+ CLOCK_DisableClock(kCLOCK_Lpuart7);
+ CLOCK_DisableClock(kCLOCK_Lpuart8);
+ /* Set UART_CLK_PODF. */
+ CLOCK_SetDiv(kCLOCK_UartDiv, 0);
+ /* Set Uart clock source. */
+ CLOCK_SetMux(kCLOCK_UartMux, 0);
+ /* Disable LCDIF clock gate. */
+ CLOCK_DisableClock(kCLOCK_LcdPixel);
+ /* Set LCDIF_PRED. */
+ CLOCK_SetDiv(kCLOCK_LcdifPreDiv, 6);
+ /* Set LCDIF_CLK_PODF. */
+ CLOCK_SetDiv(kCLOCK_LcdifDiv, 7);
+ /* Set Lcdif pre clock source. */
+ CLOCK_SetMux(kCLOCK_LcdifPreMux, 5);
+ /* Disable SPDIF clock gate. */
+ CLOCK_DisableClock(kCLOCK_Spdif);
+ /* Set SPDIF0_CLK_PRED. */
+ CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);
+ /* Set SPDIF0_CLK_PODF. */
+ CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);
+ /* Set Spdif clock source. */
+ CLOCK_SetMux(kCLOCK_SpdifMux, 3);
+ /* Disable Flexio1 clock gate. */
+ CLOCK_DisableClock(kCLOCK_Flexio1);
+ /* Set FLEXIO1_CLK_PRED. */
+ CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);
+ /* Set FLEXIO1_CLK_PODF. */
+ CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);
+ /* Set Flexio1 clock source. */
+ CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);
+ /* Disable Flexio2 clock gate. */
+ CLOCK_DisableClock(kCLOCK_Flexio2);
+ /* Set FLEXIO2_CLK_PRED. */
+ CLOCK_SetDiv(kCLOCK_Flexio2PreDiv, 1);
+ /* Set FLEXIO2_CLK_PODF. */
+ CLOCK_SetDiv(kCLOCK_Flexio2Div, 7);
+ /* Set Flexio2 clock source. */
+ CLOCK_SetMux(kCLOCK_Flexio2Mux, 3);
+ /* Set Pll3 sw clock source. */
+ CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);
+ /* Init ARM PLL. */
+ CLOCK_InitArmPll(&armPllConfig_BOARD_BootClockRUN);
+ /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.
+ * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.
+ * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/
+#ifndef SKIP_SYSCLK_INIT
+ /* Init System PLL. */
+ CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN);
+ /* Init System pfd0. */
+ CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);
+ /* Init System pfd1. */
+ CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);
+ /* Init System pfd2. */
+ CLOCK_InitSysPfd(kCLOCK_Pfd2, 24);
+ /* Init System pfd3. */
+ CLOCK_InitSysPfd(kCLOCK_Pfd3, 16);
+ /* Disable pfd offset. */
+ CCM_ANALOG->PLL_SYS &= ~CCM_ANALOG_PLL_SYS_PFD_OFFSET_EN_MASK;
+#endif
+ /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.
+ * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.
+ * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/
+#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))
+ /* Init Usb1 PLL. */
+ CLOCK_InitUsb1Pll(&usb1PllConfig_BOARD_BootClockRUN);
+ /* Init Usb1 pfd0. */
+ CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 33);
+ /* Init Usb1 pfd1. */
+ CLOCK_InitUsb1Pfd(kCLOCK_Pfd1, 16);
+ /* Init Usb1 pfd2. */
+ CLOCK_InitUsb1Pfd(kCLOCK_Pfd2, 17);
+ /* Init Usb1 pfd3. */
+ CLOCK_InitUsb1Pfd(kCLOCK_Pfd3, 19);
+ /* Disable Usb1 PLL output for USBPHY1. */
+ CCM_ANALOG->PLL_USB1 &= ~CCM_ANALOG_PLL_USB1_EN_USB_CLKS_MASK;
+#endif
+ /* DeInit Audio PLL. */
+ CLOCK_DeinitAudioPll();
+ /* Bypass Audio PLL. */
+ CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1);
+ /* Set divider for Audio PLL. */
+ CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;
+ CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;
+ /* Enable Audio PLL output. */
+ CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;
+ /* DeInit Video PLL. */
+ CLOCK_DeinitVideoPll();
+ /* Bypass Video PLL. */
+ CCM_ANALOG->PLL_VIDEO |= CCM_ANALOG_PLL_VIDEO_BYPASS_MASK;
+ /* Set divider for Video PLL. */
+ CCM_ANALOG->MISC2 = (CCM_ANALOG->MISC2 & (~CCM_ANALOG_MISC2_VIDEO_DIV_MASK)) | CCM_ANALOG_MISC2_VIDEO_DIV(0);
+ /* Enable Video PLL output. */
+ CCM_ANALOG->PLL_VIDEO |= CCM_ANALOG_PLL_VIDEO_ENABLE_MASK;
+ /* DeInit Enet PLL. */
+ CLOCK_DeinitEnetPll();
+ /* Bypass Enet PLL. */
+ CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllEnet, 1);
+ /* Set Enet output divider. */
+ CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK)) | CCM_ANALOG_PLL_ENET_DIV_SELECT(1);
+ /* Enable Enet output. */
+ CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENABLE_MASK;
+ /* Enable Enet25M output. */
+ CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_MASK;
+ /* DeInit Usb2 PLL. */
+ CLOCK_DeinitUsb2Pll();
+ /* Bypass Usb2 PLL. */
+ CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllUsb2, 1);
+ /* Enable Usb2 PLL output. */
+ CCM_ANALOG->PLL_USB2 |= CCM_ANALOG_PLL_USB2_ENABLE_MASK;
+ /* Set preperiph clock source. */
+ CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);
+ /* Set periph clock source. */
+ CLOCK_SetMux(kCLOCK_PeriphMux, 0);
+ /* Set periph clock2 clock source. */
+ CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);
+ /* Set per clock source. */
+ CLOCK_SetMux(kCLOCK_PerclkMux, 0);
+ /* Set lvds1 clock source. */
+ CCM_ANALOG->MISC1 = (CCM_ANALOG->MISC1 & (~CCM_ANALOG_MISC1_LVDS1_CLK_SEL_MASK)) | CCM_ANALOG_MISC1_LVDS1_CLK_SEL(0);
+ /* Set clock out1 divider. */
+ CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);
+ /* Set clock out1 source. */
+ CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);
+ /* Set clock out2 divider. */
+ CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);
+ /* Set clock out2 source. */
+ CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(18);
+ /* Set clock out1 drives clock out1. */
+ CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;
+ /* Disable clock out1. */
+ CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;
+ /* Disable clock out2. */
+ CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;
+ /* Set SAI1 MCLK1 clock source. */
+ IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);
+ /* Set SAI1 MCLK2 clock source. */
+ IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0);
+ /* Set SAI1 MCLK3 clock source. */
+ IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);
+ /* Set SAI2 MCLK3 clock source. */
+ IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0);
+ /* Set SAI3 MCLK3 clock source. */
+ IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);
+ /* Set MQS configuration. */
+ IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);
+ /* Set ENET Tx clock source. */
+ IOMUXC_EnableMode(IOMUXC_GPR, kIOMUXC_GPR_ENET1RefClkMode, false);
+ /* Set GPT1 High frequency reference clock source. */
+ IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK;
+ /* Set GPT2 High frequency reference clock source. */
+ IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK;
+ /* Set SystemCoreClock variable. */
+ SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;
+}
+
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/clock_config.h b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/clock_config.h
new file mode 100644
index 0000000000..43fbb9d805
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/clock_config.h
@@ -0,0 +1,66 @@
+#ifndef _CLOCK_CONFIG_H_
+#define _CLOCK_CONFIG_H_
+
+#include "fsl_common.h"
+
+/*******************************************************************************
+ * Definitions
+ ******************************************************************************/
+#define BOARD_XTAL0_CLK_HZ 24000000U /*!< Board xtal0 frequency in Hz */
+
+#define BOARD_XTAL32K_CLK_HZ 32768U /*!< Board xtal32k frequency in Hz */
+/*******************************************************************************
+ ************************ BOARD_InitBootClocks function ************************
+ ******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* __cplusplus*/
+
+/*!
+ * @brief This function executes default configuration of clocks.
+ *
+ */
+void BOARD_InitBootClocks(void);
+
+#if defined(__cplusplus)
+}
+#endif /* __cplusplus*/
+
+/*******************************************************************************
+ ********************** Configuration BOARD_BootClockRUN ***********************
+ ******************************************************************************/
+/*******************************************************************************
+ * Definitions for BOARD_BootClockRUN configuration
+ ******************************************************************************/
+#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 600000000U /*!< Core clock frequency: 600000000Hz */
+
+/*! @brief Arm PLL set for BOARD_BootClockRUN configuration.
+ */
+extern const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN;
+/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.
+ */
+extern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;
+/*! @brief Sys PLL for BOARD_BootClockRUN configuration.
+ */
+extern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;
+
+/*******************************************************************************
+ * API for BOARD_BootClockRUN configuration
+ ******************************************************************************/
+#if defined(__cplusplus)
+extern "C" {
+#endif /* __cplusplus*/
+
+/*!
+ * @brief This function executes configuration of clocks.
+ *
+ */
+void BOARD_BootClockRUN(void);
+
+#if defined(__cplusplus)
+}
+#endif /* __cplusplus*/
+
+#endif /* _CLOCK_CONFIG_H_ */
+
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/pin_mux.c b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/pin_mux.c
new file mode 100644
index 0000000000..8ed0a9d069
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/pin_mux.c
@@ -0,0 +1,81 @@
+/***********************************************************************************************************************
+ * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file
+ * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.
+ **********************************************************************************************************************/
+
+/*
+ * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
+!!GlobalInfo
+product: Pins v5.0
+processor: MIMXRT1052xxxxB
+package_id: MIMXRT1052DVL6B
+mcu_data: ksdk2_0
+processor_version: 5.0.2
+board: IMXRT1050-EVKB
+ * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********
+ */
+
+#include "fsl_common.h"
+#include "fsl_iomuxc.h"
+#include "pin_mux.h"
+
+/* FUNCTION ************************************************************************************************************
+ *
+ * Function Name : BOARD_InitBootPins
+ * Description : Calls initialization functions.
+ *
+ * END ****************************************************************************************************************/
+void BOARD_InitBootPins(void) {
+}
+
+/*
+ * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
+BOARD_InitPins:
+- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}
+- pin_list:
+ - {pin_num: L14, peripheral: LPUART1, signal: RX, pin_signal: GPIO_AD_B0_13}
+ - {pin_num: K14, peripheral: LPUART1, signal: TX, pin_signal: GPIO_AD_B0_12}
+ - {pin_num: M14, peripheral: LPSPI3, signal: SCK, pin_signal: GPIO_AD_B0_00}
+ - {pin_num: M11, peripheral: LPSPI3, signal: SDI, pin_signal: GPIO_AD_B0_02}
+ - {pin_num: H10, peripheral: LPSPI3, signal: SDO, pin_signal: GPIO_AD_B0_01}
+ - {pin_num: M5, peripheral: LPUART4, signal: RX, pin_signal: GPIO_SD_B1_01}
+ - {pin_num: L5, peripheral: LPUART4, signal: TX, pin_signal: GPIO_SD_B1_00}
+ - {pin_num: F11, peripheral: GPIO1, signal: 'gpio_io, 04', pin_signal: GPIO_AD_B0_04}
+ * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********
+ */
+
+/* FUNCTION ************************************************************************************************************
+ *
+ * Function Name : BOARD_InitPins
+ * Description : Configures pin routing and optionally pin electrical features.
+ *
+ * END ****************************************************************************************************************/
+void BOARD_InitPins(void) {
+ CLOCK_EnableClock(kCLOCK_Iomuxc); /* iomuxc clock (iomuxc_clk_enable): 0x03U */
+
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AD_B0_00_LPSPI3_SCK, /* GPIO_AD_B0_00 is configured as LPSPI3_SCK */
+ 0U); /* Software Input On Field: Input Path is determined by functionality */
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AD_B0_01_LPSPI3_SDO, /* GPIO_AD_B0_01 is configured as LPSPI3_SDO */
+ 0U); /* Software Input On Field: Input Path is determined by functionality */
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AD_B0_02_LPSPI3_SDI, /* GPIO_AD_B0_02 is configured as LPSPI3_SDI */
+ 0U); /* Software Input On Field: Input Path is determined by functionality */
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AD_B0_12_LPUART1_TX, /* GPIO_AD_B0_12 is configured as LPUART1_TX */
+ 0U); /* Software Input On Field: Input Path is determined by functionality */
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_AD_B0_13_LPUART1_RX, /* GPIO_AD_B0_13 is configured as LPUART1_RX */
+ 0U); /* Software Input On Field: Input Path is determined by functionality */
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_SD_B1_00_LPUART4_TX, /* GPIO_SD_B1_00 is configured as LPUART4_TX */
+ 0U); /* Software Input On Field: Input Path is determined by functionality */
+ IOMUXC_SetPinMux(
+ IOMUXC_GPIO_SD_B1_01_LPUART4_RX, /* GPIO_SD_B1_01 is configured as LPUART4_RX */
+ 0U); /* Software Input On Field: Input Path is determined by functionality */
+}
+
+/***********************************************************************************************************************
+ * EOF
+ **********************************************************************************************************************/
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/pin_mux.h b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/pin_mux.h
new file mode 100644
index 0000000000..b1d61c2782
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MCUX_Config/pin_mux.h
@@ -0,0 +1,182 @@
+/***********************************************************************************************************************
+ * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file
+ * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.
+ **********************************************************************************************************************/
+
+#ifndef _PIN_MUX_H_
+#define _PIN_MUX_H_
+
+/***********************************************************************************************************************
+ * Definitions
+ **********************************************************************************************************************/
+
+/*! @brief Direction type */
+typedef enum _pin_mux_direction
+{
+ kPIN_MUX_DirectionInput = 0U, /* Input direction */
+ kPIN_MUX_DirectionOutput = 1U, /* Output direction */
+ kPIN_MUX_DirectionInputOrOutput = 2U /* Input or output direction */
+} pin_mux_direction_t;
+
+/*!
+ * @addtogroup pin_mux
+ * @{
+ */
+
+/***********************************************************************************************************************
+ * API
+ **********************************************************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/*!
+ * @brief Calls initialization functions.
+ *
+ */
+void BOARD_InitBootPins(void);
+
+/* GPIO_AD_B0_13 (coord L14), UART1_RXD */
+#define BOARD_INITPINS_UART1_RXD_PERIPHERAL LPUART1 /*!< Device name: LPUART1 */
+#define BOARD_INITPINS_UART1_RXD_SIGNAL RX /*!< LPUART1 signal: RX */
+
+/* GPIO_AD_B0_12 (coord K14), UART1_TXD */
+#define BOARD_INITPINS_UART1_TXD_PERIPHERAL LPUART1 /*!< Device name: LPUART1 */
+#define BOARD_INITPINS_UART1_TXD_SIGNAL TX /*!< LPUART1 signal: TX */
+
+/* GPIO_SD_B1_03 (coord M4), FlexSPI_D0_B */
+#define BOARD_INITPINS_FlexSPI_D0_B_GPIO GPIO3 /*!< GPIO device name: GPIO3 */
+#define BOARD_INITPINS_FlexSPI_D0_B_PORT GPIO3 /*!< PORT device name: GPIO3 */
+#define BOARD_INITPINS_FlexSPI_D0_B_PIN 3U /*!< GPIO3 pin index: 3 */
+
+/* PMIC_ON_REQ (coord K7), PMIC_ON_REQ */
+#define BOARD_INITPINS_PMIC_ON_REQ_GPIO GPIO5 /*!< GPIO device name: GPIO5 */
+#define BOARD_INITPINS_PMIC_ON_REQ_PORT GPIO5 /*!< PORT device name: GPIO5 */
+#define BOARD_INITPINS_PMIC_ON_REQ_PIN 1U /*!< GPIO5 pin index: 1 */
+
+/* GPIO_AD_B0_05 (coord G14), CAN_STBY/BOOT_MODE[1]/Flash_RST/U12[8] */
+#define BOARD_INITPINS_CAN_STBY_GPIO GPIO1 /*!< GPIO device name: GPIO1 */
+#define BOARD_INITPINS_CAN_STBY_PORT GPIO1 /*!< PORT device name: GPIO1 */
+#define BOARD_INITPINS_CAN_STBY_PIN 5U /*!< GPIO1 pin index: 5 */
+
+/* GPIO_EMC_40 (coord A7), ENET_MDC */
+#define BOARD_INITPINS_ENET_MDC_GPIO GPIO3 /*!< GPIO device name: GPIO3 */
+#define BOARD_INITPINS_ENET_MDC_PORT GPIO3 /*!< PORT device name: GPIO3 */
+#define BOARD_INITPINS_ENET_MDC_PIN 26U /*!< GPIO3 pin index: 26 */
+
+/* GPIO_B0_00 (coord D7), LCDIF_CLK */
+#define BOARD_INITPINS_LCDIF_CLK_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_CLK_SIGNAL lcdif_clk /*!< LCDIF signal: lcdif_clk */
+
+/* GPIO_B0_04 (coord C8), LCDIF_D0/BT_CFG[0] */
+#define BOARD_INITPINS_LCDIF_D0_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D0_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D0_CHANNEL 0U /*!< LCDIF lcdif_data channel: 00 */
+
+/* GPIO_B0_05 (coord B8), LCDIF_D1/BT_CFG[1] */
+#define BOARD_INITPINS_LCDIF_D1_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D1_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D1_CHANNEL 1U /*!< LCDIF lcdif_data channel: 01 */
+
+/* GPIO_B0_06 (coord A8), LCDIF_D2/BT_CFG[2] */
+#define BOARD_INITPINS_LCDIF_D2_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D2_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D2_CHANNEL 2U /*!< LCDIF lcdif_data channel: 02 */
+
+/* GPIO_B0_08 (coord B9), LCDIF_D4/BT_CFG[4] */
+#define BOARD_INITPINS_LCDIF_D4_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D4_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D4_CHANNEL 4U /*!< LCDIF lcdif_data channel: 04 */
+
+/* GPIO_B0_07 (coord A9), LCDIF_D3/BT_CFG[3] */
+#define BOARD_INITPINS_LCDIF_D3_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D3_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D3_CHANNEL 3U /*!< LCDIF lcdif_data channel: 03 */
+
+/* GPIO_B0_09 (coord C9), LCDIF_D5/BT_CFG[5] */
+#define BOARD_INITPINS_LCDIF_D5_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D5_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D5_CHANNEL 5U /*!< LCDIF lcdif_data channel: 05 */
+
+/* GPIO_B0_10 (coord D9), LCDIF_D6/BT_CFG[6] */
+#define BOARD_INITPINS_LCDIF_D6_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D6_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D6_CHANNEL 6U /*!< LCDIF lcdif_data channel: 06 */
+
+/* GPIO_B0_11 (coord A10), LCDIF_D7/BT_CFG[7] */
+#define BOARD_INITPINS_LCDIF_D7_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D7_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D7_CHANNEL 7U /*!< LCDIF lcdif_data channel: 07 */
+
+/* GPIO_B0_12 (coord C10), LCDIF_D8/BT_CFG[8] */
+#define BOARD_INITPINS_LCDIF_D8_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D8_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D8_CHANNEL 8U /*!< LCDIF lcdif_data channel: 08 */
+
+/* GPIO_B0_13 (coord D10), LCDIF_D9/BT_CFG[9] */
+#define BOARD_INITPINS_LCDIF_D9_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D9_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D9_CHANNEL 9U /*!< LCDIF lcdif_data channel: 09 */
+
+/* GPIO_B0_14 (coord E10), LCDIF_D10/BT_CFG[10] */
+#define BOARD_INITPINS_LCDIF_D10_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D10_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D10_CHANNEL 10U /*!< LCDIF lcdif_data channel: 10 */
+
+/* GPIO_B0_15 (coord E11), LCDIF_D11/BT_CFG[11] */
+#define BOARD_INITPINS_LCDIF_D11_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D11_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D11_CHANNEL 11U /*!< LCDIF lcdif_data channel: 11 */
+
+/* GPIO_B1_00 (coord A11), LCDIF_D12 */
+#define BOARD_INITPINS_LCDIF_D12_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D12_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D12_CHANNEL 12U /*!< LCDIF lcdif_data channel: 12 */
+
+/* GPIO_B1_01 (coord B11), LCDIF_D13 */
+#define BOARD_INITPINS_LCDIF_D13_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D13_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D13_CHANNEL 13U /*!< LCDIF lcdif_data channel: 13 */
+
+/* GPIO_B1_02 (coord C11), LCDIF_D14 */
+#define BOARD_INITPINS_LCDIF_D14_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D14_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D14_CHANNEL 14U /*!< LCDIF lcdif_data channel: 14 */
+
+/* GPIO_B1_03 (coord D11), LCDIF_D15 */
+#define BOARD_INITPINS_LCDIF_D15_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_D15_SIGNAL lcdif_data /*!< LCDIF signal: lcdif_data */
+#define BOARD_INITPINS_LCDIF_D15_CHANNEL 15U /*!< LCDIF lcdif_data channel: 15 */
+
+/* GPIO_B0_01 (coord E7), LCDIF_ENABLE */
+#define BOARD_INITPINS_LCDIF_ENABLE_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_ENABLE_SIGNAL lcdif_enable /*!< LCDIF signal: lcdif_enable */
+
+/* GPIO_B0_02 (coord E8), LCDIF_HSYNC */
+#define BOARD_INITPINS_LCDIF_HSYNC_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_HSYNC_SIGNAL lcdif_hsync /*!< LCDIF signal: lcdif_hsync */
+
+/* GPIO_B0_03 (coord D8), LCDIF_VSYNC */
+#define BOARD_INITPINS_LCDIF_VSYNC_PERIPHERAL LCDIF /*!< Device name: LCDIF */
+#define BOARD_INITPINS_LCDIF_VSYNC_SIGNAL lcdif_vsync /*!< LCDIF signal: lcdif_vsync */
+
+
+/*!
+ * @brief Configures pin routing and optionally pin electrical features.
+ *
+ */
+void BOARD_InitPins(void);
+
+#if defined(__cplusplus)
+}
+#endif
+
+/*!
+ * @}
+ */
+#endif /* _PIN_MUX_H_ */
+
+/***********************************************************************************************************************
+ * EOF
+ **********************************************************************************************************************/
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MIMXRT105x_QuadSPI_4KB_SEC.FLM b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MIMXRT105x_QuadSPI_4KB_SEC.FLM
new file mode 100644
index 0000000000..ac4c378c6a
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/MIMXRT105x_QuadSPI_4KB_SEC.FLM
Binary files differ
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/SConscript b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/SConscript
new file mode 100644
index 0000000000..e6008ae576
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/SConscript
@@ -0,0 +1,20 @@
+from building import *
+
+cwd = GetCurrentDir()
+
+# add the general drivers.
+src = Split("""
+board.c
+MCUX_Config/clock_config.c
+MCUX_Config/pin_mux.c
+""")
+
+CPPPATH = [cwd,cwd + '/MCUX_Config',cwd + '/ports']
+CPPDEFINES = ['CPU_MIMXRT1052CVL5B', 'SKIP_SYSCLK_INIT', 'EVK_MCIMXRM', 'FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL=1','XIP_EXTERNAL_FLASH=1']
+
+if GetDepend(['BSP_USING_SPI_FLASH']):
+ src += Glob('ports/spi_flash_init.c')
+
+group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES=CPPDEFINES)
+
+Return('group')
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/board.c b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/board.c
new file mode 100644
index 0000000000..e50e511070
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/board.c
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-01-05 Bernard first implementation
+ */
+
+#include <rthw.h>
+#include <rtthread.h>
+#include "board.h"
+#include "pin_mux.h"
+
+#ifdef BSP_USING_DMA
+#include "fsl_dmamux.h"
+#include "fsl_edma.h"
+#endif
+
+#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority
+ 4 bits for subpriority */
+#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority
+ 3 bits for subpriority */
+#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority
+ 2 bits for subpriority */
+#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority
+ 1 bits for subpriority */
+#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority
+ 0 bits for subpriority */
+
+/* MPU configuration. */
+static void BOARD_ConfigMPU(void)
+{
+ /* Disable I cache and D cache */
+ SCB_DisableICache();
+ SCB_DisableDCache();
+
+ /* Disable MPU */
+ ARM_MPU_Disable();
+
+ /* Region 0 setting */
+ MPU->RBAR = ARM_MPU_RBAR(0, 0xC0000000U);
+ MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);
+
+ /* Region 1 setting */
+ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U);
+ MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
+
+ /* Region 2 setting */
+ // spi flash: normal type, cacheable, no bufferable, no shareable
+ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
+ MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_512MB);
+
+ /* Region 3 setting */
+ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U);
+ MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
+
+ /* Region 4 setting */
+ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);
+ MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
+
+ /* Region 5 setting */
+ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);
+ MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
+
+ /* Region 6 setting */
+ MPU->RBAR = ARM_MPU_RBAR(6, 0x20200000U);
+ MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
+
+#if defined(BSP_USING_SDRAM)
+ /* Region 7 setting */
+ MPU->RBAR = ARM_MPU_RBAR(7, 0x80000000U);
+ MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_32MB);
+
+ /* Region 8 setting */
+ MPU->RBAR = ARM_MPU_RBAR(8, 0x81E00000U);
+ MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB);
+#endif
+
+ /* Enable MPU */
+ ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk);
+
+ /* Enable I cache and D cache */
+ SCB_EnableDCache();
+ SCB_EnableICache();
+}
+
+
+/* This is the timer interrupt service routine. */
+void SysTick_Handler(void)
+{
+ /* enter interrupt */
+ rt_interrupt_enter();
+
+ rt_tick_increase();
+
+ /* leave interrupt */
+ rt_interrupt_leave();
+}
+
+#ifdef BSP_USING_DMA
+void imxrt_dma_init(void)
+{
+ edma_config_t config;
+
+ DMAMUX_Init(DMAMUX);
+ EDMA_GetDefaultConfig(&config);
+ EDMA_Init(DMA0, &config);
+}
+#endif
+
+void rt_hw_board_init()
+{
+ BOARD_ConfigMPU();
+ BOARD_InitPins();
+ BOARD_BootClockRUN();
+
+ NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
+ SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
+
+#ifdef BSP_USING_DMA
+ imxrt_dma_init();
+#endif
+
+#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
+}
+
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/board.h b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/board.h
new file mode 100644
index 0000000000..100b932ebd
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/board.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2009-09-22 Bernard add board.h to this bsp
+ */
+
+// <<< Use Configuration Wizard in Context Menu >>>
+#ifndef __BOARD_H__
+#define __BOARD_H__
+
+#include "fsl_common.h"
+#include "clock_config.h"
+
+#ifdef __CC_ARM
+extern int Image$$RTT_HEAP$$ZI$$Base;
+extern int Image$$RTT_HEAP$$ZI$$Limit;
+#define HEAP_BEGIN (&Image$$RTT_HEAP$$ZI$$Base)
+#define HEAP_END (&Image$$RTT_HEAP$$ZI$$Limit)
+
+#elif __ICCARM__
+#pragma section="HEAP"
+#define HEAP_BEGIN (__segment_end("HEAP"))
+extern void __RTT_HEAP_END;
+#define HEAP_END (&__RTT_HEAP_END)
+
+#else
+extern int heap_start;
+extern int heap_end;
+#define HEAP_BEGIN (&heap_start)
+#define HEAP_END (&heap_end)
+#endif
+
+#define HEAP_SIZE ((uint32_t)HEAP_END - (uint32_t)HEAP_BEGIN)
+
+void rt_hw_board_init(void);
+
+#endif
+
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/linker_scripts/link.icf b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/linker_scripts/link.icf
new file mode 100644
index 0000000000..e1dd5a7ea4
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/linker_scripts/link.icf
@@ -0,0 +1,95 @@
+/*
+** ###################################################################
+** Processors: MIMXRT1052CVJ5B
+** MIMXRT1052CVL5B
+** MIMXRT1052DVJ6B
+** MIMXRT1052DVL6B
+**
+** Compiler: IAR ANSI C/C++ Compiler for ARM
+** Reference manual: IMXRT1050RM Rev.1, 03/2018
+** Version: rev. 1.0, 2018-09-21
+** Build: b180921
+**
+** Abstract:
+** Linker file for the IAR ANSI C/C++ Compiler for ARM
+**
+** Copyright 2016 Freescale Semiconductor, Inc.
+** Copyright 2016-2018 NXP
+** All rights reserved.
+**
+** SPDX-License-Identifier: BSD-3-Clause
+**
+** http: www.nxp.com
+**
+** ###################################################################
+*/
+
+define symbol m_interrupts_start = 0x60002000;
+define symbol m_interrupts_end = 0x600023FF;
+
+define symbol m_text_start = 0x60002400;
+define symbol m_text_end = 0x607FFFFF;
+
+define symbol m_data_start = 0x20000000;
+define symbol m_data_end = 0x2001FFFF;
+
+define symbol m_data2_start = 0x20200000;
+define symbol m_data2_end = 0x2023FFFF;
+
+define exported symbol m_boot_hdr_conf_start = 0x60000000;
+define symbol m_boot_hdr_ivt_start = 0x60001000;
+define symbol m_boot_hdr_boot_data_start = 0x60001020;
+define symbol m_boot_hdr_dcd_data_start = 0x60001030;
+
+/* Sizes */
+if (isdefinedsymbol(__stack_size__)) {
+ define symbol __size_cstack__ = __stack_size__;
+} else {
+ define symbol __size_cstack__ = 0x0400;
+}
+
+if (isdefinedsymbol(__heap_size__)) {
+ define symbol __size_heap__ = __heap_size__;
+} else {
+ define symbol __size_heap__ = 0x0400;
+}
+
+define exported symbol __VECTOR_TABLE = m_interrupts_start;
+define exported symbol __VECTOR_RAM = m_interrupts_start;
+define exported symbol __RAM_VECTOR_TABLE_SIZE = 0x0;
+define exported symbol __RTT_HEAP_END = m_data_end;
+
+define memory mem with size = 4G;
+define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end]
+ | mem:[from m_text_start to m_text_end];
+
+define region DATA_region = mem:[from m_data_start to m_data_end-__size_cstack__];
+define region DATA2_region = mem:[from m_data2_start to m_data2_end];
+define region CSTACK_region = mem:[from m_data_end-__size_cstack__+1 to m_data_end];
+
+define block CSTACK with alignment = 8, size = __size_cstack__ { };
+define block HEAP with alignment = 8, size = __size_heap__ { };
+define block RW { readwrite };
+define block ZI { zi };
+define block NCACHE_VAR { section NonCacheable , section NonCacheable.init };
+
+initialize by copy { readwrite, section .textrw };
+do not initialize { section .noinit };
+
+place at address mem: m_interrupts_start { readonly section .intvec };
+
+place at address mem:m_boot_hdr_conf_start { section .boot_hdr.conf };
+place at address mem:m_boot_hdr_ivt_start { section .boot_hdr.ivt };
+place at address mem:m_boot_hdr_boot_data_start { readonly section .boot_hdr.boot_data };
+place at address mem:m_boot_hdr_dcd_data_start { readonly section .boot_hdr.dcd_data };
+
+keep{ section .boot_hdr.conf, section .boot_hdr.ivt, section .boot_hdr.boot_data, section .boot_hdr.dcd_data };
+
+place in TEXT_region { readonly };
+place in DATA_region { block RW };
+place in DATA_region { block ZI };
+place in DATA_region { last block HEAP };
+place in DATA_region { block NCACHE_VAR };
+place in CSTACK_region { block CSTACK };
+
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/linker_scripts/link.lds b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/linker_scripts/link.lds
new file mode 100644
index 0000000000..b8c229ae3c
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/linker_scripts/link.lds
@@ -0,0 +1,276 @@
+/*
+** ###################################################################
+** Processors: MIMXRT1052CVL5A
+** MIMXRT1052DVL6A
+**
+** Compiler: GNU C Compiler
+** Reference manual: IMXRT1050RM Rev.C, 08/2017
+** Version: rev. 0.1, 2017-01-10
+** Build: b170927
+**
+** Abstract:
+** Linker file for the GNU C Compiler
+**
+** Copyright 2016 Freescale Semiconductor, Inc.
+** Copyright 2016-2017 NXP
+** Redistribution and use in source and binary forms, with or without modification,
+** are permitted provided that the following conditions are met:
+**
+** 1. Redistributions of source code must retain the above copyright notice, this list
+** of conditions and the following disclaimer.
+**
+** 2. 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.
+**
+** 3. Neither the name of the copyright holder 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 THE COPYRIGHT HOLDER OR 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.
+**
+** http: www.nxp.com
+**
+** ###################################################################
+*/
+
+/* Entry Point */
+ENTRY(Reset_Handler)
+
+HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400;
+STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;
+
+/* Specify the memory areas */
+MEMORY
+{
+ m_boot_data (RX) : ORIGIN = 0x60000000, LENGTH = 0x00001000
+ m_image_vertor_table (RX) : ORIGIN = 0x60001000, LENGTH = 0x00001000
+
+ m_interrupts (RX) : ORIGIN = 0x60002000, LENGTH = 0x00000400
+ m_text (RX) : ORIGIN = 0x60002400, LENGTH = 0x1F7FDC00
+
+ m_itcm (RW) : ORIGIN = 0x00000000, LENGTH = 0x00020000
+ m_dtcm (RW) : ORIGIN = 0x20000000, LENGTH = 0x00020000
+ m_ocram (RW) : ORIGIN = 0x20200000, LENGTH = 0x00040000
+
+ m_sdram (RW) : ORIGIN = 0x80000000, LENGTH = 0x01E00000
+ m_nocache (RW) : ORIGIN = 0x81E00000, LENGTH = 0x00200000
+}
+
+/* Define output sections */
+SECTIONS
+{
+ .boot_data :
+ {
+ KEEP(*(.boot_hdr.conf))
+ } > m_boot_data
+
+ .image_vertor_table :
+ {
+ KEEP(*(.boot_hdr.ivt))
+ KEEP(*(.boot_hdr.boot_data))
+ KEEP(*(.boot_hdr.dcd_data))
+ } > m_image_vertor_table
+
+ /* The startup code goes first into internal RAM */
+ .interrupts :
+ {
+ __VECTOR_TABLE = .;
+ . = ALIGN(4);
+ KEEP(*(.isr_vector)) /* Startup code */
+ . = ALIGN(4);
+ } > m_interrupts
+
+ __VECTOR_RAM = __VECTOR_TABLE;
+ __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0;
+
+ /* The program code and other data goes into internal RAM */
+ .text :
+ {
+ . = ALIGN(4);
+ *(.text) /* .text sections (code) */
+ *(.text*) /* .text* sections (code) */
+ *(.rodata) /* .rodata sections (constants, strings, etc.) */
+ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
+ *(.glue_7) /* glue arm to thumb code */
+ *(.glue_7t) /* glue thumb to arm code */
+ *(.eh_frame)
+ KEEP (*(.init))
+ KEEP (*(.fini))
+ . = ALIGN(4);
+
+ /* section information for finsh shell */
+ . = ALIGN(4);
+ __fsymtab_start = .;
+ KEEP(*(FSymTab))
+ __fsymtab_end = .;
+ . = ALIGN(4);
+ __vsymtab_start = .;
+ KEEP(*(VSymTab))
+ __vsymtab_end = .;
+ . = ALIGN(4);
+
+ /* section information for initial. */
+ . = ALIGN(4);
+ __rt_init_start = .;
+ KEEP(*(SORT(.rti_fn*)))
+ __rt_init_end = .;
+ } > m_text
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > m_text
+
+ .ARM :
+ {
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+ } > m_text
+
+ .ctors :
+ {
+ PROVIDE(__ctors_start__ = .);
+ /* __CTOR_LIST__ = .; */
+ /* gcc uses crtbegin.o to find the start of
+ the constructors, so we make sure it is
+ first. Because this is a wildcard, it
+ doesn't matter if the user does not
+ actually link against crtbegin.o; the
+ linker won't look for a file to match a
+ wildcard. The wildcard also means that it
+ doesn't matter which directory crtbegin.o
+ is in. */
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*crtbegin?.o(.ctors))
+ /* We don't want to include the .ctor section from
+ from the crtend.o file until after the sorted ctors.
+ The .ctor section from the crtend file contains the
+ end of ctors marker and it must be last */
+ KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ /* __CTOR_END__ = .; */
+ PROVIDE(__ctors_end__ = .);
+ } > m_text
+
+ .dtors :
+ {
+ PROVIDE(__dtors_start__ = .);
+ /* __DTOR_LIST__ = .; */
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*crtbegin?.o(.dtors))
+ KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ /* __DTOR_END__ = .; */
+ PROVIDE(__dtors_end__ = .);
+ } > m_text
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array*))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } > m_text
+
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array*))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } > m_text
+
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT(.fini_array.*)))
+ KEEP (*(.fini_array*))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } > m_text
+
+ __etext = .; /* define a global symbol at end of code */
+ __DATA_ROM = .; /* Symbol is used by startup for data initialization */
+
+ .data : AT(__DATA_ROM)
+ {
+ . = ALIGN(4);
+ __DATA_RAM = .;
+ __data_start__ = .; /* create a global symbol at data start */
+ *(m_usb_dma_init_data)
+ *(.data) /* .data sections */
+ *(.data*) /* .data* sections */
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ __data_end__ = .; /* define a global symbol at data end */
+ } > m_dtcm
+
+ __NDATA_ROM = __DATA_ROM + (__data_end__ - __data_start__);
+ .ncache.init : AT(__NDATA_ROM)
+ {
+ __noncachedata_start__ = .; /* create a global symbol at ncache data start */
+ *(NonCacheable.init)
+ . = ALIGN(4);
+ __noncachedata_init_end__ = .; /* create a global symbol at initialized ncache data end */
+ } > m_nocache
+ . = __noncachedata_init_end__;
+ .ncache :
+ {
+ *(NonCacheable)
+ . = ALIGN(4);
+ __noncachedata_end__ = .; /* define a global symbol at ncache data end */
+ } > m_nocache
+
+ __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__);
+ text_end = ORIGIN(m_text) + LENGTH(m_text);
+ ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
+
+ /* Uninitialized data section */
+ .bss :
+ {
+ /* This is used by the startup in order to initialize the .bss section */
+ . = ALIGN(4);
+ __START_BSS = .;
+ __bss_start__ = .;
+ *(m_usb_dma_noninit_data)
+ *(.bss)
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ __END_BSS = .;
+ } > m_dtcm
+
+ .stack :
+ {
+ . = ALIGN(8);
+ stack_start = .;
+ . += STACK_SIZE;
+ stack_end = .;
+ __StackTop = .;
+ } > m_dtcm
+
+ .RTT_HEAP :
+ {
+ heap_start = .;
+ . = ALIGN(8);
+ } > m_dtcm
+
+ PROVIDE(heap_end = ORIGIN(m_dtcm) + LENGTH(m_dtcm));
+
+ .ARM.attributes 0 : { *(.ARM.attributes) }
+
+}
+
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/linker_scripts/link.sct b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/linker_scripts/link.sct
new file mode 100644
index 0000000000..7200f9d479
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/linker_scripts/link.sct
@@ -0,0 +1,112 @@
+#! armcc -E
+/*
+** ###################################################################
+** Processors: MIMXRT1052CVL5A
+** MIMXRT1052DVL6A
+**
+** Compiler: Keil ARM C/C++ Compiler
+** Reference manual: IMXRT1050RM Rev.C, 08/2017
+** Version: rev. 0.1, 2017-01-10
+** Build: b170927
+**
+** Abstract:
+** Linker file for the Keil ARM C/C++ Compiler
+**
+** Copyright 2016 Freescale Semiconductor, Inc.
+** Copyright 2016-2017 NXP
+** Redistribution and use in source and binary forms, with or without modification,
+** are permitted provided that the following conditions are met:
+**
+** 1. Redistributions of source code must retain the above copyright notice, this list
+** of conditions and the following disclaimer.
+**
+** 2. 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.
+**
+** 3. Neither the name of the copyright holder 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 THE COPYRIGHT HOLDER OR 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.
+**
+** http: www.nxp.com
+**
+** ###################################################################
+*/
+
+#define m_flash_config_start 0x60000000
+#define m_flash_config_size 0x00001000
+
+#define m_ivt_start 0x60001000
+#define m_ivt_size 0x00001000
+
+#define m_text_start 0x60002000
+#define m_text_size 0x1F7FE000
+
+#define m_data_start 0x20000000
+#define m_data_size 0x00020000
+
+#define m_ncache_start 0x81E00000
+#define m_ncache_size 0x00200000
+
+/* Sizes */
+#if (defined(__stack_size__))
+ #define Stack_Size __stack_size__
+#else
+ #define Stack_Size 0x1000
+#endif
+
+#if (defined(__heap_size__))
+ #define Heap_Size __heap_size__
+#else
+ #define Heap_Size 0x0400
+#endif
+
+#define RTT_HEAP_SIZE (m_data_size-ImageLength(RW_m_data)-ImageLength(ARM_LIB_HEAP)-ImageLength(ARM_LIB_STACK))
+
+; load region size_region
+LR_IROM1 m_text_start m_text_size
+{
+ ER_IROM1 m_text_start m_text_size ; load address = execution address
+ {
+ * (RESET,+FIRST)
+ * (InRoot$$Sections)
+ .ANY (+RO)
+ }
+
+ RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size ; RW data
+ {
+ .ANY (+RW +ZI)
+ }
+
+ ARM_LIB_HEAP +0 EMPTY Heap_Size{} ; Heap region growing up
+ ARM_LIB_STACK +0 EMPTY Stack_Size{} ; Stack region growing down
+ RTT_HEAP +0 EMPTY RTT_HEAP_SIZE{}
+
+ ; ncache RW data
+ RW_m_ncache m_ncache_start m_ncache_size
+ {
+ * (NonCacheable.init)
+ * (NonCacheable)
+ }
+ ITCM 0x400 0xFBFF {
+ ;drv_flexspi_hyper.o(+RO)
+ ;fsl_flexspi.o(+RO)
+ * (*CLOCK_DisableClock)
+ * (*CLOCK_ControlGate)
+ * (*CLOCK_EnableClock)
+ * (*CLOCK_SetDiv)
+ * (itcm)
+ }
+}
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/board/ports/sdram_port.h b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/ports/sdram_port.h
new file mode 100644
index 0000000000..477987b4e7
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/board/ports/sdram_port.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-12-05 zylx The first version for STM32F4xx
+ * 2019-4-25 misonyo port to IMXRT
+ */
+
+#ifndef SDRAM_PORT_H__
+#define SDRAM_PORT_H__
+
+/* parameters for sdram peripheral */
+
+#define SDRAM_BANK_ADDR ((uint32_t)0x80000000U)
+/* region#0/1/2/3: kSEMC_SDRAM_CS0/1/2/3 */
+#define SDRAM_REGION kSEMC_SDRAM_CS0
+/* CS pin: kSEMC_MUXCSX0/1/2/3 */
+#define SDRAM_CS_PIN kSEMC_MUXCSX0
+/* size(kbyte):32MB = 32*1024*1KBytes */
+#define SDRAM_SIZE ((uint32_t)0x8000)
+/* data width: kSEMC_PortSize8Bit,kSEMC_PortSize16Bit */
+#define SDRAM_DATA_WIDTH kSEMC_PortSize16Bit
+/* column bit numbers: kSEMC_SdramColunm_9/10/11/12bit */
+#define SDRAM_COLUMN_BITS kSEMC_SdramColunm_9bit
+/* cas latency clock number: kSEMC_LatencyOne/Two/Three */
+#define SDRAM_CAS_LATENCY kSEMC_LatencyThree
+
+/* Timing configuration for W9825G6KH */
+/* TRP:precharge to active command time (ns) */
+#define SDRAM_TRP 18
+/* TRCD:active to read/write command delay time (ns) */
+#define SDRAM_TRCD 18
+/* The time between two refresh commands,Use the maximum of the (Trfc , Txsr).(ns) */
+#define SDRAM_REFRESH_RECOVERY 67
+/* TWR:write recovery time (ns). */
+#define SDRAM_TWR 12
+/* TRAS:active to precharge command time (ns). */
+#define SDRAM_TRAS 42
+/* TRC time (ns). */
+#define SDRAM_TRC 60
+/* active to active time (ns). */
+#define SDRAM_ACT2ACT 60
+/* refresh time (ns). 64ms */
+#define SDRAM_REFRESH_ROW 64 * 1000000 / 8192
+
+#endif /* SDRAM_PORT_H__ */
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/figures/Arch_Mix.jpg b/bsp/imxrt/imxrt1052-seeed-ArchMix/figures/Arch_Mix.jpg
new file mode 100644
index 0000000000..d430d0e19a
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/figures/Arch_Mix.jpg
Binary files differ
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/project.uvoptx b/bsp/imxrt/imxrt1052-seeed-ArchMix/project.uvoptx
new file mode 100644
index 0000000000..283fcc0e30
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/project.uvoptx
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
+
+ <SchemaVersion>1.0</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Extensions>
+ <cExt>*.c</cExt>
+ <aExt>*.s*; *.src; *.a*</aExt>
+ <oExt>*.obj; *.o</oExt>
+ <lExt>*.lib</lExt>
+ <tExt>*.txt; *.h; *.inc; *.md</tExt>
+ <pExt>*.plm</pExt>
+ <CppX>*.cpp</CppX>
+ <nMigrate>0</nMigrate>
+ </Extensions>
+
+ <DaveTm>
+ <dwLowDateTime>0</dwLowDateTime>
+ <dwHighDateTime>0</dwHighDateTime>
+ </DaveTm>
+
+ <Target>
+ <TargetName>rtthread</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>12000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>0</RunSim>
+ <RunTarget>1</RunTarget>
+ <RunAbUc>0</RunAbUc>
+ </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\List\</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>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>8</CpuCode>
+ <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>1</tRtrace>
+ <sRSysVw>1</sRSysVw>
+ <tRSysVw>1</tRSysVw>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <bEvRecOn>1</bEvRecOn>
+ <bSchkAxf>0</bSchkAxf>
+ <bTchkAxf>0</bTchkAxf>
+ <nTsel>3</nTsel>
+ <sDll></sDll>
+ <sDllPa></sDllPa>
+ <sDlgDll></sDlgDll>
+ <sDlgPa></sDlgPa>
+ <sIfile></sIfile>
+ <tDll></tDll>
+ <tDllPa></tDllPa>
+ <tDlgDll></tDlgDll>
+ <tDlgPa></tDlgPa>
+ <tIfile>.\flexspi_nor.ini</tIfile>
+ <pMon>BIN\CMSIS_AGDI.dll</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>CMSIS_AGDI</Key>
+ <Name>-X"Any" -UAny -O206 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(0BD11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC8000 -FN1 -FF0MIMXRT105x_QuadSPI_4KB_SEC.FLM -FS060000000 -FL0800000 -FP0($$Device:MIMXRT1052CVL5B$arm\MIMXRT105x_QuadSPI_4KB_SEC.FLM)</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>JL2CM3</Key>
+ <Name>-U30000299 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BD11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC8000 -FN1 -FF0MIMXRT105x_QuadSPI_4KB_SEC -FS060000000 -FL0800000 -FP0($$Device:MIMXRT1052CVL5B$arm\MIMXRT105x_QuadSPI_4KB_SEC.FLM)</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>UL2CM3</Key>
+ <Name>UL2CM3(-S0 -C0 -P0 ) -FN2 -FC8000 -FD20000000 -FF0MIMXRT105x_HYPER_256KB_SEC -FF1MIMXRT105x_QuadSPI_4KB_SEC -FL04000000 -FL1800000 -FS060000000 -FS160000000 -FP0($$Device:MIMXRT1052CVL5B$arm\MIMXRT105x_HYPER_256KB_SEC.FLM) -FP1($$Device:MIMXRT1052CVL5B$arm\MIMXRT105x_QuadSPI_4KB_SEC.FLM)</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>
+ <bLintAuto>0</bLintAuto>
+ <bAutoGenD>0</bAutoGenD>
+ <LntExFlags>0</LntExFlags>
+ <pMisraName></pMisraName>
+ <pszMrule></pszMrule>
+ <pSingCmds></pSingCmds>
+ <pMultCmds></pMultCmds>
+ <pMisraNamep></pMisraNamep>
+ <pszMrulep></pszMrulep>
+ <pSingCmdsp></pSingCmdsp>
+ <pMultCmdsp></pMultCmdsp>
+ <DebugDescription>
+ <Enable>1</Enable>
+ <EnableFlashSeq>1</EnableFlashSeq>
+ <EnableLog>0</EnableLog>
+ <Protocol>2</Protocol>
+ <DbgClock>10000000</DbgClock>
+ </DebugDescription>
+ </TargetOption>
+ </Target>
+
+</ProjectOpt>
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/project.uvprojx b/bsp/imxrt/imxrt1052-seeed-ArchMix/project.uvprojx
new file mode 100644
index 0000000000..96e2bbb2c2
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/project.uvprojx
@@ -0,0 +1,755 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
+ <SchemaVersion>2.1</SchemaVersion>
+ <Header>### uVision Project, (C) Keil Software</Header>
+ <Targets>
+ <Target>
+ <TargetName>rtthread</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <pCCUsed>5060528::V5.06 update 5 (build 528)::ARMCC</pCCUsed>
+ <uAC6>0</uAC6>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>MIMXRT1052CVL5B</Device>
+ <Vendor>NXP</Vendor>
+ <PackID>NXP.MIMXRT1052_DFP.13.0.0</PackID>
+ <PackURL>https://mcuxpresso.nxp.com/cmsis_pack/repo/</PackURL>
+ <Cpu>IRAM(0x20000000,0x020000) IRAM2(0x00000000,0x020000) XRAM(0x20200000,0x040000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE</Cpu>
+ <FlashUtilSpec />
+ <StartupFile />
+ <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN2 -FF0MIMXRT105x_HYPER_256KB_SEC -FS060000000 -FL04000000 -FF1MIMXRT105x_QuadSPI_4KB_SEC -FS160000000 -FL1800000 -FP0($$Device:MIMXRT1052CVL5B$arm\MIMXRT105x_HYPER_256KB_SEC.FLM) -FP1($$Device:MIMXRT1052CVL5B$arm\MIMXRT105x_QuadSPI_4KB_SEC.FLM))</FlashDriverDll>
+ <DeviceId>0</DeviceId>
+ <RegisterFile>$$Device:MIMXRT1052CVL5B$fsl_device_registers.h</RegisterFile>
+ <MemoryEnv />
+ <Cmp />
+ <Asm />
+ <Linker />
+ <OHString />
+ <InfinionOptionDll />
+ <SLE66CMisc />
+ <SLE66AMisc />
+ <SLE66LinkerMisc />
+ <SFDFile>$$Device:MIMXRT1052CVL5B$MIMXRT1052.xml</SFDFile>
+ <bCustSvd>0</bCustSvd>
+ <UseEnv>0</UseEnv>
+ <BinPath />
+ <IncludePath />
+ <LibPath />
+ <RegisterFilePath />
+ <DBRegisterFilePath />
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>.\build\keil\Obj\</OutputDirectory>
+ <OutputName>rtthread</OutputName>
+ <CreateExecutable>1</CreateExecutable>
+ <CreateLib>0</CreateLib>
+ <CreateHexFile>0</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>1</BrowseInformation>
+ <ListingPath>.\build\keil\List\</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>
+ <nStopB1X>0</nStopB1X>
+ <nStopB2X>0</nStopB2X>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>1</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name>fromelf --bin !L --output rtthread.bin</UserProg1Name>
+ <UserProg2Name />
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopA1X>0</nStopA1X>
+ <nStopA2X>0</nStopA2X>
+ </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> -REMAP</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM7</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments />
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM7</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ </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>1</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-M7"</AdsCpuType>
+ <RvctDeviceName />
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>0</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>1</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>3</RvdsVP>
+ <RvdsMve>0</RvdsMve>
+ <RvdsCdeCp>0</RvdsCdeCp>
+ <hadIRAM2>1</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>0</StupSel>
+ <useUlib>0</useUlib>
+ <EndSel>0</EndSel>
+ <uLtcg>0</uLtcg>
+ <nSecure>0</nSecure>
+ <RoSelD>0</RoSelD>
+ <RwSelD>4</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>0</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>0</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>0x20000</Size>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x8000</Size>
+ </IROM>
+ <XRAM>
+ <Type>1</Type>
+ <StartAddress>0x20200000</StartAddress>
+ <Size>0x40000</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>0x0</Size>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x20200000</StartAddress>
+ <Size>0x40000</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>0x20000</Size>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x20000</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>
+ <uC99>1</uC99>
+ <uGnu>0</uGnu>
+ <useXO>0</useXO>
+ <v6Lang>1</v6Lang>
+ <v6LangP>1</v6LangP>
+ <vShortEn>1</vShortEn>
+ <vShortWch>1</vShortWch>
+ <v6Lto>0</v6Lto>
+ <v6WtE>0</v6WtE>
+ <v6Rtti>0</v6Rtti>
+ <VariousControls>
+ <MiscControls>--library_interface=armcc --library_type=standardlib --diag_suppress=66,1296,186</MiscControls>
+ <Define>SKIP_SYSCLK_INIT, CPU_MIMXRT1052CVL5B, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL=1, XIP_EXTERNAL_FLASH=1, EVK_MCIMXRM</Define>
+ <Undefine />
+ <IncludePath>applications;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m7;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;board;board\MCUX_Config;board\ports;..\libraries\drivers;..\libraries\drivers\config;..\..\..\components\finsh;.;..\..\..\include;..\..\..\components\libc\compilers\common;..\libraries\MIMXRT1050\CMSIS\Include;..\libraries\MIMXRT1050\MIMXRT1052;..\libraries\MIMXRT1050\MIMXRT1052\drivers</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>
+ <useXO>0</useXO>
+ <ClangAsOpt>4</ClangAsOpt>
+ <VariousControls>
+ <MiscControls />
+ <Define />
+ <Undefine />
+ <IncludePath />
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>0</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange>0x00000000</TextAddressRange>
+ <DataAddressRange>0x10000000</DataAddressRange>
+ <pXoBase />
+ <ScatterFile>.\board\linker_scripts\link.sct</ScatterFile>
+ <IncludeLibs />
+ <IncludeLibsPath />
+ <Misc />
+ <LinkerInputFile />
+ <DisabledWarnings>6314</DisabledWarnings>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ <Groups>
+ <Group>
+ <GroupName>Applications</GroupName>
+ <Files>
+ <File>
+ <FileName>mnt.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>applications\mnt.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>main.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>applications\main.c</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>showmem.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\libcpu\arm\common\showmem.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>cpuport.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\libcpu\arm\cortex-m7\cpuport.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>context_rvds.S</FileName>
+ <FileType>2</FileType>
+ <FilePath>..\..\..\libcpu\arm\cortex-m7\context_rvds.S</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>cpu_cache.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\libcpu\arm\cortex-m7\cpu_cache.c</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>waitqueue.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\components\drivers\src\waitqueue.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>workqueue.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\components\drivers\src\workqueue.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>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>ringbuffer.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\components\drivers\src\ringbuffer.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers</GroupName>
+ <Files>
+ <File>
+ <FileName>pin_mux.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>board\MCUX_Config\pin_mux.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>board.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>board\board.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>clock_config.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>board\MCUX_Config\clock_config.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>drv_gpio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\libraries\drivers\drv_gpio.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>drv_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\libraries\drivers\drv_uart.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>
+ <Group>
+ <GroupName>Kernel</GroupName>
+ <Files>
+ <File>
+ <FileName>thread.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\src\thread.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>device.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\src\device.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>memheap.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\src\memheap.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>clock.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\src\clock.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>object.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\src\object.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>scheduler.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\src\scheduler.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>kservice.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\src\kservice.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>idle.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\src\idle.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>timer.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\src\timer.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>mempool.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\src\mempool.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>components.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\src\components.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>libc</GroupName>
+ <Files>
+ <File>
+ <FileName>time.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\components\libc\compilers\common\time.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Libraries</GroupName>
+ <Files>
+ <File>
+ <FileName>system_MIMXRT1052.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\libraries\MIMXRT1050\MIMXRT1052\system_MIMXRT1052.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>fsl_gpio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\libraries\MIMXRT1050\MIMXRT1052\drivers\fsl_gpio.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>fsl_lpuart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\libraries\MIMXRT1050\MIMXRT1052\drivers\fsl_lpuart.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>fsl_edma.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\libraries\MIMXRT1050\MIMXRT1052\drivers\fsl_edma.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>fsl_lpuart_edma.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\libraries\MIMXRT1050\MIMXRT1052\drivers\fsl_lpuart_edma.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>fsl_clock.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\libraries\MIMXRT1050\MIMXRT1052\drivers\fsl_clock.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>fsl_dmamux.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\libraries\MIMXRT1050\MIMXRT1052\drivers\fsl_dmamux.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>fsl_cache.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\libraries\MIMXRT1050\MIMXRT1052\drivers\fsl_cache.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>fsl_common.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\libraries\MIMXRT1050\MIMXRT1052\drivers\fsl_common.c</FilePath>
+ </File>
+ </Files>
+ <Files>
+ <File>
+ <FileName>startup_MIMXRT1052.s</FileName>
+ <FileType>2</FileType>
+ <FilePath>..\libraries\MIMXRT1050\MIMXRT1052\arm\startup_MIMXRT1052.s</FilePath>
+ </File>
+ </Files>
+ </Group>
+ </Groups>
+ </Target>
+ </Targets>
+ <RTE>
+ <apis />
+ <components />
+ <files />
+ </RTE>
+</Project>
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/rtconfig.h b/bsp/imxrt/imxrt1052-seeed-ArchMix/rtconfig.h
new file mode 100644
index 0000000000..e40ae0ab78
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/rtconfig.h
@@ -0,0 +1,177 @@
+#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 1000
+#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
+
+/* kservice optimization */
+
+#define RT_DEBUG
+#define RT_DEBUG_COLOR
+
+/* 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_MEMHEAP
+#define RT_USING_MEMHEAP_AS_HEAP
+#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 "uart1"
+#define RT_VER_NUM 0x40003
+
+/* 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 4096
+#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_USING_DMA
+#define RT_SERIAL_RB_BUFSZ 64
+#define RT_USING_PIN
+
+/* Using USB */
+
+
+/* POSIX layer and C standard library */
+
+#define RT_LIBC_USING_TIME
+#define RT_LIBC_FIXED_TIMEZONE 8
+
+/* 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 */
+
+
+/* Micrium: Micrium software products porting for RT-Thread */
+
+
+/* peripheral libraries and drivers */
+
+
+/* AI packages */
+
+
+/* miscellaneous packages */
+
+
+/* samples: kernel and components samples */
+
+
+/* entertainment: terminal games and other interesting software packages */
+
+
+/* Hardware Drivers Config */
+
+#define SOC_IMXRT1052CVL5B
+
+/* Onboard Peripheral Drivers */
+
+
+/* On-chip Peripheral Drivers */
+
+#define BSP_USING_DMA
+#define BSP_USING_GPIO
+#define BSP_USING_LPUART
+#define BSP_USING_LPUART1
+
+#endif
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/rtconfig.py b/bsp/imxrt/imxrt1052-seeed-ArchMix/rtconfig.py
new file mode 100644
index 0000000000..cf79de685a
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/rtconfig.py
@@ -0,0 +1,162 @@
+import os
+import sys
+
+# toolchains options
+ARCH='arm'
+CPU='cortex-m7'
+CROSS_TOOL='gcc'
+
+# bsp lib config
+BSP_LIBRARY_TYPE = None
+
+if os.getenv('RTT_CC'):
+ CROSS_TOOL = os.getenv('RTT_CC')
+if os.getenv('RTT_ROOT'):
+ RTT_ROOT = os.getenv('RTT_ROOT')
+
+# cross_tool provides the cross compiler
+# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR
+if CROSS_TOOL == 'gcc':
+ PLATFORM = 'gcc'
+ EXEC_PATH = r'C:\Users\XXYYZZ'
+elif CROSS_TOOL == 'keil':
+ PLATFORM = 'armcc'
+ EXEC_PATH = r'C:/Keil_v5'
+elif CROSS_TOOL == 'iar':
+ PLATFORM = 'iar'
+ EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0'
+
+if os.getenv('RTT_EXEC_PATH'):
+ EXEC_PATH = os.getenv('RTT_EXEC_PATH')
+
+BUILD = 'debug'
+#BUILD = 'release'
+
+if PLATFORM == 'gcc':
+ 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'
+ STRIP = PREFIX + 'strip'
+
+ DEVICE = ' -mcpu=' + CPU + ' -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections'
+ CFLAGS = DEVICE + ' -Wall -D__FPU_PRESENT -eentry'
+ AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb -D__START=entry'
+ LFLAGS = DEVICE + ' -lm -lgcc -lc' + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds'
+
+ CPATH = ''
+ LPATH = ''
+
+ if BUILD == 'debug':
+ CFLAGS += ' -gdwarf-2'
+ AFLAGS += ' -gdwarf-2'
+ CFLAGS += ' -O0'
+ else:
+ CFLAGS += ' -O2 -Os'
+
+ POST_ACTION = OBJCPY + ' -O binary --remove-section=.boot_data --remove-section=.image_vertor_table --remove-section=.ncache $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n'
+
+ # module setting
+ CXXFLAGS = ' -Woverloaded-virtual -fno-exceptions -fno-rtti '
+ M_CFLAGS = CFLAGS + ' -mlong-calls -fPIC '
+ M_CXXFLAGS = CXXFLAGS + ' -mlong-calls -fPIC'
+ M_LFLAGS = DEVICE + CXXFLAGS + ' -Wl,--gc-sections,-z,max-page-size=0x4' +\
+ ' -shared -fPIC -nostartfiles -static-libgcc'
+ M_POST_ACTION = STRIP + ' -R .hash $TARGET\n' + SIZE + ' $TARGET \n'
+
+elif PLATFORM == 'armcc':
+ CC = 'armcc'
+ CXX = 'armcc'
+ AS = 'armasm'
+ AR = 'armar'
+ LINK = 'armlink'
+ TARGET_EXT = 'axf'
+
+ DEVICE = ' --cpu ' + CPU + '.fp.sp'
+ CFLAGS = DEVICE + ' --apcs=interwork'
+ AFLAGS = DEVICE
+ LFLAGS = DEVICE + ' --libpath "' + EXEC_PATH + '\ARM\ARMCC\lib" --info sizes --info totals --info unused --info veneers --list rtthread.map --scatter "board\linker_scripts\link.sct"'
+
+ CFLAGS += ' --diag_suppress=66,1296,186,6134'
+ CFLAGS += ' -I' + EXEC_PATH + '/ARM/RV31/INC'
+ LFLAGS += ' --libpath ' + EXEC_PATH + '/ARM/RV31/LIB'
+
+ EXEC_PATH += '/arm/bin40/'
+
+ if BUILD == 'debug':
+ CFLAGS += ' -g -O0'
+ AFLAGS += ' -g'
+ else:
+ CFLAGS += ' -O2'
+
+ CXXFLAGS = CFLAGS
+ CFLAGS += ' --c99'
+
+ POST_ACTION = 'fromelf -z $TARGET'
+ # POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET'
+
+elif PLATFORM == 'iar':
+ CC = 'iccarm'
+ CXX = 'iccarm'
+ AS = 'iasmarm'
+ AR = 'iarchive'
+ LINK = 'ilinkarm'
+ TARGET_EXT = 'out'
+
+ DEVICE = ' -D__FPU_PRESENT'
+
+ 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 += ' --debug'
+ CFLAGS += ' --endian=little'
+ CFLAGS += ' --cpu=' + CPU
+ CFLAGS += ' -e'
+ CFLAGS += ' --fpu=None'
+ CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"'
+ CFLAGS += ' -Ol'
+ CFLAGS += ' --use_c++_inline'
+
+ AFLAGS = ''
+ AFLAGS += ' -s+'
+ AFLAGS += ' -w+'
+ AFLAGS += ' -r'
+ AFLAGS += ' --cpu ' + CPU
+ AFLAGS += ' --fpu None'
+
+ if BUILD == 'debug':
+ CFLAGS += ' --debug'
+ CFLAGS += ' -On'
+ else:
+ CFLAGS += ' -Oh'
+
+ LFLAGS = ' --config "board/linker_scripts/link.icf"'
+ LFLAGS += ' --redirect _Printf=_PrintfTiny'
+ LFLAGS += ' --redirect _Scanf=_ScanfSmall'
+ LFLAGS += ' --entry __iar_program_start'
+
+ CXXFLAGS = CFLAGS
+
+ EXEC_PATH = EXEC_PATH + '/arm/bin/'
+ POST_ACTION = 'ielftool --bin $TARGET rtthread.bin'
+
+
+def dist_handle(BSP_ROOT, dist_dir):
+ import sys
+ cwd_path = os.getcwd()
+ sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), 'tools'))
+ from sdk_dist import dist_do_building
+ dist_do_building(BSP_ROOT, dist_dir)
+ \ No newline at end of file
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/template.uvoptx b/bsp/imxrt/imxrt1052-seeed-ArchMix/template.uvoptx
new file mode 100644
index 0000000000..283fcc0e30
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/template.uvoptx
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
+
+ <SchemaVersion>1.0</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Extensions>
+ <cExt>*.c</cExt>
+ <aExt>*.s*; *.src; *.a*</aExt>
+ <oExt>*.obj; *.o</oExt>
+ <lExt>*.lib</lExt>
+ <tExt>*.txt; *.h; *.inc; *.md</tExt>
+ <pExt>*.plm</pExt>
+ <CppX>*.cpp</CppX>
+ <nMigrate>0</nMigrate>
+ </Extensions>
+
+ <DaveTm>
+ <dwLowDateTime>0</dwLowDateTime>
+ <dwHighDateTime>0</dwHighDateTime>
+ </DaveTm>
+
+ <Target>
+ <TargetName>rtthread</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>12000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>0</RunSim>
+ <RunTarget>1</RunTarget>
+ <RunAbUc>0</RunAbUc>
+ </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\List\</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>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>8</CpuCode>
+ <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>1</tRtrace>
+ <sRSysVw>1</sRSysVw>
+ <tRSysVw>1</tRSysVw>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <bEvRecOn>1</bEvRecOn>
+ <bSchkAxf>0</bSchkAxf>
+ <bTchkAxf>0</bTchkAxf>
+ <nTsel>3</nTsel>
+ <sDll></sDll>
+ <sDllPa></sDllPa>
+ <sDlgDll></sDlgDll>
+ <sDlgPa></sDlgPa>
+ <sIfile></sIfile>
+ <tDll></tDll>
+ <tDllPa></tDllPa>
+ <tDlgDll></tDlgDll>
+ <tDlgPa></tDlgPa>
+ <tIfile>.\flexspi_nor.ini</tIfile>
+ <pMon>BIN\CMSIS_AGDI.dll</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>CMSIS_AGDI</Key>
+ <Name>-X"Any" -UAny -O206 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(0BD11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC8000 -FN1 -FF0MIMXRT105x_QuadSPI_4KB_SEC.FLM -FS060000000 -FL0800000 -FP0($$Device:MIMXRT1052CVL5B$arm\MIMXRT105x_QuadSPI_4KB_SEC.FLM)</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>JL2CM3</Key>
+ <Name>-U30000299 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BD11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC8000 -FN1 -FF0MIMXRT105x_QuadSPI_4KB_SEC -FS060000000 -FL0800000 -FP0($$Device:MIMXRT1052CVL5B$arm\MIMXRT105x_QuadSPI_4KB_SEC.FLM)</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>UL2CM3</Key>
+ <Name>UL2CM3(-S0 -C0 -P0 ) -FN2 -FC8000 -FD20000000 -FF0MIMXRT105x_HYPER_256KB_SEC -FF1MIMXRT105x_QuadSPI_4KB_SEC -FL04000000 -FL1800000 -FS060000000 -FS160000000 -FP0($$Device:MIMXRT1052CVL5B$arm\MIMXRT105x_HYPER_256KB_SEC.FLM) -FP1($$Device:MIMXRT1052CVL5B$arm\MIMXRT105x_QuadSPI_4KB_SEC.FLM)</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>
+ <bLintAuto>0</bLintAuto>
+ <bAutoGenD>0</bAutoGenD>
+ <LntExFlags>0</LntExFlags>
+ <pMisraName></pMisraName>
+ <pszMrule></pszMrule>
+ <pSingCmds></pSingCmds>
+ <pMultCmds></pMultCmds>
+ <pMisraNamep></pMisraNamep>
+ <pszMrulep></pszMrulep>
+ <pSingCmdsp></pSingCmdsp>
+ <pMultCmdsp></pMultCmdsp>
+ <DebugDescription>
+ <Enable>1</Enable>
+ <EnableFlashSeq>1</EnableFlashSeq>
+ <EnableLog>0</EnableLog>
+ <Protocol>2</Protocol>
+ <DbgClock>10000000</DbgClock>
+ </DebugDescription>
+ </TargetOption>
+ </Target>
+
+</ProjectOpt>
diff --git a/bsp/imxrt/imxrt1052-seeed-ArchMix/template.uvprojx b/bsp/imxrt/imxrt1052-seeed-ArchMix/template.uvprojx
new file mode 100644
index 0000000000..794ecf4f95
--- /dev/null
+++ b/bsp/imxrt/imxrt1052-seeed-ArchMix/template.uvprojx
@@ -0,0 +1,391 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
+
+ <SchemaVersion>2.1</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Targets>
+ <Target>
+ <TargetName>rtthread</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <pCCUsed>5060528::V5.06 update 5 (build 528)::ARMCC</pCCUsed>
+ <uAC6>0</uAC6>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>MIMXRT1052CVL5B</Device>
+ <Vendor>NXP</Vendor>
+ <PackID>NXP.MIMXRT1052_DFP.13.0.0</PackID>
+ <PackURL>https://mcuxpresso.nxp.com/cmsis_pack/repo/</PackURL>
+ <Cpu>IRAM(0x20000000,0x020000) IRAM2(0x00000000,0x020000) XRAM(0x20200000,0x040000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE</Cpu>
+ <FlashUtilSpec></FlashUtilSpec>
+ <StartupFile></StartupFile>
+ <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN2 -FF0MIMXRT105x_HYPER_256KB_SEC -FS060000000 -FL04000000 -FF1MIMXRT105x_QuadSPI_4KB_SEC -FS160000000 -FL1800000 -FP0($$Device:MIMXRT1052CVL5B$arm\MIMXRT105x_HYPER_256KB_SEC.FLM) -FP1($$Device:MIMXRT1052CVL5B$arm\MIMXRT105x_QuadSPI_4KB_SEC.FLM))</FlashDriverDll>
+ <DeviceId>0</DeviceId>
+ <RegisterFile>$$Device:MIMXRT1052CVL5B$fsl_device_registers.h</RegisterFile>
+ <MemoryEnv></MemoryEnv>
+ <Cmp></Cmp>
+ <Asm></Asm>
+ <Linker></Linker>
+ <OHString></OHString>
+ <InfinionOptionDll></InfinionOptionDll>
+ <SLE66CMisc></SLE66CMisc>
+ <SLE66AMisc></SLE66AMisc>
+ <SLE66LinkerMisc></SLE66LinkerMisc>
+ <SFDFile>$$Device:MIMXRT1052CVL5B$MIMXRT1052.xml</SFDFile>
+ <bCustSvd>0</bCustSvd>
+ <UseEnv>0</UseEnv>
+ <BinPath></BinPath>
+ <IncludePath></IncludePath>
+ <LibPath></LibPath>
+ <RegisterFilePath></RegisterFilePath>
+ <DBRegisterFilePath></DBRegisterFilePath>
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>.\build\keil\Obj\</OutputDirectory>
+ <OutputName>rtthread</OutputName>
+ <CreateExecutable>1</CreateExecutable>
+ <CreateLib>0</CreateLib>
+ <CreateHexFile>0</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>1</BrowseInformation>
+ <ListingPath>.\build\keil\List\</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>
+ <nStopB1X>0</nStopB1X>
+ <nStopB2X>0</nStopB2X>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>1</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name>fromelf --bin !L --output rtthread.bin</UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopA1X>0</nStopA1X>
+ <nStopA2X>0</nStopA2X>
+ </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> -REMAP</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM7</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments></TargetDllArguments>
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM7</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ </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>1</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-M7"</AdsCpuType>
+ <RvctDeviceName></RvctDeviceName>
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>0</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>1</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>3</RvdsVP>
+ <RvdsMve>0</RvdsMve>
+ <RvdsCdeCp>0</RvdsCdeCp>
+ <hadIRAM2>1</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>0</StupSel>
+ <useUlib>0</useUlib>
+ <EndSel>0</EndSel>
+ <uLtcg>0</uLtcg>
+ <nSecure>0</nSecure>
+ <RoSelD>0</RoSelD>
+ <RwSelD>4</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>0</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>0</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>0x20000</Size>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x8000</Size>
+ </IROM>
+ <XRAM>
+ <Type>1</Type>
+ <StartAddress>0x20200000</StartAddress>
+ <Size>0x40000</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>0x0</Size>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x20200000</StartAddress>
+ <Size>0x40000</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>0x20000</Size>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x20000</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>
+ <uC99>1</uC99>
+ <uGnu>0</uGnu>
+ <useXO>0</useXO>
+ <v6Lang>1</v6Lang>
+ <v6LangP>1</v6LangP>
+ <vShortEn>1</vShortEn>
+ <vShortWch>1</vShortWch>
+ <v6Lto>0</v6Lto>
+ <v6WtE>0</v6WtE>
+ <v6Rtti>0</v6Rtti>
+ <VariousControls>
+ <MiscControls>--library_interface=armcc --library_type=standardlib --diag_suppress=66,1296,186</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>
+ <useXO>0</useXO>
+ <ClangAsOpt>4</ClangAsOpt>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>0</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange>0x00000000</TextAddressRange>
+ <DataAddressRange>0x10000000</DataAddressRange>
+ <pXoBase></pXoBase>
+ <ScatterFile>.\board\linker_scripts\link.sct</ScatterFile>
+ <IncludeLibs></IncludeLibs>
+ <IncludeLibsPath></IncludeLibsPath>
+ <Misc></Misc>
+ <LinkerInputFile></LinkerInputFile>
+ <DisabledWarnings>6314</DisabledWarnings>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ </Target>
+ </Targets>
+
+ <RTE>
+ <apis/>
+ <components/>
+ <files/>
+ </RTE>
+
+</Project>
diff --git a/bsp/imxrt/libraries/MIMXRT1050/SConscript b/bsp/imxrt/libraries/MIMXRT1050/SConscript
index 7f8f971b82..75fde95bc1 100644
--- a/bsp/imxrt/libraries/MIMXRT1050/SConscript
+++ b/bsp/imxrt/libraries/MIMXRT1050/SConscript
@@ -73,8 +73,8 @@ if GetDepend(['BSP_USING_DMA']):
src += ['MIMXRT1052/drivers/fsl_dmamux.c']
src += ['MIMXRT1052/drivers/fsl_edma.c']
src += ['MIMXRT1052/drivers/fsl_lpuart_edma.c']
- src += ['MIMXRT1052/drivers/fsl_lpspi_edma.c']
-
+ if GetDepend(['BSP_USING_SPI']):
+ src += ['MIMXRT1052/drivers/fsl_lpspi_edma.c']
if rtconfig.CROSS_TOOL == 'gcc':
group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, ASFLAGS = '$ASFLAGS -D __STARTUP_CLEAR_BSS')
diff --git a/bsp/swm320/libraries/CMSIS/DeviceSupport/SWM320.h b/bsp/swm320/libraries/CMSIS/DeviceSupport/SWM320.h
index 55eb7812f0..5aa6db83fa 100644
--- a/bsp/swm320/libraries/CMSIS/DeviceSupport/SWM320.h
+++ b/bsp/swm320/libraries/CMSIS/DeviceSupport/SWM320.h
@@ -1716,7 +1716,8 @@ typedef struct
__IO uint32_t LINCR;
- union {
+ union
+ {
__IO uint32_t CTSCR;
__IO uint32_t RTSCR;
@@ -2690,7 +2691,7 @@ typedef struct
__I uint32_t SR; //Status Register
- __I uint32_t IF; //Interrupt Flag
+ __I uint32_t IF; //Interrupt Flag,读取清零
__IO uint32_t IE; //Interrupt Enable
@@ -2712,7 +2713,8 @@ typedef struct
__IO uint32_t TXERR; //TX错误计数
- union {
+ union
+ {
struct
{ //在复位时可读写,正常工作模式下不可访问
__IO uint32_t ACR[4]; //Acceptance Check Register, 验收寄存器
@@ -2722,7 +2724,8 @@ typedef struct
uint32_t RESERVED[5];
} FILTER;
- union { //在正常工作模式下可读写,复位时不可访问
+ union
+ { //在正常工作模式下可读写,复位时不可访问
struct
{
__O uint32_t INFO;
@@ -2869,8 +2872,6 @@ typedef struct
__IO uint32_t PRECMDV; //在MPU接口中,发送数据前,RS拉低的那一拍,数据总线上的值
} LCD_TypeDef;
-#define LCD_START_MPUEN_Pos 0 //0 RGB接口 1 MPU接口
-#define LCD_START_MPUEN_Msk (0x01 << LCD_START_MPUEN_Pos)
#define LCD_START_GO_Pos 1 //写1开始传输数据,数据传输结束后自动清零
#define LCD_START_GO_Msk (0x01 << LCD_START_GO_Pos)
#define LCD_START_BURST_Pos 2
@@ -3120,7 +3121,7 @@ typedef struct
{
__IO uint32_t DATA;
__IO uint32_t ADDR;
- __IO uint32_t _ERASE; //和mmcsd_cmd.h(59)名字冲突,这里修改为_ERASE
+ __IO uint32_t ERASE;
__IO uint32_t CACHE;
__IO uint32_t CFG0;
__IO uint32_t CFG1;
diff --git a/bsp/swm320/libraries/CMSIS/DeviceSupport/startup/arm/startup_SWM320.s b/bsp/swm320/libraries/CMSIS/DeviceSupport/startup/arm/startup_SWM320.s
index 72562473f2..db1c455bf9 100644
--- a/bsp/swm320/libraries/CMSIS/DeviceSupport/startup/arm/startup_SWM320.s
+++ b/bsp/swm320/libraries/CMSIS/DeviceSupport/startup/arm/startup_SWM320.s
@@ -1,10 +1,10 @@
;******************************************************************************************************************************************
-; �����: startup_SWM320.s
-; ����˵��: SWM2400��Ƭ���������ļ�
-; ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-; ע������:
-; �汾����: V1.1.0 2017��10��25��
-; ������¼:
+; 文件名称: startup_SWM320.s
+; 功能说明: SWM2400单片机的启动文件
+; 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+; 注意事项:
+; 版本日期: V1.1.0 2017年10月25日
+; 升级记录:
;
;
;******************************************************************************************************************************************
@@ -79,7 +79,7 @@ __Vectors DCD __initial_sp ; Top of Stack
DCD GPIOA5_Handler
DCD GPIOA6_Handler
DCD GPIOA7_Handler
- DCD GPIOB0_Handler
+ DCD GPIOB0_Handler
DCD GPIOB1_Handler
DCD GPIOB2_Handler
DCD GPIOB3_Handler
@@ -103,19 +103,19 @@ __Vectors DCD __initial_sp ; Top of Stack
DCD GPIOM5_Handler
DCD GPIOM6_Handler
DCD GPIOM7_Handler
- DCD DMA_Handler
+ DCD DMA_Handler
DCD LCD_Handler
DCD NORFLC_Handler
- DCD CAN_Handler
+ DCD CAN_Handler
DCD PULSE_Handler
DCD WDT_Handler
DCD PWM_Handler
DCD UART0_Handler
- DCD UART1_Handler
- DCD UART2_Handler
- DCD UART3_Handler
- DCD 0
- DCD I2C0_Handler
+ DCD UART1_Handler
+ DCD UART2_Handler
+ DCD UART3_Handler
+ DCD 0
+ DCD I2C0_Handler
DCD I2C1_Handler
DCD SPI0_Handler
DCD ADC0_Handler
@@ -130,13 +130,13 @@ __Vectors DCD __initial_sp ; Top of Stack
DCD GPIOP_Handler
DCD ADC1_Handler
DCD FPU_Handler
- DCD SPI1_Handler
- DCD TIMR0_Handler
- DCD TIMR1_Handler
- DCD TIMR2_Handler
- DCD TIMR3_Handler
- DCD TIMR4_Handler
- DCD TIMR5_Handler
+ DCD SPI1_Handler
+ DCD TIMR0_Handler
+ DCD TIMR1_Handler
+ DCD TIMR2_Handler
+ DCD TIMR3_Handler
+ DCD TIMR4_Handler
+ DCD TIMR5_Handler
__Vectors_End
diff --git a/bsp/swm320/libraries/CMSIS/DeviceSupport/startup/gcc/startup_SWM320.s b/bsp/swm320/libraries/CMSIS/DeviceSupport/startup/gcc/startup_SWM320.s
index 9d8742e969..1a59a2318a 100644
--- a/bsp/swm320/libraries/CMSIS/DeviceSupport/startup/gcc/startup_SWM320.s
+++ b/bsp/swm320/libraries/CMSIS/DeviceSupport/startup/gcc/startup_SWM320.s
@@ -113,7 +113,7 @@ __isr_vector:
.long TIMR4_Handler
.long TIMR5_Handler
- .section .text.Reset_Handler
+ .section .text.Reset_Handler
.align 2
.globl Reset_Handler
.type Reset_Handler, %function
diff --git a/bsp/swm320/libraries/CMSIS/DeviceSupport/startup/iar/startup_SWM320.s b/bsp/swm320/libraries/CMSIS/DeviceSupport/startup/iar/startup_SWM320.s
index 7463384892..a7a4d89f50 100644
--- a/bsp/swm320/libraries/CMSIS/DeviceSupport/startup/iar/startup_SWM320.s
+++ b/bsp/swm320/libraries/CMSIS/DeviceSupport/startup/iar/startup_SWM320.s
@@ -84,7 +84,7 @@ __vector_table
DCD DMA_Handler
DCD LCD_Handler
DCD NORFLC_Handler
- DCD CAN_Handler
+ DCD CAN_Handler
DCD PULSE_Handler
DCD WDT_Handler
DCD PWM_Handler
diff --git a/bsp/swm320/libraries/CMSIS/DeviceSupport/system_SWM320.c b/bsp/swm320/libraries/CMSIS/DeviceSupport/system_SWM320.c
index c367b17d11..0797d828f9 100644
--- a/bsp/swm320/libraries/CMSIS/DeviceSupport/system_SWM320.c
+++ b/bsp/swm320/libraries/CMSIS/DeviceSupport/system_SWM320.c
@@ -1,18 +1,18 @@
-/******************************************************************************************************************************************
+/******************************************************************************************************************************************
* 文件名称: system_SWM320.c
* 功能说明: SWM320单片机的时钟设置
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
-* 升级记录:
+* 升级记录:
*
*
*******************************************************************************************************************************************
* @attention
*
-* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
-* REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
-* FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
+* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
+* REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
+* FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
* OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
* -ECTION WITH THEIR PRODUCTS.
*
@@ -43,7 +43,7 @@
/********************************** PLL 设定 **********************************************
* VCO输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV
- * PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
+ * PLL输出频率 = PLL输入时钟 / INDIV * 4 * FBDIV / OUTDIV = VCO输出频率 / OUTDIV
*****************************************************************************************/
#define SYS_PLL_SRC SYS_CLK_20MHz //可取值SYS_CLK_20MHz、SYS_CLK_XTAL
@@ -60,12 +60,12 @@
uint32_t SystemCoreClock = __HSI; //System Clock Frequency (Core Clock)
uint32_t CyclesPerUs = (__HSI / 1000000); //Cycles per micro second
-/******************************************************************************************************************************************
-* 函数名称:
+/******************************************************************************************************************************************
+* 函数名称:
* 功能说明: This function is used to update the variable SystemCoreClock and must be called whenever the core clock is changed
-* 输 入:
-* 输 出:
-* 注意事项:
+* 输 入:
+* 输 出:
+* 注意事项:
******************************************************************************************************************************************/
void SystemCoreClockUpdate(void)
{
@@ -114,17 +114,19 @@ void SystemCoreClockUpdate(void)
CyclesPerUs = SystemCoreClock / 1000000;
}
-/******************************************************************************************************************************************
-* 函数名称:
+/******************************************************************************************************************************************
+* 函数名称:
* 功能说明: The necessary initializaiton of systerm
-* 输 入:
-* 输 出:
-* 注意事项:
+* 输 入:
+* 输 出:
+* 注意事项:
******************************************************************************************************************************************/
void SystemInit(void)
{
SYS->CLKEN |= (1 << SYS_CLKEN_ANAC_Pos);
+ Flash_Param_at_xMHz(120);
+
switch (SYS_CLK)
{
case SYS_CLK_20MHz: //0 内部高频20MHz RC振荡器
@@ -152,6 +154,23 @@ void SystemInit(void)
SYS->CLKDIV |= (SYS_CLK_DIV << SYS_CLKDIV_SYS_Pos);
SystemCoreClockUpdate();
+
+ if (SystemCoreClock > 80000000)
+ {
+ Flash_Param_at_xMHz(120);
+ }
+ else if (SystemCoreClock > 40000000)
+ {
+ Flash_Param_at_xMHz(80);
+ }
+ else if (SystemCoreClock > 30000000)
+ {
+ Flash_Param_at_xMHz(40);
+ }
+ else
+ {
+ Flash_Param_at_xMHz(30);
+ }
}
void switchCLK_20MHz(void)
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.c
index 7f5f64e84e..983b4bcff1 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_adc.c
-* ����˵��: SWM320��Ƭ����ADC��ģת��������������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_adc.c
+* 功能说明: SWM320单片机的ADC数模转换器功能驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*******************************************************************************************************************************************
* @attention
*
@@ -19,492 +19,507 @@
#include "SWM320.h"
#include "SWM320_adc.h"
-
/******************************************************************************************************************************************
-* ��������: ADC_Init()
-* ����˵��: ADCģ��ת������ʼ��
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����Чֵ����ADC0��ADC1
-* ADC_InitStructure * initStruct ����ADC����ض�ֵ�Ľṹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_Init()
+* 功能说明: ADC模数转换器初始化
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,有效值包括ADC0、ADC1
+* ADC_InitStructure * initStruct 包含ADC各相关定值的结构体
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct)
+void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct)
{
- switch((uint32_t)ADCx)
- {
- case ((uint32_t)ADC0):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_ADC0_Pos);
- break;
-
- case ((uint32_t)ADC1):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_ADC1_Pos);
- break;
- }
-
- ADC_Close(ADCx); //һЩ�ؼ��Ĵ���ֻ����ADC�ر�ʱ����
-
- if(initStruct->clk_src == ADC_CLKSRC_HRC)
- {
- ADCx->CTRL |= (1 << ADC_CTRL_CLKSRC_Pos);
-
- ADCx->CTRL2 &= ~ADC_CTRL2_CLKDIV_Msk;
- ADCx->CTRL2 |= (initStruct->clk_div << ADC_CTRL2_CLKDIV_Pos);
- }
- else
- {
- if(SYS->PLLCR & SYS_PLLCR_OFF_Msk) PLLInit();
-
- ADCx->CTRL &= ~(1 << ADC_CTRL_CLKSRC_Pos);
-
- SYS->PLLDIV &= ~SYS_PLLDIV_ADVCO_Msk;
- SYS->PLLDIV |= ((initStruct->clk_src - 2) << SYS_PLLDIV_ADVCO_Pos);
-
- SYS->PLLDIV &= ~SYS_PLLDIV_ADDIV_Msk;
- SYS->PLLDIV |= (initStruct->clk_div << SYS_PLLDIV_ADDIV_Pos);
- }
-
- ADCx->CALIBSET = (ADCx == ADC0) ? SYS->BKP[0] : SYS->BKP[1];
- ADCx->CALIBEN = (1 << ADC_CALIBEN_OFFSET_Pos) | (1 << ADC_CALIBEN_K_Pos);
-
- ADCx->CTRL2 &= ~(ADC_CTRL2_ADCEVCM_Msk | ADC_CTRL2_PGAIVCM_Msk | ADC_CTRL2_PGAGAIN_Msk | ADC_CTRL2_PGAVCM_Msk);
- ADCx->CTRL2 |= (0 << ADC_CTRL2_ADCEVCM_Pos) |
- (initStruct->pga_ref << ADC_CTRL2_PGAIVCM_Pos) |
- (6 << ADC_CTRL2_PGAGAIN_Pos) |
- ((uint32_t)6 << ADC_CTRL2_PGAVCM_Pos);
-
- ADCx->CTRL &= ~( 0xFF << ADC_CTRL_CH0_Pos);
- ADCx->CTRL |= (initStruct->channels << ADC_CTRL_CH0_Pos);
-
- ADCx->CTRL &= ~(ADC_CTRL_AVG_Msk | ADC_CTRL_TRIG_Msk | ADC_CTRL_CONT_Msk);
- ADCx->CTRL |= (initStruct->samplAvg << ADC_CTRL_AVG_Pos) |
- (initStruct->trig_src << ADC_CTRL_TRIG_Pos) |
- (initStruct->Continue << ADC_CTRL_CONT_Pos);
-
- ADCx->IF = 0xFFFFFFFF; //����жϱ�־
-
- ADCx->IE &= ~(ADC_IE_CH0EOC_Msk | ADC_IE_CH1EOC_Msk | ADC_IE_CH2EOC_Msk | ADC_IE_CH3EOC_Msk |
- ADC_IE_CH4EOC_Msk | ADC_IE_CH5EOC_Msk | ADC_IE_CH6EOC_Msk | ADC_IE_CH7EOC_Msk);
- ADCx->IE |= (((initStruct->EOC_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0EOC_Pos) |
- (((initStruct->EOC_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1EOC_Pos) |
- (((initStruct->EOC_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2EOC_Pos) |
- (((initStruct->EOC_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3EOC_Pos) |
- (((initStruct->EOC_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4EOC_Pos) |
- (((initStruct->EOC_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5EOC_Pos) |
- (((initStruct->EOC_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6EOC_Pos) |
- (((initStruct->EOC_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7EOC_Pos);
-
- ADCx->IE &= ~(ADC_IE_CH0OVF_Msk | ADC_IE_CH1OVF_Msk | ADC_IE_CH2OVF_Msk | ADC_IE_CH3OVF_Msk |
- ADC_IE_CH4OVF_Msk | ADC_IE_CH5OVF_Msk | ADC_IE_CH6OVF_Msk | ADC_IE_CH7OVF_Msk);
- ADCx->IE |= (((initStruct->OVF_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0OVF_Pos) |
- (((initStruct->OVF_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1OVF_Pos) |
- (((initStruct->OVF_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2OVF_Pos) |
- (((initStruct->OVF_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3OVF_Pos) |
- (((initStruct->OVF_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4OVF_Pos) |
- (((initStruct->OVF_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5OVF_Pos) |
- (((initStruct->OVF_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6OVF_Pos) |
- (((initStruct->OVF_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7OVF_Pos);
-
- ADCx->IE &= ~(ADC_IE_CH0HFULL_Msk | ADC_IE_CH1HFULL_Msk | ADC_IE_CH2HFULL_Msk | ADC_IE_CH3HFULL_Msk |
- ADC_IE_CH4HFULL_Msk | ADC_IE_CH5HFULL_Msk | ADC_IE_CH6HFULL_Msk | ADC_IE_CH7HFULL_Msk);
- ADCx->IE |= (((initStruct->HFULL_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0HFULL_Pos) |
- (((initStruct->HFULL_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1HFULL_Pos) |
- (((initStruct->HFULL_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2HFULL_Pos) |
- (((initStruct->HFULL_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3HFULL_Pos) |
- (((initStruct->HFULL_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4HFULL_Pos) |
- (((initStruct->HFULL_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5HFULL_Pos) |
- (((initStruct->HFULL_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6HFULL_Pos) |
- (((initStruct->HFULL_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7HFULL_Pos);
-
- ADCx->IE &= ~(uint32_t)(ADC_IE_CH0FULL_Msk | ADC_IE_CH1FULL_Msk | ADC_IE_CH2FULL_Msk | ADC_IE_CH3FULL_Msk |
- ADC_IE_CH4FULL_Msk | ADC_IE_CH5FULL_Msk | ADC_IE_CH6FULL_Msk | ADC_IE_CH7FULL_Msk);
- ADCx->IE |= (((initStruct->FULL_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0FULL_Pos) |
- (((initStruct->FULL_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1FULL_Pos) |
- (((initStruct->FULL_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2FULL_Pos) |
- (((initStruct->FULL_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3FULL_Pos) |
- (((initStruct->FULL_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4FULL_Pos) |
- (((initStruct->FULL_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5FULL_Pos) |
- (((initStruct->FULL_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6FULL_Pos) |
- (((initStruct->FULL_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7FULL_Pos);
-
- switch((uint32_t)ADCx)
- {
- case ((uint32_t)ADC0):
- if(initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
- {
- NVIC_EnableIRQ(ADC0_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(ADC0_IRQn);
- }
- break;
-
- case ((uint32_t)ADC1):
- if(initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
- {
- NVIC_EnableIRQ(ADC1_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(ADC1_IRQn);
- }
- break;
- }
+ switch ((uint32_t)ADCx)
+ {
+ case ((uint32_t)ADC0):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_ADC0_Pos);
+ break;
+
+ case ((uint32_t)ADC1):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_ADC1_Pos);
+ break;
+ }
+
+ ADC_Close(ADCx); //一些关键寄存器只能在ADC关闭时设置
+
+ if (initStruct->clk_src == ADC_CLKSRC_HRC)
+ {
+ ADCx->CTRL |= (1 << ADC_CTRL_CLKSRC_Pos);
+
+ ADCx->CTRL2 &= ~ADC_CTRL2_CLKDIV_Msk;
+ ADCx->CTRL2 |= (initStruct->clk_div << ADC_CTRL2_CLKDIV_Pos);
+ }
+ else
+ {
+ if (SYS->PLLCR & SYS_PLLCR_OFF_Msk)
+ PLLInit();
+
+ ADCx->CTRL &= ~(1 << ADC_CTRL_CLKSRC_Pos);
+
+ SYS->PLLDIV &= ~SYS_PLLDIV_ADVCO_Msk;
+ SYS->PLLDIV |= ((initStruct->clk_src - 2) << SYS_PLLDIV_ADVCO_Pos);
+
+ SYS->PLLDIV &= ~SYS_PLLDIV_ADDIV_Msk;
+ SYS->PLLDIV |= (initStruct->clk_div << SYS_PLLDIV_ADDIV_Pos);
+ }
+
+ ADCx->CALIBSET = (ADCx == ADC0) ? SYS->BKP[0] : SYS->BKP[1];
+ ADCx->CALIBEN = (1 << ADC_CALIBEN_OFFSET_Pos) | (1 << ADC_CALIBEN_K_Pos);
+
+ ADCx->CTRL2 &= ~(ADC_CTRL2_ADCEVCM_Msk | ADC_CTRL2_PGAIVCM_Msk | ADC_CTRL2_PGAGAIN_Msk | ADC_CTRL2_PGAVCM_Msk);
+ ADCx->CTRL2 |= (0 << ADC_CTRL2_ADCEVCM_Pos) |
+ (initStruct->pga_ref << ADC_CTRL2_PGAIVCM_Pos) |
+ (6 << ADC_CTRL2_PGAGAIN_Pos) |
+ ((uint32_t)6 << ADC_CTRL2_PGAVCM_Pos);
+
+ ADCx->CTRL &= ~(0xFF << ADC_CTRL_CH0_Pos);
+ ADCx->CTRL |= (initStruct->channels << ADC_CTRL_CH0_Pos);
+
+ ADCx->CTRL &= ~(ADC_CTRL_AVG_Msk | ADC_CTRL_TRIG_Msk | ADC_CTRL_CONT_Msk);
+ ADCx->CTRL |= (initStruct->samplAvg << ADC_CTRL_AVG_Pos) |
+ (initStruct->trig_src << ADC_CTRL_TRIG_Pos) |
+ (initStruct->Continue << ADC_CTRL_CONT_Pos);
+
+ ADCx->IF = 0xFFFFFFFF; //清除中断标志
+
+ ADCx->IE &= ~(ADC_IE_CH0EOC_Msk | ADC_IE_CH1EOC_Msk | ADC_IE_CH2EOC_Msk | ADC_IE_CH3EOC_Msk |
+ ADC_IE_CH4EOC_Msk | ADC_IE_CH5EOC_Msk | ADC_IE_CH6EOC_Msk | ADC_IE_CH7EOC_Msk);
+ ADCx->IE |= (((initStruct->EOC_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0EOC_Pos) |
+ (((initStruct->EOC_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1EOC_Pos) |
+ (((initStruct->EOC_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2EOC_Pos) |
+ (((initStruct->EOC_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3EOC_Pos) |
+ (((initStruct->EOC_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4EOC_Pos) |
+ (((initStruct->EOC_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5EOC_Pos) |
+ (((initStruct->EOC_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6EOC_Pos) |
+ (((initStruct->EOC_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7EOC_Pos);
+
+ ADCx->IE &= ~(ADC_IE_CH0OVF_Msk | ADC_IE_CH1OVF_Msk | ADC_IE_CH2OVF_Msk | ADC_IE_CH3OVF_Msk |
+ ADC_IE_CH4OVF_Msk | ADC_IE_CH5OVF_Msk | ADC_IE_CH6OVF_Msk | ADC_IE_CH7OVF_Msk);
+ ADCx->IE |= (((initStruct->OVF_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0OVF_Pos) |
+ (((initStruct->OVF_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1OVF_Pos) |
+ (((initStruct->OVF_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2OVF_Pos) |
+ (((initStruct->OVF_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3OVF_Pos) |
+ (((initStruct->OVF_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4OVF_Pos) |
+ (((initStruct->OVF_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5OVF_Pos) |
+ (((initStruct->OVF_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6OVF_Pos) |
+ (((initStruct->OVF_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7OVF_Pos);
+
+ ADCx->IE &= ~(ADC_IE_CH0HFULL_Msk | ADC_IE_CH1HFULL_Msk | ADC_IE_CH2HFULL_Msk | ADC_IE_CH3HFULL_Msk |
+ ADC_IE_CH4HFULL_Msk | ADC_IE_CH5HFULL_Msk | ADC_IE_CH6HFULL_Msk | ADC_IE_CH7HFULL_Msk);
+ ADCx->IE |= (((initStruct->HFULL_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0HFULL_Pos) |
+ (((initStruct->HFULL_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1HFULL_Pos) |
+ (((initStruct->HFULL_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2HFULL_Pos) |
+ (((initStruct->HFULL_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3HFULL_Pos) |
+ (((initStruct->HFULL_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4HFULL_Pos) |
+ (((initStruct->HFULL_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5HFULL_Pos) |
+ (((initStruct->HFULL_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6HFULL_Pos) |
+ (((initStruct->HFULL_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7HFULL_Pos);
+
+ ADCx->IE &= ~(uint32_t)(ADC_IE_CH0FULL_Msk | ADC_IE_CH1FULL_Msk | ADC_IE_CH2FULL_Msk | ADC_IE_CH3FULL_Msk |
+ ADC_IE_CH4FULL_Msk | ADC_IE_CH5FULL_Msk | ADC_IE_CH6FULL_Msk | ADC_IE_CH7FULL_Msk);
+ ADCx->IE |= (((initStruct->FULL_IEn & ADC_CH0) ? 1 : 0) << ADC_IE_CH0FULL_Pos) |
+ (((initStruct->FULL_IEn & ADC_CH1) ? 1 : 0) << ADC_IE_CH1FULL_Pos) |
+ (((initStruct->FULL_IEn & ADC_CH2) ? 1 : 0) << ADC_IE_CH2FULL_Pos) |
+ (((initStruct->FULL_IEn & ADC_CH3) ? 1 : 0) << ADC_IE_CH3FULL_Pos) |
+ (((initStruct->FULL_IEn & ADC_CH4) ? 1 : 0) << ADC_IE_CH4FULL_Pos) |
+ (((initStruct->FULL_IEn & ADC_CH5) ? 1 : 0) << ADC_IE_CH5FULL_Pos) |
+ (((initStruct->FULL_IEn & ADC_CH6) ? 1 : 0) << ADC_IE_CH6FULL_Pos) |
+ (((initStruct->FULL_IEn & ADC_CH7) ? 1 : 0) << ADC_IE_CH7FULL_Pos);
+
+ switch ((uint32_t)ADCx)
+ {
+ case ((uint32_t)ADC0):
+ if (initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
+ {
+ NVIC_EnableIRQ(ADC0_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(ADC0_IRQn);
+ }
+ break;
+
+ case ((uint32_t)ADC1):
+ if (initStruct->EOC_IEn | initStruct->OVF_IEn | initStruct->HFULL_IEn | initStruct->FULL_IEn)
+ {
+ NVIC_EnableIRQ(ADC1_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(ADC1_IRQn);
+ }
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: ADC_Open()
-* ����˵��: ADC����������������������Ӳ������ADCת��
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_Open()
+* 功能说明: ADC开启,可以软件启动、或硬件触发ADC转换
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_Open(ADC_TypeDef * ADCx)
+void ADC_Open(ADC_TypeDef *ADCx)
{
- ADCx->CTRL |= (0x01 << ADC_CTRL_EN_Pos);
+ ADCx->CTRL |= (0x01 << ADC_CTRL_EN_Pos);
}
/******************************************************************************************************************************************
-* ��������: ADC_Close()
-* ����˵��: ADC�رգ��޷�������������Ӳ������ADCת��
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_Close()
+* 功能说明: ADC关闭,无法软件启动、或硬件触发ADC转换
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_Close(ADC_TypeDef * ADCx)
+void ADC_Close(ADC_TypeDef *ADCx)
{
- ADCx->CTRL &= ~(0x01 << ADC_CTRL_EN_Pos);
+ ADCx->CTRL &= ~(0x01 << ADC_CTRL_EN_Pos);
}
/******************************************************************************************************************************************
-* ��������: ADC_Start()
-* ����˵��: ��������ģʽ������ADCת��
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_Start()
+* 功能说明: 软件触发模式下启动ADC转换
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_Start(ADC_TypeDef * ADCx)
+void ADC_Start(ADC_TypeDef *ADCx)
{
- ADCx->START |= (0x01 << ADC_START_GO_Pos);
+ ADCx->START |= (0x01 << ADC_START_GO_Pos);
}
/******************************************************************************************************************************************
-* ��������: ADC_Stop()
-* ����˵��: ��������ģʽ��ֹͣADCת��
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_Stop()
+* 功能说明: 软件触发模式下停止ADC转换
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_Stop(ADC_TypeDef * ADCx)
-{
- ADCx->START &= ~(0x01 << ADC_START_GO_Pos);
+void ADC_Stop(ADC_TypeDef *ADCx)
+{
+ ADCx->START &= ~(0x01 << ADC_START_GO_Pos);
}
static uint32_t chn2idx(uint32_t chn)
{
- uint32_t idx = 0;
-
- switch(chn)
- {
- case 0x01: idx = 0; break;
- case 0x02: idx = 1; break;
- case 0x04: idx = 2; break;
- case 0x08: idx = 3; break;
- case 0x10: idx = 4; break;
- case 0x20: idx = 5; break;
- case 0x40: idx = 6; break;
- case 0x80: idx = 7; break;
- }
-
- return idx;
+ uint32_t idx = 0;
+
+ switch (chn)
+ {
+ case 0x01:
+ idx = 0;
+ break;
+ case 0x02:
+ idx = 1;
+ break;
+ case 0x04:
+ idx = 2;
+ break;
+ case 0x08:
+ idx = 3;
+ break;
+ case 0x10:
+ idx = 4;
+ break;
+ case 0x20:
+ idx = 5;
+ break;
+ case 0x40:
+ idx = 6;
+ break;
+ case 0x80:
+ idx = 7;
+ break;
+ }
+
+ return idx;
}
/******************************************************************************************************************************************
-* ��������: ADC_Read()
-* ����˵��: ��ָ��ͨ����ȡת�����
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ��ȡת�������ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: uint32_t ��ȡ����ת�����
-* ע������: ��
+* 函数名称: ADC_Read()
+* 功能说明: 从指定通道读取转换结果
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要读取转换结果的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: uint32_t 读取到的转换结果
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t ADC_Read(ADC_TypeDef * ADCx, uint32_t chn)
+uint32_t ADC_Read(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t dat = 0;
- uint32_t idx = chn2idx(chn);
-
- dat = ADCx->CH[idx].DATA;
-
- ADCx->CH[idx].STAT = 0x01; //���EOC��־
-
- return dat;
+ uint32_t dat = 0;
+ uint32_t idx = chn2idx(chn);
+
+ dat = ADCx->CH[idx].DATA;
+
+ ADCx->CH[idx].STAT = 0x01; //清除EOC标志
+
+ return dat;
}
/******************************************************************************************************************************************
-* ��������: ADC_IsEOC()
-* ����˵��: ָ��ͨ���Ƿ�End Of Conversion
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ��ѯ״̬��ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: uint32_t 1 ��ͨ�������ת�� 0 ��ͨ��δ���ת��
-* ע������: ��
+* 函数名称: ADC_IsEOC()
+* 功能说明: 指定通道是否End Of Conversion
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要查询状态的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn)
+uint32_t ADC_IsEOC(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- return (ADCx->CH[idx].STAT & ADC_STAT_EOC_Msk) ? 1 : 0;
+ uint32_t idx = chn2idx(chn);
+
+ return (ADCx->CH[idx].STAT & ADC_STAT_EOC_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: ADC_ChnSelect()
-* ����˵��: ADCͨ��ѡͨ��ģ��ת������ѡͨ��ͨ�������β���ת��
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chns Ҫѡͨ��ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7������ϣ�������λ�����㣩
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_ChnSelect()
+* 功能说明: ADC通道选通,模数转换会在选通的通道上依次采样转换
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chns 要选通的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_ChnSelect(ADC_TypeDef * ADCx, uint32_t chns)
+void ADC_ChnSelect(ADC_TypeDef *ADCx, uint32_t chns)
{
- ADCx->CTRL &= ~(0xFF << ADC_CTRL_CH0_Pos);
- ADCx->CTRL |= (chns << ADC_CTRL_CH0_Pos);
+ ADCx->CTRL &= ~(0xFF << ADC_CTRL_CH0_Pos);
+ ADCx->CTRL |= (chns << ADC_CTRL_CH0_Pos);
}
-
/******************************************************************************************************************************************
-* ��������: ADC_IntEOCEn()
-* ����˵��: ת������ж�ʹ��
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ���õ�ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_IntEOCEn()
+* 功能说明: 转换完成中断使能
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_IntEOCEn(ADC_TypeDef * ADCx, uint32_t chn)
+void ADC_IntEOCEn(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- ADCx->IE |= (0x01 << (idx*4));
+ uint32_t idx = chn2idx(chn);
+
+ ADCx->IE |= (0x01 << (idx * 4));
}
/******************************************************************************************************************************************
-* ��������: ADC_IntEOCDis()
-* ����˵��: ת������жϽ�ֹ
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ���õ�ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_IntEOCDis()
+* 功能说明: 转换完成中断禁止
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_IntEOCDis(ADC_TypeDef * ADCx, uint32_t chn)
+void ADC_IntEOCDis(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- ADCx->IE &= ~(0x01 << (idx*4));
+ uint32_t idx = chn2idx(chn);
+
+ ADCx->IE &= ~(0x01 << (idx * 4));
}
/******************************************************************************************************************************************
-* ��������: ADC_IntEOCClr()
-* ����˵��: ת������жϱ�־���
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ���õ�ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_IntEOCClr()
+* 功能说明: 转换完成中断标志清除
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_IntEOCClr(ADC_TypeDef * ADCx, uint32_t chn)
+void ADC_IntEOCClr(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- ADCx->IF = (0x01 << (idx*4));
+ uint32_t idx = chn2idx(chn);
+
+ ADCx->IF = (0x01 << (idx * 4));
}
/******************************************************************************************************************************************
-* ��������: ADC_IntEOCStat()
-* ����˵��: ת������ж�״̬
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ��ѯ��ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: uint32_t 1 ��ͨ�������ת�� 0 ��ͨ��δ���ת��
-* ע������: ��
+* 函数名称: ADC_IntEOCStat()
+* 功能说明: 转换完成中断状态
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t ADC_IntEOCStat(ADC_TypeDef * ADCx, uint32_t chn)
+uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- return (ADCx->IF & (0x01 << (idx*4))) ? 1 : 0;
+ uint32_t idx = chn2idx(chn);
+
+ return (ADCx->IF & (0x01 << (idx * 4))) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: ADC_IntOVFEn()
-* ����˵��: ��������ж�ʹ��
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ���õ�ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_IntOVFEn()
+* 功能说明: 数据溢出中断使能
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_IntOVFEn(ADC_TypeDef * ADCx, uint32_t chn)
+void ADC_IntOVFEn(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- ADCx->IE |= (0x01 << (idx*4+1));
+ uint32_t idx = chn2idx(chn);
+
+ ADCx->IE |= (0x01 << (idx * 4 + 1));
}
/******************************************************************************************************************************************
-* ��������: ADC_IntOVFDis()
-* ����˵��: ��������жϽ�ֹ
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ���õ�ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_IntOVFDis()
+* 功能说明: 数据溢出中断禁止
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_IntOVFDis(ADC_TypeDef * ADCx, uint32_t chn)
+void ADC_IntOVFDis(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- ADCx->IE &= ~(0x01 << (idx*4+1));
+ uint32_t idx = chn2idx(chn);
+
+ ADCx->IE &= ~(0x01 << (idx * 4 + 1));
}
/******************************************************************************************************************************************
-* ��������: ADC_IntOVFClr()
-* ����˵��: ��������жϱ�־���
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ���õ�ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_IntOVFClr()
+* 功能说明: 数据溢出中断标志清除
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_IntOVFClr(ADC_TypeDef * ADCx, uint32_t chn)
+void ADC_IntOVFClr(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- ADCx->IF = (0x01 << (idx*4+1));
+ uint32_t idx = chn2idx(chn);
+
+ ADCx->IF = (0x01 << (idx * 4 + 1));
}
/******************************************************************************************************************************************
-* ��������: ADC_IntOVFStat()
-* ����˵��: ��������ж�״̬
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ��ѯ��ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: uint32_t 1 ��ͨ�������ת�� 0 ��ͨ��δ���ת��
-* ע������: ��
+* 函数名称: ADC_IntOVFStat()
+* 功能说明: 数据溢出中断状态
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t ADC_IntOVFStat(ADC_TypeDef * ADCx, uint32_t chn)
+uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- return (ADCx->IF & (0x01 << (idx*4+1))) ? 1 : 0;
+ uint32_t idx = chn2idx(chn);
+
+ return (ADCx->IF & (0x01 << (idx * 4 + 1))) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: ADC_IntHFULLEn()
-* ����˵��: FIFO�����ж�ʹ��
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ���õ�ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_IntHFULLEn()
+* 功能说明: FIFO半满中断使能
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_IntHFULLEn(ADC_TypeDef * ADCx, uint32_t chn)
+void ADC_IntHFULLEn(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- ADCx->IE |= (0x01 << (idx*4+2));
+ uint32_t idx = chn2idx(chn);
+
+ ADCx->IE |= (0x01 << (idx * 4 + 2));
}
/******************************************************************************************************************************************
-* ��������: ADC_IntHFULLDis()
-* ����˵��: FIFO�����жϽ�ֹ
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ���õ�ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_IntHFULLDis()
+* 功能说明: FIFO半满中断禁止
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_IntHFULLDis(ADC_TypeDef * ADCx, uint32_t chn)
+void ADC_IntHFULLDis(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- ADCx->IE &= ~(0x01 << (idx*4+2));
+ uint32_t idx = chn2idx(chn);
+
+ ADCx->IE &= ~(0x01 << (idx * 4 + 2));
}
/******************************************************************************************************************************************
-* ��������: ADC_IntHFULLClr()
-* ����˵��: FIFO�����жϱ�־���
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ���õ�ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_IntHFULLClr()
+* 功能说明: FIFO半满中断标志清除
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_IntHFULLClr(ADC_TypeDef * ADCx, uint32_t chn)
+void ADC_IntHFULLClr(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- ADCx->IF = (0x01 << (idx*4+2));
+ uint32_t idx = chn2idx(chn);
+
+ ADCx->IF = (0x01 << (idx * 4 + 2));
}
/******************************************************************************************************************************************
-* ��������: ADC_IntHFULLStat()
-* ����˵��: FIFO�����ж�״̬
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ��ѯ��ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: uint32_t 1 ��ͨ�������ת�� 0 ��ͨ��δ���ת��
-* ע������: ��
+* 函数名称: ADC_IntHFULLStat()
+* 功能说明: FIFO半满中断状态
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t ADC_IntHFULLStat(ADC_TypeDef * ADCx, uint32_t chn)
+uint32_t ADC_IntHFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- return (ADCx->IF & (0x01 << (idx*4+2))) ? 1 : 0;
+ uint32_t idx = chn2idx(chn);
+
+ return (ADCx->IF & (0x01 << (idx * 4 + 2))) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: ADC_IntFULLEn()
-* ����˵��: FIFO���ж�ʹ��
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ���õ�ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_IntFULLEn()
+* 功能说明: FIFO满中断使能
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_IntFULLEn(ADC_TypeDef * ADCx, uint32_t chn)
+void ADC_IntFULLEn(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- ADCx->IE |= (0x01 << (idx*4+3));
+ uint32_t idx = chn2idx(chn);
+
+ ADCx->IE |= (0x01 << (idx * 4 + 3));
}
/******************************************************************************************************************************************
-* ��������: ADC_IntFULLDis()
-* ����˵��: FIFO���жϽ�ֹ
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ���õ�ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_IntFULLDis()
+* 功能说明: FIFO满中断禁止
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_IntFULLDis(ADC_TypeDef * ADCx, uint32_t chn)
+void ADC_IntFULLDis(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- ADCx->IE &= ~(0x01 << (idx*4+3));
+ uint32_t idx = chn2idx(chn);
+
+ ADCx->IE &= ~(0x01 << (idx * 4 + 3));
}
/******************************************************************************************************************************************
-* ��������: ADC_IntFULLClr()
-* ����˵��: FIFO���жϱ�־���
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ���õ�ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: ��
-* ע������: ��
+* 函数名称: ADC_IntFULLClr()
+* 功能说明: FIFO满中断标志清除
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要设置的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void ADC_IntFULLClr(ADC_TypeDef * ADCx, uint32_t chn)
+void ADC_IntFULLClr(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- ADCx->IF = (0x01 << (idx*4+3));
+ uint32_t idx = chn2idx(chn);
+
+ ADCx->IF = (0x01 << (idx * 4 + 3));
}
/******************************************************************************************************************************************
-* ��������: ADC_IntFULLStat()
-* ����˵��: FIFO���ж�״̬
-* �� ��: ADC_TypeDef * ADCx ָ��Ҫ�����õ�ADC����ȡֵ����ADC
-* uint32_t chn Ҫ��ѯ��ͨ������ЧֵADC_CH0��ADC_CH1��... ... ��ADC_CH7
-* �� ��: uint32_t 1 ��ͨ�������ת�� 0 ��ͨ��δ���ת��
-* ע������: ��
+* 函数名称: ADC_IntFULLStat()
+* 功能说明: FIFO满中断状态
+* 输 入: ADC_TypeDef * ADCx 指定要被设置的ADC,可取值包括ADC
+* uint32_t chn 要查询的通道,有效值ADC_CH0、ADC_CH1、... ... 、ADC_CH7
+* 输 出: uint32_t 1 该通道完成了转换 0 该通道未完成转换
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t ADC_IntFULLStat(ADC_TypeDef * ADCx, uint32_t chn)
+uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn)
{
- uint32_t idx = chn2idx(chn);
-
- return (ADCx->IF & (0x01 << (idx*4+3))) ? 1 : 0;
+ uint32_t idx = chn2idx(chn);
+
+ return (ADCx->IF & (0x01 << (idx * 4 + 3))) ? 1 : 0;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.h
index 56f93c66d8..10b4437527 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_adc.h
@@ -1,79 +1,77 @@
#ifndef __SWM320_ADC_H__
-#define __SWM320_ADC_H__
+#define __SWM320_ADC_H__
-typedef struct {
- uint8_t clk_src; //ADCת��ʱ��Դ��ADC_CLKSRC_HRC��ADC_CLKSRC_VCO_DIV16��ADC_CLKSRC_VCO_DIV32��ADC_CLKSRC_VCO_DIV32
- uint8_t clk_div; //ADCת��ʱ�ӷ�Ƶ��ȡֵ1--31
- uint8_t pga_ref; //PGA��׼��PGA_REF_INTERNAL��PGA_REF_EXTERNAL
- uint8_t channels; //ADCת��ͨ��ѡ�У�ADC_CH0��ADC_CH1��... ... ��ADC_CH7������ϣ�������λ�����㣩
- uint8_t samplAvg; //����ȡƽ������������ADCת����ADC��һ��ͨ��������������ת����Σ��������ǵ�ƽ��ֵ��Ϊ��ͨ��ת�����
- uint8_t trig_src; //ADC������ʽ��ADC_TRIGSRC_SW��ADC_TRIGSRC_PWM��ADC_TRIGSRC_TIMR2��ADC_TRIGSRC_TIMR3
- uint8_t Continue; //����������ģʽ�£�1 ����ת��ģʽ��������һֱ������ת����ֱ���������STARTλ
- // 0 ����ת��ģʽ��ת����ɺ�STARTλ�Զ����ֹͣת��
- uint8_t EOC_IEn; //EOC�ж�ʹ�ܣ������ÿ��ͨ�����ã�����ЧֵΪADC_CH0��ADC_CH1��... ... ��ADC_CH7������ϣ�������λ�����㣩
- uint8_t OVF_IEn; //OVF�ж�ʹ�ܣ������ÿ��ͨ�����ã�����ЧֵΪADC_CH0��ADC_CH1��... ... ��ADC_CH7������ϣ�������λ�����㣩
- uint8_t HFULL_IEn; //FIFO�����ж�ʹ�ܣ������ÿ��ͨ�����ã�����ЧֵΪADC_CH0��ADC_CH1��... ... ��ADC_CH7������ϣ�������λ�����㣩
- uint8_t FULL_IEn; //FIFO ���ж�ʹ�ܣ������ÿ��ͨ�����ã�����ЧֵΪADC_CH0��ADC_CH1��... ... ��ADC_CH7������ϣ�������λ�����㣩
+typedef struct
+{
+ uint8_t clk_src; //ADC转换时钟源:ADC_CLKSRC_HRC、ADC_CLKSRC_VCO_DIV16、ADC_CLKSRC_VCO_DIV32、ADC_CLKSRC_VCO_DIV32
+ uint8_t clk_div; //ADC转换时钟分频,取值1--31
+ uint8_t pga_ref; //PGA基准:PGA_REF_INTERNAL、PGA_REF_EXTERNAL
+ uint8_t channels; //ADC转换通道选中,ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
+ uint8_t samplAvg; //采样取平均,触发启动ADC转换后,ADC在一个通道上连续采样、转换多次,并将它们的平均值作为该通道转换结果
+ uint8_t trig_src; //ADC触发方式:ADC_TRIGSRC_SW、ADC_TRIGSRC_PWM、ADC_TRIGSRC_TIMR2、ADC_TRIGSRC_TIMR3
+ uint8_t Continue; //在软件触发模式下:1 连续转换模式,启动后一直采样、转换,直到软件清除START位
+ // 0 单次转换模式,转换完成后START位自动清除停止转换
+ uint8_t EOC_IEn; //EOC中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
+ uint8_t OVF_IEn; //OVF中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
+ uint8_t HFULL_IEn; //FIFO半满中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
+ uint8_t FULL_IEn; //FIFO 满中断使能,可针对每个通道设置,其有效值为ADC_CH0、ADC_CH1、... ... 、ADC_CH7及其组合(即“按位或”运算)
} ADC_InitStructure;
-#define ADC_CH0 0x01
-#define ADC_CH1 0x02
-#define ADC_CH2 0x04
-#define ADC_CH3 0x08
-#define ADC_CH4 0x10
-#define ADC_CH5 0x20
-#define ADC_CH6 0x40
-#define ADC_CH7 0x80
+#define ADC_CH0 0x01
+#define ADC_CH1 0x02
+#define ADC_CH2 0x04
+#define ADC_CH3 0x08
+#define ADC_CH4 0x10
+#define ADC_CH5 0x20
+#define ADC_CH6 0x40
+#define ADC_CH7 0x80
-#define ADC_CLKSRC_HRC 1
-#define ADC_CLKSRC_VCO_DIV16 2
-#define ADC_CLKSRC_VCO_DIV32 3
-#define ADC_CLKSRC_VCO_DIV64 4
+#define ADC_CLKSRC_HRC 1
+#define ADC_CLKSRC_VCO_DIV16 2
+#define ADC_CLKSRC_VCO_DIV32 3
+#define ADC_CLKSRC_VCO_DIV64 4
-#define ADC_AVG_SAMPLE1 0
-#define ADC_AVG_SAMPLE2 1 //һ����������������ת��2�Σ����������ν����ƽ��ֵ��Ϊת�����
-#define ADC_AVG_SAMPLE4 3
-#define ADC_AVG_SAMPLE8 7
-#define ADC_AVG_SAMPLE16 15
+#define ADC_AVG_SAMPLE1 0
+#define ADC_AVG_SAMPLE2 1 //一次启动连续采样、转换2次,并计算两次结果的平均值作为转换结果
+#define ADC_AVG_SAMPLE4 3
+#define ADC_AVG_SAMPLE8 7
+#define ADC_AVG_SAMPLE16 15
-#define ADC_TRIGSRC_SW 0 //������������ADC->START.GOд1����ת��
-#define ADC_TRIGSRC_PWM 1
+#define ADC_TRIGSRC_SW 0 //软件触发,即ADC->START.GO写1启动转换
+#define ADC_TRIGSRC_PWM 1
-#define PGA_REF_INTERNAL 1 //PGA���빲ģ��ƽ���ڲ���·������ADC_REFP��ADC_REFN������
-#define PGA_REF_EXTERNAL 0 //PGA���빲ģ��ƽ���ⲿ�����ṩ��(ADC_REFP + ADC_REFN) ��ƽֵ����������ͬ
+#define PGA_REF_INTERNAL 1 //PGA输入共模电平由内部电路产生,ADC_REFP和ADC_REFN可悬空
+#define PGA_REF_EXTERNAL 0 //PGA输入共模电平由外部引脚提供,(ADC_REFP + ADC_REFN) 电平值须与量程相同
+void ADC_Init(ADC_TypeDef *ADCx, ADC_InitStructure *initStruct); //ADC模数转换器初始化
+void ADC_Open(ADC_TypeDef *ADCx); //ADC开启,可以软件启动、或硬件触发ADC转换
+void ADC_Close(ADC_TypeDef *ADCx); //ADC关闭,无法软件启动、或硬件触发ADC转换
+void ADC_Start(ADC_TypeDef *ADCx); //启动指定ADC,开始模数转换
+void ADC_Stop(ADC_TypeDef *ADCx); //关闭指定ADC,停止模数转换
-void ADC_Init(ADC_TypeDef * ADCx, ADC_InitStructure * initStruct); //ADCģ��ת������ʼ��
-void ADC_Open(ADC_TypeDef * ADCx); //ADC����������������������Ӳ������ADCת��
-void ADC_Close(ADC_TypeDef * ADCx); //ADC�رգ��޷�������������Ӳ������ADCת��
-void ADC_Start(ADC_TypeDef * ADCx); //����ָ��ADC����ʼģ��ת��
-void ADC_Stop(ADC_TypeDef * ADCx); //�ر�ָ��ADC��ֹͣģ��ת��
+uint32_t ADC_Read(ADC_TypeDef *ADCx, uint32_t chn); //从指定通道读取转换结果
+uint32_t ADC_IsEOC(ADC_TypeDef *ADCx, uint32_t chn); //指定通道是否End Of Conversion
-uint32_t ADC_Read(ADC_TypeDef * ADCx, uint32_t chn); //��ָ��ͨ����ȡת�����
-uint32_t ADC_IsEOC(ADC_TypeDef * ADCx, uint32_t chn); //ָ��ͨ���Ƿ�End Of Conversion
+void ADC_ChnSelect(ADC_TypeDef *ADCx, uint32_t chns);
-void ADC_ChnSelect(ADC_TypeDef * ADCx, uint32_t chns);
+void ADC_IntEOCEn(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断使能
+void ADC_IntEOCDis(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断禁止
+void ADC_IntEOCClr(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断标志清除
+uint32_t ADC_IntEOCStat(ADC_TypeDef *ADCx, uint32_t chn); //转换完成中断状态
+void ADC_IntOVFEn(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断使能
+void ADC_IntOVFDis(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断禁止
+void ADC_IntOVFClr(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断标志清除
+uint32_t ADC_IntOVFStat(ADC_TypeDef *ADCx, uint32_t chn); //数据溢出中断状态
-void ADC_IntEOCEn(ADC_TypeDef * ADCx, uint32_t chn); //ת������ж�ʹ��
-void ADC_IntEOCDis(ADC_TypeDef * ADCx, uint32_t chn); //ת������жϽ�ֹ
-void ADC_IntEOCClr(ADC_TypeDef * ADCx, uint32_t chn); //ת������жϱ�־���
-uint32_t ADC_IntEOCStat(ADC_TypeDef * ADCx, uint32_t chn); //ת������ж�״̬
-
-void ADC_IntOVFEn(ADC_TypeDef * ADCx, uint32_t chn); //��������ж�ʹ��
-void ADC_IntOVFDis(ADC_TypeDef * ADCx, uint32_t chn); //��������жϽ�ֹ
-void ADC_IntOVFClr(ADC_TypeDef * ADCx, uint32_t chn); //��������жϱ�־���
-uint32_t ADC_IntOVFStat(ADC_TypeDef * ADCx, uint32_t chn); //��������ж�״̬
-
-void ADC_IntHFULLEn(ADC_TypeDef * ADCx, uint32_t chn); //FIFO�����ж�ʹ��
-void ADC_IntHFULLDis(ADC_TypeDef * ADCx, uint32_t chn); //FIFO�����жϽ�ֹ
-void ADC_IntHFULLClr(ADC_TypeDef * ADCx, uint32_t chn); //FIFO�����жϱ�־���
-uint32_t ADC_IntHFULLStat(ADC_TypeDef * ADCx, uint32_t chn);//FIFO�����ж�״̬
-
-void ADC_IntFULLEn(ADC_TypeDef * ADCx, uint32_t chn); //FIFO���ж�ʹ��
-void ADC_IntFULLDis(ADC_TypeDef * ADCx, uint32_t chn); //FIFO���жϽ�ֹ
-void ADC_IntFULLClr(ADC_TypeDef * ADCx, uint32_t chn); //FIFO���жϱ�־���
-uint32_t ADC_IntFULLStat(ADC_TypeDef * ADCx, uint32_t chn); //FIFO���ж�״̬
+void ADC_IntHFULLEn(ADC_TypeDef *ADCx, uint32_t chn); //FIFO半满中断使能
+void ADC_IntHFULLDis(ADC_TypeDef *ADCx, uint32_t chn); //FIFO半满中断禁止
+void ADC_IntHFULLClr(ADC_TypeDef *ADCx, uint32_t chn); //FIFO半满中断标志清除
+uint32_t ADC_IntHFULLStat(ADC_TypeDef *ADCx, uint32_t chn); //FIFO半满中断状态
+void ADC_IntFULLEn(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断使能
+void ADC_IntFULLDis(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断禁止
+void ADC_IntFULLClr(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断标志清除
+uint32_t ADC_IntFULLStat(ADC_TypeDef *ADCx, uint32_t chn); //FIFO满中断状态
#endif //__SWM320_ADC_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.c
index c5c5f34a45..f1f7a36ba7 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_can.c
-* ����˵��: SWM320��Ƭ����CANģ��������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_can.c
+* 功能说明: SWM320单片机的CAN模块驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,668 +21,583 @@
#include "SWM320.h"
#include "SWM320_can.h"
-
-/******************************************************************************************************************************************
-* ��������: CAN_Init()
-* ����˵��: CAN�ӿڳ�ʼ��
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* CAN_InitStructure * initStruct ����CAN�ӿ�����趨ֵ�Ľṹ��
-* �� ��: ��
-* ע������: ��
-******************************************************************************************************************************************/
-void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct)
-{
- switch((uint32_t)CANx)
- {
- case ((uint32_t)CAN):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_CAN_Pos);
- break;
- }
-
- CAN_Close(CANx); //һЩ�ؼ��Ĵ���ֻ����CAN�ر�ʱ����
-
- CANx->CR &= ~(CAN_CR_LOM_Msk | CAN_CR_STM_Msk | CAN_CR_AFM_Msk);
- CANx->CR |= (initStruct->Mode << CAN_CR_LOM_Pos) |
- (initStruct->FilterMode << CAN_CR_AFM_Pos);
-
- CANx->FILTER.AMR[3] = initStruct->FilterMask32b & 0xFF;
- CANx->FILTER.AMR[2] = (initStruct->FilterMask32b >> 8) & 0xFF;
- CANx->FILTER.AMR[1] = (initStruct->FilterMask32b >> 16) & 0xFF;
- CANx->FILTER.AMR[0] = (initStruct->FilterMask32b >> 24) & 0xFF;
-
- CANx->FILTER.ACR[3] = initStruct->FilterCheck32b & 0xFF;
- CANx->FILTER.ACR[2] = (initStruct->FilterCheck32b >> 8) & 0xFF;
- CANx->FILTER.ACR[1] = (initStruct->FilterCheck32b >> 16) & 0xFF;
- CANx->FILTER.ACR[0] = (initStruct->FilterCheck32b >> 24) & 0xFF;
-
- CANx->BT1 = (0 << CAN_BT1_SAM_Pos) |
- (initStruct->CAN_BS1 << CAN_BT1_TSEG1_Pos) |
- (initStruct->CAN_BS2 << CAN_BT1_TSEG2_Pos);
-
- CANx->BT0 = (initStruct->CAN_SJW << CAN_BT0_SJW_Pos) |
- ((SystemCoreClock/2/initStruct->Baudrate/(1 + (initStruct->CAN_BS1 + 1) + (initStruct->CAN_BS2 + 1)) - 1) << CAN_BT0_BRP_Pos);
-
- CANx->RXERR = 0; //ֻ���ڸ�λģʽ�����
- CANx->TXERR = 0;
-
- CANx->IE = (initStruct->RXNotEmptyIEn << CAN_IE_RXDA_Pos) |
- (initStruct->RXOverflowIEn << CAN_IE_RXOV_Pos) |
- (initStruct->ArbitrLostIEn << CAN_IE_ARBLOST_Pos) |
- (initStruct->ErrPassiveIEn << CAN_IE_ERRPASS_Pos);
-
- switch((uint32_t)CANx)
- {
- case ((uint32_t)CAN):
- if(initStruct->RXNotEmptyIEn | initStruct->RXOverflowIEn | initStruct->ArbitrLostIEn | initStruct->ErrPassiveIEn)
- {
- NVIC_EnableIRQ(CAN_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(CAN_IRQn);
- }
- break;
- }
-}
-
/******************************************************************************************************************************************
-* ��������: CAN_Open()
-* ����˵��: CAN�ӿڴ�
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_Init()
+* 功能说明: CAN接口初始化
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* CAN_InitStructure * initStruct 包含CAN接口相关设定值的结构体
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_Open(CAN_TypeDef * CANx)
+void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct)
{
- CANx->CR &= ~(0x01 << CAN_CR_RST_Pos); //�˳���λģʽ�����빤��ģʽ
-}
+ switch ((uint32_t)CANx)
+ {
+ case ((uint32_t)CAN):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_CAN_Pos);
+ break;
+ }
-/******************************************************************************************************************************************
-* ��������: CAN_Close()
-* ����˵��: CAN�ӿڹر�
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
-******************************************************************************************************************************************/
-void CAN_Close(CAN_TypeDef * CANx)
-{
- CANx->CR |= (0x01 << CAN_CR_RST_Pos); //���븴λģʽ�����ܷ��ͺͽ�������
-}
+ CAN_Close(CANx); //一些关键寄存器只能在CAN关闭时设置
-/******************************************************************************************************************************************
-* ��������: CAN_Transmit()
-* ����˵��: CAN��������
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* uint32_t format CAN_FRAME_STD ��׼֡ CAN_FRAME_EXT ��չ֡
-* uint32_t id ��ϢID
-* uint8_t data[] Ҫ���͵�����
-* uint32_t size Ҫ���͵����ݵĸ���
-* uint32_t once ֻ����һ�Σ���ʹ����ʧ�ܣ��ٲö�ʧ�����ͳ�����NAK��Ҳ�������ط�
-* �� ��: ��
-* ע������: ��
-******************************************************************************************************************************************/
-void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once)
-{
- uint32_t i;
-
- if(format == CAN_FRAME_STD)
- {
- CANx->TXFRAME.INFO = (0 << CAN_INFO_FF_Pos) |
- (0 << CAN_INFO_RTR_Pos) |
- (size << CAN_INFO_DLC_Pos);
-
- CANx->TXFRAME.DATA[0] = id >> 3;
- CANx->TXFRAME.DATA[1] = id << 5;
-
- for(i = 0; i < size; i++)
- {
- CANx->TXFRAME.DATA[i+2] = data[i];
- }
- }
- else //if(format == CAN_FRAME_EXT)
- {
- CANx->TXFRAME.INFO = (1 << CAN_INFO_FF_Pos) |
- (0 << CAN_INFO_RTR_Pos) |
- (size << CAN_INFO_DLC_Pos);
-
- CANx->TXFRAME.DATA[0] = id >> 21;
- CANx->TXFRAME.DATA[1] = id >> 13;
- CANx->TXFRAME.DATA[2] = id >> 5;
- CANx->TXFRAME.DATA[3] = id << 3;
-
- for(i = 0; i < size; i++)
- {
- CANx->TXFRAME.DATA[i+4] = data[i];
- }
- }
-
- if(CANx->CR & CAN_CR_STM_Msk)
- {
- CANx->CMD = (1 << CAN_CMD_SRR_Pos);
- }
- else
- {
- if(once == 0)
- {
- CANx->CMD = (1 << CAN_CMD_TXREQ_Pos);
- }
- else
- {
- CANx->CMD = (1 << CAN_CMD_TXREQ_Pos) | (1 << CAN_CMD_ABTTX_Pos);
- }
- }
-}
+ CANx->CR &= ~(CAN_CR_LOM_Msk | CAN_CR_STM_Msk | CAN_CR_AFM_Msk);
+ CANx->CR |= (initStruct->Mode << CAN_CR_LOM_Pos) |
+ (initStruct->FilterMode << CAN_CR_AFM_Pos);
-/******************************************************************************************************************************************
-* ��������: CAN_TransmitRequest()
-* ����˵��: CAN����Զ����������Զ�̽ڵ㷢������
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* uint32_t format CAN_FRAME_STD ��׼֡ CAN_FRAME_EXT ��չ֡
-* uint32_t id ��ϢID
-* uint32_t once ֻ����һ�Σ���ʹ����ʧ�ܣ��ٲö�ʧ�����ͳ�����NAK��Ҳ�������ط�
-* �� ��: ��
-* ע������: ��
-******************************************************************************************************************************************/
-void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint32_t once)
-{
- if(format == CAN_FRAME_STD)
- {
- CANx->TXFRAME.INFO = (0 << CAN_INFO_FF_Pos) |
- (1 << CAN_INFO_RTR_Pos) |
- (0 << CAN_INFO_DLC_Pos);
-
- CANx->TXFRAME.DATA[0] = id >> 3;
- CANx->TXFRAME.DATA[1] = id << 5;
- }
- else //if(format == CAN_FRAME_EXT)
- {
- CANx->TXFRAME.INFO = (1 << CAN_INFO_FF_Pos) |
- (1 << CAN_INFO_RTR_Pos) |
- (0 << CAN_INFO_DLC_Pos);
-
- CANx->TXFRAME.DATA[0] = id >> 21;
- CANx->TXFRAME.DATA[1] = id >> 13;
- CANx->TXFRAME.DATA[2] = id >> 5;
- CANx->TXFRAME.DATA[3] = id << 3;
- }
-
- if(once == 0)
- {
- CANx->CMD = (1 << CAN_CMD_TXREQ_Pos);
- }
- else
- {
- CANx->CMD = (1 << CAN_CMD_TXREQ_Pos) | (1 << CAN_CMD_ABTTX_Pos);
- }
-}
+ CANx->FILTER.AMR[3] = initStruct->FilterMask32b & 0xFF;
+ CANx->FILTER.AMR[2] = (initStruct->FilterMask32b >> 8) & 0xFF;
+ CANx->FILTER.AMR[1] = (initStruct->FilterMask32b >> 16) & 0xFF;
+ CANx->FILTER.AMR[0] = (initStruct->FilterMask32b >> 24) & 0xFF;
-/******************************************************************************************************************************************
-* ��������: CAN_Receive()
-* ����˵��: CAN��������
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* CAN_RXMessage *msg ���յ�����Ϣ�洢�ڴ˽ṹ�������
-* �� ��: ��
-* ע������: ��
-******************************************************************************************************************************************/
-void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg)
-{
- uint32_t i;
- msg->format = (CANx->RXFRAME.INFO & CAN_INFO_FF_Msk) >> CAN_INFO_FF_Pos;
-
- msg->remote = (CANx->RXFRAME.INFO & CAN_INFO_RTR_Msk) >> CAN_INFO_RTR_Pos;
- msg->size = (CANx->RXFRAME.INFO & CAN_INFO_DLC_Msk) >> CAN_INFO_DLC_Pos;
-
- if(msg->format == CAN_FRAME_STD)
- {
- msg->id = (CANx->RXFRAME.DATA[0] << 3) | (CANx->RXFRAME.DATA[1] >> 5);
-
- for(i = 0; i < msg->size; i++)
- {
- msg->data[i] = CANx->RXFRAME.DATA[i+2];
- }
- }
- else //if(msg->format == CAN_FRAME_EXT)
- {
- msg->id = (CANx->RXFRAME.DATA[0] << 21) | (CANx->RXFRAME.DATA[1] << 13) | (CANx->RXFRAME.DATA[2] << 5) | (CANx->RXFRAME.DATA[3] >> 3);
-
- for(i = 0; i < msg->size; i++)
- {
- msg->data[i] = CANx->RXFRAME.DATA[i+4];
- }
- }
-
- CANx->CMD = (1 << CAN_CMD_RRB_Pos);
-}
+ CANx->FILTER.ACR[3] = initStruct->FilterCheck32b & 0xFF;
+ CANx->FILTER.ACR[2] = (initStruct->FilterCheck32b >> 8) & 0xFF;
+ CANx->FILTER.ACR[1] = (initStruct->FilterCheck32b >> 16) & 0xFF;
+ CANx->FILTER.ACR[0] = (initStruct->FilterCheck32b >> 24) & 0xFF;
-/******************************************************************************************************************************************
-* ��������: CAN_TXComplete()
-* ����˵��: �����Ƿ����
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: uint32_t 1 �Ѿ���� 0 ��δ���
-* ע������: ���ͱ�AbortҲ�ᴥ��������ɣ������ᴥ�����ͳɹ�
-******************************************************************************************************************************************/
-uint32_t CAN_TXComplete(CAN_TypeDef * CANx)
-{
- return (CANx->SR & CAN_SR_TXBR_Msk) ? 1 : 0;
-}
+ CANx->BT1 = (0 << CAN_BT1_SAM_Pos) |
+ (initStruct->CAN_BS1 << CAN_BT1_TSEG1_Pos) |
+ (initStruct->CAN_BS2 << CAN_BT1_TSEG2_Pos);
-/******************************************************************************************************************************************
-* ��������: CAN_TXSuccess()
-* ����˵��: �����Ƿ�ɹ�
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: uint32_t 1 ���ͳɹ� 0 ����ʧ��
-* ע������: ��
-******************************************************************************************************************************************/
-uint32_t CAN_TXSuccess(CAN_TypeDef * CANx)
-{
- return (CANx->SR & CAN_SR_TXOK_Msk) ? 1 : 0;
+ CANx->BT0 = (initStruct->CAN_SJW << CAN_BT0_SJW_Pos) |
+ ((SystemCoreClock / 2 / initStruct->Baudrate / (1 + (initStruct->CAN_BS1 + 1) + (initStruct->CAN_BS2 + 1)) - 1) << CAN_BT0_BRP_Pos);
+
+ CANx->RXERR = 0; //只能在复位模式下清除
+ CANx->TXERR = 0;
+
+ CANx->IE = (initStruct->RXNotEmptyIEn << CAN_IE_RXDA_Pos) |
+ (initStruct->RXOverflowIEn << CAN_IE_RXOV_Pos) |
+ (initStruct->ArbitrLostIEn << CAN_IE_ARBLOST_Pos) |
+ (initStruct->ErrPassiveIEn << CAN_IE_ERRPASS_Pos);
+
+ switch ((uint32_t)CANx)
+ {
+ case ((uint32_t)CAN):
+ if (initStruct->RXNotEmptyIEn | initStruct->RXOverflowIEn | initStruct->ArbitrLostIEn | initStruct->ErrPassiveIEn)
+ {
+ NVIC_EnableIRQ(CAN_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(CAN_IRQn);
+ }
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: CAN_AbortTransmit()
-* ����˵��: ��ֹ����
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ���ڽ��еķ����޷���ֹ����ִ�д������������ʧ�ܲ������ط�
+* 函数名称: CAN_Open()
+* 功能说明: CAN接口打开
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_AbortTransmit(CAN_TypeDef * CANx)
+void CAN_Open(CAN_TypeDef *CANx)
{
- CANx->CMD = (1 << CAN_CMD_ABTTX_Pos);
+ CANx->CR &= ~(0x01 << CAN_CR_RST_Pos); //退出复位模式,进入工作模式
}
/******************************************************************************************************************************************
-* ��������: CAN_TXBufferReady()
-* ����˵��: TX Buffer�Ƿ�׼���ÿ���д����Ϣ
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: uint32_t 1 ��׼���� 0 δ׼����
-* ע������: ��
+* 函数名称: CAN_Close()
+* 功能说明: CAN接口关闭
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t CAN_TXBufferReady(CAN_TypeDef * CANx)
+void CAN_Close(CAN_TypeDef *CANx)
{
- return (CANx->SR & CAN_SR_TXBR_Msk) ? 1 : 0;
+ CANx->CR |= (0x01 << CAN_CR_RST_Pos); //进入复位模式,不能发送和接收数据
}
/******************************************************************************************************************************************
-* ��������: CAN_RXDataAvailable()
-* ����˵��: RX FIFO���Ƿ������ݿɶ���
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: uint32_t 1 �����ݿɶ��� 0 û������
-* ע������: ��
+* 函数名称: CAN_Transmit()
+* 功能说明: CAN发送数据
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* uint32_t format CAN_FRAME_STD 标准帧 CAN_FRAME_EXT 扩展帧
+* uint32_t id 消息ID
+* uint8_t data[] 要发送的数据
+* uint32_t size 要发送的数据的个数
+* uint32_t once 只发送一次,即使发送失败(仲裁丢失、发送出错、NAK)也不尝试重发
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t CAN_RXDataAvailable(CAN_TypeDef * CANx)
+void CAN_Transmit(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once)
{
- return (CANx->SR & CAN_SR_RXDA_Msk) ? 1 : 0;
+ uint32_t i;
+
+ if (format == CAN_FRAME_STD)
+ {
+ CANx->TXFRAME.INFO = (0 << CAN_INFO_FF_Pos) |
+ (0 << CAN_INFO_RTR_Pos) |
+ (size << CAN_INFO_DLC_Pos);
+
+ CANx->TXFRAME.DATA[0] = id >> 3;
+ CANx->TXFRAME.DATA[1] = id << 5;
+
+ for (i = 0; i < size; i++)
+ {
+ CANx->TXFRAME.DATA[i + 2] = data[i];
+ }
+ }
+ else //if(format == CAN_FRAME_EXT)
+ {
+ CANx->TXFRAME.INFO = (1 << CAN_INFO_FF_Pos) |
+ (0 << CAN_INFO_RTR_Pos) |
+ (size << CAN_INFO_DLC_Pos);
+
+ CANx->TXFRAME.DATA[0] = id >> 21;
+ CANx->TXFRAME.DATA[1] = id >> 13;
+ CANx->TXFRAME.DATA[2] = id >> 5;
+ CANx->TXFRAME.DATA[3] = id << 3;
+
+ for (i = 0; i < size; i++)
+ {
+ CANx->TXFRAME.DATA[i + 4] = data[i];
+ }
+ }
+
+ if (CANx->CR & CAN_CR_STM_Msk)
+ {
+ CANx->CMD = (1 << CAN_CMD_SRR_Pos);
+ }
+ else
+ {
+ if (once == 0)
+ {
+ CANx->CMD = (1 << CAN_CMD_TXREQ_Pos);
+ }
+ else
+ {
+ CANx->CMD = (1 << CAN_CMD_TXREQ_Pos) | (1 << CAN_CMD_ABTTX_Pos);
+ }
+ }
}
/******************************************************************************************************************************************
-* ��������: CAN_SetBaudrate()
-* ����˵��: ���ò�����
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* uint32_t baudrate �����ʣ���λ��������
-* uint32_t CAN_BS1 CAN_BS1_1tq��CAN_BS1_2tq��... ... ��CAN_BS1_16tq
-* uint32_t CAN_BS2 CAN_BS2_1tq��CAN_BS2_2tq��... ... ��CAN_BS2_8tq
-* uint32_t CAN_SJW CAN_SJW_1tq��CAN_SJW_2tq��CAN_SJW_3tq��CAN_SJW_4tq
-* �� ��: ��
-* ע������: ����ǰ��Ҫ�ȵ���CAN_Close()�ر�CANģ��
+* 函数名称: CAN_TransmitRequest()
+* 功能说明: CAN发送远程请求,请求远程节点发送数据
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* uint32_t format CAN_FRAME_STD 标准帧 CAN_FRAME_EXT 扩展帧
+* uint32_t id 消息ID
+* uint32_t once 只发送一次,即使发送失败(仲裁丢失、发送出错、NAK)也不尝试重发
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_SetBaudrate(CAN_TypeDef * CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW)
+void CAN_TransmitRequest(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint32_t once)
{
- CANx->BT1 = (0 << CAN_BT1_SAM_Pos) |
- (CAN_BS1 << CAN_BT1_TSEG1_Pos) |
- (CAN_BS2 << CAN_BT1_TSEG2_Pos);
-
- CANx->BT0 = (CAN_SJW << CAN_BT0_SJW_Pos) |
- ((SystemCoreClock/2/baudrate/(1 + (CAN_BS1 + 1) + (CAN_BS2 + 1)) - 1) << CAN_BT0_BRP_Pos);
+ if (format == CAN_FRAME_STD)
+ {
+ CANx->TXFRAME.INFO = (0 << CAN_INFO_FF_Pos) |
+ (1 << CAN_INFO_RTR_Pos) |
+ (0 << CAN_INFO_DLC_Pos);
+
+ CANx->TXFRAME.DATA[0] = id >> 3;
+ CANx->TXFRAME.DATA[1] = id << 5;
+ }
+ else //if(format == CAN_FRAME_EXT)
+ {
+ CANx->TXFRAME.INFO = (1 << CAN_INFO_FF_Pos) |
+ (1 << CAN_INFO_RTR_Pos) |
+ (0 << CAN_INFO_DLC_Pos);
+
+ CANx->TXFRAME.DATA[0] = id >> 21;
+ CANx->TXFRAME.DATA[1] = id >> 13;
+ CANx->TXFRAME.DATA[2] = id >> 5;
+ CANx->TXFRAME.DATA[3] = id << 3;
+ }
+
+ if (once == 0)
+ {
+ CANx->CMD = (1 << CAN_CMD_TXREQ_Pos);
+ }
+ else
+ {
+ CANx->CMD = (1 << CAN_CMD_TXREQ_Pos) | (1 << CAN_CMD_ABTTX_Pos);
+ }
}
/******************************************************************************************************************************************
-* ��������: CAN_SetFilter32b()
-* ����˵��: ���ý����˲�����1��32λ�˲���
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* uint32_t check ��maskһ������˽��յ���Message�Ƿ����Լ���Ҫ�ģ�check & (~mask) == ID & (~mask)��Messageͨ������
-* uint32_t mask
-* �� ��: ��
-* ע������: ����ǰ��Ҫ�ȵ���CAN_Close()�ر�CANģ��
+* 函数名称: CAN_Receive()
+* 功能说明: CAN接收数据
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* CAN_RXMessage *msg 接收到的消息存储在此结构体变量中
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_SetFilter32b(CAN_TypeDef * CANx, uint32_t check, uint32_t mask)
+void CAN_Receive(CAN_TypeDef *CANx, CAN_RXMessage *msg)
{
- CANx->CR &= ~CAN_CR_AFM_Msk;
- CANx->CR |= (CAN_FILTER_32b << CAN_CR_AFM_Pos);
-
- CANx->FILTER.AMR[3] = mask & 0xFF;
- CANx->FILTER.AMR[2] = (mask >> 8) & 0xFF;
- CANx->FILTER.AMR[1] = (mask >> 16) & 0xFF;
- CANx->FILTER.AMR[0] = (mask >> 24) & 0xFF;
-
- CANx->FILTER.ACR[3] = check & 0xFF;
- CANx->FILTER.ACR[2] = (check >> 8) & 0xFF;
- CANx->FILTER.ACR[1] = (check >> 16) & 0xFF;
- CANx->FILTER.ACR[0] = (check >> 24) & 0xFF;
+ uint32_t i;
+ msg->format = (CANx->RXFRAME.INFO & CAN_INFO_FF_Msk) >> CAN_INFO_FF_Pos;
+
+ msg->remote = (CANx->RXFRAME.INFO & CAN_INFO_RTR_Msk) >> CAN_INFO_RTR_Pos;
+ msg->size = (CANx->RXFRAME.INFO & CAN_INFO_DLC_Msk) >> CAN_INFO_DLC_Pos;
+
+ if (msg->format == CAN_FRAME_STD)
+ {
+ msg->id = (CANx->RXFRAME.DATA[0] << 3) | (CANx->RXFRAME.DATA[1] >> 5);
+
+ for (i = 0; i < msg->size; i++)
+ {
+ msg->data[i] = CANx->RXFRAME.DATA[i + 2];
+ }
+ }
+ else //if(msg->format == CAN_FRAME_EXT)
+ {
+ msg->id = (CANx->RXFRAME.DATA[0] << 21) | (CANx->RXFRAME.DATA[1] << 13) | (CANx->RXFRAME.DATA[2] << 5) | (CANx->RXFRAME.DATA[3] >> 3);
+
+ for (i = 0; i < msg->size; i++)
+ {
+ msg->data[i] = CANx->RXFRAME.DATA[i + 4];
+ }
+ }
+
+ CANx->CMD = (1 << CAN_CMD_RRB_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_SetFilter16b()
-* ����˵��: ���ý����˲�����2��16λ�˲���
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* uint16_t check1 ��maskһ������˽��յ���Message�Ƿ����Լ���Ҫ�ģ�check & (~mask) == ID & (~mask)��Messageͨ������
-* uint16_t mask1
-* uint16_t check2
-* uint16_t mask2
-* �� ��: ��
-* ע������: ����ǰ��Ҫ�ȵ���CAN_Close()�ر�CANģ��
+* 函数名称: CAN_TXComplete()
+* 功能说明: 发送是否完成
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: uint32_t 1 已经完成 0 还未完成
+* 注意事项: 发送被Abort也会触发发送完成,但不会触发发送成功
******************************************************************************************************************************************/
-void CAN_SetFilter16b(CAN_TypeDef * CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2)
+uint32_t CAN_TXComplete(CAN_TypeDef *CANx)
{
- CANx->CR &= ~CAN_CR_AFM_Msk;
- CANx->CR |= (CAN_FILTER_16b << CAN_CR_AFM_Pos);
-
- CANx->FILTER.AMR[3] = mask1 & 0xFF;
- CANx->FILTER.AMR[2] = (mask1 >> 8) & 0xFF;
- CANx->FILTER.AMR[1] = mask2 & 0xFF;
- CANx->FILTER.AMR[0] = (mask2 >> 8) & 0xFF;
-
- CANx->FILTER.ACR[3] = check1 & 0xFF;
- CANx->FILTER.ACR[2] = (check1 >> 8) & 0xFF;
- CANx->FILTER.ACR[1] = check2 & 0xFF;
- CANx->FILTER.ACR[0] = (check2 >> 8) & 0xFF;
+ return (CANx->SR & CAN_SR_TXBR_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: CAN_INTRXNotEmptyEn()
-* ����˵��: ��RX FIFO��������ʱ���ǿգ������ж�ʹ��
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_TXSuccess()
+* 功能说明: 发送是否成功
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: uint32_t 1 发送成功 0 发送失败
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTRXNotEmptyEn(CAN_TypeDef * CANx)
+uint32_t CAN_TXSuccess(CAN_TypeDef *CANx)
{
- CANx->IE |= (1 << CAN_IE_RXDA_Pos);
+ return (CANx->SR & CAN_SR_TXOK_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: CAN_INTRXNotEmptyDis()
-* ����˵��: ��RX FIFO��������ʱ���ǿգ������жϽ�ֹ
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_AbortTransmit()
+* 功能说明: 终止发送
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 正在进行的发送无法终止,但执行此命令后若发送失败不会再重发
******************************************************************************************************************************************/
-void CAN_INTRXNotEmptyDis(CAN_TypeDef * CANx)
+void CAN_AbortTransmit(CAN_TypeDef *CANx)
{
- CANx->IE &= ~(1 << CAN_IE_RXDA_Pos);
+ CANx->CMD = (1 << CAN_CMD_ABTTX_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTRXNotEmptyStat()
-* ����˵��: RX FIFO�ǿ��ж��Ƿ񴥷�
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: uint32_t 1 �Ѵ��� 0 δ����
-* ע������: ��
+* 函数名称: CAN_TXBufferReady()
+* 功能说明: TX Buffer是否准备好可以写入消息
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: uint32_t 1 已准备好 0 未准备好
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t CAN_INTRXNotEmptyStat(CAN_TypeDef * CANx)
+uint32_t CAN_TXBufferReady(CAN_TypeDef *CANx)
{
- return (CANx->IF & CAN_IF_RXDA_Msk) ? 1 : 0;
+ return (CANx->SR & CAN_SR_TXBR_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: CAN_INTTXBufEmptyEn()
-* ����˵��: ��TX Buffer��ʱ�����ж�ʹ��
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_RXDataAvailable()
+* 功能说明: RX FIFO中是否有数据可读出
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: uint32_t 1 有数据可读出 0 没有数据
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTTXBufEmptyEn(CAN_TypeDef * CANx)
+uint32_t CAN_RXDataAvailable(CAN_TypeDef *CANx)
{
- CANx->IE |= (1 << CAN_IE_TXBR_Pos);
+ return (CANx->SR & CAN_SR_RXDA_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: CAN_INTTXBufEmptyDis()
-* ����˵��: ��TX Buffer��ʱ�����жϽ�ֹ
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_SetBaudrate()
+* 功能说明: 设置波特率
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* uint32_t baudrate 波特率,即位传输速率
+* uint32_t CAN_BS1 CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
+* uint32_t CAN_BS2 CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
+* uint32_t CAN_SJW CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
+* 输 出: 无
+* 注意事项: 设置前需要先调用CAN_Close()关闭CAN模块
******************************************************************************************************************************************/
-void CAN_INTTXBufEmptyDis(CAN_TypeDef * CANx)
+void CAN_SetBaudrate(CAN_TypeDef *CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW)
{
- CANx->IE &= ~(1 << CAN_IE_TXBR_Pos);
+ CANx->BT1 = (0 << CAN_BT1_SAM_Pos) |
+ (CAN_BS1 << CAN_BT1_TSEG1_Pos) |
+ (CAN_BS2 << CAN_BT1_TSEG2_Pos);
+
+ CANx->BT0 = (CAN_SJW << CAN_BT0_SJW_Pos) |
+ ((SystemCoreClock / 2 / baudrate / (1 + (CAN_BS1 + 1) + (CAN_BS2 + 1)) - 1) << CAN_BT0_BRP_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTTXBufEmptyStat()
-* ����˵��: TX Buffer���ж��Ƿ񴥷�
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: uint32_t 1 �Ѵ��� 0 δ����
-* ע������: ��
+* 函数名称: CAN_SetFilter32b()
+* 功能说明: 设置接收滤波器,1个32位滤波器
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* uint32_t check 与mask一起决定了接收到的Message是否是自己需要的:check & (~mask) == ID & (~mask)的Message通过过滤
+* uint32_t mask
+* 输 出: 无
+* 注意事项: 设置前需要先调用CAN_Close()关闭CAN模块
******************************************************************************************************************************************/
-uint32_t CAN_INTTXBufEmptyStat(CAN_TypeDef * CANx)
+void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask)
{
- return (CANx->IF & CAN_IF_TXBR_Msk) ? 1 : 0;
+ CANx->CR &= ~CAN_CR_AFM_Msk;
+ CANx->CR |= (CAN_FILTER_32b << CAN_CR_AFM_Pos);
+
+ CANx->FILTER.AMR[3] = mask & 0xFF;
+ CANx->FILTER.AMR[2] = (mask >> 8) & 0xFF;
+ CANx->FILTER.AMR[1] = (mask >> 16) & 0xFF;
+ CANx->FILTER.AMR[0] = (mask >> 24) & 0xFF;
+
+ CANx->FILTER.ACR[3] = check & 0xFF;
+ CANx->FILTER.ACR[2] = (check >> 8) & 0xFF;
+ CANx->FILTER.ACR[1] = (check >> 16) & 0xFF;
+ CANx->FILTER.ACR[0] = (check >> 24) & 0xFF;
}
/******************************************************************************************************************************************
-* ��������: CAN_INTErrWarningEn()
-* ����˵��: TXERR/RXERR����ֵ�ﵽError Warning Limitʱ�����ж�ʹ��
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_SetFilter16b()
+* 功能说明: 设置接收滤波器,2个16位滤波器
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* uint16_t check1 与mask一起决定了接收到的Message是否是自己需要的:check & (~mask) == ID & (~mask)的Message通过过滤
+* uint16_t mask1
+* uint16_t check2
+* uint16_t mask2
+* 输 出: 无
+* 注意事项: 设置前需要先调用CAN_Close()关闭CAN模块
******************************************************************************************************************************************/
-void CAN_INTErrWarningEn(CAN_TypeDef * CANx)
+void CAN_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2)
{
- CANx->IE |= (1 << CAN_IE_ERRWARN_Pos);
+ CANx->CR &= ~CAN_CR_AFM_Msk;
+ CANx->CR |= (CAN_FILTER_16b << CAN_CR_AFM_Pos);
+
+ CANx->FILTER.AMR[3] = mask1 & 0xFF;
+ CANx->FILTER.AMR[2] = (mask1 >> 8) & 0xFF;
+ CANx->FILTER.AMR[1] = mask2 & 0xFF;
+ CANx->FILTER.AMR[0] = (mask2 >> 8) & 0xFF;
+
+ CANx->FILTER.ACR[3] = check1 & 0xFF;
+ CANx->FILTER.ACR[2] = (check1 >> 8) & 0xFF;
+ CANx->FILTER.ACR[1] = check2 & 0xFF;
+ CANx->FILTER.ACR[0] = (check2 >> 8) & 0xFF;
}
/******************************************************************************************************************************************
-* ��������: CAN_INTErrWarningDis()
-* ����˵��: TXERR/RXERR����ֵ�ﵽError Warning Limitʱ�����жϽ�ֹ
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_INTRXNotEmptyEn()
+* 功能说明: 当RX FIFO中有数据时(非空)触发中断使能
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTErrWarningDis(CAN_TypeDef * CANx)
+void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx)
{
- CANx->IE &= ~(1 << CAN_IE_ERRWARN_Pos);
+ CANx->IE |= (1 << CAN_IE_RXDA_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTErrWarningStat()
-* ����˵��: TXERR/RXERR����ֵ�ﵽError Warning Limit�ж��Ƿ񴥷�
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: uint32_t 1 �Ѵ��� 0 δ����
-* ע������: ��
+* 函数名称: CAN_INTRXNotEmptyDis()
+* 功能说明: 当RX FIFO中有数据时(非空)触发中断禁止
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t CAN_INTErrWarningStat(CAN_TypeDef * CANx)
+void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx)
{
- return (CANx->IF & CAN_IF_ERRWARN_Msk) ? 1 : 0;
+ CANx->IE &= ~(1 << CAN_IE_RXDA_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTRXOverflowEn()
-* ����˵��: RX FIFO ���ʱ�����ж�ʹ��
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_INTTXBufEmptyEn()
+* 功能说明: 当TX Buffer空时触发中断使能
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTRXOverflowEn(CAN_TypeDef * CANx)
+void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx)
{
- CANx->IE |= (1 << CAN_IE_RXOV_Pos);
+ CANx->IE |= (1 << CAN_IE_TXBR_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTRXOverflowDis()
-* ����˵��: RX FIFO ���ʱ�����жϽ�ֹ
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_INTTXBufEmptyDis()
+* 功能说明: 当TX Buffer空时触发中断禁止
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTRXOverflowDis(CAN_TypeDef * CANx)
+void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx)
{
- CANx->IE &= ~(1 << CAN_IE_RXOV_Pos);
+ CANx->IE &= ~(1 << CAN_IE_TXBR_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTRXOverflowStat()
-* ����˵��: RX FIFO ����ж��Ƿ񴥷�
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: uint32_t 1 �Ѵ��� 0 δ����
-* ע������: ��
+* 函数名称: CAN_INTErrWarningEn()
+* 功能说明: TXERR/RXERR计数值达到Error Warning Limit时触发中断使能
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t CAN_INTRXOverflowStat(CAN_TypeDef * CANx)
+void CAN_INTErrWarningEn(CAN_TypeDef *CANx)
{
- return (CANx->IF & CAN_IF_RXOV_Msk) ? 1 : 0;
+ CANx->IE |= (1 << CAN_IE_ERRWARN_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTRXOverflowClear()
-* ����˵��: RX FIFO ����ж����
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_INTErrWarningDis()
+* 功能说明: TXERR/RXERR计数值达到Error Warning Limit时触发中断禁止
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTRXOverflowClear(CAN_TypeDef * CANx)
+void CAN_INTErrWarningDis(CAN_TypeDef *CANx)
{
- CANx->CMD = (1 << CAN_CMD_CLROV_Pos);
+ CANx->IE &= ~(1 << CAN_IE_ERRWARN_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTWakeupEn()
-* ����˵��: �����¼������ж�ʹ��
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_INTRXOverflowEn()
+* 功能说明: RX FIFO 溢出时触发中断使能
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTWakeupEn(CAN_TypeDef * CANx)
+void CAN_INTRXOverflowEn(CAN_TypeDef *CANx)
{
- CANx->IE |= (1 << CAN_IE_WKUP_Pos);
+ CANx->IE |= (1 << CAN_IE_RXOV_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTWakeupDis()
-* ����˵��: �����¼������жϽ�ֹ
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_INTRXOverflowDis()
+* 功能说明: RX FIFO 溢出时触发中断禁止
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTWakeupDis(CAN_TypeDef * CANx)
+void CAN_INTRXOverflowDis(CAN_TypeDef *CANx)
{
- CANx->IE &= ~(1 << CAN_IE_WKUP_Pos);
+ CANx->IE &= ~(1 << CAN_IE_RXOV_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTWakeupStat()
-* ����˵��: �����¼��ж��Ƿ񴥷�
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: uint32_t 1 �Ѵ��� 0 δ����
-* ע������: ��
+* 函数名称: CAN_INTRXOverflowClear()
+* 功能说明: RX FIFO 溢出中断清除
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t CAN_INTWakeupStat(CAN_TypeDef * CANx)
+void CAN_INTRXOverflowClear(CAN_TypeDef *CANx)
{
- return (CANx->IF & CAN_IF_WKUP_Msk) ? 1 : 0;
+ CANx->CMD = (1 << CAN_CMD_CLROV_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTErrPassiveEn()
-* ����˵��: TXERR/RXERR����ֵ�ﵽ127ʱ�ж�ʹ��
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_INTWakeupEn()
+* 功能说明: 唤醒事件触发中断使能
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTErrPassiveEn(CAN_TypeDef * CANx)
+void CAN_INTWakeupEn(CAN_TypeDef *CANx)
{
- CANx->IE |= (1 << CAN_IE_ERRPASS_Pos);
+ CANx->IE |= (1 << CAN_IE_WKUP_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTErrPassiveDis()
-* ����˵��: TXERR/RXERR����ֵ�ﵽ127ʱ�жϽ�ֹ
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_INTWakeupDis()
+* 功能说明: 唤醒事件触发中断禁止
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTErrPassiveDis(CAN_TypeDef * CANx)
+void CAN_INTWakeupDis(CAN_TypeDef *CANx)
{
- CANx->IE &= ~(1 << CAN_IE_ERRPASS_Pos);
+ CANx->IE &= ~(1 << CAN_IE_WKUP_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTErrPassiveStat()
-* ����˵��: TXERR/RXERR����ֵ�ﵽ127�ж��Ƿ񴥷�
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: uint32_t 1 �Ѵ��� 0 δ����
-* ע������: ��
+* 函数名称: CAN_INTErrPassiveEn()
+* 功能说明: TXERR/RXERR计数值达到127时中断使能
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t CAN_INTErrPassiveStat(CAN_TypeDef * CANx)
+void CAN_INTErrPassiveEn(CAN_TypeDef *CANx)
{
- return (CANx->IF & CAN_IF_ERRPASS_Msk) ? 1 : 0;
+ CANx->IE |= (1 << CAN_IE_ERRPASS_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTArbitrLostEn()
-* ����˵��: �ٲ�ʧ���ж�ʹ��
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_INTErrPassiveDis()
+* 功能说明: TXERR/RXERR计数值达到127时中断禁止
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTArbitrLostEn(CAN_TypeDef * CANx)
+void CAN_INTErrPassiveDis(CAN_TypeDef *CANx)
{
- CANx->IE |= (1 << CAN_IE_ARBLOST_Pos);
+ CANx->IE &= ~(1 << CAN_IE_ERRPASS_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTArbitrLostDis()
-* ����˵��: �ٲ�ʧ���жϽ�ֹ
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_INTArbitrLostEn()
+* 功能说明: 仲裁失败中断使能
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTArbitrLostDis(CAN_TypeDef * CANx)
+void CAN_INTArbitrLostEn(CAN_TypeDef *CANx)
{
- CANx->IE &= ~(1 << CAN_IE_ARBLOST_Pos);
+ CANx->IE |= (1 << CAN_IE_ARBLOST_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTArbitrLostStat()
-* ����˵��: �ٲ�ʧ���ж��Ƿ񴥷�
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: uint32_t 1 �Ѵ��� 0 δ����
-* ע������: ��
+* 函数名称: CAN_INTArbitrLostDis()
+* 功能说明: 仲裁失败中断禁止
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t CAN_INTArbitrLostStat(CAN_TypeDef * CANx)
+void CAN_INTArbitrLostDis(CAN_TypeDef *CANx)
{
- return (CANx->IF & CAN_IF_ARBLOST_Msk) ? 1 : 0;
+ CANx->IE &= ~(1 << CAN_IE_ARBLOST_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTBusErrorEn()
-* ����˵��: ���ߴ����ж�ʹ��
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_INTBusErrorEn()
+* 功能说明: 总线错误中断使能
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTBusErrorEn(CAN_TypeDef * CANx)
+void CAN_INTBusErrorEn(CAN_TypeDef *CANx)
{
- CANx->IE |= (1 << CAN_IE_BUSERR_Pos);
+ CANx->IE |= (1 << CAN_IE_BUSERR_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTBusErrorDis()
-* ����˵��: ���ߴ����жϽ�ֹ
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: ��
-* ע������: ��
+* 函数名称: CAN_INTBusErrorDis()
+* 功能说明: 总线错误中断禁止
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CAN_INTBusErrorDis(CAN_TypeDef * CANx)
+void CAN_INTBusErrorDis(CAN_TypeDef *CANx)
{
- CANx->IE &= ~(1 << CAN_IE_BUSERR_Pos);
+ CANx->IE &= ~(1 << CAN_IE_BUSERR_Pos);
}
/******************************************************************************************************************************************
-* ��������: CAN_INTBusErrorStat()
-* ����˵��: ���ߴ����ж��Ƿ񴥷�
-* �� ��: CAN_TypeDef * CANx ָ��Ҫ�����õ�CAN�ӿڣ���Чֵ����CAN
-* �� ��: uint32_t 1 �Ѵ��� 0 δ����
-* ע������: ��
+* 函数名称: CAN_INTStat()
+* 功能说明: 查询中断状态
+* 输 入: CAN_TypeDef * CANx 指定要被设置的CAN接口,有效值包括CAN
+* 输 出: uint32_t 当前中断状态
+* 注意事项: CANx->IF读取清零,因此在中断ISR中只能读取一次,不能多次读取
******************************************************************************************************************************************/
-uint32_t CAN_INTBusErrorStat(CAN_TypeDef * CANx)
+uint32_t CAN_INTStat(CAN_TypeDef *CANx)
{
- return (CANx->IF & CAN_IF_BUSERR_Msk) ? 1 : 0;
+ return CANx->IF;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.h
index 7b66ee4d5c..2b31a97c7d 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_can.h
@@ -1,136 +1,134 @@
#ifndef __SWM320_CAN_H__
#define __SWM320_CAN_H__
-#define CAN_FRAME_STD 0
-#define CAN_FRAME_EXT 1
+#define CAN_FRAME_STD 0
+#define CAN_FRAME_EXT 1
-typedef struct {
- uint8_t Mode; //CAN_MODE_NORMAL��CAN_MODE_LISTEN��CAN_MODE_SELFTEST
- uint8_t CAN_BS1; //CAN_BS1_1tq��CAN_BS1_2tq��... ... ��CAN_BS1_16tq
- uint8_t CAN_BS2; //CAN_BS2_1tq��CAN_BS2_2tq��... ... ��CAN_BS2_8tq
- uint8_t CAN_SJW; //CAN_SJW_1tq��CAN_SJW_2tq��CAN_SJW_3tq��CAN_SJW_4tq
- uint32_t Baudrate; //�����ʣ���λ�������ʣ�ȡֵ1--1000000
- uint8_t FilterMode; //CAN_FILTER_16b��CAN_FILTER_32b
- union {
- uint32_t FilterMask32b; //FilterCheck & (~FilterMask) == ID & (~FilterMask)��Messageͨ������
- struct { // 0 must match 1 don't care
- uint16_t FilterMask16b1;
- uint16_t FilterMask16b2;
- };
- };
- union {
- uint32_t FilterCheck32b;
- struct {
- uint16_t FilterCheck16b1;
- uint16_t FilterCheck16b2;
- };
- };
- uint8_t RXNotEmptyIEn; //����FIFO�ǿգ������ݿɶ�
- uint8_t RXOverflowIEn; //����FIFO����������ݶ�ʧ
- uint8_t ArbitrLostIEn; //��������ʧ�ٲñ�ɽ��շ�
- uint8_t ErrPassiveIEn; //����/���ʹ������ֵ�ﵽ127
+typedef struct
+{
+ uint8_t Mode; //CAN_MODE_NORMAL、CAN_MODE_LISTEN、CAN_MODE_SELFTEST
+ uint8_t CAN_BS1; //CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
+ uint8_t CAN_BS2; //CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
+ uint8_t CAN_SJW; //CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
+ uint32_t Baudrate; //波特率,即位传输速率,取值1--1000000
+ uint8_t FilterMode; //CAN_FILTER_16b、CAN_FILTER_32b
+ union
+ {
+ uint32_t FilterMask32b; //FilterCheck & (~FilterMask) == ID & (~FilterMask)的Message通过过滤
+ struct
+ { // 0 must match 1 don't care
+ uint16_t FilterMask16b1;
+ uint16_t FilterMask16b2;
+ };
+ };
+ union
+ {
+ uint32_t FilterCheck32b;
+ struct
+ {
+ uint16_t FilterCheck16b1;
+ uint16_t FilterCheck16b2;
+ };
+ };
+ uint8_t RXNotEmptyIEn; //接收FIFO非空,有数据可读
+ uint8_t RXOverflowIEn; //接收FIFO溢出,有数据丢失
+ uint8_t ArbitrLostIEn; //控制器丢失仲裁变成接收方
+ uint8_t ErrPassiveIEn; //接收/发送错误计数值达到127
} CAN_InitStructure;
-#define CAN_MODE_NORMAL 0 //����ģʽ
-#define CAN_MODE_LISTEN 1 //����ģʽ
-#define CAN_MODE_SELFTEST 2 //�Բ�ģʽ
+#define CAN_MODE_NORMAL 0 //常规模式
+#define CAN_MODE_LISTEN 1 //监听模式
+#define CAN_MODE_SELFTEST 2 //自测模式
-#define CAN_BS1_1tq 0
-#define CAN_BS1_2tq 1
-#define CAN_BS1_3tq 2
-#define CAN_BS1_4tq 3
-#define CAN_BS1_5tq 4
-#define CAN_BS1_6tq 5
-#define CAN_BS1_7tq 6
-#define CAN_BS1_8tq 7
-#define CAN_BS1_9tq 8
-#define CAN_BS1_10tq 9
-#define CAN_BS1_11tq 10
-#define CAN_BS1_12tq 11
-#define CAN_BS1_13tq 12
-#define CAN_BS1_14tq 13
-#define CAN_BS1_15tq 14
-#define CAN_BS1_16tq 15
+#define CAN_BS1_1tq 0
+#define CAN_BS1_2tq 1
+#define CAN_BS1_3tq 2
+#define CAN_BS1_4tq 3
+#define CAN_BS1_5tq 4
+#define CAN_BS1_6tq 5
+#define CAN_BS1_7tq 6
+#define CAN_BS1_8tq 7
+#define CAN_BS1_9tq 8
+#define CAN_BS1_10tq 9
+#define CAN_BS1_11tq 10
+#define CAN_BS1_12tq 11
+#define CAN_BS1_13tq 12
+#define CAN_BS1_14tq 13
+#define CAN_BS1_15tq 14
+#define CAN_BS1_16tq 15
-#define CAN_BS2_1tq 0
-#define CAN_BS2_2tq 1
-#define CAN_BS2_3tq 2
-#define CAN_BS2_4tq 3
-#define CAN_BS2_5tq 4
-#define CAN_BS2_6tq 5
-#define CAN_BS2_7tq 6
-#define CAN_BS2_8tq 7
+#define CAN_BS2_1tq 0
+#define CAN_BS2_2tq 1
+#define CAN_BS2_3tq 2
+#define CAN_BS2_4tq 3
+#define CAN_BS2_5tq 4
+#define CAN_BS2_6tq 5
+#define CAN_BS2_7tq 6
+#define CAN_BS2_8tq 7
-#define CAN_SJW_1tq 0
-#define CAN_SJW_2tq 1
-#define CAN_SJW_3tq 2
-#define CAN_SJW_4tq 3
+#define CAN_SJW_1tq 0
+#define CAN_SJW_2tq 1
+#define CAN_SJW_3tq 2
+#define CAN_SJW_4tq 3
-#define CAN_FILTER_16b 0 //����16�����
-#define CAN_FILTER_32b 1 //һ��32λ������
+#define CAN_FILTER_16b 0 //两个16位过滤器
+#define CAN_FILTER_32b 1 //一个32位过滤器
-typedef struct {
- uint32_t id; //��ϢID
- uint8_t format; //֡��ʽ��CAN_FRAME_STD��CAN_FRAME_EXT
- uint8_t remote; //��Ϣ�Ƿ�ΪԶ��֡
- uint8_t size; //���յ������ݸ���
- uint8_t data[8]; //���յ�������
+typedef struct
+{
+ uint32_t id; //消息ID
+ uint8_t format; //帧格式:CAN_FRAME_STD、CAN_FRAME_EXT
+ uint8_t remote; //消息是否为远程帧
+ uint8_t size; //接收到的数据个数
+ uint8_t data[8]; //接收到的数据
} CAN_RXMessage;
+void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct);
+void CAN_Open(CAN_TypeDef *CANx);
+void CAN_Close(CAN_TypeDef *CANx);
-void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct);
-void CAN_Open(CAN_TypeDef * CANx);
-void CAN_Close(CAN_TypeDef * CANx);
+void CAN_Transmit(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once);
+void CAN_TransmitRequest(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint32_t once);
+void CAN_Receive(CAN_TypeDef *CANx, CAN_RXMessage *msg);
-void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once);
-void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint32_t once);
-void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg);
+uint32_t CAN_TXComplete(CAN_TypeDef *CANx);
+uint32_t CAN_TXSuccess(CAN_TypeDef *CANx);
-uint32_t CAN_TXComplete(CAN_TypeDef * CANx);
-uint32_t CAN_TXSuccess(CAN_TypeDef * CANx);
+void CAN_AbortTransmit(CAN_TypeDef *CANx);
-void CAN_AbortTransmit(CAN_TypeDef * CANx);
+uint32_t CAN_TXBufferReady(CAN_TypeDef *CANx);
+uint32_t CAN_RXDataAvailable(CAN_TypeDef *CANx);
-uint32_t CAN_TXBufferReady(CAN_TypeDef * CANx);
-uint32_t CAN_RXDataAvailable(CAN_TypeDef * CANx);
+void CAN_SetBaudrate(CAN_TypeDef *CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW);
-void CAN_SetBaudrate(CAN_TypeDef * CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW);
+void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask);
+void CAN_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2);
-void CAN_SetFilter32b(CAN_TypeDef * CANx, uint32_t check, uint32_t mask);
-void CAN_SetFilter16b(CAN_TypeDef * CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2);
+void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx);
+void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx);
+void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx);
+void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx);
-void CAN_INTRXNotEmptyEn(CAN_TypeDef * CANx);
-void CAN_INTRXNotEmptyDis(CAN_TypeDef * CANx);
-uint32_t CAN_INTRXNotEmptyStat(CAN_TypeDef * CANx);
+void CAN_INTErrWarningEn(CAN_TypeDef *CANx);
+void CAN_INTErrWarningDis(CAN_TypeDef *CANx);
-void CAN_INTTXBufEmptyEn(CAN_TypeDef * CANx);
-void CAN_INTTXBufEmptyDis(CAN_TypeDef * CANx);
-uint32_t CAN_INTTXBufEmptyStat(CAN_TypeDef * CANx);
+void CAN_INTRXOverflowEn(CAN_TypeDef *CANx);
+void CAN_INTRXOverflowDis(CAN_TypeDef *CANx);
+void CAN_INTRXOverflowClear(CAN_TypeDef *CANx);
-void CAN_INTErrWarningEn(CAN_TypeDef * CANx);
-void CAN_INTErrWarningDis(CAN_TypeDef * CANx);
-uint32_t CAN_INTErrWarningStat(CAN_TypeDef * CANx);
+void CAN_INTWakeupEn(CAN_TypeDef *CANx);
+void CAN_INTWakeupDis(CAN_TypeDef *CANx);
-void CAN_INTRXOverflowEn(CAN_TypeDef * CANx);
-void CAN_INTRXOverflowDis(CAN_TypeDef * CANx);
-uint32_t CAN_INTRXOverflowStat(CAN_TypeDef * CANx);
-void CAN_INTRXOverflowClear(CAN_TypeDef * CANx);
+void CAN_INTErrPassiveEn(CAN_TypeDef *CANx);
+void CAN_INTErrPassiveDis(CAN_TypeDef *CANx);
-void CAN_INTWakeupEn(CAN_TypeDef * CANx);
-void CAN_INTWakeupDis(CAN_TypeDef * CANx);
-uint32_t CAN_INTWakeupStat(CAN_TypeDef * CANx);
+void CAN_INTArbitrLostEn(CAN_TypeDef *CANx);
+void CAN_INTArbitrLostDis(CAN_TypeDef *CANx);
-void CAN_INTErrPassiveEn(CAN_TypeDef * CANx);
-void CAN_INTErrPassiveDis(CAN_TypeDef * CANx);
-uint32_t CAN_INTErrPassiveStat(CAN_TypeDef * CANx);
+void CAN_INTBusErrorEn(CAN_TypeDef *CANx);
+void CAN_INTBusErrorDis(CAN_TypeDef *CANx);
-void CAN_INTArbitrLostEn(CAN_TypeDef * CANx);
-void CAN_INTArbitrLostDis(CAN_TypeDef * CANx);
-uint32_t CAN_INTArbitrLostStat(CAN_TypeDef * CANx);
-
-void CAN_INTBusErrorEn(CAN_TypeDef * CANx);
-void CAN_INTBusErrorDis(CAN_TypeDef * CANx);
-uint32_t CAN_INTBusErrorStat(CAN_TypeDef * CANx);
+uint32_t CAN_INTStat(CAN_TypeDef *CANx);
#endif //__SWM320_CAN_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.c
index 52634deebb..d07cd28689 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_crc.c
-* ����˵��: SWM320��Ƭ����CRCģ��������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_crc.c
+* 功能说明: SWM320单片机的CRC模块驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,31 +21,30 @@
#include "SWM320.h"
#include "SWM320_crc.h"
-
/******************************************************************************************************************************************
-* ��������: CRC_Init()
-* ����˵��: CRC ��ʼ��
-* �� ��: CRC_TypeDef * CRCx ָ��Ҫ�����õ�CRC�ӿڣ���Чֵ����CRC
-* uint32_t mode ����ģʽ����Чֵ�У�CRC32_IN32��CRC32_IN16��CRC32_IN8��CRC16_IN16��CRC16_IN8
-* uint32_t out_not �������Ƿ�ȡ��
-* uint32_t out_rev �������Ƿ�ת
-* uint32_t ini_val CRC��ʼֵ
-* �� ��: ��
-* ע������: ��
+* 函数名称: CRC_Init()
+* 功能说明: CRC 初始化
+* 输 入: CRC_TypeDef * CRCx 指定要被设置的CRC接口,有效值包括CRC
+* uint32_t mode 工作模式,有效值有:CRC32_IN32、CRC32_IN16、CRC32_IN8、CRC16_IN16、CRC16_IN8
+* uint32_t out_not 输出结果是否取反
+* uint32_t out_rev 输出结果是否翻转
+* uint32_t ini_val CRC初始值
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void CRC_Init(CRC_TypeDef * CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val)
+void CRC_Init(CRC_TypeDef *CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val)
{
- switch((uint32_t)CRCx)
- {
- case ((uint32_t)CRC):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_CRC_Pos);
- break;
- }
-
- CRCx->CR = (1 << CRC_CR_EN_Pos) |
- (mode << CRC_CR_CRC16_Pos) |
- (out_not << CRC_CR_ONOT_Pos) |
- (out_rev << CRC_CR_OREV_Pos);
-
- CRCx->INIVAL = ini_val;
+ switch ((uint32_t)CRCx)
+ {
+ case ((uint32_t)CRC):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_CRC_Pos);
+ break;
+ }
+
+ CRCx->CR = (1 << CRC_CR_EN_Pos) |
+ (mode << CRC_CR_CRC16_Pos) |
+ (out_not << CRC_CR_ONOT_Pos) |
+ (out_rev << CRC_CR_OREV_Pos);
+
+ CRCx->INIVAL = ini_val;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.h
index ce9f1f3731..639db18cd0 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_crc.h
@@ -1,39 +1,36 @@
#ifndef __SWM320_CRC_H__
#define __SWM320_CRC_H__
+#define CRC32_IN32 0 //CRC32算法,输入数据32位
+#define CRC32_IN16 2 //CRC32算法,输入数据16位
+#define CRC32_IN8 4 //CRC32算法,输入数据 8位
+#define CRC16_IN16 3 //CRC16算法,输入数据16位
+#define CRC16_IN8 5 //CRC16算法,输入数据 8位
-#define CRC32_IN32 0 //CRC32�㷨����������32λ
-#define CRC32_IN16 2 //CRC32�㷨����������16λ
-#define CRC32_IN8 4 //CRC32�㷨���������� 8λ
-#define CRC16_IN16 3 //CRC16�㷨����������16λ
-#define CRC16_IN8 5 //CRC16�㷨���������� 8λ
-
-
-void CRC_Init(CRC_TypeDef * CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val);
-
+void CRC_Init(CRC_TypeDef *CRCx, uint32_t mode, uint32_t out_not, uint32_t out_rev, uint32_t ini_val);
/******************************************************************************************************************************************
-* ��������: CRC_Write()
-* ����˵��: CRCд������
-* �� ��: uint32_t data Ҫд�������
-* �� ��: ��
-* ע������: ��
+* 函数名称: CRC_Write()
+* 功能说明: CRC写入数据
+* 输 入: uint32_t data 要写入的数据
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
static __INLINE void CRC_Write(uint32_t data)
{
- CRC->DATAIN = data;
+ CRC->DATAIN = data;
}
/******************************************************************************************************************************************
-* ��������: CRC_Result()
-* ����˵��: ��ȡCRC������
-* �� ��: ��
-* �� ��: uint32_t CRC ������
-* ע������: ��
+* 函数名称: CRC_Result()
+* 功能说明: 获取CRC计算结果
+* 输 入: 无
+* 输 出: uint32_t CRC 计算结果
+* 注意事项: 无
******************************************************************************************************************************************/
static __INLINE uint32_t CRC_Result(void)
{
- return CRC->RESULT;
+ return CRC->RESULT;
}
#endif //__SWM320_CRC_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.c
index 78db4ee2dd..b52e8b5f39 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_dma.c
-* ����˵��: SWM320��Ƭ����DMA����������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_dma.c
+* 功能说明: SWM320单片机的DMA功能驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -22,117 +22,119 @@
#include "SWM320_dma.h"
/******************************************************************************************************************************************
-* ��������: DMA_CHM_Config()
-* ����˵��: DMAͨ�����ã����ڴ洢���䣨��Flash��RAM�䣩��������
-* �� ��: uint32_t chn ָ��Ҫ���õ�ͨ������Чֵ��DMA_CH0��DMA_CH1��DMA_CH2
-* uint32_t src_addr Դ��ַ�������ֶ��룬����ַ�����2λ������00
-* uint32_t src_addr_incr 0 �̶���ַ 1 ��ַ����
-* uint32_t dst_addr Ŀ�ĵ�ַ�������ֶ��룬����ַ�����2λ������00
-* uint32_t dst_addr_incr 0 �̶���ַ 1 ��ַ����
-* uint32_t num_word Ҫ���˵��������������1024
-* uint32_t int_en �ж�ʹ�ܣ�1 ���ݰ�����ɺ�����ж� 0 ���ݰ�����ɺ󲻲����ж�
-* �� ��: ��
-* ע������: ��������������Ϊ��Ԫ�������ֽ�
+* 函数名称: DMA_CHM_Config()
+* 功能说明: DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
+* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
+* uint32_t src_addr 源地址,必须字对齐,即地址的最低2位必须是00
+* uint32_t src_addr_incr 0 固定地址 1 地址递增
+* uint32_t dst_addr 目的地址,必须字对齐,即地址的最低2位必须是00
+* uint32_t dst_addr_incr 0 固定地址 1 地址递增
+* uint32_t num_word 要搬运的数据字数,最大1024
+* uint32_t int_en 中断使能,1 数据搬运完成后产生中断 0 数据搬运完成后不产生中断
+* 输 出: 无
+* 注意事项: 搬运数据量以字为单元,不是字节
******************************************************************************************************************************************/
void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en)
{
- DMA->EN = 1; //ÿ��ͨ�������Լ������Ŀ��ؿ��ƣ������ܿ��ؿ�����һֱ������
-
- DMA_CH_Close(chn); //����ǰ�ȹرո�ͨ��
-
- DMA->CH[chn].SRC = src_addr;
- DMA->CH[chn].DST = dst_addr;
-
- DMA->CH[chn].CR = ((num_word*4-1) << DMA_CR_LEN_Pos) |
- (0 << DMA_CR_AUTORE_Pos);
-
- DMA->CH[chn].AM = (src_addr_incr << DMA_AM_SRCAM_Pos) |
- (dst_addr_incr << DMA_AM_DSTAM_Pos) |
- (0 << DMA_AM_BURST_Pos);
-
- DMA->IF = (1 << chn); //����жϱ�־
- DMA->IE |= (1 << chn);
- if(int_en) DMA->IM &= ~(1 << chn);
- else DMA->IM |= (1 << chn);
-
- if(int_en)
- {
- NVIC_EnableIRQ(DMA_IRQn);
- }
- else
- {
- //���ܵ���NVIC_DisalbeIRQ(DMA_IRQn)����Ϊ����ͨ������ʹ��DMA�ж�
- }
+ DMA->EN = 1; //每个通道都有自己独立的开关控制,所以总开关可以是一直开启的
+
+ DMA_CH_Close(chn); //配置前先关闭该通道
+
+ DMA->CH[chn].SRC = src_addr;
+ DMA->CH[chn].DST = dst_addr;
+
+ DMA->CH[chn].CR = ((num_word * 4 - 1) << DMA_CR_LEN_Pos) |
+ (0 << DMA_CR_AUTORE_Pos);
+
+ DMA->CH[chn].AM = (src_addr_incr << DMA_AM_SRCAM_Pos) |
+ (dst_addr_incr << DMA_AM_DSTAM_Pos) |
+ (0 << DMA_AM_BURST_Pos);
+
+ DMA->IF = (1 << chn); //清除中断标志
+ DMA->IE |= (1 << chn);
+ if (int_en)
+ DMA->IM &= ~(1 << chn);
+ else
+ DMA->IM |= (1 << chn);
+
+ if (int_en)
+ {
+ NVIC_EnableIRQ(DMA_IRQn);
+ }
+ else
+ {
+ //不能调用NVIC_DisalbeIRQ(DMA_IRQn),因为其他通道可能使用DMA中断
+ }
}
/******************************************************************************************************************************************
-* ��������: DMA_CH_Open()
-* ����˵��: DMAͨ����
-* �� ��: uint32_t chn ָ��Ҫ���õ�ͨ������Чֵ��DMA_CH0��DMA_CH1��DMA_CH2
-* �� ��: ��
-* ע������: ��
+* 函数名称: DMA_CH_Open()
+* 功能说明: DMA通道打开
+* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_Open(uint32_t chn)
{
- DMA->CH[chn].CR |= (1 << DMA_CR_TXEN_Pos);
+ DMA->CH[chn].CR |= (1 << DMA_CR_TXEN_Pos);
}
/******************************************************************************************************************************************
-* ��������: DMA_CH_Close()
-* ����˵��: DMAͨ���ر�
-* �� ��: uint32_t chn ָ��Ҫ���õ�ͨ������Чֵ��DMA_CH0��DMA_CH1��DMA_CH2
-* �� ��: ��
-* ע������: ��
+* 函数名称: DMA_CH_Close()
+* 功能说明: DMA通道关闭
+* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_Close(uint32_t chn)
{
- DMA->CH[chn].CR &= ~(1 << DMA_CR_TXEN_Pos);
+ DMA->CH[chn].CR &= ~(1 << DMA_CR_TXEN_Pos);
}
/******************************************************************************************************************************************
-* ��������: DMA_CH_INTEn()
-* ����˵��: DMA�ж�ʹ�ܣ����ݰ�����ɺ󴥷��ж�
-* �� ��: uint32_t chn ָ��Ҫ���õ�ͨ������Чֵ��DMA_CH0��DMA_CH1��DMA_CH2
-* �� ��: ��
-* ע������: ��
+* 函数名称: DMA_CH_INTEn()
+* 功能说明: DMA中断使能,数据搬运完成后触发中断
+* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_INTEn(uint32_t chn)
{
- DMA->IM &= ~(1 << chn);
+ DMA->IM &= ~(1 << chn);
}
/******************************************************************************************************************************************
-* ��������: DMA_CH_INTDis()
-* ����˵��: DMA�жϽ�ֹ�����ݰ�����ɺ󲻴����ж�
-* �� ��: uint32_t chn ָ��Ҫ���õ�ͨ������Чֵ��DMA_CH0��DMA_CH1��DMA_CH2
-* �� ��: ��
-* ע������: ��
+* 函数名称: DMA_CH_INTDis()
+* 功能说明: DMA中断禁止,数据搬运完成后不触发中断
+* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_INTDis(uint32_t chn)
{
- DMA->IM |= (1 << chn);
+ DMA->IM |= (1 << chn);
}
/******************************************************************************************************************************************
-* ��������: DMA_CH_INTClr()
-* ����˵��: DMA�жϱ�־���
-* �� ��: uint32_t chn ָ��Ҫ���õ�ͨ������Чֵ��DMA_CH0��DMA_CH1��DMA_CH2
-* �� ��: ��
-* ע������: ��
+* 函数名称: DMA_CH_INTClr()
+* 功能说明: DMA中断标志清除
+* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
void DMA_CH_INTClr(uint32_t chn)
{
- DMA->IF = (1 << chn);
+ DMA->IF = (1 << chn);
}
/******************************************************************************************************************************************
-* ��������: DMA_CH_INTStat()
-* ����˵��: DMA�ж�״̬��ѯ
-* �� ��: uint32_t chn ָ��Ҫ���õ�ͨ������Чֵ��DMA_CH0��DMA_CH1��DMA_CH2
-* �� ��: uint32_t 1 ���ݰ������ 0 ���ݰ���δ���
-* ע������: ��
+* 函数名称: DMA_CH_INTStat()
+* 功能说明: DMA中断状态查询
+* 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
+* 输 出: uint32_t 1 数据搬运完成 0 数据搬运未完成
+* 注意事项: 无
******************************************************************************************************************************************/
uint32_t DMA_CH_INTStat(uint32_t chn)
-{
- return (DMA->IF & (1 << chn)) ? 1 : 0;
+{
+ return (DMA->IF & (1 << chn)) ? 1 : 0;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.h
index 817162cd65..b7391a0e9e 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_dma.h
@@ -1,20 +1,17 @@
#ifndef __SWM320_DMA_H__
#define __SWM320_DMA_H__
+#define DMA_CH0 0
+#define DMA_CH1 1
+#define DMA_CH2 2
-#define DMA_CH0 0
-#define DMA_CH1 1
-#define DMA_CH2 2
-
-
-void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en); //DMAͨ�����ã����ڴ洢���䣨��Flash��RAM�䣩��������
-void DMA_CH_Open(uint32_t chn); //DMAͨ����
-void DMA_CH_Close(uint32_t chn); //DMAͨ���ر�
-
-void DMA_CH_INTEn(uint32_t chn); //DMA�ж�ʹ�ܣ����ݰ�����ɺ󴥷��ж�
-void DMA_CH_INTDis(uint32_t chn); //DMA�жϽ�ֹ�����ݰ�����ɺ󲻴����ж�
-void DMA_CH_INTClr(uint32_t chn); //DMA�жϱ�־���
-uint32_t DMA_CH_INTStat(uint32_t chn); //DMA�ж�״̬��ѯ��1 ���ݰ������ 0 ���ݰ���δ���
+void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en); //DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
+void DMA_CH_Open(uint32_t chn); //DMA通道打开
+void DMA_CH_Close(uint32_t chn); //DMA通道关闭
+void DMA_CH_INTEn(uint32_t chn); //DMA中断使能,数据搬运完成后触发中断
+void DMA_CH_INTDis(uint32_t chn); //DMA中断禁止,数据搬运完成后不触发中断
+void DMA_CH_INTClr(uint32_t chn); //DMA中断标志清除
+uint32_t DMA_CH_INTStat(uint32_t chn); //DMA中断状态查询,1 数据搬运完成 0 数据搬运未完成
#endif //__SWM320_DMA_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.c
index 8275b602d1..f4a15e8c2c 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_exti.c
-* ����˵��: SWM320��Ƭ�����ⲿ�жϹ���������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_exti.c
+* 功能说明: SWM320单片机的外部中断功能驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*******************************************************************************************************************************************
* @attention
@@ -21,111 +21,111 @@
#include "SWM320_exti.h"
/******************************************************************************************************************************************
-* ��������: EXTI_Init()
-* ����˵��: ָ�������ⲿ�жϳ�ʼ��
-* �� ��: GPIO_TypeDef * GPIOx ָ�������ⲿ�жϵ�GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ�������ⲿ�жϵ�GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* uint32_t mode ��Чֵ��EXTI_FALL_EDGE��EXTI_RISE_EDGE��EXTI_BOTH_EDGE��EXTI_LOW_LEVEL��EXTI_HIGH_LEVEL
-* �� ��: ��
-* ע������: ����GPIOA��GPIOB��GPIOC��GPIOM��PIN0--7���ż����Խ���NVIC�е������жϣ���GPIOA0_IRQn����Ҳ���Խ���NVIC�����жϣ�GPIOA_IRQn����
-* ���Բ��ڴ˺����е���NVIC_EnableIRQ()ʹ��NVIC�жϣ��Ӷ����Ը�����Ҫ����NVIC_EnableIRQ(GPIOA0_IRQn)��NVIC_EnableIRQ(GPIOA_IRQn)
+* 函数名称: EXTI_Init()
+* 功能说明: 指定引脚外部中断初始化
+* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* uint32_t mode 有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL
+* 输 出: 无
+* 注意事项: 由于GPIOA、GPIOB、GPIOC、GPIOM的PIN0--7引脚即可以接入NVIC中的引脚中断(如GPIOA0_IRQn),也可以接入NVIC的组中断(GPIOA_IRQn),
+* 所以不在此函数中调用NVIC_EnableIRQ()使能NVIC中断,从而可以根据需要调用NVIC_EnableIRQ(GPIOA0_IRQn)和NVIC_EnableIRQ(GPIOA_IRQn)
******************************************************************************************************************************************/
-void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode)
+void EXTI_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t mode)
{
- EXTI_Close(GPIOx, n); //���ùؼ��Ĵ���ǰ�ȹر�
-
- if(mode & 0x10)
- {
- GPIOx->INTLVLTRG |= (0x01 << n); //��ƽ����
-
- if(mode & 0x01)
- GPIOx->INTRISEEN |= (0x01 << n); //�ߵ�ƽ����
- else
- GPIOx->INTRISEEN &= ~(0x01 << n); //�͵�ƽ����
- }
- else
- {
- GPIOx->INTLVLTRG &= ~(0x01 << n); //���ش���
-
- if(mode & 0x02)
- {
- GPIOx->INTBE |= (0x01 << n); //˫���ش���
- }
- else
- {
- GPIOx->INTBE &= ~(0x01 << n); //�����ش���
-
- if(mode & 0x01)
- GPIOx->INTRISEEN |= (0x01 << n); //�����ش���
- else
- GPIOx->INTRISEEN &= ~(0x01 << n); //�½��ش���
- }
- }
-
- GPIOx->INTCLR = (1 << n); //�������Ϊģʽ���ÿ��ܲ������ж�
+ EXTI_Close(GPIOx, n); //配置关键寄存器前先关闭
+
+ if (mode & 0x10)
+ {
+ GPIOx->INTLVLTRG |= (0x01 << n); //电平触发
+
+ if (mode & 0x01)
+ GPIOx->INTRISEEN |= (0x01 << n); //高电平触发
+ else
+ GPIOx->INTRISEEN &= ~(0x01 << n); //低电平触发
+ }
+ else
+ {
+ GPIOx->INTLVLTRG &= ~(0x01 << n); //边沿触发
+
+ if (mode & 0x02)
+ {
+ GPIOx->INTBE |= (0x01 << n); //双边沿触发
+ }
+ else
+ {
+ GPIOx->INTBE &= ~(0x01 << n); //单边沿触发
+
+ if (mode & 0x01)
+ GPIOx->INTRISEEN |= (0x01 << n); //上升沿触发
+ else
+ GPIOx->INTRISEEN &= ~(0x01 << n); //下降沿触发
+ }
+ }
+
+ GPIOx->INTCLR = (1 << n); //清除掉因为模式配置可能产生的中断
}
/******************************************************************************************************************************************
-* ��������: EXTI_Open()
-* ����˵��: ָ�������ⲿ�жϴ򿪣���ʹ�ܣ�
-* �� ��: GPIO_TypeDef * GPIOx ָ�������ⲿ�жϵ�GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ�������ⲿ�жϵ�GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* �� ��: ��
-* ע������: ��
+* 函数名称: EXTI_Open()
+* 功能说明: 指定引脚外部中断打开(即使能)
+* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n)
+void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n)
{
- GPIOx->INTEN |= (0x01 << n);
+ GPIOx->INTEN |= (0x01 << n);
}
/******************************************************************************************************************************************
-* ��������: EXTI_Close()
-* ����˵��: ָ�������ⲿ�жϹرգ������ܣ�
-* �� ��: GPIO_TypeDef * GPIOx ָ�������ⲿ�жϵ�GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ�������ⲿ�жϵ�GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* �� ��: ��
-* ע������: ��
+* 函数名称: EXTI_Close()
+* 功能说明: 指定引脚外部中断关闭(即禁能)
+* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n)
+void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n)
{
- GPIOx->INTEN &= ~(0x01 << n);
+ GPIOx->INTEN &= ~(0x01 << n);
}
/******************************************************************************************************************************************
-* ��������: EXTI_State()
-* ����˵��: ָ�������Ƿ񴥷����ж�
-* �� ��: GPIO_TypeDef * GPIOx ָ�������ⲿ�жϵ�GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ�������ⲿ�жϵ�GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* �� ��: uint32_t 1 �����Ŵ������ж� 0 ������δ�����ж�
-* ע������: ��
+* 函数名称: EXTI_State()
+* 功能说明: 指定引脚是否触发了中断
+* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* 输 出: uint32_t 1 此引脚触发了中断 0 此引脚未触发中断
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n)
+uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n)
{
- return (GPIOx->INTSTAT >> n) & 0x01;
+ return (GPIOx->INTSTAT >> n) & 0x01;
}
/******************************************************************************************************************************************
-* ��������: EXTI_RawState()
-* ����˵��: ָ�������Ƿ������/���жϴ��������������жϹر�ʱ��ͨ�����ô˺����Բ�ѯ�ķ�ʽ����������Ƿ������/���жϴ�������
-* �� ��: GPIO_TypeDef * GPIOx ָ�������ⲿ�жϵ�GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ�������ⲿ�жϵ�GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* �� ��: uint32_t 1 �����������/���жϴ������� 0 ������δ�����/���жϴ�������
-* ע������: ��
+* 函数名称: EXTI_RawState()
+* 功能说明: 指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
+* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* 输 出: uint32_t 1 此引脚满足过/了中断触发条件 0 此引脚未满足过/了中断触发条件
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t EXTI_RawState(GPIO_TypeDef * GPIOx, uint32_t n)
+uint32_t EXTI_RawState(GPIO_TypeDef *GPIOx, uint32_t n)
{
- return (GPIOx->INTRAWSTAT >> n) & 0x01;
+ return (GPIOx->INTRAWSTAT >> n) & 0x01;
}
/******************************************************************************************************************************************
-* ��������: EXTI_Clear()
-* ����˵��: ָ�������ⲿ�ж������������жϱ�־�������ٴν�����жϣ�
-* �� ��: GPIO_TypeDef * GPIOx ָ�������ⲿ�жϵ�GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ�������ⲿ�жϵ�GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* �� ��: ��
-* ע������: ֻ��������ش����жϵı�־����ƽ�����жϵı�־�޷������ֻ�������ŵ�ƽ�������жϴ���������Ӳ���Զ����
+* 函数名称: EXTI_Clear()
+* 功能说明: 指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
+* 输 入: GPIO_TypeDef * GPIOx 指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* 输 出: 无
+* 注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
******************************************************************************************************************************************/
-void EXTI_Clear(GPIO_TypeDef * GPIOx, uint32_t n)
+void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n)
{
- GPIOx->INTCLR = (0x01 << n);
+ GPIOx->INTCLR = (0x01 << n);
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.h
index 088cd9a619..818d647745 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_exti.h
@@ -1,20 +1,18 @@
#ifndef __SWM320_EXTI_H__
-#define __SWM320_EXTI_H__
+#define __SWM320_EXTI_H__
-void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode); //ָ�������ⲿ�жϳ�ʼ��
-void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n); //ָ�������ⲿ�жϴ򿪣���ʹ�ܣ�
-void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n); //ָ�������ⲿ�жϹرգ������ܣ�
+void EXTI_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t mode); //指定引脚外部中断初始化
+void EXTI_Open(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚外部中断打开(即使能)
+void EXTI_Close(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚外部中断关闭(即禁能)
-uint32_t EXTI_State(GPIO_TypeDef * GPIOx, uint32_t n); //ָ�������Ƿ񴥷����ж�
-uint32_t EXTI_RawState(GPIO_TypeDef * GPIOx, uint32_t n); //ָ�������Ƿ������/���жϴ��������������жϹر�ʱ��ͨ�����ô˺����Բ�ѯ�ķ�ʽ����������Ƿ������/���жϴ�������
-void EXTI_Clear(GPIO_TypeDef * GPIOx, uint32_t n); //ָ�������ⲿ�ж������������жϱ�־�������ٴν�����жϣ�
-
-
-#define EXTI_FALL_EDGE 0x00 //�½��ش����ж�
-#define EXTI_RISE_EDGE 0x01 //�����ش����ж�
-#define EXTI_BOTH_EDGE 0x02 //˫���ش����ж�
-#define EXTI_LOW_LEVEL 0x10 //�͵�ƽ�����ж�
-#define EXTI_HIGH_LEVEL 0x11 //�ߵ�ƽ�����ж�
+uint32_t EXTI_State(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚是否触发了中断
+uint32_t EXTI_RawState(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚是否满足过/了中断触发条件,当此中断关闭时可通过调用此函数以查询的方式检测引脚上是否满足过/了中断触发条件
+void EXTI_Clear(GPIO_TypeDef *GPIOx, uint32_t n); //指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
+#define EXTI_FALL_EDGE 0x00 //下降沿触发中断
+#define EXTI_RISE_EDGE 0x01 //上升沿触发中断
+#define EXTI_BOTH_EDGE 0x02 //双边沿触发中断
+#define EXTI_LOW_LEVEL 0x10 //低电平触发中断
+#define EXTI_HIGH_LEVEL 0x11 //高电平触发中断
#endif //__SWM320_EXTI_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.c
index dbd0eca4bf..0d2b19812f 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_flash.c
-* ����˵��: ʹ��оƬ��IAP���ܽ�Ƭ��Flashģ���EEPROM���������ݣ�����󲻶�ʧ
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_flash.c
+* 功能说明: 使用芯片的IAP功能将片上Flash模拟成EEPROM来保存数据,掉电后不丢失
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*******************************************************************************************************************************************
* @attention
*
@@ -19,63 +19,77 @@
#include "SWM320.h"
#include "SWM320_flash.h"
-
IAP_Cache_Reset_t IAP_Cache_Reset = (IAP_Cache_Reset_t)0x11000601;
IAP_Flash_Param_t IAP_Flash_Param = (IAP_Flash_Param_t)0x11000681;
IAP_Flash_Erase_t IAP_Flash_Erase = (IAP_Flash_Erase_t)0x11000781;
IAP_Flash_Write_t IAP_Flash_Write = (IAP_Flash_Write_t)0x11000801;
-
/******************************************************************************************************************************************
-* ��������: FLASH_Erase()
-* ����˵��: Ƭ��Flash����
-* �� ��: uint32_t addr ������ַ��������СΪ4K Byte
-* �� ��: ��
-* ע������: ��
+* 函数名称: FLASH_Erase()
+* 功能说明: 片内Flash擦除
+* 输 入: uint32_t addr 擦除地址,扇区大小为4K Byte
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
void FLASH_Erase(uint32_t addr)
-{
- __disable_irq();
-
- IAP_Flash_Erase(addr / 0x1000);
-
- IAP_Cache_Reset();
-
- __enable_irq();
+{
+ __disable_irq();
+
+ IAP_Flash_Erase(addr / 0x1000);
+
+ IAP_Cache_Reset();
+
+ __enable_irq();
}
/******************************************************************************************************************************************
-* ��������: FLASH_Write()
-* ����˵��: Ƭ��Flashд��
-* �� ��: uint32_t addr д���ַ
-* uint32_t buff[] Ҫд�������
-* uint32_t count Ҫд�����ݵĸ���������Ϊ��λ���ұ�����4����������������д��4����
-* �� ��: ��
-* ע������: д�����ݸ���������4����������������д��4����
+* 函数名称: FLASH_Write()
+* 功能说明: 片内Flash写入
+* 输 入: uint32_t addr 写入地址
+* uint32_t buff[] 要写入的数据
+* uint32_t count 要写入数据的个数,以字为单位,且必须是4的整数倍,即最少写入4个字
+* 输 出: 无
+* 注意事项: 写入数据个数必须是4的整数倍,即最少写入4个字
******************************************************************************************************************************************/
void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count)
{
- __disable_irq();
-
- IAP_Flash_Write(addr, (uint32_t)buff, count/4);
-
- IAP_Cache_Reset();
-
- __enable_irq();
+ __disable_irq();
+
+ IAP_Flash_Write(addr, (uint32_t)buff, count / 4);
+
+ IAP_Cache_Reset();
+
+ __enable_irq();
}
/******************************************************************************************************************************************
-* ��������: Flash_Param_at_120MHz()
-* ����˵��: ��Flash�������ó�120MHz��Ƶ������ʱ����IJ���
-* �� ��: ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: Flash_Param_at_xMHz()
+* 功能说明: 将Flash参数设置成xMHz主频下运行时所需的参数
+* 输 入: uint32_t x 可取值
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void Flash_Param_at_120MHz(void)
+void Flash_Param_at_xMHz(uint32_t x)
{
- __disable_irq();
-
- IAP_Flash_Param(0x48a, 0xabfc7a6e);
-
- __enable_irq();
+ __disable_irq();
+ switch (x)
+ {
+ case 30:
+ IAP_Flash_Param(0x489, 0xabf41f25);
+ break;
+
+ case 40:
+ IAP_Flash_Param(0x489, 0xabf42929);
+ break;
+
+ case 80:
+ IAP_Flash_Param(0x489, 0xabf8524d);
+ break;
+
+ case 120:
+ default:
+ IAP_Flash_Param(0x48a, 0xabfc7a6e);
+ break;
+ }
+ __enable_irq();
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.h
index 113e2a2e07..0352eeef82 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_flash.h
@@ -1,13 +1,10 @@
#ifndef __SWM320_FLASH_H__
#define __SWM320_FLASH_H__
-
void FLASH_Erase(uint32_t addr);
void FLASH_Write(uint32_t addr, uint32_t buff[], uint32_t count);
-void Flash_Param_at_120MHz(void);
-
-
+void Flash_Param_at_xMHz(uint32_t x);
typedef void (*IAP_Cache_Reset_t)(void);
typedef void (*IAP_Flash_Param_t)(uint32_t cfg0, uint32_t cfg1);
@@ -19,5 +16,4 @@ extern IAP_Flash_Param_t IAP_Flash_Param;
extern IAP_Flash_Erase_t IAP_Flash_Erase;
extern IAP_Flash_Write_t IAP_Flash_Write;
-
#endif //__SWM320_FLASH_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.c
index 1d2aa3a2ab..29c10c132f 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_gpio.c
-* ����˵��: SWM320��Ƭ����ͨ�������������������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_gpio.c
+* 功能说明: SWM320单片机的通用输入输出功能驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,358 +21,357 @@
#include "SWM320.h"
#include "SWM320_gpio.h"
-
/******************************************************************************************************************************************
-* ��������: GPIO_Init()
-* ����˵��: ���ų�ʼ�����������ŷ����������衢�������衢��©���
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* uint32_t dir ���ŷ���0 ���� 1 ���
-* uint32_t pull_up �������裬0 �ر����� 1 ��������
-* uint32_t pull_down �������裬0 �ر����� 1 ��������
-* �� ��: ��
-* ע������: GPIOA��GPIOC��GPIOM��GPIOPֻ��������GPIOB��GPIONֻ������
+* 函数名称: GPIO_Init()
+* 功能说明: 引脚初始化,包含引脚方向、上拉电阻、下拉电阻、开漏输出
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* uint32_t dir 引脚方向,0 输入 1 输出
+* uint32_t pull_up 上拉电阻,0 关闭上拉 1 开启上拉
+* uint32_t pull_down 下拉电阻,0 关闭下拉 1 开启下拉
+* 输 出: 无
+* 注意事项: GPIOA、GPIOC、GPIOM、GPIOP只有上拉,GPIOB、GPION只有下拉(PN0、PN1、PN2三个引脚有上拉没下拉)
******************************************************************************************************************************************/
-void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down)
+void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down)
{
- switch((uint32_t)GPIOx)
- {
- case ((uint32_t)GPIOA):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOA_Pos);
-
- PORT_Init(PORTA, n, 0, 1); //PORTA.PINn��������ΪGPIO���ܣ��������뿪��
- if(dir == 1)
- {
- GPIOA->DIR |= (0x01 << n);
- }
- else
- {
- GPIOA->DIR &= ~(0x01 << n);
- }
-
- if(pull_up == 1)
- PORT->PORTA_PULLU |= (0x01 << n);
- else
- PORT->PORTA_PULLU &= ~(0x01 << n);
- break;
-
- case ((uint32_t)GPIOB):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOB_Pos);
-
- PORT_Init(PORTB, n, 0, 1); //PORTB.PINn��������ΪGPIO���ܣ��������뿪��
- if(dir == 1)
- {
- GPIOB->DIR |= (0x01 << n);
- }
- else
- {
- GPIOB->DIR &= ~(0x01 << n);
- }
-
- if(pull_down == 1)
- PORT->PORTB_PULLD |= (0x01 << n);
- else
- PORT->PORTB_PULLD &= ~(0x01 << n);
- break;
+ switch ((uint32_t)GPIOx)
+ {
+ case ((uint32_t)GPIOA):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOA_Pos);
+
+ PORT_Init(PORTA, n, 0, 1); //PORTA.PINn引脚配置为GPIO功能,数字输入开启
+ if (dir == 1)
+ {
+ GPIOA->DIR |= (0x01 << n);
+ }
+ else
+ {
+ GPIOA->DIR &= ~(0x01 << n);
+ }
+
+ if (pull_up == 1)
+ PORT->PORTA_PULLU |= (0x01 << n);
+ else
+ PORT->PORTA_PULLU &= ~(0x01 << n);
+ break;
+
+ case ((uint32_t)GPIOB):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOB_Pos);
+
+ PORT_Init(PORTB, n, 0, 1); //PORTB.PINn引脚配置为GPIO功能,数字输入开启
+ if (dir == 1)
+ {
+ GPIOB->DIR |= (0x01 << n);
+ }
+ else
+ {
+ GPIOB->DIR &= ~(0x01 << n);
+ }
+
+ if (pull_down == 1)
+ PORT->PORTB_PULLD |= (0x01 << n);
+ else
+ PORT->PORTB_PULLD &= ~(0x01 << n);
+ break;
+
+ case ((uint32_t)GPIOC):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOC_Pos);
+
+ PORT_Init(PORTC, n, 0, 1); //PORTC.PINn引脚配置为GPIO功能,数字输入开启
+ if (dir == 1)
+ {
+ GPIOC->DIR |= (0x01 << n);
+ }
+ else
+ {
+ GPIOC->DIR &= ~(0x01 << n);
+ }
+
+ if (pull_up == 1)
+ PORT->PORTC_PULLU |= (0x01 << n);
+ else
+ PORT->PORTC_PULLU &= ~(0x01 << n);
+ break;
+
+ case ((uint32_t)GPIOM):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOM_Pos);
+
+ PORT_Init(PORTM, n, 0, 1); //PORTM.PINn引脚配置为GPIO功能,数字输入开启
+ if (dir == 1)
+ {
+ GPIOM->DIR |= (0x01 << n);
+ }
+ else
+ {
+ GPIOM->DIR &= ~(0x01 << n);
+ }
+
+ if (pull_up == 1)
+ PORT->PORTM_PULLU |= (0x01 << n);
+ else
+ PORT->PORTM_PULLU &= ~(0x01 << n);
+ break;
+
+ case ((uint32_t)GPION):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_GPION_Pos);
+
+ PORT_Init(PORTN, n, 0, 1); //PORTN.PINn引脚配置为GPIO功能,数字输入开启
+ if (dir == 1)
+ {
+ GPION->DIR |= (0x01 << n);
+ }
+ else
+ {
+ GPION->DIR &= ~(0x01 << n);
+ }
+
+ if (pull_down == 1)
+ PORT->PORTN_PULLD |= (0x01 << n);
+ else
+ PORT->PORTN_PULLD &= ~(0x01 << n);
+ break;
+
+ case ((uint32_t)GPIOP):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOP_Pos);
+
+ PORT_Init(PORTP, n, 0, 1); //PORTP.PINn引脚配置为GPIO功能,数字输入开启
+ if (dir == 1)
+ {
+ GPIOP->DIR |= (0x01 << n);
+ }
+ else
+ {
+ GPIOP->DIR &= ~(0x01 << n);
+ }
- case ((uint32_t)GPIOC):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOC_Pos);
-
- PORT_Init(PORTC, n, 0, 1); //PORTC.PINn��������ΪGPIO���ܣ��������뿪��
- if(dir == 1)
- {
- GPIOC->DIR |= (0x01 << n);
- }
- else
- {
- GPIOC->DIR &= ~(0x01 << n);
- }
-
- if(pull_up == 1)
- PORT->PORTC_PULLU |= (0x01 << n);
- else
- PORT->PORTC_PULLU &= ~(0x01 << n);
- break;
-
- case ((uint32_t)GPIOM):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOM_Pos);
-
- PORT_Init(PORTM, n, 0, 1); //PORTM.PINn��������ΪGPIO���ܣ��������뿪��
- if(dir == 1)
- {
- GPIOM->DIR |= (0x01 << n);
- }
- else
- {
- GPIOM->DIR &= ~(0x01 << n);
- }
-
- if(pull_up == 1)
- PORT->PORTM_PULLU |= (0x01 << n);
- else
- PORT->PORTM_PULLU &= ~(0x01 << n);
- break;
-
- case ((uint32_t)GPION):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_GPION_Pos);
-
- PORT_Init(PORTN, n, 0, 1); //PORTN.PINn��������ΪGPIO���ܣ��������뿪��
- if(dir == 1)
- {
- GPION->DIR |= (0x01 << n);
- }
- else
- {
- GPION->DIR &= ~(0x01 << n);
- }
-
- if(pull_down == 1)
- PORT->PORTN_PULLD |= (0x01 << n);
- else
- PORT->PORTN_PULLD &= ~(0x01 << n);
- break;
-
- case ((uint32_t)GPIOP):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_GPIOP_Pos);
-
- PORT_Init(PORTP, n, 0, 1); //PORTP.PINn��������ΪGPIO���ܣ��������뿪��
- if(dir == 1)
- {
- GPIOP->DIR |= (0x01 << n);
- }
- else
- {
- GPIOP->DIR &= ~(0x01 << n);
- }
-
- if(pull_up == 1)
- PORT->PORTP_PULLU |= (0x01 << n);
- else
- PORT->PORTP_PULLU &= ~(0x01 << n);
- break;
- }
+ if (pull_up == 1)
+ PORT->PORTP_PULLU |= (0x01 << n);
+ else
+ PORT->PORTP_PULLU &= ~(0x01 << n);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: GPIO_SetBit()
-* ����˵��: ������ָ�������ŵ�ƽ�ø�
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* �� ��: ��
-* ע������: ��
+* 函数名称: GPIO_SetBit()
+* 功能说明: 将参数指定的引脚电平置高
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n)
+void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
- GPIOx->DATA |= (0x01 << n);
+ GPIOx->DATA |= (0x01 << n);
}
/******************************************************************************************************************************************
-* ��������: GPIO_ClrBit()
-* ����˵��: ������ָ�������ŵ�ƽ�õ�
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* �� ��: ��
-* ע������: ��
+* 函数名称: GPIO_ClrBit()
+* 功能说明: 将参数指定的引脚电平置低
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
+void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
- GPIOx->DATA &= ~(0x01 << n);
+ GPIOx->DATA &= ~(0x01 << n);
}
/******************************************************************************************************************************************
-* ��������: GPIO_InvBit()
-* ����˵��: ������ָ�������ŵ�ƽ��ת
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* �� ��: ��
-* ע������: ��
+* 函数名称: GPIO_InvBit()
+* 功能说明: 将参数指定的引脚电平反转
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n)
+void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
- GPIOx->DATA ^= (0x01 << n);
+ GPIOx->DATA ^= (0x01 << n);
}
/******************************************************************************************************************************************
-* ��������: GPIO_GetBit()
-* ����˵��: ��ȡ����ָ�������ŵĵ�ƽ״̬
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* �� ��: ����ָ�������ŵĵ�ƽ״̬ 0 �͵�ƽ 1 �ߵ�ƽ
-* ע������: ��
+* 函数名称: GPIO_GetBit()
+* 功能说明: 读取参数指定的引脚的电平状态
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* 输 出: 参数指定的引脚的电平状态 0 低电平 1 高电平
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n)
-{
- return ((GPIOx->DATA >> n) & 0x01);
+uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n)
+{
+ return ((GPIOx->DATA >> n) & 0x01);
}
/******************************************************************************************************************************************
-* ��������: GPIO_SetBits()
-* ����˵��: ������ָ���Ĵ�n��ʼ��wλ�������ŵĵ�ƽ�ø�
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* uint32_t w ָ��Ҫ�����ŵ�ƽ�øߵ����ŵĸ���
-* �� ��: ��
-* ע������: ��
+* 函数名称: GPIO_SetBits()
+* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* uint32_t w 指定要将引脚电平置高的引脚的个数
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
+void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
- uint32_t bits;
-
- bits = 0xFFFFFF >> (24 - w);
-
- GPIOx->DATA |= (bits << n);
+ uint32_t bits;
+
+ bits = 0xFFFFFF >> (24 - w);
+
+ GPIOx->DATA |= (bits << n);
}
/******************************************************************************************************************************************
-* ��������: GPIO_ClrBits()
-* ����˵��: ������ָ���Ĵ�n��ʼ��wλ�������ŵĵ�ƽ�õ�
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* uint32_t w ָ��Ҫ�����ŵ�ƽ�õ͵����ŵĸ���
-* �� ��: ��
-* ע������: ��
+* 函数名称: GPIO_ClrBits()
+* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* uint32_t w 指定要将引脚电平置低的引脚的个数
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
+void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
- uint32_t bits;
-
- bits = 0xFFFFFF >> (24 - w);
-
- GPIOx->DATA &= ~(bits << n);
+ uint32_t bits;
+
+ bits = 0xFFFFFF >> (24 - w);
+
+ GPIOx->DATA &= ~(bits << n);
}
/******************************************************************************************************************************************
-* ��������: GPIO_InvBits()
-* ����˵��: ������ָ���Ĵ�n��ʼ��wλ�������ŵĵ�ƽ��ת
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* uint32_t w ָ��Ҫ�����ŵ�ƽ��ת�����ŵĸ���
-* �� ��: ��
-* ע������: ��
+* 函数名称: GPIO_InvBits()
+* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* uint32_t w 指定要将引脚电平反转的引脚的个数
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
+void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
- uint32_t bits;
-
- bits = 0xFFFFFF >> (24 - w);
-
- GPIOx->DATA ^= (bits << n);
+ uint32_t bits;
+
+ bits = 0xFFFFFF >> (24 - w);
+
+ GPIOx->DATA ^= (bits << n);
}
/******************************************************************************************************************************************
-* ��������: GPIO_GetBits()
-* ����˵��: ��ȡ����ָ���Ĵ�n��ʼ��wλ�������ŵĵ�ƽ״̬
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOM��GPION��GPIOP
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* uint32_t w ָ��Ҫ�����ŵ�ƽ�øߵ����ŵĸ���
-* �� ��: ����ָ���Ĵ�n��ʼ��wλ�������ŵĵ�ƽ״̬ 0 �͵�ƽ 1 �ߵ�ƽ
-* ����ֵ�ĵ�0λ��ʾ����n�ĵ�ƽ״̬������ֵ�ĵ�1λ��ʾ����n+1�ĵ�ƽ״̬... ...����ֵ�ĵ�wλ��ʾ����n+w�ĵ�ƽ״̬
-* ע������: ��
+* 函数名称: GPIO_GetBits()
+* 功能说明: 读取参数指定的从n开始的w位连续引脚的电平状态
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOM、GPION、GPIOP
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* uint32_t w 指定要将引脚电平置高的引脚的个数
+* 输 出: 参数指定的从n开始的w位连续引脚的电平状态 0 低电平 1 高电平
+* 返回值的第0位表示引脚n的电平状态、返回值的第1位表示引脚n+1的电平状态... ...返回值的第w位表示引脚n+w的电平状态
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
+uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
- uint32_t bits;
-
- bits = 0xFFFFFF >> (24 - w);
-
- return ((GPIOx->DATA >> n) & bits);
+ uint32_t bits;
+
+ bits = 0xFFFFFF >> (24 - w);
+
+ return ((GPIOx->DATA >> n) & bits);
}
/******************************************************************************************************************************************
-* ��������: GPIO_AtomicSetBit()
-* ����˵��: ������ָ�������ŵ�ƽ�øߣ�ȷ�����š���-��-д��������ԭ���ԣ������ж�ISR��ϣ�
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOD
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN14��PIN15
-* �� ��: ��
-* ע������: ��GPIOx��16�������У���Щ����ѭ���в�������Щ���ж�ISR�в���ʱ��GPIOx�����ű��붼��GPIO_Atomic���ͺ�������
+* 函数名称: GPIO_AtomicSetBit()
+* 功能说明: 将参数指定的引脚电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
+* 输 出: 无
+* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
-void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n)
-{
- *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 1;
+void GPIO_AtomicSetBit(GPIO_TypeDef *GPIOx, uint32_t n)
+{
+ *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 1;
}
/******************************************************************************************************************************************
-* ��������: GPIO_AtomicClrBit()
-* ����˵��: ������ָ�������ŵ�ƽ�õͣ�ȷ�����š���-��-д��������ԭ���ԣ������ж�ISR��ϣ�
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOD
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN14��PIN15
-* �� ��: ��
-* ע������: ��GPIOx��16�������У���Щ����ѭ���в�������Щ���ж�ISR�в���ʱ��GPIOx�����ű��붼��GPIO_Atomic���ͺ�������
+* 函数名称: GPIO_AtomicClrBit()
+* 功能说明: 将参数指定的引脚电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
+* 输 出: 无
+* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
-void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
+void GPIO_AtomicClrBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
- *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 0;
+ *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 0;
}
/******************************************************************************************************************************************
-* ��������: GPIO_AtomicInvBit()
-* ����˵��: ������ָ�������ŵ�ƽ��ת��ȷ�����š���-��-д��������ԭ���ԣ������ж�ISR��ϣ�
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOD
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN14��PIN15
-* �� ��: ��
-* ע������: ��GPIOx��16�������У���Щ����ѭ���в�������Щ���ж�ISR�в���ʱ��GPIOx�����ű��붼��GPIO_Atomic���ͺ�������
+* 函数名称: GPIO_AtomicInvBit()
+* 功能说明: 将参数指定的引脚电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
+* 输 出: 无
+* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
-void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n)
+void GPIO_AtomicInvBit(GPIO_TypeDef *GPIOx, uint32_t n)
{
- *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4)) = 1 - *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000)*32 + n*4));
+ *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4)) = 1 - *((volatile uint32_t *)(0x42000000 + ((uint32_t)&GPIOx->DATA - 0x40000000) * 32 + n * 4));
}
/******************************************************************************************************************************************
-* ��������: GPIO_AtomicSetBits()
-* ����˵��: ������ָ���Ĵ�n��ʼ��wλ�������ŵĵ�ƽ�øߣ�ȷ�����š���-��-д��������ԭ���ԣ������ж�ISR��ϣ�
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOD
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN14��PIN15
-* uint32_t w ָ��Ҫ�����ŵ�ƽ�øߵ����ŵĸ���
-* �� ��: ��
-* ע������: ��GPIOx��16�������У���Щ����ѭ���в�������Щ���ж�ISR�в���ʱ��GPIOx�����ű��붼��GPIO_Atomic���ͺ�������
+* 函数名称: GPIO_AtomicSetBits()
+* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
+* uint32_t w 指定要将引脚电平置高的引脚的个数
+* 输 出: 无
+* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
-void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
+void GPIO_AtomicSetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
- uint32_t bits;
-
- bits = 0xFFFFFF >> (24 - w);
-
- __disable_irq();
- GPIOx->DATA |= (bits << n);
- __enable_irq();
+ uint32_t bits;
+
+ bits = 0xFFFFFF >> (24 - w);
+
+ __disable_irq();
+ GPIOx->DATA |= (bits << n);
+ __enable_irq();
}
/******************************************************************************************************************************************
-* ��������: GPIO_AtomicClrBits()
-* ����˵��: ������ָ���Ĵ�n��ʼ��wλ�������ŵĵ�ƽ�õͣ�ȷ�����š���-��-д��������ԭ���ԣ������ж�ISR��ϣ�
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOD
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN14��PIN15
-* uint32_t w ָ��Ҫ�����ŵ�ƽ�õ͵����ŵĸ���
-* �� ��: ��
-* ע������: ��GPIOx��16�������У���Щ����ѭ���в�������Щ���ж�ISR�в���ʱ��GPIOx�����ű��붼��GPIO_Atomic���ͺ�������
+* 函数名称: GPIO_AtomicClrBits()
+* 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
+* uint32_t w 指定要将引脚电平置低的引脚的个数
+* 输 出: 无
+* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
-void GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
+void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
- uint32_t bits;
-
- bits = 0xFFFFFF >> (24 - w);
-
- __disable_irq();
- GPIOx->DATA &= ~(bits << n);
- __enable_irq();
+ uint32_t bits;
+
+ bits = 0xFFFFFF >> (24 - w);
+
+ __disable_irq();
+ GPIOx->DATA &= ~(bits << n);
+ __enable_irq();
}
/******************************************************************************************************************************************
-* ��������: GPIO_AtomicInvBits()
-* ����˵��: ������ָ���Ĵ�n��ʼ��wλ�������ŵĵ�ƽ��ת��ȷ�����š���-��-д��������ԭ���ԣ������ж�ISR��ϣ�
-* �� ��: GPIO_TypeDef * GPIOx ָ��GPIO�˿ڣ���Чֵ����GPIOA��GPIOB��GPIOC��GPIOD
-* uint32_t n ָ��GPIO���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN14��PIN15
-* uint32_t w ָ��Ҫ�����ŵ�ƽ��ת�����ŵĸ���
-* �� ��: ��
-* ע������: ��GPIOx��16�������У���Щ����ѭ���в�������Щ���ж�ISR�в���ʱ��GPIOx�����ű��붼��GPIO_Atomic���ͺ�������
+* 函数名称: GPIO_AtomicInvBits()
+* 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
+* 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD
+* uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
+* uint32_t w 指定要将引脚电平反转的引脚的个数
+* 输 出: 无
+* 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
******************************************************************************************************************************************/
-void GPIO_AtomicInvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
+void GPIO_AtomicInvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w)
{
- uint32_t bits;
-
- bits = 0xFFFFFF >> (24 - w);
-
- __disable_irq();
- GPIOx->DATA ^= (bits << n);
- __enable_irq();
+ uint32_t bits;
+
+ bits = 0xFFFFFF >> (24 - w);
+
+ __disable_irq();
+ GPIOx->DATA ^= (bits << n);
+ __enable_irq();
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.h
index bcb59b0bee..056f17b07b 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_gpio.h
@@ -1,24 +1,22 @@
#ifndef __SWM320_GPIO_H__
-#define __SWM320_GPIO_H__
+#define __SWM320_GPIO_H__
+void GPIO_Init(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //引脚初始化,包含引脚方向、上拉电阻、下拉电阻
-void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down); //���ų�ʼ�����������ŷ����������衢��������
-
-void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n); //������ָ�������ŵ�ƽ�ø�
-void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n); //������ָ�������ŵ�ƽ�õ�
-void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n); //������ָ�������ŵ�ƽ��ת
-uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n); //��ȡ����ָ�������ŵĵ�ƽ״̬
-void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //������ָ���Ĵ�n��ʼ��wλ�������ŵĵ�ƽ�ø�
-void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //������ָ���Ĵ�n��ʼ��wλ�������ŵĵ�ƽ�õ�
-void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //������ָ���Ĵ�n��ʼ��wλ�������ŵĵ�ƽ��ת
-uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w); //��ȡ����ָ���Ĵ�n��ʼ��wλ�������ŵĵ�ƽ״̬
-
-void GPIO_AtomicSetBit(GPIO_TypeDef * GPIOx, uint32_t n);
-void GPIO_AtomicClrBit(GPIO_TypeDef * GPIOx, uint32_t n);
-void GPIO_AtomicInvBit(GPIO_TypeDef * GPIOx, uint32_t n);
-void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w);
-void GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w);
-void GPIO_AtomicInvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w);
+void GPIO_SetBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平置高
+void GPIO_ClrBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平置低
+void GPIO_InvBit(GPIO_TypeDef *GPIOx, uint32_t n); //将参数指定的引脚电平反转
+uint32_t GPIO_GetBit(GPIO_TypeDef *GPIOx, uint32_t n); //读取参数指定的引脚的电平状态
+void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置高
+void GPIO_ClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平置低
+void GPIO_InvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //将参数指定的从n开始的w位连续引脚的电平反转
+uint32_t GPIO_GetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w); //读取参数指定的从n开始的w位连续引脚的电平状态
+void GPIO_AtomicSetBit(GPIO_TypeDef *GPIOx, uint32_t n);
+void GPIO_AtomicClrBit(GPIO_TypeDef *GPIOx, uint32_t n);
+void GPIO_AtomicInvBit(GPIO_TypeDef *GPIOx, uint32_t n);
+void GPIO_AtomicSetBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
+void GPIO_AtomicClrBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
+void GPIO_AtomicInvBits(GPIO_TypeDef *GPIOx, uint32_t n, uint32_t w);
#endif //__SWM320_GPIO_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.c
index 04c414085f..8e093f14ee 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_i2c.c
-* ����˵��: SWM320��Ƭ����I2C���нӿڹ���������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_i2c.c
+* 功能说明: SWM320单片机的I2C串行接口功能驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -22,194 +22,198 @@
#include "SWM320_i2c.h"
/******************************************************************************************************************************************
-* ��������: I2C_Init()
-* ����˵��: I2C��ʼ��
-* �� ��: I2C_TypeDef * I2Cx ָ��Ҫ�����õ�I2C����Чֵ����I2C0��I2C1
-* I2C_InitStructure * initStruct ����I2C����趨ֵ�Ľṹ��
-* �� ��: ��
-* ע������: ģ��ֻ�ܹ���������ģʽ
+* 函数名称: I2C_Init()
+* 功能说明: I2C初始化
+* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
+* I2C_InitStructure * initStruct 包含I2C相关设定值的结构体
+* 输 出: 无
+* 注意事项: 模块只能工作于主机模式
******************************************************************************************************************************************/
-void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct)
+void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct)
{
- switch((uint32_t)I2Cx)
- {
- case ((uint32_t)I2C0):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C0_Pos);
- break;
-
- case ((uint32_t)I2C1):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C1_Pos);
- break;
- }
-
- I2C_Close(I2Cx); //һЩ�ؼ��Ĵ���ֻ����I2C�ر�ʱ����
-
- if(initStruct->Master == 1)
- {
- I2Cx->CLKDIV = SystemCoreClock/5/initStruct->MstClk;
-
- I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos); //ʹ���ж�֮ǰ������жϱ�־
- I2Cx->CTRL &= ~I2C_CTRL_MSTIE_Msk;
- I2Cx->CTRL |= (initStruct->MstIEn << I2C_CTRL_MSTIE_Pos);
-
- switch((uint32_t)I2Cx)
- {
- case ((uint32_t)I2C0):
- if(initStruct->MstIEn)
- {
- NVIC_EnableIRQ(I2C0_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(I2C0_IRQn);
- }
- break;
-
- case ((uint32_t)I2C1):
- if(initStruct->MstIEn)
- {
- NVIC_EnableIRQ(I2C1_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(I2C1_IRQn);
- }
- break;
- }
- }
- else
- {
- I2Cx->SLVCR |= (1 << I2C_SLVCR_SLAVE_Pos);
-
- I2Cx->SLVCR &= ~(I2C_SLVCR_ADDR7b_Msk | I2C_SLVCR_ADDR_Msk);
- I2Cx->SLVCR |= (1 << I2C_SLVCR_ACK_Pos) |
- (initStruct->Addr7b << I2C_SLVCR_ADDR7b_Pos) |
- (initStruct->SlvAddr << I2C_SLVCR_ADDR_Pos);
-
- I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk; //���жϱ�־
- I2Cx->SLVCR &= ~(I2C_SLVCR_IM_RXEND_Msk | I2C_SLVCR_IM_TXEND_Msk | I2C_SLVCR_IM_STADET_Msk | I2C_SLVCR_IM_STODET_Msk |
- I2C_SLVCR_IM_RDREQ_Msk | I2C_SLVCR_IM_WRREQ_Msk);
- I2Cx->SLVCR |= ((initStruct->SlvRxEndIEn ? 0 : 1) << I2C_SLVCR_IM_RXEND_Pos) |
- ((initStruct->SlvTxEndIEn ? 0 : 1) << I2C_SLVCR_IM_TXEND_Pos) |
- ((initStruct->SlvSTADetIEn ? 0 : 1) << I2C_SLVCR_IM_STADET_Pos) |
- ((initStruct->SlvSTODetIEn ? 0 : 1) << I2C_SLVCR_IM_STODET_Pos) |
- ((initStruct->SlvRdReqIEn ? 0 : 1) << I2C_SLVCR_IM_RDREQ_Pos) |
- ((initStruct->SlvWrReqIEn ? 0 : 1) << I2C_SLVCR_IM_WRREQ_Pos);
-
- switch((uint32_t)I2Cx)
- {
- case ((uint32_t)I2C0):
- if(initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
- initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
- {
- NVIC_EnableIRQ(I2C0_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(I2C0_IRQn);
- }
- break;
-
- case ((uint32_t)I2C1):
- if(initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
- initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
- {
- NVIC_EnableIRQ(I2C1_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(I2C1_IRQn);
- }
- break;
- }
- }
+ switch ((uint32_t)I2Cx)
+ {
+ case ((uint32_t)I2C0):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C0_Pos);
+ break;
+
+ case ((uint32_t)I2C1):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_I2C1_Pos);
+ break;
+ }
+
+ I2C_Close(I2Cx); //一些关键寄存器只能在I2C关闭时设置
+
+ if (initStruct->Master == 1)
+ {
+ I2Cx->CLKDIV = SystemCoreClock / 5 / initStruct->MstClk;
+
+ I2Cx->MSTCMD = (I2Cx->MSTCMD & (~I2C_MSTCMD_IF_Msk)) | (1 << I2C_MSTCMD_IF_Pos); //使能中断之前先清除中断标志
+ I2Cx->CTRL &= ~I2C_CTRL_MSTIE_Msk;
+ I2Cx->CTRL |= (initStruct->MstIEn << I2C_CTRL_MSTIE_Pos);
+
+ switch ((uint32_t)I2Cx)
+ {
+ case ((uint32_t)I2C0):
+ if (initStruct->MstIEn)
+ {
+ NVIC_EnableIRQ(I2C0_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(I2C0_IRQn);
+ }
+ break;
+
+ case ((uint32_t)I2C1):
+ if (initStruct->MstIEn)
+ {
+ NVIC_EnableIRQ(I2C1_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(I2C1_IRQn);
+ }
+ break;
+ }
+ }
+ else
+ {
+ I2Cx->SLVCR |= (1 << I2C_SLVCR_SLAVE_Pos);
+
+ I2Cx->SLVCR &= ~(I2C_SLVCR_ADDR7b_Msk | I2C_SLVCR_ADDR_Msk);
+ I2Cx->SLVCR |= (1 << I2C_SLVCR_ACK_Pos) |
+ (initStruct->Addr7b << I2C_SLVCR_ADDR7b_Pos) |
+ (initStruct->SlvAddr << I2C_SLVCR_ADDR_Pos);
+
+ I2Cx->SLVIF = I2C_SLVIF_RXEND_Msk | I2C_SLVIF_TXEND_Msk | I2C_SLVIF_STADET_Msk | I2C_SLVIF_STODET_Msk; //清中断标志
+ I2Cx->SLVCR &= ~(I2C_SLVCR_IM_RXEND_Msk | I2C_SLVCR_IM_TXEND_Msk | I2C_SLVCR_IM_STADET_Msk | I2C_SLVCR_IM_STODET_Msk |
+ I2C_SLVCR_IM_RDREQ_Msk | I2C_SLVCR_IM_WRREQ_Msk);
+ I2Cx->SLVCR |= ((initStruct->SlvRxEndIEn ? 0 : 1) << I2C_SLVCR_IM_RXEND_Pos) |
+ ((initStruct->SlvTxEndIEn ? 0 : 1) << I2C_SLVCR_IM_TXEND_Pos) |
+ ((initStruct->SlvSTADetIEn ? 0 : 1) << I2C_SLVCR_IM_STADET_Pos) |
+ ((initStruct->SlvSTODetIEn ? 0 : 1) << I2C_SLVCR_IM_STODET_Pos) |
+ ((initStruct->SlvRdReqIEn ? 0 : 1) << I2C_SLVCR_IM_RDREQ_Pos) |
+ ((initStruct->SlvWrReqIEn ? 0 : 1) << I2C_SLVCR_IM_WRREQ_Pos);
+
+ switch ((uint32_t)I2Cx)
+ {
+ case ((uint32_t)I2C0):
+ if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
+ initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
+ {
+ NVIC_EnableIRQ(I2C0_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(I2C0_IRQn);
+ }
+ break;
+
+ case ((uint32_t)I2C1):
+ if (initStruct->SlvRxEndIEn | initStruct->SlvTxEndIEn | initStruct->SlvSTADetIEn |
+ initStruct->SlvSTODetIEn | initStruct->SlvRdReqIEn | initStruct->SlvWrReqIEn)
+ {
+ NVIC_EnableIRQ(I2C1_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(I2C1_IRQn);
+ }
+ break;
+ }
+ }
}
/******************************************************************************************************************************************
-* ��������: I2C_Open()
-* ����˵��: I2C�򿪣������շ�
-* �� ��: I2C_TypeDef * I2Cx ָ��Ҫ�����õ�I2C����Чֵ����I2C0��I2C1
-* �� ��: ��
-* ע������: ��
+* 函数名称: I2C_Open()
+* 功能说明: I2C打开,允许收发
+* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void I2C_Open(I2C_TypeDef * I2Cx)
+void I2C_Open(I2C_TypeDef *I2Cx)
{
- I2Cx->CTRL |= (0x01 << I2C_CTRL_EN_Pos);
+ I2Cx->CTRL |= (0x01 << I2C_CTRL_EN_Pos);
}
/******************************************************************************************************************************************
-* ��������: I2C_Close()
-* ����˵��: I2C�رգ���ֹ�շ�
-* �� ��: I2C_TypeDef * I2Cx ָ��Ҫ�����õ�I2C����Чֵ����I2C0��I2C1
-* �� ��: ��
-* ע������: ��
+* 函数名称: I2C_Close()
+* 功能说明: I2C关闭,禁止收发
+* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void I2C_Close(I2C_TypeDef * I2Cx)
+void I2C_Close(I2C_TypeDef *I2Cx)
{
- I2Cx->CTRL &= ~I2C_CTRL_EN_Msk;
+ I2Cx->CTRL &= ~I2C_CTRL_EN_Msk;
}
/******************************************************************************************************************************************
-* ��������: I2C_Start()
-* ����˵��: ������ʼ�źŲ������豸��ַ
-* �� ��: I2C_TypeDef * I2Cx ָ��Ҫ�����õ�I2C����Чֵ����I2C0��I2C1
-* uint8_t addr �豸��ַ
-* �� ��: uint8_t 1 ���յ�ACK 0 ���յ�NACK
-* ע������: ��
+* 函数名称: I2C_Start()
+* 功能说明: 产生起始信号并发送设备地址
+* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
+* uint8_t addr 设备地址
+* 输 出: uint8_t 1 接收到ACK 0 接收到NACK
+* 注意事项: 无
******************************************************************************************************************************************/
-uint8_t I2C_Start(I2C_TypeDef * I2Cx, uint8_t addr)
+uint8_t I2C_Start(I2C_TypeDef *I2Cx, uint8_t addr)
{
- I2Cx->MSTDAT = addr;
- I2Cx->MSTCMD = (1 << I2C_MSTCMD_STA_Pos) |
- (1 << I2C_MSTCMD_WR_Pos); //������ʼλ�ʹӻ���ַ
- while(I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk) __NOP(); //�ȴ��������
-
- return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
+ I2Cx->MSTDAT = addr;
+ I2Cx->MSTCMD = (1 << I2C_MSTCMD_STA_Pos) |
+ (1 << I2C_MSTCMD_WR_Pos); //发送起始位和从机地址
+ while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
+ __NOP(); //等待发送完成
+
+ return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
}
/******************************************************************************************************************************************
-* ��������: I2C_Stop()
-* ����˵��: ����ֹͣ�ź�
-* �� ��: I2C_TypeDef * I2Cx ָ��Ҫ�����õ�I2C����Чֵ����I2C0��I2C1
-* �� ��: ��
-* ע������: ��
+* 函数名称: I2C_Stop()
+* 功能说明: 产生停止信号
+* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void I2C_Stop(I2C_TypeDef * I2Cx)
+void I2C_Stop(I2C_TypeDef *I2Cx)
{
- I2Cx->MSTCMD = (1 << I2C_MSTCMD_STO_Pos);
- while(I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk) __NOP(); //�ȴ��������
+ I2Cx->MSTCMD = (1 << I2C_MSTCMD_STO_Pos);
+ while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
+ __NOP(); //等待发送完成
}
/******************************************************************************************************************************************
-* ��������: I2C_Write()
-* ����˵��: д��һ������
-* �� ��: I2C_TypeDef * I2Cx ָ��Ҫ�����õ�I2C����Чֵ����I2C0��I2C1
-* uint8_t data Ҫд������
-* �� ��: uint8_t 1 ���յ�ACK 0 ���յ�NACK
-* ע������: ��
+* 函数名称: I2C_Write()
+* 功能说明: 写入一个数据
+* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
+* uint8_t data 要写的数据
+* 输 出: uint8_t 1 接收到ACK 0 接收到NACK
+* 注意事项: 无
******************************************************************************************************************************************/
-uint8_t I2C_Write(I2C_TypeDef * I2Cx, uint8_t data)
-{
- I2Cx->MSTDAT = data;
- I2Cx->MSTCMD = (1 << I2C_MSTCMD_WR_Pos);
- while(I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk) __NOP(); //�ȴ��������
-
- return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
+uint8_t I2C_Write(I2C_TypeDef *I2Cx, uint8_t data)
+{
+ I2Cx->MSTDAT = data;
+ I2Cx->MSTCMD = (1 << I2C_MSTCMD_WR_Pos);
+ while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
+ __NOP(); //等待发送完成
+
+ return (I2Cx->MSTCMD & I2C_MSTCMD_RXACK_Msk) ? 0 : 1;
}
/******************************************************************************************************************************************
-* ��������: I2C_Read()
-* ����˵��: ��ȡһ������
-* �� ��: I2C_TypeDef * I2Cx ָ��Ҫ�����õ�I2C����Чֵ����I2C0��I2C1
-* uint8_t ack 1 ����ACK 0 ����NACK
-* �� ��: uint8_t ��ȡ��������
-* ע������: ��
+* 函数名称: I2C_Read()
+* 功能说明: 读取一个数据
+* 输 入: I2C_TypeDef * I2Cx 指定要被设置的I2C,有效值包括I2C0、I2C1
+* uint8_t ack 1 发送ACK 0 发送NACK
+* 输 出: uint8_t 读取到的数据
+* 注意事项: 无
******************************************************************************************************************************************/
-uint8_t I2C_Read(I2C_TypeDef * I2Cx, uint8_t ack)
+uint8_t I2C_Read(I2C_TypeDef *I2Cx, uint8_t ack)
{
- I2Cx->MSTCMD = (1 << I2C_MSTCMD_RD_Pos) |
- ((ack ? 0 : 1) << I2C_MSTCMD_ACK_Pos);
- while(I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk) __NOP(); //�ȴ��������
-
+ I2Cx->MSTCMD = (1 << I2C_MSTCMD_RD_Pos) |
+ ((ack ? 0 : 1) << I2C_MSTCMD_ACK_Pos);
+ while (I2Cx->MSTCMD & I2C_MSTCMD_TIP_Msk)
+ __NOP(); //等待接收完成
+
return I2Cx->MSTDAT;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.h
index fc52e9265e..8547328b35 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_i2c.h
@@ -1,31 +1,31 @@
#ifndef __SWM320_I2C_H__
#define __SWM320_I2C_H__
-typedef struct {
- uint8_t Master; //1 ����ģʽ
- uint8_t Addr7b; //1 7λ��ַ 0 10λ��ַ
-
- uint32_t MstClk; //��������ʱ��Ƶ��
- uint8_t MstIEn; //����ģʽ�ж�ʹ��
-
- uint16_t SlvAddr; //�ӻ���ַ
- uint8_t SlvRxEndIEn; //�ӻ���������ж�ʹ��
- uint8_t SlvTxEndIEn; //�ӻ���������ж�ʹ��
- uint8_t SlvSTADetIEn; //�ӻ���⵽��ʼ�ж�ʹ��
- uint8_t SlvSTODetIEn; //�ӻ���⵽��ֹ�ж�ʹ��
- uint8_t SlvRdReqIEn; //�ӻ����յ��������ж�ʹ��
- uint8_t SlvWrReqIEn; //�ӻ����յ�д�����ж�ʹ��
-} I2C_InitStructure;
+typedef struct
+{
+ uint8_t Master; //1 主机模式
+ uint8_t Addr7b; //1 7位地址 0 10位地址
+
+ uint32_t MstClk; //主机传输时钟频率
+ uint8_t MstIEn; //主机模式中断使能
+ uint16_t SlvAddr; //从机地址
+ uint8_t SlvRxEndIEn; //从机接收完成中断使能
+ uint8_t SlvTxEndIEn; //从机发送完成中断使能
+ uint8_t SlvSTADetIEn; //从机检测到起始中断使能
+ uint8_t SlvSTODetIEn; //从机检测到终止中断使能
+ uint8_t SlvRdReqIEn; //从机接收到读请求中断使能
+ uint8_t SlvWrReqIEn; //从机接收到写请求中断使能
+} I2C_InitStructure;
-void I2C_Init(I2C_TypeDef * I2Cx, I2C_InitStructure * initStruct);
+void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitStructure *initStruct);
-void I2C_Open(I2C_TypeDef * I2Cx);
-void I2C_Close(I2C_TypeDef * I2Cx);
+void I2C_Open(I2C_TypeDef *I2Cx);
+void I2C_Close(I2C_TypeDef *I2Cx);
-uint8_t I2C_Start(I2C_TypeDef * I2Cx, uint8_t addr);
-void I2C_Stop(I2C_TypeDef * I2Cx);
-uint8_t I2C_Write(I2C_TypeDef * I2Cx, uint8_t data);
-uint8_t I2C_Read(I2C_TypeDef * I2Cx, uint8_t ack);
+uint8_t I2C_Start(I2C_TypeDef *I2Cx, uint8_t addr);
+void I2C_Stop(I2C_TypeDef *I2Cx);
+uint8_t I2C_Write(I2C_TypeDef *I2Cx, uint8_t data);
+uint8_t I2C_Read(I2C_TypeDef *I2Cx, uint8_t ack);
#endif //__SWM320_I2C_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.c
index 5220cb8046..427df0d4b6 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_lcd.c
-* ����˵��: SWM320��Ƭ����LCD����������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_lcd.c
+* 功能说明: SWM320单片机的LCD功能驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -24,131 +24,124 @@
#include <string.h>
/******************************************************************************************************************************************
-* ��������: LCD_Init()
-* ����˵��: LCD��ʼ��
-* �� ��: LCD_TypeDef * LCDx ָ��Ҫ�����õ�LCD����Чֵ����LCD
-* LCD_InitStructure * initStruct ����LCD����趨ֵ�Ľṹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: LCD_Init()
+* 功能说明: LCD初始化
+* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
+* LCD_InitStructure * initStruct 包含LCD相关设定值的结构体
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct)
-{
- switch((uint32_t)LCDx)
- {
- case ((uint32_t)LCD):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_LCD_Pos);
- break;
- }
-
- if(initStruct->Interface == LCD_INTERFACE_RGB)
- {
- LCDx->START = (0 << LCD_START_MPUEN_Pos);
-
- LCDx->CR0 = ((initStruct->HnPixel - 1) << LCD_CR0_HPIX_Pos) |
- ((initStruct->VnPixel - 1) << LCD_CR0_VPIX_Pos) |
- (initStruct->ClkAlways << LCD_CR0_DCLK_Pos) |
- (initStruct->HsyncWidth << LCD_CR0_HLOW_Pos);
-
- LCDx->CR1 = ((initStruct->Hfp - 1) << LCD_CR1_HFP_Pos) |
- ((initStruct->Hbp - 1) << LCD_CR1_HBP_Pos) |
- ((initStruct->Vfp - 1) << LCD_CR1_VFP_Pos) |
- ((initStruct->Vbp - 1) << LCD_CR1_VBP_Pos) |
- (initStruct->ClkDiv << LCD_CR1_DCLKDIV_Pos) |
- (initStruct->SamplEdge << LCD_CR1_DCLKINV_Pos);
- }
- else if(initStruct->Interface == LCD_INTERFACE_I80)
- {
- //
- }
-
- LCDx->IE = 1;
- LCDx->IF = 1; //�����־
- if(initStruct->IntEOTEn) LCD_INTEn(LCDx);
- else LCD_INTDis(LCDx);
-
- switch((uint32_t)LCDx)
- {
- case ((uint32_t)LCD):
- if(initStruct->IntEOTEn)
- {
- NVIC_EnableIRQ(LCD_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(LCD_IRQn);
- }
- break;
- }
+void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct)
+{
+ switch ((uint32_t)LCDx)
+ {
+ case ((uint32_t)LCD):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_LCD_Pos);
+ break;
+ }
+
+ LCDx->CR0 = ((initStruct->HnPixel - 1) << LCD_CR0_HPIX_Pos) |
+ ((initStruct->VnPixel - 1) << LCD_CR0_VPIX_Pos) |
+ (initStruct->ClkAlways << LCD_CR0_DCLK_Pos) |
+ (initStruct->HsyncWidth << LCD_CR0_HLOW_Pos);
+
+ LCDx->CR1 = ((initStruct->Hfp - 1) << LCD_CR1_HFP_Pos) |
+ ((initStruct->Hbp - 1) << LCD_CR1_HBP_Pos) |
+ ((initStruct->Vfp - 1) << LCD_CR1_VFP_Pos) |
+ ((initStruct->Vbp - 1) << LCD_CR1_VBP_Pos) |
+ (initStruct->ClkDiv << LCD_CR1_DCLKDIV_Pos) |
+ (initStruct->SamplEdge << LCD_CR1_DCLKINV_Pos);
+
+ LCDx->IE = 1;
+ LCDx->IF = 1; //清除标志
+ if (initStruct->IntEOTEn)
+ LCD_INTEn(LCDx);
+ else
+ LCD_INTDis(LCDx);
+
+ switch ((uint32_t)LCDx)
+ {
+ case ((uint32_t)LCD):
+ if (initStruct->IntEOTEn)
+ {
+ NVIC_EnableIRQ(LCD_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(LCD_IRQn);
+ }
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: LCD_Start()
-* ����˵��: ����һ�����ݴ���
-* �� ��: LCD_TypeDef * LCDx ָ��Ҫ�����õ�LCD����Чֵ����LCD
-* �� ��: ��
-* ע������: ��
+* 函数名称: LCD_Start()
+* 功能说明: 启动一次数据传输
+* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void LCD_Start(LCD_TypeDef * LCDx)
+void LCD_Start(LCD_TypeDef *LCDx)
{
- LCDx->START |= (1 << LCD_START_GO_Pos) | (1 << LCD_START_BURST_Pos);
+ LCDx->START |= (1 << LCD_START_GO_Pos) | (1 << LCD_START_BURST_Pos);
}
/******************************************************************************************************************************************
-* ��������: LCD_IsBusy()
-* ����˵��: �Ƿ����ڽ������ݴ���
-* �� ��: LCD_TypeDef * LCDx ָ��Ҫ�����õ�LCD����Чֵ����LCD
-* �� ��: uint32_t 1 ���ڴ������� 0 ���ݴ��������
-* ע������: ��
+* 函数名称: LCD_IsBusy()
+* 功能说明: 是否正在进行数据传输
+* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
+* 输 出: uint32_t 1 正在传输数据 0 数据传输已完成
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t LCD_IsBusy(LCD_TypeDef * LCDx)
+uint32_t LCD_IsBusy(LCD_TypeDef *LCDx)
{
- return (LCDx->START & LCD_START_GO_Msk) ? 1 : 0;
+ return (LCDx->START & LCD_START_GO_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: LCD_INTEn()
-* ����˵��: LCD�ж�ʹ�ܣ����ָ�����ȵ����ݴ���ʱ�����ж�
-* �� ��: LCD_TypeDef * LCDx ָ��Ҫ�����õ�LCD����Чֵ����LCD
-* �� ��: ��
-* ע������: ��
+* 函数名称: LCD_INTEn()
+* 功能说明: LCD中断使能,完成指定长度的数据传输时触发中断
+* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void LCD_INTEn(LCD_TypeDef * LCDx)
+void LCD_INTEn(LCD_TypeDef *LCDx)
{
- LCDx->IM = 0;
+ LCDx->IM = 0;
}
/******************************************************************************************************************************************
-* ��������: LCD_INTDis()
-* ����˵��: LCD�жϽ�ֹ�����ָ�����ȵ����ݴ���ʱ�������ж�
-* �� ��: LCD_TypeDef * LCDx ָ��Ҫ�����õ�LCD����Чֵ����LCD
-* �� ��: ��
-* ע������: ��
+* 函数名称: LCD_INTDis()
+* 功能说明: LCD中断禁止,完成指定长度的数据传输时不触发中断
+* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void LCD_INTDis(LCD_TypeDef * LCDx)
+void LCD_INTDis(LCD_TypeDef *LCDx)
{
- LCDx->IM = 1;
+ LCDx->IM = 1;
}
/******************************************************************************************************************************************
-* ��������: LCD_INTClr()
-* ����˵��: LCD�жϱ�־���
-* �� ��: LCD_TypeDef * LCDx ָ��Ҫ�����õ�LCD����Чֵ����LCD
-* �� ��: ��
-* ע������: ��
+* 函数名称: LCD_INTClr()
+* 功能说明: LCD中断标志清除
+* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void LCD_INTClr(LCD_TypeDef * LCDx)
+void LCD_INTClr(LCD_TypeDef *LCDx)
{
- LCDx->IF = 1;
+ LCDx->IF = 1;
}
/******************************************************************************************************************************************
-* ��������: LCD_INTStat()
-* ����˵��: LCD�ж�״̬��ѯ
-* �� ��: LCD_TypeDef * LCDx ָ��Ҫ�����õ�LCD����Чֵ����LCD
-* �� ��: uint32_t 1 ���ָ�����ȵ����ݴ��� 0 δ���ָ�����ȵ����ݴ���
-* ע������: ��
+* 函数名称: LCD_INTStat()
+* 功能说明: LCD中断状态查询
+* 输 入: LCD_TypeDef * LCDx 指定要被设置的LCD,有效值包括LCD
+* 输 出: uint32_t 1 完成指定长度的数据传输 0 未完成指定长度的数据传输
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t LCD_INTStat(LCD_TypeDef * LCDx)
+uint32_t LCD_INTStat(LCD_TypeDef *LCDx)
{
- return (LCDx->IF & 0x01) ? 1 : 0;
+ return (LCDx->IF & 0x01) ? 1 : 0;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.h
index 490af3162f..d9c78f8d1f 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_lcd.h
@@ -1,80 +1,70 @@
#ifndef __SWM320_LCD_H__
#define __SWM320_LCD_H__
+typedef struct
+{
+ uint16_t HnPixel; //水平方向像素个数,最大取值1024
+ uint16_t VnPixel; //垂直方向像素个数,最大取值 768
+ uint8_t Hfp; //horizonal front porch,最大取值32
+ uint8_t Hbp; //horizonal back porch, 最大取值128
+ uint8_t Vfp; //vertical front porch, 最大取值8
+ uint8_t Vbp; //vertical back porch, 最大取值32
+ uint8_t ClkDiv; //系统时钟经ClkDiv分频后产生DOCCLK,0 2分频 1 4分频 2 6分频 ... ... 31 64分频
+ uint8_t SamplEdge; //屏幕在DOTCLK的哪个边沿采样数据:LCD_SAMPLEDGE_RISE、LCD_SAMPLEDGE_FALL
+ uint8_t ClkAlways; //1 一直输出DOTCLK 0 只在传输数据时输出DOTCLK
+ uint8_t HsyncWidth; //HSYNC低电平持续多少个DOTCLK,取值:LCD_HSYNC_1DOTCLK、LCD_HSYNC_2DOTCLK、LCD_HSYNC_3DOTCLK、LCD_HSYNC_4DOTCLK
-typedef struct {
- uint8_t Interface; //LCD���ӿڣ�LCD_INTERFACE_RGB��LCD_INTERFACE_I80��LCD_INTERFACE_M68
-
- /* RGBͬ���ӿڲ��� */
- uint16_t HnPixel; //ˮƽ�������ظ��������ȡֵ1024
- uint16_t VnPixel; //��ֱ�������ظ��������ȡֵ 768
- uint8_t Hfp; //horizonal front porch�����ȡֵ32
- uint8_t Hbp; //horizonal back porch�� ���ȡֵ128
- uint8_t Vfp; //vertical front porch�� ���ȡֵ8
- uint8_t Vbp; //vertical back porch�� ���ȡֵ32
- uint8_t ClkDiv; //ϵͳʱ�Ӿ�ClkDiv��Ƶ�����DOCCLK��0 2��Ƶ 1 4��Ƶ 2 6��Ƶ ... ... 31 64��Ƶ
- uint8_t SamplEdge; //��Ļ��DOTCLK���ĸ����ز������ݣ�LCD_SAMPLEDGE_RISE��LCD_SAMPLEDGE_FALL
- uint8_t ClkAlways; //1 һֱ���DOTCLK 0 ֻ�ڴ�������ʱ���DOTCLK
- uint8_t HsyncWidth; //HSYNC�͵�ƽ�������ٸ�DOTCLK��ȡֵ��LCD_HSYNC_1DOTCLK��LCD_HSYNC_2DOTCLK��LCD_HSYNC_3DOTCLK��LCD_HSYNC_4DOTCLK
-
- uint8_t IntEOTEn; //End of Transter��������ɣ��ж�ʹ��
+ uint8_t IntEOTEn; //End of Transter(传输完成)中断使能
} LCD_InitStructure;
+#define LCD_SAMPLEDGE_RISE 0 //屏幕在DOTCLK的上升沿采样数据
+#define LCD_SAMPLEDGE_FALL 1 //屏幕在DOTCLK的下降沿采样数据
-#define LCD_INTERFACE_RGB 0
-#define LCD_INTERFACE_I80 1
-#define LCD_INTERFACE_M68 2
+#define LCD_HSYNC_1DOTCLK 0 //1个DOTCLK
+#define LCD_HSYNC_2DOTCLK 1
+#define LCD_HSYNC_3DOTCLK 2
+#define LCD_HSYNC_4DOTCLK 3
-#define LCD_SAMPLEDGE_RISE 0 //��Ļ��DOTCLK�������ز�������
-#define LCD_SAMPLEDGE_FALL 1 //��Ļ��DOTCLK���½��ز�������
+#define LCD_CLKDIV_2 0
+#define LCD_CLKDIV_4 1
+#define LCD_CLKDIV_6 2
+#define LCD_CLKDIV_8 3
+#define LCD_CLKDIV_10 4
+#define LCD_CLKDIV_12 5
+#define LCD_CLKDIV_14 6
+#define LCD_CLKDIV_16 7
+#define LCD_CLKDIV_18 8
+#define LCD_CLKDIV_20 9
+#define LCD_CLKDIV_22 10
+#define LCD_CLKDIV_24 11
+#define LCD_CLKDIV_26 12
+#define LCD_CLKDIV_28 13
+#define LCD_CLKDIV_30 14
+#define LCD_CLKDIV_32 15
+#define LCD_CLKDIV_34 16
+#define LCD_CLKDIV_36 17
+#define LCD_CLKDIV_38 18
+#define LCD_CLKDIV_40 19
+#define LCD_CLKDIV_42 20
+#define LCD_CLKDIV_44 21
+#define LCD_CLKDIV_46 22
+#define LCD_CLKDIV_48 23
+#define LCD_CLKDIV_50 24
+#define LCD_CLKDIV_52 25
+#define LCD_CLKDIV_54 26
+#define LCD_CLKDIV_56 27
+#define LCD_CLKDIV_58 28
+#define LCD_CLKDIV_60 29
+#define LCD_CLKDIV_62 30
+#define LCD_CLKDIV_64 31
-#define LCD_HSYNC_1DOTCLK 0 //1��DOTCLK
-#define LCD_HSYNC_2DOTCLK 1
-#define LCD_HSYNC_3DOTCLK 2
-#define LCD_HSYNC_4DOTCLK 3
-
-#define LCD_CLKDIV_2 0
-#define LCD_CLKDIV_4 1
-#define LCD_CLKDIV_6 2
-#define LCD_CLKDIV_8 3
-#define LCD_CLKDIV_10 4
-#define LCD_CLKDIV_12 5
-#define LCD_CLKDIV_14 6
-#define LCD_CLKDIV_16 7
-#define LCD_CLKDIV_18 8
-#define LCD_CLKDIV_20 9
-#define LCD_CLKDIV_22 10
-#define LCD_CLKDIV_24 11
-#define LCD_CLKDIV_26 12
-#define LCD_CLKDIV_28 13
-#define LCD_CLKDIV_30 14
-#define LCD_CLKDIV_32 15
-#define LCD_CLKDIV_34 16
-#define LCD_CLKDIV_36 17
-#define LCD_CLKDIV_38 18
-#define LCD_CLKDIV_40 19
-#define LCD_CLKDIV_42 20
-#define LCD_CLKDIV_44 21
-#define LCD_CLKDIV_46 22
-#define LCD_CLKDIV_48 23
-#define LCD_CLKDIV_50 24
-#define LCD_CLKDIV_52 25
-#define LCD_CLKDIV_54 26
-#define LCD_CLKDIV_56 27
-#define LCD_CLKDIV_58 28
-#define LCD_CLKDIV_60 29
-#define LCD_CLKDIV_62 30
-#define LCD_CLKDIV_64 31
-
-
-void LCD_Init(LCD_TypeDef * LCDx, LCD_InitStructure * initStruct);
-void LCD_Start(LCD_TypeDef * LCDx);
-uint32_t LCD_IsBusy(LCD_TypeDef * LCDx);
-
-void LCD_INTEn(LCD_TypeDef * LCDx);
-void LCD_INTDis(LCD_TypeDef * LCDx);
-void LCD_INTClr(LCD_TypeDef * LCDx);
-uint32_t LCD_INTStat(LCD_TypeDef * LCDx);
+void LCD_Init(LCD_TypeDef *LCDx, LCD_InitStructure *initStruct);
+void LCD_Start(LCD_TypeDef *LCDx);
+uint32_t LCD_IsBusy(LCD_TypeDef *LCDx);
+void LCD_INTEn(LCD_TypeDef *LCDx);
+void LCD_INTDis(LCD_TypeDef *LCDx);
+void LCD_INTClr(LCD_TypeDef *LCDx);
+uint32_t LCD_INTStat(LCD_TypeDef *LCDx);
#endif //__SWM320_LCD_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.c
index d811ea46e8..a8f6611ffe 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_norflash.c
-* ����˵��: SWM320��Ƭ����NOR Flash��������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_norflash.c
+* 功能说明: SWM320单片机的NOR Flash驱动程序
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,152 +21,167 @@
#include "SWM320.h"
#include "SWM320_norflash.h"
-
/******************************************************************************************************************************************
-* ��������: NORFL_Init()
-* ����˵��: NOR Flash��������ʼ��
-* �� ��: NORFL_InitStructure * initStruct ����NOR Flash����������趨ֵ�Ľṹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: NORFL_Init()
+* 功能说明: NOR Flash控制器初始化
+* 输 入: NORFL_InitStructure * initStruct 包含NOR Flash控制器相关设定值的结构体
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void NORFL_Init(NORFL_InitStructure * initStruct)
+void NORFL_Init(NORFL_InitStructure *initStruct)
{
- uint32_t i;
-
- // ����SRAMǰ��Ҫˢ����SDRAM������
- do {
- SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
-
- while(SDRAMC->REFDONE == 0);
- SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
-
- for(i = 0; i < 1000; i++) __NOP();
- SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
- } while(0);
-
- SYS->CLKEN |= (1 << SYS_CLKEN_NORFL_Pos);
-
- NORFLC->CR = ((initStruct->DataWidth == 8 ? 1 : 0) << NORFLC_CR_BYTEIF_Pos) |
- (initStruct->WELowPulseTime << NORFLC_CR_WRTIME_Pos) |
- (initStruct->OEPreValidTime << NORFLC_CR_RDTIME_Pos);
-
- NORFLC->IE = 3;
- NORFLC->IF = 3; // ����жϱ�־
- if(initStruct->OperFinishIEn) NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos);
- else NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos);
- if(initStruct->OperTimeoutIEn) NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos);
- else NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos);
+ uint32_t i;
+
+ // 配置SRAM前需要刷新下SDRAM控制器
+ do
+ {
+ SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
+
+ while (SDRAMC->REFDONE == 0)
+ ;
+ SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
+
+ for (i = 0; i < 1000; i++)
+ __NOP();
+ SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
+ } while (0);
+
+ SYS->CLKEN |= (1 << SYS_CLKEN_NORFL_Pos);
+
+ NORFLC->CR = ((initStruct->DataWidth == 8 ? 1 : 0) << NORFLC_CR_BYTEIF_Pos) |
+ (initStruct->WELowPulseTime << NORFLC_CR_WRTIME_Pos) |
+ (initStruct->OEPreValidTime << NORFLC_CR_RDTIME_Pos);
+
+ NORFLC->IE = 3;
+ NORFLC->IF = 3; // 清除中断标志
+ if (initStruct->OperFinishIEn)
+ NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos);
+ else
+ NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos);
+ if (initStruct->OperTimeoutIEn)
+ NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos);
+ else
+ NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos);
}
/******************************************************************************************************************************************
-* ��������: NORFL_ChipErase()
-* ����˵��: NOR Flash��Ƭ����
-* �� ��: ��
-* �� ��: uint32_t 0 �����ɹ� 1 ������ʱ
-* ע������: ��
+* 函数名称: NORFL_ChipErase()
+* 功能说明: NOR Flash整片擦除
+* 输 入: 无
+* 输 出: uint32_t 0 擦除成功 1 擦除超时
+* 注意事项: 无
******************************************************************************************************************************************/
uint32_t NORFL_ChipErase(void)
{
- uint32_t res;
-
- NORFLC->CMD = (NORFL_CMD_CHIP_ERASE << NORFLC_CMD_CMD_Pos);
-
- while(((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
- ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
-
- if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
- else res = 1;
-
- NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
-
- return res;
+ uint32_t res;
+
+ NORFLC->CMD = (NORFL_CMD_CHIP_ERASE << NORFLC_CMD_CMD_Pos);
+
+ while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
+ ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
+ __NOP();
+
+ if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
+ res = 0;
+ else
+ res = 1;
+
+ NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
+
+ return res;
}
/******************************************************************************************************************************************
-* ��������: NORFL_SectorErase()
-* ����˵��: NOR Flash��������
-* �� ��: uint32_t addr Ҫ������������ʼ��ַ
-* �� ��: uint32_t 0 �����ɹ� 1 ������ʱ
-* ע������: MX29LV128DB ǰ8����Ϊ8K����255����Ϊ64K MX29LV128DT ǰ255����Ϊ64K����8����Ϊ8K
+* 函数名称: NORFL_SectorErase()
+* 功能说明: NOR Flash扇区擦除
+* 输 入: uint32_t addr 要擦除扇区的起始地址
+* 输 出: uint32_t 0 擦除成功 1 擦除超时
+* 注意事项: MX29LV128DB 前8扇区为8K、后255扇区为64K MX29LV128DT 前255扇区为64K、后8扇区为8K
******************************************************************************************************************************************/
uint32_t NORFL_SectorErase(uint32_t addr)
{
- uint32_t res;
-
- NORFLC->ADDR = addr;
- NORFLC->CMD = (NORFL_CMD_SECTOR_ERASE << NORFLC_CMD_CMD_Pos);
-
- while(((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
- ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
-
- if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
- else res = 1;
-
- NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
-
- return res;
+ uint32_t res;
+
+ NORFLC->ADDR = addr;
+ NORFLC->CMD = (NORFL_CMD_SECTOR_ERASE << NORFLC_CMD_CMD_Pos);
+
+ while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
+ ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
+ __NOP();
+
+ if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
+ res = 0;
+ else
+ res = 1;
+
+ NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
+
+ return res;
}
/******************************************************************************************************************************************
-* ��������: NORFL_Write()
-* ����˵��: NOR Flashд
-* �� ��: uint32_t addr ����Ҫд��ĵ�ַ
-* uint32_t data Ҫд�������
-* �� ��: uint32_t 0 д��ɹ� 1 д�볬ʱ
-* ע������: Ӳ�����ӣ�������Ϊ16λʱ������д�룻������Ϊ8λʱ���ֽ�д��
+* 函数名称: NORFL_Write()
+* 功能说明: NOR Flash写
+* 输 入: uint32_t addr 数据要写入的地址
+* uint32_t data 要写入的数据
+* 输 出: uint32_t 0 写入成功 1 写入超时
+* 注意事项: 硬件连接,数据线为16位时,半字写入;数据线为8位时,字节写入
******************************************************************************************************************************************/
uint32_t NORFL_Write(uint32_t addr, uint32_t data)
{
- uint32_t res;
-
- NORFLC->ADDR = addr;
- NORFLC->CMD = (NORFL_CMD_PROGRAM << NORFLC_CMD_CMD_Pos) | (data << NORFLC_CMD_DATA_Pos);
-
- while(((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
- ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP();
-
- if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0;
- else res = 1;
-
- NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
-
- return res;
+ uint32_t res;
+
+ NORFLC->ADDR = addr;
+ NORFLC->CMD = (NORFL_CMD_PROGRAM << NORFLC_CMD_CMD_Pos) | (data << NORFLC_CMD_DATA_Pos);
+
+ while (((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) &&
+ ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0))
+ __NOP();
+
+ if (NORFLC->IF & NORFLC_IF_FINISH_Msk)
+ res = 0;
+ else
+ res = 1;
+
+ NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk;
+
+ return res;
}
/******************************************************************************************************************************************
-* ��������: NORFL_Read()
-* ����˵��: NOR Flash��
-* �� ��: uint32_t addr ����Ҫ�����ĵ�ַ
-* �� ��: uint32_t ����������
-* ע������: Ӳ�����ӣ�������Ϊ16λʱ�����ֶ�����������Ϊ8λʱ���ֽڶ���
+* 函数名称: NORFL_Read()
+* 功能说明: NOR Flash读
+* 输 入: uint32_t addr 数据要读出的地址
+* 输 出: uint32_t 读出的数据
+* 注意事项: 硬件连接,数据线为16位时,半字读出;数据线为8位时,字节读出
******************************************************************************************************************************************/
uint32_t NORFL_Read(uint32_t addr)
{
- NORFLC->ADDR = addr;
- NORFLC->CMD = (NORFL_CMD_READ << NORFLC_CMD_CMD_Pos);
-
- return (NORFLC->CMD & NORFLC_CMD_DATA_Msk);
+ NORFLC->ADDR = addr;
+ NORFLC->CMD = (NORFL_CMD_READ << NORFLC_CMD_CMD_Pos);
+
+ return (NORFLC->CMD & NORFLC_CMD_DATA_Msk);
}
/******************************************************************************************************************************************
-* ��������: NORFL_ReadID()
-* ����˵��: NOR Flash��ID
-* �� ��: uint32_t id_addr ID��ַ���˲�����оƬ��صģ�ÿ��оƬ����ͬ
-* �� ��: uint16_t ��ȡ����ID
-* ע������: ��
+* 函数名称: NORFL_ReadID()
+* 功能说明: NOR Flash读ID
+* 输 入: uint32_t id_addr ID地址,此参数是芯片相关的,每种芯片都不同
+* 输 出: uint16_t 读取到的ID
+* 注意事项: 无
******************************************************************************************************************************************/
uint16_t NORFL_ReadID(uint32_t id_addr)
{
- uint16_t id;
-
- NORFLC->CMD = (NORFL_CMD_AUTO_SELECT << NORFLC_CMD_CMD_Pos);
-
- NORFLC->ADDR = id_addr;
- NORFLC->CMD = (NORFL_CMD_READ << NORFLC_CMD_CMD_Pos);
-
- id = NORFLC->CMD & NORFLC_CMD_DATA_Msk;
-
- NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos); // �˳�ID��ȡģʽ
-
- return id;
+ uint16_t id;
+
+ NORFLC->CMD = (NORFL_CMD_AUTO_SELECT << NORFLC_CMD_CMD_Pos);
+
+ NORFLC->ADDR = id_addr;
+ NORFLC->CMD = (NORFL_CMD_READ << NORFLC_CMD_CMD_Pos);
+
+ id = NORFLC->CMD & NORFLC_CMD_DATA_Msk;
+
+ NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos); // 退出ID读取模式
+
+ return id;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.h
index 23f7e5f902..228ff7032d 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_norflash.h
@@ -1,38 +1,34 @@
#ifndef __SWM320_NORFLASH_H__
#define __SWM320_NORFLASH_H__
-typedef struct {
- uint8_t DataWidth; // 8��16
-
- uint8_t WELowPulseTime; // WE# pulse width����λΪϵͳʱ�����ڣ����ֵΪ7
- uint8_t OEPreValidTime; // Valid data output after OE# low����λΪϵͳʱ�����ڣ����ֵΪ15
-
- uint8_t OperFinishIEn; // ����(д�롢����)����ж�ʹ��
- uint8_t OperTimeoutIEn;
-} NORFL_InitStructure;
+typedef struct
+{
+ uint8_t DataWidth; // 8、16
+ uint8_t WELowPulseTime; // WE# pulse width,单位为系统时钟周期,最大值为7
+ uint8_t OEPreValidTime; // Valid data output after OE# low,单位为系统时钟周期,最大值为15
+ uint8_t OperFinishIEn; // 操作(写入、擦除)完成中断使能
+ uint8_t OperTimeoutIEn;
+} NORFL_InitStructure;
-void NORFL_Init(NORFL_InitStructure * initStruct);
+void NORFL_Init(NORFL_InitStructure *initStruct);
uint32_t NORFL_ChipErase(void);
uint32_t NORFL_SectorErase(uint32_t addr);
uint32_t NORFL_Write(uint32_t addr, uint32_t data);
uint32_t NORFL_Read(uint32_t addr);
uint16_t NORFL_ReadID(uint32_t id_addr);
-
-/* ��ǰ�汾���߶�ֻ֧���ֶ�
+/* 当前版本总线读只支持字读
#define NORFL_Read8(addr) *((volatile uint8_t *)(NORFLM_BASE + addr))
#define NORFL_Read16(addr) *((volatile uint16_t *)(NORFLM_BASE + addr)) */
-#define NORFL_Read32(addr) *((volatile uint32_t *)(NORFLM_BASE + addr))
-
-
+#define NORFL_Read32(addr) *((volatile uint32_t *)(NORFLM_BASE + addr))
-#define NORFL_CMD_READ 0
-#define NORFL_CMD_RESET 1
-#define NORFL_CMD_AUTO_SELECT 2
-#define NORFL_CMD_PROGRAM 3
-#define NORFL_CMD_CHIP_ERASE 4
-#define NORFL_CMD_SECTOR_ERASE 5
+#define NORFL_CMD_READ 0
+#define NORFL_CMD_RESET 1
+#define NORFL_CMD_AUTO_SELECT 2
+#define NORFL_CMD_PROGRAM 3
+#define NORFL_CMD_CHIP_ERASE 4
+#define NORFL_CMD_SECTOR_ERASE 5
#endif // __SWM320_NORFLASH_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.c
index af21c1ffeb..bb4c7f0731 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_port.c
-* ����˵��: SWM320��Ƭ���Ķ˿����Ź���ѡ��⺯��
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_port.c
+* 功能说明: SWM320单片机的端口引脚功能选择库函数
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,201 +21,200 @@
#include "SWM320.h"
#include "SWM320_port.h"
-
/******************************************************************************************************************************************
-* ��������: PORT_Init()
-* ����˵��: �˿����Ź���ѡ�񣬿��õĹ��ܼ�"SWM320_port.h"�ļ�
-* �� ��: uint32_t PORTx ָ��PORT�˿ڣ���Чֵ����PORTA��PORTB��PORTC��PORTM��PORTN��PORTP
-* uint32_t n ָ��PORT���ţ���Чֵ����PIN0��PIN1��PIN2��... ... PIN22��PIN23
-* uint32_t func ָ���˿�����Ҫ�趨�Ĺ��ܣ����ȡֵ��"SWM320_port.h"�ļ�
-* uint32_t digit_in_en ��������ʹ��
-* �� ��: ��
-* ע������: �����ű��nΪż��ʱ��funcȡֵֻ����FUNMUX0��ͷ�ģ���FUNMUX0_UART0_RXD
-* �����ű��nΪ����ʱ��funcȡֵֻ����FUNMUX1��ͷ�ģ���FUNMUX1_UART0_TXD
+* 函数名称: PORT_Init()
+* 功能说明: 端口引脚功能选择,可用的功能见"SWM320_port.h"文件
+* 输 入: uint32_t PORTx 指定PORT端口,有效值包括PORTA、PORTB、PORTC、PORTM、PORTN、PORTP
+* uint32_t n 指定PORT引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
+* uint32_t func 指定端口引脚要设定的功能,其可取值见"SWM320_port.h"文件
+* uint32_t digit_in_en 数字输入使能
+* 输 出: 无
+* 注意事项: 当引脚标号n为偶数时,func取值只能是FUNMUX0开头的,如FUNMUX0_UART0_RXD
+* 当引脚标号n为奇数时,func取值只能是FUNMUX1开头的,如FUNMUX1_UART0_TXD
******************************************************************************************************************************************/
void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en)
{
- switch((uint32_t)PORTx)
- {
- case ((uint32_t)PORTA):
- if(func > 99)
- {
- if(n < PIN6)
- {
- PORT->PORTA_MUX0 &= ~(0x1F << (n*5));
- PORT->PORTA_MUX0 |= (func-100) << (n*5);
- }
- else if(n < PIN12)
- {
- PORT->PORTA_MUX1 &= ~(0x1F << ((n-6)*5));
- PORT->PORTA_MUX1 |= (func-100) << ((n-6)*5);
- }
- }
-
- PORT->PORTA_SEL &= ~(0x03 << (n*2));
- PORT->PORTA_SEL |= (func > 99 ? 1 : func) << (n*2);
-
- PORT->PORTA_INEN &= ~(0x01 << n);
- PORT->PORTA_INEN |= (digit_in_en << n);
- break;
-
- case ((uint32_t)PORTB):
- if(func > 99)
- {
- if(n < PIN6)
- {
- PORT->PORTB_MUX0 &= ~(0x1F << (n*5));
- PORT->PORTB_MUX0 |= (func-100) << (n*5);
- }
- else if(n < PIN12)
- {
- PORT->PORTB_MUX1 &= ~(0x1F << ((n-6)*5));
- PORT->PORTB_MUX1 |= (func-100) << ((n-6)*5);
- }
- }
-
- PORT->PORTB_SEL &= ~(0x03 << (n*2));
- PORT->PORTB_SEL |= (func > 99 ? 1 : func) << (n*2);
-
- PORT->PORTB_INEN &= ~(0x01 << n);
- PORT->PORTB_INEN |= (digit_in_en << n);
- break;
-
- case ((uint32_t)PORTC):
- if(func > 99)
- {
- if(n < PIN6)
- {
- PORT->PORTC_MUX0 &= ~(0x1F << (n*5));
- PORT->PORTC_MUX0 |= (func-100) << (n*5);
- }
- else if(n < PIN12)
- {
- PORT->PORTC_MUX1 &= ~(0x1F << ((n-6)*5));
- PORT->PORTC_MUX1 |= (func-100) << ((n-6)*5);
- }
- }
-
- PORT->PORTC_SEL &= ~(0x03 << (n*2));
- PORT->PORTC_SEL |= (func > 99 ? 1 : func) << (n*2);
-
- PORT->PORTC_INEN &= ~(0x01 << n);
- PORT->PORTC_INEN |= (digit_in_en << n);
- break;
-
- case ((uint32_t)PORTM):
- if(func > 99)
- {
- if(n < PIN6)
- {
- PORT->PORTM_MUX0 &= ~(0x1F << (n*5));
- PORT->PORTM_MUX0 |= (func-100) << (n*5);
- }
- else if(n < PIN12)
- {
- PORT->PORTM_MUX1 &= ~(0x1F << ((n-6)*5));
- PORT->PORTM_MUX1 |= (func-100) << ((n-6)*5);
- }
- else if(n < PIN18)
- {
- PORT->PORTM_MUX2 &= ~(0x1F << ((n-12)*5));
- PORT->PORTM_MUX2 |= (func-100) << ((n-12)*5);
- }
- else if(n < PIN24)
- {
- PORT->PORTM_MUX3 &= ~(0x1F << ((n-18)*5));
- PORT->PORTM_MUX3 |= (func-100) << ((n-18)*5);
- }
- }
-
- if(n < 16)
- {
- PORT->PORTM_SEL0 &= ~(0x03 << (n*2));
- PORT->PORTM_SEL0 |= (func > 99 ? 1 : func) << (n*2);
- }
- else
- {
- PORT->PORTM_SEL1 &= ~(0x03 << ((n-16)*2));
- PORT->PORTM_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2);
- }
-
- PORT->PORTM_INEN &= ~(0x01 << n);
- PORT->PORTM_INEN |= (digit_in_en << n);
- break;
-
- case ((uint32_t)PORTN):
- if(func > 99)
- {
- if(n < PIN6)
- {
- PORT->PORTN_MUX0 &= ~(0x1F << (n*5));
- PORT->PORTN_MUX0 |= (func-100) << (n*5);
- }
- else if(n < PIN12)
- {
- PORT->PORTN_MUX1 &= ~(0x1F << ((n-6)*5));
- PORT->PORTN_MUX1 |= (func-100) << ((n-6)*5);
- }
- else if(n < PIN18)
- {
- PORT->PORTN_MUX2 &= ~(0x1F << ((n-12)*5));
- PORT->PORTN_MUX2 |= (func-100) << ((n-12)*5);
- }
- }
-
- if(n < 16)
- {
- PORT->PORTN_SEL0 &= ~(0x03 << (n*2));
- PORT->PORTN_SEL0 |= (func > 99 ? 1 : func) << (n*2);
- }
- else
- {
- PORT->PORTN_SEL1 &= ~(0x03 << ((n-16)*2));
- PORT->PORTN_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2);
- }
-
- PORT->PORTN_INEN &= ~(0x01 << n);
- PORT->PORTN_INEN |= (digit_in_en << n);
- break;
-
- case ((uint32_t)PORTP):
- if(func > 99)
- {
- if(n < PIN6)
- {
- PORT->PORTP_MUX0 &= ~(0x1F << (n*5));
- PORT->PORTP_MUX0 |= (func-100) << (n*5);
- }
- else if(n < PIN12)
- {
- PORT->PORTP_MUX1 &= ~(0x1F << ((n-6)*5));
- PORT->PORTP_MUX1 |= (func-100) << ((n-6)*5);
- }
- else if(n < PIN18)
- {
- PORT->PORTP_MUX2 &= ~(0x1F << ((n-12)*5));
- PORT->PORTP_MUX2 |= (func-100) << ((n-12)*5);
- }
- else if(n < PIN24)
- {
- PORT->PORTP_MUX3 &= ~(0x1F << ((n-18)*5));
- PORT->PORTP_MUX3 |= (func-100) << ((n-18)*5);
- }
- }
-
- if(n < 16)
- {
- PORT->PORTP_SEL0 &= ~(0x03 << (n*2));
- PORT->PORTP_SEL0 |= (func > 99 ? 1 : func) << (n*2);
- }
- else
- {
- PORT->PORTP_SEL1 &= ~(0x03 << ((n-16)*2));
- PORT->PORTP_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2);
- }
-
- PORT->PORTP_INEN &= ~(0x01 << n);
- PORT->PORTP_INEN |= (digit_in_en << n);
- break;
- }
+ switch ((uint32_t)PORTx)
+ {
+ case ((uint32_t)PORTA):
+ if (func > 99)
+ {
+ if (n < PIN6)
+ {
+ PORT->PORTA_MUX0 &= ~(0x1F << (n * 5));
+ PORT->PORTA_MUX0 |= (func - 100) << (n * 5);
+ }
+ else if (n < PIN12)
+ {
+ PORT->PORTA_MUX1 &= ~(0x1F << ((n - 6) * 5));
+ PORT->PORTA_MUX1 |= (func - 100) << ((n - 6) * 5);
+ }
+ }
+
+ PORT->PORTA_SEL &= ~(0x03 << (n * 2));
+ PORT->PORTA_SEL |= (func > 99 ? 1 : func) << (n * 2);
+
+ PORT->PORTA_INEN &= ~(0x01 << n);
+ PORT->PORTA_INEN |= (digit_in_en << n);
+ break;
+
+ case ((uint32_t)PORTB):
+ if (func > 99)
+ {
+ if (n < PIN6)
+ {
+ PORT->PORTB_MUX0 &= ~(0x1F << (n * 5));
+ PORT->PORTB_MUX0 |= (func - 100) << (n * 5);
+ }
+ else if (n < PIN12)
+ {
+ PORT->PORTB_MUX1 &= ~(0x1F << ((n - 6) * 5));
+ PORT->PORTB_MUX1 |= (func - 100) << ((n - 6) * 5);
+ }
+ }
+
+ PORT->PORTB_SEL &= ~(0x03 << (n * 2));
+ PORT->PORTB_SEL |= (func > 99 ? 1 : func) << (n * 2);
+
+ PORT->PORTB_INEN &= ~(0x01 << n);
+ PORT->PORTB_INEN |= (digit_in_en << n);
+ break;
+
+ case ((uint32_t)PORTC):
+ if (func > 99)
+ {
+ if (n < PIN6)
+ {
+ PORT->PORTC_MUX0 &= ~(0x1F << (n * 5));
+ PORT->PORTC_MUX0 |= (func - 100) << (n * 5);
+ }
+ else if (n < PIN12)
+ {
+ PORT->PORTC_MUX1 &= ~(0x1F << ((n - 6) * 5));
+ PORT->PORTC_MUX1 |= (func - 100) << ((n - 6) * 5);
+ }
+ }
+
+ PORT->PORTC_SEL &= ~(0x03 << (n * 2));
+ PORT->PORTC_SEL |= (func > 99 ? 1 : func) << (n * 2);
+
+ PORT->PORTC_INEN &= ~(0x01 << n);
+ PORT->PORTC_INEN |= (digit_in_en << n);
+ break;
+
+ case ((uint32_t)PORTM):
+ if (func > 99)
+ {
+ if (n < PIN6)
+ {
+ PORT->PORTM_MUX0 &= ~(0x1F << (n * 5));
+ PORT->PORTM_MUX0 |= (func - 100) << (n * 5);
+ }
+ else if (n < PIN12)
+ {
+ PORT->PORTM_MUX1 &= ~(0x1F << ((n - 6) * 5));
+ PORT->PORTM_MUX1 |= (func - 100) << ((n - 6) * 5);
+ }
+ else if (n < PIN18)
+ {
+ PORT->PORTM_MUX2 &= ~(0x1F << ((n - 12) * 5));
+ PORT->PORTM_MUX2 |= (func - 100) << ((n - 12) * 5);
+ }
+ else if (n < PIN24)
+ {
+ PORT->PORTM_MUX3 &= ~(0x1F << ((n - 18) * 5));
+ PORT->PORTM_MUX3 |= (func - 100) << ((n - 18) * 5);
+ }
+ }
+
+ if (n < 16)
+ {
+ PORT->PORTM_SEL0 &= ~(0x03 << (n * 2));
+ PORT->PORTM_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
+ }
+ else
+ {
+ PORT->PORTM_SEL1 &= ~(0x03 << ((n - 16) * 2));
+ PORT->PORTM_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
+ }
+
+ PORT->PORTM_INEN &= ~(0x01 << n);
+ PORT->PORTM_INEN |= (digit_in_en << n);
+ break;
+
+ case ((uint32_t)PORTN):
+ if (func > 99)
+ {
+ if (n < PIN6)
+ {
+ PORT->PORTN_MUX0 &= ~(0x1F << (n * 5));
+ PORT->PORTN_MUX0 |= (func - 100) << (n * 5);
+ }
+ else if (n < PIN12)
+ {
+ PORT->PORTN_MUX1 &= ~(0x1F << ((n - 6) * 5));
+ PORT->PORTN_MUX1 |= (func - 100) << ((n - 6) * 5);
+ }
+ else if (n < PIN18)
+ {
+ PORT->PORTN_MUX2 &= ~(0x1F << ((n - 12) * 5));
+ PORT->PORTN_MUX2 |= (func - 100) << ((n - 12) * 5);
+ }
+ }
+
+ if (n < 16)
+ {
+ PORT->PORTN_SEL0 &= ~(0x03 << (n * 2));
+ PORT->PORTN_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
+ }
+ else
+ {
+ PORT->PORTN_SEL1 &= ~(0x03 << ((n - 16) * 2));
+ PORT->PORTN_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
+ }
+
+ PORT->PORTN_INEN &= ~(0x01 << n);
+ PORT->PORTN_INEN |= (digit_in_en << n);
+ break;
+
+ case ((uint32_t)PORTP):
+ if (func > 99)
+ {
+ if (n < PIN6)
+ {
+ PORT->PORTP_MUX0 &= ~(0x1F << (n * 5));
+ PORT->PORTP_MUX0 |= (func - 100) << (n * 5);
+ }
+ else if (n < PIN12)
+ {
+ PORT->PORTP_MUX1 &= ~(0x1F << ((n - 6) * 5));
+ PORT->PORTP_MUX1 |= (func - 100) << ((n - 6) * 5);
+ }
+ else if (n < PIN18)
+ {
+ PORT->PORTP_MUX2 &= ~(0x1F << ((n - 12) * 5));
+ PORT->PORTP_MUX2 |= (func - 100) << ((n - 12) * 5);
+ }
+ else if (n < PIN24)
+ {
+ PORT->PORTP_MUX3 &= ~(0x1F << ((n - 18) * 5));
+ PORT->PORTP_MUX3 |= (func - 100) << ((n - 18) * 5);
+ }
+ }
+
+ if (n < 16)
+ {
+ PORT->PORTP_SEL0 &= ~(0x03 << (n * 2));
+ PORT->PORTP_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
+ }
+ else
+ {
+ PORT->PORTP_SEL1 &= ~(0x03 << ((n - 16) * 2));
+ PORT->PORTP_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
+ }
+
+ PORT->PORTP_INEN &= ~(0x01 << n);
+ PORT->PORTP_INEN |= (digit_in_en << n);
+ break;
+ }
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.h
index 1e2f4f2244..0d1ec56db1 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_port.h
@@ -1,482 +1,474 @@
#ifndef __SWM320_PORT_H__
#define __SWM320_PORT_H__
-void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en); //�˿����Ź���ѡ�����ȡֵ���£�
+void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en); //端口引脚功能选择,其可取值如下:
-#define PORTA 0
-#define PORTB 1
-#define PORTC 2
-#define PORTM 3
-#define PORTN 4
-#define PORTP 5
+#define PORTA 0
+#define PORTB 1
+#define PORTC 2
+#define PORTM 3
+#define PORTN 4
+#define PORTP 5
-#define PORTA_PIN0_GPIO 0
-#define PORTA_PIN0_FUNMUX 1
-#define PORTA_PIN0_SWCLK 2
+#define PORTA_PIN0_GPIO 0
+#define PORTA_PIN0_FUNMUX 1
+#define PORTA_PIN0_SWCLK 2
-#define PORTA_PIN1_GPIO 0
-#define PORTA_PIN1_FUNMUX 1
-#define PORTA_PIN1_SWDIO 2
+#define PORTA_PIN1_GPIO 0
+#define PORTA_PIN1_FUNMUX 1
+#define PORTA_PIN1_SWDIO 2
-#define PORTA_PIN2_GPIO 0
-#define PORTA_PIN2_FUNMUX 1
+#define PORTA_PIN2_GPIO 0
+#define PORTA_PIN2_FUNMUX 1
-#define PORTA_PIN3_GPIO 0
-#define PORTA_PIN3_FUNMUX 1
+#define PORTA_PIN3_GPIO 0
+#define PORTA_PIN3_FUNMUX 1
-#define PORTA_PIN4_GPIO 0
-#define PORTA_PIN4_FUNMUX 1
+#define PORTA_PIN4_GPIO 0
+#define PORTA_PIN4_FUNMUX 1
-#define PORTA_PIN5_GPIO 0
-#define PORTA_PIN5_FUNMUX 1
+#define PORTA_PIN5_GPIO 0
+#define PORTA_PIN5_FUNMUX 1
-#define PORTA_PIN6_GPIO 0
-#define PORTA_PIN6_FUNMUX 1
+#define PORTA_PIN6_GPIO 0
+#define PORTA_PIN6_FUNMUX 1
-#define PORTA_PIN7_GPIO 0
-#define PORTA_PIN7_FUNMUX 1
+#define PORTA_PIN7_GPIO 0
+#define PORTA_PIN7_FUNMUX 1
-#define PORTA_PIN8_GPIO 0
-#define PORTA_PIN8_FUNMUX 1
+#define PORTA_PIN8_GPIO 0
+#define PORTA_PIN8_FUNMUX 1
-#define PORTA_PIN9_GPIO 0
-#define PORTA_PIN9_FUNMUX 1
-#define PORTA_PIN9_ADC0_IN7 3
+#define PORTA_PIN9_GPIO 0
+#define PORTA_PIN9_FUNMUX 1
+#define PORTA_PIN9_ADC0_IN7 3
-#define PORTA_PIN10_GPIO 0
-#define PORTA_PIN10_FUNMUX 1
-#define PORTA_PIN10_ADC0_IN6 3
+#define PORTA_PIN10_GPIO 0
+#define PORTA_PIN10_FUNMUX 1
+#define PORTA_PIN10_ADC0_IN6 3
-#define PORTA_PIN11_GPIO 0
-#define PORTA_PIN11_FUNMUX 1
-#define PORTA_PIN11_ADC0_IN5 3
+#define PORTA_PIN11_GPIO 0
+#define PORTA_PIN11_FUNMUX 1
+#define PORTA_PIN11_ADC0_IN5 3
-#define PORTA_PIN12_GPIO 0
-#define PORTA_PIN12_ADC0_IN4 3
+#define PORTA_PIN12_GPIO 0
+#define PORTA_PIN12_ADC0_IN4 3
+#define PORTB_PIN0_GPIO 0
+#define PORTB_PIN0_FUNMUX 1
+#define PORTB_PIN0_SD_DETECT 2
-#define PORTB_PIN0_GPIO 0
-#define PORTB_PIN0_FUNMUX 1
-#define PORTB_PIN0_SD_DETECT 2
+#define PORTB_PIN1_GPIO 0
+#define PORTB_PIN1_FUNMUX 1
+#define PORTB_PIN1_SD_CLK 2
-#define PORTB_PIN1_GPIO 0
-#define PORTB_PIN1_FUNMUX 1
-#define PORTB_PIN1_SD_CLK 2
+#define PORTB_PIN2_GPIO 0
+#define PORTB_PIN2_FUNMUX 1
+#define PORTB_PIN2_SD_CMD 2
-#define PORTB_PIN2_GPIO 0
-#define PORTB_PIN2_FUNMUX 1
-#define PORTB_PIN2_SD_CMD 2
+#define PORTB_PIN3_GPIO 0
+#define PORTB_PIN3_FUNMUX 1
+#define PORTB_PIN3_SD_D0 2
-#define PORTB_PIN3_GPIO 0
-#define PORTB_PIN3_FUNMUX 1
-#define PORTB_PIN3_SD_D0 2
+#define PORTB_PIN4_GPIO 0
+#define PORTB_PIN4_FUNMUX 1
+#define PORTB_PIN4_SD_D1 2
-#define PORTB_PIN4_GPIO 0
-#define PORTB_PIN4_FUNMUX 1
-#define PORTB_PIN4_SD_D1 2
+#define PORTB_PIN5_GPIO 0
+#define PORTB_PIN5_FUNMUX 1
+#define PORTB_PIN5_SD_D2 2
-#define PORTB_PIN5_GPIO 0
-#define PORTB_PIN5_FUNMUX 1
-#define PORTB_PIN5_SD_D2 2
+#define PORTB_PIN6_GPIO 0
+#define PORTB_PIN6_FUNMUX 1
+#define PORTB_PIN6_SD_D3 2
-#define PORTB_PIN6_GPIO 0
-#define PORTB_PIN6_FUNMUX 1
-#define PORTB_PIN6_SD_D3 2
+#define PORTB_PIN7_GPIO 0
+#define PORTB_PIN7_FUNMUX 1
+#define PORTB_PIN7_SD_D4 2
-#define PORTB_PIN7_GPIO 0
-#define PORTB_PIN7_FUNMUX 1
-#define PORTB_PIN7_SD_D4 2
+#define PORTB_PIN8_GPIO 0
+#define PORTB_PIN8_FUNMUX 1
+#define PORTB_PIN8_SD_D5 2
-#define PORTB_PIN8_GPIO 0
-#define PORTB_PIN8_FUNMUX 1
-#define PORTB_PIN8_SD_D5 2
+#define PORTB_PIN9_GPIO 0
+#define PORTB_PIN9_FUNMUX 1
+#define PORTB_PIN9_SD_D6 2
-#define PORTB_PIN9_GPIO 0
-#define PORTB_PIN9_FUNMUX 1
-#define PORTB_PIN9_SD_D6 2
+#define PORTB_PIN10_GPIO 0
+#define PORTB_PIN10_FUNMUX 1
+#define PORTB_PIN10_SD_D7 2
-#define PORTB_PIN10_GPIO 0
-#define PORTB_PIN10_FUNMUX 1
-#define PORTB_PIN10_SD_D7 2
+#define PORTB_PIN11_GPIO 0
+#define PORTB_PIN11_FUNMUX 1
-#define PORTB_PIN11_GPIO 0
-#define PORTB_PIN11_FUNMUX 1
+#define PORTB_PIN12_GPIO 0
-#define PORTB_PIN12_GPIO 0
+#define PORTC_PIN0_GPIO 0
+#define PORTC_PIN0_FUNMUX 1
+#define PORTC_PIN1_GPIO 0
+#define PORTC_PIN1_FUNMUX 1
-#define PORTC_PIN0_GPIO 0
-#define PORTC_PIN0_FUNMUX 1
+#define PORTC_PIN2_GPIO 0
+#define PORTC_PIN2_FUNMUX 1
-#define PORTC_PIN1_GPIO 0
-#define PORTC_PIN1_FUNMUX 1
+#define PORTC_PIN3_GPIO 0
+#define PORTC_PIN3_FUNMUX 1
-#define PORTC_PIN2_GPIO 0
-#define PORTC_PIN2_FUNMUX 1
+#define PORTC_PIN4_GPIO 0
+#define PORTC_PIN4_FUNMUX 1
+#define PORTC_PIN4_ADC1_IN3 3
-#define PORTC_PIN3_GPIO 0
-#define PORTC_PIN3_FUNMUX 1
+#define PORTC_PIN5_GPIO 0
+#define PORTC_PIN5_FUNMUX 1
+#define PORTC_PIN5_ADC1_IN2 3
-#define PORTC_PIN4_GPIO 0
-#define PORTC_PIN4_FUNMUX 1
-#define PORTC_PIN4_ADC1_IN3 3
+#define PORTC_PIN6_GPIO 0
+#define PORTC_PIN6_FUNMUX 1
+#define PORTC_PIN6_ADC1_IN1 3
-#define PORTC_PIN5_GPIO 0
-#define PORTC_PIN5_FUNMUX 1
-#define PORTC_PIN5_ADC1_IN2 3
+#define PORTC_PIN7_GPIO 0
+#define PORTC_PIN7_FUNMUX 1
+#define PORTC_PIN7_ADC1_IN0 3
-#define PORTC_PIN6_GPIO 0
-#define PORTC_PIN6_FUNMUX 1
-#define PORTC_PIN6_ADC1_IN1 3
+#define PORTM_PIN0_GPIO 0
+#define PORTM_PIN0_FUNMUX 1
+#define PORTM_PIN0_NORFL_D15 2
-#define PORTC_PIN7_GPIO 0
-#define PORTC_PIN7_FUNMUX 1
-#define PORTC_PIN7_ADC1_IN0 3
+#define PORTM_PIN1_GPIO 0
+#define PORTM_PIN1_FUNMUX 1
+#define PORTM_PIN1_NORFL_D14 2
+#define PORTM_PIN2_GPIO 0
+#define PORTM_PIN2_FUNMUX 1
+#define PORTM_PIN2_NORFL_D13 2
-#define PORTM_PIN0_GPIO 0
-#define PORTM_PIN0_FUNMUX 1
-#define PORTM_PIN0_NORFL_D15 2
+#define PORTM_PIN3_GPIO 0
+#define PORTM_PIN3_FUNMUX 1
+#define PORTM_PIN3_NORFL_D12 2
-#define PORTM_PIN1_GPIO 0
-#define PORTM_PIN1_FUNMUX 1
-#define PORTM_PIN1_NORFL_D14 2
+#define PORTM_PIN4_GPIO 0
+#define PORTM_PIN4_FUNMUX 1
+#define PORTM_PIN4_NORFL_D11 2
-#define PORTM_PIN2_GPIO 0
-#define PORTM_PIN2_FUNMUX 1
-#define PORTM_PIN2_NORFL_D13 2
+#define PORTM_PIN5_GPIO 0
+#define PORTM_PIN5_FUNMUX 1
+#define PORTM_PIN5_NORFL_D10 2
-#define PORTM_PIN3_GPIO 0
-#define PORTM_PIN3_FUNMUX 1
-#define PORTM_PIN3_NORFL_D12 2
+#define PORTM_PIN6_GPIO 0
+#define PORTM_PIN6_FUNMUX 1
+#define PORTM_PIN6_NORFL_D9 2
-#define PORTM_PIN4_GPIO 0
-#define PORTM_PIN4_FUNMUX 1
-#define PORTM_PIN4_NORFL_D11 2
+#define PORTM_PIN7_GPIO 0
+#define PORTM_PIN7_FUNMUX 1
+#define PORTM_PIN7_NORFL_D8 2
-#define PORTM_PIN5_GPIO 0
-#define PORTM_PIN5_FUNMUX 1
-#define PORTM_PIN5_NORFL_D10 2
+#define PORTM_PIN8_GPIO 0
+#define PORTM_PIN8_FUNMUX 1
+#define PORTM_PIN8_NORFL_D7 2
-#define PORTM_PIN6_GPIO 0
-#define PORTM_PIN6_FUNMUX 1
-#define PORTM_PIN6_NORFL_D9 2
+#define PORTM_PIN9_GPIO 0
+#define PORTM_PIN9_FUNMUX 1
+#define PORTM_PIN9_NORFL_D6 2
-#define PORTM_PIN7_GPIO 0
-#define PORTM_PIN7_FUNMUX 1
-#define PORTM_PIN7_NORFL_D8 2
+#define PORTM_PIN10_GPIO 0
+#define PORTM_PIN10_FUNMUX 1
+#define PORTM_PIN10_NORFL_D5 2
-#define PORTM_PIN8_GPIO 0
-#define PORTM_PIN8_FUNMUX 1
-#define PORTM_PIN8_NORFL_D7 2
+#define PORTM_PIN11_GPIO 0
+#define PORTM_PIN11_FUNMUX 1
+#define PORTM_PIN11_NORFL_D4 2
-#define PORTM_PIN9_GPIO 0
-#define PORTM_PIN9_FUNMUX 1
-#define PORTM_PIN9_NORFL_D6 2
+#define PORTM_PIN12_GPIO 0
+#define PORTM_PIN12_FUNMUX 1
+#define PORTM_PIN12_NORFL_D3 2
-#define PORTM_PIN10_GPIO 0
-#define PORTM_PIN10_FUNMUX 1
-#define PORTM_PIN10_NORFL_D5 2
+#define PORTM_PIN13_GPIO 0
+#define PORTM_PIN13_FUNMUX 1
+#define PORTM_PIN13_NORFL_D2 2
-#define PORTM_PIN11_GPIO 0
-#define PORTM_PIN11_FUNMUX 1
-#define PORTM_PIN11_NORFL_D4 2
+#define PORTM_PIN14_GPIO 0
+#define PORTM_PIN14_FUNMUX 1
+#define PORTM_PIN14_NORFL_D1 2
-#define PORTM_PIN12_GPIO 0
-#define PORTM_PIN12_FUNMUX 1
-#define PORTM_PIN12_NORFL_D3 2
+#define PORTM_PIN15_GPIO 0
+#define PORTM_PIN15_FUNMUX 1
+#define PORTM_PIN15_NORFL_D0 2
-#define PORTM_PIN13_GPIO 0
-#define PORTM_PIN13_FUNMUX 1
-#define PORTM_PIN13_NORFL_D2 2
+#define PORTM_PIN16_GPIO 0
+#define PORTM_PIN16_FUNMUX 1
+#define PORTM_PIN16_NORFL_OEN 2
-#define PORTM_PIN14_GPIO 0
-#define PORTM_PIN14_FUNMUX 1
-#define PORTM_PIN14_NORFL_D1 2
+#define PORTM_PIN17_GPIO 0
+#define PORTM_PIN17_FUNMUX 1
+#define PORTM_PIN17_NORFL_WEN 2
-#define PORTM_PIN15_GPIO 0
-#define PORTM_PIN15_FUNMUX 1
-#define PORTM_PIN15_NORFL_D0 2
+#define PORTM_PIN18_GPIO 0
+#define PORTM_PIN18_FUNMUX 1
+#define PORTM_PIN18_NORFL_CSN 2
-#define PORTM_PIN16_GPIO 0
-#define PORTM_PIN16_FUNMUX 1
-#define PORTM_PIN16_NORFL_OEN 2
+#define PORTM_PIN19_GPIO 0
+#define PORTM_PIN19_FUNMUX 1
+#define PORTM_PIN19_SDRAM_CSN 2
-#define PORTM_PIN17_GPIO 0
-#define PORTM_PIN17_FUNMUX 1
-#define PORTM_PIN17_NORFL_WEN 2
+#define PORTM_PIN20_GPIO 0
+#define PORTM_PIN20_FUNMUX 1
+#define PORTM_PIN20_SRAM_CSN 2
-#define PORTM_PIN18_GPIO 0
-#define PORTM_PIN18_FUNMUX 1
-#define PORTM_PIN18_NORFL_CSN 2
+#define PORTM_PIN21_GPIO 0
+#define PORTM_PIN21_FUNMUX 1
+#define PORTM_PIN21_SDRAM_CKE 2
-#define PORTM_PIN19_GPIO 0
-#define PORTM_PIN19_FUNMUX 1
-#define PORTM_PIN19_SDRAM_CSN 2
+#define PORTN_PIN0_GPIO 0
+#define PORTN_PIN0_FUNMUX 1
+#define PORTN_PIN0_LCD_D0 2
+#define PORTN_PIN0_ADC1_IN4 3
-#define PORTM_PIN20_GPIO 0
-#define PORTM_PIN20_FUNMUX 1
-#define PORTM_PIN20_SRAM_CSN 2
+#define PORTN_PIN1_GPIO 0
+#define PORTN_PIN1_FUNMUX 1
+#define PORTN_PIN1_LCD_D1 2
+#define PORTN_PIN1_ADC1_IN5 3
-#define PORTM_PIN21_GPIO 0
-#define PORTM_PIN21_FUNMUX 1
-#define PORTM_PIN21_SDRAM_CKE 2
+#define PORTN_PIN2_GPIO 0
+#define PORTN_PIN2_FUNMUX 1
+#define PORTN_PIN2_LCD_D2 2
+#define PORTN_PIN2_ADC1_IN6 3
+#define PORTN_PIN3_GPIO 0
+#define PORTN_PIN3_FUNMUX 1
+#define PORTN_PIN3_LCD_D3 2
-#define PORTN_PIN0_GPIO 0
-#define PORTN_PIN0_FUNMUX 1
-#define PORTN_PIN0_LCD_D0 2
-#define PORTN_PIN0_ADC1_IN4 3
+#define PORTN_PIN4_GPIO 0
+#define PORTN_PIN4_FUNMUX 1
+#define PORTN_PIN4_LCD_D4 2
-#define PORTN_PIN1_GPIO 0
-#define PORTN_PIN1_FUNMUX 1
-#define PORTN_PIN1_LCD_D1 2
-#define PORTN_PIN1_ADC1_IN5 3
+#define PORTN_PIN5_GPIO 0
+#define PORTN_PIN5_FUNMUX 1
+#define PORTN_PIN5_LCD_D5 2
-#define PORTN_PIN2_GPIO 0
-#define PORTN_PIN2_FUNMUX 1
-#define PORTN_PIN2_LCD_D2 2
-#define PORTN_PIN2_ADC1_IN6 3
+#define PORTN_PIN6_GPIO 0
+#define PORTN_PIN6_FUNMUX 1
+#define PORTN_PIN6_LCD_D6 2
-#define PORTN_PIN3_GPIO 0
-#define PORTN_PIN3_FUNMUX 1
-#define PORTN_PIN3_LCD_D3 2
+#define PORTN_PIN7_GPIO 0
+#define PORTN_PIN7_FUNMUX 1
+#define PORTN_PIN7_LCD_D7 2
-#define PORTN_PIN4_GPIO 0
-#define PORTN_PIN4_FUNMUX 1
-#define PORTN_PIN4_LCD_D4 2
+#define PORTN_PIN8_GPIO 0
+#define PORTN_PIN8_FUNMUX 1
+#define PORTN_PIN8_LCD_D8 2
-#define PORTN_PIN5_GPIO 0
-#define PORTN_PIN5_FUNMUX 1
-#define PORTN_PIN5_LCD_D5 2
+#define PORTN_PIN9_GPIO 0
+#define PORTN_PIN9_FUNMUX 1
+#define PORTN_PIN9_LCD_D9 2
-#define PORTN_PIN6_GPIO 0
-#define PORTN_PIN6_FUNMUX 1
-#define PORTN_PIN6_LCD_D6 2
+#define PORTN_PIN10_GPIO 0
+#define PORTN_PIN10_FUNMUX 1
+#define PORTN_PIN10_LCD_D10 2
-#define PORTN_PIN7_GPIO 0
-#define PORTN_PIN7_FUNMUX 1
-#define PORTN_PIN7_LCD_D7 2
+#define PORTN_PIN11_GPIO 0
+#define PORTN_PIN11_FUNMUX 1
+#define PORTN_PIN11_LCD_D11 2
-#define PORTN_PIN8_GPIO 0
-#define PORTN_PIN8_FUNMUX 1
-#define PORTN_PIN8_LCD_D8 2
+#define PORTN_PIN12_GPIO 0
+#define PORTN_PIN12_FUNMUX 1
+#define PORTN_PIN12_LCD_D12 2
-#define PORTN_PIN9_GPIO 0
-#define PORTN_PIN9_FUNMUX 1
-#define PORTN_PIN9_LCD_D9 2
+#define PORTN_PIN13_GPIO 0
+#define PORTN_PIN13_FUNMUX 1
+#define PORTN_PIN13_LCD_D13 2
-#define PORTN_PIN10_GPIO 0
-#define PORTN_PIN10_FUNMUX 1
-#define PORTN_PIN10_LCD_D10 2
+#define PORTN_PIN14_GPIO 0
+#define PORTN_PIN14_FUNMUX 1
+#define PORTN_PIN14_LCD_D14 2
-#define PORTN_PIN11_GPIO 0
-#define PORTN_PIN11_FUNMUX 1
-#define PORTN_PIN11_LCD_D11 2
+#define PORTN_PIN15_GPIO 0
+#define PORTN_PIN15_FUNMUX 1
+#define PORTN_PIN15_LCD_D15 2
-#define PORTN_PIN12_GPIO 0
-#define PORTN_PIN12_FUNMUX 1
-#define PORTN_PIN12_LCD_D12 2
+#define PORTN_PIN16_GPIO 0
+#define PORTN_PIN16_FUNMUX 1
+#define PORTN_PIN16_LCD_RD 2
+#define PORTN_PIN16_LCD_DOTCK 2
-#define PORTN_PIN13_GPIO 0
-#define PORTN_PIN13_FUNMUX 1
-#define PORTN_PIN13_LCD_D13 2
+#define PORTN_PIN17_GPIO 0
+#define PORTN_PIN17_FUNMUX 1
+#define PORTN_PIN17_LCD_CS 2
+#define PORTN_PIN17_LCD_VSYNC 2
-#define PORTN_PIN14_GPIO 0
-#define PORTN_PIN14_FUNMUX 1
-#define PORTN_PIN14_LCD_D14 2
+#define PORTN_PIN18_GPIO 0
+#define PORTN_PIN18_LCD_RS 2
+#define PORTN_PIN18_LCD_DATEN 2 //Data Enable
-#define PORTN_PIN15_GPIO 0
-#define PORTN_PIN15_FUNMUX 1
-#define PORTN_PIN15_LCD_D15 2
+#define PORTN_PIN19_GPIO 0
+#define PORTN_PIN19_LCD_WR 2
+#define PORTN_PIN19_LCD_HSYNC 2
-#define PORTN_PIN16_GPIO 0
-#define PORTN_PIN16_FUNMUX 1
-#define PORTN_PIN16_LCD_RD 2
-#define PORTN_PIN16_LCD_DOTCK 2
+#define PORTP_PIN0_GPIO 0
+#define PORTP_PIN0_FUNMUX 1
+#define PORTP_PIN0_NORFL_A0 2
-#define PORTN_PIN17_GPIO 0
-#define PORTN_PIN17_FUNMUX 1
-#define PORTN_PIN17_LCD_CS 2
-#define PORTN_PIN17_LCD_VSYNC 2
+#define PORTP_PIN1_GPIO 0
+#define PORTP_PIN1_FUNMUX 1
+#define PORTP_PIN1_NORFL_A1 2
-#define PORTN_PIN18_GPIO 0
-#define PORTN_PIN18_LCD_RS 2
-#define PORTN_PIN18_LCD_DATEN 2 //Data Enable
+#define PORTP_PIN2_GPIO 0
+#define PORTP_PIN2_FUNMUX 1
+#define PORTP_PIN2_NORFL_A2 2
+#define PORTP_PIN2_SD_D7 3
-#define PORTN_PIN19_GPIO 0
-#define PORTN_PIN19_LCD_WR 2
-#define PORTN_PIN19_LCD_HSYNC 2
+#define PORTP_PIN3_GPIO 0
+#define PORTP_PIN3_FUNMUX 1
+#define PORTP_PIN3_NORFL_A3 2
+#define PORTP_PIN3_SD_D6 3
+#define PORTP_PIN4_GPIO 0
+#define PORTP_PIN4_FUNMUX 1
+#define PORTP_PIN4_NORFL_A4 2
+#define PORTP_PIN4_SD_D5 3
-#define PORTP_PIN0_GPIO 0
-#define PORTP_PIN0_FUNMUX 1
-#define PORTP_PIN0_NORFL_A0 2
+#define PORTP_PIN5_GPIO 0
+#define PORTP_PIN5_FUNMUX 1
+#define PORTP_PIN5_NORFL_A5 2
+#define PORTP_PIN5_SD_D4 3
-#define PORTP_PIN1_GPIO 0
-#define PORTP_PIN1_FUNMUX 1
-#define PORTP_PIN1_NORFL_A1 2
+#define PORTP_PIN6_GPIO 0
+#define PORTP_PIN6_FUNMUX 1
+#define PORTP_PIN6_NORFL_A6 2
+#define PORTP_PIN6_SD_D3 3
-#define PORTP_PIN2_GPIO 0
-#define PORTP_PIN2_FUNMUX 1
-#define PORTP_PIN2_NORFL_A2 2
-#define PORTP_PIN2_SD_D7 3
+#define PORTP_PIN7_GPIO 0
+#define PORTP_PIN7_FUNMUX 1
+#define PORTP_PIN7_NORFL_A7 2
+#define PORTP_PIN7_SD_D2 3
-#define PORTP_PIN3_GPIO 0
-#define PORTP_PIN3_FUNMUX 1
-#define PORTP_PIN3_NORFL_A3 2
-#define PORTP_PIN3_SD_D6 3
+#define PORTP_PIN8_GPIO 0
+#define PORTP_PIN8_FUNMUX 1
+#define PORTP_PIN8_NORFL_A8 2
+#define PORTP_PIN8_SD_D1 3
-#define PORTP_PIN4_GPIO 0
-#define PORTP_PIN4_FUNMUX 1
-#define PORTP_PIN4_NORFL_A4 2
-#define PORTP_PIN4_SD_D5 3
+#define PORTP_PIN9_GPIO 0
+#define PORTP_PIN9_FUNMUX 1
+#define PORTP_PIN9_NORFL_A9 2
+#define PORTP_PIN9_SD_D0 3
-#define PORTP_PIN5_GPIO 0
-#define PORTP_PIN5_FUNMUX 1
-#define PORTP_PIN5_NORFL_A5 2
-#define PORTP_PIN5_SD_D4 3
+#define PORTP_PIN10_GPIO 0
+#define PORTP_PIN10_FUNMUX 1
+#define PORTP_PIN10_NORFL_A10 2
+#define PORTP_PIN10_SD_CMD 3
-#define PORTP_PIN6_GPIO 0
-#define PORTP_PIN6_FUNMUX 1
-#define PORTP_PIN6_NORFL_A6 2
-#define PORTP_PIN6_SD_D3 3
+#define PORTP_PIN11_GPIO 0
+#define PORTP_PIN11_FUNMUX 1
+#define PORTP_PIN11_NORFL_A11 2
+#define PORTP_PIN11_SD_CLK 3
-#define PORTP_PIN7_GPIO 0
-#define PORTP_PIN7_FUNMUX 1
-#define PORTP_PIN7_NORFL_A7 2
-#define PORTP_PIN7_SD_D2 3
+#define PORTP_PIN12_GPIO 0
+#define PORTP_PIN12_FUNMUX 1
+#define PORTP_PIN12_NORFL_A12 2
+#define PORTP_PIN12_SD_DETECT 3
-#define PORTP_PIN8_GPIO 0
-#define PORTP_PIN8_FUNMUX 1
-#define PORTP_PIN8_NORFL_A8 2
-#define PORTP_PIN8_SD_D1 3
+#define PORTP_PIN13_GPIO 0
+#define PORTP_PIN13_FUNMUX 1
+#define PORTP_PIN13_NORFL_A13 2
+#define PORTP_PIN13_SDRAM_CLK 2
-#define PORTP_PIN9_GPIO 0
-#define PORTP_PIN9_FUNMUX 1
-#define PORTP_PIN9_NORFL_A9 2
-#define PORTP_PIN9_SD_D0 3
+#define PORTP_PIN14_GPIO 0
+#define PORTP_PIN14_FUNMUX 1
+#define PORTP_PIN14_NORFL_A14 2
+#define PORTP_PIN14_SDRAM_CAS 2
-#define PORTP_PIN10_GPIO 0
-#define PORTP_PIN10_FUNMUX 1
-#define PORTP_PIN10_NORFL_A10 2
-#define PORTP_PIN10_SD_CMD 3
+#define PORTP_PIN15_GPIO 0
+#define PORTP_PIN15_FUNMUX 1
+#define PORTP_PIN15_NORFL_A15 2
+#define PORTP_PIN15_SDRAM_RAS 2
-#define PORTP_PIN11_GPIO 0
-#define PORTP_PIN11_FUNMUX 1
-#define PORTP_PIN11_NORFL_A11 2
-#define PORTP_PIN11_SD_CLK 3
+#define PORTP_PIN16_GPIO 0
+#define PORTP_PIN16_FUNMUX 1
+#define PORTP_PIN16_NORFL_A16 2
+#define PORTP_PIN16_SDRAM_LDQ 2
-#define PORTP_PIN12_GPIO 0
-#define PORTP_PIN12_FUNMUX 1
-#define PORTP_PIN12_NORFL_A12 2
-#define PORTP_PIN12_SD_DETECT 3
+#define PORTP_PIN17_GPIO 0
+#define PORTP_PIN17_FUNMUX 1
+#define PORTP_PIN17_NORFL_A17 2
+#define PORTP_PIN17_SDRAM_UDQ 2
-#define PORTP_PIN13_GPIO 0
-#define PORTP_PIN13_FUNMUX 1
-#define PORTP_PIN13_NORFL_A13 2
-#define PORTP_PIN13_SDRAM_CLK 2
+#define PORTP_PIN18_GPIO 0
+#define PORTP_PIN18_FUNMUX 1
+#define PORTP_PIN18_NORFL_A18 2
-#define PORTP_PIN14_GPIO 0
-#define PORTP_PIN14_FUNMUX 1
-#define PORTP_PIN14_NORFL_A14 2
-#define PORTP_PIN14_SDRAM_CAS 2
+#define PORTP_PIN19_GPIO 0
+#define PORTP_PIN19_FUNMUX 1
+#define PORTP_PIN19_NORFL_A19 2
-#define PORTP_PIN15_GPIO 0
-#define PORTP_PIN15_FUNMUX 1
-#define PORTP_PIN15_NORFL_A15 2
-#define PORTP_PIN15_SDRAM_RAS 2
+#define PORTP_PIN20_GPIO 0
+#define PORTP_PIN20_FUNMUX 1
+#define PORTP_PIN20_NORFL_A20 2
+#define PORTP_PIN20_SDRAM_BA0 2
-#define PORTP_PIN16_GPIO 0
-#define PORTP_PIN16_FUNMUX 1
-#define PORTP_PIN16_NORFL_A16 2
-#define PORTP_PIN16_SDRAM_LDQ 2
+#define PORTP_PIN21_GPIO 0
+#define PORTP_PIN21_FUNMUX 1
+#define PORTP_PIN21_NORFL_A21 2
+#define PORTP_PIN21_SDRAM_BA1 2
-#define PORTP_PIN17_GPIO 0
-#define PORTP_PIN17_FUNMUX 1
-#define PORTP_PIN17_NORFL_A17 2
-#define PORTP_PIN17_SDRAM_UDQ 2
+#define PORTP_PIN22_GPIO 0
+#define PORTP_PIN22_FUNMUX 1
+#define PORTP_PIN22_NORFL_A22 2
-#define PORTP_PIN18_GPIO 0
-#define PORTP_PIN18_FUNMUX 1
-#define PORTP_PIN18_NORFL_A18 2
+#define PORTP_PIN23_GPIO 0
+#define PORTP_PIN23_FUNMUX 1
+#define PORTP_PIN23_NORFL_A23 2
-#define PORTP_PIN19_GPIO 0
-#define PORTP_PIN19_FUNMUX 1
-#define PORTP_PIN19_NORFL_A19 2
-
-#define PORTP_PIN20_GPIO 0
-#define PORTP_PIN20_FUNMUX 1
-#define PORTP_PIN20_NORFL_A20 2
-#define PORTP_PIN20_SDRAM_BA0 2
-
-#define PORTP_PIN21_GPIO 0
-#define PORTP_PIN21_FUNMUX 1
-#define PORTP_PIN21_NORFL_A21 2
-#define PORTP_PIN21_SDRAM_BA1 2
-
-#define PORTP_PIN22_GPIO 0
-#define PORTP_PIN22_FUNMUX 1
-#define PORTP_PIN22_NORFL_A22 2
-
-#define PORTP_PIN23_GPIO 0
-#define PORTP_PIN23_FUNMUX 1
-#define PORTP_PIN23_NORFL_A23 2
-
-
-
-/* ����궨���ȡֵȫ������ȷֵ�Ļ����ϡ���100��������������궨���ֵ���Ӷ�����⺯���ı�д*/
-/* ������Щֵ��ż��������ŵĹ���ȡֵ����PIN0��PIN2��... */
-#define FUNMUX0_UART0_RXD 100
-#define FUNMUX0_UART1_RXD 101
-#define FUNMUX0_UART2_RXD 102
-#define FUNMUX0_UART3_RXD 103
-#define FUNMUX0_I2C0_SCL 105
-#define FUNMUX0_I2C1_SCL 106
-#define FUNMUX0_PWM0A_OUT 107
-#define FUNMUX0_PWM2A_OUT 108
-#define FUNMUX0_PWM4A_OUT 109
-#define FUNMUX0_PWM0B_OUT 110
-#define FUNMUX0_PWM2B_OUT 111
-#define FUNMUX0_PWM4B_OUT 112
-#define FUNMUX0_PWM_BREAK 113
-#define FUNMUX0_TIMR0_IN 114
-#define FUNMUX0_TIMR2_IN 115
-#define FUNMUX0_CAN_RX 116
-#define FUNMUX0_SPI0_SSEL 117
-#define FUNMUX0_SPI0_MOSI 118
-#define FUNMUX0_SPI1_SSEL 119
-#define FUNMUX0_SPI1_MOSI 120
-#define FUNMUX0_UART0_CTS 121
-#define FUNMUX0_UART1_CTS 122
-#define FUNMUX0_UART2_CTS 123
-#define FUNMUX0_UART3_CTS 124
-
-/* ������Щֵ������������ŵĹ���ȡֵ����PIN1��PIN3��... */
-#define FUNMUX1_UART0_TXD 100
-#define FUNMUX1_UART1_TXD 101
-#define FUNMUX1_UART2_TXD 102
-#define FUNMUX1_UART3_TXD 103
-#define FUNMUX1_I2C0_SDA 105
-#define FUNMUX1_I2C1_SDA 106
-#define FUNMUX1_PWM1A_OUT 107
-#define FUNMUX1_PWM3A_OUT 108
-#define FUNMUX1_PWM5A_OUT 109
-#define FUNMUX1_PWM1B_OUT 110
-#define FUNMUX1_PWM3B_OUT 111
-#define FUNMUX1_PWM5B_OUT 112
-#define FUNMUX1_PULSE_IN 113
-#define FUNMUX1_TIMR1_IN 114
-#define FUNMUX1_TIMR3_IN 115
-#define FUNMUX1_CAN_TX 116
-#define FUNMUX1_SPI0_SCLK 117
-#define FUNMUX1_SPI0_MISO 118
-#define FUNMUX1_SPI1_SCLK 119
-#define FUNMUX1_SPI1_MISO 120
-#define FUNMUX1_UART0_RTS 121
-#define FUNMUX1_UART1_RTS 122
-#define FUNMUX1_UART2_RTS 123
-#define FUNMUX1_UART3_RTS 124
+/* 下面宏定义的取值全部在正确值的基础上“加100”,以区分上面宏定义的值,从而方便库函数的编写*/
+/* 下面这些值是偶数编号引脚的功能取值,如PIN0、PIN2、... */
+#define FUNMUX0_UART0_RXD 100
+#define FUNMUX0_UART1_RXD 101
+#define FUNMUX0_UART2_RXD 102
+#define FUNMUX0_UART3_RXD 103
+#define FUNMUX0_I2C0_SCL 105
+#define FUNMUX0_I2C1_SCL 106
+#define FUNMUX0_PWM0A_OUT 107
+#define FUNMUX0_PWM2A_OUT 108
+#define FUNMUX0_PWM4A_OUT 109
+#define FUNMUX0_PWM0B_OUT 110
+#define FUNMUX0_PWM2B_OUT 111
+#define FUNMUX0_PWM4B_OUT 112
+#define FUNMUX0_PWM_BREAK 113
+#define FUNMUX0_TIMR0_IN 114
+#define FUNMUX0_TIMR2_IN 115
+#define FUNMUX0_CAN_RX 116
+#define FUNMUX0_SPI0_SSEL 117
+#define FUNMUX0_SPI0_MOSI 118
+#define FUNMUX0_SPI1_SSEL 119
+#define FUNMUX0_SPI1_MOSI 120
+#define FUNMUX0_UART0_CTS 121
+#define FUNMUX0_UART1_CTS 122
+#define FUNMUX0_UART2_CTS 123
+#define FUNMUX0_UART3_CTS 124
+/* 下面这些值是奇数编号引脚的功能取值,如PIN1、PIN3、... */
+#define FUNMUX1_UART0_TXD 100
+#define FUNMUX1_UART1_TXD 101
+#define FUNMUX1_UART2_TXD 102
+#define FUNMUX1_UART3_TXD 103
+#define FUNMUX1_I2C0_SDA 105
+#define FUNMUX1_I2C1_SDA 106
+#define FUNMUX1_PWM1A_OUT 107
+#define FUNMUX1_PWM3A_OUT 108
+#define FUNMUX1_PWM5A_OUT 109
+#define FUNMUX1_PWM1B_OUT 110
+#define FUNMUX1_PWM3B_OUT 111
+#define FUNMUX1_PWM5B_OUT 112
+#define FUNMUX1_PULSE_IN 113
+#define FUNMUX1_TIMR1_IN 114
+#define FUNMUX1_TIMR3_IN 115
+#define FUNMUX1_CAN_TX 116
+#define FUNMUX1_SPI0_SCLK 117
+#define FUNMUX1_SPI0_MISO 118
+#define FUNMUX1_SPI1_SCLK 119
+#define FUNMUX1_SPI1_MISO 120
+#define FUNMUX1_UART0_RTS 121
+#define FUNMUX1_UART1_RTS 122
+#define FUNMUX1_UART2_RTS 123
+#define FUNMUX1_UART3_RTS 124
#endif //__SWM320_PORT_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.c
index e74334fc93..45152822e8 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_pwm.c
-* ����˵��: SWM320��Ƭ����PWM����������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_pwm.c
+* 功能说明: SWM320单片机的PWM功能驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,631 +21,724 @@
#include "SWM320.h"
#include "SWM320_pwm.h"
-
/******************************************************************************************************************************************
-* ��������: PWM_Init()
-* ����˵��: PWM��ʼ��
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* PWM_InitStructure * initStruct ����PWM����趨ֵ�Ľṹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: PWM_Init()
+* 功能说明: PWM初始化
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* PWM_InitStructure * initStruct 包含PWM相关设定值的结构体
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct)
+void PWM_Init(PWM_TypeDef *PWMx, PWM_InitStructure *initStruct)
{
- uint32_t bit_offset = 0;
-
- SYS->CLKEN |= (0x01 << SYS_CLKEN_PWM_Pos);
-
- SYS->CLKDIV &= ~SYS_CLKDIV_PWM_Msk;
- SYS->CLKDIV |= (initStruct->clk_div << SYS_CLKDIV_PWM_Pos);
-
- PWM_Stop(PWMx, 1, 1); //һЩ�ؼ��Ĵ���ֻ����PWMֹͣʱ����
-
- PWMx->MODE = initStruct->mode;
-
- PWMx->PERA = initStruct->cycleA;
- PWMx->HIGHA = initStruct->hdutyA;
- PWMx->DZA = initStruct->deadzoneA;
-
- PWMx->PERB = initStruct->cycleB;
- PWMx->HIGHB = initStruct->hdutyB;
- PWMx->DZB = initStruct->deadzoneB;
-
- PWMx->INIOUT &= ~(PWM_INIOUT_PWMA_Msk | PWM_INIOUT_PWMB_Msk);
- PWMx->INIOUT |= (initStruct->initLevelA << PWM_INIOUT_PWMA_Pos) |
- (initStruct->initLevelB << PWM_INIOUT_PWMB_Pos);
-
- PWMG->IM = 0x00000000;
-
- switch((uint32_t)PWMx)
- {
- case((uint32_t)PWM0):
- bit_offset = 0;
- break;
+ uint32_t bit_offset = 0;
+
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_PWM_Pos);
+
+ SYS->CLKDIV &= ~SYS_CLKDIV_PWM_Msk;
+ SYS->CLKDIV |= (initStruct->clk_div << SYS_CLKDIV_PWM_Pos);
+
+ PWM_Stop(PWMx, 1, 1); //一些关键寄存器只能在PWM停止时设置
+
+ PWMx->MODE = initStruct->mode;
+
+ PWMx->PERA = initStruct->cycleA;
+ PWMx->HIGHA = initStruct->hdutyA;
+ PWMx->DZA = initStruct->deadzoneA;
+
+ PWMx->PERB = initStruct->cycleB;
+ PWMx->HIGHB = initStruct->hdutyB;
+ PWMx->DZB = initStruct->deadzoneB;
+
+ PWMx->INIOUT &= ~(PWM_INIOUT_PWMA_Msk | PWM_INIOUT_PWMB_Msk);
+ PWMx->INIOUT |= (initStruct->initLevelA << PWM_INIOUT_PWMA_Pos) |
+ (initStruct->initLevelB << PWM_INIOUT_PWMB_Pos);
+
+ PWMG->IM = 0x00000000;
- case((uint32_t)PWM1):
- bit_offset = 2;
- break;
+ switch ((uint32_t)PWMx)
+ {
+ case ((uint32_t)PWM0):
+ bit_offset = 0;
+ break;
- case((uint32_t)PWM2):
- bit_offset = 4;
- break;
-
- case((uint32_t)PWM3):
- bit_offset = 6;
- break;
-
- case((uint32_t)PWM4):
- bit_offset = 8;
- break;
-
- case((uint32_t)PWM5):
- bit_offset = 10;
- break;
- }
-
- PWMG->IRS = ((0x01 << bit_offset) | (0x01 << (bit_offset+1)) | (0x01 << (bit_offset+12)) | (0x01 << (bit_offset+13))); //����жϱ�־
- PWMG->IE &= ~((0x01 << bit_offset) | (0x01 << (bit_offset+1)) | (0x01 << (bit_offset+12)) | (0x01 << (bit_offset+13)));
- PWMG->IE |= (initStruct->NCycleAIEn << bit_offset) | (initStruct->NCycleBIEn << (bit_offset+1)) |
- (initStruct->HEndAIEn << (bit_offset+12)) | (initStruct->HEndBIEn << (bit_offset+13));
-
- if(initStruct->NCycleAIEn | initStruct->NCycleBIEn | initStruct->HEndAIEn | initStruct->HEndBIEn)
- {
- NVIC_EnableIRQ(PWM_IRQn);
- }
- else if((PWMG->IE & (~((0x01 << bit_offset) | (0x01 << (bit_offset+1)) | (0x01 << (bit_offset+12)) | (0x01 << (bit_offset+13))))) == 0)
- {
- NVIC_DisableIRQ(PWM_IRQn);
- }
+ case ((uint32_t)PWM1):
+ bit_offset = 2;
+ break;
+
+ case ((uint32_t)PWM2):
+ bit_offset = 4;
+ break;
+
+ case ((uint32_t)PWM3):
+ bit_offset = 6;
+ break;
+
+ case ((uint32_t)PWM4):
+ bit_offset = 8;
+ break;
+
+ case ((uint32_t)PWM5):
+ bit_offset = 10;
+ break;
+ }
+
+ PWMG->IRS = ((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13))); //清除中断标志
+ PWMG->IE &= ~((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13)));
+ PWMG->IE |= (initStruct->NCycleAIEn << bit_offset) | (initStruct->NCycleBIEn << (bit_offset + 1)) |
+ (initStruct->HEndAIEn << (bit_offset + 12)) | (initStruct->HEndBIEn << (bit_offset + 13));
+
+ if (initStruct->NCycleAIEn | initStruct->NCycleBIEn | initStruct->HEndAIEn | initStruct->HEndBIEn)
+ {
+ NVIC_EnableIRQ(PWM_IRQn);
+ }
+ else if ((PWMG->IE & (~((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13))))) == 0)
+ {
+ NVIC_DisableIRQ(PWM_IRQn);
+ }
}
/******************************************************************************************************************************************
-* ��������: PWM_Start()
-* ����˵��: ����PWM����ʼPWM���
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chA 0 ͨ��A������ 1 ͨ��A����
-* uint32_t chB 0 ͨ��B������ 1 ͨ��B����
-* �� ��: ��
-* ע������: ��
+* 函数名称: PWM_Start()
+* 功能说明: 启动PWM,开始PWM输出
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chA 0 通道A不启动 1 通道A启动
+* uint32_t chB 0 通道B不启动 1 通道B启动
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void PWM_Start(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB)
+void PWM_Start(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
{
- switch((uint32_t)PWMx)
- {
- case((uint32_t)PWM0):
- PWMG->CHEN |= (chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos);
- break;
+ switch ((uint32_t)PWMx)
+ {
+ case ((uint32_t)PWM0):
+ PWMG->CHEN |= (chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos);
+ break;
+
+ case ((uint32_t)PWM1):
+ PWMG->CHEN |= (chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos);
+ break;
+
+ case ((uint32_t)PWM2):
+ PWMG->CHEN |= (chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos);
+ break;
+
+ case ((uint32_t)PWM3):
+ PWMG->CHEN |= (chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos);
+ break;
- case((uint32_t)PWM1):
- PWMG->CHEN |= (chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos);
- break;
+ case ((uint32_t)PWM4):
+ PWMG->CHEN |= (chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos);
+ break;
- case((uint32_t)PWM2):
- PWMG->CHEN |= (chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos);
- break;
-
- case((uint32_t)PWM3):
- PWMG->CHEN |= (chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos);
- break;
-
- case((uint32_t)PWM4):
- PWMG->CHEN |= (chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos);
- break;
-
- case((uint32_t)PWM5):
- PWMG->CHEN |= (chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos);
- break;
- }
+ case ((uint32_t)PWM5):
+ PWMG->CHEN |= (chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: PWM_Stop()
-* ����˵��: �ر�PWM��ֹͣPWM���
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chA 0 ͨ��A���ر� 1 ͨ��A�ر�
-* uint32_t chB 0 ͨ��B���ر� 1 ͨ��B�ر�
-* �� ��: ��
-* ע������: ��
+* 函数名称: PWM_Stop()
+* 功能说明: 关闭PWM,停止PWM输出
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chA 0 通道A不关闭 1 通道A关闭
+* uint32_t chB 0 通道B不关闭 1 通道B关闭
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void PWM_Stop(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB)
+void PWM_Stop(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
{
- switch((uint32_t)PWMx)
- {
- case((uint32_t)PWM0):
- PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos));
- break;
+ switch ((uint32_t)PWMx)
+ {
+ case ((uint32_t)PWM0):
+ PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos));
+ break;
- case((uint32_t)PWM1):
- PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos));
- break;
+ case ((uint32_t)PWM1):
+ PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos));
+ break;
- case((uint32_t)PWM2):
- PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos));
- break;
-
- case((uint32_t)PWM3):
- PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos));
- break;
-
- case((uint32_t)PWM4):
- PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos));
- break;
-
- case((uint32_t)PWM5):
- PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos));
- break;
- }
+ case ((uint32_t)PWM2):
+ PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos));
+ break;
+
+ case ((uint32_t)PWM3):
+ PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos));
+ break;
+
+ case ((uint32_t)PWM4):
+ PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos));
+ break;
+
+ case ((uint32_t)PWM5):
+ PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos));
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: PWM_SetCycle()
-* ����˵��: ��������
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ�����ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* uint16_t cycle Ҫ�趨������ֵ
-* �� ��: ��
-* ע������: ��
+* 函数名称: PWM_SetCycle()
+* 功能说明: 设置周期
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* uint16_t cycle 要设定的周期值
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void PWM_SetCycle(PWM_TypeDef * PWMx, uint32_t chn, uint16_t cycle)
+void PWM_SetCycle(PWM_TypeDef *PWMx, uint32_t chn, uint16_t cycle)
{
- if(chn == PWM_CH_A)
- PWMx->PERA = cycle;
- else if(chn == PWM_CH_B)
- PWMx->PERB = cycle;
+ if (chn == PWM_CH_A)
+ PWMx->PERA = cycle;
+ else if (chn == PWM_CH_B)
+ PWMx->PERB = cycle;
}
/******************************************************************************************************************************************
-* ��������: PWM_GetCycle()
-* ����˵��: ��ȡ����
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ��ѯ�ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* �� ��: uint16_t ��ȡ��������ֵ
-* ע������: ��
+* 函数名称: PWM_GetCycle()
+* 功能说明: 获取周期
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* 输 出: uint16_t 获取到的周期值
+* 注意事项: 无
******************************************************************************************************************************************/
-uint16_t PWM_GetCycle(PWM_TypeDef * PWMx, uint32_t chn)
+uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn)
{
- uint16_t cycle = 0;
-
- if(chn == PWM_CH_A)
- cycle = PWMx->PERA;
- else if(chn == PWM_CH_B)
- cycle = PWMx->PERB;
-
- return cycle;
+ uint16_t cycle = 0;
+
+ if (chn == PWM_CH_A)
+ cycle = PWMx->PERA;
+ else if (chn == PWM_CH_B)
+ cycle = PWMx->PERB;
+
+ return cycle;
}
/******************************************************************************************************************************************
-* ��������: PWM_SetHDuty()
-* ����˵��: ���øߵ�ƽʱ��
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ�����ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* uint16_t hduty Ҫ�趨�ĸߵ�ƽʱ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: PWM_SetHDuty()
+* 功能说明: 设置高电平时长
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* uint16_t hduty 要设定的高电平时长
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty)
+void PWM_SetHDuty(PWM_TypeDef *PWMx, uint32_t chn, uint16_t hduty)
{
- if(chn == PWM_CH_A)
- PWMx->HIGHA = hduty;
- else if(chn == PWM_CH_B)
- PWMx->HIGHB = hduty;
+ if (chn == PWM_CH_A)
+ PWMx->HIGHA = hduty;
+ else if (chn == PWM_CH_B)
+ PWMx->HIGHB = hduty;
}
/******************************************************************************************************************************************
-* ��������: PWM_GetHDuty()
-* ����˵��: ��ȡ�ߵ�ƽʱ��
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ��ѯ�ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* �� ��: uint16_t ��ȡ���ĸߵ�ƽʱ��
-* ע������: ��
+* 函数名称: PWM_GetHDuty()
+* 功能说明: 获取高电平时长
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* 输 出: uint16_t 获取到的高电平时长
+* 注意事项: 无
******************************************************************************************************************************************/
-uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn)
+uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn)
{
- uint16_t hduty = 0;
-
- if(chn == PWM_CH_A)
- hduty = PWMx->HIGHA;
- else if(chn == PWM_CH_B)
- hduty = PWMx->HIGHB;
-
- return hduty;
+ uint16_t hduty = 0;
+
+ if (chn == PWM_CH_A)
+ hduty = PWMx->HIGHA;
+ else if (chn == PWM_CH_B)
+ hduty = PWMx->HIGHB;
+
+ return hduty;
}
/******************************************************************************************************************************************
-* ��������: PWM_SetDeadzone()
-* ����˵��: ��������ʱ��
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ�����ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* uint8_t deadzone Ҫ�趨������ʱ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: PWM_SetDeadzone()
+* 功能说明: 设置死区时长
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* uint8_t deadzone 要设定的死区时长
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint8_t deadzone)
+void PWM_SetDeadzone(PWM_TypeDef *PWMx, uint32_t chn, uint8_t deadzone)
{
- if(chn == PWM_CH_A)
- PWMx->DZA = deadzone;
- else if(chn == PWM_CH_B)
- PWMx->DZB = deadzone;
+ if (chn == PWM_CH_A)
+ PWMx->DZA = deadzone;
+ else if (chn == PWM_CH_B)
+ PWMx->DZB = deadzone;
}
/******************************************************************************************************************************************
-* ��������: PWM_GetDeadzone()
-* ����˵��: ��ȡ����ʱ��
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ��ѯ�ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* �� ��: uint8_t ��ȡ��������ʱ��
-* ע������: ��
+* 函数名称: PWM_GetDeadzone()
+* 功能说明: 获取死区时长
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* 输 出: uint8_t 获取到的死区时长
+* 注意事项: 无
******************************************************************************************************************************************/
-uint8_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn)
+uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn)
{
- uint8_t deadzone = 0;
-
- if(chn == PWM_CH_A)
- deadzone = PWMx->DZA;
- else if(chn == PWM_CH_B)
- deadzone = PWMx->DZB;
-
- return deadzone;
-}
+ uint8_t deadzone = 0;
+ if (chn == PWM_CH_A)
+ deadzone = PWMx->DZA;
+ else if (chn == PWM_CH_B)
+ deadzone = PWMx->DZB;
+
+ return deadzone;
+}
/******************************************************************************************************************************************
-* ��������: PWM_IntNCycleEn()
-* ����˵��: �����ڿ�ʼ�ж�ʹ��
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ�����ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* �� ��: ��
-* ע������: ��
+* 函数名称: PWM_IntNCycleEn()
+* 功能说明: 新周期开始中断使能
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void PWM_IntNCycleEn(PWM_TypeDef * PWMx, uint32_t chn)
+void PWM_IntNCycleEn(PWM_TypeDef *PWMx, uint32_t chn)
{
- switch((uint32_t)PWMx)
- {
- case((uint32_t)PWM0):
- if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP0A_Pos);
- else PWMG->IE |= (0x01 << PWMG_IE_NEWP0B_Pos);
- break;
-
- case((uint32_t)PWM1):
- if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP1A_Pos);
- else PWMG->IE |= (0x01 << PWMG_IE_NEWP1B_Pos);
- break;
-
- case((uint32_t)PWM2):
- if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP2A_Pos);
- else PWMG->IE |= (0x01 << PWMG_IE_NEWP2B_Pos);
- break;
-
- case((uint32_t)PWM3):
- if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP3A_Pos);
- else PWMG->IE |= (0x01 << PWMG_IE_NEWP3B_Pos);
- break;
-
- case((uint32_t)PWM4):
- if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP4A_Pos);
- else PWMG->IE |= (0x01 << PWMG_IE_NEWP4B_Pos);
- break;
-
- case((uint32_t)PWM5):
- if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP5A_Pos);
- else PWMG->IE |= (0x01 << PWMG_IE_NEWP5B_Pos);
- break;
- }
+ switch ((uint32_t)PWMx)
+ {
+ case ((uint32_t)PWM0):
+ if (chn == PWM_CH_A)
+ PWMG->IE |= (0x01 << PWMG_IE_NEWP0A_Pos);
+ else
+ PWMG->IE |= (0x01 << PWMG_IE_NEWP0B_Pos);
+ break;
+
+ case ((uint32_t)PWM1):
+ if (chn == PWM_CH_A)
+ PWMG->IE |= (0x01 << PWMG_IE_NEWP1A_Pos);
+ else
+ PWMG->IE |= (0x01 << PWMG_IE_NEWP1B_Pos);
+ break;
+
+ case ((uint32_t)PWM2):
+ if (chn == PWM_CH_A)
+ PWMG->IE |= (0x01 << PWMG_IE_NEWP2A_Pos);
+ else
+ PWMG->IE |= (0x01 << PWMG_IE_NEWP2B_Pos);
+ break;
+
+ case ((uint32_t)PWM3):
+ if (chn == PWM_CH_A)
+ PWMG->IE |= (0x01 << PWMG_IE_NEWP3A_Pos);
+ else
+ PWMG->IE |= (0x01 << PWMG_IE_NEWP3B_Pos);
+ break;
+
+ case ((uint32_t)PWM4):
+ if (chn == PWM_CH_A)
+ PWMG->IE |= (0x01 << PWMG_IE_NEWP4A_Pos);
+ else
+ PWMG->IE |= (0x01 << PWMG_IE_NEWP4B_Pos);
+ break;
+
+ case ((uint32_t)PWM5):
+ if (chn == PWM_CH_A)
+ PWMG->IE |= (0x01 << PWMG_IE_NEWP5A_Pos);
+ else
+ PWMG->IE |= (0x01 << PWMG_IE_NEWP5B_Pos);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: PWM_IntNCycleDis()
-* ����˵��: �����ڿ�ʼ�жϽ���
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ�����ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* �� ��: ��
-* ע������: ��
+* 函数名称: PWM_IntNCycleDis()
+* 功能说明: 新周期开始中断禁能
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void PWM_IntNCycleDis(PWM_TypeDef * PWMx, uint32_t chn)
+void PWM_IntNCycleDis(PWM_TypeDef *PWMx, uint32_t chn)
{
- switch((uint32_t)PWMx)
- {
- case((uint32_t)PWM0):
- if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0A_Pos);
- else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0B_Pos);
- break;
-
- case((uint32_t)PWM1):
- if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1A_Pos);
- else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1B_Pos);
- break;
-
- case((uint32_t)PWM2):
- if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2A_Pos);
- else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2B_Pos);
- break;
-
- case((uint32_t)PWM3):
- if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3A_Pos);
- else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3B_Pos);
- break;
-
- case((uint32_t)PWM4):
- if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4A_Pos);
- else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4B_Pos);
- break;
-
- case((uint32_t)PWM5):
- if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5A_Pos);
- else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5B_Pos);
- break;
- }
+ switch ((uint32_t)PWMx)
+ {
+ case ((uint32_t)PWM0):
+ if (chn == PWM_CH_A)
+ PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0A_Pos);
+ else
+ PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0B_Pos);
+ break;
+
+ case ((uint32_t)PWM1):
+ if (chn == PWM_CH_A)
+ PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1A_Pos);
+ else
+ PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1B_Pos);
+ break;
+
+ case ((uint32_t)PWM2):
+ if (chn == PWM_CH_A)
+ PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2A_Pos);
+ else
+ PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2B_Pos);
+ break;
+
+ case ((uint32_t)PWM3):
+ if (chn == PWM_CH_A)
+ PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3A_Pos);
+ else
+ PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3B_Pos);
+ break;
+
+ case ((uint32_t)PWM4):
+ if (chn == PWM_CH_A)
+ PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4A_Pos);
+ else
+ PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4B_Pos);
+ break;
+
+ case ((uint32_t)PWM5):
+ if (chn == PWM_CH_A)
+ PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5A_Pos);
+ else
+ PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5B_Pos);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: PWM_IntNCycleClr()
-* ����˵��: �����ڿ�ʼ�жϱ�־���
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ�����ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* �� ��: ��
-* ע������: ��
+* 函数名称: PWM_IntNCycleClr()
+* 功能说明: 新周期开始中断标志清除
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void PWM_IntNCycleClr(PWM_TypeDef * PWMx, uint32_t chn)
+void PWM_IntNCycleClr(PWM_TypeDef *PWMx, uint32_t chn)
{
- switch((uint32_t)PWMx)
- {
- case((uint32_t)PWM0):
- if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP0A_Pos);
- else PWMG->IRS = (0x01 << PWMG_IRS_NEWP0B_Pos);
- break;
-
- case((uint32_t)PWM1):
- if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP1A_Pos);
- else PWMG->IRS = (0x01 << PWMG_IRS_NEWP1B_Pos);
- break;
-
- case((uint32_t)PWM2):
- if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP2A_Pos);
- else PWMG->IRS = (0x01 << PWMG_IRS_NEWP2B_Pos);
- break;
-
- case((uint32_t)PWM3):
- if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP3A_Pos);
- else PWMG->IRS = (0x01 << PWMG_IRS_NEWP3B_Pos);
- break;
-
- case((uint32_t)PWM4):
- if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP4A_Pos);
- else PWMG->IRS = (0x01 << PWMG_IRS_NEWP4B_Pos);
- break;
-
- case((uint32_t)PWM5):
- if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP5A_Pos);
- else PWMG->IRS = (0x01 << PWMG_IRS_NEWP5B_Pos);
- break;
- }
+ switch ((uint32_t)PWMx)
+ {
+ case ((uint32_t)PWM0):
+ if (chn == PWM_CH_A)
+ PWMG->IRS = (0x01 << PWMG_IRS_NEWP0A_Pos);
+ else
+ PWMG->IRS = (0x01 << PWMG_IRS_NEWP0B_Pos);
+ break;
+
+ case ((uint32_t)PWM1):
+ if (chn == PWM_CH_A)
+ PWMG->IRS = (0x01 << PWMG_IRS_NEWP1A_Pos);
+ else
+ PWMG->IRS = (0x01 << PWMG_IRS_NEWP1B_Pos);
+ break;
+
+ case ((uint32_t)PWM2):
+ if (chn == PWM_CH_A)
+ PWMG->IRS = (0x01 << PWMG_IRS_NEWP2A_Pos);
+ else
+ PWMG->IRS = (0x01 << PWMG_IRS_NEWP2B_Pos);
+ break;
+
+ case ((uint32_t)PWM3):
+ if (chn == PWM_CH_A)
+ PWMG->IRS = (0x01 << PWMG_IRS_NEWP3A_Pos);
+ else
+ PWMG->IRS = (0x01 << PWMG_IRS_NEWP3B_Pos);
+ break;
+
+ case ((uint32_t)PWM4):
+ if (chn == PWM_CH_A)
+ PWMG->IRS = (0x01 << PWMG_IRS_NEWP4A_Pos);
+ else
+ PWMG->IRS = (0x01 << PWMG_IRS_NEWP4B_Pos);
+ break;
+
+ case ((uint32_t)PWM5):
+ if (chn == PWM_CH_A)
+ PWMG->IRS = (0x01 << PWMG_IRS_NEWP5A_Pos);
+ else
+ PWMG->IRS = (0x01 << PWMG_IRS_NEWP5B_Pos);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: PWM_IntNCycleStat()
-* ����˵��: �����ڿ�ʼ�ж��Ƿ���
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ�����ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* �� ��: uint32_t 1 �����ڿ�ʼ�ж��ѷ��� 0 �����ڿ�ʼ�ж�δ����
-* ע������: ��
+* 函数名称: PWM_IntNCycleStat()
+* 功能说明: 新周期开始中断是否发生
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* 输 出: uint32_t 1 新周期开始中断已发生 0 新周期开始中断未发生
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t PWM_IntNCycleStat(PWM_TypeDef * PWMx, uint32_t chn)
+uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn)
{
- uint32_t int_stat = 0;
-
- switch((uint32_t)PWMx)
- {
- case((uint32_t)PWM0):
- if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP0A_Msk);
- else int_stat = (PWMG->IF & PWMG_IF_NEWP0B_Msk);
- break;
+ uint32_t int_stat = 0;
- case((uint32_t)PWM1):
- if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP1A_Msk);
- else int_stat = (PWMG->IF & PWMG_IF_NEWP1B_Msk);
- break;
+ switch ((uint32_t)PWMx)
+ {
+ case ((uint32_t)PWM0):
+ if (chn == PWM_CH_A)
+ int_stat = (PWMG->IF & PWMG_IF_NEWP0A_Msk);
+ else
+ int_stat = (PWMG->IF & PWMG_IF_NEWP0B_Msk);
+ break;
- case((uint32_t)PWM2):
- if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP2A_Msk);
- else int_stat = (PWMG->IF & PWMG_IF_NEWP2B_Msk);
- break;
-
- case((uint32_t)PWM3):
- if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP3A_Msk);
- else int_stat = (PWMG->IF & PWMG_IF_NEWP3B_Msk);
- break;
-
- case((uint32_t)PWM4):
- if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP4A_Msk);
- else int_stat = (PWMG->IF & PWMG_IF_NEWP4B_Msk);
- break;
-
- case((uint32_t)PWM5):
- if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP5A_Msk);
- else int_stat = (PWMG->IF & PWMG_IF_NEWP5B_Msk);
- break;
- }
-
- return int_stat;
-}
+ case ((uint32_t)PWM1):
+ if (chn == PWM_CH_A)
+ int_stat = (PWMG->IF & PWMG_IF_NEWP1A_Msk);
+ else
+ int_stat = (PWMG->IF & PWMG_IF_NEWP1B_Msk);
+ break;
+ case ((uint32_t)PWM2):
+ if (chn == PWM_CH_A)
+ int_stat = (PWMG->IF & PWMG_IF_NEWP2A_Msk);
+ else
+ int_stat = (PWMG->IF & PWMG_IF_NEWP2B_Msk);
+ break;
+
+ case ((uint32_t)PWM3):
+ if (chn == PWM_CH_A)
+ int_stat = (PWMG->IF & PWMG_IF_NEWP3A_Msk);
+ else
+ int_stat = (PWMG->IF & PWMG_IF_NEWP3B_Msk);
+ break;
+
+ case ((uint32_t)PWM4):
+ if (chn == PWM_CH_A)
+ int_stat = (PWMG->IF & PWMG_IF_NEWP4A_Msk);
+ else
+ int_stat = (PWMG->IF & PWMG_IF_NEWP4B_Msk);
+ break;
+
+ case ((uint32_t)PWM5):
+ if (chn == PWM_CH_A)
+ int_stat = (PWMG->IF & PWMG_IF_NEWP5A_Msk);
+ else
+ int_stat = (PWMG->IF & PWMG_IF_NEWP5B_Msk);
+ break;
+ }
+
+ return int_stat;
+}
/******************************************************************************************************************************************
-* ��������: PWM_IntHEndEn()
-* ����˵��: �ߵ�ƽ�����ж�ʹ��
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ�����ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* �� ��: ��
-* ע������: ��
+* 函数名称: PWM_IntHEndEn()
+* 功能说明: 高电平结束中断使能
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void PWM_IntHEndEn(PWM_TypeDef * PWMx, uint32_t chn)
+void PWM_IntHEndEn(PWM_TypeDef *PWMx, uint32_t chn)
{
- switch((uint32_t)PWMx)
- {
- case((uint32_t)PWM0):
- if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND0A_Pos);
- else PWMG->IE |= (0x01 << PWMG_IE_HEND0B_Pos);
- break;
-
- case((uint32_t)PWM1):
- if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND1A_Pos);
- else PWMG->IE |= (0x01 << PWMG_IE_HEND1B_Pos);
- break;
-
- case((uint32_t)PWM2):
- if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND2A_Pos);
- else PWMG->IE |= (0x01 << PWMG_IE_HEND2B_Pos);
- break;
-
- case((uint32_t)PWM3):
- if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND3A_Pos);
- else PWMG->IE |= (0x01 << PWMG_IE_HEND3B_Pos);
- break;
-
- case((uint32_t)PWM4):
- if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND4A_Pos);
- else PWMG->IE |= (0x01 << PWMG_IE_HEND4B_Pos);
- break;
-
- case((uint32_t)PWM5):
- if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND5A_Pos);
- else PWMG->IE |= (0x01 << PWMG_IE_HEND5B_Pos);
- break;
- }
+ switch ((uint32_t)PWMx)
+ {
+ case ((uint32_t)PWM0):
+ if (chn == PWM_CH_A)
+ PWMG->IE |= (0x01 << PWMG_IE_HEND0A_Pos);
+ else
+ PWMG->IE |= (0x01 << PWMG_IE_HEND0B_Pos);
+ break;
+
+ case ((uint32_t)PWM1):
+ if (chn == PWM_CH_A)
+ PWMG->IE |= (0x01 << PWMG_IE_HEND1A_Pos);
+ else
+ PWMG->IE |= (0x01 << PWMG_IE_HEND1B_Pos);
+ break;
+
+ case ((uint32_t)PWM2):
+ if (chn == PWM_CH_A)
+ PWMG->IE |= (0x01 << PWMG_IE_HEND2A_Pos);
+ else
+ PWMG->IE |= (0x01 << PWMG_IE_HEND2B_Pos);
+ break;
+
+ case ((uint32_t)PWM3):
+ if (chn == PWM_CH_A)
+ PWMG->IE |= (0x01 << PWMG_IE_HEND3A_Pos);
+ else
+ PWMG->IE |= (0x01 << PWMG_IE_HEND3B_Pos);
+ break;
+
+ case ((uint32_t)PWM4):
+ if (chn == PWM_CH_A)
+ PWMG->IE |= (0x01 << PWMG_IE_HEND4A_Pos);
+ else
+ PWMG->IE |= (0x01 << PWMG_IE_HEND4B_Pos);
+ break;
+
+ case ((uint32_t)PWM5):
+ if (chn == PWM_CH_A)
+ PWMG->IE |= (0x01 << PWMG_IE_HEND5A_Pos);
+ else
+ PWMG->IE |= (0x01 << PWMG_IE_HEND5B_Pos);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: PWM_IntHEndDis()
-* ����˵��: �ߵ�ƽ�����жϽ���
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ�����ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* �� ��: ��
-* ע������: ��
+* 函数名称: PWM_IntHEndDis()
+* 功能说明: 高电平结束中断禁能
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn)
+void PWM_IntHEndDis(PWM_TypeDef *PWMx, uint32_t chn)
{
- switch((uint32_t)PWMx)
- {
- case((uint32_t)PWM0):
- if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND0A_Pos);
- else PWMG->IE &= ~(0x01 << PWMG_IE_HEND0B_Pos);
- break;
-
- case((uint32_t)PWM1):
- if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND1A_Pos);
- else PWMG->IE &= ~(0x01 << PWMG_IE_HEND1B_Pos);
- break;
-
- case((uint32_t)PWM2):
- if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND2A_Pos);
- else PWMG->IE &= ~(0x01 << PWMG_IE_HEND2B_Pos);
- break;
-
- case((uint32_t)PWM3):
- if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND3A_Pos);
- else PWMG->IE &= ~(0x01 << PWMG_IE_HEND3B_Pos);
- break;
-
- case((uint32_t)PWM4):
- if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND4A_Pos);
- else PWMG->IE &= ~(0x01 << PWMG_IE_HEND4B_Pos);
- break;
-
- case((uint32_t)PWM5):
- if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND5A_Pos);
- else PWMG->IE &= ~(0x01 << PWMG_IE_HEND5B_Pos);
- break;
- }
+ switch ((uint32_t)PWMx)
+ {
+ case ((uint32_t)PWM0):
+ if (chn == PWM_CH_A)
+ PWMG->IE &= ~(0x01 << PWMG_IE_HEND0A_Pos);
+ else
+ PWMG->IE &= ~(0x01 << PWMG_IE_HEND0B_Pos);
+ break;
+
+ case ((uint32_t)PWM1):
+ if (chn == PWM_CH_A)
+ PWMG->IE &= ~(0x01 << PWMG_IE_HEND1A_Pos);
+ else
+ PWMG->IE &= ~(0x01 << PWMG_IE_HEND1B_Pos);
+ break;
+
+ case ((uint32_t)PWM2):
+ if (chn == PWM_CH_A)
+ PWMG->IE &= ~(0x01 << PWMG_IE_HEND2A_Pos);
+ else
+ PWMG->IE &= ~(0x01 << PWMG_IE_HEND2B_Pos);
+ break;
+
+ case ((uint32_t)PWM3):
+ if (chn == PWM_CH_A)
+ PWMG->IE &= ~(0x01 << PWMG_IE_HEND3A_Pos);
+ else
+ PWMG->IE &= ~(0x01 << PWMG_IE_HEND3B_Pos);
+ break;
+
+ case ((uint32_t)PWM4):
+ if (chn == PWM_CH_A)
+ PWMG->IE &= ~(0x01 << PWMG_IE_HEND4A_Pos);
+ else
+ PWMG->IE &= ~(0x01 << PWMG_IE_HEND4B_Pos);
+ break;
+
+ case ((uint32_t)PWM5):
+ if (chn == PWM_CH_A)
+ PWMG->IE &= ~(0x01 << PWMG_IE_HEND5A_Pos);
+ else
+ PWMG->IE &= ~(0x01 << PWMG_IE_HEND5B_Pos);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: PWM_IntHEndClr()
-* ����˵��: �ߵ�ƽ�����жϱ�־���
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ�����ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* �� ��: ��
-* ע������: ��
+* 函数名称: PWM_IntHEndClr()
+* 功能说明: 高电平结束中断标志清除
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void PWM_IntHEndClr(PWM_TypeDef * PWMx, uint32_t chn)
+void PWM_IntHEndClr(PWM_TypeDef *PWMx, uint32_t chn)
{
- switch((uint32_t)PWMx)
- {
- case((uint32_t)PWM0):
- if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND0A_Pos);
- else PWMG->IRS = (0x01 << PWMG_IRS_HEND0B_Pos);
- break;
-
- case((uint32_t)PWM1):
- if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND1A_Pos);
- else PWMG->IRS = (0x01 << PWMG_IRS_HEND1B_Pos);
- break;
-
- case((uint32_t)PWM2):
- if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND2A_Pos);
- else PWMG->IRS = (0x01 << PWMG_IRS_HEND2B_Pos);
- break;
-
- case((uint32_t)PWM3):
- if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND3A_Pos);
- else PWMG->IRS = (0x01 << PWMG_IRS_HEND3B_Pos);
- break;
-
- case((uint32_t)PWM4):
- if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND4A_Pos);
- else PWMG->IRS = (0x01 << PWMG_IRS_HEND4B_Pos);
- break;
-
- case((uint32_t)PWM5):
- if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND5A_Pos);
- else PWMG->IRS = (0x01 << PWMG_IRS_HEND5B_Pos);
- break;
- }
+ switch ((uint32_t)PWMx)
+ {
+ case ((uint32_t)PWM0):
+ if (chn == PWM_CH_A)
+ PWMG->IRS = (0x01 << PWMG_IRS_HEND0A_Pos);
+ else
+ PWMG->IRS = (0x01 << PWMG_IRS_HEND0B_Pos);
+ break;
+
+ case ((uint32_t)PWM1):
+ if (chn == PWM_CH_A)
+ PWMG->IRS = (0x01 << PWMG_IRS_HEND1A_Pos);
+ else
+ PWMG->IRS = (0x01 << PWMG_IRS_HEND1B_Pos);
+ break;
+
+ case ((uint32_t)PWM2):
+ if (chn == PWM_CH_A)
+ PWMG->IRS = (0x01 << PWMG_IRS_HEND2A_Pos);
+ else
+ PWMG->IRS = (0x01 << PWMG_IRS_HEND2B_Pos);
+ break;
+
+ case ((uint32_t)PWM3):
+ if (chn == PWM_CH_A)
+ PWMG->IRS = (0x01 << PWMG_IRS_HEND3A_Pos);
+ else
+ PWMG->IRS = (0x01 << PWMG_IRS_HEND3B_Pos);
+ break;
+
+ case ((uint32_t)PWM4):
+ if (chn == PWM_CH_A)
+ PWMG->IRS = (0x01 << PWMG_IRS_HEND4A_Pos);
+ else
+ PWMG->IRS = (0x01 << PWMG_IRS_HEND4B_Pos);
+ break;
+
+ case ((uint32_t)PWM5):
+ if (chn == PWM_CH_A)
+ PWMG->IRS = (0x01 << PWMG_IRS_HEND5A_Pos);
+ else
+ PWMG->IRS = (0x01 << PWMG_IRS_HEND5B_Pos);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: PWM_IntHEndStat()
-* ����˵��: �ߵ�ƽ�����ж��Ƿ���
-* �� ��: PWM_TypeDef * PWMx ָ��Ҫ�����õ�PWM����Чֵ����PWM0��PWM1��PWM2��PWM3��PWM4��PWM5
-* uint32_t chn ѡ��Ҫ�����ĸ�ͨ������Чֵ��PWM_CH_A��PWM_CH_B
-* �� ��: uint32_t 1 �ߵ�ƽ�����ж��ѷ��� 0 �ߵ�ƽ�����ж�δ����
-* ע������: ��
+* 函数名称: PWM_IntHEndStat()
+* 功能说明: 高电平结束中断是否发生
+* 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
+* uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
+* 输 出: uint32_t 1 高电平结束中断已发生 0 高电平结束中断未发生
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t PWM_IntHEndStat(PWM_TypeDef * PWMx, uint32_t chn)
+uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn)
{
- uint32_t int_stat = 0;
-
- switch((uint32_t)PWMx)
- {
- case((uint32_t)PWM0):
- if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND0A_Msk);
- else int_stat = (PWMG->IF & PWMG_IF_HEND0B_Msk);
- break;
+ uint32_t int_stat = 0;
+
+ switch ((uint32_t)PWMx)
+ {
+ case ((uint32_t)PWM0):
+ if (chn == PWM_CH_A)
+ int_stat = (PWMG->IF & PWMG_IF_HEND0A_Msk);
+ else
+ int_stat = (PWMG->IF & PWMG_IF_HEND0B_Msk);
+ break;
+
+ case ((uint32_t)PWM1):
+ if (chn == PWM_CH_A)
+ int_stat = (PWMG->IF & PWMG_IF_HEND1A_Msk);
+ else
+ int_stat = (PWMG->IF & PWMG_IF_HEND1B_Msk);
+ break;
+
+ case ((uint32_t)PWM2):
+ if (chn == PWM_CH_A)
+ int_stat = (PWMG->IF & PWMG_IF_HEND2A_Msk);
+ else
+ int_stat = (PWMG->IF & PWMG_IF_HEND2B_Msk);
+ break;
+
+ case ((uint32_t)PWM3):
+ if (chn == PWM_CH_A)
+ int_stat = (PWMG->IF & PWMG_IF_HEND3A_Msk);
+ else
+ int_stat = (PWMG->IF & PWMG_IF_HEND3B_Msk);
+ break;
+
+ case ((uint32_t)PWM4):
+ if (chn == PWM_CH_A)
+ int_stat = (PWMG->IF & PWMG_IF_HEND4A_Msk);
+ else
+ int_stat = (PWMG->IF & PWMG_IF_HEND4B_Msk);
+ break;
- case((uint32_t)PWM1):
- if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND1A_Msk);
- else int_stat = (PWMG->IF & PWMG_IF_HEND1B_Msk);
- break;
+ case ((uint32_t)PWM5):
+ if (chn == PWM_CH_A)
+ int_stat = (PWMG->IF & PWMG_IF_HEND5A_Msk);
+ else
+ int_stat = (PWMG->IF & PWMG_IF_HEND5B_Msk);
+ break;
+ }
- case((uint32_t)PWM2):
- if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND2A_Msk);
- else int_stat = (PWMG->IF & PWMG_IF_HEND2B_Msk);
- break;
-
- case((uint32_t)PWM3):
- if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND3A_Msk);
- else int_stat = (PWMG->IF & PWMG_IF_HEND3B_Msk);
- break;
-
- case((uint32_t)PWM4):
- if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND4A_Msk);
- else int_stat = (PWMG->IF & PWMG_IF_HEND4B_Msk);
- break;
-
- case((uint32_t)PWM5):
- if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND5A_Msk);
- else int_stat = (PWMG->IF & PWMG_IF_HEND5B_Msk);
- break;
- }
-
- return int_stat;
+ return int_stat;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.h
index 4565a05a94..888e0c5e39 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_pwm.h
@@ -1,58 +1,57 @@
#ifndef __SWM320_PWM_H__
-#define __SWM320_PWM_H__
+#define __SWM320_PWM_H__
-typedef struct {
- uint8_t clk_div; //PWM_CLKDIV_1��PWM_CLKDIV_8
-
- uint8_t mode; //PWM_MODE_INDEP��PWM_MODE_COMPL��PWM_MODE_INDEP_CALIGN��PWM_MODE_COMPL_CALIGN
-
- uint16_t cycleA; //A·����
- uint16_t hdutyA; //A·ռ�ձ�
- uint16_t deadzoneA; //A·����ʱ����ȡֵ0--1023
- uint8_t initLevelA; //A·��ʼ�����ƽ��0 �͵�ƽ 1 �ߵ�ƽ
-
- uint16_t cycleB; //B·����
- uint16_t hdutyB; //B·ռ�ձ�
- uint16_t deadzoneB; //B·����ʱ����ȡֵ0--1023
- uint8_t initLevelB; //B·��ʼ�����ƽ��0 �͵�ƽ 1 �ߵ�ƽ
-
- uint8_t HEndAIEn; //A·�ߵ�ƽ�����ж�ʹ��
- uint8_t NCycleAIEn; //A·�����ڿ�ʼ�ж�ʹ��
- uint8_t HEndBIEn; //B·�ߵ�ƽ�����ж�ʹ��
- uint8_t NCycleBIEn; //B·�����ڿ�ʼ�ж�ʹ��
-} PWM_InitStructure;
+typedef struct
+{
+ uint8_t clk_div; //PWM_CLKDIV_1、PWM_CLKDIV_8
+
+ uint8_t mode; //PWM_MODE_INDEP、PWM_MODE_COMPL、PWM_MODE_INDEP_CALIGN、PWM_MODE_COMPL_CALIGN
-#define PWM_CLKDIV_1 0
-#define PWM_CLKDIV_8 1
+ uint16_t cycleA; //A路周期
+ uint16_t hdutyA; //A路占空比
+ uint16_t deadzoneA; //A路死区时长,取值0--1023
+ uint8_t initLevelA; //A路初始输出电平,0 低电平 1 高电平
-#define PWM_MODE_INDEP 0 //A·��B·Ϊ��·�������
-#define PWM_MODE_COMPL 1 //A·��B·Ϊһ·�������
-#define PWM_MODE_INDEP_CALIGN 3 //A·��B·Ϊ��·������������Ķ���
-#define PWM_MODE_COMPL_CALIGN 4 //A·��B·Ϊһ·������������Ķ���
+ uint16_t cycleB; //B路周期
+ uint16_t hdutyB; //B路占空比
+ uint16_t deadzoneB; //B路死区时长,取值0--1023
+ uint8_t initLevelB; //B路初始输出电平,0 低电平 1 高电平
+
+ uint8_t HEndAIEn; //A路高电平结束中断使能
+ uint8_t NCycleAIEn; //A路新周期开始中断使能
+ uint8_t HEndBIEn; //B路高电平结束中断使能
+ uint8_t NCycleBIEn; //B路新周期开始中断使能
+} PWM_InitStructure;
-#define PWM_CH_A 0
-#define PWM_CH_B 1
+#define PWM_CLKDIV_1 0
+#define PWM_CLKDIV_8 1
+#define PWM_MODE_INDEP 0 //A路和B路为两路独立输出
+#define PWM_MODE_COMPL 1 //A路和B路为一路互补输出
+#define PWM_MODE_INDEP_CALIGN 3 //A路和B路为两路独立输出,中心对齐
+#define PWM_MODE_COMPL_CALIGN 4 //A路和B路为一路互补输出,中心对齐
-void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct); //PWM��ʼ��
-void PWM_Start(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB); //����PWM����ʼPWM���
-void PWM_Stop(PWM_TypeDef * PWMx, uint32_t chA, uint32_t chB); //�ر�PWM��ֹͣPWM���
+#define PWM_CH_A 0
+#define PWM_CH_B 1
-void PWM_SetCycle(PWM_TypeDef * PWMx, uint32_t chn, uint16_t cycle); //��������
-uint16_t PWM_GetCycle(PWM_TypeDef * PWMx, uint32_t chn); //��ȡ����
-void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty); //���øߵ�ƽʱ��
-uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn); //��ȡ�ߵ�ƽʱ��
-void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint8_t deadzone); //��������ʱ��
-uint8_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn); //��ȡ����ʱ��
+void PWM_Init(PWM_TypeDef *PWMx, PWM_InitStructure *initStruct); //PWM初始化
+void PWM_Start(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB); //启动PWM,开始PWM输出
+void PWM_Stop(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB); //关闭PWM,停止PWM输出
-void PWM_IntNCycleEn(PWM_TypeDef * PWMx, uint32_t chn); //�����ڿ�ʼ�ж�ʹ��
-void PWM_IntNCycleDis(PWM_TypeDef * PWMx, uint32_t chn); //�����ڿ�ʼ�жϽ���
-void PWM_IntNCycleClr(PWM_TypeDef * PWMx, uint32_t chn); //�����ڿ�ʼ�жϱ�־���
-uint32_t PWM_IntNCycleStat(PWM_TypeDef * PWMx, uint32_t chn); //�����ڿ�ʼ�ж��Ƿ���
-void PWM_IntHEndEn(PWM_TypeDef * PWMx, uint32_t chn); //�ߵ�ƽ�����ж�ʹ��
-void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn); //�ߵ�ƽ�����жϽ���
-void PWM_IntHEndClr(PWM_TypeDef * PWMx, uint32_t chn); //�ߵ�ƽ�����жϱ�־���
-uint32_t PWM_IntHEndStat(PWM_TypeDef * PWMx, uint32_t chn); //�ߵ�ƽ�����ж��Ƿ���
+void PWM_SetCycle(PWM_TypeDef *PWMx, uint32_t chn, uint16_t cycle); //设置周期
+uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn); //获取周期
+void PWM_SetHDuty(PWM_TypeDef *PWMx, uint32_t chn, uint16_t hduty); //设置高电平时长
+uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn); //获取高电平时长
+void PWM_SetDeadzone(PWM_TypeDef *PWMx, uint32_t chn, uint8_t deadzone); //设置死区时长
+uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn); //获取死区时长
+void PWM_IntNCycleEn(PWM_TypeDef *PWMx, uint32_t chn); //新周期开始中断使能
+void PWM_IntNCycleDis(PWM_TypeDef *PWMx, uint32_t chn); //新周期开始中断禁能
+void PWM_IntNCycleClr(PWM_TypeDef *PWMx, uint32_t chn); //新周期开始中断标志清除
+uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn); //新周期开始中断是否发生
+void PWM_IntHEndEn(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断使能
+void PWM_IntHEndDis(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断禁能
+void PWM_IntHEndClr(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断标志清除
+uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn); //高电平结束中断是否发生
#endif //__SWM320_PWM_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.c
index 2ce0f390b7..0489551511 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_rtc.c
-* ����˵��: SWM320��Ƭ����RTC������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_rtc.c
+* 功能说明: SWM320单片机的RTC驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,393 +21,399 @@
#include "SWM320.h"
#include "SWM320_rtc.h"
-
static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date);
/******************************************************************************************************************************************
-* ��������: RTC_Init()
-* ����˵��: RTC��ʼ��
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����Чֵ����RTC
-* RTC_InitStructure * initStruct ����RTC����趨ֵ�Ľṹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_Init()
+* 功能说明: RTC初始化
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,有效值包括RTC
+* RTC_InitStructure * initStruct 包含RTC相关设定值的结构体
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct)
-{
- SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
-
- SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos); //RTCʹ��32KHz RCʱ��
-
- SYS->CLKEN |= (1 << SYS_CLKEN_RTC_Pos) |
- ((uint32_t)1 << SYS_CLKEN_ALIVE_Pos);
-
- RTC_Stop(RTCx);
-
- while(RTCx->CFGABLE == 0);
-
- RTCx->MINSEC = (initStruct->Second << RTC_MINSEC_SEC_Pos) |
- (initStruct->Minute << RTC_MINSEC_MIN_Pos);
-
- RTCx->DATHUR = (initStruct->Hour << RTC_DATHUR_HOUR_Pos) |
- (initStruct->Date << RTC_DATHUR_DATE_Pos);
-
- RTCx->MONDAY = (calcWeekDay(initStruct->Year, initStruct->Month, initStruct->Date) << RTC_MONDAY_DAY_Pos) |
- (initStruct->Month << RTC_MONDAY_MON_Pos);
-
- RTCx->YEAR = initStruct->Year - 1901;
-
- RTCx->LOAD = 1 << RTC_LOAD_TIME_Pos;
-
- RTCx->IF = 0x1F;
- RTCx->IE = (initStruct->SecondIEn << RTC_IE_SEC_Pos) |
- (initStruct->MinuteIEn << RTC_IE_MIN_Pos);
-
- if(initStruct->SecondIEn | initStruct->MinuteIEn)
- {
- NVIC_EnableIRQ(RTC_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(RTC_IRQn);
- }
+void RTC_Init(RTC_TypeDef *RTCx, RTC_InitStructure *initStruct)
+{
+ SYS->CLKEN |= (1 << SYS_CLKEN_RTCBKP_Pos);
+
+ SYS->LRCCR &= ~(1 << SYS_LRCCR_OFF_Pos); //RTC使用32KHz RC时钟
+
+ SYS->CLKEN |= (1 << SYS_CLKEN_RTC_Pos) |
+ ((uint32_t)1 << SYS_CLKEN_ALIVE_Pos);
+
+ RTC_Stop(RTCx);
+
+ while (RTCx->CFGABLE == 0)
+ ;
+
+ RTCx->MINSEC = (initStruct->Second << RTC_MINSEC_SEC_Pos) |
+ (initStruct->Minute << RTC_MINSEC_MIN_Pos);
+
+ RTCx->DATHUR = (initStruct->Hour << RTC_DATHUR_HOUR_Pos) |
+ (initStruct->Date << RTC_DATHUR_DATE_Pos);
+
+ RTCx->MONDAY = (calcWeekDay(initStruct->Year, initStruct->Month, initStruct->Date) << RTC_MONDAY_DAY_Pos) |
+ (initStruct->Month << RTC_MONDAY_MON_Pos);
+
+ RTCx->YEAR = initStruct->Year - 1901;
+
+ RTCx->LOAD = 1 << RTC_LOAD_TIME_Pos;
+
+ RTCx->IF = 0x1F;
+ RTCx->IE = (initStruct->SecondIEn << RTC_IE_SEC_Pos) |
+ (initStruct->MinuteIEn << RTC_IE_MIN_Pos);
+
+ if (initStruct->SecondIEn | initStruct->MinuteIEn)
+ {
+ NVIC_EnableIRQ(RTC_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(RTC_IRQn);
+ }
}
/******************************************************************************************************************************************
-* ��������: RTC_Start()
-* ����˵��: ����RTC
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_Start()
+* 功能说明: 启动RTC
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_Start(RTC_TypeDef * RTCx)
+void RTC_Start(RTC_TypeDef *RTCx)
{
- RTCx->EN = 1;
+ RTCx->EN = 1;
}
/******************************************************************************************************************************************
-* ��������: RTC_Stop()
-* ����˵��: ֹͣRTC
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_Stop()
+* 功能说明: 停止RTC
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_Stop(RTC_TypeDef * RTCx)
+void RTC_Stop(RTC_TypeDef *RTCx)
{
- RTCx->EN = 0;
+ RTCx->EN = 0;
}
/******************************************************************************************************************************************
-* ��������: RTC_GetDateTime()
-* ����˵��: ��ȡ��ǰ��ʱ�������
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����Чֵ����RTC
-* RTC_DateTime * dateTime ��ȡ����ʱ�䡢����ֵ�����ָ��ָ��Ľṹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_GetDateTime()
+* 功能说明: 获取当前的时间和日期
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,有效值包括RTC
+* RTC_DateTime * dateTime 获取到的时间、日期值存入此指针指向的结构体
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime)
+void RTC_GetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime)
{
- dateTime->Year = RTCx->YEAR + 1901;
- dateTime->Month = (RTCx->MONDAY & RTC_MONDAY_MON_Msk) >> RTC_MONDAY_MON_Pos;
- dateTime->Date = (RTCx->DATHUR & RTC_DATHUR_DATE_Msk) >> RTC_DATHUR_DATE_Pos;
- dateTime->Day = 1 << ((RTCx->MONDAY & RTC_MONDAY_DAY_Msk) >> RTC_MONDAY_DAY_Pos);
- dateTime->Hour = (RTCx->DATHUR & RTC_DATHUR_HOUR_Msk) >> RTC_DATHUR_HOUR_Pos;
- dateTime->Minute = (RTCx->MINSEC & RTC_MINSEC_MIN_Msk) >> RTC_MINSEC_MIN_Pos;
- dateTime->Second = (RTCx->MINSEC & RTC_MINSEC_SEC_Msk) >> RTC_MINSEC_SEC_Pos;
+ dateTime->Year = RTCx->YEAR + 1901;
+ dateTime->Month = (RTCx->MONDAY & RTC_MONDAY_MON_Msk) >> RTC_MONDAY_MON_Pos;
+ dateTime->Date = (RTCx->DATHUR & RTC_DATHUR_DATE_Msk) >> RTC_DATHUR_DATE_Pos;
+ dateTime->Day = 1 << ((RTCx->MONDAY & RTC_MONDAY_DAY_Msk) >> RTC_MONDAY_DAY_Pos);
+ dateTime->Hour = (RTCx->DATHUR & RTC_DATHUR_HOUR_Msk) >> RTC_DATHUR_HOUR_Pos;
+ dateTime->Minute = (RTCx->MINSEC & RTC_MINSEC_MIN_Msk) >> RTC_MINSEC_MIN_Pos;
+ dateTime->Second = (RTCx->MINSEC & RTC_MINSEC_SEC_Msk) >> RTC_MINSEC_SEC_Pos;
}
/******************************************************************************************************************************************
-* ��������: RTC_AlarmSetup()
-* ����˵��: RTC�����趨
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����Чֵ����RTC
-* RTC_AlarmStructure * alarmStruct ����RTC�����趨ֵ�Ľṹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_AlarmSetup()
+* 功能说明: RTC闹钟设定
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,有效值包括RTC
+* RTC_AlarmStructure * alarmStruct 包含RTC闹钟设定值的结构体
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct)
+void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct)
{
- while(RTCx->CFGABLE == 0);
-
- RTCx->MINSECAL = (alarmStruct->Second << RTC_MINSECAL_SEC_Pos) |
- (alarmStruct->Minute << RTC_MINSECAL_MIN_Pos);
-
- RTCx->DAYHURAL = (alarmStruct->Hour << RTC_DAYHURAL_HOUR_Pos) |
- (alarmStruct->Days << RTC_DAYHURAL_SUN_Pos);
-
- RTCx->LOAD = 1 << RTC_LOAD_ALARM_Pos;
- while(RTCx->LOAD & RTC_LOAD_ALARM_Msk);
-
- RTCx->IF = (1 << RTC_IF_ALARM_Pos);
- RTCx->IE &= ~RTC_IE_ALARM_Msk;
- RTCx->IE |= (alarmStruct->AlarmIEn << RTC_IE_ALARM_Pos);
-
- if(alarmStruct->AlarmIEn) NVIC_EnableIRQ(RTC_IRQn);
+ while (RTCx->CFGABLE == 0)
+ ;
+
+ RTCx->MINSECAL = (alarmStruct->Second << RTC_MINSECAL_SEC_Pos) |
+ (alarmStruct->Minute << RTC_MINSECAL_MIN_Pos);
+
+ RTCx->DAYHURAL = (alarmStruct->Hour << RTC_DAYHURAL_HOUR_Pos) |
+ (alarmStruct->Days << RTC_DAYHURAL_SUN_Pos);
+
+ RTCx->LOAD = 1 << RTC_LOAD_ALARM_Pos;
+ while (RTCx->LOAD & RTC_LOAD_ALARM_Msk)
+ ;
+
+ RTCx->IF = (1 << RTC_IF_ALARM_Pos);
+ RTCx->IE &= ~RTC_IE_ALARM_Msk;
+ RTCx->IE |= (alarmStruct->AlarmIEn << RTC_IE_ALARM_Pos);
+
+ if (alarmStruct->AlarmIEn)
+ NVIC_EnableIRQ(RTC_IRQn);
}
/******************************************************************************************************************************************
-* ��������: calcWeekDay()
-* ����˵��: ����ָ���ꡢ�¡��������ڼ�
-* �� ��: uint32_t year ��
-* uint32_t month ��
-* uint32_t date ��
-* �� ��: uint32_t 0 ������ 1 ����һ ... ... 6 ������
-* ע������: ��
+* 函数名称: calcWeekDay()
+* 功能说明: 计算指定年、月、日是星期几
+* 输 入: uint32_t year 年
+* uint32_t month 月
+* uint32_t date 日
+* 输 出: uint32_t 0 星期日 1 星期一 ... ... 6 星期六
+* 注意事项: 无
******************************************************************************************************************************************/
static uint32_t calcWeekDay(uint32_t year, uint32_t month, uint32_t date)
{
uint32_t i, cnt = 0;
const uint32_t daysOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
-
- for(i = 1; i < month; i++) cnt += daysOfMonth[i];
-
+
+ for (i = 1; i < month; i++)
+ cnt += daysOfMonth[i];
+
cnt += date;
-
- if((year%4 == 0) && ((year%100 != 0) || (year%400 == 0)) && (month >= 3)) cnt += 1;
-
+
+ if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)) && (month >= 3))
+ cnt += 1;
+
cnt += (year - 1901) * 365;
-
- for(i = 1901; i < year; i++)
+
+ for (i = 1901; i < year; i++)
{
- if((i%4 == 0) && ((i%100 != 0) || (i%400 == 0))) cnt += 1;
+ if ((i % 4 == 0) && ((i % 100 != 0) || (i % 400 == 0)))
+ cnt += 1;
}
-
- return (cnt+1) % 7;
+
+ return (cnt + 1) % 7;
}
/******************************************************************************************************************************************
-* ��������: RTC_IntSecondEn()
-* ����˵��: ���ж�ʹ��
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntSecondEn()
+* 功能说明: 秒中断使能
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntSecondEn(RTC_TypeDef * RTCx)
-{
- RTCx->IE |= (1 << RTC_IE_SEC_Pos);
+void RTC_IntSecondEn(RTC_TypeDef *RTCx)
+{
+ RTCx->IE |= (1 << RTC_IE_SEC_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntSecondDis()
-* ����˵��: ���жϽ�ֹ
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntSecondDis()
+* 功能说明: 秒中断禁止
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntSecondDis(RTC_TypeDef * RTCx)
-{
- RTCx->IE &= ~(1 << RTC_IE_SEC_Pos);
+void RTC_IntSecondDis(RTC_TypeDef *RTCx)
+{
+ RTCx->IE &= ~(1 << RTC_IE_SEC_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntSecondClr()
-* ����˵��: ���жϱ�־���
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntSecondClr()
+* 功能说明: 秒中断标志清除
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntSecondClr(RTC_TypeDef * RTCx)
-{
- RTCx->IF = (1 << RTC_IF_SEC_Pos);
+void RTC_IntSecondClr(RTC_TypeDef *RTCx)
+{
+ RTCx->IF = (1 << RTC_IF_SEC_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntSecondStat()
-* ����˵��: ���ж�״̬
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: uint32_t 1 ���жϷ��� 0 ���ж�δ����
-* ע������: ��
+* 函数名称: RTC_IntSecondStat()
+* 功能说明: 秒中断状态
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: uint32_t 1 秒中断发生 0 秒中断未发生
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t RTC_IntSecondStat(RTC_TypeDef * RTCx)
+uint32_t RTC_IntSecondStat(RTC_TypeDef *RTCx)
{
- return (RTCx->IF & RTC_IF_SEC_Msk) ? 1 : 0;
+ return (RTCx->IF & RTC_IF_SEC_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: RTC_IntMinuteEn()
-* ����˵��: ���ж�ʹ��
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntMinuteEn()
+* 功能说明: 分中断使能
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntMinuteEn(RTC_TypeDef * RTCx)
-{
- RTCx->IE |= (1 << RTC_IE_MIN_Pos);
+void RTC_IntMinuteEn(RTC_TypeDef *RTCx)
+{
+ RTCx->IE |= (1 << RTC_IE_MIN_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntMinuteDis()
-* ����˵��: ���жϽ�ֹ
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntMinuteDis()
+* 功能说明: 分中断禁止
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntMinuteDis(RTC_TypeDef * RTCx)
-{
- RTCx->IE &= ~(1 << RTC_IE_MIN_Pos);
+void RTC_IntMinuteDis(RTC_TypeDef *RTCx)
+{
+ RTCx->IE &= ~(1 << RTC_IE_MIN_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntMinuteClr()
-* ����˵��: ���жϱ�־���
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntMinuteClr()
+* 功能说明: 分中断标志清除
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntMinuteClr(RTC_TypeDef * RTCx)
-{
- RTCx->IF = (1 << RTC_IF_MIN_Pos);
+void RTC_IntMinuteClr(RTC_TypeDef *RTCx)
+{
+ RTCx->IF = (1 << RTC_IF_MIN_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntMinuteStat()
-* ����˵��: ���ж�״̬
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: uint32_t 1 ���жϷ��� 0 ���ж�δ����
-* ע������: ��
+* 函数名称: RTC_IntMinuteStat()
+* 功能说明: 分中断状态
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: uint32_t 1 分中断发生 0 分中断未发生
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t RTC_IntMinuteStat(RTC_TypeDef * RTCx)
+uint32_t RTC_IntMinuteStat(RTC_TypeDef *RTCx)
{
- return (RTCx->IF & RTC_IF_MIN_Msk) ? 1 : 0;
+ return (RTCx->IF & RTC_IF_MIN_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: RTC_IntHourEn()
-* ����˵��: ʱ�ж�ʹ��
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntHourEn()
+* 功能说明: 时中断使能
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntHourEn(RTC_TypeDef * RTCx)
-{
- RTCx->IE |= (1 << RTC_IE_HOUR_Pos);
+void RTC_IntHourEn(RTC_TypeDef *RTCx)
+{
+ RTCx->IE |= (1 << RTC_IE_HOUR_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntHourDis()
-* ����˵��: ʱ�жϽ�ֹ
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntHourDis()
+* 功能说明: 时中断禁止
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntHourDis(RTC_TypeDef * RTCx)
-{
- RTCx->IE &= ~(1 << RTC_IE_HOUR_Pos);
+void RTC_IntHourDis(RTC_TypeDef *RTCx)
+{
+ RTCx->IE &= ~(1 << RTC_IE_HOUR_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntHourClr()
-* ����˵��: ʱ�жϱ�־���
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntHourClr()
+* 功能说明: 时中断标志清除
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntHourClr(RTC_TypeDef * RTCx)
-{
- RTCx->IF = (1 << RTC_IF_HOUR_Pos);
+void RTC_IntHourClr(RTC_TypeDef *RTCx)
+{
+ RTCx->IF = (1 << RTC_IF_HOUR_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntHourStat()
-* ����˵��: ʱ�ж�״̬
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: uint32_t 1 ʱ�жϷ��� 0 ʱ�ж�δ����
-* ע������: ��
+* 函数名称: RTC_IntHourStat()
+* 功能说明: 时中断状态
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: uint32_t 1 时中断发生 0 时中断未发生
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t RTC_IntHourStat(RTC_TypeDef * RTCx)
+uint32_t RTC_IntHourStat(RTC_TypeDef *RTCx)
{
- return (RTCx->IF & RTC_IF_HOUR_Msk) ? 1 : 0;
+ return (RTCx->IF & RTC_IF_HOUR_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: RTC_IntDateEn()
-* ����˵��: ���ж�ʹ��
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntDateEn()
+* 功能说明: 日中断使能
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntDateEn(RTC_TypeDef * RTCx)
-{
- RTCx->IE |= (1 << RTC_IE_DATE_Pos);
+void RTC_IntDateEn(RTC_TypeDef *RTCx)
+{
+ RTCx->IE |= (1 << RTC_IE_DATE_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntDateDis()
-* ����˵��: ���жϽ�ֹ
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntDateDis()
+* 功能说明: 日中断禁止
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntDateDis(RTC_TypeDef * RTCx)
-{
- RTCx->IE &= ~(1 << RTC_IE_DATE_Pos);
+void RTC_IntDateDis(RTC_TypeDef *RTCx)
+{
+ RTCx->IE &= ~(1 << RTC_IE_DATE_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntDateClr()
-* ����˵��: ���жϱ�־���
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntDateClr()
+* 功能说明: 日中断标志清除
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntDateClr(RTC_TypeDef * RTCx)
-{
- RTCx->IF = (1 << RTC_IF_DATE_Pos);
+void RTC_IntDateClr(RTC_TypeDef *RTCx)
+{
+ RTCx->IF = (1 << RTC_IF_DATE_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntDateStat()
-* ����˵��: ���ж�״̬
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: uint32_t 1 ���жϷ��� 0 ���ж�δ����
-* ע������: ��
+* 函数名称: RTC_IntDateStat()
+* 功能说明: 日中断状态
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: uint32_t 1 日中断发生 0 日中断未发生
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t RTC_IntDateStat(RTC_TypeDef * RTCx)
+uint32_t RTC_IntDateStat(RTC_TypeDef *RTCx)
{
- return (RTCx->IF & RTC_IF_DATE_Msk) ? 1 : 0;
+ return (RTCx->IF & RTC_IF_DATE_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: RTC_IntAlarmEn()
-* ����˵��: �����ж�ʹ��
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntAlarmEn()
+* 功能说明: 闹钟中断使能
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntAlarmEn(RTC_TypeDef * RTCx)
-{
- RTCx->IE |= (1 << RTC_IE_ALARM_Pos);
+void RTC_IntAlarmEn(RTC_TypeDef *RTCx)
+{
+ RTCx->IE |= (1 << RTC_IE_ALARM_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntAlarmDis()
-* ����˵��: �����жϽ�ֹ
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntAlarmDis()
+* 功能说明: 闹钟中断禁止
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntAlarmDis(RTC_TypeDef * RTCx)
-{
- RTCx->IE &= ~(1 << RTC_IE_ALARM_Pos);
+void RTC_IntAlarmDis(RTC_TypeDef *RTCx)
+{
+ RTCx->IE &= ~(1 << RTC_IE_ALARM_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntAlarmClr()
-* ����˵��: �����жϱ�־���
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: ��
-* ע������: ��
+* 函数名称: RTC_IntAlarmClr()
+* 功能说明: 闹钟中断标志清除
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void RTC_IntAlarmClr(RTC_TypeDef * RTCx)
-{
- RTCx->IF = (1 << RTC_IF_ALARM_Pos);
+void RTC_IntAlarmClr(RTC_TypeDef *RTCx)
+{
+ RTCx->IF = (1 << RTC_IF_ALARM_Pos);
}
/******************************************************************************************************************************************
-* ��������: RTC_IntAlarmStat()
-* ����˵��: �����ж�״̬
-* �� ��: RTC_TypeDef * RTCx ָ��Ҫ�����õ�RTC����ȡֵ����RTC
-* �� ��: uint32_t 1 �����жϷ��� 0 �����ж�δ����
-* ע������: ��
+* 函数名称: RTC_IntAlarmStat()
+* 功能说明: 闹钟中断状态
+* 输 入: RTC_TypeDef * RTCx 指定要被设置的RTC,可取值包括RTC
+* 输 出: uint32_t 1 闹钟中断发生 0 闹钟中断未发生
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t RTC_IntAlarmStat(RTC_TypeDef * RTCx)
+uint32_t RTC_IntAlarmStat(RTC_TypeDef *RTCx)
{
- return (RTCx->IF & RTC_IF_ALARM_Msk) ? 1 : 0;
+ return (RTCx->IF & RTC_IF_ALARM_Msk) ? 1 : 0;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.h
index 513f885cf6..d534fa4788 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_rtc.h
@@ -1,73 +1,73 @@
#ifndef __SWM320_RTC_H__
#define __SWM320_RTC_H__
+#define RTC_SUN 0x01
+#define RTC_MON 0x02
+#define RTC_TUE 0x04
+#define RTC_WED 0x08
+#define RTC_THU 0x10
+#define RTC_FRI 0x20
+#define RTC_SAT 0x40
-#define RTC_SUN 0x01
-#define RTC_MON 0x02
-#define RTC_TUE 0x04
-#define RTC_WED 0x08
-#define RTC_THU 0x10
-#define RTC_FRI 0x20
-#define RTC_SAT 0x40
-
-
-typedef struct {
- uint16_t Year;
- uint8_t Month; //ȡֵ1--12
- uint8_t Date; //ȡֵ1--31
- uint8_t Hour; //ȡֵ0--23
- uint8_t Minute; //ȡֵ0--59
- uint8_t Second; //ȡֵ0--59
- uint8_t SecondIEn;
- uint8_t MinuteIEn;
+typedef struct
+{
+ uint16_t Year;
+ uint8_t Month; //取值1--12
+ uint8_t Date; //取值1--31
+ uint8_t Hour; //取值0--23
+ uint8_t Minute; //取值0--59
+ uint8_t Second; //取值0--59
+ uint8_t SecondIEn;
+ uint8_t MinuteIEn;
} RTC_InitStructure;
-typedef struct {
- uint8_t Days; //RTC_SUN��RTC_MON��RTC_TUE��RTC_WED��RTC_THU��RTC_FRI��RTC_SAT������������
- uint8_t Hour;
- uint8_t Minute;
- uint8_t Second;
- uint8_t AlarmIEn;
+typedef struct
+{
+ uint8_t Days; //RTC_SUN、RTC_MON、RTC_TUE、RTC_WED、RTC_THU、RTC_FRI、RTC_SAT及其或运算组合
+ uint8_t Hour;
+ uint8_t Minute;
+ uint8_t Second;
+ uint8_t AlarmIEn;
} RTC_AlarmStructure;
-typedef struct {
- uint16_t Year;
- uint8_t Month;
- uint8_t Date;
- uint8_t Day; //RTC_SUN��RTC_MON��RTC_TUE��RTC_WED��RTC_THU��RTC_FRI��RTC_SAT
- uint8_t Hour;
- uint8_t Minute;
- uint8_t Second;
+typedef struct
+{
+ uint16_t Year;
+ uint8_t Month;
+ uint8_t Date;
+ uint8_t Day; //RTC_SUN、RTC_MON、RTC_TUE、RTC_WED、RTC_THU、RTC_FRI、RTC_SAT
+ uint8_t Hour;
+ uint8_t Minute;
+ uint8_t Second;
} RTC_DateTime;
-void RTC_Init(RTC_TypeDef * RTCx, RTC_InitStructure * initStruct);
-void RTC_Start(RTC_TypeDef * RTCx);
-void RTC_Stop(RTC_TypeDef * RTCx);
-
-void RTC_GetDateTime(RTC_TypeDef * RTCx, RTC_DateTime * dateTime);
+void RTC_Init(RTC_TypeDef *RTCx, RTC_InitStructure *initStruct);
+void RTC_Start(RTC_TypeDef *RTCx);
+void RTC_Stop(RTC_TypeDef *RTCx);
-void RTC_AlarmSetup(RTC_TypeDef * RTCx, RTC_AlarmStructure * alarmStruct);
+void RTC_GetDateTime(RTC_TypeDef *RTCx, RTC_DateTime *dateTime);
+void RTC_AlarmSetup(RTC_TypeDef *RTCx, RTC_AlarmStructure *alarmStruct);
-void RTC_IntSecondEn(RTC_TypeDef * RTCx);
-void RTC_IntSecondDis(RTC_TypeDef * RTCx);
-void RTC_IntSecondClr(RTC_TypeDef * RTCx);
-uint32_t RTC_IntSecondStat(RTC_TypeDef * RTCx);
-void RTC_IntMinuteEn(RTC_TypeDef * RTCx);
-void RTC_IntMinuteDis(RTC_TypeDef * RTCx);
-void RTC_IntMinuteClr(RTC_TypeDef * RTCx);
-uint32_t RTC_IntMinuteStat(RTC_TypeDef * RTCx);
-void RTC_IntHourEn(RTC_TypeDef * RTCx);
-void RTC_IntHourDis(RTC_TypeDef * RTCx);
-void RTC_IntHourClr(RTC_TypeDef * RTCx);
-uint32_t RTC_IntHourStat(RTC_TypeDef * RTCx);
-void RTC_IntDateEn(RTC_TypeDef * RTCx);
-void RTC_IntDateDis(RTC_TypeDef * RTCx);
-void RTC_IntDateClr(RTC_TypeDef * RTCx);
-uint32_t RTC_IntDateStat(RTC_TypeDef * RTCx);
-void RTC_IntAlarmEn(RTC_TypeDef * RTCx);
-void RTC_IntAlarmDis(RTC_TypeDef * RTCx);
-void RTC_IntAlarmClr(RTC_TypeDef * RTCx);
-uint32_t RTC_IntAlarmStat(RTC_TypeDef * RTCx);
+void RTC_IntSecondEn(RTC_TypeDef *RTCx);
+void RTC_IntSecondDis(RTC_TypeDef *RTCx);
+void RTC_IntSecondClr(RTC_TypeDef *RTCx);
+uint32_t RTC_IntSecondStat(RTC_TypeDef *RTCx);
+void RTC_IntMinuteEn(RTC_TypeDef *RTCx);
+void RTC_IntMinuteDis(RTC_TypeDef *RTCx);
+void RTC_IntMinuteClr(RTC_TypeDef *RTCx);
+uint32_t RTC_IntMinuteStat(RTC_TypeDef *RTCx);
+void RTC_IntHourEn(RTC_TypeDef *RTCx);
+void RTC_IntHourDis(RTC_TypeDef *RTCx);
+void RTC_IntHourClr(RTC_TypeDef *RTCx);
+uint32_t RTC_IntHourStat(RTC_TypeDef *RTCx);
+void RTC_IntDateEn(RTC_TypeDef *RTCx);
+void RTC_IntDateDis(RTC_TypeDef *RTCx);
+void RTC_IntDateClr(RTC_TypeDef *RTCx);
+uint32_t RTC_IntDateStat(RTC_TypeDef *RTCx);
+void RTC_IntAlarmEn(RTC_TypeDef *RTCx);
+void RTC_IntAlarmDis(RTC_TypeDef *RTCx);
+void RTC_IntAlarmClr(RTC_TypeDef *RTCx);
+uint32_t RTC_IntAlarmStat(RTC_TypeDef *RTCx);
#endif //__SWM320_RTC_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.c
index 2cb8b9e3e8..15d5dac922 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_sdio.c
-* ����˵��: SWM320��Ƭ����SDIO�ӿ�������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������: Ϊ��ͨ���ԡ������ԡ������ԣ�ֻ֧����512�ֽ�Ϊ��λ�Ķ�д
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_sdio.c
+* 功能说明: SWM320单片机的SDIO接口驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项: 为了通用性、兼容性、易用性,只支持以512字节为单位的读写
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,574 +21,606 @@
#include "SWM320.h"
#include "SWM320_sdio.h"
-
SD_CardInfo SD_cardInfo;
/******************************************************************************************************************************************
-* ��������: SDIO_Init()
-* ����˵��: SDIO��дSD����ʼ������ʼ���ɸ���4��ģʽ����д��512�ֽڴ�С����
-* �� ��: uint32_t freq SDIO_CLKʱ��Ƶ��
-* �� ��: uint32_t SD_RES_OK �����ɹ� SD_RES_ERR ����ʧ�� SD_RES_TIMEOUT ������ʱ
-* ע������: ��
+* 函数名称: SDIO_Init()
+* 功能说明: SDIO读写SD卡初始化,初始化成高速4线模式、读写以512字节大小进行
+* 输 入: uint32_t freq SDIO_CLK时钟频率
+* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
+* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_Init(uint32_t freq)
{
- uint32_t res;
- uint32_t resp, resps[4];
-
- SYS->CLKDIV &= ~SYS_CLKDIV_SDIO_Msk;
- if(SystemCoreClock > 80000000) //SDIOʱ����ҪС��52MHz
- SYS->CLKDIV |= (2 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 4
- else
- SYS->CLKDIV |= (1 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 2
-
- SYS->CLKEN |= (0x01 << SYS_CLKEN_SDIO_Pos);
-
- SDIO->CR2 = (1 << SDIO_CR2_RSTALL_Pos);
-
- SDIO->CR1 = (1 << SDIO_CR1_CDSRC_Pos) |
- (0 << SDIO_CR1_8BIT_Pos) |
- (0 << SDIO_CR1_4BIT_Pos) |
- (1 << SDIO_CR1_PWRON_Pos) |
- (7 << SDIO_CR1_VOLT_Pos);
-
- SDIO->CR2 = (1 << SDIO_CR2_CLKEN_Pos) |
- (1 << SDIO_CR2_SDCLKEN_Pos) |
- (calcSDCLKDiv(100000) << SDIO_CR2_SDCLKDIV_Pos) |
- (0xC << SDIO_CR2_TIMEOUT_Pos); // 2**25 SDIO_CLK
-
- while((SDIO->CR2 & SDIO_CR2_CLKRDY_Msk) == 0);
-
- SDIO->IFE = 0xFFFFFFFF;
-
-
- SDIO_SendCmd(SD_CMD_GO_IDLE_STATE, 0x00, SD_RESP_NO, 0); //CMD0: GO_IDLE_STATE
-
- res = SDIO_SendCmd(SD_CMD_SEND_IF_COND, 0x1AA, SD_RESP_32b, &resp); //CMD8: SEND_IF_COND, ��⹤����ѹ������Ƿ�֧��SD 2.0
- if(res != SD_RES_OK)
- return res;
-
- if(resp == 0x1AA) SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0;
- else SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1;
-
- do //ACMD41: SD_CMD_SD_APP_OP_COND
- {
- res = SDIO_SendCmd(SD_CMD_APP_CMD, 0x00, SD_RESP_32b, &resp);
- if(res != SD_RES_OK)
- return res;
-
- if(resp != 0x120) return SD_RES_ERR; //����SD����������MMC��
-
- if(SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0)
- SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000|0x40000000, SD_RESP_32b, &resp);
- else
- SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000|0x00000000, SD_RESP_32b, &resp);
- } while(((resp >> 31) & 0x01) == 0); //�ϵ�û���ʱresp[31] == 0
-
- if(((resp >> 30) & 0x01) == 1) SD_cardInfo.CardType = SDIO_HIGH_CAPACITY_SD_CARD;
-
-
- SDIO_SendCmd(SD_CMD_ALL_SEND_CID, 0x00, SD_RESP_128b, resps); //CMD2: SD_CMD_ALL_SEND_CID����ȡCID
-
- parseCID(resps);
-
-
- SDIO_SendCmd(SD_CMD_SET_REL_ADDR, 0x00, SD_RESP_32b, &resp); //CMD3: SD_CMD_SET_REL_ADDR������RCA
-
- SD_cardInfo.RCA = resp >> 16;
-
-
- SDIO_SendCmd(SD_CMD_SEND_CSD, SD_cardInfo.RCA << 16, SD_RESP_128b, resps); //CMD9: SD_CMD_SEND_CSD����ȡCSD
-
- parseCSD(resps);
-
- if(SD_cardInfo.CardBlockSize < 0x200) return SD_RES_ERR; //������ֻ֧����512�ֽ�Ϊ��λ�Ķ�д����������д��λ���벻С��512
-
-
- SDIO->CR2 &= ~(SDIO_CR2_SDCLKEN_Msk | SDIO_CR2_SDCLKDIV_Msk);
- SDIO->CR2 |= (1 << SDIO_CR2_SDCLKEN_Pos) |
- (calcSDCLKDiv(freq) << SDIO_CR2_SDCLKDIV_Pos); //��ʼ����ɣ�SDCLK�л�������
-
-
- SDIO_SendCmd(SD_CMD_SEL_DESEL_CARD, SD_cardInfo.RCA << 16, SD_RESP_32b_busy, &resp); //CMD7: ѡ�п�����Standyģʽ����Transferģʽ
- SDIO->IF = SDIO_IF_TRXDONE_Msk;
-
- SDIO_SendCmd(SD_CMD_APP_CMD, SD_cardInfo.RCA << 16, SD_RESP_32b, &resp);
-
- SDIO_SendCmd(SD_CMD_APP_SD_SET_BUSWIDTH, SD_BUSWIDTH_4b, SD_RESP_32b, &resp); //�л���4λ����ģʽ
-
- SDIO->CR1 |= (1 << SDIO_CR1_4BIT_Pos);
-
-
- SDIO_SendCmd(SD_CMD_SET_BLOCKLEN, 512, SD_RESP_32b, &resp); //�̶����Сλ512�ֽ�
-
- SDIO->BLK = 512;
-
- return SD_RES_OK;
+ uint32_t res;
+ uint32_t resp, resps[4];
+
+ SYS->CLKDIV &= ~SYS_CLKDIV_SDIO_Msk;
+ if (SystemCoreClock > 80000000) //SDIO时钟需要小于52MHz
+ SYS->CLKDIV |= (2 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 4
+ else
+ SYS->CLKDIV |= (1 << SYS_CLKDIV_SDIO_Pos); //SDCLK = SYSCLK / 2
+
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_SDIO_Pos);
+
+ SDIO->CR2 = (1 << SDIO_CR2_RSTALL_Pos);
+
+ SDIO->CR1 = (1 << SDIO_CR1_CDSRC_Pos) |
+ (0 << SDIO_CR1_8BIT_Pos) |
+ (0 << SDIO_CR1_4BIT_Pos) |
+ (1 << SDIO_CR1_PWRON_Pos) |
+ (7 << SDIO_CR1_VOLT_Pos);
+
+ SDIO->CR2 = (1 << SDIO_CR2_CLKEN_Pos) |
+ (1 << SDIO_CR2_SDCLKEN_Pos) |
+ (calcSDCLKDiv(100000) << SDIO_CR2_SDCLKDIV_Pos) |
+ (0xC << SDIO_CR2_TIMEOUT_Pos); // 2**25 SDIO_CLK
+
+ while ((SDIO->CR2 & SDIO_CR2_CLKRDY_Msk) == 0)
+ ;
+
+ SDIO->IFE = 0xFFFFFFFF;
+
+ SDIO_SendCmd(SD_CMD_GO_IDLE_STATE, 0x00, SD_RESP_NO, 0); //CMD0: GO_IDLE_STATE
+
+ res = SDIO_SendCmd(SD_CMD_SEND_IF_COND, 0x1AA, SD_RESP_32b, &resp); //CMD8: SEND_IF_COND, 检测工作电压、检测是否支持SD 2.0
+ if (res != SD_RES_OK)
+ return res;
+
+ if (resp == 0x1AA)
+ SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0;
+ else
+ SD_cardInfo.CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1;
+
+ do //ACMD41: SD_CMD_SD_APP_OP_COND
+ {
+ res = SDIO_SendCmd(SD_CMD_APP_CMD, 0x00, SD_RESP_32b, &resp);
+ if (res != SD_RES_OK)
+ return res;
+
+ if (resp != 0x120)
+ return SD_RES_ERR; //不是SD卡,可能是MMC卡
+
+ if (SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0)
+ SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x40000000, SD_RESP_32b, &resp);
+ else
+ SDIO_SendCmd(SD_CMD_SD_APP_OP_COND, 0x80100000 | 0x00000000, SD_RESP_32b, &resp);
+ } while (((resp >> 31) & 0x01) == 0); //上电没完成时resp[31] == 0
+
+ if (((resp >> 30) & 0x01) == 1)
+ SD_cardInfo.CardType = SDIO_HIGH_CAPACITY_SD_CARD;
+
+ SDIO_SendCmd(SD_CMD_ALL_SEND_CID, 0x00, SD_RESP_128b, resps); //CMD2: SD_CMD_ALL_SEND_CID,获取CID
+
+ parseCID(resps);
+
+ SDIO_SendCmd(SD_CMD_SET_REL_ADDR, 0x00, SD_RESP_32b, &resp); //CMD3: SD_CMD_SET_REL_ADDR,设置RCA
+
+ SD_cardInfo.RCA = resp >> 16;
+
+ SDIO_SendCmd(SD_CMD_SEND_CSD, SD_cardInfo.RCA << 16, SD_RESP_128b, resps); //CMD9: SD_CMD_SEND_CSD,获取CSD
+
+ parseCSD(resps);
+
+ if (SD_cardInfo.CardBlockSize < 0x200)
+ return SD_RES_ERR; //本驱动只支持以512字节为单位的读写,所以最大读写单位必须不小于512
+
+ SDIO->CR2 &= ~(SDIO_CR2_SDCLKEN_Msk | SDIO_CR2_SDCLKDIV_Msk);
+ SDIO->CR2 |= (1 << SDIO_CR2_SDCLKEN_Pos) |
+ (calcSDCLKDiv(freq) << SDIO_CR2_SDCLKDIV_Pos); //初始化完成,SDCLK切换到高速
+
+ SDIO_SendCmd(SD_CMD_SEL_DESEL_CARD, SD_cardInfo.RCA << 16, SD_RESP_32b_busy, &resp); //CMD7: 选中卡,从Standy模式进入Transfer模式
+ SDIO->IF = SDIO_IF_TRXDONE_Msk;
+
+ SDIO_SendCmd(SD_CMD_APP_CMD, SD_cardInfo.RCA << 16, SD_RESP_32b, &resp);
+
+ SDIO_SendCmd(SD_CMD_APP_SD_SET_BUSWIDTH, SD_BUSWIDTH_4b, SD_RESP_32b, &resp); //切换成4位总线模式
+
+ SDIO->CR1 |= (1 << SDIO_CR1_4BIT_Pos);
+
+ SDIO_SendCmd(SD_CMD_SET_BLOCKLEN, 512, SD_RESP_32b, &resp); //固定块大小位512字节
+
+ SDIO->BLK = 512;
+
+ return SD_RES_OK;
}
/******************************************************************************************************************************************
-* ��������: SDIO_BlockWrite()
-* ����˵��: ��SD��д������
-* �� ��: uint32_t block_addr SD�����ַ��ÿ��512�ֽ�
-* uint32_t buff[] Ҫд�������
-* �� ��: uint32_t SD_RES_OK �����ɹ� SD_RES_ERR ����ʧ�� SD_RES_TIMEOUT ������ʱ
-* ע������: ��
+* 函数名称: SDIO_BlockWrite()
+* 功能说明: 向SD卡写入数据
+* 输 入: uint32_t block_addr SD卡块地址,每块512字节
+* uint32_t buff[] 要写入的数据
+* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
+* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_BlockWrite(uint32_t block_addr, uint32_t buff[])
{
- uint32_t res, i;
- uint32_t addr, resp;
-
- if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
- else addr = block_addr * 512;
-
- res = SDIO_SendCmdWithData(SD_CMD_WRITE_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 0, 1);
- if(res != SD_RES_OK)
- return res;
-
- while((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0) __NOP();
- SDIO->IF = SDIO_IF_BUFWRRDY_Msk;
-
- for(i = 0; i < 512/4; i++) SDIO->DATA = buff[i];
-
- while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
- SDIO->IF = SDIO_IF_TRXDONE_Msk;
-
- return SD_RES_OK;
+ uint32_t res, i;
+ uint32_t addr, resp;
+
+ if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+ addr = block_addr;
+ else
+ addr = block_addr * 512;
+
+ res = SDIO_SendCmdWithData(SD_CMD_WRITE_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 0, 1);
+ if (res != SD_RES_OK)
+ return res;
+
+ while ((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0)
+ __NOP();
+ SDIO->IF = SDIO_IF_BUFWRRDY_Msk;
+
+ for (i = 0; i < 512 / 4; i++)
+ SDIO->DATA = buff[i];
+
+ while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
+ __NOP();
+ SDIO->IF = SDIO_IF_TRXDONE_Msk;
+
+ return SD_RES_OK;
}
/******************************************************************************************************************************************
-* ��������: SDIO_MultiBlockWrite()
-* ����˵��: ��SD��д��������
-* �� ��: uint32_t block_addr SD�����ַ��ÿ��512�ֽ�
-* uint16_t block_cnt Ҫд��Ŀ���
-* uint32_t buff[] Ҫд�������
-* �� ��: uint32_t SD_RES_OK �����ɹ� SD_RES_ERR ����ʧ�� SD_RES_TIMEOUT ������ʱ
-* ע������: ��
+* 函数名称: SDIO_MultiBlockWrite()
+* 功能说明: 向SD卡写入多块数据
+* 输 入: uint32_t block_addr SD卡块地址,每块512字节
+* uint16_t block_cnt 要写入的块数
+* uint32_t buff[] 要写入的数据
+* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
+* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_MultiBlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[])
{
- uint32_t res, i, j;
- uint32_t addr, resp;
-
- if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
- else addr = block_addr * 512;
-
- res = SDIO_SendCmdWithData(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt);
- if(res != SD_RES_OK)
- return res;
-
- for(i = 0; i < block_cnt; i++)
- {
- while((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0) __NOP();
- SDIO->IF = SDIO_IF_BUFWRRDY_Msk;
-
- for(j = 0; j < 512/4; j++) SDIO->DATA = buff[i*(512/4) + j];
- }
-
- while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
- SDIO->IF = SDIO_IF_TRXDONE_Msk;
-
- return SD_RES_OK;
+ uint32_t res, i, j;
+ uint32_t addr, resp;
+
+ if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+ addr = block_addr;
+ else
+ addr = block_addr * 512;
+
+ res = SDIO_SendCmdWithData(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt);
+ if (res != SD_RES_OK)
+ return res;
+
+ for (i = 0; i < block_cnt; i++)
+ {
+ while ((SDIO->IF & SDIO_IF_BUFWRRDY_Msk) == 0)
+ __NOP();
+ SDIO->IF = SDIO_IF_BUFWRRDY_Msk;
+
+ for (j = 0; j < 512 / 4; j++)
+ SDIO->DATA = buff[i * (512 / 4) + j];
+ }
+
+ while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
+ __NOP();
+ SDIO->IF = SDIO_IF_TRXDONE_Msk;
+
+ return SD_RES_OK;
}
/******************************************************************************************************************************************
-* ��������: SDIO_DMABlockWrite()
-* ����˵��: ͨ��DMA��SD��д��������
-* �� ��: uint32_t block_addr SD�����ַ��ÿ��512�ֽ�
-* uint16_t block_cnt Ҫд��Ŀ���
-* uint32_t buff[] Ҫд�������
-* �� ��: uint32_t SD_RES_OK �����ɹ� SD_RES_ERR ����ʧ�� SD_RES_TIMEOUT ������ʱ
-* ע������: ��
+* 函数名称: SDIO_DMABlockWrite()
+* 功能说明: 通过DMA向SD卡写入多块数据
+* 输 入: uint32_t block_addr SD卡块地址,每块512字节
+* uint16_t block_cnt 要写入的块数
+* uint32_t buff[] 要写入的数据
+* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
+* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[])
{
- uint32_t res;
- uint32_t addr, resp;
-
- if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
- else addr = block_addr * 512;
-
- SDIO->DMA_MEM_ADDR = (uint32_t) buff;
-
- res = SDIO_SendCmdWithDataByDMA(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt);
- if(res != SD_RES_OK)
- return res;
-
- while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
- SDIO->IF = SDIO_IF_TRXDONE_Msk;
-
- return SD_RES_OK;
+ uint32_t res;
+ uint32_t addr, resp;
+
+ if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+ addr = block_addr;
+ else
+ addr = block_addr * 512;
+
+ SDIO->DMA_MEM_ADDR = (uint32_t)buff;
+
+ res = SDIO_SendCmdWithDataByDMA(SD_CMD_WRITE_MULT_BLOCK, addr, SD_RESP_32b, &resp, 0, block_cnt);
+ if (res != SD_RES_OK)
+ return res;
+
+ while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
+ __NOP();
+ SDIO->IF = SDIO_IF_TRXDONE_Msk;
+
+ return SD_RES_OK;
}
/******************************************************************************************************************************************
-* ��������: SDIO_BlockRead()
-* ����˵��: ��SD����������
-* �� ��: uint32_t block_addr SD�����ַ��ÿ��512�ֽ�
-* uint32_t buff[] ����������
-* �� ��: uint32_t SD_RES_OK �����ɹ� SD_RES_ERR ����ʧ�� SD_RES_TIMEOUT ������ʱ
-* ע������: ��
+* 函数名称: SDIO_BlockRead()
+* 功能说明: 从SD卡读出数据
+* 输 入: uint32_t block_addr SD卡块地址,每块512字节
+* uint32_t buff[] 读出的数据
+* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
+* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_BlockRead(uint32_t block_addr, uint32_t buff[])
{
- uint32_t res, i;
+ uint32_t res, i;
uint32_t addr, resp;
-
- if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
- else addr = block_addr * 512;
-
- res = SDIO_SendCmdWithData(SD_CMD_READ_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 1, 1);
- if(res != SD_RES_OK)
- return res;
-
- while((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0) __NOP();
- SDIO->IF = SDIO_IF_BUFRDRDY_Msk;
-
- for(i = 0; i < 512/4; i++) buff[i] = SDIO->DATA;
-
- while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
- SDIO->IF = SDIO_IF_TRXDONE_Msk;
-
- return SD_RES_OK;
+
+ if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+ addr = block_addr;
+ else
+ addr = block_addr * 512;
+
+ res = SDIO_SendCmdWithData(SD_CMD_READ_SINGLE_BLOCK, addr, SD_RESP_32b, &resp, 1, 1);
+ if (res != SD_RES_OK)
+ return res;
+
+ while ((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0)
+ __NOP();
+ SDIO->IF = SDIO_IF_BUFRDRDY_Msk;
+
+ for (i = 0; i < 512 / 4; i++)
+ buff[i] = SDIO->DATA;
+
+ while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
+ __NOP();
+ SDIO->IF = SDIO_IF_TRXDONE_Msk;
+
+ return SD_RES_OK;
}
/******************************************************************************************************************************************
-* ��������: SDIO_MultiBlockRead()
-* ����˵��: ��SD�������������
-* �� ��: uint32_t block_addr SD�����ַ��ÿ��512�ֽ�
-* uint16_t block_cnt Ҫ�����Ŀ���
-* uint32_t buff[] ����������
-* �� ��: uint32_t SD_RES_OK �����ɹ� SD_RES_ERR ����ʧ�� SD_RES_TIMEOUT ������ʱ
-* ע������: ��
+* 函数名称: SDIO_MultiBlockRead()
+* 功能说明: 从SD卡读出多块数据
+* 输 入: uint32_t block_addr SD卡块地址,每块512字节
+* uint16_t block_cnt 要读出的块数
+* uint32_t buff[] 读出的数据
+* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
+* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[])
{
- uint32_t res, i, j;
+ uint32_t res, i, j;
uint32_t addr, resp;
-
- if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
- else addr = block_addr * 512;
-
- res = SDIO_SendCmdWithData(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt);
- if(res != SD_RES_OK)
- return res;
-
- for(i = 0; i < block_cnt; i++)
- {
- while((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0) __NOP();
- SDIO->IF = SDIO_IF_BUFRDRDY_Msk;
-
- for(j = 0; j < 512/4; j++) buff[i*(512/4) + j] = SDIO->DATA;
- }
-
- while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
- SDIO->IF = SDIO_IF_TRXDONE_Msk;
-
- return SD_RES_OK;
+
+ if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+ addr = block_addr;
+ else
+ addr = block_addr * 512;
+
+ res = SDIO_SendCmdWithData(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt);
+ if (res != SD_RES_OK)
+ return res;
+
+ for (i = 0; i < block_cnt; i++)
+ {
+ while ((SDIO->IF & SDIO_IF_BUFRDRDY_Msk) == 0)
+ __NOP();
+ SDIO->IF = SDIO_IF_BUFRDRDY_Msk;
+
+ for (j = 0; j < 512 / 4; j++)
+ buff[i * (512 / 4) + j] = SDIO->DATA;
+ }
+
+ while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
+ __NOP();
+ SDIO->IF = SDIO_IF_TRXDONE_Msk;
+
+ return SD_RES_OK;
}
/******************************************************************************************************************************************
-* ��������: SDIO_DMABlockRead()
-* ����˵��: ͨ��DMA��SD�������������
-* �� ��: uint32_t block_addr SD�����ַ��ÿ��512�ֽ�
-* uint16_t block_cnt Ҫ�����Ŀ���
-* uint32_t buff[] ����������
-* �� ��: uint32_t SD_RES_OK �����ɹ� SD_RES_ERR ����ʧ�� SD_RES_TIMEOUT ������ʱ
-* ע������: ��
+* 函数名称: SDIO_DMABlockRead()
+* 功能说明: 通过DMA从SD卡读出多块数据
+* 输 入: uint32_t block_addr SD卡块地址,每块512字节
+* uint16_t block_cnt 要读出的块数
+* uint32_t buff[] 读出的数据
+* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
+* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[])
{
- uint32_t res;
+ uint32_t res;
uint32_t addr, resp;
-
- if(SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) addr = block_addr;
- else addr = block_addr * 512;
-
- SDIO->DMA_MEM_ADDR = (uint32_t)buff;
-
- res = SDIO_SendCmdWithDataByDMA(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt);
- if(res != SD_RES_OK)
- return res;
-
- while((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0) __NOP();
- SDIO->IF = SDIO_IF_TRXDONE_Msk;
-
- return SD_RES_OK;
+
+ if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+ addr = block_addr;
+ else
+ addr = block_addr * 512;
+
+ SDIO->DMA_MEM_ADDR = (uint32_t)buff;
+
+ res = SDIO_SendCmdWithDataByDMA(SD_CMD_READ_MULT_BLOCK, addr, SD_RESP_32b, &resp, 1, block_cnt);
+ if (res != SD_RES_OK)
+ return res;
+
+ while ((SDIO->IF & SDIO_IF_TRXDONE_Msk) == 0)
+ __NOP();
+ SDIO->IF = SDIO_IF_TRXDONE_Msk;
+
+ return SD_RES_OK;
}
/******************************************************************************************************************************************
-* ��������: _SDIO_SendCmd()
-* ����˵��: SDIO��SD����������
-* �� ��: uint32_t cmd ��������
-* uint32_t arg �������
-* uint32_t _resp_type ��Ӧ���ͣ�ȡֵSD_RESP_NO��SD_RESP_32b��SD_RESP_128b��SD_RESP_32b_busy
-* uint32_t *resp_data ��Ӧ����
-* uint32_t have_data �Ƿ������ݴ���
-* uint32_t data_read 1 ��SD�� 0 дSD��
-* uint16_t block_cnt ������
-* uint32_t use_dma 1 ʹ��DMA��������
-* �� ��: uint32_t SD_RES_OK �����ɹ� SD_RES_ERR ����ʧ�� SD_RES_TIMEOUT ������ʱ
-* ע������: ��
+* 函数名称: _SDIO_SendCmd()
+* 功能说明: SDIO向SD卡发送命令
+* 输 入: uint32_t cmd 命令索引
+* uint32_t arg 命令参数
+* uint32_t resp_type 响应类型,取值SD_RESP_NO、SD_RESP_32b、SD_RESP_128b、SD_RESP_32b_busy
+* uint32_t *resp_data 响应内容
+* uint32_t have_data 是否有数据传输
+* uint32_t data_read 1 读SD卡 0 写SD卡
+* uint16_t block_cnt 读写块个数
+* uint32_t use_dma 1 使用DMA搬运数据
+* 输 出: uint32_t SD_RES_OK 操作成功 SD_RES_ERR 操作失败 SD_RES_TIMEOUT 操作超时
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t _resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read, uint16_t block_cnt, uint32_t use_dma)
-{
- SDIO->BLK &= ~SDIO_BLK_COUNT_Msk;
- SDIO->BLK |= (block_cnt << SDIO_BLK_COUNT_Pos);
-
- SDIO->ARG = arg;
- SDIO->CMD = (cmd << SDIO_CMD_CMDINDX_Pos) |
- (0 << SDIO_CMD_CMDTYPE_Pos) |
- (0 << SDIO_CMD_IDXCHECK_Pos) |
- (0 << SDIO_CMD_CRCCHECK_Pos) |
- (_resp_type << SDIO_CMD_RESPTYPE_Pos) |
- (have_data << SDIO_CMD_HAVEDATA_Pos) |
- (data_read << SDIO_CMD_DIRREAD_Pos) |
- ((block_cnt > 1) << SDIO_CMD_MULTBLK_Pos) |
- ((block_cnt > 1) << SDIO_CMD_BLKCNTEN_Pos) |
- ((block_cnt > 1) << SDIO_CMD_AUTOCMD12_Pos) |
- (use_dma << SDIO_CMD_DMAEN_Pos);
-
- while((SDIO->IF & SDIO_IF_CMDDONE_Msk) == 0)
- {
- if(SDIO->IF & SDIO_IF_CMDTIMEOUT_Msk)
- {
- SDIO->IF = SDIO_IF_CMDTIMEOUT_Msk;
-
- return SD_RES_TIMEOUT;
- }
- else if(SDIO->IF & SDIO_IF_ERROR_Msk)
- {
- SDIO->IF = 0xFFFFFFFF;
-
- return SD_RES_ERR;
- }
- }
- SDIO->IF = SDIO_IF_CMDDONE_Msk;
-
- if(_resp_type == SD_RESP_32b)
- {
- resp_data[0] = SDIO->RESP[0];
- }
- else if(_resp_type == SD_RESP_128b)
- {
- //�Ĵ����н�CID/CSD[127-8]���δ������RESP3-0[119-0]�����λ��CRC������
- //��������ʱ������˳�򣬽�CID/CSD[127-8]�����resp_data0-3[127-8]�����8λ���0x00
- resp_data[0] = (SDIO->RESP[3] << 8) + ((SDIO->RESP[2] >> 24) & 0xFF);
- resp_data[1] = (SDIO->RESP[2] << 8) + ((SDIO->RESP[1] >> 24) & 0xFF);
- resp_data[2] = (SDIO->RESP[1] << 8) + ((SDIO->RESP[0] >> 24) & 0xFF);
- resp_data[3] = (SDIO->RESP[0] << 8) + 0x00;
- }
-
- return SD_RES_OK;
-}
+uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read, uint16_t block_cnt, uint32_t use_dma)
+{
+ SDIO->BLK &= ~SDIO_BLK_COUNT_Msk;
+ SDIO->BLK |= (block_cnt << SDIO_BLK_COUNT_Pos);
+
+ SDIO->ARG = arg;
+ SDIO->CMD = (cmd << SDIO_CMD_CMDINDX_Pos) |
+ (0 << SDIO_CMD_CMDTYPE_Pos) |
+ (0 << SDIO_CMD_IDXCHECK_Pos) |
+ (0 << SDIO_CMD_CRCCHECK_Pos) |
+ (resp_type << SDIO_CMD_RESPTYPE_Pos) |
+ (have_data << SDIO_CMD_HAVEDATA_Pos) |
+ (data_read << SDIO_CMD_DIRREAD_Pos) |
+ ((block_cnt > 1) << SDIO_CMD_MULTBLK_Pos) |
+ ((block_cnt > 1) << SDIO_CMD_BLKCNTEN_Pos) |
+ ((block_cnt > 1) << SDIO_CMD_AUTOCMD12_Pos) |
+ (use_dma << SDIO_CMD_DMAEN_Pos);
+
+ while ((SDIO->IF & SDIO_IF_CMDDONE_Msk) == 0)
+ {
+ if (SDIO->IF & SDIO_IF_CMDTIMEOUT_Msk)
+ {
+ SDIO->IF = SDIO_IF_CMDTIMEOUT_Msk;
+
+ return SD_RES_TIMEOUT;
+ }
+ else if (SDIO->IF & SDIO_IF_ERROR_Msk)
+ {
+ SDIO->IF = 0xFFFFFFFF;
+
+ return SD_RES_ERR;
+ }
+ }
+ SDIO->IF = SDIO_IF_CMDDONE_Msk;
+ if (resp_type == SD_RESP_32b)
+ {
+ resp_data[0] = SDIO->RESP[0];
+ }
+ else if (resp_type == SD_RESP_128b)
+ {
+ //寄存器中将CID/CSD[127-8]依次存放在了RESP3-0[119-0],最低位的CRC被丢掉
+ //读出数据时调整了顺序,将CID/CSD[127-8]存放在resp_data0-3[127-8],最低8位填充0x00
+ resp_data[0] = (SDIO->RESP[3] << 8) + ((SDIO->RESP[2] >> 24) & 0xFF);
+ resp_data[1] = (SDIO->RESP[2] << 8) + ((SDIO->RESP[1] >> 24) & 0xFF);
+ resp_data[2] = (SDIO->RESP[1] << 8) + ((SDIO->RESP[0] >> 24) & 0xFF);
+ resp_data[3] = (SDIO->RESP[0] << 8) + 0x00;
+ }
+
+ return SD_RES_OK;
+}
void parseCID(uint32_t CID_Tab[4])
{
- uint8_t tmp = 0;
-
- /*!< Byte 0 */
- tmp = (uint8_t)((CID_Tab[0] & 0xFF000000) >> 24);
- SD_cardInfo.SD_cid.ManufacturerID = tmp;
-
- /*!< Byte 1 */
- tmp = (uint8_t)((CID_Tab[0] & 0x00FF0000) >> 16);
- SD_cardInfo.SD_cid.OEM_AppliID = tmp << 8;
-
- /*!< Byte 2 */
- tmp = (uint8_t)((CID_Tab[0] & 0x000000FF00) >> 8);
- SD_cardInfo.SD_cid.OEM_AppliID |= tmp;
-
- /*!< Byte 3 */
- tmp = (uint8_t)(CID_Tab[0] & 0x000000FF);
- SD_cardInfo.SD_cid.ProdName1 = tmp << 24;
-
- /*!< Byte 4 */
- tmp = (uint8_t)((CID_Tab[1] & 0xFF000000) >> 24);
- SD_cardInfo.SD_cid.ProdName1 |= tmp << 16;
-
- /*!< Byte 5 */
- tmp = (uint8_t)((CID_Tab[1] & 0x00FF0000) >> 16);
- SD_cardInfo.SD_cid.ProdName1 |= tmp << 8;
-
- /*!< Byte 6 */
- tmp = (uint8_t)((CID_Tab[1] & 0x0000FF00) >> 8);
- SD_cardInfo.SD_cid.ProdName1 |= tmp;
-
- /*!< Byte 7 */
- tmp = (uint8_t)(CID_Tab[1] & 0x000000FF);
- SD_cardInfo.SD_cid.ProdName2 = tmp;
-
- /*!< Byte 8 */
- tmp = (uint8_t)((CID_Tab[2] & 0xFF000000) >> 24);
- SD_cardInfo.SD_cid.ProdRev = tmp;
-
- /*!< Byte 9 */
- tmp = (uint8_t)((CID_Tab[2] & 0x00FF0000) >> 16);
- SD_cardInfo.SD_cid.ProdSN = tmp << 24;
-
- /*!< Byte 10 */
- tmp = (uint8_t)((CID_Tab[2] & 0x0000FF00) >> 8);
- SD_cardInfo.SD_cid.ProdSN |= tmp << 16;
-
- /*!< Byte 11 */
- tmp = (uint8_t)(CID_Tab[2] & 0x000000FF);
- SD_cardInfo.SD_cid.ProdSN |= tmp << 8;
-
- /*!< Byte 12 */
- tmp = (uint8_t)((CID_Tab[3] & 0xFF000000) >> 24);
- SD_cardInfo.SD_cid.ProdSN |= tmp;
-
- /*!< Byte 13 */
- tmp = (uint8_t)((CID_Tab[3] & 0x00FF0000) >> 16);
- SD_cardInfo.SD_cid.Reserved1 |= (tmp & 0xF0) >> 4;
- SD_cardInfo.SD_cid.ManufactDate = (tmp & 0x0F) << 8;
-
- /*!< Byte 14 */
- tmp = (uint8_t)((CID_Tab[3] & 0x0000FF00) >> 8);
- SD_cardInfo.SD_cid.ManufactDate |= tmp;
+ uint8_t tmp = 0;
+
+ /*!< Byte 0 */
+ tmp = (uint8_t)((CID_Tab[0] & 0xFF000000) >> 24);
+ SD_cardInfo.SD_cid.ManufacturerID = tmp;
+
+ /*!< Byte 1 */
+ tmp = (uint8_t)((CID_Tab[0] & 0x00FF0000) >> 16);
+ SD_cardInfo.SD_cid.OEM_AppliID = tmp << 8;
+
+ /*!< Byte 2 */
+ tmp = (uint8_t)((CID_Tab[0] & 0x000000FF00) >> 8);
+ SD_cardInfo.SD_cid.OEM_AppliID |= tmp;
+
+ /*!< Byte 3 */
+ tmp = (uint8_t)(CID_Tab[0] & 0x000000FF);
+ SD_cardInfo.SD_cid.ProdName1 = tmp << 24;
+
+ /*!< Byte 4 */
+ tmp = (uint8_t)((CID_Tab[1] & 0xFF000000) >> 24);
+ SD_cardInfo.SD_cid.ProdName1 |= tmp << 16;
+
+ /*!< Byte 5 */
+ tmp = (uint8_t)((CID_Tab[1] & 0x00FF0000) >> 16);
+ SD_cardInfo.SD_cid.ProdName1 |= tmp << 8;
+
+ /*!< Byte 6 */
+ tmp = (uint8_t)((CID_Tab[1] & 0x0000FF00) >> 8);
+ SD_cardInfo.SD_cid.ProdName1 |= tmp;
+
+ /*!< Byte 7 */
+ tmp = (uint8_t)(CID_Tab[1] & 0x000000FF);
+ SD_cardInfo.SD_cid.ProdName2 = tmp;
+
+ /*!< Byte 8 */
+ tmp = (uint8_t)((CID_Tab[2] & 0xFF000000) >> 24);
+ SD_cardInfo.SD_cid.ProdRev = tmp;
+
+ /*!< Byte 9 */
+ tmp = (uint8_t)((CID_Tab[2] & 0x00FF0000) >> 16);
+ SD_cardInfo.SD_cid.ProdSN = tmp << 24;
+
+ /*!< Byte 10 */
+ tmp = (uint8_t)((CID_Tab[2] & 0x0000FF00) >> 8);
+ SD_cardInfo.SD_cid.ProdSN |= tmp << 16;
+
+ /*!< Byte 11 */
+ tmp = (uint8_t)(CID_Tab[2] & 0x000000FF);
+ SD_cardInfo.SD_cid.ProdSN |= tmp << 8;
+
+ /*!< Byte 12 */
+ tmp = (uint8_t)((CID_Tab[3] & 0xFF000000) >> 24);
+ SD_cardInfo.SD_cid.ProdSN |= tmp;
+
+ /*!< Byte 13 */
+ tmp = (uint8_t)((CID_Tab[3] & 0x00FF0000) >> 16);
+ SD_cardInfo.SD_cid.Reserved1 |= (tmp & 0xF0) >> 4;
+ SD_cardInfo.SD_cid.ManufactDate = (tmp & 0x0F) << 8;
+
+ /*!< Byte 14 */
+ tmp = (uint8_t)((CID_Tab[3] & 0x0000FF00) >> 8);
+ SD_cardInfo.SD_cid.ManufactDate |= tmp;
}
void parseCSD(uint32_t CSD_Tab[4])
{
- uint8_t tmp = 0;
-
- /*!< Byte 0 */
- tmp = (uint8_t)((CSD_Tab[0] & 0xFF000000) >> 24);
- SD_cardInfo.SD_csd.CSDStruct = (tmp & 0xC0) >> 6;
- SD_cardInfo.SD_csd.SysSpecVersion = (tmp & 0x3C) >> 2;
- SD_cardInfo.SD_csd.Reserved1 = tmp & 0x03;
-
- /*!< Byte 1 */
- tmp = (uint8_t)((CSD_Tab[0] & 0x00FF0000) >> 16);
- SD_cardInfo.SD_csd.TAAC = tmp;
-
- /*!< Byte 2 */
- tmp = (uint8_t)((CSD_Tab[0] & 0x0000FF00) >> 8);
- SD_cardInfo.SD_csd.NSAC = tmp;
-
- /*!< Byte 3 */
- tmp = (uint8_t)(CSD_Tab[0] & 0x000000FF);
- SD_cardInfo.SD_csd.MaxBusClkFrec = tmp;
-
- /*!< Byte 4 */
- tmp = (uint8_t)((CSD_Tab[1] & 0xFF000000) >> 24);
- SD_cardInfo.SD_csd.CardComdClasses = tmp << 4;
-
- /*!< Byte 5 */
- tmp = (uint8_t)((CSD_Tab[1] & 0x00FF0000) >> 16);
- SD_cardInfo.SD_csd.CardComdClasses |= (tmp & 0xF0) >> 4;
- SD_cardInfo.SD_csd.RdBlockLen = tmp & 0x0F;
-
- /*!< Byte 6 */
- tmp = (uint8_t)((CSD_Tab[1] & 0x0000FF00) >> 8);
- SD_cardInfo.SD_csd.PartBlockRead = (tmp & 0x80) >> 7;
- SD_cardInfo.SD_csd.WrBlockMisalign = (tmp & 0x40) >> 6;
- SD_cardInfo.SD_csd.RdBlockMisalign = (tmp & 0x20) >> 5;
- SD_cardInfo.SD_csd.DSRImpl = (tmp & 0x10) >> 4;
- SD_cardInfo.SD_csd.Reserved2 = 0; /*!< Reserved */
-
- if ((SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V1_1) ||
- (SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0))
- {
- SD_cardInfo.SD_csd.DeviceSize = (tmp & 0x03) << 10;
-
- /*!< Byte 7 */
- tmp = (uint8_t)(CSD_Tab[1] & 0x000000FF);
- SD_cardInfo.SD_csd.DeviceSize |= (tmp) << 2;
-
- /*!< Byte 8 */
- tmp = (uint8_t)((CSD_Tab[2] & 0xFF000000) >> 24);
- SD_cardInfo.SD_csd.DeviceSize |= (tmp & 0xC0) >> 6;
-
- SD_cardInfo.SD_csd.MaxRdCurrentVDDMin = (tmp & 0x38) >> 3;
- SD_cardInfo.SD_csd.MaxRdCurrentVDDMax = (tmp & 0x07);
-
- /*!< Byte 9 */
- tmp = (uint8_t)((CSD_Tab[2] & 0x00FF0000) >> 16);
- SD_cardInfo.SD_csd.MaxWrCurrentVDDMin = (tmp & 0xE0) >> 5;
- SD_cardInfo.SD_csd.MaxWrCurrentVDDMax = (tmp & 0x1C) >> 2;
- SD_cardInfo.SD_csd.DeviceSizeMul = (tmp & 0x03) << 1;
- /*!< Byte 10 */
- tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8);
- SD_cardInfo.SD_csd.DeviceSizeMul |= (tmp & 0x80) >> 7;
-
- SD_cardInfo.CardCapacity = (SD_cardInfo.SD_csd.DeviceSize + 1) ;
- SD_cardInfo.CardCapacity *= (1 << (SD_cardInfo.SD_csd.DeviceSizeMul + 2));
- SD_cardInfo.CardBlockSize = 1 << (SD_cardInfo.SD_csd.RdBlockLen);
- SD_cardInfo.CardCapacity *= SD_cardInfo.CardBlockSize;
- }
- else if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
- {
- /*!< Byte 7 */
- tmp = (uint8_t)(CSD_Tab[1] & 0x000000FF);
- SD_cardInfo.SD_csd.DeviceSize = (tmp & 0x3F) << 16;
-
- /*!< Byte 8 */
- tmp = (uint8_t)((CSD_Tab[2] & 0xFF000000) >> 24);
-
- SD_cardInfo.SD_csd.DeviceSize |= (tmp << 8);
-
- /*!< Byte 9 */
- tmp = (uint8_t)((CSD_Tab[2] & 0x00FF0000) >> 16);
-
- SD_cardInfo.SD_csd.DeviceSize |= (tmp);
-
- /*!< Byte 10 */
- tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8);
-
- SD_cardInfo.CardCapacity = (SD_cardInfo.SD_csd.DeviceSize + 1) * 512 * 1024;
- SD_cardInfo.CardBlockSize = 512;
- }
-
- SD_cardInfo.SD_csd.EraseGrSize = (tmp & 0x40) >> 6;
- SD_cardInfo.SD_csd.EraseGrMul = (tmp & 0x3F) << 1;
-
- /*!< Byte 11 */
- tmp = (uint8_t)(CSD_Tab[2] & 0x000000FF);
- SD_cardInfo.SD_csd.EraseGrMul |= (tmp & 0x80) >> 7;
- SD_cardInfo.SD_csd.WrProtectGrSize = (tmp & 0x7F);
-
- /*!< Byte 12 */
- tmp = (uint8_t)((CSD_Tab[3] & 0xFF000000) >> 24);
- SD_cardInfo.SD_csd.WrProtectGrEnable = (tmp & 0x80) >> 7;
- SD_cardInfo.SD_csd.ManDeflECC = (tmp & 0x60) >> 5;
- SD_cardInfo.SD_csd.WrSpeedFact = (tmp & 0x1C) >> 2;
- SD_cardInfo.SD_csd.MaxWrBlockLen = (tmp & 0x03) << 2;
-
- /*!< Byte 13 */
- tmp = (uint8_t)((CSD_Tab[3] & 0x00FF0000) >> 16);
- SD_cardInfo.SD_csd.MaxWrBlockLen |= (tmp & 0xC0) >> 6;
- SD_cardInfo.SD_csd.WriteBlockPaPartial = (tmp & 0x20) >> 5;
- SD_cardInfo.SD_csd.Reserved3 = 0;
- SD_cardInfo.SD_csd.ContentProtectAppli = (tmp & 0x01);
-
- /*!< Byte 14 */
- tmp = (uint8_t)((CSD_Tab[3] & 0x0000FF00) >> 8);
- SD_cardInfo.SD_csd.FileFormatGrouop = (tmp & 0x80) >> 7;
- SD_cardInfo.SD_csd.CopyFlag = (tmp & 0x40) >> 6;
- SD_cardInfo.SD_csd.PermWrProtect = (tmp & 0x20) >> 5;
- SD_cardInfo.SD_csd.TempWrProtect = (tmp & 0x10) >> 4;
- SD_cardInfo.SD_csd.FileFormat = (tmp & 0x0C) >> 2;
- SD_cardInfo.SD_csd.ECC = (tmp & 0x03);
+ uint8_t tmp = 0;
+
+ /*!< Byte 0 */
+ tmp = (uint8_t)((CSD_Tab[0] & 0xFF000000) >> 24);
+ SD_cardInfo.SD_csd.CSDStruct = (tmp & 0xC0) >> 6;
+ SD_cardInfo.SD_csd.SysSpecVersion = (tmp & 0x3C) >> 2;
+ SD_cardInfo.SD_csd.Reserved1 = tmp & 0x03;
+
+ /*!< Byte 1 */
+ tmp = (uint8_t)((CSD_Tab[0] & 0x00FF0000) >> 16);
+ SD_cardInfo.SD_csd.TAAC = tmp;
+
+ /*!< Byte 2 */
+ tmp = (uint8_t)((CSD_Tab[0] & 0x0000FF00) >> 8);
+ SD_cardInfo.SD_csd.NSAC = tmp;
+
+ /*!< Byte 3 */
+ tmp = (uint8_t)(CSD_Tab[0] & 0x000000FF);
+ SD_cardInfo.SD_csd.MaxBusClkFrec = tmp;
+
+ /*!< Byte 4 */
+ tmp = (uint8_t)((CSD_Tab[1] & 0xFF000000) >> 24);
+ SD_cardInfo.SD_csd.CardComdClasses = tmp << 4;
+
+ /*!< Byte 5 */
+ tmp = (uint8_t)((CSD_Tab[1] & 0x00FF0000) >> 16);
+ SD_cardInfo.SD_csd.CardComdClasses |= (tmp & 0xF0) >> 4;
+ SD_cardInfo.SD_csd.RdBlockLen = tmp & 0x0F;
+
+ /*!< Byte 6 */
+ tmp = (uint8_t)((CSD_Tab[1] & 0x0000FF00) >> 8);
+ SD_cardInfo.SD_csd.PartBlockRead = (tmp & 0x80) >> 7;
+ SD_cardInfo.SD_csd.WrBlockMisalign = (tmp & 0x40) >> 6;
+ SD_cardInfo.SD_csd.RdBlockMisalign = (tmp & 0x20) >> 5;
+ SD_cardInfo.SD_csd.DSRImpl = (tmp & 0x10) >> 4;
+ SD_cardInfo.SD_csd.Reserved2 = 0; /*!< Reserved */
+
+ if ((SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V1_1) ||
+ (SD_cardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0))
+ {
+ SD_cardInfo.SD_csd.DeviceSize = (tmp & 0x03) << 10;
+
+ /*!< Byte 7 */
+ tmp = (uint8_t)(CSD_Tab[1] & 0x000000FF);
+ SD_cardInfo.SD_csd.DeviceSize |= (tmp) << 2;
+
+ /*!< Byte 8 */
+ tmp = (uint8_t)((CSD_Tab[2] & 0xFF000000) >> 24);
+ SD_cardInfo.SD_csd.DeviceSize |= (tmp & 0xC0) >> 6;
+
+ SD_cardInfo.SD_csd.MaxRdCurrentVDDMin = (tmp & 0x38) >> 3;
+ SD_cardInfo.SD_csd.MaxRdCurrentVDDMax = (tmp & 0x07);
+
+ /*!< Byte 9 */
+ tmp = (uint8_t)((CSD_Tab[2] & 0x00FF0000) >> 16);
+ SD_cardInfo.SD_csd.MaxWrCurrentVDDMin = (tmp & 0xE0) >> 5;
+ SD_cardInfo.SD_csd.MaxWrCurrentVDDMax = (tmp & 0x1C) >> 2;
+ SD_cardInfo.SD_csd.DeviceSizeMul = (tmp & 0x03) << 1;
+ /*!< Byte 10 */
+ tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8);
+ SD_cardInfo.SD_csd.DeviceSizeMul |= (tmp & 0x80) >> 7;
+
+ SD_cardInfo.CardCapacity = (SD_cardInfo.SD_csd.DeviceSize + 1);
+ SD_cardInfo.CardCapacity *= (1 << (SD_cardInfo.SD_csd.DeviceSizeMul + 2));
+ SD_cardInfo.CardBlockSize = 1 << (SD_cardInfo.SD_csd.RdBlockLen);
+ SD_cardInfo.CardCapacity *= SD_cardInfo.CardBlockSize;
+ }
+ else if (SD_cardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+ {
+ /*!< Byte 7 */
+ tmp = (uint8_t)(CSD_Tab[1] & 0x000000FF);
+ SD_cardInfo.SD_csd.DeviceSize = (tmp & 0x3F) << 16;
+
+ /*!< Byte 8 */
+ tmp = (uint8_t)((CSD_Tab[2] & 0xFF000000) >> 24);
+
+ SD_cardInfo.SD_csd.DeviceSize |= (tmp << 8);
+
+ /*!< Byte 9 */
+ tmp = (uint8_t)((CSD_Tab[2] & 0x00FF0000) >> 16);
+
+ SD_cardInfo.SD_csd.DeviceSize |= (tmp);
+
+ /*!< Byte 10 */
+ tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8);
+
+ SD_cardInfo.CardCapacity = (uint64_t)(SD_cardInfo.SD_csd.DeviceSize + 1) * 512 * 1024;
+ SD_cardInfo.CardBlockSize = 512;
+ }
+
+ SD_cardInfo.SD_csd.EraseGrSize = (tmp & 0x40) >> 6;
+ SD_cardInfo.SD_csd.EraseGrMul = (tmp & 0x3F) << 1;
+
+ /*!< Byte 11 */
+ tmp = (uint8_t)(CSD_Tab[2] & 0x000000FF);
+ SD_cardInfo.SD_csd.EraseGrMul |= (tmp & 0x80) >> 7;
+ SD_cardInfo.SD_csd.WrProtectGrSize = (tmp & 0x7F);
+
+ /*!< Byte 12 */
+ tmp = (uint8_t)((CSD_Tab[3] & 0xFF000000) >> 24);
+ SD_cardInfo.SD_csd.WrProtectGrEnable = (tmp & 0x80) >> 7;
+ SD_cardInfo.SD_csd.ManDeflECC = (tmp & 0x60) >> 5;
+ SD_cardInfo.SD_csd.WrSpeedFact = (tmp & 0x1C) >> 2;
+ SD_cardInfo.SD_csd.MaxWrBlockLen = (tmp & 0x03) << 2;
+
+ /*!< Byte 13 */
+ tmp = (uint8_t)((CSD_Tab[3] & 0x00FF0000) >> 16);
+ SD_cardInfo.SD_csd.MaxWrBlockLen |= (tmp & 0xC0) >> 6;
+ SD_cardInfo.SD_csd.WriteBlockPaPartial = (tmp & 0x20) >> 5;
+ SD_cardInfo.SD_csd.Reserved3 = 0;
+ SD_cardInfo.SD_csd.ContentProtectAppli = (tmp & 0x01);
+
+ /*!< Byte 14 */
+ tmp = (uint8_t)((CSD_Tab[3] & 0x0000FF00) >> 8);
+ SD_cardInfo.SD_csd.FileFormatGrouop = (tmp & 0x80) >> 7;
+ SD_cardInfo.SD_csd.CopyFlag = (tmp & 0x40) >> 6;
+ SD_cardInfo.SD_csd.PermWrProtect = (tmp & 0x20) >> 5;
+ SD_cardInfo.SD_csd.TempWrProtect = (tmp & 0x10) >> 4;
+ SD_cardInfo.SD_csd.FileFormat = (tmp & 0x0C) >> 2;
+ SD_cardInfo.SD_csd.ECC = (tmp & 0x03);
}
uint32_t calcSDCLKDiv(uint32_t freq)
{
- uint32_t prediv = ((SYS->CLKDIV & SYS_CLKDIV_SDIO_Msk) >> SYS_CLKDIV_SDIO_Pos);
- uint32_t clkdiv = (SystemCoreClock / (1 << prediv)) / freq;
- uint32_t regdiv = 0;
-
- if(clkdiv > 128) regdiv = 0x80;
- else if(clkdiv > 64) regdiv = 0x40;
- else if(clkdiv > 32) regdiv = 0x20;
- else if(clkdiv > 16) regdiv = 0x10;
- else if(clkdiv > 8) regdiv = 0x08;
- else if(clkdiv > 4) regdiv = 0x04;
- else if(clkdiv > 2) regdiv = 0x02;
- else if(clkdiv > 1) regdiv = 0x01;
- else regdiv = 0x00;
-
- return regdiv;
+ uint32_t prediv = ((SYS->CLKDIV & SYS_CLKDIV_SDIO_Msk) >> SYS_CLKDIV_SDIO_Pos);
+ uint32_t clkdiv = (SystemCoreClock / (1 << prediv)) / freq;
+ uint32_t regdiv = 0;
+
+ if (clkdiv > 128)
+ regdiv = 0x80;
+ else if (clkdiv > 64)
+ regdiv = 0x40;
+ else if (clkdiv > 32)
+ regdiv = 0x20;
+ else if (clkdiv > 16)
+ regdiv = 0x10;
+ else if (clkdiv > 8)
+ regdiv = 0x08;
+ else if (clkdiv > 4)
+ regdiv = 0x04;
+ else if (clkdiv > 2)
+ regdiv = 0x02;
+ else if (clkdiv > 1)
+ regdiv = 0x01;
+ else
+ regdiv = 0x00;
+
+ return regdiv;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.h
index ece2711ce4..d9834291ac 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdio.h
@@ -1,126 +1,120 @@
#ifndef __SWM320_SDIO_H__
#define __SWM320_SDIO_H__
-
-#define SD_CMD_GO_IDLE_STATE ((uint8_t)0)
-#define SD_CMD_SEND_OP_COND ((uint8_t)1)
-#define SD_CMD_ALL_SEND_CID ((uint8_t)2)
-#define SD_CMD_SET_REL_ADDR ((uint8_t)3)
-#define SD_CMD_SET_DSR ((uint8_t)4)
-#define SD_CMD_HS_SWITCH ((uint8_t)6)
-#define SD_CMD_SEL_DESEL_CARD ((uint8_t)7)
-#define SD_CMD_SEND_IF_COND ((uint8_t)8)
-#define SD_CMD_SEND_CSD ((uint8_t)9)
-#define SD_CMD_SEND_CID ((uint8_t)10)
-#define SD_CMD_STOP_TRANSMISSION ((uint8_t)12)
-#define SD_CMD_SEND_STATUS ((uint8_t)13)
-#define SD_CMD_SET_BLOCKLEN ((uint8_t)16)
-#define SD_CMD_READ_SINGLE_BLOCK ((uint8_t)17)
-#define SD_CMD_READ_MULT_BLOCK ((uint8_t)18)
-#define SD_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24)
-#define SD_CMD_WRITE_MULT_BLOCK ((uint8_t)25)
-#define SD_CMD_PROG_CID ((uint8_t)26)
-#define SD_CMD_PROG_CSD ((uint8_t)27)
-#define SD_CMD_APP_CMD ((uint8_t)55)
+#define SD_CMD_GO_IDLE_STATE ((uint8_t)0)
+#define SD_CMD_SEND_OP_COND ((uint8_t)1)
+#define SD_CMD_ALL_SEND_CID ((uint8_t)2)
+#define SD_CMD_SET_REL_ADDR ((uint8_t)3)
+#define SD_CMD_SET_DSR ((uint8_t)4)
+#define SD_CMD_HS_SWITCH ((uint8_t)6)
+#define SD_CMD_SEL_DESEL_CARD ((uint8_t)7)
+#define SD_CMD_SEND_IF_COND ((uint8_t)8)
+#define SD_CMD_SEND_CSD ((uint8_t)9)
+#define SD_CMD_SEND_CID ((uint8_t)10)
+#define SD_CMD_STOP_TRANSMISSION ((uint8_t)12)
+#define SD_CMD_SEND_STATUS ((uint8_t)13)
+#define SD_CMD_SET_BLOCKLEN ((uint8_t)16)
+#define SD_CMD_READ_SINGLE_BLOCK ((uint8_t)17)
+#define SD_CMD_READ_MULT_BLOCK ((uint8_t)18)
+#define SD_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24)
+#define SD_CMD_WRITE_MULT_BLOCK ((uint8_t)25)
+#define SD_CMD_PROG_CID ((uint8_t)26)
+#define SD_CMD_PROG_CSD ((uint8_t)27)
+#define SD_CMD_APP_CMD ((uint8_t)55)
/*Following commands are SD Card Specific commands.
SDIO_APP_CMD should be sent before sending these commands. */
-#define SD_CMD_APP_SD_SET_BUSWIDTH ((uint8_t)6)
-#define SD_CMD_SD_APP_STAUS ((uint8_t)13)
-#define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22)
-#define SD_CMD_SD_APP_OP_COND ((uint8_t)41)
-#define SD_CMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42)
-#define SD_CMD_SD_APP_SEND_SCR ((uint8_t)51)
-#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52)
-#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53)
-
-
-#define SD_RESP_NO 0 //0 ����Ӧ
-#define SD_RESP_32b 2 //2 32λ��Ӧ
-#define SD_RESP_128b 1 //1 128λ��Ӧ
-#define SD_RESP_32b_busy 3 //3 32λ��Ӧ��check Busy after response
+#define SD_CMD_APP_SD_SET_BUSWIDTH ((uint8_t)6)
+#define SD_CMD_SD_APP_STAUS ((uint8_t)13)
+#define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22)
+#define SD_CMD_SD_APP_OP_COND ((uint8_t)41)
+#define SD_CMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42)
+#define SD_CMD_SD_APP_SEND_SCR ((uint8_t)51)
+#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52)
+#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53)
-#define SD_BUSWIDTH_1b 0
-#define SD_BUSWIDTH_4b 2
+#define SD_RESP_NO 0 //0 无响应
+#define SD_RESP_32b 2 //2 32位响应
+#define SD_RESP_128b 1 //1 128位响应
+#define SD_RESP_32b_busy 3 //3 32位响应,check Busy after response
-#define SD_RES_OK 0
-#define SD_RES_ERR 1
-#define SD_RES_TIMEOUT 2
+#define SD_BUSWIDTH_1b 0
+#define SD_BUSWIDTH_4b 2
+#define SD_RES_OK 0
+#define SD_RES_ERR 1
+#define SD_RES_TIMEOUT 2
typedef struct
{
- __IO uint8_t CSDStruct; // CSD structure
- __IO uint8_t SysSpecVersion; // System specification version
- __IO uint8_t Reserved1; // Reserved
- __IO uint8_t TAAC; // Data read access-time 1
- __IO uint8_t NSAC; // Data read access-time 2 in CLK cycles
- __IO uint8_t MaxBusClkFrec; // Max. bus clock frequency
- __IO uint16_t CardComdClasses; //< Card command classes
- __IO uint8_t RdBlockLen; // Max. read data block length
- __IO uint8_t PartBlockRead; // Partial blocks for read allowed
- __IO uint8_t WrBlockMisalign; // Write block misalignment
- __IO uint8_t RdBlockMisalign; // Read block misalignment
- __IO uint8_t DSRImpl; // DSR implemented
- __IO uint8_t Reserved2; // Reserved
- __IO uint32_t DeviceSize; // Device Size
- __IO uint8_t MaxRdCurrentVDDMin; // Max. read current @ VDD min
- __IO uint8_t MaxRdCurrentVDDMax; // Max. read current @ VDD max
- __IO uint8_t MaxWrCurrentVDDMin; // Max. write current @ VDD min
- __IO uint8_t MaxWrCurrentVDDMax; // Max. write current @ VDD max
- __IO uint8_t DeviceSizeMul; // Device size multiplier
- __IO uint8_t EraseGrSize; // Erase group size
- __IO uint8_t EraseGrMul; // Erase group size multiplier
- __IO uint8_t WrProtectGrSize; // Write protect group size
- __IO uint8_t WrProtectGrEnable; // Write protect group enable
- __IO uint8_t ManDeflECC; // Manufacturer default ECC
- __IO uint8_t WrSpeedFact; // Write speed factor
- __IO uint8_t MaxWrBlockLen; // Max. write data block length
- __IO uint8_t WriteBlockPaPartial; // Partial blocks for write allowed
- __IO uint8_t Reserved3; // Reserded
- __IO uint8_t ContentProtectAppli; // Content protection application
- __IO uint8_t FileFormatGrouop; // File format group
- __IO uint8_t CopyFlag; // Copy flag (OTP)
- __IO uint8_t PermWrProtect; // Permanent write protection
- __IO uint8_t TempWrProtect; // Temporary write protection
- __IO uint8_t FileFormat; // File Format
- __IO uint8_t ECC; // ECC code
+ __IO uint8_t CSDStruct; // CSD structure
+ __IO uint8_t SysSpecVersion; // System specification version
+ __IO uint8_t Reserved1; // Reserved
+ __IO uint8_t TAAC; // Data read access-time 1
+ __IO uint8_t NSAC; // Data read access-time 2 in CLK cycles
+ __IO uint8_t MaxBusClkFrec; // Max. bus clock frequency
+ __IO uint16_t CardComdClasses; //< Card command classes
+ __IO uint8_t RdBlockLen; // Max. read data block length
+ __IO uint8_t PartBlockRead; // Partial blocks for read allowed
+ __IO uint8_t WrBlockMisalign; // Write block misalignment
+ __IO uint8_t RdBlockMisalign; // Read block misalignment
+ __IO uint8_t DSRImpl; // DSR implemented
+ __IO uint8_t Reserved2; // Reserved
+ __IO uint32_t DeviceSize; // Device Size
+ __IO uint8_t MaxRdCurrentVDDMin; // Max. read current @ VDD min
+ __IO uint8_t MaxRdCurrentVDDMax; // Max. read current @ VDD max
+ __IO uint8_t MaxWrCurrentVDDMin; // Max. write current @ VDD min
+ __IO uint8_t MaxWrCurrentVDDMax; // Max. write current @ VDD max
+ __IO uint8_t DeviceSizeMul; // Device size multiplier
+ __IO uint8_t EraseGrSize; // Erase group size
+ __IO uint8_t EraseGrMul; // Erase group size multiplier
+ __IO uint8_t WrProtectGrSize; // Write protect group size
+ __IO uint8_t WrProtectGrEnable; // Write protect group enable
+ __IO uint8_t ManDeflECC; // Manufacturer default ECC
+ __IO uint8_t WrSpeedFact; // Write speed factor
+ __IO uint8_t MaxWrBlockLen; // Max. write data block length
+ __IO uint8_t WriteBlockPaPartial; // Partial blocks for write allowed
+ __IO uint8_t Reserved3; // Reserded
+ __IO uint8_t ContentProtectAppli; // Content protection application
+ __IO uint8_t FileFormatGrouop; // File format group
+ __IO uint8_t CopyFlag; // Copy flag (OTP)
+ __IO uint8_t PermWrProtect; // Permanent write protection
+ __IO uint8_t TempWrProtect; // Temporary write protection
+ __IO uint8_t FileFormat; // File Format
+ __IO uint8_t ECC; // ECC code
} SD_CSD;
typedef struct
{
- __IO uint8_t ManufacturerID; // ManufacturerID
- __IO uint16_t OEM_AppliID; // OEM/Application ID
- __IO uint32_t ProdName1; // Product Name part1
- __IO uint8_t ProdName2; // Product Name part2
- __IO uint8_t ProdRev; // Product Revision
- __IO uint32_t ProdSN; // Product Serial Number
- __IO uint8_t Reserved1; // Reserved1
- __IO uint16_t ManufactDate; // Manufacturing Date
+ __IO uint8_t ManufacturerID; // ManufacturerID
+ __IO uint16_t OEM_AppliID; // OEM/Application ID
+ __IO uint32_t ProdName1; // Product Name part1
+ __IO uint8_t ProdName2; // Product Name part2
+ __IO uint8_t ProdRev; // Product Revision
+ __IO uint32_t ProdSN; // Product Serial Number
+ __IO uint8_t Reserved1; // Reserved1
+ __IO uint16_t ManufactDate; // Manufacturing Date
} SD_CID;
-
-#define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000)
-#define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001)
-#define SDIO_HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002)
-#define SDIO_MULTIMEDIA_CARD ((uint32_t)0x00000003)
-#define SDIO_SECURE_DIGITAL_IO_CARD ((uint32_t)0x00000004)
-#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD ((uint32_t)0x00000005)
-#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006)
-#define SDIO_HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007)
-
+#define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000)
+#define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001)
+#define SDIO_HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002)
+#define SDIO_MULTIMEDIA_CARD ((uint32_t)0x00000003)
+#define SDIO_SECURE_DIGITAL_IO_CARD ((uint32_t)0x00000004)
+#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD ((uint32_t)0x00000005)
+#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006)
+#define SDIO_HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007)
typedef struct
{
- SD_CSD SD_csd;
- SD_CID SD_cid;
- uint64_t CardCapacity; // Card Capacity
- uint32_t CardBlockSize; // Card Block Size
- uint16_t RCA;
- uint8_t CardType;
+ SD_CSD SD_csd;
+ SD_CID SD_cid;
+ uint64_t CardCapacity; // Card Capacity
+ uint32_t CardBlockSize; // Card Block Size
+ uint16_t RCA;
+ uint8_t CardType;
} SD_CardInfo;
-
extern SD_CardInfo SD_cardInfo;
uint32_t SDIO_Init(uint32_t freq);
@@ -133,11 +127,11 @@ uint32_t SDIO_MultiBlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t b
uint32_t SDIO_DMABlockWrite(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]);
uint32_t SDIO_DMABlockRead(uint32_t block_addr, uint16_t block_cnt, uint32_t buff[]);
-uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t _resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read, uint16_t block_cnt, uint32_t use_dma);
+uint32_t _SDIO_SendCmd(uint32_t cmd, uint32_t arg, uint32_t resp_type, uint32_t *resp_data, uint32_t have_data, uint32_t data_read, uint16_t block_cnt, uint32_t use_dma);
-#define SDIO_SendCmd(cmd, arg, _resp_type, resp_data) _SDIO_SendCmd(cmd, arg, _resp_type, resp_data, 0, 0, 0, 0)
-#define SDIO_SendCmdWithData(cmd, arg, _resp_type, resp_data, data_read, block_cnt) _SDIO_SendCmd(cmd, arg, _resp_type, resp_data, 1, data_read, block_cnt, 0)
-#define SDIO_SendCmdWithDataByDMA(cmd, arg, _resp_type, resp_data, data_read, block_cnt) _SDIO_SendCmd(cmd, arg, _resp_type, resp_data, 1, data_read, block_cnt, 1)
+#define SDIO_SendCmd(cmd, arg, resp_type, resp_data) _SDIO_SendCmd(cmd, arg, resp_type, resp_data, 0, 0, 0, 0)
+#define SDIO_SendCmdWithData(cmd, arg, resp_type, resp_data, data_read, block_cnt) _SDIO_SendCmd(cmd, arg, resp_type, resp_data, 1, data_read, block_cnt, 0)
+#define SDIO_SendCmdWithDataByDMA(cmd, arg, resp_type, resp_data, data_read, block_cnt) _SDIO_SendCmd(cmd, arg, resp_type, resp_data, 1, data_read, block_cnt, 1)
void parseCID(uint32_t CID_Tab[4]);
void parseCSD(uint32_t CID_Tab[4]);
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.c
index 246f572eeb..90178f07e8 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_sdram.c
-* ����˵��: SWM320��Ƭ����SDRAM��������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_sdram.c
+* 功能说明: SWM320单片机的SDRAM驱动程序
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -22,82 +22,95 @@
#include "SWM320_sdram.h"
/******************************************************************************************************************************************
-* ��������: SDRAM_Init()
-* ����˵��: SDRAM��������ʼ��
-* �� ��: SDRAM_InitStructure * initStruct ���� SDRAM ����������趨ֵ�Ľṹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: SDRAM_Init()
+* 功能说明: SDRAM控制器初始化
+* 输 入: SDRAM_InitStructure * initStruct 包含 SDRAM 控制器相关设定值的结构体
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SDRAM_Init(SDRAM_InitStructure * initStruct)
+void SDRAM_Init(SDRAM_InitStructure *initStruct)
{
- uint32_t row_n;
-
- SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
-
- SYS->CLKDIV &= ~SYS_CLKDIV_SDRAM_Msk;
- SYS->CLKDIV |= (1 << SYS_CLKDIV_SDRAM_Pos); //2��Ƶ
-
- SDRAMC->CR0 = (2 << SDRAMC_CR0_BURSTLEN_Pos) | //2 Burst LengthΪ4
- (initStruct->CASLatency << SDRAMC_CR0_CASDELAY_Pos);
-
- SDRAMC->CR1 = (initStruct->CellSize << SDRAMC_CR1_CELLSIZE_Pos) |
- (initStruct->CellWidth << SDRAMC_CR1_CELL32BIT_Pos) |
- (initStruct->CellBank << SDRAMC_CR1_BANK_Pos) |
- (0 << SDRAMC_CR1_32BIT_Pos) |
- (initStruct->TimeTMRD << SDRAMC_CR1_TMRD_Pos) |
- (initStruct->TimeTRRD << SDRAMC_CR1_TRRD_Pos) |
- (initStruct->TimeTRAS << SDRAMC_CR1_TRAS_Pos) |
- (initStruct->TimeTRC << SDRAMC_CR1_TRC_Pos) |
- (initStruct->TimeTRCD << SDRAMC_CR1_TRCD_Pos) |
- (initStruct->TimeTRP << SDRAMC_CR1_TRP_Pos);
-
- SDRAMC->LATCH = 0x02;
-
- switch(initStruct->CellSize)
- {
- case SDRAM_CELLSIZE_16Mb: row_n = 11; break;
- case SDRAM_CELLSIZE_64Mb: row_n = 12; break;
- case SDRAM_CELLSIZE_128Mb: row_n = 12; break;
- case SDRAM_CELLSIZE_256Mb: row_n = 13; break;
- default: row_n = 13; break;
- }
-
- SDRAMC->REFRESH = (1 << SDRAMC_REFRESH_EN_Pos) |
- (((SystemCoreClock/2)/1000*64 / (1 << row_n)) << SDRAMC_REFRESH_RATE_Pos);
-
- while(SDRAMC->REFDONE == 0);
+ uint32_t row_n;
+
+ SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
+
+ SYS->CLKDIV &= ~SYS_CLKDIV_SDRAM_Msk;
+ SYS->CLKDIV |= (1 << SYS_CLKDIV_SDRAM_Pos); //2分频
+
+ SDRAMC->CR0 = (2 << SDRAMC_CR0_BURSTLEN_Pos) | //2 Burst Length为4
+ (initStruct->CASLatency << SDRAMC_CR0_CASDELAY_Pos);
+
+ SDRAMC->CR1 = (initStruct->CellSize << SDRAMC_CR1_CELLSIZE_Pos) |
+ (initStruct->CellWidth << SDRAMC_CR1_CELL32BIT_Pos) |
+ (initStruct->CellBank << SDRAMC_CR1_BANK_Pos) |
+ (0 << SDRAMC_CR1_32BIT_Pos) |
+ (initStruct->TimeTMRD << SDRAMC_CR1_TMRD_Pos) |
+ (initStruct->TimeTRRD << SDRAMC_CR1_TRRD_Pos) |
+ (initStruct->TimeTRAS << SDRAMC_CR1_TRAS_Pos) |
+ (initStruct->TimeTRC << SDRAMC_CR1_TRC_Pos) |
+ (initStruct->TimeTRCD << SDRAMC_CR1_TRCD_Pos) |
+ (initStruct->TimeTRP << SDRAMC_CR1_TRP_Pos);
+
+ SDRAMC->LATCH = 0x02;
+
+ switch (initStruct->CellSize)
+ {
+ case SDRAM_CELLSIZE_16Mb:
+ row_n = 11;
+ break;
+ case SDRAM_CELLSIZE_64Mb:
+ row_n = 12;
+ break;
+ case SDRAM_CELLSIZE_128Mb:
+ row_n = 12;
+ break;
+ case SDRAM_CELLSIZE_256Mb:
+ row_n = 13;
+ break;
+ default:
+ row_n = 13;
+ break;
+ }
+
+ SDRAMC->REFRESH = (1 << SDRAMC_REFRESH_EN_Pos) |
+ (((SystemCoreClock / 2) / 1000 * 64 / (1 << row_n)) << SDRAMC_REFRESH_RATE_Pos);
+
+ while (SDRAMC->REFDONE == 0)
+ ;
}
/******************************************************************************************************************************************
-* ��������: SDRAM_Enable()
-* ����˵��: SDRAMʹ�ܣ�ʹ�ܺ�ɶ�дSDRAM
-* �� ��: ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: SDRAM_Enable()
+* 功能说明: SDRAM使能,使能后可读写SDRAM
+* 输 入: 无
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
void SDRAM_Enable(void)
{
- uint32_t i;
-
- SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
- SDRAMC->REFRESH |= (1 << SDRAMC_REFRESH_EN_Pos);
-
- for(i = 0; i < 100; i++) __NOP();
+ uint32_t i;
+
+ SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
+ SDRAMC->REFRESH |= (1 << SDRAMC_REFRESH_EN_Pos);
+
+ for (i = 0; i < 100; i++)
+ __NOP();
}
/******************************************************************************************************************************************
-* ��������: SDRAM_Disable()
-* ����˵��: SDRAM���ܣ����ܺ�SDRAM��������͹���ģʽ������ˢ�£����ɶ�д
-* �� ��: ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: SDRAM_Disable()
+* 功能说明: SDRAM禁能,禁能后SDRAM颗粒进入低功耗模式、并自刷新,不可读写
+* 输 入: 无
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
void SDRAM_Disable(void)
{
- uint32_t i;
-
- SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
- SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
-
- for(i = 0; i < 100; i++) __NOP();
+ uint32_t i;
+
+ SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
+ SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
+
+ for (i = 0; i < 100; i++)
+ __NOP();
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.h
index 5659b3e330..cf8ca88a7c 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sdram.h
@@ -1,80 +1,79 @@
#ifndef __SWM320_SDRAM_H__
#define __SWM320_SDRAM_H__
-typedef struct {
- uint8_t CellSize; // SDRAM������������SDRAM_CELLSIZE_16Mb��SDRAM_CELLSIZE_64Mb��SDRAM_CELLSIZE_128Mb��SDRAM_CELLSIZE_256Mb
- uint8_t CellBank; // SDRAM�������bank��SDRAM_CELLBANK_2��SDRAM_CELLBANK_4
- uint8_t CellWidth; // SDRAM���������SDRAM_CELLWIDTH_16��SDRAM_CELLWIDTH_32
- uint8_t CASLatency; // �е�ַ����Ч������������SDRAM_CASLATENCY_2��SDRAM_CASLATENCY_3
-
- uint8_t TimeTMRD; // MRS to New Command
- uint8_t TimeTRRD; // Activate to activate on different banks
- uint8_t TimeTRAS; // Self refresh time����СSelf-refresh����
- uint8_t TimeTRC; // Row cycle delay��Refresh���Activate�������ʱ��Ҳ����������Refresh�������ʱ
- uint8_t TimeTRCD; // Row to column delay���е�ַ���е�ַ����ʱ��Ҳ��Activate�����д�������ʱ
- uint8_t TimeTRP; // Row precharge delay��Precharge�����һ���������ʱ
-} SDRAM_InitStructure;
-
-#define SDRAM_CELLSIZE_16Mb 3
-#define SDRAM_CELLSIZE_64Mb 0
-#define SDRAM_CELLSIZE_128Mb 1
-#define SDRAM_CELLSIZE_256Mb 2
+typedef struct
+{
+ uint8_t CellSize; // SDRAM颗粒的容量,SDRAM_CELLSIZE_16Mb、SDRAM_CELLSIZE_64Mb、SDRAM_CELLSIZE_128Mb、SDRAM_CELLSIZE_256Mb
+ uint8_t CellBank; // SDRAM颗粒有几个bank,SDRAM_CELLBANK_2、SDRAM_CELLBANK_4
+ uint8_t CellWidth; // SDRAM颗粒的位宽,SDRAM_CELLWIDTH_16、SDRAM_CELLWIDTH_32
+ uint8_t CASLatency; // 列地址到有效数据输出间隔,SDRAM_CASLATENCY_2、SDRAM_CASLATENCY_3
-#define SDRAM_CELLBANK_2 0
-#define SDRAM_CELLBANK_4 1
+ uint8_t TimeTMRD; // MRS to New Command
+ uint8_t TimeTRRD; // Activate to activate on different banks
+ uint8_t TimeTRAS; // Self refresh time,最小Self-refresh周期
+ uint8_t TimeTRC; // Row cycle delay,Refresh命令到Activate命令间延时,也是两个连续Refresh命令间延时
+ uint8_t TimeTRCD; // Row to column delay,行地址到列地址间延时,也即Activate命令到读写命令间延时
+ uint8_t TimeTRP; // Row precharge delay,Precharge命令到另一个命令间延时
+} SDRAM_InitStructure;
-#define SDRAM_CELLWIDTH_16 0
-#define SDRAM_CELLWIDTH_32 1
+#define SDRAM_CELLSIZE_16Mb 3
+#define SDRAM_CELLSIZE_64Mb 0
+#define SDRAM_CELLSIZE_128Mb 1
+#define SDRAM_CELLSIZE_256Mb 2
-#define SDRAM_CASLATENCY_2 2
-#define SDRAM_CASLATENCY_3 3
+#define SDRAM_CELLBANK_2 0
+#define SDRAM_CELLBANK_4 1
-#define SDRAM_TMRD_3 3
-#define SDRAM_TMRD_4 4
-#define SDRAM_TMRD_5 5
-#define SDRAM_TMRD_6 6
-#define SDRAM_TMRD_7 7
+#define SDRAM_CELLWIDTH_16 0
+#define SDRAM_CELLWIDTH_32 1
-#define SDRAM_TRRD_2 2
-#define SDRAM_TRRD_3 3
+#define SDRAM_CASLATENCY_2 2
+#define SDRAM_CASLATENCY_3 3
-#define SDRAM_TRAS_2 2
-#define SDRAM_TRAS_3 3
-#define SDRAM_TRAS_4 4
-#define SDRAM_TRAS_5 5
-#define SDRAM_TRAS_6 6
-#define SDRAM_TRAS_7 7
+#define SDRAM_TMRD_3 3
+#define SDRAM_TMRD_4 4
+#define SDRAM_TMRD_5 5
+#define SDRAM_TMRD_6 6
+#define SDRAM_TMRD_7 7
-#define SDRAM_TRC_2 2
-#define SDRAM_TRC_3 3
-#define SDRAM_TRC_4 4
-#define SDRAM_TRC_5 5
-#define SDRAM_TRC_6 6
-#define SDRAM_TRC_7 7
-#define SDRAM_TRC_8 8
-#define SDRAM_TRC_9 9
-#define SDRAM_TRC_10 10
-#define SDRAM_TRC_11 11
-#define SDRAM_TRC_12 12
-#define SDRAM_TRC_13 13
-#define SDRAM_TRC_14 14
-#define SDRAM_TRC_15 15
+#define SDRAM_TRRD_2 2
+#define SDRAM_TRRD_3 3
-#define SDRAM_TRCD_3 3
-#define SDRAM_TRCD_4 4
-#define SDRAM_TRCD_5 5
-#define SDRAM_TRCD_6 6
-#define SDRAM_TRCD_7 7
+#define SDRAM_TRAS_2 2
+#define SDRAM_TRAS_3 3
+#define SDRAM_TRAS_4 4
+#define SDRAM_TRAS_5 5
+#define SDRAM_TRAS_6 6
+#define SDRAM_TRAS_7 7
-#define SDRAM_TRP_3 3
-#define SDRAM_TRP_4 4
-#define SDRAM_TRP_5 5
-#define SDRAM_TRP_6 6
-#define SDRAM_TRP_7 7
+#define SDRAM_TRC_2 2
+#define SDRAM_TRC_3 3
+#define SDRAM_TRC_4 4
+#define SDRAM_TRC_5 5
+#define SDRAM_TRC_6 6
+#define SDRAM_TRC_7 7
+#define SDRAM_TRC_8 8
+#define SDRAM_TRC_9 9
+#define SDRAM_TRC_10 10
+#define SDRAM_TRC_11 11
+#define SDRAM_TRC_12 12
+#define SDRAM_TRC_13 13
+#define SDRAM_TRC_14 14
+#define SDRAM_TRC_15 15
+#define SDRAM_TRCD_3 3
+#define SDRAM_TRCD_4 4
+#define SDRAM_TRCD_5 5
+#define SDRAM_TRCD_6 6
+#define SDRAM_TRCD_7 7
+#define SDRAM_TRP_3 3
+#define SDRAM_TRP_4 4
+#define SDRAM_TRP_5 5
+#define SDRAM_TRP_6 6
+#define SDRAM_TRP_7 7
-void SDRAM_Init(SDRAM_InitStructure * initStruct);
+void SDRAM_Init(SDRAM_InitStructure *initStruct);
void SDRAM_Enable(void);
void SDRAM_Disable(void);
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.c
index fb38187a3f..f6025a6e86 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_spi.c
-* ����˵��: SWM320��Ƭ����SPI����������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_spi.c
+* 功能说明: SWM320单片机的SPI功能驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,523 +21,523 @@
#include "SWM320.h"
#include "SWM320_spi.h"
-
/******************************************************************************************************************************************
-* ��������: SPI_Init()
-* ����˵��: SPIͬ�����нӿڳ�ʼ��������֡�����趨��ʱ���趨���ٶ��趨���ж��趨��FIFO�����趨
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* SPI_InitStructure * initStruct ����SPI����趨ֵ�Ľṹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_Init()
+* 功能说明: SPI同步串行接口初始化,包括帧长度设定、时序设定、速度设定、中断设定、FIFO触发设定
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* SPI_InitStructure * initStruct 包含SPI相关设定值的结构体
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct)
+void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct)
{
- switch((uint32_t)SPIx)
- {
- case ((uint32_t)SPI0):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_SPI0_Pos);
- break;
+ switch ((uint32_t)SPIx)
+ {
+ case ((uint32_t)SPI0):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_SPI0_Pos);
+ break;
+
+ case ((uint32_t)SPI1):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_SPI0_Pos); //与SPI0使用同一位时钟使能
+ break;
+ }
+
+ SPI_Close(SPIx); //一些关键寄存器只能在SPI关闭时设置
+
+ SPIx->CTRL &= ~(SPI_CTRL_FFS_Msk | SPI_CTRL_CPHA_Msk | SPI_CTRL_CPOL_Msk |
+ SPI_CTRL_SIZE_Msk | SPI_CTRL_MSTR_Msk | SPI_CTRL_CLKDIV_Msk | SPI_CTRL_SSN_H_Msk);
+ SPIx->CTRL |= (initStruct->FrameFormat << SPI_CTRL_FFS_Pos) |
+ (initStruct->SampleEdge << SPI_CTRL_CPHA_Pos) |
+ (initStruct->IdleLevel << SPI_CTRL_CPOL_Pos) |
+ ((initStruct->WordSize - 1) << SPI_CTRL_SIZE_Pos) |
+ (initStruct->Master << SPI_CTRL_MSTR_Pos) |
+ (initStruct->clkDiv << SPI_CTRL_CLKDIV_Pos) |
+ (0 << SPI_CTRL_SSN_H_Pos);
+
+ SPIx->IF = (0x01 << SPI_IF_RFOVF_Pos); //清除中断标志
+ SPIx->IE &= ~(SPI_IE_RFHF_Msk | SPI_IE_TFHF_Msk | SPI_IE_FTC_Msk);
+ SPIx->IE |= (initStruct->RXHFullIEn << SPI_IE_RFHF_Pos) |
+ (initStruct->TXEmptyIEn << SPI_IE_TFHF_Pos) |
+ (initStruct->TXCompleteIEn << SPI_IE_FTC_Pos);
- case ((uint32_t)SPI1):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_SPI0_Pos); //��SPI0ʹ��ͬһλʱ��ʹ��
- break;
- }
-
- SPI_Close(SPIx); //һЩ�ؼ��Ĵ���ֻ����SPI�ر�ʱ����
-
- SPIx->CTRL &= ~(SPI_CTRL_FFS_Msk | SPI_CTRL_CPHA_Msk | SPI_CTRL_CPOL_Msk |
- SPI_CTRL_SIZE_Msk | SPI_CTRL_MSTR_Msk | SPI_CTRL_CLKDIV_Msk | SPI_CTRL_SSN_H_Msk);
- SPIx->CTRL |= (initStruct->FrameFormat << SPI_CTRL_FFS_Pos) |
- (initStruct->SampleEdge << SPI_CTRL_CPHA_Pos) |
- (initStruct->IdleLevel << SPI_CTRL_CPOL_Pos) |
- ((initStruct->WordSize-1) << SPI_CTRL_SIZE_Pos) |
- (initStruct->Master << SPI_CTRL_MSTR_Pos) |
- (initStruct->clkDiv << SPI_CTRL_CLKDIV_Pos) |
- (0 << SPI_CTRL_SSN_H_Pos);
-
- SPIx->IF = (0x01 << SPI_IF_RFOVF_Pos); //����жϱ�־
- SPIx->IE &= ~(SPI_IE_RFHF_Msk | SPI_IE_TFHF_Msk | SPI_IE_FTC_Msk);
- SPIx->IE |= (initStruct->RXHFullIEn << SPI_IE_RFHF_Pos) |
- (initStruct->TXEmptyIEn << SPI_IE_TFHF_Pos) |
- (initStruct->TXCompleteIEn << SPI_IE_FTC_Pos);
-
- switch((uint32_t)SPIx)
- {
- case ((uint32_t)SPI0):
- if(initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn)
- {
- NVIC_EnableIRQ(SPI0_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(SPI0_IRQn);
- }
- break;
-
- case ((uint32_t)SPI1):
- if(initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn)
- {
- NVIC_EnableIRQ(SPI1_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(SPI1_IRQn);
- }
- break;
- }
+ switch ((uint32_t)SPIx)
+ {
+ case ((uint32_t)SPI0):
+ if (initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn)
+ {
+ NVIC_EnableIRQ(SPI0_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(SPI0_IRQn);
+ }
+ break;
+
+ case ((uint32_t)SPI1):
+ if (initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn)
+ {
+ NVIC_EnableIRQ(SPI1_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(SPI1_IRQn);
+ }
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: SPI_Open()
-* ����˵��: SPI�򿪣������շ�
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_Open()
+* 功能说明: SPI打开,允许收发
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_Open(SPI_TypeDef * SPIx)
+void SPI_Open(SPI_TypeDef *SPIx)
{
- SPIx->CTRL |= (0x01 << SPI_CTRL_EN_Pos);
+ SPIx->CTRL |= (0x01 << SPI_CTRL_EN_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_Close()
-* ����˵��: SPI�رգ���ֹ�շ�
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_Close()
+* 功能说明: SPI关闭,禁止收发
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_Close(SPI_TypeDef * SPIx)
+void SPI_Close(SPI_TypeDef *SPIx)
{
- SPIx->CTRL &= ~SPI_CTRL_EN_Msk;
+ SPIx->CTRL &= ~SPI_CTRL_EN_Msk;
}
/******************************************************************************************************************************************
-* ��������: SPI_Read()
-* ����˵��: ��ȡһ������
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: uint32_t ��ȡ��������
-* ע������: ��
+* 函数名称: SPI_Read()
+* 功能说明: 读取一个数据
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: uint32_t 读取到的数据
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t SPI_Read(SPI_TypeDef * SPIx)
+uint32_t SPI_Read(SPI_TypeDef *SPIx)
{
- return SPIx->DATA;
+ return SPIx->DATA;
}
/******************************************************************************************************************************************
-* ��������: SPI_Write()
-* ����˵��: д��һ������
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* uint32_t Ҫд�������
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_Write()
+* 功能说明: 写入一个数据
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* uint32_t 要写入的数据
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_Write(SPI_TypeDef * SPIx, uint32_t data)
+void SPI_Write(SPI_TypeDef *SPIx, uint32_t data)
{
- SPIx->DATA = data;
+ SPIx->DATA = data;
}
/******************************************************************************************************************************************
-* ��������: SPI_WriteWithWait()
-* ����˵��: д��һ�����ݲ��ȴ�������ȫ���ͳ�ȥ
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1��SPI1
-* uint32_t Ҫд�������
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_WriteWithWait()
+* 功能说明: 写入一个数据并等待数据完全发送出去
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1、SPI1
+* uint32_t 要写入的数据
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data)
+void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data)
{
- SPIx->STAT |= (1 << SPI_STAT_WTC_Pos);
-
- SPIx->DATA = data;
-
- while((SPIx->STAT & SPI_STAT_WTC_Msk) == 0);
+ SPIx->STAT |= (1 << SPI_STAT_WTC_Pos);
+
+ SPIx->DATA = data;
+
+ while ((SPIx->STAT & SPI_STAT_WTC_Msk) == 0)
+ ;
}
/******************************************************************************************************************************************
-* ��������: SPI_ReadWrite()
-* ����˵��: ����һ�����ݣ������ط��͹����н��յ���
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* uint32_t data Ҫ���͵�����
-* �� ��: uint32_t ���յ�������
-* ע������: ����ͬһ��SPIģ�飬�˺�����Ӧ��SPI_Write()�����ã���ΪSPI_Write()�����SPI_STAT_RFNE״̬
+* 函数名称: SPI_ReadWrite()
+* 功能说明: 发送一个数据,并返回发送过程中接收到的
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* uint32_t data 要发送的数据
+* 输 出: uint32_t 接收到的数据
+* 注意事项: 对于同一个SPI模块,此函数不应与SPI_Write()混着用,因为SPI_Write()不清除SPI_STAT_RFNE状态
******************************************************************************************************************************************/
-uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data)
+uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data)
{
- SPIx->DATA = data;
- while(!(SPIx->STAT & SPI_STAT_RFNE_Msk));
-
- return SPIx->DATA;
+ SPIx->DATA = data;
+ while (!(SPIx->STAT & SPI_STAT_RFNE_Msk))
+ ;
+
+ return SPIx->DATA;
}
/******************************************************************************************************************************************
-* ��������: SPI_IsRXEmpty()
-* ����˵��: ����FIFO�Ƿ�գ������������Լ���SPI_Read()
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: uint32_t 1 ����FIFO�� 0 ����FIFO�ǿ�
-* ע������: ��
+* 函数名称: SPI_IsRXEmpty()
+* 功能说明: 接收FIFO是否空,如果不空则可以继续SPI_Read()
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: uint32_t 1 接收FIFO空 0 接收FIFO非空
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx)
+uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx)
{
- return (SPIx->STAT & SPI_STAT_RFNE_Msk) ? 0 : 1;
+ return (SPIx->STAT & SPI_STAT_RFNE_Msk) ? 0 : 1;
}
/******************************************************************************************************************************************
-* ��������: SPI_IsTXFull()
-* ����˵��: ����FIFO�Ƿ����������������Լ���SPI_Write()
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: uint32_t 1 ����FIFO�� 0 ����FIFO����
-* ע������: ��
+* 函数名称: SPI_IsTXFull()
+* 功能说明: 发送FIFO是否满,如果不满则可以继续SPI_Write()
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: uint32_t 1 发送FIFO满 0 发送FIFO不满
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx)
+uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx)
{
- return (SPIx->STAT & SPI_STAT_TFNF_Msk) ? 0 : 1;
+ return (SPIx->STAT & SPI_STAT_TFNF_Msk) ? 0 : 1;
}
/******************************************************************************************************************************************
-* ��������: SPI_IsTXEmpty()
-* ����˵��: ����FIFO�Ƿ��
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: uint32_t 1 ����FIFO�� 0 ����FIFO�ǿ�
-* ע������: ��
+* 函数名称: SPI_IsTXEmpty()
+* 功能说明: 发送FIFO是否空
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: uint32_t 1 发送FIFO空 0 发送FIFO非空
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx)
+uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx)
{
- return (SPIx->STAT & SPI_STAT_TFE_Msk) ? 1 : 0;
+ return (SPIx->STAT & SPI_STAT_TFE_Msk) ? 1 : 0;
}
-
/******************************************************************************************************************************************
-* ��������: SPI_INTRXHalfFullEn()
-* ����˵��: ����FIFO�����ж�ʹ��
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTRXHalfFullEn()
+* 功能说明: 接收FIFO半满中断使能
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTRXHalfFullEn(SPI_TypeDef * SPIx)
+void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx)
{
- SPIx->IE |= (0x01 << SPI_IE_RFHF_Pos);
+ SPIx->IE |= (0x01 << SPI_IE_RFHF_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTRXHalfFullDis()
-* ����˵��: ����FIFO�����жϽ�ֹ
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTRXHalfFullDis()
+* 功能说明: 接收FIFO半满中断禁止
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTRXHalfFullDis(SPI_TypeDef * SPIx)
+void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx)
{
- SPIx->IE &= ~(0x01 << SPI_IE_RFHF_Pos);
+ SPIx->IE &= ~(0x01 << SPI_IE_RFHF_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTRXHalfFullClr()
-* ����˵��: ����FIFO�����жϱ�־���
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTRXHalfFullClr()
+* 功能说明: 接收FIFO半满中断标志清除
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTRXHalfFullClr(SPI_TypeDef * SPIx)
+void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx)
{
- SPIx->IF = (1 << SPI_IF_RFHF_Pos);
+ SPIx->IF = (1 << SPI_IF_RFHF_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTRXHalfFullStat()
-* ����˵��: ����FIFO�����ж�״̬
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: uint32_t 1 ����FIFO�ﵽ���� 0 ����FIFOδ�ﵽ����
-* ע������: ��
+* 函数名称: SPI_INTRXHalfFullStat()
+* 功能说明: 接收FIFO半满中断状态
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: uint32_t 1 接收FIFO达到半满 0 接收FIFO未达到半满
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef * SPIx)
+uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx)
{
- return (SPIx->IF & SPI_IF_RFHF_Msk) ? 1 : 0;
+ return (SPIx->IF & SPI_IF_RFHF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: SPI_INTRXFullEn()
-* ����˵��: ����FIFO���ж�ʹ��
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTRXFullEn()
+* 功能说明: 接收FIFO满中断使能
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTRXFullEn(SPI_TypeDef * SPIx)
+void SPI_INTRXFullEn(SPI_TypeDef *SPIx)
{
- SPIx->IE |= (0x01 << SPI_IE_RFF_Pos);
+ SPIx->IE |= (0x01 << SPI_IE_RFF_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTRXFullDis()
-* ����˵��: ����FIFO���жϽ�ֹ
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTRXFullDis()
+* 功能说明: 接收FIFO满中断禁止
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTRXFullDis(SPI_TypeDef * SPIx)
+void SPI_INTRXFullDis(SPI_TypeDef *SPIx)
{
- SPIx->IE &= ~(0x01 << SPI_IE_RFF_Pos);
+ SPIx->IE &= ~(0x01 << SPI_IE_RFF_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTRXFullClr()
-* ����˵��: ����FIFO���жϱ�־���
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTRXFullClr()
+* 功能说明: 接收FIFO满中断标志清除
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTRXFullClr(SPI_TypeDef * SPIx)
+void SPI_INTRXFullClr(SPI_TypeDef *SPIx)
{
- SPIx->IF = (1 << SPI_IF_RFF_Pos);
+ SPIx->IF = (1 << SPI_IF_RFF_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTRXFullStat()
-* ����˵��: ����FIFO���ж�״̬
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: uint32_t 1 ����FIFO�� 0 ����FIFO�
-* ע������: ��
+* 函数名称: SPI_INTRXFullStat()
+* 功能说明: 接收FIFO满中断状态
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: uint32_t 1 接收FIFO满 0 接收FIFO未满
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t SPI_INTRXFullStat(SPI_TypeDef * SPIx)
+uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx)
{
- return (SPIx->IF & SPI_IF_RFF_Msk) ? 1 : 0;
+ return (SPIx->IF & SPI_IF_RFF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: SPI_INTRXOverflowEn()
-* ����˵��: ����FIFO����ж�ʹ��
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTRXOverflowEn()
+* 功能说明: 接收FIFO溢出中断使能
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTRXOverflowEn(SPI_TypeDef * SPIx)
+void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx)
{
- SPIx->IE |= (0x01 << SPI_IE_RFOVF_Pos);
+ SPIx->IE |= (0x01 << SPI_IE_RFOVF_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTRXOverflowDis()
-* ����˵��: ����FIFO����жϽ�ֹ
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTRXOverflowDis()
+* 功能说明: 接收FIFO溢出中断禁止
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTRXOverflowDis(SPI_TypeDef * SPIx)
+void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx)
{
- SPIx->IE &= ~(0x01 << SPI_IE_RFOVF_Pos);
+ SPIx->IE &= ~(0x01 << SPI_IE_RFOVF_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTRXOverflowClr()
-* ����˵��: ����FIFO����жϱ�־���
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTRXOverflowClr()
+* 功能说明: 接收FIFO溢出中断标志清除
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTRXOverflowClr(SPI_TypeDef * SPIx)
+void SPI_INTRXOverflowClr(SPI_TypeDef *SPIx)
{
- SPIx->IF = (0x01 << SPI_IF_RFOVF_Pos);
+ SPIx->IF = (0x01 << SPI_IF_RFOVF_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTRXOverflowStat()
-* ����˵��: ����FIFO����ж�״̬
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: uint32_t 1 ����FIFO��� 0 ����FIFO��
-* ע������: ��
+* 函数名称: SPI_INTRXOverflowStat()
+* 功能说明: 接收FIFO溢出中断状态
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: uint32_t 1 接收FIFO溢出 0 接收FIFO未溢出
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t SPI_INTRXOverflowStat(SPI_TypeDef * SPIx)
+uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx)
{
- return (SPIx->IF & SPI_IF_RFOVF_Msk) ? 1 : 0;
+ return (SPIx->IF & SPI_IF_RFOVF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXHalfFullEn()
-* ����˵��: ����FIFO�����ж�ʹ��
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTTXHalfFullEn()
+* 功能说明: 发送FIFO半满中断使能
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTTXHalfFullEn(SPI_TypeDef * SPIx)
+void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx)
{
- SPIx->IE |= (0x01 << SPI_IE_TFHF_Pos);
+ SPIx->IE |= (0x01 << SPI_IE_TFHF_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXHalfFullDis()
-* ����˵��: ����FIFO�����жϽ�ֹ
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTTXHalfFullDis()
+* 功能说明: 发送FIFO半满中断禁止
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTTXHalfFullDis(SPI_TypeDef * SPIx)
+void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx)
{
- SPIx->IE &= ~(0x01 << SPI_IE_TFHF_Pos);
+ SPIx->IE &= ~(0x01 << SPI_IE_TFHF_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXHalfFullClr()
-* ����˵��: ����FIFO�����жϱ�־���
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTTXHalfFullClr()
+* 功能说明: 发送FIFO半满中断标志清除
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTTXHalfFullClr(SPI_TypeDef * SPIx)
+void SPI_INTTXHalfFullClr(SPI_TypeDef *SPIx)
{
- SPIx->IF = (1 << SPI_IF_TFHF_Pos);
+ SPIx->IF = (1 << SPI_IF_TFHF_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXHalfFullStat()
-* ����˵��: ����FIFO�����ж�״̬
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: uint32_t 1 ����FIFO�ﵽ���� 0 ����FIFOδ�ﵽ����
-* ע������: ��
+* 函数名称: SPI_INTTXHalfFullStat()
+* 功能说明: 发送FIFO半满中断状态
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: uint32_t 1 发送FIFO达到半满 0 发送FIFO未达到半满
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef * SPIx)
+uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx)
{
- return (SPIx->IF & SPI_IF_TFHF_Msk) ? 1 : 0;
+ return (SPIx->IF & SPI_IF_TFHF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXEmptyEn()
-* ����˵��: ����FIFO���ж�ʹ��
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTTXEmptyEn()
+* 功能说明: 发送FIFO空中断使能
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTTXEmptyEn(SPI_TypeDef * SPIx)
+void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx)
{
- SPIx->IE |= (0x01 << SPI_IE_TFE_Pos);
+ SPIx->IE |= (0x01 << SPI_IE_TFE_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXEmptyDis()
-* ����˵��: ����FIFO���жϽ�ֹ
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTTXEmptyDis()
+* 功能说明: 发送FIFO空中断禁止
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTTXEmptyDis(SPI_TypeDef * SPIx)
+void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx)
{
- SPIx->IE &= ~(0x01 << SPI_IE_TFE_Pos);
+ SPIx->IE &= ~(0x01 << SPI_IE_TFE_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXEmptyClr()
-* ����˵��: ����FIFO���жϱ�־���
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTTXEmptyClr()
+* 功能说明: 发送FIFO空中断标志清除
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTTXEmptyClr(SPI_TypeDef * SPIx)
+void SPI_INTTXEmptyClr(SPI_TypeDef *SPIx)
{
- SPIx->IF = (1 << SPI_IF_TFE_Pos);
+ SPIx->IF = (1 << SPI_IF_TFE_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXEmptyStat()
-* ����˵��: ����FIFO���ж�״̬
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: uint32_t 1 ����FIFO�� 0 ����FIFO�ǿ�
-* ע������: ��
+* 函数名称: SPI_INTTXEmptyStat()
+* 功能说明: 发送FIFO空中断状态
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: uint32_t 1 发送FIFO空 0 发送FIFO非空
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t SPI_INTTXEmptyStat(SPI_TypeDef * SPIx)
+uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx)
{
- return (SPIx->IF & SPI_IF_TFE_Msk) ? 1 : 0;
+ return (SPIx->IF & SPI_IF_TFE_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXCompleteEn()
-* ����˵��: ����FIFO���ҷ�����λ�Ĵ������ж�ʹ��
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTTXCompleteEn()
+* 功能说明: 发送FIFO空且发送移位寄存器空中断使能
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTTXCompleteEn(SPI_TypeDef * SPIx)
+void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx)
{
- SPIx->IE |= (0x01 << SPI_IE_FTC_Pos);
+ SPIx->IE |= (0x01 << SPI_IE_FTC_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXCompleteDis()
-* ����˵��: ����FIFO���ҷ�����λ�Ĵ������жϽ�ֹ
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTTXCompleteDis()
+* 功能说明: 发送FIFO空且发送移位寄存器空中断禁止
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTTXCompleteDis(SPI_TypeDef * SPIx)
+void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx)
{
- SPIx->IE &= ~(0x01 << SPI_IE_FTC_Pos);
+ SPIx->IE &= ~(0x01 << SPI_IE_FTC_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXCompleteClr()
-* ����˵��: ����FIFO���ҷ�����λ�Ĵ������ж�״̬���
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTTXCompleteClr()
+* 功能说明: 发送FIFO空且发送移位寄存器空中断状态清除
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTTXCompleteClr(SPI_TypeDef * SPIx)
+void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx)
{
- SPIx->IF = (1 << SPI_IF_FTC_Pos);
+ SPIx->IF = (1 << SPI_IF_FTC_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXCompleteStat()
-* ����˵��: ����FIFO���ҷ�����λ�Ĵ������ж�״̬
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: uint32_t 1 ����FIFO���ҷ�����λ�Ĵ����� 0 ����FIFO������λ�Ĵ����ǿ�
-* ע������: ��
+* 函数名称: SPI_INTTXCompleteStat()
+* 功能说明: 发送FIFO空且发送移位寄存器空中断状态
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: uint32_t 1 发送FIFO空且发送移位寄存器空 0 发送FIFO或发送移位寄存器非空
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t SPI_INTTXCompleteStat(SPI_TypeDef * SPIx)
+uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx)
{
- return (SPIx->IF & SPI_IF_FTC_Msk) ? 1 : 0;
+ return (SPIx->IF & SPI_IF_FTC_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXWordCompleteEn()
-* ����˵��: ����FIFO�ַ�������ж�ʹ��
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTTXWordCompleteEn()
+* 功能说明: 发送FIFO字发送完成中断使能
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTTXWordCompleteEn(SPI_TypeDef * SPIx)
+void SPI_INTTXWordCompleteEn(SPI_TypeDef *SPIx)
{
- SPIx->IE |= (0x01 << SPI_IE_WTC_Pos);
+ SPIx->IE |= (0x01 << SPI_IE_WTC_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXWordCompleteDis()
-* ����˵��: ����FIFO�ַ�������жϽ�ֹ
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTTXWordCompleteDis()
+* 功能说明: 发送FIFO字发送完成中断禁止
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTTXWordCompleteDis(SPI_TypeDef * SPIx)
+void SPI_INTTXWordCompleteDis(SPI_TypeDef *SPIx)
{
- SPIx->IE &= ~(0x01 << SPI_IE_WTC_Pos);
+ SPIx->IE &= ~(0x01 << SPI_IE_WTC_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXWordCompleteClr()
-* ����˵��: ����FIFO�ַ�������жϱ�־���
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: ��
-* ע������: ��
+* 函数名称: SPI_INTTXWordCompleteClr()
+* 功能说明: 发送FIFO字发送完成中断标志清除
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SPI_INTTXWordCompleteClr(SPI_TypeDef * SPIx)
+void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx)
{
- SPIx->IF = (1 << SPI_IF_WTC_Pos);
+ SPIx->IF = (1 << SPI_IF_WTC_Pos);
}
/******************************************************************************************************************************************
-* ��������: SPI_INTTXWordCompleteStat()
-* ����˵��: ����FIFO�ַ�������ж�״̬
-* �� ��: SPI_TypeDef * SPIx ָ��Ҫ�����õ�SPI����Чֵ����SPI0��SPI1
-* �� ��: uint32_t 1 ��������ж��ѷ��� 0 ��������ж�δ����
-* ע������: ��
+* 函数名称: SPI_INTTXWordCompleteStat()
+* 功能说明: 发送FIFO字发送完成中断状态
+* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI,有效值包括SPI0、SPI1
+* 输 出: uint32_t 1 发送完成中断已发生 0 发送完成中断未发生
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef * SPIx)
+uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx)
{
- return (SPIx->IF & SPI_IF_WTC_Msk) ? 1 : 0;
+ return (SPIx->IF & SPI_IF_WTC_Msk) ? 1 : 0;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.h
index 42c4d0cb70..db024d6bca 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.h
@@ -1,83 +1,80 @@
#ifndef __SWM320_SPI_H__
#define __SWM320_SPI_H__
-typedef struct {
- uint8_t FrameFormat; //֡��ʽ��SPI_FORMAT_SPI��SPI_FORMAT_TI_SSI
- uint8_t SampleEdge; //��SPI֡��ʽ�£�ѡ�����ݲ������أ�SPI_FIRST_EDGE��SPI_SECOND_EDGE
- uint8_t IdleLevel; //��SPI֡��ʽ�£�ѡ�����ʱ�������ݴ���ʱ��ʱ���ߵĵ�ƽ��SPI_LOW_LEVEL��SPI_HIGH_LEVEL
- uint8_t WordSize; //�ֳ���, ��Чֵ4-16
- uint8_t Master; //1 ����ģʽ 0 �ӻ�ģʽ
- uint8_t clkDiv; //SPI_CLK = SYS_CLK / clkDiv����Чֵ��SPI_CLKDIV_4��SPI_CLKDIV_8��... ... ��SPI_CLKDIV_512
-
- uint8_t RXHFullIEn; //����FIFO�����ж�ʹ��
- uint8_t TXEmptyIEn; //����FIFO ���ж�ʹ��
- uint8_t TXCompleteIEn; //����FIFO ���ҷ�����λ�Ĵ������ж�ʹ��
-} SPI_InitStructure;
-
-#define SPI_FORMAT_SPI 0 //Motorola SPI ��ʽ
-#define SPI_FORMAT_TI_SSI 1 //TI SSI ��ʽ
-
-#define SPI_FIRST_EDGE 0 //��һ��ʱ���ؿ�ʼ����
-#define SPI_SECOND_EDGE 1 //�ڶ���ʱ���ؿ�ʼ����
+typedef struct
+{
+ uint8_t FrameFormat; //帧格式:SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI
+ uint8_t SampleEdge; //在SPI帧格式下,选择数据采样边沿:SPI_FIRST_EDGE、SPI_SECOND_EDGE
+ uint8_t IdleLevel; //在SPI帧格式下,选择空闲时(无数据传输时)时钟线的电平:SPI_LOW_LEVEL、SPI_HIGH_LEVEL
+ uint8_t WordSize; //字长度, 有效值4-16
+ uint8_t Master; //1 主机模式 0 从机模式
+ uint8_t clkDiv; //SPI_CLK = SYS_CLK / clkDiv,有效值:SPI_CLKDIV_4、SPI_CLKDIV_8、... ... 、SPI_CLKDIV_512
-#define SPI_LOW_LEVEL 0 //����ʱʱ���߱��ֵ͵�ƽ
-#define SPI_HIGH_LEVEL 1 //����ʱʱ���߱��ָߵ�ƽ
-
-#define SPI_CLKDIV_4 0
-#define SPI_CLKDIV_8 1
-#define SPI_CLKDIV_16 2
-#define SPI_CLKDIV_32 3
-#define SPI_CLKDIV_64 4
-#define SPI_CLKDIV_128 5
-#define SPI_CLKDIV_256 6
-#define SPI_CLKDIV_512 7
+ uint8_t RXHFullIEn; //接收FIFO半满中断使能
+ uint8_t TXEmptyIEn; //发送FIFO 空中断使能
+ uint8_t TXCompleteIEn; //发送FIFO 空且发送移位寄存器空中断使能
+} SPI_InitStructure;
+#define SPI_FORMAT_SPI 0 //Motorola SPI 格式
+#define SPI_FORMAT_TI_SSI 1 //TI SSI 格式
+#define SPI_FIRST_EDGE 0 //第一个时钟沿开始采样
+#define SPI_SECOND_EDGE 1 //第二个时钟沿开始采样
-void SPI_Init(SPI_TypeDef * SPIx, SPI_InitStructure * initStruct); //SPI��ʼ��
-void SPI_Open(SPI_TypeDef * SPIx); //SPI�򿪣������շ�
-void SPI_Close(SPI_TypeDef * SPIx); //SPI�رգ���ֹ�շ�
+#define SPI_LOW_LEVEL 0 //空闲时时钟线保持低电平
+#define SPI_HIGH_LEVEL 1 //空闲时时钟线保持高电平
-uint32_t SPI_Read(SPI_TypeDef * SPIx);
-void SPI_Write(SPI_TypeDef * SPIx, uint32_t data);
-void SPI_WriteWithWait(SPI_TypeDef * SPIx, uint32_t data);
-uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data);
+#define SPI_CLKDIV_4 0
+#define SPI_CLKDIV_8 1
+#define SPI_CLKDIV_16 2
+#define SPI_CLKDIV_32 3
+#define SPI_CLKDIV_64 4
+#define SPI_CLKDIV_128 5
+#define SPI_CLKDIV_256 6
+#define SPI_CLKDIV_512 7
-uint32_t SPI_IsRXEmpty(SPI_TypeDef * SPIx); //����FIFO�Ƿ�գ������������Լ���SPI_Read()
-uint32_t SPI_IsTXFull(SPI_TypeDef * SPIx); //����FIFO�Ƿ����������������Լ���SPI_Write()
-uint32_t SPI_IsTXEmpty(SPI_TypeDef * SPIx); //����FIFO�Ƿ��
+void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct); //SPI初始化
+void SPI_Open(SPI_TypeDef *SPIx); //SPI打开,允许收发
+void SPI_Close(SPI_TypeDef *SPIx); //SPI关闭,禁止收发
+uint32_t SPI_Read(SPI_TypeDef *SPIx);
+void SPI_Write(SPI_TypeDef *SPIx, uint32_t data);
+void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data);
+uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data);
-void SPI_INTRXHalfFullEn(SPI_TypeDef * SPIx);
-void SPI_INTRXHalfFullDis(SPI_TypeDef * SPIx);
-void SPI_INTRXHalfFullClr(SPI_TypeDef * SPIx);
-uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef * SPIx);
-void SPI_INTRXFullEn(SPI_TypeDef * SPIx);
-void SPI_INTRXFullDis(SPI_TypeDef * SPIx);
-void SPI_INTRXFullClr(SPI_TypeDef * SPIx);
-uint32_t SPI_INTRXFullStat(SPI_TypeDef * SPIx);
-void SPI_INTRXOverflowEn(SPI_TypeDef * SPIx);
-void SPI_INTRXOverflowDis(SPI_TypeDef * SPIx);
-void SPI_INTRXOverflowClr(SPI_TypeDef * SPIx);
-uint32_t SPI_INTRXOverflowStat(SPI_TypeDef * SPIx);
+uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx); //接收FIFO是否空,如果不空则可以继续SPI_Read()
+uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx); //发送FIFO是否满,如果不满则可以继续SPI_Write()
+uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx); //发送FIFO是否空
-void SPI_INTTXHalfFullEn(SPI_TypeDef * SPIx);
-void SPI_INTTXHalfFullDis(SPI_TypeDef * SPIx);
-void SPI_INTTXHalfFullClr(SPI_TypeDef * SPIx);
-uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef * SPIx);
-void SPI_INTTXEmptyEn(SPI_TypeDef * SPIx);
-void SPI_INTTXEmptyDis(SPI_TypeDef * SPIx);
-void SPI_INTTXEmptyClr(SPI_TypeDef * SPIx);
-uint32_t SPI_INTTXEmptyStat(SPI_TypeDef * SPIx);
-void SPI_INTTXCompleteEn(SPI_TypeDef * SPIx);
-void SPI_INTTXCompleteDis(SPI_TypeDef * SPIx);
-void SPI_INTTXCompleteClr(SPI_TypeDef * SPIx);
-uint32_t SPI_INTTXCompleteStat(SPI_TypeDef * SPIx);
+void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx);
+void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx);
+void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx);
+uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx);
+void SPI_INTRXFullEn(SPI_TypeDef *SPIx);
+void SPI_INTRXFullDis(SPI_TypeDef *SPIx);
+void SPI_INTRXFullClr(SPI_TypeDef *SPIx);
+uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx);
+void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx);
+void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx);
+void SPI_INTRXOverflowClr(SPI_TypeDef *SPIx);
+uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx);
-void SPI_INTTXWordCompleteEn(SPI_TypeDef * SPIx);
-void SPI_INTTXWordCompleteDis(SPI_TypeDef * SPIx);
-void SPI_INTTXWordCompleteClr(SPI_TypeDef * SPIx);
-uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef * SPIx);
+void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx);
+void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx);
+void SPI_INTTXHalfFullClr(SPI_TypeDef *SPIx);
+uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx);
+void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx);
+void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx);
+void SPI_INTTXEmptyClr(SPI_TypeDef *SPIx);
+uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx);
+void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx);
+void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx);
+void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx);
+uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx);
+void SPI_INTTXWordCompleteEn(SPI_TypeDef *SPIx);
+void SPI_INTTXWordCompleteDis(SPI_TypeDef *SPIx);
+void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx);
+uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx);
#endif //__SWM320_SPI_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.c
index d1f421aaba..2818f5a8c1 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_sram.c
-* ����˵��: SWM320��Ƭ����SRAM��������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_sram.c
+* 功能说明: SWM320单片机的SRAM驱动程序
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,33 +21,36 @@
#include "SWM320.h"
#include "SWM320_sram.h"
-
/******************************************************************************************************************************************
-* ��������: SRAM_Init()
-* ����˵��: SRAM��������ʼ��
-* �� ��: SRAM_InitStructure * initStruct ���� SRAM ����������趨ֵ�Ľṹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: SRAM_Init()
+* 功能说明: SRAM控制器初始化
+* 输 入: SRAM_InitStructure * initStruct 包含 SRAM 控制器相关设定值的结构体
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void SRAM_Init(SRAM_InitStructure * initStruct)
+void SRAM_Init(SRAM_InitStructure *initStruct)
{
- uint32_t i;
-
- // ����SRAMǰ��Ҫˢ����SDRAM������
- do {
- SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
-
- while(SDRAMC->REFDONE == 0);
- SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
-
- for(i = 0; i < 1000; i++) __NOP();
- SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
- } while(0);
-
- SYS->CLKEN |= (1 << SYS_CLKEN_RAMC_Pos);
- for(i = 0; i < 10; i++) __NOP();
-
- SRAMC->CR = (initStruct->ClkDiv << SRAMC_CR_RWTIME_Pos) |
- (initStruct->DataWidth << SRAMC_CR_BYTEIF_Pos) |
- (0 << SRAMC_CR_HBLBDIS_Pos); // ʹ���ֽڡ����ַ���
+ uint32_t i;
+
+ // 配置SRAM前需要刷新下SDRAM控制器
+ do
+ {
+ SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos);
+
+ while (SDRAMC->REFDONE == 0)
+ ;
+ SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos);
+
+ for (i = 0; i < 1000; i++)
+ __NOP();
+ SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos);
+ } while (0);
+
+ SYS->CLKEN |= (1 << SYS_CLKEN_RAMC_Pos);
+ for (i = 0; i < 10; i++)
+ __NOP();
+
+ SRAMC->CR = (initStruct->ClkDiv << SRAMC_CR_RWTIME_Pos) |
+ (initStruct->DataWidth << SRAMC_CR_BYTEIF_Pos) |
+ (0 << SRAMC_CR_HBLBDIS_Pos); // 使能字节、半字访问
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.h
index 2ef71b24ba..ca3aa92dcc 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_sram.h
@@ -1,31 +1,29 @@
#ifndef __SWM320_SRAM_H__
#define __SWM320_SRAM_H__
-typedef struct {
- uint8_t ClkDiv; //SRAM_CLKDIV_5...SRAM_CLKDIV_16������SRAMоƬ�����ܵ����Ƶ��ѡ����ʷ�Ƶ
- uint8_t DataWidth; //SRAM_DATAWIDTH_8��SRAM_DATAWIDTH_16
+typedef struct
+{
+ uint8_t ClkDiv; //SRAM_CLKDIV_5...SRAM_CLKDIV_16,根据SRAM芯片所能跑的最高频率选择合适分频
+ uint8_t DataWidth; //SRAM_DATAWIDTH_8、SRAM_DATAWIDTH_16
} SRAM_InitStructure;
+#define SRAM_CLKDIV_4 3
+#define SRAM_CLKDIV_5 4
+#define SRAM_CLKDIV_6 5
+#define SRAM_CLKDIV_7 6
+#define SRAM_CLKDIV_8 7
+#define SRAM_CLKDIV_9 8
+#define SRAM_CLKDIV_10 9
+#define SRAM_CLKDIV_11 10
+#define SRAM_CLKDIV_12 11
+#define SRAM_CLKDIV_13 12
+#define SRAM_CLKDIV_14 13
+#define SRAM_CLKDIV_15 14
+#define SRAM_CLKDIV_16 15
-#define SRAM_CLKDIV_4 3
-#define SRAM_CLKDIV_5 4
-#define SRAM_CLKDIV_6 5
-#define SRAM_CLKDIV_7 6
-#define SRAM_CLKDIV_8 7
-#define SRAM_CLKDIV_9 8
-#define SRAM_CLKDIV_10 9
-#define SRAM_CLKDIV_11 10
-#define SRAM_CLKDIV_12 11
-#define SRAM_CLKDIV_13 12
-#define SRAM_CLKDIV_14 13
-#define SRAM_CLKDIV_15 14
-#define SRAM_CLKDIV_16 15
-
-#define SRAM_DATAWIDTH_8 1
-#define SRAM_DATAWIDTH_16 0
-
-
-void SRAM_Init(SRAM_InitStructure * initStruct);
+#define SRAM_DATAWIDTH_8 1
+#define SRAM_DATAWIDTH_16 0
+void SRAM_Init(SRAM_InitStructure *initStruct);
#endif //__SWM320_SRAM_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.c
index d4cbe03238..1451037f0c 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_timr.c
-* ����˵��: SWM320��Ƭ���ļ�����/��ʱ������������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_timr.c
+* 功能说明: SWM320单片机的计数器/定时器功能驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,416 +21,421 @@
#include "SWM320.h"
#include "SWM320_timr.h"
-
/******************************************************************************************************************************************
-* ��������: TIMR_Init()
-* ����˵��: TIMR��ʱ��/��������ʼ��
-* �� ��: TIMR_TypeDef * TIMRx ָ��Ҫ�����õĶ�ʱ������Чֵ����TIMR0��TIMR1��TIMR2��TIMR3��TIMR4��TIMR5
-* uint32_t mode TIMR_MODE_TIMER ��ʱ��ģʽ TIMR_MODE_COUNTER ������ģʽ
-* uint32_t period ��ʱ/��������
-* uint32_t int_en �ж�ʹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: TIMR_Init()
+* 功能说明: TIMR定时器/计数器初始化
+* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,有效值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
+* uint32_t mode TIMR_MODE_TIMER 定时器模式 TIMR_MODE_COUNTER 计数器模式
+* uint32_t period 定时/计数周期
+* uint32_t int_en 中断使能
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t int_en)
+void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int_en)
{
- SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
-
- TIMR_Stop(TIMRx); //һЩ�ؼ��Ĵ���ֻ���ڶ�ʱ��ֹͣʱ����
-
- TIMRx->CTRL &= ~TIMR_CTRL_CLKSRC_Msk;
- TIMRx->CTRL |= mode << TIMR_CTRL_CLKSRC_Pos;
-
- TIMRx->LDVAL = period;
-
- switch((uint32_t)TIMRx)
- {
- case ((uint32_t)TIMR0):
- TIMRG->IF = (1 << TIMRG_IF_TIMR0_Pos); //ʹ���ж�ǰ����жϱ�־
- TIMRG->IE &= ~TIMRG_IE_TIMR0_Msk;
- TIMRG->IE |= (int_en << TIMRG_IE_TIMR0_Pos);
-
- if(int_en) NVIC_EnableIRQ(TIMR0_IRQn);
- break;
-
- case ((uint32_t)TIMR1):
- TIMRG->IF = (1 << TIMRG_IF_TIMR1_Pos);
- TIMRG->IE &= ~TIMRG_IE_TIMR1_Msk;
- TIMRG->IE |= (int_en << TIMRG_IE_TIMR1_Pos);
-
- if(int_en) NVIC_EnableIRQ(TIMR1_IRQn);
- break;
-
- case ((uint32_t)TIMR2):
- TIMRG->IF = (1 << TIMRG_IF_TIMR2_Pos);
- TIMRG->IE &= ~TIMRG_IE_TIMR2_Msk;
- TIMRG->IE |= (int_en << TIMRG_IE_TIMR2_Pos);
-
- if(int_en) NVIC_EnableIRQ(TIMR2_IRQn);
- break;
-
- case ((uint32_t)TIMR3):
- TIMRG->IF = (1 << TIMRG_IF_TIMR3_Pos);
- TIMRG->IE &= ~TIMRG_IE_TIMR3_Msk;
- TIMRG->IE |= (int_en << TIMRG_IE_TIMR3_Pos);
-
- if(int_en) NVIC_EnableIRQ(TIMR3_IRQn);
- break;
-
- case ((uint32_t)TIMR4):
- TIMRG->IF = (1 << TIMRG_IF_TIMR4_Pos);
- TIMRG->IE &= ~TIMRG_IE_TIMR4_Msk;
- TIMRG->IE |= (int_en << TIMRG_IE_TIMR4_Pos);
-
- if(int_en) NVIC_EnableIRQ(TIMR4_IRQn);
- break;
-
- case ((uint32_t)TIMR5):
- TIMRG->IF = (1 << TIMRG_IF_TIMR5_Pos);
- TIMRG->IE &= ~TIMRG_IE_TIMR5_Msk;
- TIMRG->IE |= (int_en << TIMRG_IE_TIMR5_Pos);
-
- if(int_en) NVIC_EnableIRQ(TIMR5_IRQn);
- break;
- }
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
+
+ TIMR_Stop(TIMRx); //一些关键寄存器只能在定时器停止时设置
+
+ TIMRx->CTRL &= ~TIMR_CTRL_CLKSRC_Msk;
+ TIMRx->CTRL |= mode << TIMR_CTRL_CLKSRC_Pos;
+
+ TIMRx->LDVAL = period;
+
+ switch ((uint32_t)TIMRx)
+ {
+ case ((uint32_t)TIMR0):
+ TIMRG->IF = (1 << TIMRG_IF_TIMR0_Pos); //使能中断前清除中断标志
+ TIMRG->IE &= ~TIMRG_IE_TIMR0_Msk;
+ TIMRG->IE |= (int_en << TIMRG_IE_TIMR0_Pos);
+
+ if (int_en)
+ NVIC_EnableIRQ(TIMR0_IRQn);
+ break;
+
+ case ((uint32_t)TIMR1):
+ TIMRG->IF = (1 << TIMRG_IF_TIMR1_Pos);
+ TIMRG->IE &= ~TIMRG_IE_TIMR1_Msk;
+ TIMRG->IE |= (int_en << TIMRG_IE_TIMR1_Pos);
+
+ if (int_en)
+ NVIC_EnableIRQ(TIMR1_IRQn);
+ break;
+
+ case ((uint32_t)TIMR2):
+ TIMRG->IF = (1 << TIMRG_IF_TIMR2_Pos);
+ TIMRG->IE &= ~TIMRG_IE_TIMR2_Msk;
+ TIMRG->IE |= (int_en << TIMRG_IE_TIMR2_Pos);
+
+ if (int_en)
+ NVIC_EnableIRQ(TIMR2_IRQn);
+ break;
+
+ case ((uint32_t)TIMR3):
+ TIMRG->IF = (1 << TIMRG_IF_TIMR3_Pos);
+ TIMRG->IE &= ~TIMRG_IE_TIMR3_Msk;
+ TIMRG->IE |= (int_en << TIMRG_IE_TIMR3_Pos);
+
+ if (int_en)
+ NVIC_EnableIRQ(TIMR3_IRQn);
+ break;
+
+ case ((uint32_t)TIMR4):
+ TIMRG->IF = (1 << TIMRG_IF_TIMR4_Pos);
+ TIMRG->IE &= ~TIMRG_IE_TIMR4_Msk;
+ TIMRG->IE |= (int_en << TIMRG_IE_TIMR4_Pos);
+
+ if (int_en)
+ NVIC_EnableIRQ(TIMR4_IRQn);
+ break;
+
+ case ((uint32_t)TIMR5):
+ TIMRG->IF = (1 << TIMRG_IF_TIMR5_Pos);
+ TIMRG->IE &= ~TIMRG_IE_TIMR5_Msk;
+ TIMRG->IE |= (int_en << TIMRG_IE_TIMR5_Pos);
+
+ if (int_en)
+ NVIC_EnableIRQ(TIMR5_IRQn);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: TIMR_Start()
-* ����˵��: ������ʱ�����ӳ�ʼֵ��ʼ��ʱ/����
-* �� ��: TIMR_TypeDef * TIMRx ָ��Ҫ�����õĶ�ʱ������ȡֵ����TIMR0��TIMR1��TIMR2��TIMR3��TIMR4��TIMR5
-* �� ��: ��
-* ע������: ��
+* 函数名称: TIMR_Start()
+* 功能说明: 启动定时器,从初始值开始计时/计数
+* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void TIMR_Start(TIMR_TypeDef * TIMRx)
+void TIMR_Start(TIMR_TypeDef *TIMRx)
{
- TIMRx->CTRL |= TIMR_CTRL_EN_Msk;
+ TIMRx->CTRL |= TIMR_CTRL_EN_Msk;
}
/******************************************************************************************************************************************
-* ��������: TIMR_Stop()
-* ����˵��: ֹͣ��ʱ��
-* �� ��: TIMR_TypeDef * TIMRx ָ��Ҫ�����õĶ�ʱ������ȡֵ����TIMR0��TIMR1��TIMR2��TIMR3��TIMR4��TIMR5
-* �� ��: ��
-* ע������: ��
+* 函数名称: TIMR_Stop()
+* 功能说明: 停止定时器
+* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void TIMR_Stop(TIMR_TypeDef * TIMRx)
+void TIMR_Stop(TIMR_TypeDef *TIMRx)
{
- TIMRx->CTRL &= ~TIMR_CTRL_EN_Msk;
+ TIMRx->CTRL &= ~TIMR_CTRL_EN_Msk;
}
/******************************************************************************************************************************************
-* ��������: TIMR_Halt()
-* ����˵��: ��ͣ��ʱ��������ֵ���ֲ���
-* �� ��: TIMR_TypeDef * TIMRx ָ��Ҫ�����õĶ�ʱ������ȡֵ����TIMR0��TIMR1��TIMR2��TIMR3��TIMR4��TIMR5
-* �� ��: ��
-* ע������: ��
+* 函数名称: TIMR_Halt()
+* 功能说明: 暂停定时器,计数值保持不变
+* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void TIMR_Halt(TIMR_TypeDef * TIMRx)
+void TIMR_Halt(TIMR_TypeDef *TIMRx)
{
- switch((uint32_t)TIMRx)
- {
- case ((uint32_t)TIMR0):
- TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR0_Pos);
- break;
-
- case ((uint32_t)TIMR1):
- TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR1_Pos);
- break;
-
- case ((uint32_t)TIMR2):
- TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR2_Pos);
- break;
-
- case ((uint32_t)TIMR3):
- TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR3_Pos);
- break;
-
- case ((uint32_t)TIMR4):
- TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR4_Pos);
- break;
-
- case ((uint32_t)TIMR5):
- TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR5_Pos);
- break;
- }
+ switch ((uint32_t)TIMRx)
+ {
+ case ((uint32_t)TIMR0):
+ TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR0_Pos);
+ break;
+
+ case ((uint32_t)TIMR1):
+ TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR1_Pos);
+ break;
+
+ case ((uint32_t)TIMR2):
+ TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR2_Pos);
+ break;
+
+ case ((uint32_t)TIMR3):
+ TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR3_Pos);
+ break;
+
+ case ((uint32_t)TIMR4):
+ TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR4_Pos);
+ break;
+
+ case ((uint32_t)TIMR5):
+ TIMRG->HALT |= (0x01 << TIMRG_HALT_TIMR5_Pos);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: TIMR_Resume()
-* ����˵��: �ָ���ʱ��������ͣ����������
-* �� ��: TIMR_TypeDef * TIMRx ָ��Ҫ�����õĶ�ʱ������ȡֵ����TIMR0��TIMR1��TIMR2��TIMR3��TIMR4��TIMR5
-* �� ��: ��
-* ע������: ��
+* 函数名称: TIMR_Resume()
+* 功能说明: 恢复定时器,从暂停处继续计数
+* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void TIMR_Resume(TIMR_TypeDef * TIMRx)
+void TIMR_Resume(TIMR_TypeDef *TIMRx)
{
- switch((uint32_t)TIMRx)
- {
- case ((uint32_t)TIMR0):
- TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR0_Pos);
- break;
-
- case ((uint32_t)TIMR1):
- TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR1_Pos);
- break;
-
- case ((uint32_t)TIMR2):
- TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR2_Pos);
- break;
-
- case ((uint32_t)TIMR3):
- TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR3_Pos);
- break;
-
- case ((uint32_t)TIMR4):
- TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR4_Pos);
- break;
-
- case ((uint32_t)TIMR5):
- TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR5_Pos);
- break;
- }
+ switch ((uint32_t)TIMRx)
+ {
+ case ((uint32_t)TIMR0):
+ TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR0_Pos);
+ break;
+
+ case ((uint32_t)TIMR1):
+ TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR1_Pos);
+ break;
+
+ case ((uint32_t)TIMR2):
+ TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR2_Pos);
+ break;
+
+ case ((uint32_t)TIMR3):
+ TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR3_Pos);
+ break;
+
+ case ((uint32_t)TIMR4):
+ TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR4_Pos);
+ break;
+
+ case ((uint32_t)TIMR5):
+ TIMRG->HALT &= ~(0x01 << TIMRG_HALT_TIMR5_Pos);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: TIMR_SetPeriod()
-* ����˵��: ���ö�ʱ/��������
-* �� ��: TIMR_TypeDef * TIMRx ָ��Ҫ�����õĶ�ʱ������ȡֵ����TIMR0��TIMR1��TIMR2��TIMR3��TIMR4��TIMR5
-* uint32_t period ��ʱ/��������
-* �� ��: ��
-* ע������: ��
+* 函数名称: TIMR_SetPeriod()
+* 功能说明: 设置定时/计数周期
+* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
+* uint32_t period 定时/计数周期
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period)
+void TIMR_SetPeriod(TIMR_TypeDef *TIMRx, uint32_t period)
{
- TIMRx->LDVAL = period;
+ TIMRx->LDVAL = period;
}
/******************************************************************************************************************************************
-* ��������: TIMR_GetPeriod()
-* ����˵��: ��ȡ��ʱ/��������
-* �� ��: TIMR_TypeDef * TIMRx ָ��Ҫ�����õĶ�ʱ������ȡֵ����TIMR0��TIMR1��TIMR2��TIMR3��TIMR4��TIMR5
-* �� ��: uint32_t ��ǰ��ʱ/��������
-* ע������: ��
+* 函数名称: TIMR_GetPeriod()
+* 功能说明: 获取定时/计数周期
+* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
+* 输 出: uint32_t 当前定时/计数周期
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx)
+uint32_t TIMR_GetPeriod(TIMR_TypeDef *TIMRx)
{
- return TIMRx->LDVAL;
+ return TIMRx->LDVAL;
}
/******************************************************************************************************************************************
-* ��������: TIMR_GetCurValue()
-* ����˵��: ��ȡ��ǰ����ֵ
-* �� ��: TIMR_TypeDef * TIMRx ָ��Ҫ�����õĶ�ʱ������ȡֵ����TIMR0��TIMR1��TIMR2��TIMR3��TIMR4��TIMR5
-* �� ��: uint32_t ��ǰ����ֵ
-* ע������: ��
+* 函数名称: TIMR_GetCurValue()
+* 功能说明: 获取当前计数值
+* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
+* 输 出: uint32_t 当前计数值
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx)
+uint32_t TIMR_GetCurValue(TIMR_TypeDef *TIMRx)
{
- return TIMRx->CVAL;
+ return TIMRx->CVAL;
}
/******************************************************************************************************************************************
-* ��������: TIMR_INTEn()
-* ����˵��: ʹ���ж�
-* �� ��: TIMR_TypeDef * TIMRx ָ��Ҫ�����õĶ�ʱ������ȡֵ����TIMR0��TIMR1��TIMR2��TIMR3��TIMR4��TIMR5
-* �� ��: ��
-* ע������: ��
+* 函数名称: TIMR_INTEn()
+* 功能说明: 使能中断
+* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void TIMR_INTEn(TIMR_TypeDef * TIMRx)
+void TIMR_INTEn(TIMR_TypeDef *TIMRx)
{
- switch((uint32_t)TIMRx)
- {
- case ((uint32_t)TIMR0):
- TIMRG->IE |= (0x01 << TIMRG_IE_TIMR0_Pos);
- NVIC_EnableIRQ(TIMR0_IRQn);
- break;
-
- case ((uint32_t)TIMR1):
- TIMRG->IE |= (0x01 << TIMRG_IE_TIMR1_Pos);
- NVIC_EnableIRQ(TIMR1_IRQn);
- break;
-
- case ((uint32_t)TIMR2):
- TIMRG->IE |= (0x01 << TIMRG_IE_TIMR2_Pos);
- NVIC_EnableIRQ(TIMR2_IRQn);
- break;
-
- case ((uint32_t)TIMR3):
- TIMRG->IE |= (0x01 << TIMRG_IE_TIMR3_Pos);
- NVIC_EnableIRQ(TIMR3_IRQn);
- break;
-
- case ((uint32_t)TIMR4):
- TIMRG->IE |= (0x01 << TIMRG_IE_TIMR4_Pos);
- NVIC_EnableIRQ(TIMR4_IRQn);
- break;
-
- case ((uint32_t)TIMR5):
- TIMRG->IE |= (0x01 << TIMRG_IE_TIMR5_Pos);
- NVIC_EnableIRQ(TIMR5_IRQn);
- break;
- }
+ switch ((uint32_t)TIMRx)
+ {
+ case ((uint32_t)TIMR0):
+ TIMRG->IE |= (0x01 << TIMRG_IE_TIMR0_Pos);
+ NVIC_EnableIRQ(TIMR0_IRQn);
+ break;
+
+ case ((uint32_t)TIMR1):
+ TIMRG->IE |= (0x01 << TIMRG_IE_TIMR1_Pos);
+ NVIC_EnableIRQ(TIMR1_IRQn);
+ break;
+
+ case ((uint32_t)TIMR2):
+ TIMRG->IE |= (0x01 << TIMRG_IE_TIMR2_Pos);
+ NVIC_EnableIRQ(TIMR2_IRQn);
+ break;
+
+ case ((uint32_t)TIMR3):
+ TIMRG->IE |= (0x01 << TIMRG_IE_TIMR3_Pos);
+ NVIC_EnableIRQ(TIMR3_IRQn);
+ break;
+
+ case ((uint32_t)TIMR4):
+ TIMRG->IE |= (0x01 << TIMRG_IE_TIMR4_Pos);
+ NVIC_EnableIRQ(TIMR4_IRQn);
+ break;
+
+ case ((uint32_t)TIMR5):
+ TIMRG->IE |= (0x01 << TIMRG_IE_TIMR5_Pos);
+ NVIC_EnableIRQ(TIMR5_IRQn);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: TIMR_INTDis()
-* ����˵��: �����ж�
-* �� ��: TIMR_TypeDef * TIMRx ָ��Ҫ�����õĶ�ʱ������ȡֵ����TIMR0��TIMR1��TIMR2��TIMR3��TIMR4��TIMR5
-* �� ��: ��
-* ע������: ��
+* 函数名称: TIMR_INTDis()
+* 功能说明: 禁能中断
+* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void TIMR_INTDis(TIMR_TypeDef * TIMRx)
+void TIMR_INTDis(TIMR_TypeDef *TIMRx)
{
- switch((uint32_t)TIMRx)
- {
- case ((uint32_t)TIMR0):
- TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR0_Pos);
- break;
-
- case ((uint32_t)TIMR1):
- TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR1_Pos);
- break;
-
- case ((uint32_t)TIMR2):
- TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR2_Pos);
- break;
-
- case ((uint32_t)TIMR3):
- TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR3_Pos);
- break;
-
- case ((uint32_t)TIMR4):
- TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR4_Pos);
- break;
-
- case ((uint32_t)TIMR5):
- TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR5_Pos);
- break;
- }
+ switch ((uint32_t)TIMRx)
+ {
+ case ((uint32_t)TIMR0):
+ TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR0_Pos);
+ break;
+
+ case ((uint32_t)TIMR1):
+ TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR1_Pos);
+ break;
+
+ case ((uint32_t)TIMR2):
+ TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR2_Pos);
+ break;
+
+ case ((uint32_t)TIMR3):
+ TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR3_Pos);
+ break;
+
+ case ((uint32_t)TIMR4):
+ TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR4_Pos);
+ break;
+
+ case ((uint32_t)TIMR5):
+ TIMRG->IE &= ~(0x01 << TIMRG_IE_TIMR5_Pos);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: TIMR_INTClr()
-* ����˵��: ����жϱ�־
-* �� ��: TIMR_TypeDef * TIMRx ָ��Ҫ�����õĶ�ʱ������ȡֵ����TIMR0��TIMR1��TIMR2��TIMR3��TIMR4��TIMR5
-* �� ��: ��
-* ע������: ��
+* 函数名称: TIMR_INTClr()
+* 功能说明: 清除中断标志
+* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void TIMR_INTClr(TIMR_TypeDef * TIMRx)
+void TIMR_INTClr(TIMR_TypeDef *TIMRx)
{
- switch((uint32_t)TIMRx)
- {
- case ((uint32_t)TIMR0):
- TIMRG->IF = (0x01 << TIMRG_IF_TIMR0_Pos);
- break;
-
- case ((uint32_t)TIMR1):
- TIMRG->IF = (0x01 << TIMRG_IF_TIMR1_Pos);
- break;
-
- case ((uint32_t)TIMR2):
- TIMRG->IF = (0x01 << TIMRG_IF_TIMR2_Pos);
- break;
-
- case ((uint32_t)TIMR3):
- TIMRG->IF = (0x01 << TIMRG_IF_TIMR3_Pos);
- break;
-
- case ((uint32_t)TIMR4):
- TIMRG->IF = (0x01 << TIMRG_IF_TIMR4_Pos);
- break;
-
- case ((uint32_t)TIMR5):
- TIMRG->IF = (0x01 << TIMRG_IF_TIMR5_Pos);
- break;
- }
+ switch ((uint32_t)TIMRx)
+ {
+ case ((uint32_t)TIMR0):
+ TIMRG->IF = (0x01 << TIMRG_IF_TIMR0_Pos);
+ break;
+
+ case ((uint32_t)TIMR1):
+ TIMRG->IF = (0x01 << TIMRG_IF_TIMR1_Pos);
+ break;
+
+ case ((uint32_t)TIMR2):
+ TIMRG->IF = (0x01 << TIMRG_IF_TIMR2_Pos);
+ break;
+
+ case ((uint32_t)TIMR3):
+ TIMRG->IF = (0x01 << TIMRG_IF_TIMR3_Pos);
+ break;
+
+ case ((uint32_t)TIMR4):
+ TIMRG->IF = (0x01 << TIMRG_IF_TIMR4_Pos);
+ break;
+
+ case ((uint32_t)TIMR5):
+ TIMRG->IF = (0x01 << TIMRG_IF_TIMR5_Pos);
+ break;
+ }
}
/******************************************************************************************************************************************
-* ��������: TIMR_INTStat()
-* ����˵��: ��ȡ�ж�״̬
-* �� ��: TIMR_TypeDef * TIMRx ָ��Ҫ�����õĶ�ʱ������ȡֵ����TIMR0��TIMR1��TIMR2��TIMR3��TIMR4��TIMR5
-* �� ��: uint32_t 0 TIMRxδ�����ж� 1 TIMRx�������ж�
-* ע������: ��
+* 函数名称: TIMR_INTStat()
+* 功能说明: 获取中断状态
+* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、TIMR5
+* 输 出: uint32_t 0 TIMRx未产生中断 1 TIMRx产生了中断
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx)
+uint32_t TIMR_INTStat(TIMR_TypeDef *TIMRx)
{
- switch((uint32_t)TIMRx)
- {
- case ((uint32_t)TIMR0):
- return (TIMRG->IF & TIMRG_IF_TIMR0_Msk) ? 1 : 0;
-
- case ((uint32_t)TIMR1):
- return (TIMRG->IF & TIMRG_IF_TIMR1_Msk) ? 1 : 0;
-
- case ((uint32_t)TIMR2):
- return (TIMRG->IF & TIMRG_IF_TIMR2_Msk) ? 1 : 0;
-
- case ((uint32_t)TIMR3):
- return (TIMRG->IF & TIMRG_IF_TIMR3_Msk) ? 1 : 0;
-
- case ((uint32_t)TIMR4):
- return (TIMRG->IF & TIMRG_IF_TIMR4_Msk) ? 1 : 0;
-
- case ((uint32_t)TIMR5):
- return (TIMRG->IF & TIMRG_IF_TIMR5_Msk) ? 1 : 0;
- }
-
- return 0;
-}
+ switch ((uint32_t)TIMRx)
+ {
+ case ((uint32_t)TIMR0):
+ return (TIMRG->IF & TIMRG_IF_TIMR0_Msk) ? 1 : 0;
+
+ case ((uint32_t)TIMR1):
+ return (TIMRG->IF & TIMRG_IF_TIMR1_Msk) ? 1 : 0;
+
+ case ((uint32_t)TIMR2):
+ return (TIMRG->IF & TIMRG_IF_TIMR2_Msk) ? 1 : 0;
+
+ case ((uint32_t)TIMR3):
+ return (TIMRG->IF & TIMRG_IF_TIMR3_Msk) ? 1 : 0;
+ case ((uint32_t)TIMR4):
+ return (TIMRG->IF & TIMRG_IF_TIMR4_Msk) ? 1 : 0;
+
+ case ((uint32_t)TIMR5):
+ return (TIMRG->IF & TIMRG_IF_TIMR5_Msk) ? 1 : 0;
+ }
+
+ return 0;
+}
/******************************************************************************************************************************************
-* ��������: Pulse_Init()
-* ����˵��: �����������ܳ�ʼ��
-* �� ��: uint32_t pulse PULSE_LOW ������������� PULSE_HIGH �������������
-* uint32_t int_en �Ƿ�ʹ�������������ж�
-* �� ��: ��
-* ע������: ��
+* 函数名称: Pulse_Init()
+* 功能说明: 脉宽测量功能初始化
+* 输 入: uint32_t pulse PULSE_LOW 测量低脉冲宽度 PULSE_HIGH 测量高脉冲宽度
+* uint32_t int_en 是否使能脉冲测量完成中断
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
void Pulse_Init(uint32_t pulse, uint32_t int_en)
-{
- SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
-
- TIMRG->PCTRL = (0 << TIMRG_PCTRL_CLKSRC_Pos) | // ϵͳʱ����Ϊʱ��Դ
- (pulse << TIMRG_PCTRL_HIGH_Pos) |
- (0 << TIMRG_PCTRL_EN_Pos);
-
- TIMRG->IE |= (1 << TIMRG_IE_PULSE_Pos); //ʹ�ܲ��ܲ�ѯ�жϱ�־
-
- if(int_en) NVIC_EnableIRQ(PULSE_IRQn);
+{
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_TIMR_Pos);
+
+ TIMRG->PCTRL = (0 << TIMRG_PCTRL_CLKSRC_Pos) | // 系统时钟作为时钟源
+ (pulse << TIMRG_PCTRL_HIGH_Pos) |
+ (0 << TIMRG_PCTRL_EN_Pos);
+
+ TIMRG->IE |= (1 << TIMRG_IE_PULSE_Pos); //使能才能查询中断标志
+
+ if (int_en)
+ NVIC_EnableIRQ(PULSE_IRQn);
}
/******************************************************************************************************************************************
-* ��������: Pulse_Start()
-* ����˵��: ��������������������������������Զ��رղ�������
-* �� ��: ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: Pulse_Start()
+* 功能说明: 脉宽测量功能启动,测量到脉宽后会自动关闭测量功能
+* 输 入: 无
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
void Pulse_Start(void)
-{
- TIMRG->PCTRL |= (1 << TIMRG_PCTRL_EN_Pos);
+{
+ TIMRG->PCTRL |= (1 << TIMRG_PCTRL_EN_Pos);
}
/******************************************************************************************************************************************
-* ��������: Pulse_Done()
-* ����˵��: ���������Ƿ����
-* �� ��: ��
-* �� ��: uint32_t 1 ��������� 0 ������
-* ע������: ��
+* 函数名称: Pulse_Done()
+* 功能说明: 脉宽测量是否完成
+* 输 入: 无
+* 输 出: uint32_t 1 测量已完成 0 测量未完成
+* 注意事项: 无
******************************************************************************************************************************************/
uint32_t Pulse_Done(void)
{
- if(TIMRG->IF & TIMRG_IF_PULSE_Msk)
- {
- TIMRG->IF = TIMRG_IF_PULSE_Msk; // ����жϱ�־
-
- return 1;
- }
- else
- {
- return 0;
- }
+ if (TIMRG->IF & TIMRG_IF_PULSE_Msk)
+ {
+ TIMRG->IF = TIMRG_IF_PULSE_Msk; // 清除中断标志
+
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.h
index bd1aa2618d..38eaffacd8 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_timr.h
@@ -1,32 +1,29 @@
#ifndef __SWM320_TIMR_H__
#define __SWM320_TIMR_H__
-#define TIMR_MODE_TIMER 0
-#define TIMR_MODE_COUNTER 1
+#define TIMR_MODE_TIMER 0
+#define TIMR_MODE_COUNTER 1
-void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint32_t period, uint32_t int_en); //��ʱ��/��������ʼ��
-void TIMR_Start(TIMR_TypeDef * TIMRx); //������ʱ�����ӳ�ʼֵ��ʼ��ʱ/����
-void TIMR_Stop(TIMR_TypeDef * TIMRx); //ֹͣ��ʱ��
-void TIMR_Halt(TIMR_TypeDef * TIMRx); //��ͣ��ʱ��������ֵ���ֲ���
-void TIMR_Resume(TIMR_TypeDef * TIMRx); //�ָ���ʱ��������ͣ����������
+void TIMR_Init(TIMR_TypeDef *TIMRx, uint32_t mode, uint32_t period, uint32_t int_en); //定时器/计数器初始化
+void TIMR_Start(TIMR_TypeDef *TIMRx); //启动定时器,从初始值开始计时/计数
+void TIMR_Stop(TIMR_TypeDef *TIMRx); //停止定时器
+void TIMR_Halt(TIMR_TypeDef *TIMRx); //暂停定时器,计数值保持不变
+void TIMR_Resume(TIMR_TypeDef *TIMRx); //恢复定时器,从暂停处继续计数
-void TIMR_SetPeriod(TIMR_TypeDef * TIMRx, uint32_t period); //���ö�ʱ/��������
-uint32_t TIMR_GetPeriod(TIMR_TypeDef * TIMRx); //��ȡ��ʱ/��������
-uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx); //��ȡ��ǰ����ֵ
+void TIMR_SetPeriod(TIMR_TypeDef *TIMRx, uint32_t period); //设置定时/计数周期
+uint32_t TIMR_GetPeriod(TIMR_TypeDef *TIMRx); //获取定时/计数周期
+uint32_t TIMR_GetCurValue(TIMR_TypeDef *TIMRx); //获取当前计数值
-void TIMR_INTEn(TIMR_TypeDef * TIMRx); //ʹ���ж�
-void TIMR_INTDis(TIMR_TypeDef * TIMRx); //�����ж�
-void TIMR_INTClr(TIMR_TypeDef * TIMRx); //����жϱ�־
-uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx); //��ȡ�ж�״̬
+void TIMR_INTEn(TIMR_TypeDef *TIMRx); //使能中断
+void TIMR_INTDis(TIMR_TypeDef *TIMRx); //禁能中断
+void TIMR_INTClr(TIMR_TypeDef *TIMRx); //清除中断标志
+uint32_t TIMR_INTStat(TIMR_TypeDef *TIMRx); //获取中断状态
-
-
-#define PULSE_LOW 0
-#define PULSE_HIGH 1
+#define PULSE_LOW 0
+#define PULSE_HIGH 1
void Pulse_Init(uint32_t pulse, uint32_t int_en);
void Pulse_Start(void);
uint32_t Pulse_Done(void);
-
#endif //__SWM320_TIMR_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.c
index 6b3f046c75..721184fd94 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_uart.c
-* ����˵��: SWM320��Ƭ����UART���ڹ���������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������: û�б�дLIN������صĺ���
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_uart.c
+* 功能说明: SWM320单片机的UART串口功能驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项: 没有编写LIN功能相关的函数
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,533 +21,547 @@
#include "SWM320.h"
#include "SWM320_uart.h"
-
/******************************************************************************************************************************************
-* ��������: UART_Init()
-* ����˵��: UART���ڳ�ʼ��
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* UART_InitStructure * initStruct ����UART��������趨ֵ�Ľṹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_Init()
+* 功能说明: UART串口初始化
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* UART_InitStructure * initStruct 包含UART串口相关设定值的结构体
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct)
-{
- switch((uint32_t)UARTx)
- {
- case ((uint32_t)UART0):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_UART0_Pos);
- break;
-
- case ((uint32_t)UART1):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_UART1_Pos);
- break;
-
- case ((uint32_t)UART2):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_UART2_Pos);
- break;
-
- case ((uint32_t)UART3):
- SYS->CLKEN |= (0x01 << SYS_CLKEN_UART3_Pos);
- break;
- }
-
- UART_Close(UARTx); //һЩ�ؼ��Ĵ���ֻ���ڴ��ڹر�ʱ����
-
- UARTx->CTRL |= (0x01 << UART_CTRL_BAUDEN_Pos);
- UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
- UARTx->BAUD |= ((SystemCoreClock/16/initStruct->Baudrate - 1) << UART_BAUD_BAUD_Pos);
-
- UARTx->CTRL &= ~(UART_CTRL_DATA9b_Msk | UART_CTRL_PARITY_Msk | UART_CTRL_STOP2b_Msk);
- UARTx->CTRL |= (initStruct->DataBits << UART_CTRL_DATA9b_Pos) |
- (initStruct->Parity << UART_CTRL_PARITY_Pos) |
- (initStruct->StopBits << UART_CTRL_STOP2b_Pos);
-
- /* ��SWM320�У��� RXLVL >= RXTHR ʱ�����жϣ����RXTHR����Ϊ0�Ļ�����δ���յ�����ʱ�ͻ�һֱ�����жϣ�
- ����оƬ�У��� RXLVL > RXTHR ʱ�����жϣ�Ϊ���SWM320��RXTHR����Ϊ0�����⣬��ͳһ�⺯��API�����ォRXTHR����ֵ��һ
+void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct)
+{
+ switch ((uint32_t)UARTx)
+ {
+ case ((uint32_t)UART0):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_UART0_Pos);
+ break;
+
+ case ((uint32_t)UART1):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_UART1_Pos);
+ break;
+
+ case ((uint32_t)UART2):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_UART2_Pos);
+ break;
+
+ case ((uint32_t)UART3):
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_UART3_Pos);
+ break;
+ }
+
+ UART_Close(UARTx); //一些关键寄存器只能在串口关闭时设置
+
+ UARTx->CTRL |= (0x01 << UART_CTRL_BAUDEN_Pos);
+ UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
+ UARTx->BAUD |= ((SystemCoreClock / 16 / initStruct->Baudrate - 1) << UART_BAUD_BAUD_Pos);
+
+ UARTx->CTRL &= ~(UART_CTRL_DATA9b_Msk | UART_CTRL_PARITY_Msk | UART_CTRL_STOP2b_Msk);
+ UARTx->CTRL |= (initStruct->DataBits << UART_CTRL_DATA9b_Pos) |
+ (initStruct->Parity << UART_CTRL_PARITY_Pos) |
+ (initStruct->StopBits << UART_CTRL_STOP2b_Pos);
+
+ /* 在SWM320中,当 RXLVL >= RXTHR 时触发中断,如果RXTHR设置为0的话,在未接收到数据时就会一直触发中断;
+ 其他芯片中,当 RXLVL > RXTHR 时触发中断,为解决SWM320中RXTHR不能为0的问题,并统一库函数API,这里将RXTHR设置值加一
*/
- switch((uint32_t)UARTx) // ������λ�������� NVIC �Ĵ����������ֶ����������Ĵ������� RXTHR ʱ�ᵼ��һֱ���� ISR
+ switch ((uint32_t)UARTx) // 软件复位不能清零 NVIC 寄存器,若不手动清除,下面的代码清零 RXTHR 时会导致一直进入 ISR
+ {
+ case ((uint32_t)UART0):
+ NVIC_DisableIRQ(UART0_IRQn);
+ break;
+ case ((uint32_t)UART1):
+ NVIC_DisableIRQ(UART1_IRQn);
+ break;
+ case ((uint32_t)UART2):
+ NVIC_DisableIRQ(UART2_IRQn);
+ break;
+ case ((uint32_t)UART3):
+ NVIC_DisableIRQ(UART3_IRQn);
+ break;
+ }
+ UARTx->FIFO &= ~(UART_FIFO_RXTHR_Msk | UART_FIFO_TXTHR_Msk);
+ UARTx->FIFO |= ((initStruct->RXThreshold + 1) << UART_FIFO_RXTHR_Pos) |
+ (initStruct->TXThreshold << UART_FIFO_TXTHR_Pos);
+
+ UARTx->CTRL &= ~UART_CTRL_TOTIME_Msk;
+ UARTx->CTRL |= (initStruct->TimeoutTime << UART_CTRL_TOTIME_Pos);
+
+ UARTx->CTRL &= ~(UART_CTRL_RXIE_Msk | UART_CTRL_TXIE_Msk | UART_CTRL_TOIE_Msk);
+ UARTx->CTRL |= (initStruct->RXThresholdIEn << UART_CTRL_RXIE_Pos) |
+ (initStruct->TXThresholdIEn << UART_CTRL_TXIE_Pos) |
+ (initStruct->TimeoutIEn << UART_CTRL_TOIE_Pos);
+
+ switch ((uint32_t)UARTx)
{
- case ((uint32_t)UART0): NVIC_DisableIRQ(UART0_IRQn); break;
- case ((uint32_t)UART1): NVIC_DisableIRQ(UART1_IRQn); break;
- case ((uint32_t)UART2): NVIC_DisableIRQ(UART2_IRQn); break;
- case ((uint32_t)UART3): NVIC_DisableIRQ(UART3_IRQn); break;
+ case ((uint32_t)UART0):
+ if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
+ {
+ NVIC_EnableIRQ(UART0_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(UART0_IRQn);
+ }
+ break;
+
+ case ((uint32_t)UART1):
+ if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
+ {
+ NVIC_EnableIRQ(UART1_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(UART1_IRQn);
+ }
+ break;
+
+ case ((uint32_t)UART2):
+ if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
+ {
+ NVIC_EnableIRQ(UART2_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(UART2_IRQn);
+ }
+ break;
+
+ case ((uint32_t)UART3):
+ if (initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
+ {
+ NVIC_EnableIRQ(UART3_IRQn);
+ }
+ else
+ {
+ NVIC_DisableIRQ(UART3_IRQn);
+ }
+ break;
}
- UARTx->FIFO &= ~(UART_FIFO_RXTHR_Msk | UART_FIFO_TXTHR_Msk);
- UARTx->FIFO |= ((initStruct->RXThreshold + 1) << UART_FIFO_RXTHR_Pos) |
- (initStruct->TXThreshold << UART_FIFO_TXTHR_Pos);
-
- UARTx->CTRL &= ~UART_CTRL_TOTIME_Msk;
- UARTx->CTRL |= (initStruct->TimeoutTime << UART_CTRL_TOTIME_Pos);
-
- UARTx->CTRL &= ~(UART_CTRL_RXIE_Msk | UART_CTRL_TXIE_Msk | UART_CTRL_TOIE_Msk);
- UARTx->CTRL |= (initStruct->RXThresholdIEn << UART_CTRL_RXIE_Pos) |
- (initStruct->TXThresholdIEn << UART_CTRL_TXIE_Pos) |
- (initStruct->TimeoutIEn << UART_CTRL_TOIE_Pos);
-
- switch((uint32_t)UARTx)
- {
- case ((uint32_t)UART0):
- if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
- {
- NVIC_EnableIRQ(UART0_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(UART0_IRQn);
- }
- break;
-
- case ((uint32_t)UART1):
- if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
- {
- NVIC_EnableIRQ(UART1_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(UART1_IRQn);
- }
- break;
-
- case ((uint32_t)UART2):
- if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
- {
- NVIC_EnableIRQ(UART2_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(UART2_IRQn);
- }
- break;
-
- case ((uint32_t)UART3):
- if(initStruct->RXThresholdIEn | initStruct->TXThresholdIEn | initStruct->TimeoutIEn)
- {
- NVIC_EnableIRQ(UART3_IRQn);
- }
- else
- {
- NVIC_DisableIRQ(UART3_IRQn);
- }
- break;
- }
}
/******************************************************************************************************************************************
-* ��������: UART_Open()
-* ����˵��: UART���ڴ�
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_Open()
+* 功能说明: UART串口打开
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_Open(UART_TypeDef * UARTx)
+void UART_Open(UART_TypeDef *UARTx)
{
- UARTx->CTRL |= (0x01 << UART_CTRL_EN_Pos);
+ UARTx->CTRL |= (0x01 << UART_CTRL_EN_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_Close()
-* ����˵��: UART���ڹر�
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_Close()
+* 功能说明: UART串口关闭
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_Close(UART_TypeDef * UARTx)
+void UART_Close(UART_TypeDef *UARTx)
{
- UARTx->CTRL &= ~(0x01 << UART_CTRL_EN_Pos);
+ UARTx->CTRL &= ~(0x01 << UART_CTRL_EN_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_WriteByte()
-* ����˵��: ����һ���ֽ�����
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���ȡֵ����UART0��UART1��UART2��UART3��UART4
-* uint32_t data Ҫ���͵��ֽ�
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_WriteByte()
+* 功能说明: 发送一个字节数据
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,可取值包括UART0、UART1、UART2、UART3、UART4
+* uint32_t data 要发送的字节
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_WriteByte(UART_TypeDef * UARTx, uint32_t data)
+void UART_WriteByte(UART_TypeDef *UARTx, uint32_t data)
{
- UARTx->DATA = data;
+ UARTx->DATA = data;
}
/******************************************************************************************************************************************
-* ��������: UART_ReadByte()
-* ����˵��: ��ȡһ���ֽ����ݣ���ָ�������Ƿ�Valid
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���ȡֵ����UART0��UART1��UART2��UART3��UART4
-* uint32_t * data ���յ�������
-* �� ��: uint32_t 0 �޴��� UART_ERR_PARITY ��żУ�����
-* ע������: ��
+* 函数名称: UART_ReadByte()
+* 功能说明: 读取一个字节数据,并指出数据是否Valid
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,可取值包括UART0、UART1、UART2、UART3、UART4
+* uint32_t * data 接收到的数据
+* 输 出: uint32_t 0 无错误 UART_ERR_PARITY 奇偶校验错误
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data)
+uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data)
{
- uint32_t reg = UARTx->DATA;
-
- *data = (reg & UART_DATA_DATA_Msk);
-
- if(reg & UART_DATA_PAERR_Msk) return UART_ERR_PARITY;
-
- return 0;
+ uint32_t reg = UARTx->DATA;
+
+ *data = (reg & UART_DATA_DATA_Msk);
+
+ if (reg & UART_DATA_PAERR_Msk)
+ return UART_ERR_PARITY;
+
+ return 0;
}
/******************************************************************************************************************************************
-* ��������: UART_IsTXBusy()
-* ����˵��: UART�Ƿ����ڷ�������
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t 1 UART���ڷ������� 0 �����ѷ���
-* ע������: ��
+* 函数名称: UART_IsTXBusy()
+* 功能说明: UART是否正在发送数据
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 1 UART正在发送数据 0 数据已发完
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t UART_IsTXBusy(UART_TypeDef * UARTx)
+uint32_t UART_IsTXBusy(UART_TypeDef *UARTx)
{
- return (UARTx->CTRL & UART_CTRL_TXIDLE_Msk) ? 0 : 1;
+ return (UARTx->CTRL & UART_CTRL_TXIDLE_Msk) ? 0 : 1;
}
/******************************************************************************************************************************************
-* ��������: UART_IsRXFIFOEmpty()
-* ����˵��: ����FIFO�Ƿ�Ϊ�գ����������˵�����������ݿ��Զ�ȡ
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t 1 ����FIFO�� 0 ����FIFO�ǿ�
-* ע������: ��
+* 函数名称: UART_IsRXFIFOEmpty()
+* 功能说明: 接收FIFO是否为空,如果不空则说明其中有数据可以读取
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 1 接收FIFO空 0 接收FIFO非空
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx)
+uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx)
{
- return (UARTx->CTRL & UART_CTRL_RXNE_Msk) ? 0 : 1;
+ return (UARTx->CTRL & UART_CTRL_RXNE_Msk) ? 0 : 1;
}
/******************************************************************************************************************************************
-* ��������: UART_IsTXFIFOFull()
-* ����˵��: ����FIFO�Ƿ�Ϊ���������������Լ���������д������
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t 1 ����FIFO�� 0 ����FIFO����
-* ע������: ��
+* 函数名称: UART_IsTXFIFOFull()
+* 功能说明: 发送FIFO是否为满,如果不满则可以继续向其中写入数据
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 1 发送FIFO满 0 发送FIFO不满
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx)
+uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx)
{
- return (UARTx->CTRL & UART_CTRL_TXFF_Msk) ? 1 : 0;
+ return (UARTx->CTRL & UART_CTRL_TXFF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: UART_SetBaudrate()
-* ����˵��: ���ò�����
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* uint32_t baudrate Ҫ���õIJ�����
-* �� ��: ��
-* ע������: ��Ҫ�ڴ��ڹ���ʱ���IJ����ʣ�ʹ�ô˺���ǰ���ȵ���UART_Close()�رմ���
+* 函数名称: UART_SetBaudrate()
+* 功能说明: 设置波特率
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* uint32_t baudrate 要设置的波特率
+* 输 出: 无
+* 注意事项: 不要在串口工作时更改波特率,使用此函数前请先调用UART_Close()关闭串口
******************************************************************************************************************************************/
-void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate)
+void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate)
{
- UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
- UARTx->BAUD |= ((SystemCoreClock/16/baudrate - 1) << UART_BAUD_BAUD_Pos);
+ UARTx->BAUD &= ~UART_BAUD_BAUD_Msk;
+ UARTx->BAUD |= ((SystemCoreClock / 16 / baudrate - 1) << UART_BAUD_BAUD_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_GetBaudrate()
-* ����˵��: ��ѯ������
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t ��ǰ������
-* ע������: ��
+* 函数名称: UART_GetBaudrate()
+* 功能说明: 查询波特率
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 当前波特率
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t UART_GetBaudrate(UART_TypeDef * UARTx)
+uint32_t UART_GetBaudrate(UART_TypeDef *UARTx)
{
- return SystemCoreClock/16/(((UARTx->BAUD & UART_BAUD_BAUD_Msk) >> UART_BAUD_BAUD_Pos) + 1);
+ return SystemCoreClock / 16 / (((UARTx->BAUD & UART_BAUD_BAUD_Msk) >> UART_BAUD_BAUD_Pos) + 1);
}
/******************************************************************************************************************************************
-* ��������: UART_CTSConfig()
-* ����˵��: UART CTS��������
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* uint32_t enable 1 ʹ��CTS���� 0 ��ֹCTS����
-* uint32_t polarity 0 CTS����Ϊ�ͱ�ʾ���Է������� 1 CTS����Ϊ�߱�ʾ���Է�������
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_CTSConfig()
+* 功能说明: UART CTS流控配置
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* uint32_t enable 1 使能CTS流控 0 禁止CTS流控
+* uint32_t polarity 0 CTS输入为低表示可以发送数据 1 CTS输入为高表示可以发送数据
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_CTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity)
+void UART_CTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity)
{
- UARTx->CTSCR &= ~(UART_CTSCR_EN_Msk | UART_CTSCR_POL_Msk);
- UARTx->CTSCR |= (enable << UART_CTSCR_EN_Pos) |
- (polarity << UART_CTSCR_POL_Pos);
+ UARTx->CTSCR &= ~(UART_CTSCR_EN_Msk | UART_CTSCR_POL_Msk);
+ UARTx->CTSCR |= (enable << UART_CTSCR_EN_Pos) |
+ (polarity << UART_CTSCR_POL_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_CTSLineState()
-* ����˵��: UART CTS�ߵ�ǰ״̬
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t 0 CTS�ߵ�ǰΪ�͵�ƽ 1 CTS�ߵ�ǰΪ�ߵ�ƽ
-* ע������: ��
+* 函数名称: UART_CTSLineState()
+* 功能说明: UART CTS线当前状态
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 0 CTS线当前为低电平 1 CTS线当前为高电平
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t UART_CTSLineState(UART_TypeDef * UARTx)
+uint32_t UART_CTSLineState(UART_TypeDef *UARTx)
{
- return (UARTx->CTSCR & UART_CTSCR_STAT_Msk) ? 1 : 0;
+ return (UARTx->CTSCR & UART_CTSCR_STAT_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: UART_RTSConfig()
-* ����˵��: UART RTS��������
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* uint32_t enable 1 ʹ��RTS���� 0 ��ֹRTS����
-* uint32_t polarity 0 RTS����ͱ�ʾ���Խ������� 1 RTS����߱�ʾ���Խ�������
-* uint32_t threshold RTS���صĴ�����ֵ����ȡֵUART_RTS_1BYTE��UART_RTS_2BYTE��UART_RTS_4BYTE��UART_RTS_6BYTE
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_RTSConfig()
+* 功能说明: UART RTS流控配置
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* uint32_t enable 1 使能RTS流控 0 禁止RTS流控
+* uint32_t polarity 0 RTS输出低表示可以接收数据 1 RTS输出高表示可以接收数据
+* uint32_t threshold RTS流控的触发阈值,可取值UART_RTS_1BYTE、UART_RTS_2BYTE、UART_RTS_4BYTE、UART_RTS_6BYTE
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_RTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold)
+void UART_RTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold)
{
- UARTx->RTSCR &= ~(UART_RTSCR_EN_Msk | UART_RTSCR_POL_Msk | UART_RTSCR_THR_Msk);
- UARTx->RTSCR |= (enable << UART_RTSCR_EN_Pos) |
- (polarity << UART_RTSCR_POL_Pos) |
- (threshold << UART_RTSCR_THR_Pos);
+ UARTx->RTSCR &= ~(UART_RTSCR_EN_Msk | UART_RTSCR_POL_Msk | UART_RTSCR_THR_Msk);
+ UARTx->RTSCR |= (enable << UART_RTSCR_EN_Pos) |
+ (polarity << UART_RTSCR_POL_Pos) |
+ (threshold << UART_RTSCR_THR_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_RTSLineState()
-* ����˵��: UART RTS�ߵ�ǰ״̬
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t 0 RTS�ߵ�ǰΪ�͵�ƽ 1 RTS�ߵ�ǰΪ�ߵ�ƽ
-* ע������: ��
+* 函数名称: UART_RTSLineState()
+* 功能说明: UART RTS线当前状态
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 0 RTS线当前为低电平 1 RTS线当前为高电平
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t UART_RTSLineState(UART_TypeDef * UARTx)
+uint32_t UART_RTSLineState(UART_TypeDef *UARTx)
{
- return (UARTx->RTSCR & UART_RTSCR_STAT_Msk) ? 1 : 0;
+ return (UARTx->RTSCR & UART_RTSCR_STAT_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: UART_LINConfig()
-* ����˵��: UART LIN��������
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* uint32_t detectedIEn ��⵽Break�ж�ʹ��
-* uint32_t generatedIEn Break��������ж�ʹ��
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_LINConfig()
+* 功能说明: UART LIN功能配置
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* uint32_t detectedIEn 检测到Break中断使能
+* uint32_t generatedIEn Break发送完成中断使能
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_LINConfig(UART_TypeDef * UARTx, uint32_t detectedIEn, uint32_t generatedIEn)
+void UART_LINConfig(UART_TypeDef *UARTx, uint32_t detectedIEn, uint32_t generatedIEn)
{
- UARTx->LINCR &= ~(UART_LINCR_BRKDETIE_Msk | UART_LINCR_GENBRKIE_Msk);
- UARTx->LINCR |= (detectedIEn << UART_LINCR_BRKDETIE_Pos) |
- (generatedIEn << UART_LINCR_GENBRKIE_Pos);
+ UARTx->LINCR &= ~(UART_LINCR_BRKDETIE_Msk | UART_LINCR_GENBRKIE_Msk);
+ UARTx->LINCR |= (detectedIEn << UART_LINCR_BRKDETIE_Pos) |
+ (generatedIEn << UART_LINCR_GENBRKIE_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_LINGenerate()
-* ����˵��: UART LIN����/����Break
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_LINGenerate()
+* 功能说明: UART LIN产生/发送Break
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_LINGenerate(UART_TypeDef * UARTx)
+void UART_LINGenerate(UART_TypeDef *UARTx)
{
- UARTx->LINCR |= (1 << UART_LINCR_GENBRK_Pos);
+ UARTx->LINCR |= (1 << UART_LINCR_GENBRK_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_LINIsDetected()
-* ����˵��: UART LIN�Ƿ��⵽Break
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t 1 ��⵽LIN Break 0 δ��⵽LIN Break
-* ע������: ��
+* 函数名称: UART_LINIsDetected()
+* 功能说明: UART LIN是否检测到Break
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 1 检测到LIN Break 0 未检测到LIN Break
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t UART_LINIsDetected(UART_TypeDef * UARTx)
+uint32_t UART_LINIsDetected(UART_TypeDef *UARTx)
{
- return (UARTx->LINCR & UART_LINCR_BRKDETIF_Msk) ? 1 : 0;
+ return (UARTx->LINCR & UART_LINCR_BRKDETIF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: UART_LINIsGenerated()
-* ����˵��: UART LIN Break�Ƿ������
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t 1 LIN Break ������� 0 LIN Break������
-* ע������: ��
+* 函数名称: UART_LINIsGenerated()
+* 功能说明: UART LIN Break是否发送完成
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 1 LIN Break 发送完成 0 LIN Break发送未完成
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx)
+uint32_t UART_LINIsGenerated(UART_TypeDef *UARTx)
{
- return (UARTx->LINCR & UART_LINCR_GENBRKIF_Msk) ? 1 : 0;
+ return (UARTx->LINCR & UART_LINCR_GENBRKIF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: UART_ABRStart()
-* ����˵��: UART �Զ������ʼ�⿪ʼ
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* uint32_t detectChar �����Զ���⡢���㲨���ʵļ���ַ�
-* 8λ����ʱ��ȡֵ��0xFF��0xFE��0xF8��0x80���ֱ��ʾ���ͷ����뷢��0xFF��0xFE��0xF8��0x80
-* 9λ����ʱ��ȡֵ��0x1FF��0x1FE��0x1F8��0x180���ֱ��ʾ���ͷ����뷢��0x1FF��0x1FE��0x1F8��0x180
-* �� ��: ��
-* ע������: �Զ������ʼ��ʱ���ܿ�����żУ��
+* 函数名称: UART_ABRStart()
+* 功能说明: UART 自动波特率检测开始
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* uint32_t detectChar 用于自动检测、计算波特率的检测字符
+* 8位数据时可取值:0xFF、0xFE、0xF8、0x80,分别表示发送方必须发送0xFF、0xFE、0xF8、0x80
+* 9位数据时可取值:0x1FF、0x1FE、0x1F8、0x180,分别表示发送方必须发送0x1FF、0x1FE、0x1F8、0x180
+* 输 出: 无
+* 注意事项: 自动波特率检测时不能开启奇偶校验
******************************************************************************************************************************************/
-void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar)
+void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar)
{
- uint32_t bits;
-
- if((detectChar == 0xFF) || (detectChar == 0x1FF)) bits = 0;
- else if((detectChar == 0xFE) || (detectChar == 0x1FE)) bits = 1;
- else if((detectChar == 0xF8) || (detectChar == 0x1F8)) bits = 2;
- else if((detectChar == 0x80) || (detectChar == 0x180)) bits = 3;
- else while(1);
-
- UARTx->BAUD &= ~(UART_BAUD_ABREN_Msk | UART_BAUD_ABRBIT_Msk);
- UARTx->BAUD |= (1 << UART_BAUD_ABREN_Pos) |
- (bits << UART_BAUD_ABRBIT_Pos);
+ uint32_t bits;
+
+ if ((detectChar == 0xFF) || (detectChar == 0x1FF))
+ bits = 0;
+ else if ((detectChar == 0xFE) || (detectChar == 0x1FE))
+ bits = 1;
+ else if ((detectChar == 0xF8) || (detectChar == 0x1F8))
+ bits = 2;
+ else if ((detectChar == 0x80) || (detectChar == 0x180))
+ bits = 3;
+ else
+ while (1)
+ ;
+
+ UARTx->BAUD &= ~(UART_BAUD_ABREN_Msk | UART_BAUD_ABRBIT_Msk);
+ UARTx->BAUD |= (1 << UART_BAUD_ABREN_Pos) |
+ (bits << UART_BAUD_ABRBIT_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_ABRIsDone()
-* ����˵��: UART �Զ��������Ƿ����
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t 0 δ��� UART_ABR_RES_OK ����ɣ��ҳɹ� UART_ABR_RES_ERR ����ɣ���ʧ�ܡ�����
-* ע������: ��
+* 函数名称: UART_ABRIsDone()
+* 功能说明: UART 自动波特率是否完成
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 0 未完成 UART_ABR_RES_OK 已完成,且成功 UART_ABR_RES_ERR 已完成,但失败、出错
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t UART_ABRIsDone(UART_TypeDef * UARTx)
+uint32_t UART_ABRIsDone(UART_TypeDef *UARTx)
{
- if(UARTx->BAUD & UART_BAUD_ABREN_Msk)
- {
- return 0;
- }
- else if(UARTx->BAUD & UART_BAUD_ABRERR_Msk)
- {
- return UART_ABR_RES_ERR;
- }
- else
- {
- return UART_ABR_RES_OK;
- }
+ if (UARTx->BAUD & UART_BAUD_ABREN_Msk)
+ {
+ return 0;
+ }
+ else if (UARTx->BAUD & UART_BAUD_ABRERR_Msk)
+ {
+ return UART_ABR_RES_ERR;
+ }
+ else
+ {
+ return UART_ABR_RES_OK;
+ }
}
/******************************************************************************************************************************************
-* ��������: UART_INTRXThresholdEn()
-* ����˵��: ��RX FIFO�����ݸ��� >= RXThresholdʱ �����ж�
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_INTRXThresholdEn()
+* 功能说明: 当RX FIFO中数据个数 >= RXThreshold时 触发中断
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_INTRXThresholdEn(UART_TypeDef * UARTx)
+void UART_INTRXThresholdEn(UART_TypeDef *UARTx)
{
- UARTx->CTRL |= (0x01 << UART_CTRL_RXIE_Pos);
+ UARTx->CTRL |= (0x01 << UART_CTRL_RXIE_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_INTRXThresholdDis()
-* ����˵��: ��RX FIFO�����ݸ��� >= RXThresholdʱ �������ж�
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_INTRXThresholdDis()
+* 功能说明: 当RX FIFO中数据个数 >= RXThreshold时 不触发中断
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_INTRXThresholdDis(UART_TypeDef * UARTx)
+void UART_INTRXThresholdDis(UART_TypeDef *UARTx)
{
- UARTx->CTRL &= ~(0x01 << UART_CTRL_RXIE_Pos);
+ UARTx->CTRL &= ~(0x01 << UART_CTRL_RXIE_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_INTRXThresholdStat()
-* ����˵��: �Ƿ�RX FIFO�����ݸ��� >= RXThreshold
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t 1 RX FIFO�����ݸ��� >= RXThreshold 0 RX FIFO�����ݸ��� < RXThreshold
-* ע������: RXIF = RXTHRF & RXIE
+* 函数名称: UART_INTRXThresholdStat()
+* 功能说明: 是否RX FIFO中数据个数 >= RXThreshold
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 1 RX FIFO中数据个数 >= RXThreshold 0 RX FIFO中数据个数 < RXThreshold
+* 注意事项: RXIF = RXTHRF & RXIE
******************************************************************************************************************************************/
-uint32_t UART_INTRXThresholdStat(UART_TypeDef * UARTx)
+uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx)
{
- return (UARTx->BAUD & UART_BAUD_RXIF_Msk) ? 1 : 0;
+ return (UARTx->BAUD & UART_BAUD_RXIF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: UART_INTTXThresholdEn()
-* ����˵��: ��TX FIFO�����ݸ��� <= TXThresholdʱ �����ж�
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_INTTXThresholdEn()
+* 功能说明: 当TX FIFO中数据个数 <= TXThreshold时 触发中断
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_INTTXThresholdEn(UART_TypeDef * UARTx)
+void UART_INTTXThresholdEn(UART_TypeDef *UARTx)
{
- UARTx->CTRL |= (0x01 << UART_CTRL_TXIE_Pos);
+ UARTx->CTRL |= (0x01 << UART_CTRL_TXIE_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_INTTXThresholdDis()
-* ����˵��: ��TX FIFO�����ݸ��� <= TXThresholdʱ �������ж�
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_INTTXThresholdDis()
+* 功能说明: 当TX FIFO中数据个数 <= TXThreshold时 不触发中断
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_INTTXThresholdDis(UART_TypeDef * UARTx)
+void UART_INTTXThresholdDis(UART_TypeDef *UARTx)
{
- UARTx->CTRL &= ~(0x01 << UART_CTRL_TXIE_Pos);
+ UARTx->CTRL &= ~(0x01 << UART_CTRL_TXIE_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_INTTXThresholdStat()
-* ����˵��: �Ƿ�TX FIFO�����ݸ��� <= TXThreshold
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t 1 TX FIFO�����ݸ��� <= TXThreshold 0 TX FIFO�����ݸ��� > TXThreshold
-* ע������: TXIF = TXTHRF & TXIE
+* 函数名称: UART_INTTXThresholdStat()
+* 功能说明: 是否TX FIFO中数据个数 <= TXThreshold
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 1 TX FIFO中数据个数 <= TXThreshold 0 TX FIFO中数据个数 > TXThreshold
+* 注意事项: TXIF = TXTHRF & TXIE
******************************************************************************************************************************************/
-uint32_t UART_INTTXThresholdStat(UART_TypeDef * UARTx)
+uint32_t UART_INTTXThresholdStat(UART_TypeDef *UARTx)
{
- return (UARTx->BAUD & UART_BAUD_TXIF_Msk) ? 1 : 0;
+ return (UARTx->BAUD & UART_BAUD_TXIF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: UART_INTTimeoutEn()
-* ����˵��: ���շ�����ʱʱ �����ж�
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_INTTimeoutEn()
+* 功能说明: 接收发生超时时 触发中断
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_INTTimeoutEn(UART_TypeDef * UARTx)
+void UART_INTTimeoutEn(UART_TypeDef *UARTx)
{
- UARTx->CTRL |= (0x01 << UART_CTRL_TOIE_Pos);
+ UARTx->CTRL |= (0x01 << UART_CTRL_TOIE_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_INTTimeoutDis()
-* ����˵��: ���շ�����ʱʱ �������ж�
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_INTTimeoutDis()
+* 功能说明: 接收发生超时时 不触发中断
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_INTTimeoutDis(UART_TypeDef * UARTx)
+void UART_INTTimeoutDis(UART_TypeDef *UARTx)
{
- UARTx->CTRL &= ~(0x01 << UART_CTRL_TOIE_Pos);
+ UARTx->CTRL &= ~(0x01 << UART_CTRL_TOIE_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_INTTimeoutStat()
-* ����˵��: �Ƿ����˽��ճ�ʱ�������� TimeoutTime/(Baudrate/10) ��û����RX���Ͻ��յ�����ʱ�����ж�
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t 1 �����˽��ճ�ʱ 0 δ�������ճ�ʱ
-* ע������: ��
+* 函数名称: UART_INTTimeoutStat()
+* 功能说明: 是否发生了接收超时,即超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 1 发生了接收超时 0 未发生接收超时
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t UART_INTTimeoutStat(UART_TypeDef * UARTx)
+uint32_t UART_INTTimeoutStat(UART_TypeDef *UARTx)
{
- return (UARTx->BAUD & UART_BAUD_TOIF_Msk) ? 1 : 0;
+ return (UARTx->BAUD & UART_BAUD_TOIF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
-* ��������: UART_INTTXDoneEn()
-* ����˵��: ����FIFO���ҷ�����λ�Ĵ������ж�ʹ��
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_INTTXDoneEn()
+* 功能说明: 发送FIFO空且发送移位寄存器空中断使能
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_INTTXDoneEn(UART_TypeDef * UARTx)
+void UART_INTTXDoneEn(UART_TypeDef *UARTx)
{
- UARTx->CTRL |= (0x01 << UART_CTRL_TXDOIE_Pos);
+ UARTx->CTRL |= (0x01 << UART_CTRL_TXDOIE_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_INTTXDoneDis()
-* ����˵��: ����FIFO���ҷ�����λ�Ĵ������жϽ�ֹ
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: ��
-* ע������: ��
+* 函数名称: UART_INTTXDoneDis()
+* 功能说明: 发送FIFO空且发送移位寄存器空中断禁止
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void UART_INTTXDoneDis(UART_TypeDef * UARTx)
+void UART_INTTXDoneDis(UART_TypeDef *UARTx)
{
- UARTx->CTRL &= ~(0x01 << UART_CTRL_TXDOIE_Pos);
+ UARTx->CTRL &= ~(0x01 << UART_CTRL_TXDOIE_Pos);
}
/******************************************************************************************************************************************
-* ��������: UART_INTTXDoneStat()
-* ����˵��: ����FIFO���ҷ�����λ�Ĵ������ж�״̬
-* �� ��: UART_TypeDef * UARTx ָ��Ҫ�����õ�UART���ڣ���Чֵ����UART0��UART1��UART2��UART3
-* �� ��: uint32_t 1 ����FIFO���ҷ�����λ�Ĵ����� 0 ����FIFO������λ�Ĵ���δ��
-* ע������: ��
+* 函数名称: UART_INTTXDoneStat()
+* 功能说明: 发送FIFO空且发送移位寄存器空中断状态
+* 输 入: UART_TypeDef * UARTx 指定要被设置的UART串口,有效值包括UART0、UART1、UART2、UART3
+* 输 出: uint32_t 1 发送FIFO空且发送移位寄存器空 0 发送FIFO或发送移位寄存器未空
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t UART_INTTXDoneStat(UART_TypeDef * UARTx)
+uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx)
{
- return (UARTx->BAUD & UART_BAUD_TXDOIF_Msk) ? 1 : 0;
+ return (UARTx->BAUD & UART_BAUD_TXDOIF_Msk) ? 1 : 0;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.h
index 1611744cb7..08bd6f805b 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_uart.h
@@ -1,94 +1,90 @@
#ifndef __SWM320_UART_H__
#define __SWM320_UART_H__
-typedef struct {
- uint32_t Baudrate;
-
- uint8_t DataBits; //����λλ������ȡֵUART_DATA_8BIT��UART_DATA_9BIT
-
- uint8_t Parity; //��żУ��λ����ȡֵUART_PARITY_NONE��UART_PARITY_ODD��UART_PARITY_EVEN��UART_PARITY_ONE��UART_PARITY_ZERO
-
- uint8_t StopBits; //ֹͣλλ������ȡֵUART_STOP_1BIT��UART_STOP_2BIT
-
- uint8_t RXThreshold; //ȡֵ0--7
- uint8_t RXThresholdIEn; //��RX FIFO�����ݸ��� > RXThresholdʱ�����ж�
-
- uint8_t TXThreshold; //ȡֵ0--7
- uint8_t TXThresholdIEn; //��TX FIFO�����ݸ��� <= TXThresholdʱ�����ж�
-
- uint8_t TimeoutTime; //��ʱʱ�� = TimeoutTime/(Baudrate/10) ��
- uint8_t TimeoutIEn; //��ʱ�жϣ�RX FIFO�ǿգ��ҳ��� TimeoutTime/(Baudrate/10) ��û����RX���Ͻ��յ�����ʱ�����ж�
-} UART_InitStructure;
+typedef struct
+{
+ uint32_t Baudrate;
+
+ uint8_t DataBits; //数据位位数,可取值UART_DATA_8BIT、UART_DATA_9BIT
+ uint8_t Parity; //奇偶校验位,可取值UART_PARITY_NONE、UART_PARITY_ODD、UART_PARITY_EVEN、UART_PARITY_ONE、UART_PARITY_ZERO
-#define UART_DATA_8BIT 0
-#define UART_DATA_9BIT 1
+ uint8_t StopBits; //停止位位数,可取值UART_STOP_1BIT、UART_STOP_2BIT
-#define UART_PARITY_NONE 0
-#define UART_PARITY_ODD 1
-#define UART_PARITY_EVEN 3
-#define UART_PARITY_ONE 5
-#define UART_PARITY_ZERO 7
+ uint8_t RXThreshold; //取值0--7
+ uint8_t RXThresholdIEn; //当RX FIFO中数据个数 > RXThreshold时触发中断
-#define UART_STOP_1BIT 0
-#define UART_STOP_2BIT 1
+ uint8_t TXThreshold; //取值0--7
+ uint8_t TXThresholdIEn; //当TX FIFO中数据个数 <= TXThreshold时触发中断
-#define UART_RTS_1BYTE 0
-#define UART_RTS_2BYTE 1
-#define UART_RTS_4BYTE 2
-#define UART_RTS_6BYTE 3
+ uint8_t TimeoutTime; //超时时长 = TimeoutTime/(Baudrate/10) 秒
+ uint8_t TimeoutIEn; //超时中断,RX FIFO非空,且超过 TimeoutTime/(Baudrate/10) 秒没有在RX线上接收到数据时触发中断
+} UART_InitStructure;
-#define UART_ABR_RES_OK 1
-#define UART_ABR_RES_ERR 2
+#define UART_DATA_8BIT 0
+#define UART_DATA_9BIT 1
-#define UART_ERR_FRAME 1
-#define UART_ERR_PARITY 2
-#define UART_ERR_NOISE 3
+#define UART_PARITY_NONE 0
+#define UART_PARITY_ODD 1
+#define UART_PARITY_EVEN 3
+#define UART_PARITY_ONE 5
+#define UART_PARITY_ZERO 7
+#define UART_STOP_1BIT 0
+#define UART_STOP_2BIT 1
-void UART_Init(UART_TypeDef * UARTx, UART_InitStructure * initStruct); //UART���ڳ�ʼ��
-void UART_Open(UART_TypeDef * UARTx);
-void UART_Close(UART_TypeDef * UARTx);
+#define UART_RTS_1BYTE 0
+#define UART_RTS_2BYTE 1
+#define UART_RTS_4BYTE 2
+#define UART_RTS_6BYTE 3
-void UART_WriteByte(UART_TypeDef * UARTx, uint32_t data); //����һ���ֽ�����
-uint32_t UART_ReadByte(UART_TypeDef * UARTx, uint32_t * data); //��ȡһ���ֽ����ݣ���ָ�������Ƿ�Valid
+#define UART_ABR_RES_OK 1
+#define UART_ABR_RES_ERR 2
-uint32_t UART_IsTXBusy(UART_TypeDef * UARTx);
-uint32_t UART_IsRXFIFOEmpty(UART_TypeDef * UARTx); //����FIFO�Ƿ�գ������������Լ���UART_ReadByte()
-uint32_t UART_IsTXFIFOFull(UART_TypeDef * UARTx); //����FIFO�Ƿ����������������Լ���UART_WriteByte()
+#define UART_ERR_FRAME 1
+#define UART_ERR_PARITY 2
+#define UART_ERR_NOISE 3
+void UART_Init(UART_TypeDef *UARTx, UART_InitStructure *initStruct); //UART串口初始化
+void UART_Open(UART_TypeDef *UARTx);
+void UART_Close(UART_TypeDef *UARTx);
-void UART_SetBaudrate(UART_TypeDef * UARTx, uint32_t baudrate); //������
-uint32_t UART_GetBaudrate(UART_TypeDef * UARTx); //��ȡ��ǰʹ�õIJ�����
+void UART_WriteByte(UART_TypeDef *UARTx, uint32_t data); //发送一个字节数据
+uint32_t UART_ReadByte(UART_TypeDef *UARTx, uint32_t *data); //读取一个字节数据,并指出数据是否Valid
-void UART_CTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity);
-uint32_t UART_CTSLineState(UART_TypeDef * UARTx);
+uint32_t UART_IsTXBusy(UART_TypeDef *UARTx);
+uint32_t UART_IsRXFIFOEmpty(UART_TypeDef *UARTx); //接收FIFO是否空,如果不空则可以继续UART_ReadByte()
+uint32_t UART_IsTXFIFOFull(UART_TypeDef *UARTx); //发送FIFO是否满,如果不满则可以继续UART_WriteByte()
-void UART_RTSConfig(UART_TypeDef * UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold);
-uint32_t UART_RTSLineState(UART_TypeDef * UARTx);
+void UART_SetBaudrate(UART_TypeDef *UARTx, uint32_t baudrate); //设置波特率
+uint32_t UART_GetBaudrate(UART_TypeDef *UARTx); //获取当前使用的波特率
-void UART_LINConfig(UART_TypeDef * UARTx, uint32_t detectedIEn, uint32_t generatedIEn);
-void UART_LINGenerate(UART_TypeDef * UARTx);
-uint32_t UART_LINIsDetected(UART_TypeDef * UARTx);
-uint32_t UART_LINIsGenerated(UART_TypeDef * UARTx);
+void UART_CTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity);
+uint32_t UART_CTSLineState(UART_TypeDef *UARTx);
-void UART_ABRStart(UART_TypeDef * UARTx, uint32_t detectChar);
-uint32_t UART_ABRIsDone(UART_TypeDef * UARTx);
+void UART_RTSConfig(UART_TypeDef *UARTx, uint32_t enable, uint32_t polarity, uint32_t threshold);
+uint32_t UART_RTSLineState(UART_TypeDef *UARTx);
+void UART_LINConfig(UART_TypeDef *UARTx, uint32_t detectedIEn, uint32_t generatedIEn);
+void UART_LINGenerate(UART_TypeDef *UARTx);
+uint32_t UART_LINIsDetected(UART_TypeDef *UARTx);
+uint32_t UART_LINIsGenerated(UART_TypeDef *UARTx);
-void UART_INTRXThresholdEn(UART_TypeDef * UARTx);
-void UART_INTRXThresholdDis(UART_TypeDef * UARTx);
-uint32_t UART_INTRXThresholdStat(UART_TypeDef * UARTx);
-void UART_INTTXThresholdEn(UART_TypeDef * UARTx);
-void UART_INTTXThresholdDis(UART_TypeDef * UARTx);
-uint32_t UART_INTTXThresholdStat(UART_TypeDef * UARTx);
-void UART_INTTimeoutEn(UART_TypeDef * UARTx);
-void UART_INTTimeoutDis(UART_TypeDef * UARTx);
-uint32_t UART_INTTimeoutStat(UART_TypeDef * UARTx);
+void UART_ABRStart(UART_TypeDef *UARTx, uint32_t detectChar);
+uint32_t UART_ABRIsDone(UART_TypeDef *UARTx);
-void UART_INTTXDoneEn(UART_TypeDef * UARTx);
-void UART_INTTXDoneDis(UART_TypeDef * UARTx);
-uint32_t UART_INTTXDoneStat(UART_TypeDef * UARTx);
+void UART_INTRXThresholdEn(UART_TypeDef *UARTx);
+void UART_INTRXThresholdDis(UART_TypeDef *UARTx);
+uint32_t UART_INTRXThresholdStat(UART_TypeDef *UARTx);
+void UART_INTTXThresholdEn(UART_TypeDef *UARTx);
+void UART_INTTXThresholdDis(UART_TypeDef *UARTx);
+uint32_t UART_INTTXThresholdStat(UART_TypeDef *UARTx);
+void UART_INTTimeoutEn(UART_TypeDef *UARTx);
+void UART_INTTimeoutDis(UART_TypeDef *UARTx);
+uint32_t UART_INTTimeoutStat(UART_TypeDef *UARTx);
+void UART_INTTXDoneEn(UART_TypeDef *UARTx);
+void UART_INTTXDoneDis(UART_TypeDef *UARTx);
+uint32_t UART_INTTXDoneStat(UART_TypeDef *UARTx);
#endif //__SWM320_UART_H__
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.c b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.c
index 762e79b3ae..7cc8244685 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.c
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.c
@@ -1,10 +1,10 @@
/******************************************************************************************************************************************
-* �����: SWM320_wdt.c
-* ����˵��: SWM320��Ƭ����WDT���Ź�����������
-* ����֧��: http://www.synwit.com.cn/e/tool/gbook/?bid=1
-* ע������:
-* �汾����: V1.1.0 2017��10��25��
-* ������¼:
+* 文件名称: SWM320_wdt.c
+* 功能说明: SWM320单片机的WDT看门狗功能驱动库
+* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
+* 注意事项:
+* 版本日期: V1.1.0 2017年10月25日
+* 升级记录:
*
*
*******************************************************************************************************************************************
@@ -21,106 +21,105 @@
#include "SWM320.h"
#include "SWM320_wdt.h"
-
/******************************************************************************************************************************************
-* ��������: WDT_Init()
-* ����˵��: WDT���Ź���ʼ��
-* �� ��: WDT_TypeDef * WDTx ָ��Ҫ�����õĿ��Ź�����Чֵ����WDT
-* uint32_t peroid ȡֵ0--4294967295����λΪ��Ƭ��ϵͳʱ������
-* uint32_t mode WDT_MODE_RESET ��ʱ������λ WDT_MODE_INTERRUPT ��ʱ�����ж�
-* �� ��: ��
-* ע������: ��λʹ��ʱ�жϲ������ã���Ϊ�������ڽ���ʱоƬֱ�Ӹ�λ�ˣ��޷���Ӧ�ж�
+* 函数名称: WDT_Init()
+* 功能说明: WDT看门狗初始化
+* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
+* uint32_t peroid 取值0--4294967295,单位为单片机系统时钟周期
+* uint32_t mode WDT_MODE_RESET 超时产生复位 WDT_MODE_INTERRUPT 超时产生中断
+* 输 出: 无
+* 注意事项: 复位使能时中断不起作用,因为计数周期结束时芯片直接复位了,无法响应中断
******************************************************************************************************************************************/
-void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode)
+void WDT_Init(WDT_TypeDef *WDTx, uint32_t peroid, uint32_t mode)
{
- SYS->CLKEN |= (0x01 << SYS_CLKEN_WDT_Pos);
-
- WDT_Stop(WDTx); //����ǰ�ȹر�
-
- WDTx->LOAD = peroid;
-
- if(mode == WDT_MODE_RESET)
- {
- NVIC_DisableIRQ(WDT_IRQn);
-
- WDTx->CR |= (1 << WDT_CR_RSTEN_Pos);
- }
- else //mode == WDT_MODE_INTERRUPT
- {
- NVIC_EnableIRQ(WDT_IRQn);
-
- WDTx->CR &= ~(1 << WDT_CR_RSTEN_Pos);
- }
+ SYS->CLKEN |= (0x01 << SYS_CLKEN_WDT_Pos);
+
+ WDT_Stop(WDTx); //设置前先关闭
+
+ WDTx->LOAD = peroid;
+
+ if (mode == WDT_MODE_RESET)
+ {
+ NVIC_DisableIRQ(WDT_IRQn);
+
+ WDTx->CR |= (1 << WDT_CR_RSTEN_Pos);
+ }
+ else //mode == WDT_MODE_INTERRUPT
+ {
+ NVIC_EnableIRQ(WDT_IRQn);
+
+ WDTx->CR &= ~(1 << WDT_CR_RSTEN_Pos);
+ }
}
/******************************************************************************************************************************************
-* ��������: WDT_Start()
-* ����˵��: ����ָ��WDT����ʼ����ʱ
-* �� ��: WDT_TypeDef * WDTx ָ��Ҫ�����õĿ��Ź�����Чֵ����WDT
-* �� ��: ��
-* ע������: ��
+* 函数名称: WDT_Start()
+* 功能说明: 启动指定WDT,开始倒计时
+* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void WDT_Start(WDT_TypeDef * WDTx)
+void WDT_Start(WDT_TypeDef *WDTx)
{
- WDTx->CR |= (0x01 << WDT_CR_EN_Pos);
+ WDTx->CR |= (0x01 << WDT_CR_EN_Pos);
}
/******************************************************************************************************************************************
-* ��������: WDT_Stop()
-* ����˵��: �ر�ָ��WDT��ֹͣ����ʱ
-* �� ��: WDT_TypeDef * WDTx ָ��Ҫ�����õĿ��Ź�����Чֵ����WDT
-* �� ��: ��
-* ע������: ��
+* 函数名称: WDT_Stop()
+* 功能说明: 关闭指定WDT,停止倒计时
+* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void WDT_Stop(WDT_TypeDef * WDTx)
+void WDT_Stop(WDT_TypeDef *WDTx)
{
- WDTx->CR &= ~(0x01 << WDT_CR_EN_Pos);
+ WDTx->CR &= ~(0x01 << WDT_CR_EN_Pos);
}
/******************************************************************************************************************************************
-* ��������: WDT_Feed()
-* ����˵��: ι�������´�װ��ֵ��ʼ����ʱ
-* �� ��: WDT_TypeDef * WDTx ָ��Ҫ�����õĿ��Ź�����Чֵ����WDT
-* �� ��: ��
-* ע������: ��
+* 函数名称: WDT_Feed()
+* 功能说明: 喂狗,重新从装载值开始倒计时
+* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void WDT_Feed(WDT_TypeDef * WDTx)
+void WDT_Feed(WDT_TypeDef *WDTx)
{
- WDTx->FEED = 0x55;
+ WDTx->FEED = 0x55;
}
/******************************************************************************************************************************************
-* ��������: WDT_GetValue()
-* ����˵��: ��ȡָ�����Ź���ʱ���ĵ�ǰ����ʱֵ
-* �� ��: WDT_TypeDef * WDTx ָ��Ҫ�����õĿ��Ź�����Чֵ����WDT
-* �� ��: int32_t ���Ź���ǰ����ֵ
-* ע������: ��
+* 函数名称: WDT_GetValue()
+* 功能说明: 获取指定看门狗定时器的当前倒计时值
+* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
+* 输 出: int32_t 看门狗当前计数值
+* 注意事项: 无
******************************************************************************************************************************************/
-int32_t WDT_GetValue(WDT_TypeDef * WDTx)
+int32_t WDT_GetValue(WDT_TypeDef *WDTx)
{
- return WDTx->VALUE;
+ return WDTx->VALUE;
}
/******************************************************************************************************************************************
-* ��������: WDT_INTClr()
-* ����˵��: �жϱ�־���
-* �� ��: WDT_TypeDef * WDTx ָ��Ҫ�����õĿ��Ź�����Чֵ����WDT
-* �� ��: ��
-* ע������: ��
+* 函数名称: WDT_INTClr()
+* 功能说明: 中断标志清除
+* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
+* 输 出: 无
+* 注意事项: 无
******************************************************************************************************************************************/
-void WDT_INTClr(WDT_TypeDef * WDTx)
+void WDT_INTClr(WDT_TypeDef *WDTx)
{
- WDTx->IF = 1;
+ WDTx->IF = 1;
}
/******************************************************************************************************************************************
-* ��������: WDT_INTStat()
-* ����˵��: �ж�״̬��ѯ
-* �� ��: WDT_TypeDef * WDTx ָ��Ҫ�����õĿ��Ź�����Чֵ����WDT
-* �� ��: int32_t 1 �����ж���� 0 δ�����ж����
-* ע������: ��
+* 函数名称: WDT_INTStat()
+* 功能说明: 中断状态查询
+* 输 入: WDT_TypeDef * WDTx 指定要被设置的看门狗,有效值包括WDT
+* 输 出: int32_t 1 发生中断溢出 0 未发生中断溢出
+* 注意事项: 无
******************************************************************************************************************************************/
-uint32_t WDT_INTStat(WDT_TypeDef * WDTx)
+uint32_t WDT_INTStat(WDT_TypeDef *WDTx)
{
- return WDTx->IF;
+ return WDTx->IF;
}
diff --git a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.h b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.h
index 1d056ba296..692d1fe65b 100644
--- a/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.h
+++ b/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_wdt.h
@@ -1,19 +1,18 @@
#ifndef __SWM320_WDT_H__
-#define __SWM320_WDT_H__
+#define __SWM320_WDT_H__
-#define WDT_MODE_RESET 0
-#define WDT_MODE_INTERRUPT 1
+#define WDT_MODE_RESET 0
+#define WDT_MODE_INTERRUPT 1
-void WDT_Init(WDT_TypeDef * WDTx, uint32_t peroid, uint32_t mode); //WDT���Ź���ʼ��
-void WDT_Start(WDT_TypeDef * WDTx); //����ָ��WDT����ʼ����ʱ
-void WDT_Stop(WDT_TypeDef * WDTx); //�ر�ָ��WDT��ֹͣ����ʱ
+void WDT_Init(WDT_TypeDef *WDTx, uint32_t peroid, uint32_t mode); //WDT看门狗初始化
+void WDT_Start(WDT_TypeDef *WDTx); //启动指定WDT,开始倒计时
+void WDT_Stop(WDT_TypeDef *WDTx); //关闭指定WDT,停止倒计时
-void WDT_Feed(WDT_TypeDef * WDTx); //ι�������´�װ��ֵ��ʼ����ʱ
+void WDT_Feed(WDT_TypeDef *WDTx); //喂狗,重新从装载值开始倒计时
-int32_t WDT_GetValue(WDT_TypeDef * WDTx); //��ȡָ�����Ź���ʱ���ĵ�ǰ����ʱֵ
+int32_t WDT_GetValue(WDT_TypeDef *WDTx); //获取指定看门狗定时器的当前倒计时值
+void WDT_INTClr(WDT_TypeDef *WDTx); //中断标志清除
+uint32_t WDT_INTStat(WDT_TypeDef *WDTx); //中断状态查询
-void WDT_INTClr(WDT_TypeDef * WDTx); //�жϱ�־���
-uint32_t WDT_INTStat(WDT_TypeDef * WDTx); //�ж�״̬��ѯ
-
#endif //__SWM320_WDT_H__
diff --git a/src/kservice.c b/src/kservice.c
index e9972dba97..7ed05b6651 100644
--- a/src/kservice.c
+++ b/src/kservice.c
@@ -922,7 +922,7 @@ rt_int32_t rt_vsnprintf(char *buf,
s = va_arg(args, char *);
if (!s) s = "(NULL)";
- len = rt_strlen(s);
+ for (len = 0; (len != field_width) && (s[len] != '\0'); len++);
#ifdef RT_PRINTF_PRECISION
if (precision > 0 && len > precision) len = precision;
#endif
diff --git a/tools/file_check.py b/tools/file_check.py
index e79332b325..046b2a009f 100644
--- a/tools/file_check.py
+++ b/tools/file_check.py
@@ -144,7 +144,7 @@ class FormatCheck:
logging.warning("There are no files to check format.")
return True
encoding_check_result = True
- format_check_result = True
+ format_check_fail_files = 0
for file_path in self.file_list:
code = ''
if file_path.endswith(".c") or file_path.endswith(".h"):
@@ -166,9 +166,10 @@ class FormatCheck:
with open(file_path, 'r', encoding = "utf-8") as f:
file_lines = f.readlines()
- format_check_result = self.__check_file(file_lines, file_path)
+ if not self.__check_file(file_lines, file_path):
+ format_check_fail_files += 1
- if not encoding_check_result or not format_check_result:
+ if (not encoding_check_result) or (format_check_fail_files != 0):
logging.error("files format check fail.")
return False