mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-09-22 03:09:16 +08:00
Merge pull request #3212 from wangyq2018/es8p508x
[bsp]add bsp essemi/es8p508x.
This commit is contained in:
@@ -0,0 +1,405 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# RT-Thread Configuration
|
||||
#
|
||||
|
||||
#
|
||||
# RT-Thread Kernel
|
||||
#
|
||||
CONFIG_RT_NAME_MAX=8
|
||||
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
|
||||
# CONFIG_RT_USING_SMP is not set
|
||||
CONFIG_RT_ALIGN_SIZE=4
|
||||
# CONFIG_RT_THREAD_PRIORITY_8 is not set
|
||||
CONFIG_RT_THREAD_PRIORITY_32=y
|
||||
# CONFIG_RT_THREAD_PRIORITY_256 is not set
|
||||
CONFIG_RT_THREAD_PRIORITY_MAX=32
|
||||
CONFIG_RT_TICK_PER_SECOND=100
|
||||
CONFIG_RT_USING_OVERFLOW_CHECK=y
|
||||
CONFIG_RT_USING_HOOK=y
|
||||
CONFIG_RT_USING_IDLE_HOOK=y
|
||||
CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
|
||||
CONFIG_IDLE_THREAD_STACK_SIZE=256
|
||||
# CONFIG_RT_USING_TIMER_SOFT is not set
|
||||
CONFIG_RT_DEBUG=y
|
||||
# CONFIG_RT_DEBUG_COLOR is not set
|
||||
# CONFIG_RT_DEBUG_INIT_CONFIG is not set
|
||||
# CONFIG_RT_DEBUG_THREAD_CONFIG is not set
|
||||
# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set
|
||||
# CONFIG_RT_DEBUG_IPC_CONFIG is not set
|
||||
# CONFIG_RT_DEBUG_TIMER_CONFIG is not set
|
||||
# CONFIG_RT_DEBUG_IRQ_CONFIG is not set
|
||||
# CONFIG_RT_DEBUG_MEM_CONFIG is not set
|
||||
# CONFIG_RT_DEBUG_SLAB_CONFIG is not set
|
||||
# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set
|
||||
# CONFIG_RT_DEBUG_MODULE_CONFIG is not set
|
||||
|
||||
#
|
||||
# Inter-Thread communication
|
||||
#
|
||||
CONFIG_RT_USING_SEMAPHORE=y
|
||||
CONFIG_RT_USING_MUTEX=y
|
||||
CONFIG_RT_USING_EVENT=y
|
||||
CONFIG_RT_USING_MAILBOX=y
|
||||
CONFIG_RT_USING_MESSAGEQUEUE=y
|
||||
# CONFIG_RT_USING_SIGNALS is not set
|
||||
|
||||
#
|
||||
# Memory Management
|
||||
#
|
||||
CONFIG_RT_USING_MEMPOOL=y
|
||||
# CONFIG_RT_USING_MEMHEAP is not set
|
||||
# CONFIG_RT_USING_NOHEAP is not set
|
||||
CONFIG_RT_USING_SMALL_MEM=y
|
||||
# CONFIG_RT_USING_SLAB is not set
|
||||
# CONFIG_RT_USING_MEMTRACE is not set
|
||||
CONFIG_RT_USING_HEAP=y
|
||||
|
||||
#
|
||||
# Kernel Device Object
|
||||
#
|
||||
CONFIG_RT_USING_DEVICE=y
|
||||
# CONFIG_RT_USING_DEVICE_OPS is not set
|
||||
# CONFIG_RT_USING_INTERRUPT_INFO is not set
|
||||
CONFIG_RT_USING_CONSOLE=y
|
||||
CONFIG_RT_CONSOLEBUF_SIZE=128
|
||||
CONFIG_RT_CONSOLE_DEVICE_NAME="uart5"
|
||||
CONFIG_RT_VER_NUM=0x40002
|
||||
# CONFIG_RT_USING_CPU_FFS is not set
|
||||
# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
|
||||
|
||||
#
|
||||
# RT-Thread Components
|
||||
#
|
||||
CONFIG_RT_USING_COMPONENTS_INIT=y
|
||||
CONFIG_RT_USING_USER_MAIN=y
|
||||
CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048
|
||||
CONFIG_RT_MAIN_THREAD_PRIORITY=10
|
||||
|
||||
#
|
||||
# C++ features
|
||||
#
|
||||
# CONFIG_RT_USING_CPLUSPLUS is not set
|
||||
|
||||
#
|
||||
# Command shell
|
||||
#
|
||||
CONFIG_RT_USING_FINSH=y
|
||||
CONFIG_FINSH_THREAD_NAME="tshell"
|
||||
CONFIG_FINSH_USING_HISTORY=y
|
||||
CONFIG_FINSH_HISTORY_LINES=5
|
||||
CONFIG_FINSH_USING_SYMTAB=y
|
||||
CONFIG_FINSH_USING_DESCRIPTION=y
|
||||
# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
|
||||
CONFIG_FINSH_THREAD_PRIORITY=20
|
||||
CONFIG_FINSH_THREAD_STACK_SIZE=2048
|
||||
CONFIG_FINSH_CMD_SIZE=80
|
||||
# CONFIG_FINSH_USING_AUTH is not set
|
||||
CONFIG_FINSH_USING_MSH=y
|
||||
CONFIG_FINSH_USING_MSH_DEFAULT=y
|
||||
CONFIG_FINSH_USING_MSH_ONLY=y
|
||||
CONFIG_FINSH_ARG_MAX=10
|
||||
|
||||
#
|
||||
# Device virtual file system
|
||||
#
|
||||
# CONFIG_RT_USING_DFS is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
CONFIG_RT_USING_DEVICE_IPC=y
|
||||
CONFIG_RT_PIPE_BUFSZ=512
|
||||
# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
|
||||
CONFIG_RT_USING_SERIAL=y
|
||||
# CONFIG_RT_SERIAL_USING_DMA is not set
|
||||
CONFIG_RT_SERIAL_RB_BUFSZ=64
|
||||
# CONFIG_RT_USING_CAN is not set
|
||||
# CONFIG_RT_USING_HWTIMER is not set
|
||||
# CONFIG_RT_USING_CPUTIME is not set
|
||||
# CONFIG_RT_USING_I2C is not set
|
||||
CONFIG_RT_USING_PIN=y
|
||||
# CONFIG_RT_USING_ADC is not set
|
||||
# CONFIG_RT_USING_PWM is not set
|
||||
# CONFIG_RT_USING_MTD_NOR is not set
|
||||
# CONFIG_RT_USING_MTD_NAND is not set
|
||||
# CONFIG_RT_USING_PM is not set
|
||||
# CONFIG_RT_USING_RTC is not set
|
||||
# CONFIG_RT_USING_SDIO is not set
|
||||
# CONFIG_RT_USING_SPI is not set
|
||||
# CONFIG_RT_USING_WDT is not set
|
||||
# CONFIG_RT_USING_AUDIO is not set
|
||||
# CONFIG_RT_USING_SENSOR is not set
|
||||
# CONFIG_RT_USING_TOUCH is not set
|
||||
# CONFIG_RT_USING_HWCRYPTO is not set
|
||||
# CONFIG_RT_USING_PULSE_ENCODER is not set
|
||||
# CONFIG_RT_USING_INPUT_CAPTURE is not set
|
||||
# CONFIG_RT_USING_WIFI is not set
|
||||
|
||||
#
|
||||
# Using USB
|
||||
#
|
||||
# CONFIG_RT_USING_USB_HOST is not set
|
||||
# CONFIG_RT_USING_USB_DEVICE is not set
|
||||
|
||||
#
|
||||
# POSIX layer and C standard library
|
||||
#
|
||||
# CONFIG_RT_USING_LIBC is not set
|
||||
# CONFIG_RT_USING_PTHREADS is not set
|
||||
# CONFIG_RT_LIBC_USING_TIME is not set
|
||||
|
||||
#
|
||||
# Network
|
||||
#
|
||||
|
||||
#
|
||||
# Socket abstraction layer
|
||||
#
|
||||
# CONFIG_RT_USING_SAL is not set
|
||||
|
||||
#
|
||||
# Network interface device
|
||||
#
|
||||
# CONFIG_RT_USING_NETDEV is not set
|
||||
|
||||
#
|
||||
# light weight TCP/IP stack
|
||||
#
|
||||
# CONFIG_RT_USING_LWIP is not set
|
||||
|
||||
#
|
||||
# AT commands
|
||||
#
|
||||
# CONFIG_RT_USING_AT is not set
|
||||
|
||||
#
|
||||
# VBUS(Virtual Software BUS)
|
||||
#
|
||||
# CONFIG_RT_USING_VBUS is not set
|
||||
|
||||
#
|
||||
# Utilities
|
||||
#
|
||||
# CONFIG_RT_USING_RYM is not set
|
||||
# CONFIG_RT_USING_ULOG is not set
|
||||
# CONFIG_RT_USING_UTEST is not set
|
||||
|
||||
#
|
||||
# RT-Thread online packages
|
||||
#
|
||||
|
||||
#
|
||||
# IoT - internet of things
|
||||
#
|
||||
# CONFIG_PKG_USING_PAHOMQTT is not set
|
||||
# CONFIG_PKG_USING_WEBCLIENT is not set
|
||||
# CONFIG_PKG_USING_WEBNET is not set
|
||||
# CONFIG_PKG_USING_MONGOOSE is not set
|
||||
# CONFIG_PKG_USING_MYMQTT is not set
|
||||
# CONFIG_PKG_USING_WEBTERMINAL is not set
|
||||
# CONFIG_PKG_USING_CJSON is not set
|
||||
# CONFIG_PKG_USING_JSMN is not set
|
||||
# CONFIG_PKG_USING_LIBMODBUS is not set
|
||||
# CONFIG_PKG_USING_FREEMODBUS is not set
|
||||
# CONFIG_PKG_USING_LJSON is not set
|
||||
# CONFIG_PKG_USING_EZXML is not set
|
||||
# CONFIG_PKG_USING_NANOPB is not set
|
||||
|
||||
#
|
||||
# Wi-Fi
|
||||
#
|
||||
|
||||
#
|
||||
# Marvell WiFi
|
||||
#
|
||||
# CONFIG_PKG_USING_WLANMARVELL is not set
|
||||
|
||||
#
|
||||
# Wiced WiFi
|
||||
#
|
||||
# CONFIG_PKG_USING_WLAN_WICED is not set
|
||||
# CONFIG_PKG_USING_RW007 is not set
|
||||
# CONFIG_PKG_USING_COAP is not set
|
||||
# CONFIG_PKG_USING_NOPOLL is not set
|
||||
# CONFIG_PKG_USING_NETUTILS is not set
|
||||
# CONFIG_PKG_USING_PPP_DEVICE is not set
|
||||
# CONFIG_PKG_USING_AT_DEVICE is not set
|
||||
# CONFIG_PKG_USING_ATSRV_SOCKET is not set
|
||||
# CONFIG_PKG_USING_WIZNET is not set
|
||||
|
||||
#
|
||||
# IoT Cloud
|
||||
#
|
||||
# CONFIG_PKG_USING_ONENET is not set
|
||||
# CONFIG_PKG_USING_GAGENT_CLOUD is not set
|
||||
# CONFIG_PKG_USING_ALI_IOTKIT is not set
|
||||
# CONFIG_PKG_USING_AZURE is not set
|
||||
# CONFIG_PKG_USING_TENCENT_IOTHUB is not set
|
||||
# CONFIG_PKG_USING_JIOT-C-SDK is not set
|
||||
# CONFIG_PKG_USING_NIMBLE is not set
|
||||
# CONFIG_PKG_USING_OTA_DOWNLOADER is not set
|
||||
# CONFIG_PKG_USING_IPMSG is not set
|
||||
# CONFIG_PKG_USING_LSSDP is not set
|
||||
# CONFIG_PKG_USING_AIRKISS_OPEN is not set
|
||||
# CONFIG_PKG_USING_LIBRWS is not set
|
||||
# CONFIG_PKG_USING_TCPSERVER is not set
|
||||
# CONFIG_PKG_USING_PROTOBUF_C is not set
|
||||
# CONFIG_PKG_USING_ONNX_PARSER is not set
|
||||
# CONFIG_PKG_USING_ONNX_BACKEND is not set
|
||||
# CONFIG_PKG_USING_DLT645 is not set
|
||||
# CONFIG_PKG_USING_QXWZ is not set
|
||||
# CONFIG_PKG_USING_SMTP_CLIENT is not set
|
||||
# CONFIG_PKG_USING_ABUP_FOTA is not set
|
||||
|
||||
#
|
||||
# security packages
|
||||
#
|
||||
# CONFIG_PKG_USING_MBEDTLS is not set
|
||||
# CONFIG_PKG_USING_libsodium is not set
|
||||
# CONFIG_PKG_USING_TINYCRYPT is not set
|
||||
|
||||
#
|
||||
# language packages
|
||||
#
|
||||
# CONFIG_PKG_USING_LUA is not set
|
||||
# CONFIG_PKG_USING_JERRYSCRIPT is not set
|
||||
# CONFIG_PKG_USING_MICROPYTHON is not set
|
||||
|
||||
#
|
||||
# multimedia packages
|
||||
#
|
||||
# CONFIG_PKG_USING_OPENMV is not set
|
||||
# CONFIG_PKG_USING_MUPDF is not set
|
||||
# CONFIG_PKG_USING_STEMWIN is not set
|
||||
# CONFIG_PKG_USING_WAVPLAYER is not set
|
||||
# CONFIG_PKG_USING_TJPGD is not set
|
||||
|
||||
#
|
||||
# tools packages
|
||||
#
|
||||
# CONFIG_PKG_USING_CMBACKTRACE is not set
|
||||
# CONFIG_PKG_USING_EASYFLASH is not set
|
||||
# CONFIG_PKG_USING_EASYLOGGER is not set
|
||||
# CONFIG_PKG_USING_SYSTEMVIEW is not set
|
||||
# CONFIG_PKG_USING_RDB is not set
|
||||
# CONFIG_PKG_USING_QRCODE is not set
|
||||
# CONFIG_PKG_USING_ULOG_EASYFLASH is not set
|
||||
# CONFIG_PKG_USING_ADBD is not set
|
||||
# CONFIG_PKG_USING_COREMARK is not set
|
||||
# CONFIG_PKG_USING_DHRYSTONE is not set
|
||||
# CONFIG_PKG_USING_NR_MICRO_SHELL is not set
|
||||
|
||||
#
|
||||
# system packages
|
||||
#
|
||||
# CONFIG_PKG_USING_GUIENGINE is not set
|
||||
# CONFIG_PKG_USING_CAIRO is not set
|
||||
# CONFIG_PKG_USING_PIXMAN is not set
|
||||
# CONFIG_PKG_USING_LWEXT4 is not set
|
||||
# CONFIG_PKG_USING_PARTITION is not set
|
||||
# CONFIG_PKG_USING_FAL is not set
|
||||
# CONFIG_PKG_USING_SQLITE is not set
|
||||
# CONFIG_PKG_USING_RTI is not set
|
||||
# CONFIG_PKG_USING_LITTLEVGL2RTT is not set
|
||||
# CONFIG_PKG_USING_CMSIS is not set
|
||||
# CONFIG_PKG_USING_DFS_YAFFS is not set
|
||||
# CONFIG_PKG_USING_LITTLEFS is not set
|
||||
# CONFIG_PKG_USING_THREAD_POOL is not set
|
||||
# CONFIG_PKG_USING_ROBOTS is not set
|
||||
|
||||
#
|
||||
# peripheral libraries and drivers
|
||||
#
|
||||
# CONFIG_PKG_USING_SENSORS_DRIVERS is not set
|
||||
# CONFIG_PKG_USING_REALTEK_AMEBA is not set
|
||||
# CONFIG_PKG_USING_SHT2X is not set
|
||||
# CONFIG_PKG_USING_SHT3X is not set
|
||||
# CONFIG_PKG_USING_STM32_SDIO is not set
|
||||
# CONFIG_PKG_USING_ICM20608 is not set
|
||||
# CONFIG_PKG_USING_U8G2 is not set
|
||||
# CONFIG_PKG_USING_BUTTON is not set
|
||||
# CONFIG_PKG_USING_PCF8574 is not set
|
||||
# CONFIG_PKG_USING_SX12XX is not set
|
||||
# CONFIG_PKG_USING_SIGNAL_LED is not set
|
||||
# CONFIG_PKG_USING_LEDBLINK is not set
|
||||
# CONFIG_PKG_USING_WM_LIBRARIES is not set
|
||||
# CONFIG_PKG_USING_KENDRYTE_SDK is not set
|
||||
# CONFIG_PKG_USING_INFRARED is not set
|
||||
# CONFIG_PKG_USING_ROSSERIAL is not set
|
||||
# CONFIG_PKG_USING_AGILE_BUTTON is not set
|
||||
# CONFIG_PKG_USING_AGILE_LED is not set
|
||||
# CONFIG_PKG_USING_AT24CXX is not set
|
||||
# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set
|
||||
# CONFIG_PKG_USING_AD7746 is not set
|
||||
# CONFIG_PKG_USING_PCA9685 is not set
|
||||
# CONFIG_PKG_USING_I2C_TOOLS is not set
|
||||
# CONFIG_PKG_USING_NRF24L01 is not set
|
||||
# CONFIG_PKG_USING_TOUCH_DRIVERS is not set
|
||||
# CONFIG_PKG_USING_LCD_DRIVERS is not set
|
||||
# CONFIG_PKG_USING_MAX17048 is not set
|
||||
# CONFIG_PKG_USING_RPLIDAR is not set
|
||||
|
||||
#
|
||||
# miscellaneous packages
|
||||
#
|
||||
# CONFIG_PKG_USING_LIBCSV is not set
|
||||
# CONFIG_PKG_USING_OPTPARSE is not set
|
||||
# CONFIG_PKG_USING_FASTLZ is not set
|
||||
# CONFIG_PKG_USING_MINILZO is not set
|
||||
# CONFIG_PKG_USING_QUICKLZ is not set
|
||||
# CONFIG_PKG_USING_MULTIBUTTON is not set
|
||||
# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
|
||||
# CONFIG_PKG_USING_CANFESTIVAL is not set
|
||||
# CONFIG_PKG_USING_ZLIB is not set
|
||||
# CONFIG_PKG_USING_DSTR is not set
|
||||
# CONFIG_PKG_USING_TINYFRAME is not set
|
||||
# CONFIG_PKG_USING_KENDRYTE_DEMO is not set
|
||||
# CONFIG_PKG_USING_DIGITALCTRL is not set
|
||||
# CONFIG_PKG_USING_UPACKER is not set
|
||||
# CONFIG_PKG_USING_UPARAM is not set
|
||||
|
||||
#
|
||||
# samples: kernel and components samples
|
||||
#
|
||||
# CONFIG_PKG_USING_KERNEL_SAMPLES is not set
|
||||
# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set
|
||||
# CONFIG_PKG_USING_NETWORK_SAMPLES is not set
|
||||
# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set
|
||||
# CONFIG_PKG_USING_HELLO is not set
|
||||
# CONFIG_PKG_USING_VI is not set
|
||||
# CONFIG_PKG_USING_NNOM is not set
|
||||
# CONFIG_PKG_USING_LIBANN is not set
|
||||
# CONFIG_PKG_USING_ELAPACK is not set
|
||||
# CONFIG_PKG_USING_ARMv7M_DWT is not set
|
||||
# CONFIG_PKG_USING_VT100 is not set
|
||||
# CONFIG_PKG_USING_ULAPACK is not set
|
||||
# CONFIG_PKG_USING_UKAL is not set
|
||||
CONFIG_SOC_ES8P508x=y
|
||||
|
||||
#
|
||||
# Hardware Drivers Config
|
||||
#
|
||||
|
||||
#
|
||||
# On-chip Peripheral Drivers
|
||||
#
|
||||
CONFIG_BSP_USING_GPIO=y
|
||||
|
||||
#
|
||||
# UART Drivers
|
||||
#
|
||||
# CONFIG_BSP_USING_UART0 is not set
|
||||
# CONFIG_BSP_USING_UART1 is not set
|
||||
# CONFIG_BSP_USING_UART2 is not set
|
||||
# CONFIG_BSP_USING_UART3 is not set
|
||||
# CONFIG_BSP_USING_UART4 is not set
|
||||
CONFIG_BSP_USING_UART5=y
|
||||
|
||||
#
|
||||
# Onboard Peripheral Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Offboard Peripheral Drivers
|
||||
#
|
||||
@@ -0,0 +1,27 @@
|
||||
mainmenu "RT-Thread Configuration"
|
||||
|
||||
config BSP_DIR
|
||||
string
|
||||
option env="BSP_ROOT"
|
||||
default "."
|
||||
|
||||
config RTT_DIR
|
||||
string
|
||||
option env="RTT_ROOT"
|
||||
default "../../.."
|
||||
|
||||
config PKGS_DIR
|
||||
string
|
||||
option env="PKGS_ROOT"
|
||||
default "packages"
|
||||
|
||||
source "$RTT_DIR/Kconfig"
|
||||
source "$PKGS_DIR/Kconfig"
|
||||
|
||||
config SOC_ES8P508x
|
||||
bool
|
||||
select RT_USING_COMPONENTS_INIT
|
||||
select RT_USING_USER_MAIN
|
||||
default y
|
||||
|
||||
source "drivers/Kconfig"
|
||||
@@ -0,0 +1,91 @@
|
||||
# HRSDK-GDB-ES8P508 开发板 BSP 说明
|
||||
标签: EastSoft、国产MCU、Cortex-M0、ES8P5088FLLQ
|
||||
|
||||
## 1. 简介
|
||||
|
||||
本文档为上海东软载波微电子开发团队为 HRSDK-GDB-ES8P508 开发板提供的 BSP (板级支持包) 说明。
|
||||
通过阅读本文档,开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。
|
||||
|
||||
### 1.1 开发板介绍
|
||||
|
||||
主要内容如下:
|
||||
HRSDK-GDB-ES8P508x 是东软载波微电子官方推出的一款基于 ARM Cortex-M0 内核的开发板,最高主频为 48MHz,可满足基础功能测试及高端功能扩展等开发需求。
|
||||
|
||||
开发板外观如下图所示:
|
||||
|
||||
HRSDK-GDB-ES8P508x-V1.0
|
||||
|
||||

|
||||
|
||||
该开发板常用 **板载资源** 如下:
|
||||
|
||||
- MCU:ES8P5088FLLQ,主频 48MHz,24KB SRAM,128KB FLASH,45 GPIOs
|
||||
- 常用外设
|
||||
- LED:1个,(PA14)
|
||||
- 按键:1个(MRSTN)
|
||||
- 常用接口:GPIO、UART、SPI、I2C
|
||||
- 调试接口,ESLinkⅡ(EastSoft 官方推出的开发工具,有标准版和mini版两种版本,均自带 CDC 串口功能) SWD 下载
|
||||
|
||||
外设支持:
|
||||
|
||||
本 BSP 目前对外设的支持情况如下:
|
||||
|
||||
| **片上外设** | **支持情况** | **备注** |
|
||||
| :---------------- | :----------: | :-----------------------------------|
|
||||
| GPIO | 支持 | 45 GPIOs |
|
||||
| UART | 支持 | UART0/1/2/3/4/5 |
|
||||
|
||||
|
||||
更多详细信息请咨询[上海东软载波微电子技术支持](http://www.essemi.com/)
|
||||
|
||||
## 2. 快速上手
|
||||
|
||||
本 BSP 为开发者提供 MDK4 工程。下面以 MDK4 开发环境为例,介绍如何将系统运行起来。
|
||||
|
||||
### 硬件连接
|
||||
|
||||
使用 ESLinkⅡ (自带 CDC 串口)或 Jlink 等调试工具连接开发板到 PC,拨动开关选择使用调试工具供电或使用外部电源供电。若使用 Jlink 等调试工具,还需要将 UART5_TX(PB13)、UART5_RX(PB12)、GND 接到串口工具上。
|
||||
|
||||
使用ESlinkⅡ(mini)连接开发板如下图所示:
|
||||
|
||||
ESLinkⅡ(mini) + HRSDK-GDB-ES8P508-V1.0
|
||||
|
||||

|
||||
|
||||
### 编译下载
|
||||
|
||||
双击 project.uvprojx 文件,打开 MDK4 工程,工程默认配置使用 JLink 下载程序,在通过 JLink 连接开发板的基础上,点击下载按钮即可下载程序到开发板,如果使用 ESLinkⅡ,则选择 "CMSIS-DAP Debugger",连接正常后即可编译并下载程序到开发板。
|
||||
|
||||
### 运行结果
|
||||
|
||||
下载程序成功之后,系统会自动运行,观察串口输出的信息,同时开发板LED闪烁。
|
||||
|
||||
```bash
|
||||
\ | /
|
||||
- RT - Thread Operating System
|
||||
/ | \ 4.0.2 build Jul 12 2019
|
||||
2006 - 2019 Copyright by rt-thread team
|
||||
msh />
|
||||
```
|
||||
## 3. 进阶使用
|
||||
|
||||
此 BSP 默认只开启了 GPIO 和 uart5 的功能,如果需使用 SPI 等更多高级功能,需要利用 ENV 工具对 BSP 进行配置,步骤如下:
|
||||
|
||||
1. 在 bsp 下打开 env 工具。
|
||||
|
||||
2. 输入`menuconfig`命令配置工程,配置好之后保存退出。
|
||||
|
||||
3. 输入`pkgs --update`命令更新软件包。
|
||||
|
||||
4. 输入`scons --target=MDK4` 命令重新生成工程。
|
||||
|
||||
更多 Env 工具的详细介绍请参考 [RT-Thread 文档中心](https://www.rt-thread.org/document/site/)
|
||||
|
||||
## 4. 联系人信息
|
||||
|
||||
- [wangyongquan](https://github.com/wangyq2018)
|
||||
|
||||
## 5. 参考
|
||||
|
||||
- [ EastSoft 官网](http://www.essemi.com)
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
# RT-Thread SConscript bridge
|
||||
import os
|
||||
|
||||
objs = []
|
||||
cwd = GetCurrentDir()
|
||||
list = os.listdir(cwd)
|
||||
|
||||
for d in list:
|
||||
path = os.path.join(cwd, d)
|
||||
if os.path.isfile(os.path.join(path, 'SConscript')):
|
||||
objs = objs + SConscript(os.path.join(d, 'SConscript'))
|
||||
|
||||
Return('objs')
|
||||
@@ -0,0 +1,39 @@
|
||||
import os
|
||||
import sys
|
||||
import rtconfig
|
||||
|
||||
if os.getenv('RTT_ROOT'):
|
||||
RTT_ROOT = os.getenv('RTT_ROOT')
|
||||
else:
|
||||
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
|
||||
|
||||
sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
|
||||
try:
|
||||
from building import *
|
||||
except:
|
||||
print('Cannot found RT-Thread root directory, please check RTT_ROOT')
|
||||
print(RTT_ROOT)
|
||||
exit(-1)
|
||||
|
||||
TARGET = 'rtthread.' + rtconfig.TARGET_EXT
|
||||
|
||||
env = Environment(tools = ['mingw'],
|
||||
AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
|
||||
CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
|
||||
AR = rtconfig.AR, ARFLAGS = '-rc',
|
||||
LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
|
||||
env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
|
||||
|
||||
if rtconfig.PLATFORM == 'iar':
|
||||
env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
|
||||
env.Replace(ARFLAGS = [''])
|
||||
env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')
|
||||
|
||||
Export('RTT_ROOT')
|
||||
Export('rtconfig')
|
||||
|
||||
# prepare building environment
|
||||
objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
|
||||
|
||||
# make a building
|
||||
DoBuilding(TARGET, objs)
|
||||
@@ -0,0 +1,9 @@
|
||||
from building import *
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
src = Glob('*.c')
|
||||
|
||||
CPPPATH = [cwd]
|
||||
group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
|
||||
|
||||
Return('group')
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2019-07-12 wangyq the first version
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
#include <lib_wdt.h>
|
||||
|
||||
#define LED_PIN 29
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int count = 1;
|
||||
|
||||
/* set PA14 pin mode to output */
|
||||
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
|
||||
|
||||
while (count++)
|
||||
{
|
||||
rt_pin_write(LED_PIN, PIN_HIGH);
|
||||
rt_thread_mdelay(500);
|
||||
rt_pin_write(LED_PIN, PIN_LOW);
|
||||
rt_thread_mdelay(500);
|
||||
}
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
menu "Hardware Drivers Config"
|
||||
|
||||
menu "On-chip Peripheral Drivers"
|
||||
config BSP_USING_GPIO
|
||||
bool "Enable GPIO"
|
||||
select RT_USING_PIN
|
||||
default y
|
||||
|
||||
menu "UART Drivers"
|
||||
config BSP_USING_UART0
|
||||
bool "Enable UART0 PB00/PB01(R/T)"
|
||||
select RT_USING_SERIAL
|
||||
default n
|
||||
|
||||
config BSP_USING_UART1
|
||||
bool "Enable UART1 PA18/PA17(R/T)"
|
||||
select RT_USING_SERIAL
|
||||
default n
|
||||
|
||||
config BSP_USING_UART2
|
||||
bool "Enable UART2 PA04/PA05(R/T)"
|
||||
select RT_USING_SERIAL
|
||||
default n
|
||||
|
||||
config BSP_USING_UART3
|
||||
bool "Enable UART3 PA30/PA29(R/T)"
|
||||
select RT_USING_SERIAL
|
||||
default n
|
||||
|
||||
config BSP_USING_UART4
|
||||
bool "Enable UART4 PB10/PB11(R/T)"
|
||||
select RT_USING_SERIAL
|
||||
default n
|
||||
|
||||
config BSP_USING_UART5
|
||||
bool "Enable UART5 PB12/PB13(R/T)"
|
||||
select RT_USING_SERIAL
|
||||
default y
|
||||
endmenu
|
||||
|
||||
endmenu
|
||||
|
||||
menu "Onboard Peripheral Drivers"
|
||||
|
||||
endmenu
|
||||
|
||||
menu "Offboard Peripheral Drivers"
|
||||
|
||||
endmenu
|
||||
|
||||
endmenu
|
||||
@@ -0,0 +1,21 @@
|
||||
from building import *
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
|
||||
# add the general drivers.
|
||||
src = Split('''
|
||||
board.c
|
||||
''')
|
||||
|
||||
# add gpio code
|
||||
if GetDepend('RT_USING_PIN'):
|
||||
src += ['drv_gpio.c']
|
||||
|
||||
# add serial driver code
|
||||
if GetDepend('BSP_USING_UART0') or GetDepend('BSP_USING_UART1') or GetDepend('BSP_USING_UART2') or GetDepend('BSP_USING_UART3') or GetDepend('BSP_USING_UART4') or GetDepend('BSP_USING_UART5'):
|
||||
src += ['drv_uart.c']
|
||||
|
||||
CPPPATH = [cwd]
|
||||
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
|
||||
|
||||
Return('group')
|
||||
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2019-07-11 wangyq the first version
|
||||
*/
|
||||
|
||||
#include <rthw.h>
|
||||
#include <rtthread.h>
|
||||
#include "board.h"
|
||||
#include "drv_uart.h"
|
||||
#include "drv_gpio.h"
|
||||
#include <lib_scu.h>
|
||||
#include <lib_gpio.h>
|
||||
|
||||
/**
|
||||
* @addtogroup es8p
|
||||
*/
|
||||
|
||||
/*@{*/
|
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : NVIC_Configuration
|
||||
* Description : Configures Vector Table base location.
|
||||
* Input : None
|
||||
* Output : None
|
||||
* Return : None
|
||||
*******************************************************************************/
|
||||
void NVIC_Configuration(void)
|
||||
{
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : SystemClock_Configuration
|
||||
* Description : Configures the System Clock.
|
||||
* Input : None
|
||||
* Output : None
|
||||
* Return : None
|
||||
*******************************************************************************/
|
||||
void SystemClock_Config(void)
|
||||
{
|
||||
/* system clock 48MHz */
|
||||
PLLClock_Config(ENABLE, SCU_PLL_HRC, SCU_PLL_48M, ENABLE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : SysTick_Configuration
|
||||
* Description : Configures the SysTick for OS tick.
|
||||
* Input : None
|
||||
* Output : None
|
||||
* Return : None
|
||||
*******************************************************************************/
|
||||
void SysTick_Configuration(void)
|
||||
{
|
||||
/* ticks = SYS_CLK / RT_TICK_PER_SECOND */
|
||||
SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
|
||||
}
|
||||
|
||||
/**
|
||||
* This is the timer interrupt service routine.
|
||||
*
|
||||
*/
|
||||
void systick_irq_cbk(void)
|
||||
{
|
||||
/* enter interrupt */
|
||||
rt_interrupt_enter();
|
||||
|
||||
rt_tick_increase();
|
||||
|
||||
/* leave interrupt */
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
/**
|
||||
* This function will initial es8p board.
|
||||
*/
|
||||
void rt_hw_board_init(void)
|
||||
{
|
||||
/* NVIC Configuration */
|
||||
NVIC_Configuration();
|
||||
|
||||
/*System Clock Configuration */
|
||||
SystemClock_Config();
|
||||
|
||||
/* Configure the SysTick */
|
||||
SysTick_Configuration();
|
||||
|
||||
#ifdef RT_USING_HEAP
|
||||
rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
|
||||
#endif
|
||||
#ifdef RT_USING_COMPONENTS_INIT
|
||||
rt_components_board_init();
|
||||
#endif
|
||||
#ifdef RT_USING_CONSOLE
|
||||
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will delay for some us.
|
||||
*
|
||||
* @param us the delay time of us
|
||||
*/
|
||||
void rt_hw_us_delay(rt_uint32_t us)
|
||||
{
|
||||
unsigned int start, now, delta, reload, us_tick;
|
||||
start = SysTick->VAL;
|
||||
reload = SysTick->LOAD;
|
||||
us_tick = SystemCoreClock / 1000000UL;
|
||||
do
|
||||
{
|
||||
now = SysTick->VAL;
|
||||
delta = start > now ? start - now : reload + start - now;
|
||||
}
|
||||
while (delta < us_tick * us);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2019-07-11 wangyq the first version
|
||||
*/
|
||||
|
||||
// <<< Use Configuration Wizard in Context Menu >>>
|
||||
#ifndef __BOARD_H__
|
||||
#define __BOARD_H__
|
||||
|
||||
#include <ES8P508x.h>
|
||||
|
||||
#define ES8P_SRAM_SIZE 0x6000
|
||||
#define ES8P_SRAM_END (0x20000000 + ES8P_SRAM_SIZE)
|
||||
|
||||
#if defined(__CC_ARM) || defined(__CLANG_ARM)
|
||||
extern int Image$$RW_IRAM1$$ZI$$Limit;
|
||||
#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
|
||||
#elif __ICCARM__
|
||||
#pragma section="HEAP"
|
||||
#define HEAP_BEGIN (__segment_end("HEAP"))
|
||||
#else
|
||||
extern int __bss_end;
|
||||
#define HEAP_BEGIN ((void *)&__bss_end)
|
||||
#endif
|
||||
|
||||
#define HEAP_END ES8P_SRAM_END
|
||||
|
||||
void rt_hw_board_init(void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,478 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2019-07-11 wangyq the first version
|
||||
*/
|
||||
|
||||
#include <rthw.h>
|
||||
#include <rtdevice.h>
|
||||
#include "board.h"
|
||||
#include "drv_gpio.h"
|
||||
#include <lib_scu.h>
|
||||
#include <lib_gpio.h>
|
||||
|
||||
#ifdef RT_USING_PIN
|
||||
|
||||
#define __ES8P_PIN(index, gpio, gpio_index) {index, GPIO##gpio, GPIO_Pin_##gpio_index}
|
||||
#define __ES8P_PIN_DEFAULT {-1, GPIOA, GPIO_Pin_0}
|
||||
|
||||
/* es8p GPIO driver */
|
||||
struct pin_index
|
||||
{
|
||||
int index;
|
||||
GPIO_TYPE gpio;
|
||||
GPIO_TYPE_PIN pin;
|
||||
};
|
||||
|
||||
static const struct pin_index pins[] =
|
||||
{
|
||||
__ES8P_PIN_DEFAULT,
|
||||
__ES8P_PIN(1, B, 0),
|
||||
__ES8P_PIN(2, B, 1),
|
||||
__ES8P_PIN(3, B, 2),
|
||||
__ES8P_PIN(4, B, 3),
|
||||
__ES8P_PIN(5, B, 4),
|
||||
__ES8P_PIN(6, B, 5),
|
||||
__ES8P_PIN(7, B, 6),
|
||||
__ES8P_PIN(8, B, 7),
|
||||
__ES8P_PIN(9, B, 8),
|
||||
__ES8P_PIN(10, B, 9),
|
||||
__ES8P_PIN(11, B, 10),
|
||||
__ES8P_PIN(12, B, 11),
|
||||
__ES8P_PIN(13, B, 12),
|
||||
__ES8P_PIN(14, B, 13),
|
||||
__ES8P_PIN(15, A, 0),
|
||||
__ES8P_PIN(16, A, 1),
|
||||
__ES8P_PIN(17, A, 2),
|
||||
__ES8P_PIN(18, A, 3),
|
||||
__ES8P_PIN(19, A, 4),
|
||||
__ES8P_PIN(20, A, 5),
|
||||
__ES8P_PIN(21, A, 6),
|
||||
__ES8P_PIN(22, A, 7),
|
||||
__ES8P_PIN(23, A, 8),
|
||||
__ES8P_PIN(24, A, 9),
|
||||
__ES8P_PIN(25, A, 10),
|
||||
__ES8P_PIN(26, A, 11),
|
||||
__ES8P_PIN(27, A, 12),
|
||||
__ES8P_PIN(28, A, 13),
|
||||
__ES8P_PIN(29, A, 14),
|
||||
__ES8P_PIN(30, A, 15),
|
||||
__ES8P_PIN(31, A, 16),
|
||||
__ES8P_PIN_DEFAULT,
|
||||
__ES8P_PIN_DEFAULT,
|
||||
__ES8P_PIN(34, A, 17),
|
||||
__ES8P_PIN(35, A, 18),
|
||||
__ES8P_PIN_DEFAULT,
|
||||
__ES8P_PIN(37, A, 20),
|
||||
__ES8P_PIN(38, A, 21),
|
||||
__ES8P_PIN(39, A, 22),
|
||||
__ES8P_PIN(40, A, 23),
|
||||
__ES8P_PIN(41, A, 24),
|
||||
__ES8P_PIN(42, A, 25),
|
||||
__ES8P_PIN(43, A, 26),
|
||||
__ES8P_PIN(44, A, 27),
|
||||
__ES8P_PIN(45, A, 28),
|
||||
__ES8P_PIN(46, A, 29),
|
||||
__ES8P_PIN(47, A, 30),
|
||||
__ES8P_PIN(48, A, 31),
|
||||
};
|
||||
|
||||
struct irq_map
|
||||
{
|
||||
PINT_TYPE pinno;
|
||||
IRQn_Type irqno;
|
||||
};
|
||||
static const struct irq_map irq_map[] =
|
||||
{
|
||||
{PINT0, PINT0_IRQn},
|
||||
{PINT1, PINT1_IRQn},
|
||||
{PINT2, PINT2_IRQn},
|
||||
{PINT3, PINT3_IRQn},
|
||||
{PINT4, PINT4_IRQn},
|
||||
{PINT5, PINT5_IRQn},
|
||||
{PINT6, PINT6_IRQn},
|
||||
{PINT7, PINT7_IRQn},
|
||||
};
|
||||
|
||||
struct rt_pin_irq_hdr pin_irq_hdr_tab[] =
|
||||
{
|
||||
{-1, 0, RT_NULL, RT_NULL},
|
||||
{-1, 0, RT_NULL, RT_NULL},
|
||||
{-1, 0, RT_NULL, RT_NULL},
|
||||
{-1, 0, RT_NULL, RT_NULL},
|
||||
{-1, 0, RT_NULL, RT_NULL},
|
||||
{-1, 0, RT_NULL, RT_NULL},
|
||||
{-1, 0, RT_NULL, RT_NULL},
|
||||
{-1, 0, RT_NULL, RT_NULL},
|
||||
};
|
||||
|
||||
#define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
|
||||
const struct pin_index *get_pin(uint8_t pin)
|
||||
{
|
||||
const struct pin_index *index;
|
||||
if (pin < ITEM_NUM(pins))
|
||||
{
|
||||
index = &pins[pin];
|
||||
if (index->index == -1)
|
||||
index = RT_NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
index = RT_NULL;
|
||||
}
|
||||
return index;
|
||||
};
|
||||
|
||||
void es8p_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
|
||||
{
|
||||
const struct pin_index *index;
|
||||
index = get_pin(pin);
|
||||
if (index == RT_NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (value == 0)
|
||||
{
|
||||
if (index->gpio == GPIOA)
|
||||
GPIOA_ResetBit(index->pin);
|
||||
else if (index->gpio == GPIOB)
|
||||
GPIOB_ResetBit(index->pin);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (index->gpio == GPIOA)
|
||||
GPIOA_SetBit(index->pin);
|
||||
else if (index->gpio == GPIOB)
|
||||
GPIOB_SetBit(index->pin);
|
||||
}
|
||||
}
|
||||
|
||||
int es8p_pin_read(rt_device_t dev, rt_base_t pin)
|
||||
{
|
||||
int value;
|
||||
const struct pin_index *index;
|
||||
value = PIN_LOW;
|
||||
index = get_pin(pin);
|
||||
if (index == RT_NULL)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
value = GPIO_ReadBit(index->gpio, index->pin);
|
||||
return value;
|
||||
}
|
||||
|
||||
void es8p_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
|
||||
{
|
||||
const struct pin_index *index;
|
||||
GPIO_InitStruType gpio_initstruct;
|
||||
index = get_pin(pin);
|
||||
if (index == RT_NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/* Configure GPIO_InitStructure */
|
||||
gpio_initstruct.GPIO_Signal = GPIO_Pin_Signal_Digital;
|
||||
gpio_initstruct.GPIO_Func = GPIO_Func_0;
|
||||
gpio_initstruct.GPIO_OD = GPIO_ODE_Output_Disable;
|
||||
gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Disable;
|
||||
gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Disable;
|
||||
gpio_initstruct.GPIO_DS = GPIO_DS_Output_Normal;
|
||||
|
||||
if (mode == PIN_MODE_OUTPUT)
|
||||
{
|
||||
/* output setting */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
|
||||
}
|
||||
else if (mode == PIN_MODE_INPUT)
|
||||
{
|
||||
/* input setting: not pull. */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
|
||||
}
|
||||
else if (mode == PIN_MODE_INPUT_PULLUP)
|
||||
{
|
||||
/* input setting: pull up. */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
|
||||
gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Enable;
|
||||
}
|
||||
else if (mode == PIN_MODE_INPUT_PULLDOWN)
|
||||
{
|
||||
/* input setting: pull down. */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
|
||||
gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Enable;
|
||||
}
|
||||
else if (mode == PIN_MODE_OUTPUT_OD)
|
||||
{
|
||||
/* output setting: od. */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
|
||||
gpio_initstruct.GPIO_OD = GPIO_ODE_Output_Enable;
|
||||
}
|
||||
GPIO_Init(index->gpio, index->pin, &gpio_initstruct);
|
||||
}
|
||||
|
||||
rt_inline const struct irq_map *get_pin_irq_map(rt_uint16_t gpio_pin)
|
||||
{
|
||||
rt_int32_t mapindex = gpio_pin & 0x00FF;
|
||||
if (mapindex < 0 || mapindex >= 32)
|
||||
{
|
||||
return RT_NULL;
|
||||
}
|
||||
return &irq_map[mapindex % 8];
|
||||
};
|
||||
|
||||
rt_err_t es8p_pin_attach_irq(struct rt_device *device, rt_int32_t pin,
|
||||
rt_uint32_t mode, void (*hdr)(void *args), void *args)
|
||||
{
|
||||
const struct pin_index *index;
|
||||
rt_base_t level;
|
||||
rt_int32_t irqindex;
|
||||
index = get_pin(pin);
|
||||
if (index == RT_NULL)
|
||||
{
|
||||
return RT_ENOSYS;
|
||||
}
|
||||
|
||||
irqindex = index->pin % 8;
|
||||
level = rt_hw_interrupt_disable();
|
||||
|
||||
if (pin_irq_hdr_tab[irqindex].pin == pin &&
|
||||
pin_irq_hdr_tab[irqindex].hdr == hdr &&
|
||||
pin_irq_hdr_tab[irqindex].mode == mode &&
|
||||
pin_irq_hdr_tab[irqindex].args == args)
|
||||
{
|
||||
rt_hw_interrupt_enable(level);
|
||||
return RT_EOK;
|
||||
}
|
||||
if (pin_irq_hdr_tab[irqindex].pin != -1)
|
||||
{
|
||||
rt_hw_interrupt_enable(level);
|
||||
return RT_EBUSY;
|
||||
}
|
||||
|
||||
pin_irq_hdr_tab[irqindex].pin = pin;
|
||||
pin_irq_hdr_tab[irqindex].hdr = hdr;
|
||||
pin_irq_hdr_tab[irqindex].mode = mode;
|
||||
pin_irq_hdr_tab[irqindex].args = args;
|
||||
rt_hw_interrupt_enable(level);
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
rt_err_t es8p_pin_detach_irq(struct rt_device *device, rt_int32_t pin)
|
||||
{
|
||||
const struct pin_index *index;
|
||||
rt_base_t level;
|
||||
rt_int32_t irqindex = -1;
|
||||
index = get_pin(pin);
|
||||
if (index == RT_NULL)
|
||||
{
|
||||
return RT_ENOSYS;
|
||||
}
|
||||
irqindex = index->pin % 8;
|
||||
level = rt_hw_interrupt_disable();
|
||||
|
||||
if (pin_irq_hdr_tab[irqindex].pin == -1)
|
||||
{
|
||||
rt_hw_interrupt_enable(level);
|
||||
return RT_EOK;
|
||||
}
|
||||
pin_irq_hdr_tab[irqindex].pin = -1;
|
||||
pin_irq_hdr_tab[irqindex].hdr = RT_NULL;
|
||||
pin_irq_hdr_tab[irqindex].mode = 0;
|
||||
pin_irq_hdr_tab[irqindex].args = RT_NULL;
|
||||
rt_hw_interrupt_enable(level);
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
rt_err_t es8p_pin_irq_enable(struct rt_device *device, rt_base_t pin,
|
||||
rt_uint32_t enabled)
|
||||
{
|
||||
const struct pin_index *index;
|
||||
const struct irq_map *irqmap;
|
||||
rt_base_t level;
|
||||
rt_int32_t irqindex = -1;
|
||||
/* Configure GPIO_InitStructure */
|
||||
GPIO_InitStruType gpio_initstruct;
|
||||
|
||||
index = get_pin(pin);
|
||||
if (index == RT_NULL)
|
||||
{
|
||||
return RT_ENOSYS;
|
||||
}
|
||||
if (enabled == PIN_IRQ_ENABLE)
|
||||
{
|
||||
irqindex = pin % 8;
|
||||
level = rt_hw_interrupt_disable();
|
||||
if (pin_irq_hdr_tab[irqindex].pin == -1)
|
||||
{
|
||||
rt_hw_interrupt_enable(level);
|
||||
return RT_ENOSYS;
|
||||
}
|
||||
irqmap = &irq_map[irqindex];
|
||||
|
||||
/* Configure GPIO_InitStructure */
|
||||
gpio_initstruct.GPIO_Signal = GPIO_Pin_Signal_Digital;
|
||||
gpio_initstruct.GPIO_Func = GPIO_Func_0;
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
|
||||
gpio_initstruct.GPIO_OD = GPIO_ODE_Output_Disable;
|
||||
gpio_initstruct.GPIO_DS = GPIO_DS_Output_Normal;
|
||||
|
||||
switch (pin_irq_hdr_tab[irqindex].mode)
|
||||
{
|
||||
case PIN_IRQ_MODE_RISING:
|
||||
gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Disable;
|
||||
gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Enable;
|
||||
if (index->gpio == GPIOA)
|
||||
PINT_Config(irqmap->pinno, (PINT_TYPE_SEL)(pin >> 3), PINT_Trig_Rise);
|
||||
else
|
||||
PINT_Config(irqmap->pinno, (PINT_TYPE_SEL)((pin >> 3) + 4), PINT_Trig_Rise);
|
||||
break;
|
||||
|
||||
case PIN_IRQ_MODE_FALLING:
|
||||
gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Enable;
|
||||
gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Disable;
|
||||
if (index->gpio == GPIOA)
|
||||
PINT_Config(irqmap->pinno, (PINT_TYPE_SEL)(pin >> 3), PINT_Trig_Fall);
|
||||
else
|
||||
PINT_Config(irqmap->pinno, (PINT_TYPE_SEL)((pin >> 3) + 4), PINT_Trig_Fall);
|
||||
break;
|
||||
|
||||
case PIN_IRQ_MODE_RISING_FALLING:
|
||||
gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Disable;
|
||||
gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Disable;
|
||||
if (index->gpio == GPIOA)
|
||||
PINT_Config(irqmap->pinno, (PINT_TYPE_SEL)(pin >> 3), PINT_Trig_Change);
|
||||
else
|
||||
PINT_Config(irqmap->pinno, (PINT_TYPE_SEL)((pin >> 3) + 4), PINT_Trig_Change);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
GPIO_Init(index->gpio, index->pin, &gpio_initstruct);
|
||||
NVIC_EnableIRQ(irqmap->irqno);
|
||||
rt_hw_interrupt_enable(level);
|
||||
}
|
||||
else if (enabled == PIN_IRQ_DISABLE)
|
||||
{
|
||||
irqmap = get_pin_irq_map(index->pin);
|
||||
if (irqmap == RT_NULL)
|
||||
{
|
||||
return RT_ENOSYS;
|
||||
}
|
||||
NVIC_DisableIRQ(irqmap->irqno);
|
||||
}
|
||||
else
|
||||
{
|
||||
return RT_ENOSYS;
|
||||
}
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
const static struct rt_pin_ops _es8p_pin_ops =
|
||||
{
|
||||
es8p_pin_mode,
|
||||
es8p_pin_write,
|
||||
es8p_pin_read,
|
||||
es8p_pin_attach_irq,
|
||||
es8p_pin_detach_irq,
|
||||
es8p_pin_irq_enable,
|
||||
};
|
||||
|
||||
int rt_hw_pin_init(void)
|
||||
{
|
||||
int result;
|
||||
SCU_GPIOCLK_Enable();
|
||||
result = rt_device_pin_register("pin", &_es8p_pin_ops, RT_NULL);
|
||||
return result;
|
||||
}
|
||||
INIT_BOARD_EXPORT(rt_hw_pin_init);
|
||||
|
||||
rt_inline void pin_irq_hdr(PINT_TYPE_IT GPIO_Pin)
|
||||
{
|
||||
uint16_t irqno;
|
||||
/* pin no. convert to dec no. */
|
||||
for (irqno = 0; irqno < 16; irqno++)
|
||||
{
|
||||
if ((0x01 << irqno) == GPIO_Pin)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (pin_irq_hdr_tab[irqno].hdr)
|
||||
{
|
||||
pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args);
|
||||
}
|
||||
}
|
||||
|
||||
rt_inline void GPIO_EXTI_Callback(PINT_TYPE_IT GPIO_Pin)
|
||||
{
|
||||
if (PINT_GetIFStatus(GPIO_Pin) != RESET)
|
||||
{
|
||||
PINT_ClearITPendingBit(GPIO_Pin);
|
||||
pin_irq_hdr(GPIO_Pin);
|
||||
}
|
||||
}
|
||||
|
||||
void PINT0_IRQHandler(void)
|
||||
{
|
||||
rt_interrupt_enter();
|
||||
GPIO_EXTI_Callback(PINT_IT_PINT0);
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
|
||||
void PINT1_IRQHandler(void)
|
||||
{
|
||||
rt_interrupt_enter();
|
||||
GPIO_EXTI_Callback(PINT_IT_PINT1);
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
|
||||
void PINT2_IRQHandler(void)
|
||||
{
|
||||
rt_interrupt_enter();
|
||||
GPIO_EXTI_Callback(PINT_IT_PINT2);
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
|
||||
void PINT3_IRQHandler(void)
|
||||
{
|
||||
rt_interrupt_enter();
|
||||
GPIO_EXTI_Callback(PINT_IT_PINT3);
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
|
||||
void PINT4_IRQHandler(void)
|
||||
{
|
||||
rt_interrupt_enter();
|
||||
GPIO_EXTI_Callback(PINT_IT_PINT4);
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
|
||||
void PINT5_IRQHandler(void)
|
||||
{
|
||||
rt_interrupt_enter();
|
||||
GPIO_EXTI_Callback(PINT_IT_PINT5);
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
|
||||
void PINT6_IRQHandler(void)
|
||||
{
|
||||
rt_interrupt_enter();
|
||||
GPIO_EXTI_Callback(PINT_IT_PINT6);
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
|
||||
void PINT7_IRQHandler(void)
|
||||
{
|
||||
rt_interrupt_enter();
|
||||
GPIO_EXTI_Callback(PINT_IT_PINT7);
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2019-07-11 wangyq the first version
|
||||
*/
|
||||
|
||||
#ifndef DRV_GPIO_H__
|
||||
#define DRV_GPIO_H__
|
||||
|
||||
int rt_hw_pin_init(void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,444 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2019-07-12 wangyq the first version
|
||||
*/
|
||||
|
||||
#include <rthw.h>
|
||||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
#include "board.h"
|
||||
#include "drv_uart.h"
|
||||
#include <lib_gpio.h>
|
||||
#include <lib_uart.h>
|
||||
|
||||
#ifdef RT_USING_SERIAL
|
||||
|
||||
/* es8p uart driver */
|
||||
struct es8p_uart
|
||||
{
|
||||
UART_TypeDef *huart;
|
||||
IRQn_Type irq;
|
||||
};
|
||||
|
||||
static rt_err_t es8px_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
|
||||
{
|
||||
GPIO_InitStruType gpio_initstruct;
|
||||
UART_InitStruType uart_initstruct;
|
||||
struct es8p_uart *uart;
|
||||
RT_ASSERT(serial != RT_NULL);
|
||||
RT_ASSERT(cfg != RT_NULL);
|
||||
uart = (struct es8p_uart *)serial->parent.user_data;
|
||||
|
||||
gpio_initstruct.GPIO_Signal = GPIO_Pin_Signal_Digital;
|
||||
gpio_initstruct.GPIO_OD = GPIO_ODE_Output_Disable;
|
||||
gpio_initstruct.GPIO_PUEN = GPIO_PUE_Input_Enable;
|
||||
gpio_initstruct.GPIO_PDEN = GPIO_PDE_Input_Disable;
|
||||
gpio_initstruct.GPIO_DS = GPIO_DS_Output_Normal;
|
||||
|
||||
#ifdef BSP_USING_UART0
|
||||
gpio_initstruct.GPIO_Func = GPIO_Func_2;
|
||||
/* Initialize rx pin */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
|
||||
GPIO_Init(GPIOB, GPIO_Pin_0, &gpio_initstruct);
|
||||
/* Initialize tx pin ,the same as rx pin except mode */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
|
||||
GPIO_Init(GPIOB, GPIO_Pin_1, &gpio_initstruct);
|
||||
#endif
|
||||
|
||||
#ifdef BSP_USING_UART1
|
||||
gpio_initstruct.GPIO_Func = GPIO_Func_1;
|
||||
/* Initialize rx pin */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
|
||||
GPIO_Init(GPIOA, GPIO_Pin_18, &gpio_initstruct);
|
||||
/* Initialize tx pin ,the same as rx pin except mode */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
|
||||
GPIO_Init(GPIOA, GPIO_Pin_17, &gpio_initstruct);
|
||||
#endif
|
||||
|
||||
#ifdef BSP_USING_UART2
|
||||
gpio_initstruct.GPIO_Func = GPIO_Func_2;
|
||||
/* Initialize rx pin */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
|
||||
GPIO_Init(GPIOA, GPIO_Pin_4, &gpio_initstruct);
|
||||
/* Initialize tx pin ,the same as rx pin except mode */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
|
||||
GPIO_Init(GPIOA, GPIO_Pin_5, &gpio_initstruct);
|
||||
#endif
|
||||
|
||||
#ifdef BSP_USING_UART3
|
||||
gpio_initstruct.GPIO_Func = GPIO_Func_2;
|
||||
/* Initialize rx pin */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
|
||||
GPIO_Init(GPIOA, GPIO_Pin_30, &gpio_initstruct);
|
||||
/* Initialize tx pin ,the same as rx pin except mode */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
|
||||
GPIO_Init(GPIOA, GPIO_Pin_29, &gpio_initstruct);
|
||||
#endif
|
||||
|
||||
#ifdef BSP_USING_UART4
|
||||
gpio_initstruct.GPIO_Func = GPIO_Func_1;
|
||||
/* Initialize rx pin */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
|
||||
GPIO_Init(GPIOB, GPIO_Pin_10, &gpio_initstruct);
|
||||
/* Initialize tx pin ,the same as rx pin except mode */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
|
||||
GPIO_Init(GPIOB, GPIO_Pin_11, &gpio_initstruct);
|
||||
#endif
|
||||
|
||||
#ifdef BSP_USING_UART5
|
||||
gpio_initstruct.GPIO_Func = GPIO_Func_1;
|
||||
/* Initialize rx pin */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_In;
|
||||
GPIO_Init(GPIOB, GPIO_Pin_12, &gpio_initstruct);
|
||||
/* Initialize tx pin ,the same as rx pin except mode */
|
||||
gpio_initstruct.GPIO_Direction = GPIO_Dir_Out;
|
||||
GPIO_Init(GPIOB, GPIO_Pin_13, &gpio_initstruct);
|
||||
#endif
|
||||
|
||||
uart_initstruct.UART_ClockSet = UART_Clock_1;
|
||||
uart_initstruct.UART_BaudRate = cfg->baud_rate;
|
||||
uart_initstruct.UART_RxPolar = UART_Polar_Normal;
|
||||
uart_initstruct.UART_TxPolar = UART_Polar_Normal;
|
||||
|
||||
if (cfg->data_bits == DATA_BITS_7)
|
||||
{
|
||||
uart_initstruct.UART_RxMode = UART_DataMode_7;
|
||||
uart_initstruct.UART_TxMode = UART_DataMode_7;
|
||||
|
||||
if (cfg->parity == PARITY_EVEN)
|
||||
{
|
||||
uart_initstruct.UART_RxMode = UART_DataMode_7Even;
|
||||
uart_initstruct.UART_TxMode = UART_DataMode_7Even;
|
||||
}
|
||||
else if (cfg->parity == PARITY_ODD)
|
||||
{
|
||||
uart_initstruct.UART_RxMode = UART_DataMode_7Odd;
|
||||
uart_initstruct.UART_TxMode = UART_DataMode_7Odd;
|
||||
}
|
||||
}
|
||||
else if (cfg->data_bits == DATA_BITS_8)
|
||||
{
|
||||
uart_initstruct.UART_RxMode = UART_DataMode_8;
|
||||
uart_initstruct.UART_TxMode = UART_DataMode_8;
|
||||
|
||||
if (cfg->parity == PARITY_EVEN)
|
||||
{
|
||||
uart_initstruct.UART_RxMode = UART_DataMode_8Even;
|
||||
uart_initstruct.UART_TxMode = UART_DataMode_8Even;
|
||||
}
|
||||
else if (cfg->parity == PARITY_ODD)
|
||||
{
|
||||
uart_initstruct.UART_RxMode = UART_DataMode_8Odd;
|
||||
uart_initstruct.UART_TxMode = UART_DataMode_8Odd;
|
||||
}
|
||||
}
|
||||
else if (cfg->data_bits == DATA_BITS_9)
|
||||
{
|
||||
uart_initstruct.UART_RxMode = UART_DataMode_9;
|
||||
uart_initstruct.UART_TxMode = UART_DataMode_9;
|
||||
}
|
||||
|
||||
if (cfg->bit_order == BIT_ORDER_MSB)
|
||||
{
|
||||
return RT_EINVAL;
|
||||
}
|
||||
|
||||
if (cfg->invert == NRZ_INVERTED)
|
||||
{
|
||||
uart_initstruct.UART_RxPolar = UART_Polar_Opposite;
|
||||
uart_initstruct.UART_TxPolar = UART_Polar_Opposite;
|
||||
}
|
||||
|
||||
/* config uart function */
|
||||
UART_Init(uart->huart, &uart_initstruct);
|
||||
/* enable rx and tx */
|
||||
uart->huart->CON.RXEN = 1;
|
||||
uart->huart->CON.TXEN = 1;
|
||||
|
||||
NVIC_SetPriority(uart->irq, 1);
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
static rt_err_t es8px_control(struct rt_serial_device *serial, int cmd, void *arg)
|
||||
{
|
||||
struct es8p_uart *uart;
|
||||
RT_ASSERT(serial != RT_NULL);
|
||||
|
||||
uart = (struct es8p_uart *)serial->parent.user_data;
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case RT_DEVICE_CTRL_CLR_INT:
|
||||
/* disable rx irq */
|
||||
NVIC_DisableIRQ(uart->irq);
|
||||
/* disable interrupt */
|
||||
UART_ITConfig(uart->huart, UART_IT_RB, DISABLE);
|
||||
break;
|
||||
|
||||
case RT_DEVICE_CTRL_SET_INT:
|
||||
/* enable rx irq */
|
||||
NVIC_EnableIRQ(uart->irq);
|
||||
/* enable interrupt */
|
||||
UART_ITConfig(uart->huart, UART_IT_RB, ENABLE);
|
||||
break;
|
||||
}
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
static int es8px_putc(struct rt_serial_device *serial, char c)
|
||||
{
|
||||
struct es8p_uart *uart;
|
||||
RT_ASSERT(serial != RT_NULL);
|
||||
uart = (struct es8p_uart *)serial->parent.user_data;
|
||||
|
||||
while (UART_GetFlagStatus(uart->huart, UART_FLAG_TB) == RESET) ;
|
||||
UART_SendByte(uart->huart, c);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int es8px_getc(struct rt_serial_device *serial)
|
||||
{
|
||||
int ch = -1;
|
||||
struct es8p_uart *uart;
|
||||
|
||||
RT_ASSERT(serial != RT_NULL);
|
||||
uart = (struct es8p_uart *)serial->parent.user_data;
|
||||
|
||||
if (UART_GetFlagStatus(uart->huart, UART_FLAG_RB))
|
||||
{
|
||||
ch = UART_RecByte(uart->huart);
|
||||
}
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
static const struct rt_uart_ops es8px_uart_ops =
|
||||
{
|
||||
es8px_configure,
|
||||
es8px_control,
|
||||
es8px_putc,
|
||||
es8px_getc,
|
||||
};
|
||||
|
||||
#ifdef BSP_USING_UART0
|
||||
/* UART0 device driver structure */
|
||||
struct es8p_uart uart0 =
|
||||
{
|
||||
UART0,
|
||||
UART0_IRQn
|
||||
};
|
||||
|
||||
struct rt_serial_device serial0;
|
||||
|
||||
void UART0_IRQHandler(void)
|
||||
{
|
||||
/* enter interrupt */
|
||||
rt_interrupt_enter();
|
||||
|
||||
if (UART0->IF.RBIF)
|
||||
{
|
||||
rt_hw_serial_isr(&serial0, RT_SERIAL_EVENT_RX_IND);
|
||||
}
|
||||
/* leave interrupt */
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
#endif /* BSP_USING_UART0 */
|
||||
|
||||
#ifdef BSP_USING_UART1
|
||||
/* UART1 device driver structure */
|
||||
struct es8p_uart uart1 =
|
||||
{
|
||||
UART1,
|
||||
UART1_IRQn
|
||||
};
|
||||
|
||||
struct rt_serial_device serial1;
|
||||
|
||||
void UART1_IRQHandler(void)
|
||||
{
|
||||
/* enter interrupt */
|
||||
rt_interrupt_enter();
|
||||
|
||||
if (UART1->IF.RBIF)
|
||||
{
|
||||
rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND);
|
||||
}
|
||||
/* leave interrupt */
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
#endif /* BSP_USING_UART1 */
|
||||
|
||||
#ifdef BSP_USING_UART2
|
||||
/* UART1 device driver structure */
|
||||
struct es8p_uart uart2 =
|
||||
{
|
||||
UART2,
|
||||
UART2_IRQn
|
||||
};
|
||||
|
||||
struct rt_serial_device serial2;
|
||||
|
||||
void UART2_IRQHandler(void)
|
||||
{
|
||||
/* enter interrupt */
|
||||
rt_interrupt_enter();
|
||||
|
||||
if (UART2->IF.RBIF)
|
||||
{
|
||||
rt_hw_serial_isr(&serial2, RT_SERIAL_EVENT_RX_IND);
|
||||
}
|
||||
/* leave interrupt */
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
#endif /* BSP_USING_UART2 */
|
||||
|
||||
#ifdef BSP_USING_UART3
|
||||
/* UART3 device driver structure */
|
||||
struct es8p_uart uart3 =
|
||||
{
|
||||
UART3,
|
||||
UART3_IRQn
|
||||
};
|
||||
|
||||
struct rt_serial_device serial3;
|
||||
|
||||
void UART3_IRQHandler(void)
|
||||
{
|
||||
/* enter interrupt */
|
||||
rt_interrupt_enter();
|
||||
|
||||
if (UART3->IF.RBIF)
|
||||
{
|
||||
rt_hw_serial_isr(&serial3, RT_SERIAL_EVENT_RX_IND);
|
||||
}
|
||||
/* leave interrupt */
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
#endif /* BSP_USING_UART3 */
|
||||
|
||||
#ifdef BSP_USING_UART4
|
||||
/* UART4 device driver structure */
|
||||
struct es8p_uart uart4 =
|
||||
{
|
||||
UART4,
|
||||
UART4_IRQn
|
||||
};
|
||||
|
||||
struct rt_serial_device serial4;
|
||||
|
||||
void UART4_IRQHandler(void)
|
||||
{
|
||||
/* enter interrupt */
|
||||
rt_interrupt_enter();
|
||||
|
||||
if (UART4->IF.RBIF)
|
||||
{
|
||||
rt_hw_serial_isr(&serial4, RT_SERIAL_EVENT_RX_IND);
|
||||
}
|
||||
/* leave interrupt */
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
#endif /* BSP_USING_UART4 */
|
||||
|
||||
#ifdef BSP_USING_UART5
|
||||
/* UART5 device driver structure */
|
||||
struct es8p_uart uart5 =
|
||||
{
|
||||
UART5,
|
||||
UART5_IRQn
|
||||
};
|
||||
|
||||
struct rt_serial_device serial5;
|
||||
|
||||
void UART5_IRQHandler(void)
|
||||
{
|
||||
/* enter interrupt */
|
||||
rt_interrupt_enter();
|
||||
|
||||
if (UART5->IF.RBIF)
|
||||
{
|
||||
rt_hw_serial_isr(&serial5, RT_SERIAL_EVENT_RX_IND);
|
||||
}
|
||||
/* leave interrupt */
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
#endif /* BSP_USING_UART5 */
|
||||
|
||||
int rt_hw_uart_init(void)
|
||||
{
|
||||
struct es8p_uart *uart;
|
||||
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
|
||||
|
||||
#ifdef BSP_USING_UART0
|
||||
uart = &uart0;
|
||||
serial0.ops = &es8px_uart_ops;
|
||||
serial0.config = config;
|
||||
|
||||
/* register UART0 device */
|
||||
rt_hw_serial_register(&serial0, "uart0",
|
||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
|
||||
#endif /* BSP_USING_UART0 */
|
||||
|
||||
#ifdef BSP_USING_UART1
|
||||
uart = &uart1;
|
||||
serial1.ops = &es8px_uart_ops;
|
||||
serial1.config = config;
|
||||
|
||||
/* register UART1 device */
|
||||
rt_hw_serial_register(&serial1, "uart1",
|
||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
|
||||
#endif /* BSP_USING_UART1 */
|
||||
|
||||
#ifdef BSP_USING_UART2
|
||||
uart = &uart2;
|
||||
serial2.ops = &es8px_uart_ops;
|
||||
serial2.config = config;
|
||||
|
||||
/* register UART2 device */
|
||||
rt_hw_serial_register(&serial2, "uart2",
|
||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
|
||||
#endif /* BSP_USING_UART2 */
|
||||
|
||||
#ifdef BSP_USING_UART3
|
||||
uart = &uart3;
|
||||
serial3.ops = &es8px_uart_ops;
|
||||
serial3.config = config;
|
||||
|
||||
/* register UART3 device */
|
||||
rt_hw_serial_register(&serial3, "uart3",
|
||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
|
||||
#endif /* BSP_USING_UART3 */
|
||||
|
||||
#ifdef BSP_USING_UART4
|
||||
uart = &uart4;
|
||||
serial4.ops = &es8px_uart_ops;
|
||||
serial4.config = config;
|
||||
|
||||
/* register UART4 device */
|
||||
rt_hw_serial_register(&serial4, "uart4",
|
||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
|
||||
#endif /* BSP_USING_UART4 */
|
||||
|
||||
#ifdef BSP_USING_UART5
|
||||
uart = &uart5;
|
||||
serial5.ops = &es8px_uart_ops;
|
||||
serial5.config = config;
|
||||
|
||||
/* register UART5 device */
|
||||
rt_hw_serial_register(&serial5, "uart5",
|
||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart);
|
||||
#endif /* BSP_USING_UART5 */
|
||||
|
||||
return 0;
|
||||
}
|
||||
INIT_BOARD_EXPORT(rt_hw_uart_init);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2019-07-12 wangyq the first version
|
||||
*/
|
||||
|
||||
#ifndef DRV_UART_H__
|
||||
#define DRV_UART_H__
|
||||
|
||||
int rt_hw_uart_init(void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,15 @@
|
||||
; *************************************************************
|
||||
; *** Scatter-Loading Description File generated by uVision ***
|
||||
; *************************************************************
|
||||
|
||||
LR_IROM1 0x00000000 0x00020000 { ; load region size_region
|
||||
ER_IROM1 0x00000000 0x00020000 { ; load address = execution address
|
||||
*.o (RESET, +First)
|
||||
*(InRoot$$Sections)
|
||||
.ANY (+RO)
|
||||
}
|
||||
RW_IRAM1 0x20000000 0x00006000 { ; RW data
|
||||
.ANY (+RW +ZI)
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.7 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.1 MiB |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,233 @@
|
||||
;*******************************************************************************
|
||||
; *file : startup_ES8P508x.s
|
||||
; *description: ES8P508x Device Startup File
|
||||
; *author : Eastsoft MCU Software Team
|
||||
; *version : V0.01
|
||||
; *data : 6/30/2017
|
||||
;
|
||||
; *Copyright (C) 2017 Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
; *
|
||||
; * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
; * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
; * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
; * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
; * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
;*******************************************************************************
|
||||
|
||||
|
||||
; <h> Stack Configuration
|
||||
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
||||
; </h>
|
||||
|
||||
Stack_Size EQU 0x00000400
|
||||
|
||||
AREA STACK, NOINIT, READWRITE, ALIGN=3
|
||||
Stack_Mem SPACE Stack_Size
|
||||
__initial_sp
|
||||
|
||||
|
||||
; <h> Heap Configuration
|
||||
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
||||
; </h>
|
||||
|
||||
Heap_Size EQU 0x00000400
|
||||
|
||||
AREA HEAP, NOINIT, READWRITE, ALIGN=3
|
||||
__heap_base
|
||||
Heap_Mem SPACE Heap_Size
|
||||
__heap_limit
|
||||
|
||||
PRESERVE8
|
||||
THUMB
|
||||
|
||||
; Vector Table Mapped to Address 0 at Reset
|
||||
|
||||
AREA RESET, DATA, READONLY
|
||||
EXPORT __Vectors
|
||||
|
||||
__Vectors DCD __initial_sp ; Top of Stack
|
||||
DCD Reset_IRQHandler ; Reset Handler
|
||||
DCD NMI_IRQHandler ; NMI Handler
|
||||
DCD HardFault_IRQHandler ; HardFault Handler
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD SVC_IRQHandler ; SVCall Handler
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD PendSV_Handler ; PendSV Handler
|
||||
DCD SysTick_Handler ; SysTick Handler
|
||||
|
||||
; External Interrupts
|
||||
DCD PINT0_IRQHandler ;16, PINT0 IRQHandler
|
||||
DCD PINT1_IRQHandler ;17, PINT1 IRQHandler
|
||||
DCD PINT2_IRQHandler ;18, PINT2 IRQHandler
|
||||
DCD PINT3_IRQHandler ;19, PINT3 IRQHandler
|
||||
DCD PINT4_IRQHandler ;20, PINT4 IRQHandler
|
||||
DCD PINT5_IRQHandler ;21, PINT5 IRQHandler
|
||||
DCD PINT6_IRQHandler ;22, PINT6 IRQHandler
|
||||
DCD PINT7_IRQHandler ;23, PINT7 IRQHandler
|
||||
DCD T16N0_IRQHandler ;24, T16N0 IRQHandler
|
||||
DCD T16N1_IRQHandler ;25, T16N1 IRQHandler
|
||||
DCD T16N2_IRQHandler ;26, T16N2 IRQHandler
|
||||
DCD T16N3_IRQHandler ;27, T16N3 IRQHandler
|
||||
DCD T32N0_IRQHandler ;28, T32N0 IRQHandler
|
||||
DCD 0 ;29, Reserved
|
||||
DCD IWDT_IRQHandler ;30, IWDT IRQHandler
|
||||
DCD WWDT_IRQHandler ;31, WWDT IRQHandler
|
||||
DCD CCM_IRQHandler ;32, WDT IRQHandler
|
||||
DCD PLK_IRQHandler ;33, PLK IRQHandler
|
||||
DCD LVD_IRQHandler ;34, LVD IRQHandler
|
||||
DCD KINT_IRQHandler ;35, KINT IRQHandler
|
||||
DCD RTC_IRQHandler ;36, RTC IRQHandler
|
||||
DCD ADC_IRQHandler ;37, ADC IRQHandler
|
||||
DCD 0 ;38, Reserved
|
||||
DCD AES_IRQHandler ;39, AES IRQHandler
|
||||
DCD UART0_IRQHandler ;40, UART0 IRQHandler
|
||||
DCD UART1_IRQHandler ;41, UART1 IRQHandler
|
||||
DCD UART2_IRQHandler ;42, UART2 IRQHandler
|
||||
DCD UART3_IRQHandler ;43, UART3 IRQHandler
|
||||
DCD UART4_IRQHandler ;44, UART4 IRQHandler
|
||||
DCD UART5_IRQHandler ;45, UART5 IRQHandler
|
||||
DCD SPI0_IRQHandler ;46, SPI0 IRQHandler
|
||||
DCD I2C0_IRQHandler ;47, I2C0 IRQHandler
|
||||
|
||||
AREA |.text|, CODE, READONLY
|
||||
|
||||
; Reset Handler
|
||||
|
||||
Reset_IRQHandler PROC
|
||||
EXPORT Reset_IRQHandler [WEAK]
|
||||
IMPORT __main
|
||||
IMPORT SystemInit
|
||||
LDR R0, =SystemInit
|
||||
BLX R0
|
||||
LDR R0, =__main
|
||||
BX R0
|
||||
ENDP
|
||||
|
||||
; Dummy Exception IRQHandlers (infinite loops which can be modified)
|
||||
|
||||
NMI_IRQHandler PROC
|
||||
EXPORT NMI_IRQHandler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
HardFault_IRQHandler PROC
|
||||
EXPORT HardFault_IRQHandler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
SVC_IRQHandler PROC
|
||||
EXPORT SVC_IRQHandler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
PendSV_Handler PROC
|
||||
EXPORT PendSV_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
SysTick_Handler PROC
|
||||
EXPORT SysTick_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
|
||||
Default_IRQHandler PROC
|
||||
EXPORT PINT0_IRQHandler [WEAK]
|
||||
EXPORT PINT1_IRQHandler [WEAK]
|
||||
EXPORT PINT2_IRQHandler [WEAK]
|
||||
EXPORT PINT3_IRQHandler [WEAK]
|
||||
EXPORT PINT4_IRQHandler [WEAK]
|
||||
EXPORT PINT5_IRQHandler [WEAK]
|
||||
EXPORT PINT6_IRQHandler [WEAK]
|
||||
EXPORT PINT7_IRQHandler [WEAK]
|
||||
EXPORT T16N0_IRQHandler [WEAK]
|
||||
EXPORT T16N1_IRQHandler [WEAK]
|
||||
EXPORT T16N2_IRQHandler [WEAK]
|
||||
EXPORT T16N3_IRQHandler [WEAK]
|
||||
EXPORT T32N0_IRQHandler [WEAK]
|
||||
EXPORT IWDT_IRQHandler [WEAK]
|
||||
EXPORT WWDT_IRQHandler [WEAK]
|
||||
EXPORT CCM_IRQHandler [WEAK]
|
||||
EXPORT PLK_IRQHandler [WEAK]
|
||||
EXPORT LVD_IRQHandler [WEAK]
|
||||
EXPORT KINT_IRQHandler [WEAK]
|
||||
EXPORT RTC_IRQHandler [WEAK]
|
||||
EXPORT ADC_IRQHandler [WEAK]
|
||||
EXPORT AES_IRQHandler [WEAK]
|
||||
EXPORT UART0_IRQHandler [WEAK]
|
||||
EXPORT UART1_IRQHandler [WEAK]
|
||||
EXPORT UART2_IRQHandler [WEAK]
|
||||
EXPORT UART3_IRQHandler [WEAK]
|
||||
EXPORT UART4_IRQHandler [WEAK]
|
||||
EXPORT UART5_IRQHandler [WEAK]
|
||||
EXPORT SPI0_IRQHandler [WEAK]
|
||||
EXPORT I2C0_IRQHandler [WEAK]
|
||||
|
||||
|
||||
|
||||
PINT0_IRQHandler
|
||||
PINT1_IRQHandler
|
||||
PINT2_IRQHandler
|
||||
PINT3_IRQHandler
|
||||
PINT4_IRQHandler
|
||||
PINT5_IRQHandler
|
||||
PINT6_IRQHandler
|
||||
PINT7_IRQHandler
|
||||
T16N0_IRQHandler
|
||||
T16N1_IRQHandler
|
||||
T16N2_IRQHandler
|
||||
T16N3_IRQHandler
|
||||
T32N0_IRQHandler
|
||||
IWDT_IRQHandler
|
||||
WWDT_IRQHandler
|
||||
CCM_IRQHandler
|
||||
PLK_IRQHandler
|
||||
LVD_IRQHandler
|
||||
KINT_IRQHandler
|
||||
RTC_IRQHandler
|
||||
ADC_IRQHandler
|
||||
AES_IRQHandler
|
||||
UART0_IRQHandler
|
||||
UART1_IRQHandler
|
||||
UART2_IRQHandler
|
||||
UART3_IRQHandler
|
||||
UART4_IRQHandler
|
||||
UART5_IRQHandler
|
||||
SPI0_IRQHandler
|
||||
I2C0_IRQHandler
|
||||
|
||||
B .
|
||||
|
||||
ENDP
|
||||
|
||||
|
||||
|
||||
ALIGN
|
||||
|
||||
; User Initial Stack & Heap
|
||||
|
||||
IF :DEF:__MICROLIB
|
||||
|
||||
EXPORT __initial_sp
|
||||
EXPORT __heap_base
|
||||
EXPORT __heap_limit
|
||||
|
||||
ELSE
|
||||
|
||||
IMPORT __use_two_region_memory
|
||||
EXPORT __user_initial_stackheap
|
||||
__user_initial_stackheap
|
||||
|
||||
LDR R0, = Heap_Mem
|
||||
LDR R1, =(Stack_Mem + Stack_Size)
|
||||
LDR R2, = (Heap_Mem + Heap_Size)
|
||||
LDR R3, = Stack_Mem
|
||||
BX LR
|
||||
|
||||
ALIGN
|
||||
|
||||
ENDIF
|
||||
|
||||
END
|
||||
@@ -0,0 +1,76 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
|
||||
*文件名: system_ES8P508x.c
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: 库函数配置文件
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#include "system_ES8P508x.h"
|
||||
#include "lib_config.h"
|
||||
|
||||
uint32_t SystemCoreClock = 48000000;
|
||||
|
||||
|
||||
/***************************************************************
|
||||
函数名:SystemCoreClockUpdate
|
||||
描 述:系统时钟配置为内部时钟20MHZ,同时设置SystemCoreClock
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void SystemCoreClockUpdate (void)
|
||||
{
|
||||
uint32_t Prot_Temp;
|
||||
uint16_t Count=0;
|
||||
SystemClockSelect(SCU_SysClk_HRC , CLK_SEL_HRC); //选择系统时钟为HRC时钟
|
||||
PLLClock_Config(DISABLE, SCU_PLL_HRC, SCU_PLL_48M,ENABLE); //PLL禁止
|
||||
Prot_Temp = SCU->PROT.PROT;
|
||||
if(Prot_Temp != 0) //写保护了
|
||||
{SCU->PROT.Word = 0x55AA6996;} //解锁
|
||||
|
||||
SCU->SCLKEN1.HRC_EN = 1; //使能内部20MHZ
|
||||
do
|
||||
{
|
||||
Count++;
|
||||
}
|
||||
while((SCU->SCLKEN1.HRC_RDY == 0)&&(Count != 0xFFF)); //等待时钟开启
|
||||
|
||||
if(Count == 0xFFF)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
SCU->SCLKEN0.SYSCLK_DIV = 0; //系统时钟后分频1:1
|
||||
|
||||
switch(SCU->SCLKEN0.CLK_SEL)
|
||||
{
|
||||
case 0:
|
||||
SystemCoreClock = 20000000; //HRC
|
||||
break;
|
||||
case 1:
|
||||
SystemCoreClock = 32000; //LRC
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if(Prot_Temp != 0) //写保护了
|
||||
{SCU->PROT.Word = 0x00000000;} //打开写保护
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:SystemInit
|
||||
描 述:系统初始化,设置时钟
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void SystemInit (void)
|
||||
{
|
||||
SystemCoreClockUpdate();
|
||||
}
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,23 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名: system_ES8P508x.h
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: 库函数配置文件
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __SYSTEMES8P508x_H__
|
||||
#define __SYSTEMES8P508x_H__
|
||||
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
extern uint32_t SystemCoreClock;
|
||||
extern void SystemInit(void);
|
||||
extern void SystemCoreClockUpdate(void);
|
||||
|
||||
#endif
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,17 @@
|
||||
|
||||
#ifndef __IRQHANDLER_H__
|
||||
#define __IRQHANDLER_H__
|
||||
|
||||
#include "ES8P508x.h"
|
||||
|
||||
extern void systick_irq_cbk(void);
|
||||
|
||||
/************中断函数声明***********/
|
||||
void NMI_IRQHandler(void);
|
||||
void HardFault_IRQHandler(void);
|
||||
void SVC_IRQHandler(void);
|
||||
void PendSV_IRQHandler(void);
|
||||
void SysTick_IRQHandler(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,239 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
|
||||
*文件名: lib_timer.c
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: ADC模块库函数
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBADC_H__
|
||||
#define __LIBADC_H__
|
||||
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
/* 内部参考电压选择 */
|
||||
typedef enum {
|
||||
ADC_VREF_SEL_2_0 = 0, /* 内部参考电压2.048v*/
|
||||
ADC_VREF_SEL_1_6 = 1, /* 内部参考电压1.6v*/
|
||||
ADC_VREF_SEL_MAX = 1,
|
||||
}ADC_TYPE_VREF_SEL;
|
||||
|
||||
/* ADC时钟源选择 */
|
||||
typedef enum
|
||||
{
|
||||
ADC_ClkS_PCLK = 0x0 , //时钟:PCLK
|
||||
ADC_ClkS_PLL = 0x1 , //时钟:PLL
|
||||
ADC_ClkS_32K = 0x2 , //时钟:ADCCLK(32KHZ)
|
||||
}ADC_TYPE_CLKS;
|
||||
|
||||
/* ADC时钟源预分频 */
|
||||
typedef enum
|
||||
{
|
||||
ADC_ClkDiv_1 = 0x0 , //预分频:1:1
|
||||
ADC_ClkDiv_2 = 0x1 , //预分频:1:2
|
||||
ADC_ClkDiv_4 = 0x2 , //预分频:1:4
|
||||
ADC_ClkDiv_8 = 0x3 , //预分频:1:8
|
||||
ADC_ClkDiv_16 = 0x4 , //预分频:1:16
|
||||
ADC_ClkDiv_32 = 0x5 , //预分频:1:32
|
||||
ADC_ClkDiv_64 = 0x6 , //预分频:1:64
|
||||
ADC_ClkDiv_256 = 0x7 , //预分频:1:256
|
||||
}ADC_TYPE_CLKDIV;
|
||||
|
||||
/* 正向参考电压选择 */
|
||||
typedef enum
|
||||
{
|
||||
ADC_VrefP_Vcc = 0x0 , //正向参考电压:VDD电压
|
||||
ADC_VrefP_Exter = 0x3 , //正向参考电压:外部参考电压
|
||||
}ADC_TYPE_VREFP;
|
||||
|
||||
/* 采样模式选择 */
|
||||
typedef enum
|
||||
{
|
||||
ADC_SMPS_SOFT = 0, /* 软件控制 */
|
||||
ADC_SMPS_HARD = 1, /* 硬件控制 */
|
||||
}ADC_TYPE_SMPS;
|
||||
|
||||
|
||||
/* 转换速度选择 */
|
||||
typedef enum
|
||||
{
|
||||
ADC_ConvSpeed_Low = 0x0 , //AD转换速度:低速
|
||||
ADC_ConvSpeed_High = 0x1 , //AD转换速度:高速
|
||||
}ADC_TYPE_HSEN;
|
||||
|
||||
/* ADC通道选择 */
|
||||
typedef enum
|
||||
{
|
||||
ADC_CHS_AIN0 = 0, /* 通道 0 */
|
||||
ADC_CHS_AIN1 = 1, /* 通道 1 */
|
||||
ADC_CHS_AIN2 = 2, /* 通道 2 */
|
||||
ADC_CHS_AIN3 = 3, /* 通道 3 */
|
||||
ADC_CHS_AIN4 = 4, /* 通道 4 */
|
||||
ADC_CHS_AIN5 = 5, /* 通道 5 */
|
||||
ADC_CHS_AIN6 = 6, /* 通道 6 */
|
||||
ADC_CHS_AIN7 = 7, /* 通道 7 */
|
||||
ADC_CHS_AIN8 = 8, /* 通道 8 */
|
||||
ADC_CHS_AIN9 = 9, /* 通道 9 */
|
||||
ADC_CHS_AIN10 = 10, /* 通道 10 */
|
||||
ADC_CHS_AIN11 = 11, /* 通道 11 */
|
||||
ADC_CHS_AIN12 = 12, /* 通道 12 */
|
||||
ADC_CHS_AIN13 = 13, /* 通道 13 */
|
||||
ADC_CHS_AIN14 = 14, /* 通道 14 */
|
||||
ADC_CHS_AIN15 = 15, /* 通道 15 */
|
||||
}ADC_TYPE_CHS;
|
||||
|
||||
/*ADC core功耗选择位*/
|
||||
typedef enum
|
||||
{
|
||||
ADC_LP_86ua = 2, //ADC Core 功耗为86,推荐使用
|
||||
ADC_LP_215ua = 0, //ADC Core 功耗为215uA
|
||||
ADC_LP_120ua = 1, //ADC Core 功耗为120uA
|
||||
ADC_LP_70ua = 3, //ADC Core 功耗为70uA
|
||||
}ADC_TYPE_BUFLP;
|
||||
|
||||
/*ADC 输入buff功耗选择位*/
|
||||
typedef enum
|
||||
{
|
||||
ADC_BUFF_0ua = 0, //ADC 输入buff功耗为0uA,推荐使用
|
||||
ADC_BUFF_34ua = 1, //ADC 输入buff功耗为34uA
|
||||
ADC_BUFF_95ua = 2, //ADC 输入buff功耗为95uA
|
||||
}ADC_TYPE_BUFEN;
|
||||
|
||||
/* ADC IF 状态 */
|
||||
typedef enum
|
||||
{
|
||||
ADC_IF = 0x01,
|
||||
ADC_IF_ACPMIN = 0x02,
|
||||
ADC_IF_ACPMAX =0x04,
|
||||
ADC_IF_ACPOVER = 0x08,
|
||||
}ADC_TYPE_IF;
|
||||
|
||||
/* ADC IE 状态 */
|
||||
typedef enum
|
||||
{
|
||||
ADC_IE = 0x01,
|
||||
ADC_IE_ACPMIN = 0x02,
|
||||
ADC_IE_ACPMAX =0x04,
|
||||
ADC_IE_ACPOVER = 0x08,
|
||||
}ADC_TYPE_IE;
|
||||
|
||||
/* ADC初始化配置结构体定义 */
|
||||
typedef struct
|
||||
{
|
||||
ADC_TYPE_CLKS ADC_ClkS; //ADCCON1:bit3 ADC时钟源选择
|
||||
ADC_TYPE_CLKDIV ADC_ClkDiv; //ADCCON1:bit2-0 ADC时钟源预分频
|
||||
ADC_TYPE_VREFP ADC_VrefP; //ADCCON1:bit9-8 ADC正向参考电压选择
|
||||
ADC_TYPE_SMPS ADC_SampS; //ADCCON1:bit12 ADC采样模式选择
|
||||
ADC_TYPE_CHS ADC_ChS; //ADCCHS:bit0-3 ADC模拟通道选择
|
||||
//ADC_TYPE_VREF_SEL VREF_SEL; //参考电压选择
|
||||
uint8_t ST; //硬件采样时间 (当控制模式为硬件时设置) 0~31
|
||||
TYPE_FUNCEN ADC_VREFN; //负向参考电压选择位
|
||||
TYPE_FUNCEN ADC_VRBUF_EN;
|
||||
}ADC_InitStruType;
|
||||
|
||||
/* 自动比较低阀值 选择*/
|
||||
typedef enum
|
||||
{
|
||||
ADC_ACP_MIN_MIN = 0x0, /* 容许的最小低阀值*/
|
||||
ADC_ACP_MIN_MAX = 0xfff, /* 容许的最大低阀值*/
|
||||
}ADC_TYPE_ACP_MIN;
|
||||
|
||||
/* 自动比较高阀值 选择*/
|
||||
typedef enum
|
||||
{
|
||||
ADC_ACP_MAX_MIN = 0x0, /* 容许的最小高阀值*/
|
||||
ADC_ACP_MAX_MAX = 0xfff, /* 容许的最大高阀值*/
|
||||
}ADC_TYPE_ACP_MAX;
|
||||
|
||||
/* 每次自动转换比较溢出时间选择 */
|
||||
typedef enum
|
||||
{
|
||||
ADC_ACPC_OVFL_TIME_MAX = 0x9c3, /* 容许的最大溢出时间 */
|
||||
}ADC_TYPE_ACPC_OVFL_TIME;
|
||||
|
||||
/* 自动转换比较次数 */
|
||||
typedef enum
|
||||
{
|
||||
ADC_ACPC_TIMES_1 = 0, /* 1次 */
|
||||
ADC_ACPC_TIMES_2 = 1, /* 2次 */
|
||||
ADC_ACPC_TIMES_4 = 2, /* 4次 */
|
||||
ADC_ACPC_TIMES_8 = 3, /* 8次 */
|
||||
ADC_ACPC_TIMES_MAX = 3,
|
||||
}ADC_TYPE_ACPC_TIMES;
|
||||
|
||||
/* ACP溢出时钟的时钟源 */
|
||||
typedef enum
|
||||
{
|
||||
ADC_ACPC_CLKS_PCLK = 0, /* PCLK */
|
||||
ADC_ACPC_CLKS_LRC = 1, /* LRC(32KHz) */
|
||||
}ADC_TYPE_ACPC_CLKS;
|
||||
|
||||
typedef FuncState ADC_TYPE_CHOP_EN1, ADC_TYPE_CHOP_EN;
|
||||
typedef FuncState ADC_TYPE_VREF_EN,ADC_TYPE_IREF_EN;
|
||||
typedef FuncState ADC_TYPE_EN,ADC_TYPE_ACP_EN;
|
||||
|
||||
/* 自动比较功能初始化结构体*/
|
||||
typedef struct
|
||||
{
|
||||
ADC_TYPE_ACP_EN ACP_EN; /* 自动比较功能使能位*/
|
||||
uint16_t ACPC_OVER_TIME; /* 单次自动比较溢出时间(即使不想设置请设置成0) 0~0x9c3 */
|
||||
ADC_TYPE_ACPC_TIMES ACPC_TIMES; /* 单次自动比较次数(优先级高于溢出时间) */
|
||||
uint16_t ACPC_MIN_TARGET; /* 平均值最低阀值 (设置0xfff关闭) 0~0xfff */
|
||||
uint16_t ACPC_MAX_TARGET; /* 平均值最高阀值 (设置0x0关闭) 0~0xfff */
|
||||
}ADC_ACP_TypeDef;
|
||||
|
||||
/************ADC模块宏定义***********/
|
||||
/* ADC使能控制 */
|
||||
#define ADC_Enable() (ADC->CON0.EN = 0x1)
|
||||
#define ADC_Disable() (ADC->CON0.EN = 0x0)
|
||||
|
||||
/* 自动比较功能使能*/
|
||||
#define ADC_ACP_Enable() (ADC->CON0.ACP_EN = 1)
|
||||
#define ADC_ACP_Disable() (ADC->CON0.ACP_EN = 0)
|
||||
|
||||
/* ADC开始转换 */
|
||||
#define ADC_Start() (ADC->CON0.TRIG = 0x1)
|
||||
|
||||
/* ADC采样软件控制 */
|
||||
#define ADC_SampStart() (ADC->CON1.SMPON = 0x1)
|
||||
#define ADC_SampStop() (ADC->CON1.SMPON = 0x0)
|
||||
|
||||
/* ADC VDD检测控制 */
|
||||
#define ADC_VDD5_FLAG_Enable() (ADC->CHS.VDD5_FLAG_EN = 0x1)
|
||||
#define ADC_VDD5_FLAG_Disable() (ADC->CHS.VDD5_FLAG_EN = 0x0)
|
||||
|
||||
/* ADC中断使能控制 */
|
||||
#define ADC_IE_Enable() (ADC->IE.IE = 0x1)
|
||||
#define ADC_IE_Disable() (ADC->IE.IE = 0x0)
|
||||
|
||||
#define ADC_ACPMINIE_Enable() (ADC->IE.ACPMINIE = 1)
|
||||
#define ADC_ACPMINIE_Disable() (ADC->IE.ACPMINIE = 0)
|
||||
|
||||
#define ADC_ACPMAXIE_Enable() (ADC->IE.ACPMAXIE = 1)
|
||||
#define ADC_ACPMAXIE_Disable() (ADC->IE.ACPMAXIE = 0)
|
||||
|
||||
#define ADC_ACPOVIE_Enable() (ADC->IE.ACPOVIE = 1)
|
||||
#define ADC_ACPOVIE_Disable() (ADC->IE.ACPOVIE = 0)
|
||||
|
||||
/************ADC模块函数声明***********/
|
||||
void ADC_Init(ADC_InitStruType * ADC_InitStruct);
|
||||
void ADC_Set_CH(ADC_TYPE_CHS AdcCH);
|
||||
uint16_t ADC_GetConvValue(void);
|
||||
FlagStatus ADC_GetConvStatus(void);
|
||||
ErrorStatus ADC_ACPConfig(ADC_ACP_TypeDef *ADC_ACP_InitStruct);
|
||||
ErrorStatus ADC_SoftStart(void);
|
||||
ErrorStatus ADC_SoftStop(void);
|
||||
uint16_t ADC_GetACPMeanValue(void);
|
||||
uint16_t ADC_GetACPMinValue(void);
|
||||
uint16_t ADC_GetACPMaxValue(void);
|
||||
FlagStatus ADC_GetFlagStatus(ADC_TYPE_IF IFName);
|
||||
ITStatus ADC_GetITStatus(ADC_TYPE_IE IEName);
|
||||
ErrorStatus ADC_ClearIFStatus(ADC_TYPE_IF IFName);
|
||||
void ADC_Reset(void);
|
||||
|
||||
#endif
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,74 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
|
||||
*文件名: lib_aes.c
|
||||
*作 者: zoux
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: AES模块库函数
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBAES_H__
|
||||
#define __LIBAES_H__
|
||||
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
/* 加密解密模式选择位 */
|
||||
typedef enum {
|
||||
AES_MODE_DECRYPT = 0, /* 解密 */
|
||||
AES_MODE_ENCRYPT = 1, /* 加密 */
|
||||
}AES_TYPE_MODE;
|
||||
|
||||
/* 加密/解密控制位 */
|
||||
typedef enum {
|
||||
AES_DONE_YES = 0, /* 加密完成 */
|
||||
AES_DONE_NO = 1, /* 正在加密 */
|
||||
}AES_TYPE_DONE;
|
||||
|
||||
/* 加解密数据结构体 */
|
||||
typedef struct {
|
||||
uint32_t DATA[4];
|
||||
}AES_DATA_TypeDef;
|
||||
|
||||
typedef enum {
|
||||
AES_IF_IF = 0x80,
|
||||
}AES_TYPE_IF;
|
||||
|
||||
typedef enum {
|
||||
AES_IT_IT = 0x40,
|
||||
}AES_TYPE_IT;
|
||||
|
||||
/* 加解密密钥结构体 */
|
||||
typedef struct {
|
||||
uint32_t KEY[4];
|
||||
}AES_KEY_TypeDef;
|
||||
|
||||
/* 加解密初始结构体 */
|
||||
typedef struct {
|
||||
AES_TYPE_MODE MODE; /* 加密或者解密 */
|
||||
}AES_InitStruType;
|
||||
|
||||
/* 加解密使能,开始加密 */
|
||||
#define AES_Enable() (AES->CON.GO_DONE = 1)
|
||||
/* 加密模块关闭 */
|
||||
#define AES_Disable() (AES->CON.GO_DONE = 0)
|
||||
|
||||
|
||||
/********************* ADC模块函数声明 *********************/
|
||||
void AES_Init(AES_InitStruType * AES_InitStruct);
|
||||
void AES_WriteKey(uint32_t *AES_KEY);
|
||||
void AES_ReadKey(uint32_t * AES_KEY);
|
||||
|
||||
void AES_WriteData(uint32_t *AES_DATA);
|
||||
void AES_ReadData(uint32_t * AES_DATA);
|
||||
|
||||
void AES_ITConfig(AES_TYPE_IT AES_IE, TYPE_FUNCEN NewState);
|
||||
void AES_ClearITPendingBit(void);
|
||||
FlagStatus AES_GetFlagStatus(AES_TYPE_IF Flag);
|
||||
|
||||
AES_TYPE_DONE AES_GetDoneStatus(void);
|
||||
void AES_Reset(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名: lib_config.h
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: 库函数配置文件
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBCONFIG_H__
|
||||
#define __LIBCONFIG_H__
|
||||
|
||||
#include "lib_adc.h"
|
||||
#include "lib_iic.h"
|
||||
#include "lib_scs.h"
|
||||
#include "lib_scu.h"
|
||||
#include "lib_spi.h"
|
||||
#include "lib_timer.h"
|
||||
#include "lib_uart.h"
|
||||
#include "lib_wdt.h"
|
||||
#include "lib_flashiap.h"
|
||||
#include "lib_gpio.h"
|
||||
#include "lib_printf.h"
|
||||
#include "lib_iap.h"
|
||||
#include "lib_crc.h"
|
||||
#include "lib_aes.h"
|
||||
#include "lib_rtc.h"
|
||||
|
||||
#endif
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,93 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名:
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述:
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBCRC_H
|
||||
#define __LIBCRC_H
|
||||
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define CRC_EmptayCheck_addr 0x10000010
|
||||
#define CRC_FlashVerify_addr 0x10000014
|
||||
#define CRC_UserCal_addr 0x10000018
|
||||
#define CRC_CheckReset_addr 0x1000001C
|
||||
|
||||
typedef uint32_t (*CRC_EM)(void* address, uint32_t data_len);
|
||||
typedef uint32_t (*CRC_FL)(void* address, uint32_t data_len, uint32_t type);
|
||||
typedef uint32_t (*CRC_US)(void* address, uint32_t data_len, uint32_t type);
|
||||
typedef uint32_t (*CRC_CH)(void);
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CRC_XOROUT_NORMAL = 0x0, //数据输出不取反
|
||||
CRC_XOROUT_ANTI = (1U<<14), //数据输出取反
|
||||
} CRC_XOROUT;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CRC_REFOUT_NORMAL = 0x0, //数据输出正序
|
||||
CRC_REFOUT_REVERSE = (1U<<13), //数据输出倒序
|
||||
} CRC_REFOUT;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CRC_REFIN_NORMAL = 0x0, //数据输入正序
|
||||
CRC_REFIN_REVERSE = (1U<<12), //数据输入倒序
|
||||
} CRC_REFIN;
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CRC_MOD_CRC32 = 0x0, //CRC位宽为字节
|
||||
CRC_MOD_CRC16 = (2U<<8), //CRC位宽为半字
|
||||
CRC_MOD_CRC16_CCITT = (3U<<8), //CRC位宽为字
|
||||
} CRC_MOD_TYPE;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CRC_INIT_DATA_ALL_0 = 0x0, //CRC初始化数据全为0
|
||||
CRC_INIT_DATA_ALL_1 = (1U<<3), //CRC初始化数据全为1
|
||||
} CRC_INIT_DATA;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CRC_HS_TYPE_DISABLE = 0x0, //CRC高速模式禁止
|
||||
CRC_HS_TYPE_ENABLE = (1U<<2), //CRC高速模式使能,当CRC时钟小于24M时才能使能
|
||||
} CRC_HS_TYPE;
|
||||
|
||||
|
||||
/*CRC_CON 数据配置值结构体初始化*/
|
||||
typedef struct
|
||||
{
|
||||
CRC_XOROUT xorout;
|
||||
CRC_REFOUT refout;
|
||||
CRC_REFIN refin;
|
||||
CRC_MOD_TYPE mode;
|
||||
CRC_INIT_DATA init_data_type;
|
||||
CRC_HS_TYPE hs_type;
|
||||
} CRC_CONValueStruType;
|
||||
|
||||
uint32_t CRC_getTypeValue(CRC_CONValueStruType con_value);
|
||||
uint32_t CRC_EmptayCheck(void* address, uint32_t data_len);
|
||||
uint32_t CRC_FlashVerify(void* address, uint32_t data_len, uint32_t type);
|
||||
uint32_t CRC_UserCal(void* address, uint32_t data_len, uint32_t type);
|
||||
uint32_t CRC_CheckReset(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,44 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名: lib_flashiap.h
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: flash读写库函数头文件
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBIAP_H__
|
||||
#define __LIBIAP_H__
|
||||
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
/*************IAP模块宏定义************/
|
||||
|
||||
/* 寄存器解锁 */
|
||||
#define FlashIAP_RegUnLock() (IAP->UL.UL = 0x49415055)
|
||||
#define FlashIAP_RegLock() (IAP->UL.UL = 0x00000000)
|
||||
|
||||
/* 使能IAP */
|
||||
#define FlashIAP_Enable() (IAP->CON.EN = 0x1)
|
||||
#define FlashIAP_Disable() (IAP->CON.EN = 0x0)
|
||||
|
||||
/* 访问IAP请求 */
|
||||
#define FlashIAP_REQ() (IAP->CON.FLASH_REQ = 0x1)
|
||||
|
||||
/************Flash模块函数声明***********/
|
||||
ErrorStatus FlashIap_Close_WPROT(uint8_t Page);
|
||||
ErrorStatus FlashIap_Open_WPROT(uint8_t Page);
|
||||
ErrorStatus FlashIap_CloseAll_WPROT(void);
|
||||
ErrorStatus FlashIap_OpenAll_WPROT(void);
|
||||
ErrorStatus FlashIap_Unlock(void);
|
||||
ErrorStatus FlashIap_WriteEnd(void);
|
||||
ErrorStatus FlashIap_ErasePage(uint8_t Page_Addr);
|
||||
ErrorStatus FlashIap_WriteCont(uint8_t Unit_addr, uint8_t Page_addr, uint32_t Data32);
|
||||
ErrorStatus FlashIap_WriteWord(uint8_t Unit_addr, uint8_t Page_addr, uint32_t Data32);
|
||||
ErrorStatus Flash_Read(uint32_t * Ram_Addr, uint32_t Flash_Addr, uint8_t Len);
|
||||
|
||||
#endif
|
||||
/*************************END OF FILE**********************/
|
||||
|
||||
@@ -0,0 +1,243 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名: lib_gpio.h
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: GPIO模块及外部中断、按键中断库函数头文件
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBGPIO_H__
|
||||
#define __LIBGPIO_H__
|
||||
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
/*状态定义*/
|
||||
|
||||
/*端口定义*/
|
||||
typedef enum
|
||||
{
|
||||
GPIOA = 0x0 ,
|
||||
GPIOB = 0x1 ,
|
||||
}GPIO_TYPE;
|
||||
|
||||
/*引脚定义*/
|
||||
typedef enum
|
||||
{
|
||||
GPIO_Pin_0 = 0x00,
|
||||
GPIO_Pin_1 = 0x01,
|
||||
GPIO_Pin_2 = 0x02,
|
||||
GPIO_Pin_3 = 0x03,
|
||||
GPIO_Pin_4 = 0x04,
|
||||
GPIO_Pin_5 = 0x05,
|
||||
GPIO_Pin_6 = 0x06,
|
||||
GPIO_Pin_7 = 0x07,
|
||||
GPIO_Pin_8 = 0x08,
|
||||
GPIO_Pin_9 = 0x09,
|
||||
GPIO_Pin_10 = 0x0A,
|
||||
GPIO_Pin_11 = 0x0B,
|
||||
GPIO_Pin_12 = 0x0C,
|
||||
GPIO_Pin_13 = 0x0D,
|
||||
GPIO_Pin_14 = 0x0E,
|
||||
GPIO_Pin_15 = 0x0F,
|
||||
GPIO_Pin_16 = 0x10,
|
||||
GPIO_Pin_17 = 0x11,
|
||||
GPIO_Pin_18 = 0x12,
|
||||
GPIO_Pin_19 = 0x13,
|
||||
GPIO_Pin_20 = 0x14,
|
||||
GPIO_Pin_21 = 0x15,
|
||||
GPIO_Pin_22 = 0x16,
|
||||
GPIO_Pin_23 = 0x17,
|
||||
GPIO_Pin_24 = 0x18,
|
||||
GPIO_Pin_25 = 0x19,
|
||||
GPIO_Pin_26 = 0x1A,
|
||||
GPIO_Pin_27 = 0x1B,
|
||||
GPIO_Pin_28 = 0x1C,
|
||||
GPIO_Pin_29 = 0x1D,
|
||||
GPIO_Pin_30 = 0x1E,
|
||||
GPIO_Pin_31 = 0x1F,
|
||||
}GPIO_TYPE_PIN;
|
||||
|
||||
/* 引脚功能选择 */
|
||||
typedef enum
|
||||
{
|
||||
GPIO_Func_0 = 0x0 ,
|
||||
GPIO_Func_1 = 0x1 ,
|
||||
GPIO_Func_2 = 0x2 ,
|
||||
GPIO_Func_3 = 0x3 ,
|
||||
}GPIO_TYPE_FUNC;
|
||||
|
||||
/* 引脚方向选择 */
|
||||
typedef enum
|
||||
{
|
||||
GPIO_Dir_Out = 0x0 ,
|
||||
GPIO_Dir_In = 0x1 ,
|
||||
}GPIO_TYPE_DIR;
|
||||
|
||||
/* 引脚输出电流驱动能力选择 */
|
||||
typedef enum
|
||||
{
|
||||
GPIO_DS_Output_Normal = 0, // 普通电流输出
|
||||
GPIO_DS_Output_Strong = 1, // 强电流输出
|
||||
} GPIO_TYPE_DS;
|
||||
|
||||
/* 引脚信号类型 */
|
||||
typedef enum {
|
||||
GPIO_Pin_Signal_Digital = 0, // 数字信号引脚
|
||||
GPIO_Pin_Signal_Analog = 1, // 模拟信号引脚
|
||||
} GPIO_Pin_Signal;
|
||||
|
||||
/* 引脚输入弱上拉使能 */
|
||||
typedef enum {
|
||||
GPIO_PUE_Input_Disable = 0, // 弱上拉禁止
|
||||
GPIO_PUE_Input_Enable = 1, // 弱上拉使能
|
||||
} GPIO_PUE_Input;
|
||||
|
||||
/* 引脚输入弱下拉使能 */
|
||||
typedef enum {
|
||||
GPIO_PDE_Input_Disable = 0, // 弱下拉禁止
|
||||
GPIO_PDE_Input_Enable = 1, // 弱下拉使能
|
||||
} GPIO_PDE_Input;
|
||||
|
||||
|
||||
/* 引脚输出开漏使能位 */
|
||||
typedef enum {
|
||||
GPIO_ODE_Output_Disable = 0, // 开漏禁止
|
||||
GPIO_ODE_Output_Enable = 1, // 开漏使能
|
||||
} GPIO_ODE_Output;
|
||||
|
||||
/* GPIO初始化配置结构体定义 */
|
||||
typedef struct
|
||||
{
|
||||
GPIO_Pin_Signal GPIO_Signal; /* 引脚上的信号类型,只有模拟和数字两种 */
|
||||
GPIO_TYPE_FUNC GPIO_Func; //引脚功能选择
|
||||
GPIO_TYPE_DIR GPIO_Direction; //方向选择
|
||||
GPIO_PUE_Input GPIO_PUEN; //上拉使能
|
||||
GPIO_PDE_Input GPIO_PDEN; //下拉使能
|
||||
GPIO_ODE_Output GPIO_OD; //输出模式开漏使能
|
||||
GPIO_TYPE_DS GPIO_DS; //驱动电流控制
|
||||
}GPIO_InitStruType;
|
||||
|
||||
/* PINT */
|
||||
typedef enum
|
||||
{
|
||||
PINT0 = 0x0 ,
|
||||
PINT1 = 0x1 ,
|
||||
PINT2 = 0x2 ,
|
||||
PINT3 = 0x3 ,
|
||||
PINT4 = 0x4 ,
|
||||
PINT5 = 0x5 ,
|
||||
PINT6 = 0x6 ,
|
||||
PINT7 = 0x7 ,
|
||||
}PINT_TYPE;
|
||||
|
||||
/* PINT SEL */
|
||||
typedef enum
|
||||
{
|
||||
PINT_SEL0 = 0x0 ,
|
||||
PINT_SEL1 = 0x1 ,
|
||||
PINT_SEL2 = 0x2 ,
|
||||
PINT_SEL3 = 0x3 ,
|
||||
PINT_SEL4 = 0x4 ,
|
||||
PINT_SEL5 = 0x5 ,
|
||||
PINT_SEL6 = 0x6 ,
|
||||
PINT_SEL7 = 0x7 ,
|
||||
}PINT_TYPE_SEL;
|
||||
|
||||
/* PINT Trigger */
|
||||
typedef enum
|
||||
{
|
||||
PINT_Trig_Rise = 0x0 ,
|
||||
PINT_Trig_Fall = 0x1 ,
|
||||
PINT_Trig_High = 0x2 ,
|
||||
PINT_Trig_Low = 0x3 ,
|
||||
PINT_Trig_Change = 0x4 ,
|
||||
}PINT_TYPE_TRIG;
|
||||
|
||||
|
||||
/* PINT中断标志 */
|
||||
typedef enum
|
||||
{
|
||||
PINT_IT_PINT0 = 0x01 ,
|
||||
PINT_IT_PINT1 = 0x02 ,
|
||||
PINT_IT_PINT2 = 0x04 ,
|
||||
PINT_IT_PINT3 = 0x08 ,
|
||||
PINT_IT_PINT4 = 0x10 ,
|
||||
PINT_IT_PINT5 = 0x20 ,
|
||||
PINT_IT_PINT6 = 0x40 ,
|
||||
PINT_IT_PINT7 = 0x80 ,
|
||||
PINT_IT_PINTAll = 0xFF ,
|
||||
}PINT_TYPE_IT;
|
||||
|
||||
/* PINT使能控制 */
|
||||
#define PINT0_Enable() (GPIO->PINTIE.PINTIE |= 0X1)
|
||||
#define PINT1_Enable() (GPIO->PINTIE.PINTIE |= 0x2)
|
||||
#define PINT2_Enable() (GPIO->PINTIE.PINTIE |= 0x4)
|
||||
#define PINT3_Enable() (GPIO->PINTIE.PINTIE |= 0x8)
|
||||
#define PINT4_Enable() (GPIO->PINTIE.PINTIE |= 0x10)
|
||||
#define PINT5_Enable() (GPIO->PINTIE.PINTIE |= 0x20)
|
||||
#define PINT6_Enable() (GPIO->PINTIE.PINTIE |= 0x40)
|
||||
#define PINT7_Enable() (GPIO->PINTIE.PINTIE |= 0x80)
|
||||
#define PINT0_Disable() (GPIO->PINTIE.PINTIE &= ~0x01)
|
||||
#define PINT1_Disable() (GPIO->PINTIE.PINTIE &= ~0x02)
|
||||
#define PINT2_Disable() (GPIO->PINTIE.PINTIE &= ~0x04)
|
||||
#define PINT3_Disable() (GPIO->PINTIE.PINTIE &= ~0x08)
|
||||
#define PINT4_Disable() (GPIO->PINTIE.PINTIE &= ~0x10)
|
||||
#define PINT5_Disable() (GPIO->PINTIE.PINTIE &= ~0x20)
|
||||
#define PINT6_Disable() (GPIO->PINTIE.PINTIE &= ~0x40)
|
||||
#define PINT7_Disable() (GPIO->PINTIE.PINTIE &= ~0x80)
|
||||
|
||||
/* PINT屏蔽使能控制 */
|
||||
#define PINT0_MaskEnable() (GPIO->PINTIE.PMASK |= 0X01)
|
||||
#define PINT1_MaskEnable() (GPIO->PINTIE.PMASK |= 0x02)
|
||||
#define PINT2_MaskEnable() (GPIO->PINTIE.PMASK |= 0x04)
|
||||
#define PINT3_MaskEnable() (GPIO->PINTIE.PMASK |= 0x08)
|
||||
#define PINT4_MaskEnable() (GPIO->PINTIE.PMASK |= 0x10)
|
||||
#define PINT5_MaskEnable() (GPIO->PINTIE.PMASK |= 0x20)
|
||||
#define PINT6_MaskEnable() (GPIO->PINTIE.PMASK |= 0x40)
|
||||
#define PINT7_MaskEnable() (GPIO->PINTIE.PMASK |= 0x80)
|
||||
#define PINT0_MaskDisable() (GPIO->PINTIE.PMASK &= ~0x01)
|
||||
#define PINT1_MaskDisable() (GPIO->PINTIE.PMASK &= ~0x02)
|
||||
#define PINT2_MaskDisable() (GPIO->PINTIE.PMASK &= ~0x04)
|
||||
#define PINT3_MaskDisable() (GPIO->PINTIE.PMASK &= ~0x08)
|
||||
#define PINT4_MaskDisable() (GPIO->PINTIE.PMASK &= ~0x10)
|
||||
#define PINT5_MaskDisable() (GPIO->PINTIE.PMASK &= ~0x20)
|
||||
#define PINT6_MaskDisable() (GPIO->PINTIE.PMASK &= ~0x40)
|
||||
#define PINT7_MaskDisable() (GPIO->PINTIE.PMASK &= ~0x80)
|
||||
|
||||
/* PINT清除所有中断标记 */
|
||||
#define PINT_ClearAllITPending() (GPIO->PIF.Word = (uint32_t)0xff)
|
||||
|
||||
void GPIO_Init(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_InitStruType* GPIO_InitStruct);
|
||||
void GPIO_Write(GPIO_TYPE GPIOx, uint32_t Value);
|
||||
uint32_t GPIO_Read(GPIO_TYPE GPIOx);
|
||||
PinStatus GPIO_ReadBit(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx);
|
||||
void GPIOA_SetBit(GPIO_TYPE_PIN PINx);
|
||||
void GPIOA_ResetBit(GPIO_TYPE_PIN PINx);
|
||||
void GPIOA_ToggleBit(GPIO_TYPE_PIN PINx);
|
||||
void GPIOB_SetBit(GPIO_TYPE_PIN PINx);
|
||||
void GPIOB_ResetBit(GPIO_TYPE_PIN PINx);
|
||||
void GPIOB_ToggleBit(GPIO_TYPE_PIN PINx);
|
||||
void GPIOA_SetDirection(GPIO_TYPE_PIN PINx, GPIO_TYPE_DIR Dir_Type);
|
||||
void GPIOB_SetDirection(GPIO_TYPE_PIN PINx, GPIO_TYPE_DIR Dir_Type);
|
||||
void PINT_Config(PINT_TYPE PINTx, PINT_TYPE_SEL SELx, PINT_TYPE_TRIG TRIGx);
|
||||
void GPIO_SetSingalTypeFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_Pin_Signal GPIO_Signal);
|
||||
void GPIO_SetDirRegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_TYPE_DIR Dir);
|
||||
void GPIO_SetODERegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_ODE_Output ODE);
|
||||
void GPIO_SetDSRegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_TYPE_DS DS);
|
||||
void GPIO_SetPUERegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_PUE_Input PUE);
|
||||
void GPIO_SetPDERegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_PDE_Input PDE);
|
||||
void GPIO_SetFuncxRegFromPin(GPIO_TYPE GPIOx,GPIO_TYPE_PIN PINx, GPIO_TYPE_FUNC Func);
|
||||
FlagStatus PINT_GetIFStatus(PINT_TYPE_IT PINT_Flag);
|
||||
FlagStatus PINT_GetITStatus(PINT_TYPE_IT PINT_Flag);
|
||||
void PINT_ClearITPendingBit(PINT_TYPE_IT PINT_Flag);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名:
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述:
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __ES8P508x_IAP_TABLE_H
|
||||
#define __ES8P508x_IAP_TABLE_H
|
||||
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define IAP_PageProgram_addr 0x10000008
|
||||
#define IAP_PageErase_addr 0x10000000
|
||||
#define IAP_WordProgram_addr 0x10000004
|
||||
|
||||
typedef ErrorStatus (*IAP_PE)(uint32_t address);
|
||||
typedef ErrorStatus (*IAP_WP)(uint32_t address, uint32_t data);
|
||||
typedef ErrorStatus (*IAP_PP)(uint32_t address, uint32_t data[], uint32_t length, uint32_t erase);
|
||||
|
||||
ErrorStatus IAP_PageErase(uint32_t address);
|
||||
ErrorStatus IAP_WordProgram(uint32_t address, uint32_t data);
|
||||
ErrorStatus IAP_PageProgram(uint32_t address, uint32_t data[], uint32_t length, uint32_t erase);
|
||||
ErrorStatus IAPRead(uint32_t *Ram_Addr, uint32_t Flash_Addr, uint8_t Len);
|
||||
|
||||
#define PageEraseEnable 0x00000001
|
||||
#define PageEraseDisable 0x00000000
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,229 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名: lib_iic.h
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: I2C模块库函数头文件
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBIIC_H__
|
||||
#define __LIBIIC_H__
|
||||
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
#include "system_ES8P508x.h"
|
||||
|
||||
/* 引脚开漏设置 */
|
||||
typedef enum
|
||||
{
|
||||
I2C_PinMode_PP = 0x0 , //端口输出模式:推挽
|
||||
I2C_PinMode_OD = 0x1 , //端口输出模式:开漏
|
||||
}I2C_TYPE_PINOD;
|
||||
|
||||
/* 工作模式 */
|
||||
typedef enum
|
||||
{
|
||||
I2C_Mode_Master = 0x0 , //工作模式:主
|
||||
I2C_Mode_Slave = 0x1 , //工作模式:从
|
||||
}I2C_TYPE_MODE;
|
||||
|
||||
/* 应答延时 */
|
||||
typedef enum
|
||||
{
|
||||
I2C_AckDelay_0P5 = 0x0 , //应答延时:0.5个时钟周期
|
||||
I2C_AckDelay_1 = 0x1 , //应答延时:1个时钟周期
|
||||
I2C_AckDelay_1P5 = 0x2 , //应答延时:1.5个时钟周期
|
||||
I2C_AckDelay_2 = 0x3 , //应答延时:2个时钟周期
|
||||
I2C_AckDelay_2P5 = 0x4 , //应答延时:2.5个时钟周期
|
||||
I2C_AckDelay_3 = 0x5 , //应答延时:3个时钟周期
|
||||
I2C_AckDelay_3P5 = 0x6 , //应答延时:3.5个时钟周期
|
||||
I2C_AckDelay_4 = 0x7 , //应答延时:4个时钟周期
|
||||
}I2C_TYPE_ADLY;
|
||||
|
||||
/* 接收模式 */
|
||||
typedef enum
|
||||
{
|
||||
I2C_RecMode_0 = 0x0 , //接收模式:接收1字节,发送ACK
|
||||
I2C_RecMode_1 = 0x1 , //接收模式:接收1字节,发送NACK
|
||||
I2C_RecMode_2 = 0x2 , //接收模式:接收2字节,每字节发送ACK
|
||||
I2C_RecMode_3 = 0x3 , //接收模式:接收2字节,前一字节发送ACK,后一字节发送NACK
|
||||
I2C_RecMode_4 = 0x4 , //接收模式:接收4字节,每字节发送ACK
|
||||
I2C_RecMode_5 = 0x5 , //接收模式:接收4字节,前3字节发送ACK,后一字节发送NACK
|
||||
I2C_RecMode_6 = 0x6, //接收模式:连续接收,每个字节发送ACK
|
||||
I2C_RecMode_7 = 0x7, //接收模式:完成该字节接收,发送NACK
|
||||
}I2C_TYPE_RECMODE;
|
||||
|
||||
/* 数据帧传输间隔 */
|
||||
typedef enum
|
||||
{
|
||||
I2C_TI_Disable = 0x0 , //数据帧传输间隔:0
|
||||
I2C_TI_1 = 0x1 , //数据帧传输间隔:1
|
||||
I2C_TI_2 = 0x2 , //数据帧传输间隔:2
|
||||
I2C_TI_3 = 0x3 , //数据帧传输间隔:3
|
||||
I2C_TI_4 = 0x4 , //数据帧传输间隔:4
|
||||
I2C_TI_5 = 0x5 , //数据帧传输间隔:5
|
||||
I2C_TI_6 = 0x6 , //数据帧传输间隔:6
|
||||
I2C_TI_7 = 0x7 , //数据帧传输间隔:7
|
||||
I2C_TI_8 = 0x8 , //数据帧传输间隔:8
|
||||
I2C_TI_9 = 0x9 , //数据帧传输间隔:9
|
||||
I2C_TI_10 = 0xA , //数据帧传输间隔:10
|
||||
I2C_TI_11 = 0xB , //数据帧传输间隔:11
|
||||
I2C_TI_12 = 0xC , //数据帧传输间隔:12
|
||||
I2C_TI_13 = 0xD , //数据帧传输间隔:13
|
||||
I2C_TI_14 = 0xE , //数据帧传输间隔:14
|
||||
I2C_TI_15 = 0xF , //数据帧传输间隔:15
|
||||
}I2C_TYPE_TIS;
|
||||
|
||||
/* I2C初始化配置结构体定义 */
|
||||
typedef struct
|
||||
{
|
||||
I2C_TYPE_PINOD I2C_SclOd; //SCL端口输出模式
|
||||
|
||||
I2C_TYPE_PINOD I2C_SdaOd; //SDA端口输出模式
|
||||
|
||||
TYPE_FUNCEN I2C_16XSamp; //端口16倍速采样使能
|
||||
|
||||
uint32_t I2C_Clk; //I2C频率
|
||||
|
||||
I2C_TYPE_MODE I2C_Mode; //工作模式
|
||||
|
||||
TYPE_FUNCEN I2C_AutoStop; //自动停止
|
||||
|
||||
TYPE_FUNCEN I2C_AutoCall; //自动寻呼
|
||||
}I2C_InitStruType;
|
||||
|
||||
/* 发送、接收中断模式 */
|
||||
typedef enum
|
||||
{
|
||||
I2C_TRBIM_Byte = 0x0 , //字节满产生中断
|
||||
I2C_TRBIM_HalfWord = 0x1 , //半字满产生中断
|
||||
I2C_TRBIM_Word = 0x2 , //字满产生中断
|
||||
}I2C_TYPE_TRBIM;
|
||||
|
||||
|
||||
/* 读写模式 */
|
||||
typedef enum
|
||||
{
|
||||
I2C_Mode_Write = 0x0 ,
|
||||
I2C_Mode_Read = 0x1 ,
|
||||
}I2C_TYPE_RWMODE;
|
||||
|
||||
/* 中断使能标志位 */
|
||||
typedef enum
|
||||
{
|
||||
I2C_IT_SR = 0x0001 , //起始位
|
||||
I2C_IT_SP = 0x0002 , //停止位
|
||||
I2C_IT_TB = 0x0004 , //发送缓冲空
|
||||
I2C_IT_RB = 0x0008 , //接收缓冲满
|
||||
I2C_IT_TE = 0x0010 , //发送数据错误
|
||||
I2C_IT_RO = 0x0020 , //接收数据溢出
|
||||
I2C_IT_NA = 0x0040 , //未应答NACK
|
||||
I2C_IT_TBWE = 0x0080 , //发送数据写错误
|
||||
I2C_IT_TIDLE = 0x01000 , //发送空闲中断
|
||||
}I2C_TYPE_IT;
|
||||
|
||||
/* 中断标志位 */
|
||||
typedef enum
|
||||
{
|
||||
I2C_Flag_SR = 0x0001 , //起始位
|
||||
I2C_Flag_SP = 0x0002 , //停止位
|
||||
I2C_Flag_TB = 0x0004 , //发送缓冲空
|
||||
I2C_Flag_RB = 0x0008 , //接收缓冲满
|
||||
I2C_Flag_TE = 0x0010 , //发送数据错误
|
||||
I2C_Flag_RO = 0x0020 , //接收数据溢出
|
||||
I2C_Flag_NA = 0x0040 , //未应答NACK
|
||||
I2C_Flag_TBWE = 0x0080, //发送数据写错误中断标志位
|
||||
I2C_Flag_TIDLE= 0X1000, //I2C 发送空闲中断标志位
|
||||
}I2C_TYPE_FLAG;
|
||||
|
||||
|
||||
/* 标志清除 */
|
||||
typedef enum
|
||||
{
|
||||
I2C_Clr_SR = 0x0001 , //起始位
|
||||
I2C_Clr_SP = 0x0002 , //停止位
|
||||
I2C_Clr_TE = 0x0010 , //发送数据错误
|
||||
I2C_Clr_RO = 0x0020 , //接收数据溢出
|
||||
I2C_Clr_NA = 0x0040 , //未应答NACK
|
||||
I2C_Clr_TBWE = 0x0080 , //发送数据写错误
|
||||
I2C_Clr_TIDLE= 0X01000, //I2C 发送空闲
|
||||
}I2C_CLR_IF;
|
||||
|
||||
|
||||
/*************I2C模块宏定义************/
|
||||
|
||||
/* I2C模块使能控制 */
|
||||
#define I2C_Enable() (I2C0->CON.EN = 1)
|
||||
#define I2C_Disable() (I2C0->CON.EN = 0)
|
||||
|
||||
/* I2C模块复位 */
|
||||
#define I2C_Reset() (I2C0->CON.RST = 1)
|
||||
|
||||
/* I2C时基使能控制 */
|
||||
#define I2C_TJEnable() (I2C0->CON.TJE = 1)
|
||||
#define I2C_TJDisable() (I2C0->CON.TJE = 0)
|
||||
|
||||
/* I2C主控模式读写控制 */
|
||||
#define I2C_Read() (I2C0->CON.RW = 1)
|
||||
#define I2C_Write() (I2C0->CON.RW = 0)
|
||||
|
||||
/* I2C时钟自动下拉等待使能控制(仅从机模式支持) */
|
||||
#define I2C_CSEnable() (I2C0->MOD.CSE = 1)
|
||||
#define I2C_CSDisable() (I2C0->MOD.CSE = 0)
|
||||
|
||||
/* I2C自动发送未应答使能控制(仅从机模式支持) */
|
||||
#define I2C_ANAEnable() (I2C0->MOD.ANAE = 1)
|
||||
#define I2C_ANADisable() (I2C0->MOD.ANAE = 0)
|
||||
|
||||
/* I2C自动寻呼使能控制(仅主机模式支持) */
|
||||
#define I2C_SRAEnable() (I2C0->MOD.SRAE = 1)
|
||||
#define I2C_SRADisable() (I2C0->MOD.SRAE = 0)
|
||||
|
||||
/* I2C自动结束使能控制(仅主机模式支持) */
|
||||
#define I2C_SPAEnable() (I2C0->MOD.SPAE = 1)
|
||||
#define I2C_SPADisable() (I2C0->MOD.SPAE = 0)
|
||||
|
||||
/* I2C起始位触发(仅主机模式支持) */
|
||||
#define I2C_SRTrigger() (I2C0->MOD.SRT=1)
|
||||
|
||||
/* I2C停止位触发(仅主机模式支持) */
|
||||
#define I2C_SPTrigger() (I2C0->MOD.SPT = 1)
|
||||
|
||||
/* I2C接收数据触发(仅主机模式支持) */
|
||||
#define I2C_RDTrigger() (I2C0->MOD.RDT = 1)
|
||||
|
||||
|
||||
/* I2C总线释放 */
|
||||
#define I2C_Release() (I2C0->MOD.BLD = 1)
|
||||
|
||||
/* I2C发送应答设置(仅从机模式支持) */
|
||||
#define I2C_TACK() (I2C0->MOD.TAS = 1)
|
||||
#define I2C_TNACK() (I2C0->MOD.TAS = 0)
|
||||
|
||||
/************I2C模块函数声明***********/
|
||||
void I2C_Init(I2C_InitStruType* I2C_InitStruct);
|
||||
void I2C_ITConfig(I2C_TYPE_IT I2C_IT,TYPE_FUNCEN NewState);
|
||||
void I2C_SendAddress(uint8_t I2C_Address,I2C_TYPE_RWMODE Mode);
|
||||
void I2C_SetAddress(uint8_t I2C_Address);
|
||||
void I2C_RecModeConfig(I2C_TYPE_RECMODE RecType);
|
||||
void I2C_TBIMConfig(I2C_TYPE_TRBIM Type);
|
||||
void I2C_RBIMConfig(I2C_TYPE_TRBIM Type);
|
||||
void I2C_AckDelay(I2C_TYPE_ADLY Type,TYPE_FUNCEN NewStatus);
|
||||
void I2C_TISConfig(I2C_TYPE_TIS Time);
|
||||
void I2C_SendByte(uint8_t Byte);
|
||||
void I2C_SendHalfWord(uint16_t HalfWord);
|
||||
void I2C_SendWord(uint32_t Word);
|
||||
uint8_t I2C_RecByte(void);
|
||||
uint16_t I2C_RecHalfWord(void);
|
||||
uint32_t I2C_RecWord(void);
|
||||
I2C_TYPE_RWMODE I2C_GetRWMode(void);
|
||||
FlagStatus I2C_GetTBStatus(void);
|
||||
FlagStatus I2C_GetFlagStatus(I2C_TYPE_FLAG I2C_Flag);
|
||||
FlagStatus I2C_GetITStatus( I2C_TYPE_IT I2C_Flag);
|
||||
void I2C_ClearITPendingBit(I2C_CLR_IF I2C_IT);
|
||||
|
||||
#endif
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,33 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名: lib_printf.h
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: 串口打印库函数头文件
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBPRINTF_H__
|
||||
#define __LIBPRINTF_H__
|
||||
|
||||
#include "lib_uart.h"
|
||||
#include <stdio.h>
|
||||
#include "type.h"
|
||||
|
||||
int fputc(int ch, FILE *f);
|
||||
static char *itoa(int value, char *string, int radix);
|
||||
ErrorStatus UART_printf(uint8_t *Data,...);
|
||||
|
||||
#ifdef __clang__
|
||||
ErrorStatus UART_printf(uint8_t *Data, ...);
|
||||
|
||||
#elif defined __CC_ARM
|
||||
|
||||
#define UART_printf printf
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,84 @@
|
||||
/*********************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名: lib_rtc.h
|
||||
*作 者: WangMX
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: RTC模块程序头文件
|
||||
*备 注: 适用于HRSDK-GDB-ES8P508x V1.1
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
**********************************************************/
|
||||
#ifndef __LIBRTC_H__
|
||||
#define __LIBRTC_H__
|
||||
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
/*RTC时钟源选择*/
|
||||
typedef enum
|
||||
{
|
||||
RTC_LOSC = 0x0, //外部32768HZ时钟 RTC精确计时
|
||||
RTC_LRC = 0x1, //内部LRC时钟 RTC非精确计时
|
||||
RTC_PLCK_256 = 0x2, //PLCLK/256 RTC用作普通计数器
|
||||
RTC_PLCK = 0x3, //PCLK RTC用作普通计数器
|
||||
}RTC_TYPE_CLKS;
|
||||
|
||||
/*RTC时钟12/24小时制选择*/
|
||||
typedef enum
|
||||
{
|
||||
RTC_HOUR12 = 0x0, //12小时制
|
||||
RTC_HOUR24 = 0x1, //24小时制
|
||||
}RTC_TYPE_TIME;
|
||||
|
||||
/* RTC中断源选择 */
|
||||
typedef enum {
|
||||
RTC_Interrupt_Source_Second = 0x001, // 秒中断
|
||||
RTC_Interrupt_Source_Minute = 0x002, // 分中断
|
||||
RTC_Interrupt_Source_Hour = 0x004, // 小时中断
|
||||
RTC_Interrupt_Source_Day = 0x008, // 天中断
|
||||
RTC_Interrupt_Source_Month = 0x010, // 月中断
|
||||
RTC_Interrupt_Source_DayALE = 0x100, // 日闹钟中断
|
||||
RTC_Interrupt_Source_WeekALE = 0x200, // 周闹钟中断
|
||||
} RTC_Interrupt_Source;
|
||||
|
||||
|
||||
/********************* RTC模块函数声明 *********************/
|
||||
void RTC_Init(RTC_TYPE_CLKS CLKx,RTC_TYPE_TIME HOURx);
|
||||
uint32_t RTC_ReadHourmode(void);
|
||||
uint32_t RTC_ReadSecond(void);
|
||||
uint32_t RTC_ReadMinute(void);
|
||||
uint32_t RTC_ReadHour(uint32_t *meridiem);
|
||||
uint32_t RTC_ReadDay(void);
|
||||
uint32_t RTC_ReadMonth(void);
|
||||
uint32_t RTC_ReadYear(void);
|
||||
uint32_t RTC_ReadWeek(void);
|
||||
|
||||
ErrorStatus RTC_WriteSecond(uint32_t second);
|
||||
ErrorStatus RTC_WriteMinute(uint32_t minute);
|
||||
ErrorStatus RTC_WriteHour(uint32_t hour, uint32_t meridiem);
|
||||
ErrorStatus RTC_WriteDay(uint32_t day);
|
||||
ErrorStatus RTC_WriteMonth(uint32_t month);
|
||||
ErrorStatus RTC_WriteYear(uint32_t year);
|
||||
ErrorStatus RTC_WriteWeek(uint32_t week);
|
||||
|
||||
uint32_t RTC_ReadWeekAlarmMinute(void);
|
||||
uint32_t RTC_ReadWeekAlarmHour(uint32_t *meridiem);
|
||||
uint32_t RTC_ReadWeekAlarmWeek(void);
|
||||
uint32_t RTC_ReadDayAlarmMinute(void);
|
||||
uint32_t RTC_ReadDayAlarmHour(uint32_t *meridiem);
|
||||
|
||||
ErrorStatus RTC_WriteWeekAlarmMinute(uint32_t minute);
|
||||
ErrorStatus RTC_WriteWeekAlarmHour(uint32_t hour, uint32_t meridiem);
|
||||
ErrorStatus RTC_WriteWeekAlarmWeek(uint32_t week);
|
||||
ErrorStatus RTC_WriteDayAlarmMinute(uint32_t minute);
|
||||
ErrorStatus RTC_WriteDayAlarmHour(uint32_t hour, uint32_t meridiem);
|
||||
|
||||
void RTC_InterruptEnable(RTC_Interrupt_Source src);
|
||||
void RTC_InterruptDisable(RTC_Interrupt_Source src);
|
||||
ITStatus RTC_GetITStatus(RTC_Interrupt_Source src);
|
||||
FlagStatus RTC_GetFlagStatus(RTC_Interrupt_Source src);
|
||||
void RTC_ClearITPendingBit(RTC_Interrupt_Source src);
|
||||
|
||||
#endif
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,98 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名: lib_scs.h
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: 内核模块库函数头文件
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBNVIC_H__
|
||||
#define __LIBNVIC_H__
|
||||
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
/* 中断源选择 */
|
||||
typedef enum
|
||||
{
|
||||
NVIC_PINT0_IRQn = 0,
|
||||
NVIC_PINT1_IRQn = 1,
|
||||
NVIC_PINT2_IRQn = 2,
|
||||
NVIC_PINT3_IRQn = 3,
|
||||
NVIC_PINT4_IRQn = 4,
|
||||
NVIC_PINT5_IRQn = 5,
|
||||
NVIC_PINT6_IRQn = 6,
|
||||
NVIC_PINT7_IRQn = 7,
|
||||
NVIC_T16N0_IRQn = 8,
|
||||
NVIC_T16N1_IRQn = 9,
|
||||
NVIC_T16N2_IRQn = 10,
|
||||
NVIC_T16N3_IRQn = 11,
|
||||
NVIC_T32N0_IRQn = 12,
|
||||
NVIC_IWDT_IRQn = 14,
|
||||
NVIC_WWDT_IRQn = 15,
|
||||
NVIC_CCM_IRQn = 16,
|
||||
NVIC_PLK_IRQn = 17,
|
||||
NVIC_LVD_IRQn = 18,
|
||||
NVIC_KINT_IRQn = 19,
|
||||
NVIC_RTC_IRQn = 20,
|
||||
NVIC_ADC_IRQn = 21,
|
||||
NVIC_AES_IRQn = 23,
|
||||
NVIC_UART0_IRQn = 24,
|
||||
NVIC_UART1_IRQn = 25,
|
||||
NVIC_UART2_IRQn = 26,
|
||||
NVIC_UART3_IRQn = 27,
|
||||
NVIC_UART4_IRQn = 28,
|
||||
NVIC_UART5_IRQn = 29,
|
||||
NVIC_SPI0_IRQn = 30,
|
||||
NVIC_I2C0_IRQn = 31,
|
||||
}NVIC_IRQChannel;
|
||||
|
||||
/* 优先级 */
|
||||
typedef enum
|
||||
{
|
||||
NVIC_Priority_0 = 0x0 ,
|
||||
NVIC_Priority_1 = 0x1 ,
|
||||
NVIC_Priority_2 = 0x2 ,
|
||||
NVIC_Priority_3 = 0x3 ,
|
||||
}NVIC_IRQPriority;
|
||||
|
||||
/* 休眠模式 */
|
||||
typedef enum
|
||||
{
|
||||
SCB_LP_SleepOnExit = 0x02 , //从ISR中断处理程序返回到线程模式时,是否休眠
|
||||
SCB_LP_SleepDeep = 0x04 , //深度睡眠
|
||||
SCB_LP_SEVOPend = 0x10 , //中断挂起时,是否作为唤醒的选择位
|
||||
}SCB_TYPE_SCR;
|
||||
|
||||
/* SysTick时钟源选择 */
|
||||
typedef enum
|
||||
{
|
||||
SysTick_ClkS_Base = 0x0 , //基准时钟(Hclk/3)
|
||||
SysTick_ClkS_Cpu = 0x1 , //处理器时钟(Hclk)
|
||||
}SYST_TYPE_CLKS;
|
||||
|
||||
/* SysTick初始化配置结构体定义 */
|
||||
typedef struct
|
||||
{
|
||||
uint32_t SysTick_Value; //递减数值:24位,右对齐
|
||||
SYST_TYPE_CLKS SysTick_ClkSource; //时钟源选择
|
||||
TYPE_FUNCEN SysTick_ITEnable; //中断使能、失能
|
||||
}SYSTICK_InitStruType;
|
||||
|
||||
/**************模块宏定义*************/
|
||||
|
||||
/*SysTick使能*/
|
||||
#define SysTick_Enable() (SysTick->CTRL |= 0x00000001)
|
||||
#define SysTick_Disable() (SysTick->CTRL &= 0xFFFFFFFE)
|
||||
|
||||
/************SCS模块函数声明***********/
|
||||
void NVIC_Init(NVIC_IRQChannel Channel,NVIC_IRQPriority Priority,TYPE_FUNCEN Cmd);
|
||||
void SCB_SystemLPConfig(SCB_TYPE_SCR LowPowerMode, TYPE_FUNCEN NewState);
|
||||
uint32_t SCB_GetCpuID(void);
|
||||
void SysTick_Init(SYSTICK_InitStruType* SysT_InitStruct);
|
||||
|
||||
#endif
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,314 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名: lib_scu.h
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: 内核模块库函数头文件
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBSCU_H
|
||||
#define __LIBSCU_H
|
||||
|
||||
#include "system_ES8P508x.h"
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
/* NMI不可屏蔽中断选择 */
|
||||
typedef enum
|
||||
{
|
||||
SCU_PINT0_IRQn = 0,
|
||||
SCU_PINT1_IRQn = 1,
|
||||
SCU_PINT2_IRQn = 2,
|
||||
SCU_PINT3_IRQn = 3,
|
||||
SCU_PINT4_IRQn = 4,
|
||||
SCU_PINT5_IRQn = 5,
|
||||
SCU_PINT6_IRQn = 6,
|
||||
SCU_PINT7_IRQn = 7,
|
||||
SCU_T16N0_IRQn = 8,
|
||||
SCU_T16N1_IRQn = 9,
|
||||
SCU_T16N2_IRQn = 10,
|
||||
SCU_T16N3_IRQn = 11,
|
||||
SCU_T32N0_IRQn = 12,
|
||||
SCU_IWDT_IRQn = 14,
|
||||
SCU_WWDT_IRQn = 15,
|
||||
SCU_CCM_IRQn = 16,
|
||||
SCU_PLK_IRQn = 17,
|
||||
SCU_LVD_IRQn = 18,
|
||||
SCU_KINT_IRQn = 19,
|
||||
SCU_RTC_IRQn = 20,
|
||||
SCU_ADC_IRQn = 21,
|
||||
SCU_AES_IRQn = 23,
|
||||
SCU_UART0_IRQn = 24,
|
||||
SCU_UART1_IRQn = 25,
|
||||
SCU_UART2_IRQn = 26,
|
||||
SCU_UART3_IRQn = 27,
|
||||
SCU_UART4_IRQn = 28,
|
||||
SCU_UART5_IRQn = 29,
|
||||
SCU_SPI0_IRQn = 30,
|
||||
SCU_I2C0_IRQn = 31,
|
||||
}SCU_TYPE_NMICS;
|
||||
|
||||
/* PWRC复位状态寄存器标志位 */
|
||||
typedef enum
|
||||
{
|
||||
SCU_PWRC_PORF= 0X00001, //POR复位标志位
|
||||
SCU_PWRC_RRCF = 0X00002, //PORC复位标志位
|
||||
SCU_PWRC_PORRSTF = 0x00004, //POR总复位标志
|
||||
SCU_PWRC_BORF = 0x00008, //BOR总复位标志
|
||||
SCU_PWRC_WWDTRSTF = 0x00010, //WWDT复位标志
|
||||
SCU_PWRC_IWDTRSTF = 0x00020, //IWDT复位标志
|
||||
SCU_PWRC_MRSTF = 0x00040, //MRSTn复位标志
|
||||
SCU_PWRC_SOFTRSTF = 0x00080, //软件复位标志
|
||||
}SCU_TYPE_PWRC;
|
||||
|
||||
/* LVD寄存器标志位 */
|
||||
typedef enum
|
||||
{
|
||||
SCU_LVDFlag_IF = 0x0100, //LVD中断标志
|
||||
SCU_LVDFlag_Out = 0x8000, //输出状态位
|
||||
}SCU_TYPE_LVD0CON;
|
||||
|
||||
/* 时钟选择 */
|
||||
typedef enum
|
||||
{
|
||||
SCU_SysClk_HRC = 0x0 , //内部20MHZ RC时钟
|
||||
SCU_SysClk_XTAL = 0x1 , //外部晶振主时钟
|
||||
SCU_SysClk_PLL = 0x2 , //PLL
|
||||
}SCU_TYPE_SYSCLK;
|
||||
|
||||
/*clk_sel时钟源选择*/
|
||||
typedef enum
|
||||
{
|
||||
CLK_SEL_HRC = 0x0, //HRC 20M
|
||||
CLK_SEL_LRC = 0x1, //LRC 32KHz
|
||||
CLK_SEL_XTAL = 0x2, //外接晶振XTAL
|
||||
}SCU_TYPE_CLK_SEL;
|
||||
|
||||
/* PLL时钟源选择 */
|
||||
typedef enum
|
||||
{
|
||||
SCU_PLL_HRC = 0x0 , //PLL时钟源HRC
|
||||
SCU_PLL_LRC = 0x2 , //PLL时钟源LRC
|
||||
SCU_PLL_XTAL_32K = 0x3 , //PLL时钟源XTAL
|
||||
SCU_PLL_XTAL_4M = 0x4 , //PLL时钟源XTAL
|
||||
SCU_PLL_XTAL_8M = 0x5, //PLL时钟源XTAL
|
||||
SCU_PLL_XTAL_16M = 0x6, //PLL时钟源XTAL
|
||||
SCU_PLL_XTAL_20M = 0x7, //PLL时钟源XTAL
|
||||
} SCU_PLL_Origin;
|
||||
|
||||
/* PLL时钟输出频率旋择 */
|
||||
typedef enum
|
||||
{
|
||||
SCU_PLL_32M = 0x0 , //PLL时钟输出为32MHz
|
||||
SCU_PLL_48M = 0x1 , //PLL时钟输出为48Mhz
|
||||
} SCU_PLL_Out;
|
||||
|
||||
/************SCU模块宏定义***********/
|
||||
/* SCU写保护控制 */
|
||||
#define SCU_RegUnLock() (SCU->PROT.Word = 0x55AA6996)
|
||||
#define SCU_RegLock() (SCU->PROT.Word = 0x00000000)
|
||||
|
||||
/* NMI使能控制 */
|
||||
#define SCU_NMI_Enable() (SCU->NMICON.NMIEN = 0x1)
|
||||
#define SCU_NMI_Disable() (SCU->NMICON.NMIEN = 0x0)
|
||||
|
||||
/*-------LVD模块-------*/
|
||||
|
||||
/* LVD使能控制 */
|
||||
#define SCU_LVD_Enable() (SCU->LVDCON.EN = 0x1)
|
||||
#define SCU_LVD_Disable() (SCU->LVDCON.EN = 0x0)
|
||||
|
||||
/* LVD滤波使能控制 */
|
||||
#define SCU_LVDFLT_Enable() (SCU->LVDCON.FLTEN = 0x1)
|
||||
#define SCU_LVDFLT_Disable() (SCU->LVDCON.FLTEN = 0x0)
|
||||
|
||||
/* LVD触发电压选择 */
|
||||
#define SCU_LVDVS_2V0() (SCU->LVDCON.VS = 0x0)
|
||||
#define SCU_LVDVS_2V1() (SCU->LVDCON.VS = 0x1)
|
||||
#define SCU_LVDVS_2V2() (SCU->LVDCON.VS = 0x2)
|
||||
#define SCU_LVDVS_2V4() (SCU->LVDCON.VS = 0x3)
|
||||
#define SCU_LVDVS_2V6() (SCU->LVDCON.VS = 0x4)
|
||||
#define SCU_LVDVS_2V8() (SCU->LVDCON.VS = 0x5)
|
||||
#define SCU_LVDVS_3V0() (SCU->LVDCON.VS = 0x6)
|
||||
#define SCU_LVDVS_3V6() (SCU->LVDCON.VS = 0x7)
|
||||
#define SCU_LVDVS_4V() (SCU->LVDCON.VS = 0x8)
|
||||
#define SCU_LVDVS_4V6() (SCU->LVDCON.VS = 0x9)
|
||||
#define SCU_LVDVS_2V3() (SCU->LVDCON.VS = 0xA)
|
||||
#define SCU_LVDVS_LVDIN() (SCU->LVDCON.VS = 0xE)
|
||||
|
||||
/* LVD中断使能控制 */
|
||||
#define SCU_LVDIT_Enable() (SCU->LVDCON.IE = 0x1)
|
||||
#define SCU_LVDIT_Disable() (SCU->LVDCON.IE = 0x0)
|
||||
|
||||
/* LVD中断标志位清除 */
|
||||
#define SCU_LVDClearIFBit() (SCU->LVDCON.IF = 1)
|
||||
|
||||
/* LVD中断产生模式选择 */
|
||||
#define SCU_LVDIFS_Rise() (SCU->LVDCON.IFS = 0x0) //LVDO上升沿产生中断
|
||||
#define SCU_LVDIFS_Fall() (SCU->LVDCON.IFS = 0x1) //LVDO下降沿产生中断
|
||||
#define SCU_LVDIFS_High() (SCU->LVDCON.IFS = 0x2) //LVDO高电平产生中断
|
||||
#define SCU_LVDIFS_Low() (SCU->LVDCON.IFS = 0x3) //LVDO低电平产生中断
|
||||
#define SCU_LVDIFS_Change() (SCU->LVDCON.IFS = 0x4) //LVDO电平变化产生中断
|
||||
|
||||
/* FLASH访问等待时间选择 */
|
||||
#define SCU_FlashWait_1Tclk() (SCU->FLASHWAIT.ACCT = 0x0)
|
||||
#define SCU_FlashWait_2Tclk() (SCU->FLASHWAIT.ACCT = 0x1)
|
||||
#define SCU_FlashWait_3Tclk() (SCU->FLASHWAIT.ACCT = 0x2)
|
||||
#define SCU_FlashWait_4Tclk() (SCU->FLASHWAIT.ACCT = 0x3)
|
||||
#define SCU_FlashWait_5Tclk() (SCU->FLASHWAIT.ACCT = 0x4)
|
||||
#define SCU_FlashWait_6Tclk() (SCU->FLASHWAIT.ACCT = 0x5)
|
||||
#define SCU_FlashWait_7Tclk() (SCU->FLASHWAIT.ACCT = 0x6)
|
||||
#define SCU_FlashWait_8Tclk() (SCU->FLASHWAIT.ACCT = 0x7)
|
||||
#define SCU_FlashWait_9Tclk() (SCU->FLASHWAIT.ACCT = 0x8)
|
||||
#define SCU_FlashWait_10Tclk() (SCU->FLASHWAIT.ACCT = 0x9)
|
||||
#define SCU_FlashWait_11Tclk() (SCU->FLASHWAIT.ACCT = 0xA)
|
||||
#define SCU_FlashWait_12Tclk() (SCU->FLASHWAIT.ACCT = 0xB)
|
||||
#define SCU_FlashWait_13Tclk() (SCU->FLASHWAIT.ACCT = 0xC)
|
||||
#define SCU_FlashWait_14Tclk() (SCU->FLASHWAIT.ACCT = 0xD)
|
||||
#define SCU_FlashWait_15Tclk() (SCU->FLASHWAIT.ACCT = 0xE)
|
||||
#define SCU_FlashWait_16Tclk() (SCU->FLASHWAIT.ACCT = 0xF)
|
||||
|
||||
/* 系统时钟后分频选择 */
|
||||
#define SCU_SysClk_Div1() (SCU->SCLKEN0.SYSCLK_DIV = 0)
|
||||
#define SCU_SysClk_Div2() (SCU->SCLKEN0.SYSCLK_DIV = 1)
|
||||
#define SCU_SysClk_Div4() (SCU->SCLKEN0.SYSCLK_DIV = 2)
|
||||
#define SCU_SysClk_Div8() (SCU->SCLKEN0.SYSCLK_DIV = 3)
|
||||
#define SCU_SysClk_Div16() (SCU->SCLKEN0.SYSCLK_DIV = 4)
|
||||
#define SCU_SysClk_Div32() (SCU->SCLKEN0.SYSCLK_DIV = 5)
|
||||
#define SCU_SysClk_Div64() (SCU->SCLKEN0.SYSCLK_DIV = 6)
|
||||
#define SCU_SysClk_Div128() (SCU->SCLKEN0.SYSCLK_DIV = 7)
|
||||
|
||||
/* HRC使能控制 (内部20Mhz) */
|
||||
#define SCU_HRC_Enable() (SCU->SCLKEN1.HRC_EN = 1)
|
||||
#define SCU_HRC_Disable() (SCU->SCLKEN1.HRC_EN = 0)
|
||||
|
||||
/* XTAL使能控制 */
|
||||
#define SCU_XTAL_Enable() (SCU->SCLKEN1.XTAL_EN = 1)
|
||||
#define SCU_XTAL_Disable() (SCU->SCLKEN1.XTAL_EN = 0)
|
||||
|
||||
/* PLL模式使能控制 */
|
||||
#define SCU_PLL_Enable() (SCU->SCLKEN1.PLL_EN = 1)
|
||||
#define SCU_PLL_Disable() (SCU->SCLKEN1.PLL_EN = 0)
|
||||
|
||||
/*-------外设时钟控制-------*/
|
||||
/* SCU时钟使能控制 */
|
||||
#define SCU_SCUCLK_Enable() (SCU->PCLKEN0.SCU_EN = 1)
|
||||
#define SCU_SCUCLK_Disable() (SCU->PCLKEN0.SCU_EN = 0)
|
||||
|
||||
/* GPIO时钟使能控制 */
|
||||
#define SCU_GPIOCLK_Enable() (SCU->PCLKEN0.GPIO_EN = 1)
|
||||
#define SCU_GPIOCLK_Disable() (SCU->PCLKEN0.GPIO_EN = 0)
|
||||
|
||||
/* FLASH IAP时钟使能控制 */
|
||||
#define SCU_IAPCLK_Enable() (SCU->PCLKEN0.IAP_EN = 1)
|
||||
#define SCU_IAPCLK_Disable() (SCU->PCLKEN0.IAP_EN = 0)
|
||||
|
||||
/* CRC时钟使能控制 */
|
||||
#define SCU_CRCCLK_Enable() (SCU->PCLKEN0.CRC_EN = 1)
|
||||
#define SCU_CRCCLK_Disable() (SCU->PCLKEN0.CRC_EN = 0)
|
||||
|
||||
/* ADC时钟使能控制 */
|
||||
#define SCU_ADCCLK_Enable() (SCU->PCLKEN0.ADC_EN = 1)
|
||||
#define SCU_ADCCLK_Disable() (SCU->PCLKEN0.ADC_EN = 0)
|
||||
|
||||
/* RTC时钟使能控制 */
|
||||
#define SCU_RTCCLK_Enable() (SCU->PCLKEN0.RTC_EN = 1)
|
||||
#define SCU_RTCCLK_Disable() (SCU->PCLKEN0.RTC_EN = 0)
|
||||
|
||||
/* IWDT时钟使能控制 */
|
||||
#define SCU_IWDTCLK_Enable() (SCU->PCLKEN0.IWDT_EN = 1)
|
||||
#define SCU_IWDTCLK_Disable() (SCU->PCLKEN0.IWDT_EN = 0)
|
||||
|
||||
/* WWDT时钟使能控制 */
|
||||
#define SCU_WWDTCLK_Enable() (SCU->PCLKEN0.WWDT_EN = 1)
|
||||
#define SCU_WWDTCLK_Disable() (SCU->PCLKEN0.WWDT_EN = 0)
|
||||
|
||||
/* AES时钟使能控制 */
|
||||
#define SCU_AESCLK_Enable() (SCU->PCLKEN0.AES_EN = 1)
|
||||
#define SCU_AESCLK_Disable() (SCU->PCLKEN0.AES_EN = 0)
|
||||
|
||||
/* T16N0时钟使能控制 */
|
||||
#define SCU_T16N0CLK_Enable() (SCU->PCLKEN1.T16N0_EN = 1)
|
||||
#define SCU_T16N0CLK_Disable() (SCU->PCLKEN1.T16N0_EN = 0)
|
||||
|
||||
/* T16N1时钟使能控制 */
|
||||
#define SCU_T16N1CLK_Enable() (SCU->PCLKEN1.T16N1_EN = 1)
|
||||
#define SCU_T16N1CLK_Disable() (SCU->PCLKEN1.T16N1_EN = 0)
|
||||
|
||||
/* T16N2时钟使能控制 */
|
||||
#define SCU_T16N2CLK_Enable() (SCU->PCLKEN1.T16N2_EN = 1)
|
||||
#define SCU_T16N2CLK_Disable() (SCU->PCLKEN1.T16N2_EN = 0)
|
||||
|
||||
/* T16N3时钟使能控制 */
|
||||
#define SCU_T16N3CLK_Enable() (SCU->PCLKEN1.T16N3_EN = 1)
|
||||
#define SCU_T16N3CLK_Disable() (SCU->PCLKEN1.T16N3_EN = 0)
|
||||
|
||||
/* T32N0时钟使能控制 */
|
||||
#define SCU_T32N0CLK_Enable() (SCU->PCLKEN1.T32N0_EN = 1)
|
||||
#define SCU_T32N0CLK_Disable() (SCU->PCLKEN1.T32N0_EN = 0)
|
||||
|
||||
/* UART0时钟使能控制 */
|
||||
#define SCU_UART0CLK_Enable() (SCU->PCLKEN1.UART0_EN = 1)
|
||||
#define SCU_UART0CLK_Disable() (SCU->PCLKEN1.UART0_EN = 0)
|
||||
|
||||
/* UART1时钟使能控制 */
|
||||
#define SCU_UART1CLK_Enable() (SCU->PCLKEN1.UART1_EN = 1)
|
||||
#define SCU_UART1CLK_Disable() (SCU->PCLKEN1.UART1_EN = 0)
|
||||
|
||||
/* UART2时钟使能控制 */
|
||||
#define SCU_UART2CLK_Enable() (SCU->PCLKEN1.UART2_EN = 1)
|
||||
#define SCU_UART2CLK_Disable() (SCU->PCLKEN1.UART2_EN = 0)
|
||||
|
||||
/* UART3时钟使能控制 */
|
||||
#define SCU_UART3CLK_Enable() (SCU->PCLKEN1.UART3_EN = 1)
|
||||
#define SCU_UART3CLK_Disable() (SCU->PCLKEN1.UART3_EN = 0)
|
||||
|
||||
/* UART4时钟使能控制 */
|
||||
#define SCU_UART4CLK_Enable() (SCU->PCLKEN1.UART4_EN = 1)
|
||||
#define SCU_UART4CLK_Disable() (SCU->PCLKEN1.UART4_EN = 0)
|
||||
|
||||
/* UART5时钟使能控制 */
|
||||
#define SCU_UART5CLK_Enable() (SCU->PCLKEN1.UART5_EN = 1)
|
||||
#define SCU_UART5CLK_Disable() (SCU->PCLKEN1.UART5_EN = 0)
|
||||
|
||||
/* SPI0时钟使能控制 */
|
||||
#define SCU_SPI0CLK_Enable() (SCU->PCLKEN1.SPI0_EN = 1)
|
||||
#define SCU_SPI0CLK_Disable() (SCU->PCLKEN1.SPI0_EN = 0)
|
||||
|
||||
/* IIC0时钟使能控制 */
|
||||
#define SCU_IIC0CLK_Enable() (SCU->PCLKEN1.I2C0_EN = 1)
|
||||
#define SCU_IIC0CLK_Disable() (SCU->PCLKEN1.I2C0_EN = 0)
|
||||
|
||||
/* 中断向量表重映射使能控制 */
|
||||
#define SCU_TBLRemap_Enable() (SCU->TBLREMAPEN.EN= 1)
|
||||
#define SCU_TBLRemap_Disable() (SCU->TBLREMAPEN.EN= 0)
|
||||
|
||||
/* 中断向量表偏移寄存器 x最大为2^24=16777216 */
|
||||
#define SCU_TBL_Offset(x) (SCU->TBLOFF.TBLOFF = (uint32_t)x)
|
||||
|
||||
/************SCU模块函数声明***********/
|
||||
void SCU_OpenXTAL(void);
|
||||
void SCU_NMISelect(SCU_TYPE_NMICS NMI_Type);
|
||||
FlagStatus SCU_GetPWRCFlagStatus(SCU_TYPE_PWRC PWRC_Flag);
|
||||
void SCU_ClearPWRCFlagBit(SCU_TYPE_PWRC PWRC_Flag);
|
||||
FlagStatus SCU_GetLVDFlagStatus(SCU_TYPE_LVD0CON LVD_Flag);
|
||||
void SCU_SysClkSelect(SCU_TYPE_SYSCLK Sysclk);
|
||||
SCU_TYPE_SYSCLK SCU_GetSysClk(void);
|
||||
FlagStatus SCU_HRCReadyFlag(void);
|
||||
FlagStatus SCU_XTALReadyFlag(void);
|
||||
FlagStatus SCU_PLLReadyFlag(void);
|
||||
void SystemClockConfig(void);
|
||||
void SystemClockConfig_1(void);
|
||||
void DeviceClockAllEnable(void);
|
||||
void DeviceClockAllDisable(void);
|
||||
void SystemClockSelect(SCU_TYPE_SYSCLK SYSCLKx , SCU_TYPE_CLK_SEL CLK_SEL);
|
||||
void PLLClock_Config(TYPE_FUNCEN pll_en , SCU_PLL_Origin pll_origin ,SCU_PLL_Out pll_out,TYPE_FUNCEN sys_pll);
|
||||
#endif
|
||||
/*************************END OF FILE**********************/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名: lib_spi.h
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: SPI模块库函数头文件
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBSPI_H__
|
||||
#define __LIBSPI_H__
|
||||
|
||||
#include "system_ES8P508x.h"
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
/* 通信数据格式 */
|
||||
typedef enum
|
||||
{
|
||||
SPI_RiseSendFallRec = 0x0 , //通信数据格式:上升沿发送(先),下降沿接收(后)
|
||||
SPI_FallSendRiseRec = 0x1 , //通信数据格式:下降沿发送(先),上升沿接收(后)
|
||||
SPI_RiseRecFallSend = 0x2 , //通信数据格式:上升沿接收(先),下降沿发送(后)
|
||||
SPI_FallRecRiseSend = 0x3 , //通信数据格式:下降沿接收(先),上升沿发送(后)
|
||||
}SPI_TYPE_DFS;
|
||||
|
||||
/* 通讯模式 */
|
||||
typedef enum
|
||||
{
|
||||
SPI_Mode_Master = 0x0 , //通讯模式:主控
|
||||
SPI_Mode_Slave = 0x1 , //通讯模式:从动
|
||||
}SPI_TYPE_MODE;
|
||||
|
||||
/* ADC初始化配置结构体定义 */
|
||||
typedef struct
|
||||
{
|
||||
uint32_t SPI_Freq; //SPI频率
|
||||
|
||||
SPI_TYPE_DFS SPI_Df; //通讯数据格式
|
||||
|
||||
SPI_TYPE_MODE SPI_Mode; //通讯模式
|
||||
|
||||
uint8_t SPI_DW; //发送帧位宽
|
||||
|
||||
TYPE_FUNCEN SPI_DelayRec; //延时接收使能
|
||||
|
||||
TYPE_FUNCEN SPI_DelaySend; //发送间隔使能
|
||||
|
||||
uint8_t SPI_SendDelayPeroid;//发送间隔周期
|
||||
|
||||
}SPI_InitStruType;
|
||||
|
||||
/* 标志位 */
|
||||
typedef enum
|
||||
{
|
||||
SPI_Flag_TB = 0x00000001,
|
||||
SPI_Flag_RB = 0x00000002,
|
||||
SPI_Flag_TE = 0x00000004,
|
||||
SPI_Flag_RO = 0x00000008,
|
||||
SPI_Flag_ID = 0x00000010,
|
||||
SPI_Flag_NSSIF = 0x00000020,
|
||||
SPI_Flag_TBWE = 0x00000040,
|
||||
SPI_Flag_NSS = 0x00000080,
|
||||
SPI_Flag_TBEF0 = 0x00000100,
|
||||
SPI_Flag_TBEF1 = 0x00000200,
|
||||
SPI_Flag_TBEF2 = 0x00000400,
|
||||
SPI_Flag_TBEF3 = 0x00000800,
|
||||
SPI_Flag_RBFF0 = 0x00001000,
|
||||
SPI_Flag_RBFF1 = 0x00002000,
|
||||
SPI_Flag_RBFF2 = 0x00004000,
|
||||
SPI_Flag_RBFF3 = 0x00008000,
|
||||
SPI_Flag_IDLE = 0x00010000,
|
||||
SPI_Flag_TMS = 0x00020000,
|
||||
}SPI_TYPE_FLAG;
|
||||
|
||||
/* 中断模式选择 */
|
||||
typedef enum
|
||||
{
|
||||
SPI_IType_BYTE = 0x0 ,
|
||||
SPI_IType_HALFWORD = 0x1 ,
|
||||
SPI_IType_WORD = 0x2 ,
|
||||
}SPI_TYPE_TRBIM;
|
||||
|
||||
/* SPI中断 */
|
||||
typedef enum
|
||||
{
|
||||
SPI_IT_TB = 0x01 ,
|
||||
SPI_IT_RB = 0x02 ,
|
||||
SPI_IT_TE = 0x04 ,
|
||||
SPI_IT_RO = 0x08 ,
|
||||
SPI_IT_ID = 0x10 ,
|
||||
SPI_IT_NSS = 0x20 ,
|
||||
SPI_IT_TBWE = 0x40 ,
|
||||
}SPI_TYPE_IT;
|
||||
|
||||
/* SPI清除中断标志 */
|
||||
typedef enum
|
||||
{
|
||||
SPI_Clr_TE = 0x04 ,
|
||||
SPI_Clr_RO = 0x08 ,
|
||||
SPI_Clr_ID = 0x10 ,
|
||||
SPI_Clr_NSS = 0x20 ,
|
||||
SPI_Clr_TBWE = 0x40 ,
|
||||
}SPI_CLR_IF;
|
||||
|
||||
/************SPI模块宏定义***********/
|
||||
|
||||
/* SPI使能控制 */
|
||||
#define SPI_Enable() (SPI0->CON.EN = 1)
|
||||
#define SPI_Disable() (SPI0->CON.EN = 0)
|
||||
|
||||
/* SPI接收使能控制 */
|
||||
#define SPI_RecEnable() (SPI0->CON.REN = 1)
|
||||
#define SPI_RecDisable() (SPI0->CON.REN = 0)
|
||||
|
||||
/* SPI软件复位 */
|
||||
#define SPI_Rst() (SPI0->CON.RST = 1)
|
||||
|
||||
/* SPI缓冲器清空 */
|
||||
#define SPI_RX_CLR() (SPI0->CON.RXCLR = 1)
|
||||
#define SPI_TX_CLR() (SPI0->CON.TXCLR = 1)
|
||||
|
||||
/************SPI模块函数声明***********/
|
||||
void SPI_Init(SPI_InitStruType* SPI_InitStruct);
|
||||
void SPI_ITConfig(SPI_TYPE_IT SPI_IE,TYPE_FUNCEN NewState);
|
||||
void SPI_DataFormatConfig(SPI_TYPE_DFS Type);
|
||||
void SPI_SendByte(uint8_t Temp);
|
||||
void SPI_SendHalfWord(uint16_t Temp);
|
||||
void SPI_SendWord(uint32_t Temp);
|
||||
uint8_t SPI_RecByte(void);
|
||||
uint16_t SPI_RecHalfWord(void);
|
||||
uint32_t SPI_RecWord(void);
|
||||
void SPI_TBIMConfig(SPI_TYPE_TRBIM Type);
|
||||
void SPI_RBIMConfig(SPI_TYPE_TRBIM Type);
|
||||
FlagStatus SPI_GetFlagStatus(SPI_TYPE_FLAG Flag);
|
||||
ITStatus SPI_GetITStatus(SPI_TYPE_IT Flag);
|
||||
void SPI_ClearITPendingBit(SPI_CLR_IF Flag);
|
||||
|
||||
#endif
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,310 @@
|
||||
/******************************************************************************************
|
||||
* Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
* 文件名: lib_timer.h
|
||||
* 作 者: Liut
|
||||
* 版 本: V1.00
|
||||
* 日 期: 2017/07/14
|
||||
* 描 述: 16位定时器/计数器、32位定时器/计数器库函数头文件
|
||||
* 备 注: 适用于ES8P508x系列芯片
|
||||
* 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
*******************************************************************************************/
|
||||
#ifndef __LIBTIMER_H__
|
||||
#define __LIBTIMER_H__
|
||||
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
/* 时钟源选择 */
|
||||
typedef enum
|
||||
{
|
||||
TIM_ClkS_PCLK = 0x0 , //时钟源选择:内部PCLK
|
||||
TIM_ClkS_CK0 = 0x1 , //时钟源选择:外部CK0时钟输入
|
||||
TIM_ClkS_CK1 = 0x2 , //时钟源选择:外部CK1时钟输入
|
||||
}TIM_TYPE_CLKS;
|
||||
|
||||
/* 外部时钟计数边沿选择 */
|
||||
typedef enum
|
||||
{
|
||||
TIM_EDGE_Rise = 0x0 , //外部时钟计数边沿选择:上升沿
|
||||
TIM_EDGE_Fall = 0x1 , //外部时钟计数边沿选择:下降沿
|
||||
TIM_EDGE_All = 0x2 , //外部时钟计数边沿选择:所有
|
||||
}TIM_TYPE_EDGE;
|
||||
|
||||
|
||||
/* 工作模式选择 */
|
||||
typedef enum
|
||||
{
|
||||
TIM_Mode_TC0 = 0x0 , //工作模式:定时、计数模式
|
||||
TIM_Mode_TC1 = 0x1 , //工作模式:定时、计数模式
|
||||
TIM_Mode_CAP = 0x2 , //工作模式:捕捉模式
|
||||
TIM_Mode_PWM = 0x3 , //工作模式:调制模式
|
||||
}TIM_TYPE_MODE;
|
||||
|
||||
/* TIM初始化配置结构体定义 */
|
||||
typedef struct
|
||||
{
|
||||
TIM_TYPE_CLKS TIM_ClkS; //时钟源选择
|
||||
TYPE_FUNCEN TIM_SYNC; //外部时钟同步
|
||||
TIM_TYPE_EDGE TIM_EDGE; //外部时钟计数边沿选择
|
||||
TIM_TYPE_MODE TIM_Mode; //工作模式选择
|
||||
}TIM_BaseInitStruType;
|
||||
|
||||
/* 匹配寄存器值匹配后的工作模式 */
|
||||
typedef enum
|
||||
{
|
||||
TIM_Go_No = 0x0 , //匹配寄存器值匹配后的工作模式:继续计数,不产生中断
|
||||
TIM_Hold_Int = 0x1 , //匹配寄存器值匹配后的工作模式:保持计数,产生中断
|
||||
TIM_Clr_Int = 0x2 , //匹配寄存器值匹配后的工作模式:清零并重新计数,产生中断
|
||||
TIM_Go_Int = 0x3 , //匹配寄存器值匹配后的工作模式:继续计数,产生中断
|
||||
}TIM_TYPE_MATCON;
|
||||
|
||||
/* 匹配寄存器值匹配后输出端口的工作模式 */
|
||||
typedef enum
|
||||
{
|
||||
TIM_Out_Hold = 0x0 , //匹配寄存器值匹配后输出端口的工作模式:保持
|
||||
TIM_Out_Low = 0x1 , //匹配寄存器值匹配后输出端口的工作模式:清0
|
||||
TIM_Out_High = 0x2 , //匹配寄存器值匹配后输出端口的工作模式:置1
|
||||
TIM_Out_Switch = 0x3 , //匹配寄存器值匹配后输出端口的工作模式:取反
|
||||
}TIM_TYPE_MATOUT;
|
||||
|
||||
/* 捕捉次数控制 */
|
||||
typedef enum
|
||||
{
|
||||
TIM_CapTime_1 = 0x0 , //捕捉次数控制:1
|
||||
TIM_CapTime_2 = 0x1 , //捕捉次数控制:2
|
||||
TIM_CapTime_3 = 0x2 , //捕捉次数控制:3
|
||||
TIM_CapTime_4 = 0x3 , //捕捉次数控制:4
|
||||
TIM_CapTime_5 = 0x4 , //捕捉次数控制:5
|
||||
TIM_CapTime_6 = 0x5 , //捕捉次数控制:6
|
||||
TIM_CapTime_7 = 0x6 , //捕捉次数控制:7
|
||||
TIM_CapTime_8 = 0x7 , //捕捉次数控制:8
|
||||
TIM_CapTime_9 = 0x8 , //捕捉次数控制:9
|
||||
TIM_CapTime_10 = 0x9 , //捕捉次数控制:10
|
||||
TIM_CapTime_11 = 0xA , //捕捉次数控制:11
|
||||
TIM_CapTime_12 = 0xB , //捕捉次数控制:12
|
||||
TIM_CapTime_13 = 0xC , //捕捉次数控制:13
|
||||
TIM_CapTime_14 = 0xD , //捕捉次数控制:14
|
||||
TIM_CapTime_15 = 0xE , //捕捉次数控制:15
|
||||
TIM_CapTime_16 = 0xF , //捕捉次数控制:16
|
||||
}TIM_TYPE_CAPT;
|
||||
|
||||
/* PWM输出极性类型 */
|
||||
typedef enum
|
||||
{
|
||||
POSITIVE = 0X00, //正极性
|
||||
NEGATIVE = 0X01, //负极性
|
||||
}T16Nx_PWMOUT_POLAR_Type;
|
||||
|
||||
/* 调制功能初始化结构体定义 */
|
||||
typedef struct
|
||||
{
|
||||
TYPE_FUNCEN T16Nx_MOE0; //输出端口0使能
|
||||
TYPE_FUNCEN T16Nx_MOE1; //输出端口1使能
|
||||
T16Nx_PWMOUT_POLAR_Type T16Nx_POL0; //T16NxOUT0输出极性选择位
|
||||
T16Nx_PWMOUT_POLAR_Type T16Nx_POL1; //T16NxOUT1输出极性选择位
|
||||
}T16Nx_PWMInitStruType;
|
||||
|
||||
/* 捕捉功能初始化结构体定义 */
|
||||
typedef struct
|
||||
{
|
||||
TYPE_FUNCEN TIM_CapRise; //上升沿捕捉使能
|
||||
TYPE_FUNCEN TIM_CapFall; //下降沿捕捉使能
|
||||
TYPE_FUNCEN TIM_CapIS0; //输入端口0使能
|
||||
TYPE_FUNCEN TIM_CapIS1; //输入端口1使能
|
||||
TIM_TYPE_CAPT TIM_CapTime; //捕捉次数控制
|
||||
}TIM_CapInitStruType;
|
||||
|
||||
/* PWM刹车输出电平 */
|
||||
typedef enum
|
||||
{
|
||||
PWMBKOUT_Low = 0,
|
||||
PWMBKOUT_High = 1,
|
||||
}T16Nx_PWMBKOUT_LEVEl;
|
||||
|
||||
/* PWM刹车信号极性选择 */
|
||||
typedef enum
|
||||
{
|
||||
PWMBKP_High = 0,
|
||||
PWMBKP_Low = 1,
|
||||
}T16Nx_PWMBKP_LEVEl;
|
||||
|
||||
/*PWM刹车信号源选择*/
|
||||
typedef enum
|
||||
{
|
||||
PWMBKPS_PINT0 = 0,
|
||||
PWMBKPS_PINT1 = 1,
|
||||
PWMBKPS_PINT2 = 2,
|
||||
PWMBKPS_PINT3 = 3,
|
||||
PWMBKPS_PINT4 = 4,
|
||||
PWMBKPS_PINT5 = 5,
|
||||
PWMBKPS_PINT6 = 6,
|
||||
PWMBKPS_PINT7 = 7,
|
||||
}T16Nx_PWMBKP_S;
|
||||
|
||||
/*PWM输出刹车控制*/
|
||||
typedef struct
|
||||
{
|
||||
|
||||
T16Nx_PWMBKOUT_LEVEl T16Nx_PWMBKL0; //PWM通道0刹车输出电平选择
|
||||
T16Nx_PWMBKOUT_LEVEl T16Nx_PWMBKL1; //PWM通道1刹车输出电平选择
|
||||
T16Nx_PWMBKP_S T16Nx_PWMBKS; //PWM通道信号源选择
|
||||
T16Nx_PWMBKP_LEVEl T16Nx_PWMBKPS; //PWM通道刹车信号极性选择
|
||||
TYPE_FUNCEN T16Nx_PWMBKEN; //PWM刹车使能
|
||||
}T16Nx_PWMBK_Type;
|
||||
|
||||
/* 中断配置 */
|
||||
typedef enum
|
||||
{
|
||||
TIM_IT_MAT0 = 0x01 ,
|
||||
TIM_IT_MAT1 = 0x02 ,
|
||||
TIM_IT_MAT2 = 0x04 ,
|
||||
TIM_IT_MAT3 = 0x08 ,
|
||||
TIM_IT_N = 0x10 ,
|
||||
TIM_IT_CAP0 = 0x20 ,
|
||||
TIM_IT_CAP1 = 0x40 ,
|
||||
TIM_IT_PBK = 0x80 ,
|
||||
}TIM_TYPE_IT;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TIM_IF_MAT0 = 0x01 ,
|
||||
TIM_IF_MAT1 = 0x02 ,
|
||||
TIM_IF_MAT2 = 0x04 ,
|
||||
TIM_IF_MAT3 = 0x08 ,
|
||||
TIM_IF_N = 0x10 ,
|
||||
TIM_IF_CAP0 = 0x20 ,
|
||||
TIM_IF_CAP1 = 0x40 ,
|
||||
TIM_IF_PBK = 0x80 ,
|
||||
}TIM_TYPE_IF;
|
||||
|
||||
/* 匹配寄存器 */
|
||||
typedef enum
|
||||
{
|
||||
TIM_MAT0 = 0x00 ,
|
||||
TIM_MAT1 = 0x01 ,
|
||||
TIM_MAT2 = 0x02 ,
|
||||
TIM_MAT3 = 0x03 ,
|
||||
}TIM_TYPE_MATX;
|
||||
|
||||
/*T16N ADC触发使能控制*/
|
||||
typedef enum
|
||||
{
|
||||
T16Nx_MAT0 = 0x02, //PWM通道0匹配0触发使能
|
||||
T16Nx_MAT1 = 0x04, //PWM通道0匹配1触发使能
|
||||
T16Nx_MAT2 = 0x20, //PWM通道1匹配2触发使能
|
||||
T16Nx_MAT3 = 0x40, //PWM通道1匹配3触发使能
|
||||
}T16Nx_PWMTRG_type;
|
||||
|
||||
/*************TIM模块宏定义************/
|
||||
|
||||
/* TIM模块使能控制 */
|
||||
#define T16N0_Enable() (T16N0->CON0.EN = 1)
|
||||
#define T16N1_Enable() (T16N1->CON0.EN = 1)
|
||||
#define T16N2_Enable() (T16N2->CON0.EN = 1)
|
||||
#define T16N3_Enable() (T16N3->CON0.EN = 1)
|
||||
#define T32N0_Enable() (T32N0->CON0.EN = 1)
|
||||
#define T16N0_Disable() (T16N0->CON0.EN = 0)
|
||||
#define T16N1_Disable() (T16N1->CON0.EN = 0)
|
||||
#define T16N2_Disable() (T16N2->CON0.EN = 0)
|
||||
#define T16N3_Disable() (T16N3->CON0.EN = 0)
|
||||
#define T32N0_Disable() (T32N0->CON0.EN = 0)
|
||||
|
||||
/* 异步写使能控制 */
|
||||
#define T16N0_ASYNCWR_Enable() (T16N0->CON0.ASYWEN = 1)
|
||||
#define T16N1_ASYNCWR_Enable() (T16N1->CON0.ASYWEN = 1)
|
||||
#define T16N2_ASYNCWR_Enable() (T16N2->CON0.ASYWEN = 1)
|
||||
#define T16N3_ASYNCWR_Enable() (T16N3->CON0.ASYWEN = 1)
|
||||
#define T32N0_ASYNCWR_Enable() (T32N0->CON0.ASYNCWREN = 1)
|
||||
#define T16N0_ASYNCWR_Disable() (T16N0->CON0.ASYWEN= 0)
|
||||
#define T16N1_ASYNCWR_Disable() (T16N1->CON0.ASYWEN = 0)
|
||||
#define T16N2_ASYNCWR_Disable() (T16N2->CON0.ASYWEN = 0)
|
||||
#define T16N3_ASYNCWR_Disable() (T16N3->CON0.ASYWEN = 0)
|
||||
#define T32N0_ASYNCWR_Disable() (T32N0->CON0.ASYNCWREN = 0)
|
||||
|
||||
/* PWM输出使能控制 */
|
||||
#define T16N0_PwmOut0_Enable() (T16N0->CON2.MOE0 = 1)
|
||||
#define T16N1_PwmOut0_Enable() (T16N1->CON2.MOE0 = 1)
|
||||
#define T16N2_PwmOut0_Enable() (T16N2->CON2.MOE0 = 1)
|
||||
#define T16N3_PwmOut0_Enable() (T16N3->CON2.MOE0 = 1)
|
||||
#define T32N0_PwmOut0_Enable() (T32N0->CON2.MOE0 = 1)
|
||||
#define T16N0_PwmOut1_Enable() (T16N0->CON2.MOE1 = 1)
|
||||
#define T16N1_PwmOut1_Enable() (T16N1->CON2.MOE1 = 1)
|
||||
#define T16N2_PwmOut1_Enable() (T16N2->CON2.MOE1 = 1)
|
||||
#define T16N3_PwmOut1_Enable() (T16N3->CON2.MOE1 = 1)
|
||||
#define T32N0_PwmOut1_Enable() (T32N0->CON2.MOE1 = 1)
|
||||
#define T16N0_PwmOut0_Disable() (T16N0->CON2.MOE0 = 0)
|
||||
#define T16N1_PwmOut0_Disable() (T16N1->CON2.MOE0 = 0)
|
||||
#define T16N2_PwmOut0_Disable() (T16N2->CON2.MOE0 = 0)
|
||||
#define T16N3_PwmOut0_Disable() (T16N3->CON2.MOE0 = 0)
|
||||
#define T32N0_PwmOut0_Disable() (T32N0->CON2.MOE0 = 0)
|
||||
#define T16N0_PwmOut1_Disable() (T16N0->CON2.MOE1 = 0)
|
||||
#define T16N1_PwmOut1_Disable() (T16N1->CON2.MOE1 = 0)
|
||||
#define T16N2_PwmOut1_Disable() (T16N2->CON2.MOE1 = 0)
|
||||
#define T16N3_PwmOut1_Disable() (T16N3->CON2.MOE1 = 0)
|
||||
#define T32N0_PwmOut1_Disable() (T32N0->CON2.MOE1 = 0)
|
||||
|
||||
/************T16模块函数声明***********/
|
||||
void T16Nx_BaseInit(T16N_TypeDef* T16Nx,TIM_BaseInitStruType* TIM_BaseInitStruct);
|
||||
void T16Nx_CapInit(T16N_TypeDef* T16Nx,TIM_CapInitStruType* TIM_CapInitStruct);
|
||||
void T16Nx_MAT0ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_MATCON Type);
|
||||
void T16Nx_MAT1ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_MATCON Type);
|
||||
void T16Nx_MAT2ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_MATCON Type);
|
||||
void T16Nx_MAT3ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_MATCON Type);
|
||||
void T16Nx_MAT0Out0Config(T16N_TypeDef* T16Nx,TIM_TYPE_MATOUT Type);
|
||||
void T16Nx_MAT1Out0Config(T16N_TypeDef* T16Nx,TIM_TYPE_MATOUT Type);
|
||||
void T16Nx_MAT2Out1Config(T16N_TypeDef* T16Nx,TIM_TYPE_MATOUT Type);
|
||||
void T16Nx_MAT3Out1Config(T16N_TypeDef* T16Nx,TIM_TYPE_MATOUT Type);
|
||||
void T16Nx_ITConfig(T16N_TypeDef* T16Nx,TIM_TYPE_IT Type,TYPE_FUNCEN NewState);
|
||||
void T16Nx_PWMOutConfig(T16N_TypeDef* T16Nx,T16Nx_PWMInitStruType* T16Nx_PWMInitStruct);
|
||||
void T16Nx_PWMBK_Config(T16N_TypeDef* T16Nx,T16Nx_PWMBK_Type* type);
|
||||
void T16Nx_TRG_Config(T16N_TypeDef* T16Nx,T16Nx_PWMTRG_type Type,TYPE_FUNCEN NewState);
|
||||
FlagStatus T16Nx_GetPWMBKF(T16N_TypeDef* T16Nx);
|
||||
void T16Nx_ResetPWMBKF(T16N_TypeDef* T16Nx);
|
||||
void T16Nx_SetCNT(T16N_TypeDef* T16Nx,uint16_t Value);
|
||||
void T16Nx_SetPRECNT(T16N_TypeDef* T16Nx,uint8_t Value);
|
||||
void T16Nx_SetPREMAT(T16N_TypeDef* T16Nx,uint8_t Value);
|
||||
void T16Nx_SetMAT0(T16N_TypeDef* T16Nx,uint16_t Value);
|
||||
void T16Nx_SetMAT1(T16N_TypeDef* T16Nx,uint16_t Value);
|
||||
void T16Nx_SetMAT2(T16N_TypeDef* T16Nx,uint16_t Value);
|
||||
void T16Nx_SetMAT3(T16N_TypeDef* T16Nx,uint16_t Value);
|
||||
uint16_t T16Nx_GetMAT0(T16N_TypeDef* T16Nx);
|
||||
uint16_t T16Nx_GetMAT1(T16N_TypeDef* T16Nx);
|
||||
uint16_t T16Nx_GetMAT2(T16N_TypeDef* T16Nx);
|
||||
uint16_t T16Nx_GetMAT3(T16N_TypeDef* T16Nx);
|
||||
uint16_t T16Nx_GetCNT(T16N_TypeDef* T16Nx);
|
||||
uint8_t T16Nx_GetPRECNT(T16N_TypeDef* T16Nx);
|
||||
FlagStatus T16Nx_GetFlagStatus(T16N_TypeDef* T16Nx,TIM_TYPE_IF TIM_Flag);
|
||||
ITStatus T16Nx_GetITStatus(T16N_TypeDef* T16Nx,TIM_TYPE_IT TIM_Flag);
|
||||
void T16Nx_ClearIFPendingBit(T16N_TypeDef* T16Nx,TIM_TYPE_IF TIM_Flag);
|
||||
/************************************T32模块函数声明********************************************************/
|
||||
void T32Nx_BaseInit(T32N_TypeDef* T32Nx,TIM_BaseInitStruType* TIM_BaseInitStruct);
|
||||
void T32Nx_CapInit(T32N_TypeDef* T32Nx,TIM_CapInitStruType* TIM_CapInitStruct);
|
||||
void T32Nx_MAT0ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_MATCON Type);
|
||||
void T32Nx_MAT1ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_MATCON Type);
|
||||
void T32Nx_MAT2ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_MATCON Type);
|
||||
void T32Nx_MAT3ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_MATCON Type);
|
||||
void T32Nx_MAT0Out0Config(T32N_TypeDef* T32Nx,TIM_TYPE_MATOUT Type);
|
||||
void T32Nx_MAT1Out0Config(T32N_TypeDef* T32Nx,TIM_TYPE_MATOUT Type);
|
||||
void T32Nx_MAT2Out1Config(T32N_TypeDef* T32Nx,TIM_TYPE_MATOUT Type);
|
||||
void T32Nx_MAT3Out1Config(T32N_TypeDef* T32Nx,TIM_TYPE_MATOUT Type);
|
||||
void T32Nx_ITConfig(T32N_TypeDef* T32Nx,TIM_TYPE_IT Type,TYPE_FUNCEN NewState);
|
||||
void T32Nx_SetCNT(T32N_TypeDef* T16Nx,uint32_t Value);
|
||||
void T32Nx_SetPRECNT(T32N_TypeDef* T32Nx,uint8_t Value);
|
||||
void T32Nx_SetPREMAT(T32N_TypeDef* T32Nx,uint8_t Value);
|
||||
void T32Nx_SetMAT0(T32N_TypeDef* T32Nx,uint32_t Value);
|
||||
void T32Nx_SetMAT1(T32N_TypeDef* T32Nx,uint32_t Value);
|
||||
void T32Nx_SetMAT2(T32N_TypeDef* T32Nx,uint32_t Value);
|
||||
void T32Nx_SetMAT3(T32N_TypeDef* T32Nx,uint32_t Value);
|
||||
uint32_t T32Nx_GetMAT0(T32N_TypeDef* T32Nx);
|
||||
uint32_t T32Nx_GetMAT1(T32N_TypeDef* T32Nx);
|
||||
uint32_t T32Nx_GetMAT2(T32N_TypeDef* T32Nx);
|
||||
uint32_t T32Nx_GetMAT3(T32N_TypeDef* T32Nx);
|
||||
uint32_t T32Nx_GetCNT(T32N_TypeDef* T32Nx);
|
||||
uint8_t T32Nx_GetPRECNT(T32N_TypeDef* T32Nx);
|
||||
FlagStatus T32Nx_GetFlagStatus(T32N_TypeDef* T32Nx,TIM_TYPE_IF TIM_Flag);
|
||||
ITStatus T32Nx_GetITStatus(T32N_TypeDef* T32Nx,TIM_TYPE_IT TIM_Flag);
|
||||
void T32Nx_ClearIFPendingBit(T32N_TypeDef* T32Nx,TIM_TYPE_IF TIM_Flag);
|
||||
|
||||
#endif
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,171 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名: lib_uart.h
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: UART模块库函数头文件
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBUART_H__
|
||||
#define __LIBUART_H__
|
||||
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
#include "system_ES8P508x.h"
|
||||
|
||||
/* 发送帧停止位选择 */
|
||||
typedef enum
|
||||
{
|
||||
UART_StopBits_1 = 0x0 , //发送帧停止位:1位
|
||||
UART_StopBits_2 = 0x1 , //发送帧停止位:2位
|
||||
}UART_TYPE_TXFS;
|
||||
|
||||
/* 数据格式 */
|
||||
typedef enum
|
||||
{
|
||||
UART_DataMode_7 = 0x0 , //数据格式:7位数据
|
||||
UART_DataMode_8 = 0x1 , //数据格式:8位数据
|
||||
UART_DataMode_9 = 0x2 , //数据格式:9位数据
|
||||
UART_DataMode_7Odd = 0x4 , //数据格式:7位数据+奇校验
|
||||
UART_DataMode_7Even = 0x5 , //数据格式:7位数据+偶校验
|
||||
UART_DataMode_8Odd = 0x6 , //数据格式:8位数据+奇校验
|
||||
UART_DataMode_8Even = 0x7 , //数据格式:8位数据+偶校验
|
||||
}UART_TYPE_DATAMOD;
|
||||
|
||||
/* 端口极性 */
|
||||
typedef enum
|
||||
{
|
||||
UART_Polar_Normal = 0x0 , //发送端口极性:正常
|
||||
UART_Polar_Opposite = 0x1 , //发送端口极性:反向
|
||||
}UART_TYPE_RTXP;
|
||||
|
||||
/* 波特率发生器时钟选择 */
|
||||
typedef enum
|
||||
{
|
||||
UART_Clock_1 = 0x1 , //波特率发生器时钟:PCLK
|
||||
UART_Clock_2 = 0x2 , //波特率发生器时钟:PCLK/2
|
||||
UART_Clock_4 = 0x3 , //波特率发生器时钟:PCLK/4
|
||||
UART_Clock_8 = 0x4 , //波特率发生器时钟:PCLK/8
|
||||
|
||||
}UART_TYPE_BCS;
|
||||
|
||||
/* UART初始化配置结构体定义 */
|
||||
typedef struct
|
||||
{
|
||||
UART_TYPE_TXFS UART_StopBits; //发送帧停止位选择
|
||||
UART_TYPE_DATAMOD UART_TxMode; //发送数据帧格式
|
||||
UART_TYPE_RTXP UART_TxPolar; //发送端口极性
|
||||
UART_TYPE_DATAMOD UART_RxMode; //接收数据帧格式
|
||||
UART_TYPE_RTXP UART_RxPolar; //接收端口极性
|
||||
uint32_t UART_BaudRate; //传输波特率
|
||||
UART_TYPE_BCS UART_ClockSet; //波特率发生器时钟选择
|
||||
}UART_InitStruType;
|
||||
|
||||
/* 中断选择 */
|
||||
typedef enum
|
||||
{
|
||||
UART_IT_TB = 0x0001 ,
|
||||
UART_IT_RB = 0x0002 ,
|
||||
UART_IT_RO = 0x0004 ,
|
||||
UART_IT_FE = 0x0008 ,
|
||||
UART_IT_PE = 0x0010 ,
|
||||
UART_IT_TBWE = 0x0020 ,
|
||||
UART_IT_TXIDLE = 0x1000 ,
|
||||
UART_IT_RXIDLE = 0x2000 ,
|
||||
}UART_TYPE_IT;
|
||||
|
||||
/* 标志位 */
|
||||
typedef enum
|
||||
{
|
||||
UART_FLAG_TB = 0x0001 ,
|
||||
UART_FLAG_RB = 0x0002 ,
|
||||
UART_FLAG_RO = 0x0004 ,
|
||||
UART_FLAG_FE = 0x0008 ,
|
||||
UART_FLAG_PE = 0x0010 ,
|
||||
UART_FLAG_TBWE = 0x0020 ,
|
||||
UART_FLAG_TXIDLE = 0x1000 ,
|
||||
UART_FLAG_RXIDLE = 0x2000 ,
|
||||
}UART_TYPE_FLAG;
|
||||
|
||||
/* 清除中断标志位 */
|
||||
typedef enum
|
||||
{
|
||||
UART_Clr_RO = 0x0004 ,
|
||||
UART_Clr_FE = 0x0008 ,
|
||||
UART_Clr_PE = 0x0010 ,
|
||||
UART_Clr_TBWE = 0x0020 ,
|
||||
}UART_CLR_IF;
|
||||
|
||||
/* 发送、接收中断模式 */
|
||||
typedef enum
|
||||
{
|
||||
UART_TRBIM_Byte = 0x0 , //中断:字节
|
||||
UART_TRBIM_HalfWord = 0x1 , //中断:半字
|
||||
UART_TRBIM_Word = 0x2 , //中断:字
|
||||
}UART_TYPE_TRBIM;
|
||||
|
||||
/*************UART模块宏定义************/
|
||||
/* 发送使能控制 */
|
||||
#define UART0_TxEnable() (UART0->CON.TXEN = 1)
|
||||
#define UART1_TxEnable() (UART1->CON.TXEN = 1)
|
||||
#define UART2_TxEnable() (UART2->CON.TXEN = 1)
|
||||
#define UART3_TxEnable() (UART3->CON.TXEN = 1)
|
||||
#define UART4_TxEnable() (UART4->CON.TXEN = 1)
|
||||
#define UART5_TxEnable() (UART5->CON.TXEN = 1)
|
||||
#define UART0_TxDisable() (UART0->CON.TXEN = 0)
|
||||
#define UART1_TxDisable() (UART1->CON.TXEN = 0)
|
||||
#define UART2_TxDisable() (UART2->CON.TXEN = 0)
|
||||
#define UART3_TxDisable() (UART3->CON.TXEN = 0)
|
||||
#define UART4_TxDisable() (UART4->CON.TXEN = 0)
|
||||
#define UART5_TxDisable() (UART5->CON.TXEN = 0)
|
||||
|
||||
/* 接收使能控制 */
|
||||
#define UART0_RxEnable() (UART0->CON.RXEN = 1)
|
||||
#define UART1_RxEnable() (UART1->CON.RXEN = 1)
|
||||
#define UART2_RxEnable() (UART2->CON.RXEN = 1)
|
||||
#define UART3_RxEnable() (UART3->CON.RXEN = 1)
|
||||
#define UART4_RxEnable() (UART4->CON.RXEN = 1)
|
||||
#define UART5_RxEnable() (UART5->CON.RXEN = 1)
|
||||
#define UART0_RxDisable() (UART0->CON.RXEN = 0)
|
||||
#define UART1_RxDisable() (UART1->CON.RXEN = 0)
|
||||
#define UART2_RxDisable() (UART2->CON.RXEN = 0)
|
||||
#define UART3_RxDisable() (UART3->CON.RXEN = 0)
|
||||
#define UART4_RxDisable() (UART4->CON.RXEN = 0)
|
||||
#define UART5_RxDisable() (UART5->CON.RXEN = 0)
|
||||
|
||||
/* 发送器复位 */
|
||||
#define UART0_TxRst() (UART0->CON.TRST = 1)
|
||||
#define UART1_TxRst() (UART1->CON.TRST = 1)
|
||||
#define UART2_TxRst() (UART2->CON.TRST = 1)
|
||||
#define UART3_TxRst() (UART3->CON.TRST = 1)
|
||||
#define UART4_TxRst() (UART4->CON.TRST = 1)
|
||||
#define UART5_TxRst() (UART5->CON.TRST = 1)
|
||||
|
||||
/* 接收器复位 */
|
||||
#define UART0_RxRst() (UART0->CON.RRST = 1)
|
||||
#define UART1_RxRst() (UART1->CON.RRST = 1)
|
||||
#define UART2_RxRst() (UART2->CON.RRST = 1)
|
||||
#define UART3_RxRst() (UART3->CON.RRST = 1)
|
||||
#define UART4_RxRst() (UART4->CON.RRST = 1)
|
||||
#define UART5_RxRst() (UART5->CON.RRST = 1)
|
||||
|
||||
/************UART模块函数声明***********/
|
||||
void UART_Init(UART_TypeDef* UARTx,UART_InitStruType* UART_InitStruct);
|
||||
void UART_ITConfig(UART_TypeDef* UARTx,UART_TYPE_IT UART_IT,TYPE_FUNCEN NewState);
|
||||
void UART_TBIMConfig(UART_TypeDef* UARTx,UART_TYPE_TRBIM Type);
|
||||
void UART_RBIMConfig(UART_TypeDef* UARTx,UART_TYPE_TRBIM Type);
|
||||
void UART_SendByte(UART_TypeDef* UARTx,uint8_t Temp08);
|
||||
void UART_SendHalfWord(UART_TypeDef* UARTx,uint16_t Temp16);
|
||||
void UART_SendWord(UART_TypeDef* UARTx,uint32_t Temp32);
|
||||
uint8_t UART_RecByte(UART_TypeDef* UARTx);
|
||||
uint16_t UART_RecHalfWord(UART_TypeDef* UARTx);
|
||||
uint32_t UART_RecWord(UART_TypeDef* UARTx);
|
||||
FlagStatus UART_GetFlagStatus(UART_TypeDef* UARTx,UART_TYPE_FLAG UART_Flag);
|
||||
ITStatus UART_GetITStatus(UART_TypeDef* UARTx,UART_TYPE_IT UART_Flag);
|
||||
void UART_ClearITPendingBit(UART_TypeDef* UARTx,UART_CLR_IF UART_Flag);
|
||||
|
||||
#endif
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
@@ -0,0 +1,100 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
|
||||
*文件名: lib_wdt.c
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/02/04
|
||||
*描 述: 看门狗模块库函数
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#ifndef __LIBWDT_H__
|
||||
#define __LIBWDT_H__
|
||||
|
||||
#include "system_ES8P508x.h"
|
||||
#include "ES8P508x.h"
|
||||
#include "type.h"
|
||||
|
||||
/* WDT时钟选择 */
|
||||
typedef enum
|
||||
{
|
||||
WDT_CLOCK_PCLK = 0x0, //PCLK
|
||||
WDT_CLOCK_WDT = 0x1, //WDT时钟源,32kHz
|
||||
} WDT_TYPE_CLKS;
|
||||
|
||||
/* 初始化结构体 */
|
||||
typedef struct
|
||||
{
|
||||
uint32_t WDT_Tms; //定时时间,单位ms
|
||||
TYPE_FUNCEN WDT_IE; //中断使能
|
||||
TYPE_FUNCEN WDT_Rst; //复位使能
|
||||
WDT_TYPE_CLKS WDT_Clock;//时钟选择
|
||||
} IWDT_InitStruType;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
WDT_WIN_25 = 0x0, //25%窗口内禁止喂狗,窗口内喂狗产生复位
|
||||
WDT_WIN_50 = 0x1, //50%窗口内禁止喂狗,窗口内喂狗产生复位
|
||||
WDT_WIN_75 = 0x2, //75%窗口内禁止喂狗,窗口内喂狗产生复位
|
||||
WDT_WIN_100 = 0x3, //不禁止喂狗,喂狗将使看门狗计数器重载
|
||||
} WDT_TYPE_WIN;
|
||||
|
||||
/* 初始化结构体 */
|
||||
typedef struct
|
||||
{
|
||||
uint32_t WDT_Tms; //定时时间,单位ms
|
||||
TYPE_FUNCEN WDT_IE; //中断使能
|
||||
TYPE_FUNCEN WDT_Rst; //复位使能
|
||||
WDT_TYPE_CLKS WDT_Clock;//时钟选择
|
||||
WDT_TYPE_WIN WDT_Win; //禁止喂狗窗口
|
||||
} WWDT_InitStruType;
|
||||
|
||||
#define IWDT_RegUnLock() (IWDT->LOCK.Word = 0x1ACCE551)
|
||||
#define IWDT_RegLock() (IWDT->LOCK.Word = 0x0)
|
||||
|
||||
#define IWDT_Enable() {IWDT_RegUnLock();IWDT->CON.EN = 1;IWDT_RegLock();}
|
||||
#define IWDT_Disable() {IWDT_RegUnLock();IWDT->CON.EN = 0;IWDT_RegLock();}
|
||||
|
||||
#define IWDT_Clear() {IWDT_RegUnLock();IWDT->INTCLR.INTCLR = 0;IWDT_RegLock();}
|
||||
|
||||
#define IWDT_ITEnable() {IWDT_RegUnLock();IWDT->CON.IE = 1;IWDT_RegLock();}
|
||||
#define IWDT_ITDisable() {IWDT_RegUnLock();IWDT->CON.IE = 0;IWDT_RegLock();}
|
||||
|
||||
#define IWDT_RstEnable() {IWDT_RegUnLock();IWDT->CON.RSTEN = 1;IWDT_RegLock();}
|
||||
#define IWDT_RstDisable() {IWDT_RegUnLock();IWDT->CON.RSTEN = 0;IWDT_RegLock();}
|
||||
|
||||
#define IWDT_CLOCK_PCLK() {IWDT_RegUnLock();IWDT->CON.CLKS = 0;IWDT_RegLock();}
|
||||
#define IWDT_CLOCK_WDT() {IWDT_RegUnLock();IWDT->CON.CLKS = 1;IWDT_RegLock();}
|
||||
|
||||
#define WWDT_RegUnLock() (WWDT->LOCK.Word = 0x1ACCE551)
|
||||
#define WWDT_RegLock() (WWDT->LOCK.Word = 0x0)
|
||||
|
||||
#define WWDT_Enable() {WWDT_RegUnLock();WWDT->CON.EN = 1;WWDT_RegLock();}
|
||||
#define WWDT_Disable() {WWDT_RegUnLock();WWDT->CON.EN = 0;WWDT_RegLock();}
|
||||
|
||||
#define WWDT_Clear() {WWDT_RegUnLock();WWDT->INTCLR.INTCLR = 0;WWDT_RegLock();}
|
||||
|
||||
#define WWDT_ITEnable() {WWDT_RegUnLock();WWDT->CON.IE = 1;WWDT_RegLock();}
|
||||
#define WWDT_ITDisable() {WWDT_RegUnLock();WWDT->CON.IE = 0;WWDT_RegLock();}
|
||||
|
||||
#define WWDT_RstEnable() {WWDT_RegUnLock();WWDT->CON.RSTEN = 1;WWDT_RegLock();}
|
||||
#define WWDT_RstDisable() {WWDT_RegUnLock();WWDT->CON.RSTEN = 0;WWDT_RegLock();}
|
||||
|
||||
#define WWDT_CLOCK_PCLK() {WWDT_RegUnLock();WWDT->CON.CLKS = 0;WWDT_RegLock();}
|
||||
#define WWDT_CLOCK_WDT() {WWDT_RegUnLock();WWDT->CON.CLKS = 1;WWDT_RegLock();}
|
||||
|
||||
void IWDT_Init(IWDT_InitStruType *IWDT_InitStruct);
|
||||
void IWDT_SetReloadValue(uint32_t Value);
|
||||
uint32_t IWDT_GetValue(void);
|
||||
FlagStatus IWDT_GetFlagStatus(void);
|
||||
FlagStatus IWDT_GetITStatus(void);
|
||||
void WWDT_Init(WWDT_InitStruType *WDT_InitStruct);
|
||||
void WWDT_SetReloadValue(uint32_t Value);
|
||||
uint32_t WWDT_GetValue(void);
|
||||
FlagStatus WWDT_GetFlagStatus(void);
|
||||
FlagStatus WWDT_GetITStatus(void);
|
||||
|
||||
#endif
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
/*********************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名: type.h
|
||||
*作 者: Liut
|
||||
*版 本: V1.01
|
||||
*日 期: 2017/11/01
|
||||
*描 述: type define
|
||||
*备 注: 适用于HRSDK-GDB-8P508x
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
**********************************************************/
|
||||
#ifndef __TYPE_H__
|
||||
#define __TYPE_H__
|
||||
|
||||
typedef enum {DISABLE = 0, ENABLE = !DISABLE} TYPE_FUNCEN,FuncState,TYPE_PINTIE,TYPE_PINTMASK,TYPE_BUZZEN;
|
||||
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus, PinStatus;
|
||||
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,27 @@
|
||||
#include "irqhandler.h"
|
||||
|
||||
void NMI_IRQHandler(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void HardFault_IRQHandler(void)
|
||||
{
|
||||
while(1)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
void SVC_IRQHandler(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void PendSV_IRQHandler(void)
|
||||
{
|
||||
|
||||
}
|
||||
void SysTick_Handler(void)
|
||||
{
|
||||
systick_irq_cbk();
|
||||
}
|
||||
@@ -0,0 +1,301 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
|
||||
*文件名: lib_timer.c
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: ADC模块库函数
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#include "lib_adc.h"
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_Init
|
||||
描 述:初始化ADC模块
|
||||
输入值:初始化配置结构体地址
|
||||
输出值:无
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void ADC_Init(ADC_InitStruType * ADC_InitStruct)
|
||||
{
|
||||
ADC->VREFCON.VREF_EN = ENABLE; //内部VREFP使能
|
||||
ADC->VREFCON.IREF_EN = ENABLE; //IREF使能位
|
||||
ADC->CON1.VCMBUF_EN = ENABLE; //ADC共模电压VCM BUF使能
|
||||
ADC ->CON1.VCMBUF_HS = ENABLE; //ADC共模电压VCM BUF高速模式使能
|
||||
ADC->CON1.HSEN = ENABLE; //ADC转换速度:高速
|
||||
ADC->CHS.VDD5_FLAG_EN = DISABLE; //屏蔽VDD检测控制
|
||||
|
||||
ADC->CON1.CLKS = ADC_InitStruct->ADC_ClkS; //ADCCON1:bit3 ADC时钟源选择
|
||||
ADC->CON1.CLKDIV = ADC_InitStruct->ADC_ClkDiv; //ADCCON1:bit2-0 ADC时钟源预分频
|
||||
ADC->CON1.VREFP = ADC_InitStruct->ADC_VrefP; //ADCCON1:bit9-8 ADC正向参考电压选择
|
||||
ADC->CON1.SMPS = ADC_InitStruct->ADC_SampS; //ADCCON1:bit12 ADC采样模式选择
|
||||
ADC->CHS.CHS = ADC_InitStruct->ADC_ChS; //ADCCHS:bit0-3 ADC模拟通道选择
|
||||
ADC->CON1.ST = ADC_InitStruct->ST; //ADCCON1:bit20-16 ADC采样时间选择 ST*2+1个Tadclk
|
||||
//ADC->VREFCON.VREF_SEL=ADC_InitStruct->VREF_SEL;//内部参考电压选择
|
||||
|
||||
ADC->CON1.VREFN = ADC_InitStruct->ADC_VREFN; //负向参考电压使能位
|
||||
ADC->CON1.VRBUF_EN = ADC_InitStruct->ADC_VRBUF_EN; //VREF BUF使能位
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_Set_CH
|
||||
描 述:选择ADC模拟通道
|
||||
输入值:通道
|
||||
输出值:无
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void ADC_Set_CH(ADC_TYPE_CHS AdcCH)
|
||||
{
|
||||
ADC->CHS.CHS = AdcCH;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_GetConvValue
|
||||
描 述:获取ADC转换结果
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:转换值
|
||||
***************************************************************/
|
||||
uint16_t ADC_GetConvValue(void)
|
||||
{
|
||||
return ((uint16_t)ADC->DR.DR);
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_GetConvStatus
|
||||
描 述:获取ADC转换状态
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:RESET(完成)/SET(正在转换)
|
||||
***************************************************************/
|
||||
FlagStatus ADC_GetConvStatus(void)
|
||||
{
|
||||
FlagStatus bitstatus = RESET;
|
||||
|
||||
/* 检测转换状态寄存器 */
|
||||
if ((ADC->CON0.TRIG != (uint32_t)RESET))
|
||||
bitstatus = SET; //正在转换
|
||||
else
|
||||
bitstatus = RESET; //转换完成
|
||||
|
||||
return bitstatus;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_ACPConfig
|
||||
描 述:ADC 自动比较功能初始化
|
||||
输入值:ADC_ACP_InitStruct 自动比较功能初始化结构体
|
||||
输出值:无
|
||||
返回值:SUCCESS 成功
|
||||
ERROR 失败
|
||||
***************************************************************/
|
||||
ErrorStatus ADC_ACPConfig(ADC_ACP_TypeDef *ADC_ACP_InitStruct)
|
||||
{
|
||||
if(ADC_ACP_InitStruct->ACPC_OVER_TIME > ADC_ACPC_OVFL_TIME_MAX
|
||||
||ADC_ACP_InitStruct->ACPC_TIMES > ADC_ACPC_TIMES_MAX
|
||||
||ADC_ACP_InitStruct->ACPC_MIN_TARGET > ADC_ACP_MIN_MAX
|
||||
||ADC_ACP_InitStruct->ACPC_MAX_TARGET > ADC_ACP_MAX_MAX)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
if(ADC_ACP_InitStruct->ACP_EN == ENABLE)
|
||||
{
|
||||
if(ADC->CON1.CLKS == ADC_ClkS_PCLK)
|
||||
{
|
||||
ADC->ACPC.CLKS = ADC_ACPC_CLKS_PCLK;
|
||||
}
|
||||
else
|
||||
{
|
||||
ADC->ACPC.CLKS = ADC_ACPC_CLKS_LRC;
|
||||
}
|
||||
|
||||
ADC->ACPC.OVFL_TIME = ADC_ACP_InitStruct ->ACPC_OVER_TIME;
|
||||
ADC->ACPC.TIMES = ADC_ACP_InitStruct->ACPC_TIMES;
|
||||
ADC->IE.ACPOVIE = ENABLE;
|
||||
|
||||
/* 假设用户将高阀值设置成0(最小值),我们可以认为其想关闭该功能 */
|
||||
if(ADC_ACP_InitStruct ->ACPC_MAX_TARGET ==0x0)
|
||||
{
|
||||
ADC->IE.ACPMAXIE = DISABLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
ADC->ACPCMP.CMP_MAX =ADC_ACP_InitStruct ->ACPC_MAX_TARGET;
|
||||
ADC->IE.ACPMAXIE = ENABLE;
|
||||
}
|
||||
|
||||
/* 假设用户将低阀值设置成0xfff(最大值),我们可以认为其想关闭该功能 */
|
||||
if(ADC_ACP_InitStruct ->ACPC_MIN_TARGET == 0xfff)
|
||||
{
|
||||
ADC->IE.ACPMINIE = DISABLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
ADC->ACPCMP.CMP_MIN =ADC_ACP_InitStruct ->ACPC_MIN_TARGET;
|
||||
ADC->IE.ACPMINIE = ENABLE;
|
||||
}
|
||||
|
||||
ADC->CON0.ACP_EN = ENABLE;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
ADC->CON0.ACP_EN = DISABLE;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_SampStart
|
||||
描 述:ADC 采样软件控制-启动函数
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:SUCCESS 成功
|
||||
ERROR 失败
|
||||
***************************************************************/
|
||||
ErrorStatus ADC_SoftStart(void)
|
||||
{
|
||||
if(ADC->CON1.SMPS == ADC_SMPS_HARD)
|
||||
return ERROR;
|
||||
|
||||
ADC ->CON1.SMPON = SET;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_SampStop
|
||||
描 述:ADC 采样软件控制-停止函数
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:SUCCESS 成功
|
||||
ERROR 失败
|
||||
***************************************************************/
|
||||
ErrorStatus ADC_SoftStop(void)
|
||||
{
|
||||
if(ADC->CON1.SMPS == ADC_SMPS_HARD)
|
||||
return ERROR;
|
||||
|
||||
ADC->CON1.SMPON = RESET;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_GetACPMeanValue
|
||||
描 述:ADC 获得单次自动比较平均值
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:采样数据
|
||||
***************************************************************/
|
||||
uint16_t ADC_GetACPMeanValue(void)
|
||||
{
|
||||
return ((uint16_t)ADC->ACPMEAN.MEAN_DATA);
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_GetACPMINValue
|
||||
描 述:ADC 获得单次自动比较平均值
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:采样数据
|
||||
***************************************************************/
|
||||
uint16_t ADC_GetACPMinValue(void)
|
||||
{
|
||||
return ((uint16_t)ADC->ACPCMP.CMP_MIN);
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_GetACPMAXValue
|
||||
描 述:ADC 获得单次自动比较平均值
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:采样数据
|
||||
***************************************************************/
|
||||
uint16_t ADC_GetACPMaxValue(void)
|
||||
{
|
||||
return ((uint16_t)ADC->ACPCMP.CMP_MAX);
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_GetFlagStatus
|
||||
描 述:读取ADC标志位状态
|
||||
输入值:IFName:ADC中断标志
|
||||
输出值:无
|
||||
返回值:SET/RESET
|
||||
***************************************************************/
|
||||
FlagStatus ADC_GetFlagStatus(ADC_TYPE_IF IFName)
|
||||
{
|
||||
FlagStatus bitstatus = RESET;
|
||||
|
||||
/* 检查中断标志位 */
|
||||
if (((ADC->IF.Word & IFName) != (uint32_t)RESET))
|
||||
bitstatus = SET; //转换完成
|
||||
else
|
||||
bitstatus = RESET; //无中断
|
||||
|
||||
return bitstatus;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_GetITStatus
|
||||
描 述:读取ADC中断状态,未使能相应中断时不会返回SET
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:SET(中断)/RESET(无中断)
|
||||
***************************************************************/
|
||||
ITStatus ADC_GetITStatus(ADC_TYPE_IE IEName)
|
||||
{
|
||||
ITStatus bitstatus = RESET;
|
||||
|
||||
/* 检查中断标志位 */
|
||||
if (((ADC->IE.Word & IEName) != (uint32_t)RESET))
|
||||
bitstatus = SET; //转换完成,进中断
|
||||
else
|
||||
bitstatus = RESET; //无中断
|
||||
|
||||
return bitstatus;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:ADC_ClearIFStatus
|
||||
描 述:ADC 清除特定类型中断
|
||||
输入值:IFName 中断类型选择
|
||||
ADC_IF ADC中断
|
||||
ADC_IF_ACPMIN 自动转换低阀值超出中断
|
||||
ADC_IF_ACPMAX 自动转换高阀值超出中断
|
||||
ADC_IF_ACPOVER 自动转换溢出中断
|
||||
输出值:无
|
||||
返回值:SUCCESS 成功
|
||||
ERROR 失败
|
||||
***************************************************************/
|
||||
ErrorStatus ADC_ClearIFStatus(ADC_TYPE_IF IFName)
|
||||
{
|
||||
ADC->IF.Word = (uint32_t)IFName;
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/***************************************************************
|
||||
函数名:ADC_Reset
|
||||
描 述:ADC复位
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void ADC_Reset(void)
|
||||
{
|
||||
ADC->CON0.Word = 0x00000030;
|
||||
ADC->CON1.Word = 0x00041000;
|
||||
ADC->CHS.Word = 0x00000100;
|
||||
ADC->IE.Word = 0x00000000;
|
||||
ADC->IF.Word = 0x00000000;
|
||||
ADC->ACPC.Word = 0x00000000;
|
||||
ADC->ACPCMP.Word = 0x0FFF0000;
|
||||
ADC->VREFCON.Word = 0x00000000;
|
||||
}
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
|
||||
|
||||
@@ -0,0 +1,222 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名:
|
||||
*作 者: AE
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述:
|
||||
*备 注: 适用于 ES8P508芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#include "lib_aes.h"
|
||||
|
||||
/***************************************************************
|
||||
函数名:AES_Init
|
||||
描 述:AES功能初始化函数
|
||||
输入值:AES_InitStruct 初始化结构体
|
||||
输出值:无
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void AES_Init(AES_InitStruType * AES_InitStruct)
|
||||
{
|
||||
|
||||
|
||||
AES_Reset();
|
||||
|
||||
AES->CON.ENCRYPT = AES_InitStruct->MODE;
|
||||
return;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:AES_WriteKey
|
||||
描 述:AES写入密钥函数
|
||||
输入值:AES_KEY 待写入密钥
|
||||
输出值:无
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void AES_WriteKey(uint32_t *AES_KEY)
|
||||
{
|
||||
uint32_t *address = AES_KEY;
|
||||
|
||||
AES->KEY3.AES_KEY3 = *address;
|
||||
address ++;
|
||||
AES->KEY2.AES_KEY2 = *address;
|
||||
address ++;
|
||||
AES->KEY1.AES_KEY1 = *address;
|
||||
address ++;
|
||||
AES->KEY0.AES_KEY0 = *address;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:AES_ReadKey
|
||||
描 述:AES读出密钥函数
|
||||
输入值:无
|
||||
输出值:AES_DATA读出密钥存放位置
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void AES_ReadKey(uint32_t * AES_KEY)
|
||||
{
|
||||
uint32_t *address = AES_KEY;
|
||||
|
||||
*address = AES->KEY3.AES_KEY3;
|
||||
address ++;
|
||||
*address = AES->KEY2.AES_KEY2;
|
||||
address ++;
|
||||
*address = AES->KEY1.AES_KEY1;
|
||||
address ++;
|
||||
*address = AES->KEY0.AES_KEY0;
|
||||
return;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:AES_WriteData
|
||||
描 述:AES写入数据函数
|
||||
输入值:AES_DATA 待写入数据
|
||||
输出值:无
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void AES_WriteData(uint32_t *AES_DATA)
|
||||
{
|
||||
uint32_t *address = AES_DATA;
|
||||
|
||||
AES->DATA3.AES_DATA3 = *address;
|
||||
address ++;
|
||||
AES->DATA2.AES_DATA2 = *address;
|
||||
address ++;
|
||||
AES->DATA1.AES_DATA1 = *address;
|
||||
address ++;
|
||||
AES->DATA0.AES_DATA0 = *address;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:AES_WriteData
|
||||
描 述:AES读出数据函数
|
||||
输入值:无
|
||||
输出值:AES_DATA读出数据存放位置
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void AES_ReadData(uint32_t * AES_DATA)
|
||||
{
|
||||
uint32_t *address = AES_DATA;
|
||||
|
||||
*address = AES->DATA3.AES_DATA3;
|
||||
address ++;
|
||||
*address = AES->DATA2.AES_DATA2;
|
||||
address ++;
|
||||
*address = AES->DATA1.AES_DATA1;
|
||||
address ++;
|
||||
*address = AES->DATA0.AES_DATA0;
|
||||
return;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:AES_ITConfig
|
||||
描 述:AES中断使能
|
||||
输入值:AES_IE
|
||||
NewState Enable/Disable
|
||||
输出值:无
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void AES_ITConfig(AES_TYPE_IT AES_IE, TYPE_FUNCEN NewState)
|
||||
{
|
||||
uint32_t Word = AES->CON.Word&0xffffff8e;
|
||||
|
||||
if(AES->CON.GO_DONE == 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (NewState == ENABLE)
|
||||
Word |= (uint32_t)AES_IE;
|
||||
else
|
||||
|
||||
Word &= ~(uint32_t)AES_IE;
|
||||
|
||||
AES->CON.Word = Word;
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:AES_GetFlagStatus
|
||||
描 述:AES获得特定中断标志函数
|
||||
输入值:IFName
|
||||
AES_IF_IF 加解密完成中断
|
||||
输出值:无
|
||||
返回值:中断标志与否
|
||||
***************************************************************/
|
||||
FlagStatus AES_GetFlagStatus(AES_TYPE_IF IFName)
|
||||
{
|
||||
|
||||
if(AES->CON.Word & IFName) {
|
||||
return SET;
|
||||
}
|
||||
return RESET;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:AES_ClearITPendingBit
|
||||
描 述:AES清除特定中断标志函数
|
||||
输入值:IFName
|
||||
AES_IF_DONE 加解密完成中断
|
||||
输出值:无
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void AES_ClearITPendingBit(void)
|
||||
{
|
||||
/* 考虑到IF与GO_DONE在同一个word中,对IF赋值可能会存在一些问题
|
||||
* 例如GO_DONE是1时,取值,随后GO_DONE变成0,而赋值会以原来的1再对其进行赋值
|
||||
* 该部分需要进行测试
|
||||
*/
|
||||
|
||||
if(AES->CON.GO_DONE == SET)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AES->CON.IF = SET;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:AES_GetDoneStatus
|
||||
描 述:AES获得是否加/解密完成
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:AES_DONE_NO 加密未完成
|
||||
AES_DONE_YES 未加密或者加密已经完成
|
||||
***************************************************************/
|
||||
AES_TYPE_DONE AES_GetDoneStatus(void)
|
||||
{
|
||||
if(AES->CON.GO_DONE == 1)
|
||||
{
|
||||
return AES_DONE_NO;
|
||||
}
|
||||
|
||||
return AES_DONE_YES;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:AES_Reset
|
||||
描 述:AES复位
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:无
|
||||
***************************************************************/
|
||||
void AES_Reset(void)
|
||||
{
|
||||
AES->DATA0.Word = 0x00000000;
|
||||
AES->DATA1.Word = 0x00000000;
|
||||
AES->DATA2.Word = 0x00000000;
|
||||
AES->DATA3.Word = 0x00000000;
|
||||
|
||||
AES->KEY0.Word = 0x00000000;
|
||||
AES->KEY1.Word = 0x00000000;
|
||||
AES->KEY2.Word = 0x00000000;
|
||||
AES->KEY3.Word = 0x00000000;
|
||||
|
||||
AES->CON.Word = 0x00000000;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名:
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述:
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#include "lib_crc.h"
|
||||
|
||||
/***************************************************************
|
||||
函数名:CRC_getTypeValue
|
||||
描 述:配置并返回一个CRC_CON配置参数
|
||||
输入值:con_value CRC_CON 数据配置值结构体
|
||||
返回值:CRC_CON配置值
|
||||
***************************************************************/
|
||||
uint32_t CRC_getTypeValue(CRC_CONValueStruType con_value)
|
||||
{
|
||||
uint32_t type =0;
|
||||
type = (con_value.xorout | con_value.refout | con_value.refin |\
|
||||
con_value.mode|con_value.hs_type|con_value.init_data_type);
|
||||
return type;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:CRC_EmptayCheck
|
||||
描 述:查空函数
|
||||
输入值:address: 查空区域首地址, data_len:查空区域字节长度
|
||||
返回值:1:成功,0 :失败
|
||||
***************************************************************/
|
||||
uint32_t CRC_EmptayCheck(void* address, uint32_t data_len)
|
||||
{
|
||||
CRC_EM CRC_EmptayCheck = (CRC_EM)(*(uint32_t *)CRC_EmptayCheck_addr);
|
||||
|
||||
uint32_t result;
|
||||
__ASM("CPSID i");
|
||||
result = (*CRC_EmptayCheck)(address, data_len);
|
||||
__ASM("CPSIE i");
|
||||
return result;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:CRC_FlashVerify
|
||||
描 述:FLASH校验函数
|
||||
输入值:address: 校验区域首地址, data_len:校验区域字节长度, type:校验方式配置
|
||||
返回值:CRC校验码
|
||||
***************************************************************/
|
||||
uint32_t CRC_FlashVerify(void* address, uint32_t data_len, uint32_t type)
|
||||
{
|
||||
CRC_FL CRC_FlashVerify = (CRC_FL)(*(uint32_t *)CRC_FlashVerify_addr);
|
||||
|
||||
uint32_t result;
|
||||
__ASM("CPSID i");
|
||||
result = (*CRC_FlashVerify)(address, data_len, type);
|
||||
__ASM("CPSIE i");
|
||||
return result;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:CRC_UserCal
|
||||
描 述:用户数据校验函数
|
||||
输入值:address: 用户校验数据首地址, data_len:校验区域字节长度, type:校验方式配置
|
||||
返回值:CRC校验码
|
||||
***************************************************************/
|
||||
uint32_t CRC_UserCal(void* address, uint32_t data_len, uint32_t type)
|
||||
{
|
||||
CRC_US CRC_UserCal = (CRC_US)(*(uint32_t *)CRC_UserCal_addr);
|
||||
|
||||
uint32_t result;
|
||||
__ASM("CPSID i");
|
||||
result = (*CRC_UserCal)(address, data_len, type);
|
||||
__ASM("CPSIE i");
|
||||
return result;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:CRC_CheckReset
|
||||
描 述:CRC复位查询函数
|
||||
输入值:无
|
||||
返回值:复位标志,1:有复位标志,0:无复位标志
|
||||
***************************************************************/
|
||||
uint32_t CRC_CheckReset(void)
|
||||
{
|
||||
CRC_CH CRC_CheckReset = (CRC_CH)(*(uint32_t *)CRC_CheckReset_addr);
|
||||
|
||||
uint32_t result;
|
||||
__ASM("CPSID i");
|
||||
result = (*CRC_CheckReset)();
|
||||
__ASM("CPSIE i");
|
||||
return result;
|
||||
}
|
||||
|
||||
/************************END OF FILE**************************/
|
||||
|
||||
@@ -0,0 +1,355 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
|
||||
*文件名: lib_flashiap.c
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述: flash读写库函数
|
||||
*备 注: 适用于 ES8P508x芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#include "lib_flashiap.h"
|
||||
|
||||
/***************************************************************
|
||||
函数名:FlashIap_Close_WPROT
|
||||
描 述:IAP关闭写保护
|
||||
输入值:Page:0-63,每page对应2K字节,64 为INFO区
|
||||
输出值:无
|
||||
返回值:成功、失败
|
||||
***************************************************************/
|
||||
ErrorStatus FlashIap_Close_WPROT(uint8_t Page)
|
||||
{
|
||||
if(Page > 64)
|
||||
return ERROR;
|
||||
|
||||
if(Page == 64)
|
||||
{
|
||||
IAP->WPROT2.Word = 0x00000000;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
if(Page < 32)
|
||||
{
|
||||
IAP->WPROT0.Word &=~ ((uint32_t)0x1 << Page);
|
||||
}
|
||||
else
|
||||
{
|
||||
Page -= 32;
|
||||
IAP->WPROT1.Word &=~ ((uint32_t)0x1 << Page);
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:FlashIap_Open_WPROT
|
||||
描 述:IAP开启写保护
|
||||
输入值:Page:0-63,每page对应2K字节,,64 为INFO区
|
||||
输出值:无
|
||||
返回值:成功、失败
|
||||
***************************************************************/
|
||||
ErrorStatus FlashIap_Open_WPROT(uint8_t Page)
|
||||
{
|
||||
if(Page > 64)
|
||||
return ERROR;
|
||||
|
||||
if(Page == 64)
|
||||
{
|
||||
IAP->WPROT2.Word = 0x00000001;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
if(Page < 32)
|
||||
{
|
||||
IAP->WPROT0.Word &=~ ((uint32_t)0x1 << Page);
|
||||
IAP->WPROT0.Word |= ((uint32_t)0x1 << Page);
|
||||
}
|
||||
else
|
||||
{
|
||||
Page -= 32;
|
||||
IAP->WPROT1.Word &=~ ((uint32_t)0x1 << Page);
|
||||
IAP->WPROT1.Word |= ((uint32_t)0x1 << Page);
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:FlashIap_CloseAll_WPROT
|
||||
描 述:IAP关闭所有写保护
|
||||
输入值:Page:0-63,每page对应2K字节
|
||||
输出值:无
|
||||
返回值:成功、失败
|
||||
***************************************************************/
|
||||
ErrorStatus FlashIap_CloseAll_WPROT(void)
|
||||
{
|
||||
IAP->WPROT0.Word = 0x00000000;
|
||||
IAP->WPROT1.Word = 0x00000000;
|
||||
IAP->WPROT2.Word = 0x00000000;
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/***************************************************************
|
||||
函数名:FlashIap_OpenAll_WPROT
|
||||
描 述:IAP打开所有写保护
|
||||
输入值:
|
||||
输出值:无
|
||||
返回值:成功、失败
|
||||
***************************************************************/
|
||||
ErrorStatus FlashIap_OpenAll_WPROT(void)
|
||||
{
|
||||
IAP->WPROT0.Word = 0xFFFFFFFF;
|
||||
IAP->WPROT1.Word = 0xFFFFFFFF;
|
||||
IAP->WPROT2.Word = 0xFFFFFFFF;
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:FlashIap_Unlock
|
||||
描 述:IAP解锁与访问请求
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:成功、失败
|
||||
***************************************************************/
|
||||
ErrorStatus FlashIap_Unlock(void)
|
||||
{
|
||||
uint16_t Temp16;
|
||||
|
||||
FlashIAP_RegUnLock(); //解锁 IAP
|
||||
|
||||
FlashIAP_Enable(); //使能IAP
|
||||
|
||||
FlashIAP_REQ(); //访问请求
|
||||
|
||||
for(Temp16 = 0; Temp16 < 0xFFFF; Temp16++) //等待FLASH应答信号
|
||||
{
|
||||
if(IAP->CON.FLASH_ACK != 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if(Temp16 == 0xFFFF)
|
||||
return ERROR;
|
||||
else
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:FlashIap_WriteEnd
|
||||
描 述:IAP写结束
|
||||
输入值:无
|
||||
输出值:无
|
||||
返回值:成功、失败
|
||||
***************************************************************/
|
||||
ErrorStatus FlashIap_WriteEnd(void)
|
||||
{
|
||||
uint32_t Temp32;
|
||||
|
||||
FlashIAP_RegUnLock(); //IAP解锁
|
||||
|
||||
IAP->CON.Word &= 0xFFFFFFEE; //IAP访问FLASH请求(结束)
|
||||
|
||||
for(Temp32 = 0; Temp32 < 0xFFFF; Temp32++) //等待FLASH应答信号(结束)
|
||||
{
|
||||
if(IAP->CON.FLASH_ACK == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if(Temp32 == 0xFFFF)
|
||||
return ERROR;
|
||||
else
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:FlashIap_ErasePage
|
||||
描 述:IAP页擦除
|
||||
输入值:Page_Addr:页地址
|
||||
输出值:无
|
||||
返回值:成功、失败
|
||||
***************************************************************/
|
||||
ErrorStatus FlashIap_ErasePage(uint8_t Page_Addr)
|
||||
{
|
||||
uint16_t Temp16;
|
||||
uint32_t temp;
|
||||
|
||||
temp = __get_PRIMASK(); //获取PRIMASK寄存器当前状态
|
||||
__disable_irq(); //屏蔽所有中断
|
||||
|
||||
if(FlashIap_Unlock() == ERROR)
|
||||
{
|
||||
__set_PRIMASK(temp); //恢复PRIMASK寄存器状态
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
if(FlashIap_CloseAll_WPROT() == ERROR)
|
||||
{
|
||||
__set_PRIMASK(temp);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
IAP->ADDR.IAPPA = Page_Addr; //输入页地址
|
||||
|
||||
IAP->TRIG.TRIG = 0x00005EA1; //输入编程命令
|
||||
|
||||
for(Temp16 = 0; Temp16 < 0xFFFF; Temp16++)
|
||||
{ //判断IAP工作状态
|
||||
if((IAP->STA.Word & (uint32_t)0x01) == (uint32_t)0x00)
|
||||
break;
|
||||
}
|
||||
|
||||
if(Temp16 == 0xFFFF)
|
||||
{
|
||||
__set_PRIMASK(temp); //恢复PRIMASK寄存器状态
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
for(Temp16 = 0; Temp16 < 0xFFFF; Temp16++)
|
||||
{
|
||||
if((IAP->STA.Word & (uint32_t)0x02) == (uint32_t)0x02) //判断IAP页擦除标志
|
||||
break;
|
||||
}
|
||||
|
||||
if(Temp16 == 0xFFFF)
|
||||
{
|
||||
__set_PRIMASK(temp); //恢复PRIMASK寄存器状态
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
if(FlashIap_WriteEnd() == ERROR)
|
||||
{
|
||||
__set_PRIMASK(temp); //恢复PRIMASK寄存器状态
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
if(FlashIap_OpenAll_WPROT() == ERROR)
|
||||
{
|
||||
__set_PRIMASK(temp);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
__set_PRIMASK(temp); //恢复PRIMASK寄存器状态
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:FlashIap_WriteCont
|
||||
描 述:IAP连续写
|
||||
输入值:Unit_addr:单元地址 、 Page_addr:页地址 、 Data32:数据
|
||||
输出值:无
|
||||
返回值:成功、失败
|
||||
***************************************************************/
|
||||
ErrorStatus FlashIap_WriteCont(uint8_t Unit_addr, uint8_t Page_addr, uint32_t Data32)
|
||||
{
|
||||
uint16_t temp16;
|
||||
|
||||
IAP->ADDR.IAPPA = Page_addr; //输入地址
|
||||
IAP->ADDR.IAPCA = Unit_addr;
|
||||
|
||||
IAP->DATA.DATA = Data32; //输入数据
|
||||
IAP->TRIG.TRIG = 0x00005DA2; //输入编程命令
|
||||
|
||||
for(temp16 = 0; temp16 < 0xFFFF; temp16++)
|
||||
{
|
||||
if((IAP->STA.Word & (uint32_t)0x01) == (uint32_t)0x00) //判断IAP工作状态
|
||||
break;
|
||||
}
|
||||
|
||||
if(temp16 == 0xFFFF)
|
||||
return ERROR;
|
||||
|
||||
for(temp16 = 0; temp16 < 0xFFFF; temp16++)
|
||||
{
|
||||
if((IAP->STA.Word & 0x04)==0x04) //判断IAP编程结束标志
|
||||
break;
|
||||
}
|
||||
|
||||
if(temp16 == 0xFFFF)
|
||||
return ERROR;
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:FlashIap_WriteWord
|
||||
描 述:IAP写一个字
|
||||
输入值:Unit_addr:单元地址 、 Page_addr:页地址 、 Data32:数据
|
||||
输出值:无
|
||||
返回值:成功、失败
|
||||
***************************************************************/
|
||||
ErrorStatus FlashIap_WriteWord(uint8_t Unit_addr, uint8_t Page_addr, uint32_t Data32)
|
||||
{
|
||||
uint32_t temp;
|
||||
|
||||
temp = __get_PRIMASK(); //获取PRIMASK寄存器当前状态
|
||||
__disable_irq(); //屏蔽所有中断
|
||||
|
||||
if(FlashIap_Unlock() == ERROR)
|
||||
{
|
||||
__set_PRIMASK(temp); //恢复PRIMASK寄存器状态
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
if(FlashIap_CloseAll_WPROT() == ERROR)
|
||||
{
|
||||
__set_PRIMASK(temp); //关闭所有写保护状态
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
if(FlashIap_WriteCont(Unit_addr, Page_addr, Data32) == ERROR)
|
||||
{
|
||||
__set_PRIMASK(temp); //恢复PRIMASK寄存器状态
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
if(FlashIap_WriteEnd() == ERROR)
|
||||
{
|
||||
__set_PRIMASK(temp); //恢复PRIMASK寄存器状态
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
if(FlashIap_OpenAll_WPROT() == ERROR)
|
||||
{
|
||||
__set_PRIMASK(temp); //打开所有写保护状态
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
__set_PRIMASK(temp); //恢复PRIMASK寄存器状态
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
函数名:Flash_Read
|
||||
描 述:Flash读数据
|
||||
输入值:Ram_Addr:读出数据的存放地址 、 Flash_Addr:Flash地址(0x00000000 ~ 0x0001FFFF)、 Len:读取的字长度
|
||||
输出值:读出的数据
|
||||
返回值:成功、失败
|
||||
***************************************************************/
|
||||
ErrorStatus Flash_Read(uint32_t * Ram_Addr, uint32_t Flash_Addr, uint8_t Len)
|
||||
{
|
||||
uint8_t i;
|
||||
uint32_t *ram_addr32;
|
||||
const uint32_t *flash_addr32;
|
||||
|
||||
ram_addr32 = (uint32_t *)Ram_Addr;
|
||||
flash_addr32 = (const uint32_t *)Flash_Addr;
|
||||
|
||||
if((Len == 0) & (Len>(0x20000 - Flash_Addr) / 4)) //判断读取长度是否合法
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
for(i=0; i<Len; i++)
|
||||
{
|
||||
*ram_addr32 = *flash_addr32;
|
||||
ram_addr32++;
|
||||
flash_addr32++;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*************************END OF FILE**********************/
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,97 @@
|
||||
/***************************************************************
|
||||
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||
*文件名:
|
||||
*作 者: Liut
|
||||
*版 本: V1.00
|
||||
*日 期: 2017/07/14
|
||||
*描 述:
|
||||
*备 注: 适用于 ES8P508芯片
|
||||
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
||||
***************************************************************/
|
||||
#include "lib_iap.h"
|
||||
|
||||
/*************************************************
|
||||
* @brief IAP 页擦除编程.回调固化在ROM中的程序
|
||||
* @param address: 页首地址
|
||||
* @retval None
|
||||
***********************************************/
|
||||
ErrorStatus IAP_PageErase(uint32_t address)
|
||||
{
|
||||
IAP_PE IAPPageErase = (IAP_PE)(*(uint32_t *)IAP_PageErase_addr);
|
||||
|
||||
ErrorStatus result;
|
||||
__ASM("CPSID i");
|
||||
result = (*IAPPageErase)(address);
|
||||
__ASM("CPSIE i");
|
||||
return result;
|
||||
}
|
||||
|
||||
/*************************************************
|
||||
* @brief IAP 单字自编程.回调固化在ROM中的程序
|
||||
* @param address: 编程首地址
|
||||
* @param data: 编程数据
|
||||
* @retval None
|
||||
************************************************/
|
||||
ErrorStatus IAP_WordProgram(uint32_t address, uint32_t data)
|
||||
{
|
||||
IAP_WP IAPWordProgram = (IAP_WP)(*(uint32_t *)IAP_WordProgram_addr);
|
||||
|
||||
ErrorStatus result;
|
||||
__ASM("CPSID i");
|
||||
result = (*IAPWordProgram)( address, data);
|
||||
__ASM("CPSIE i");
|
||||
return result;
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* @brief IAP 多字自编程.回调固化在ROM中的程序
|
||||
* @param address: 编程首地址
|
||||
* @param data[]: 编程数据
|
||||
* @param length: 编程数据长度(字节)
|
||||
* @param address: 编程页是否先擦除
|
||||
* @arg 0: 不擦除
|
||||
* @arg 1: 擦除
|
||||
* @retval None
|
||||
**********************************************/
|
||||
ErrorStatus IAP_PageProgram(uint32_t address, uint32_t data[], uint32_t length, uint32_t erase) //@0x100001c5
|
||||
{
|
||||
IAP_PP IAPPageProgram = (IAP_PP)(*(uint32_t *)IAP_PageProgram_addr);
|
||||
|
||||
ErrorStatus result;
|
||||
__ASM("CPSID i");
|
||||
result = (*IAPPageProgram)(address,data,length,erase);
|
||||
__ASM("CPSIE i");
|
||||
return result;
|
||||
}
|
||||
/*************************************
|
||||
函数名:IARead
|
||||
描 述:Flash读
|
||||
输入值:内存地址--读取数据的存放地址
|
||||
Flash地址
|
||||
读取数据的长度,单位为字(4字节)
|
||||
返回值:成功/失败
|
||||
**************************************/
|
||||
ErrorStatus IAPRead(uint32_t *Ram_Addr, uint32_t Flash_Addr, uint8_t Len)
|
||||
{
|
||||
uint8_t i;
|
||||
uint32_t *ram_addr;
|
||||
const uint32_t *flash_addr;
|
||||
|
||||
ram_addr = Ram_Addr;
|
||||
flash_addr = (const uint32_t *)Flash_Addr;
|
||||
|
||||
if (Len == 0)
|
||||
return ERROR;
|
||||
|
||||
for (i = 0; i < Len; ++i)
|
||||
{
|
||||
*ram_addr = *flash_addr;
|
||||
++ram_addr;
|
||||
++flash_addr;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/************************END OF FILE**************************/
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user