From 250e5b8da53b4360880b34290d1f670e07eeb7b2 Mon Sep 17 00:00:00 2001 From: ruizhao_bj Date: Sat, 6 May 2023 16:36:15 +0800 Subject: [PATCH] [Add] add sadc polling hardware libbare. --- .../drivers-x2600/include/x2600_hal_sadc.h | 15 ++ drivers/drivers-x2600/src/x2600_hal_sadc.c | 36 ++++ .../adc_ScanConversion_polling/CMakeLists.txt | 108 +++++++++++ .../adc/adc_ScanConversion_polling/Makefile | 173 ++++++++++++++++++ .../adc/adc_ScanConversion_polling/README.md | 46 +++++ .../include/board_eth_phy_conf.h | 75 ++++++++ .../include/x2600_hal_conf.h | 119 ++++++++++++ .../include/x2600_sysclk_conf.h | 68 +++++++ .../adc/adc_ScanConversion_polling/main.c | 146 +++++++++++++++ .../riscv32-gcc.cmake | 18 ++ 10 files changed, 804 insertions(+) create mode 100755 projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/CMakeLists.txt create mode 100644 projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/Makefile create mode 100644 projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/README.md create mode 100644 projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/include/board_eth_phy_conf.h create mode 100644 projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/include/x2600_hal_conf.h create mode 100644 projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/include/x2600_sysclk_conf.h create mode 100644 projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/main.c create mode 100644 projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/riscv32-gcc.cmake diff --git a/drivers/drivers-x2600/include/x2600_hal_sadc.h b/drivers/drivers-x2600/include/x2600_hal_sadc.h index ac3e50d1..228f27d1 100644 --- a/drivers/drivers-x2600/include/x2600_hal_sadc.h +++ b/drivers/drivers-x2600/include/x2600_hal_sadc.h @@ -128,6 +128,15 @@ typedef void (*pADC_CallbackTypeDef)(ADC_HandleTypeDef *hadc); /*!< 指向ADC c #define HAL_ADC_ERROR_INVALID_CALLBACK (0x10U) /*!< 无效的回调函数 */ #endif +/*ADC 的状态标志定义*/ +#define ADC_SR_SEQ0_DR_FLAG ((uint32_t)ADC_SR_SEQ0_DR) +#define ADC_SR_SEQ1_DR_FLAG ((uint32_t)ADC_SR_SEQ1_DR) +#define ADC_SR_SEQ2_DR_FLAG ((uint32_t)ADC_SR_SEQ2_DR) +#define ADC_SR_SEQ1_DMA_FIN_FLAG ((uint32_t)ADC_SR_SEQ1_DMA_FIN) +#define ADC_SR_SEQ2_DMA_FIN_FLAG ((uint32_t)ADC_SR_SEQ2_DMA_FIN) + + + /*ADC 的中断标志定义*/ #define ADC_IT_SEQ0_DR_FLAG ((uint32_t)ADC_IR_FORRISCV_SEQ0_DR) #define ADC_IT_SEQ1_DR_FLAG ((uint32_t)ADC_IR_FORRISCV_SEQ1_DR) @@ -178,6 +187,11 @@ typedef void (*pADC_CallbackTypeDef)(ADC_HandleTypeDef *hadc); /*!< 指向ADC c * @{ */ +/* + *brief SADC 状态寄存器:0x00 + */ +#define __HAL_ADC_READ_SR(__HANDLE__) READ_REG((__HANDLE__)->Instance->ADCSR) +#define __HAL_ADC_CLEAN_SR_FLAG(__HANDLE__,__FLAG__) SET_BIT((__HANDLE__)->Instance->ADCSR,__FLAG__) /* *brief SADC 中断使能寄存:0x08 */ @@ -412,6 +426,7 @@ HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc); /*!< ADC 序列转换 HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc); /*!< ADC 序列转换结束*/ void HAL_ADC_IRQHandler(int irq, void *data); /*!< ADC 中断处理函数*/ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc); /*!< ADC 完成AD转换回调函数,需要用户自定义*/ +HAL_StatusTypeDef HAL_ADC_POLLING_READY(ADC_HandleTypeDef *hadc); /*!< ADC 轮询等待数据函数*/ /** diff --git a/drivers/drivers-x2600/src/x2600_hal_sadc.c b/drivers/drivers-x2600/src/x2600_hal_sadc.c index 8c5731c5..e0922217 100644 --- a/drivers/drivers-x2600/src/x2600_hal_sadc.c +++ b/drivers/drivers-x2600/src/x2600_hal_sadc.c @@ -472,6 +472,42 @@ out: #endif } +/** + * @brief ADC轮询等待数据函数 + * @param 指向包含指定ADC配置信息的ADC_HandleTypeDef结构的hadc指针 + * @retval HAL状态 + */ + +HAL_StatusTypeDef HAL_ADC_POLLING_READY(ADC_HandleTypeDef *hadc) +{ + uint32_t polling_flag =0; + polling_flag =__HAL_ADC_READ_SR(hadc); + + if(polling_flag & ADC_SR_SEQ0_DR_FLAG){ + __HAL_ADC_CLEAN_SR_FLAG(hadc,ADC_SR_SEQ0_DR_FLAG); + goto out; + } + if(polling_flag & ADC_SR_SEQ1_DR_FLAG){ + __HAL_ADC_CLEAN_SR_FLAG(hadc,ADC_SR_SEQ1_DR_FLAG); + goto out; + } + if(polling_flag & ADC_SR_SEQ2_DR_FLAG){ + __HAL_ADC_CLEAN_SR_FLAG(hadc,ADC_SR_SEQ2_DR_FLAG); + goto out; + } + return HAL_ERROR; +out: + /* 完成模数转换调用回调函数 */ +#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) + hadc->ConvCpltCallback(hadc); +#else + HAL_ADC_ConvCpltCallback(hadc); +#endif + return HAL_OK; +} + + + /** * @brief 获取ADC模数转换的数据 * @param 指向包含指定ADC配置信息的ADC_HandleTypeDef结构的hadc指针 diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/CMakeLists.txt b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/CMakeLists.txt new file mode 100755 index 00000000..c365bc74 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/CMakeLists.txt @@ -0,0 +1,108 @@ +cmake_minimum_required(VERSION 3.8) +# +# Core project settings +# +Project(template) # Modified +enable_language(C CXX ASM) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +# Setup compiler settings +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_C_EXTENSIONS ON) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS ON) +set(PROJ_PATH ${CMAKE_CURRENT_SOURCE_DIR}) +set(SDK_PATH ${PROJ_PATH}/../../../../) +message("Build type: " ${CMAKE_BUILD_TYPE}) + +# Set linker script +set(linker_script_SRC ${SDK_PATH}/cpu/core-riscv/ld.lds) # Modified +set(EXECUTABLE ${CMAKE_PROJECT_NAME}) +set(CPU_PARAMETERS "-march=rv32imc -mabi=ilp32 -Wno-abi") + +set(CMAKE_ASM_FLAGS "${CPU_PARAMETERS} -D_ASSEMBLER_ -D__ASSEMBLY__") + +set(CMAKE_C_FLAGS "${CPU_PARAMETERS} -fno-pic -fno-builtin -fomit-frame-pointer -Wall -nostdlib -Wall -fdata-sections -ffunction-sections") + +# Compiler options + +if(CMAKE_BUILD_TYPE STREQUAL Debug) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g -ggdb -DDEBUG") +else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") +endif() + +set(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS}) + +set(CMAKE_LD_FLAGS "${CPU_PARAMETERS}") + + +set(sources_SRCS # Modified + ${SDK_PATH}/cpu/core-riscv/spinlock.c + ${SDK_PATH}/cpu/core-riscv/start.S + ${SDK_PATH}/cpu/core-riscv/genex.S + ${SDK_PATH}/cpu/core-riscv/traps.c + ${SDK_PATH}/cpu/soc-x2600/src/interrupt.c + ${SDK_PATH}/cpu/soc-x2600/src/serial.c + ${SDK_PATH}/cpu/soc-x2600/src/startup.c + ${SDK_PATH}/drivers/drivers-x2600/src/x2600_hal_def.c + ${SDK_PATH}/drivers/drivers-x2600/src/x2600_hal_sadc.c + ${SDK_PATH}/lib/libc/minimal/ctype.c + ${SDK_PATH}/lib/libc/minimal/div64.c + ${SDK_PATH}/lib/libc/minimal/string.c + ${SDK_PATH}/lib/libc/minimal/vsprintf.c + main.c + +) + +if(CMAKE_EXPORT_COMPILE_COMMANDS) + set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}) + set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) +endif() + +# +# Include directories +# +#set(include_path_DIRS +# Modified + +include_directories( + ${PROJ_PATH}/include + ${SDK_PATH}/lib/libc/minimal/include + ${SDK_PATH}/drivers/drivers-x2600/include + ${SDK_PATH}/cpu/core-riscv/include + ${SDK_PATH}/cpu/soc-x2600/include + +) + +# +# -L libdirs. +# +link_directories( +#path/to/lib +) + +# Executable files +add_executable(${EXECUTABLE} ${sources_SRCS}) + +# Linker options +target_link_libraries(${EXECUTABLE} PRIVATE + -T${linker_script_SRC} + ${CMAKE_LD_FLAGS} + -Wl,-Map=${CMAKE_PROJECT_NAME}.map,--cref + -Wl,--gc-sections + -Wl,--start-group + -Wl,--end-group + -Wl,--print-memory-usage +) + +# Execute post-build to print size +add_custom_command(TARGET ${EXECUTABLE} POST_BUILD + COMMAND ${CMAKE_SIZE} $ +) + +# Convert output to hex and binary +add_custom_command(TARGET ${EXECUTABLE} POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -O binary $ ${EXECUTABLE}.bin + ) diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/Makefile b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/Makefile new file mode 100644 index 00000000..c1946e2d --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/Makefile @@ -0,0 +1,173 @@ +###################################### +# target +###################################### +TARGET = sadc + +SDK_PATH = ../../../../../ + + +###################################### +# building variables +###################################### +# debug build? +DEBUG = 1 +# optimization +OPT = -Og -fno-pic -fno-builtin -fomit-frame-pointer -Wall -nostdlib -Werror-implicit-function-declaration + + +####################################### +# paths +####################################### +# Build path +BUILD_DIR = build + +###################################### +# source +###################################### +# C sources +C_SOURCES = \ +$(SDK_PATH)/cpu/core-riscv/traps.c \ +$(SDK_PATH)/cpu/core-riscv/spinlock.c \ +$(SDK_PATH)/cpu/soc-x2600/src/startup.c \ +$(SDK_PATH)/cpu/soc-x2600/src/serial.c \ +$(SDK_PATH)/cpu/soc-x2600/src/interrupt.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_hal_def.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_hal_sadc.c \ +$(SDK_PATH)/lib/libc/minimal/vsprintf.c \ +$(SDK_PATH)/lib/libc/minimal/string.c \ +$(SDK_PATH)/lib/libc/minimal/ctype.c \ +$(SDK_PATH)/lib/libc/minimal/div64.c \ +main.c + +# ASM sources +ASM_SOURCES = \ +$(SDK_PATH)/cpu/core-riscv/start.S \ +$(SDK_PATH)/cpu/core-riscv/genex.S + + +####################################### +# binaries +####################################### +PREFIX = riscv32-ingenicv0-elf- +# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx) +# either it can be added to the PATH environment variable. +ifdef GCC_PATH +CC = $(GCC_PATH)/$(PREFIX)gcc +AS = $(GCC_PATH)/$(PREFIX)as +LD = $(GCC_PATH)/$(PREFIX)ld +CP = $(GCC_PATH)/$(PREFIX)objcopy +SZ = $(GCC_PATH)/$(PREFIX)size +else +CC = $(PREFIX)gcc +AS = $(PREFIX)as +LD = $(PREFIX)ld +CP = $(PREFIX)objcopy +SZ = $(PREFIX)size +endif +BIN = $(CP) -O binary -S + +####################################### +# CFLAGS +####################################### +# cpu +CPU = -march=rv32imc -mabi=ilp32 -Wno-abi + +# fpu +FPU = + +# float-abi +FLOAT-ABI = + +# mcu +#MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) +MCU = $(CPU) $(FPU) $(FLOAT-ABI) + +# macros for gcc +# AS defines +AS_DEFS = -D_ASSEMBLER_ -D__ASSEMBLY__ + +# C defines +C_DEFS = + + +# AS includes +AS_INCLUDES = \ +-I$(SDK_PATH)/cpu/core-riscv/include \ +-I$(SDK_PATH)/lib/libc/minimal/include \ + +# C includes +C_INCLUDES = \ +-Iinclude \ +-I$(SDK_PATH)/cpu/core-riscv/include \ +-I$(SDK_PATH)/cpu/soc-x2600/include \ +-I$(SDK_PATH)/lib/libc/minimal/include \ +-I$(SDK_PATH)/drivers/drivers-x2600/include + + +# compile gcc flags +ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +ifeq ($(DEBUG), 1) +CFLAGS += -g -gdwarf-2 -O0 +endif + + +# Generate dependency information +CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" + + +####################################### +# LDFLAGS +####################################### +# link script +LDSCRIPT = $(SDK_PATH)/cpu/core-riscv/ld.lds + +# libraries +#LIBS = -lc -lm -lnosys +LIBDIR = +LDFLAGS = $(MCU) -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections -nostdlib + +# default action: build all +all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).bin + + +####################################### +# build the application +####################################### +# list of objects +OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) +vpath %.c $(sort $(dir $(C_SOURCES))) +# list of ASM program objects +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.S=.o))) +vpath %.S $(sort $(dir $(ASM_SOURCES))) + +$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) + $(CC) -c $(CFLAGS) $< -o $@ + +$(BUILD_DIR)/%.o: %.S Makefile | $(BUILD_DIR) + $(CC) -c $(ASFLAGS) -o $@ $< + +$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile + $(CC) $(OBJECTS) $(LDFLAGS) -o $@ + $(SZ) $@ + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(BIN) $< $@ + +$(BUILD_DIR): + mkdir $@ + +####################################### +# clean up +####################################### +clean: + -rm -fR $(BUILD_DIR) + +####################################### +# dependencies +####################################### +-include $(wildcard $(BUILD_DIR)/*.d) + +# *** EOF *** diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/README.md b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/README.md new file mode 100644 index 00000000..8c202331 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/README.md @@ -0,0 +1,46 @@ + +1. Linux 命令行编译 + +a. 基于Makefile + +``` +$ make +``` +会在build目录生成sadc.elf, sadc.bin文件. + + +b. 基于cmake + +``` +$ mkdir build +$ cd build +$ cmake -DCMAKE_TOOLCHAIN_FILE=../mips-gcc-sde-elf.cmake .. +$ make + +``` +会在build目录下生成sadc.elf,sadc.bin文件. + + +2. windows 编译. + +2.1 基于vscode + +a. vscode 大概projects/template 文件夹 +b. 选择cmake-kits "GCC for ingenic cross compile on Windows" +c. lunch(F5) 运行编译、调试 +d. 或者选择状态栏,build,仅编译. + + + +2.2 基于命令行 + +前提: 系统必须安装msys - mingw64-make 工具. + +``` +$ mkdir build +$ cd build +$ cmake -DCMAKE_TOOLCHAIN_FILE=../mips-gcc-sde-elf.cmake -G "MinGW Makefiles" ../ +$ mingw32-make +``` + + diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/include/board_eth_phy_conf.h b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/include/board_eth_phy_conf.h new file mode 100644 index 00000000..c907ead4 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/include/board_eth_phy_conf.h @@ -0,0 +1,75 @@ +#ifndef __ETH_PHY_CONF_H +#define __ETH_PHY_CONF_H + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 0x00U +#define MAC_ADDR1 0x11U +#define MAC_ADDR2 0x22U +#define MAC_ADDR3 0x33U +#define MAC_ADDR4 0x44U +#define MAC_ADDR5 0x55U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848 PHY Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x00U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x01U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2600U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ + +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x11U) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x12U) /*!< MII Interrupt Status and Misc. Control Register */ + +#define PHY_LINK_STATUS ((uint16_t)0x0001U) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +#define PHY_MICR_INT_EN ((uint16_t)0x0002U) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001U) /*!< PHY Enable output interrupt events */ + +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020U) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2600U) /*!< PHY link status interrupt mask */ + +/* ################## Ethernet peripheral configuration ##################### */ + + + +#endif // __ETH_PHY_CONF_H + diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/include/x2600_hal_conf.h b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/include/x2600_hal_conf.h new file mode 100644 index 00000000..bdada2a1 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/include/x2600_hal_conf.h @@ -0,0 +1,119 @@ +#ifndef __X2000_HAL_CONF_H__ +#define __X2000_HAL_CONF_H__ +/* TODO: 本文件应该通过工具生成,在配置工程中选择不同的组件时,在此处包含不同的头文件 + 暂时包含全部头文件. +*/ + + +/* 1. Includes ---------------------------------------------------- */ + + +/* Hal Module selections. */ +#if 0 +#define HAL_MSC_ENABLED +#define HAL_I2C_ENABLED +#define HAL_UART_ENABLED +#define HAL_ADC_ENABLED +#define HAL_SPI_ENABLED +#define HAL_WDT_ENABLED +#define HAL_TCU_ENABLED +#define HAL_RTC_ENABLED +#define HAL_EFUSE_ENABLED +#define HAL_PWM_ENABLED +#define HAL_GMAC_ENABLED +#define HAL_USB_ENABLED +#endif + +/* 系统时钟配配置,通过工具生成,随开发板或者平台变化.*/ +#include +#include + +#include "x2600_hal_tick.h" +#include "x2600_ll_ost_core.h" +#include "x2600_ll_ost_global.h" +#include "x2600_ll_cpm.h" +#include "x2600_ll_gpio.h" + +#include "x2600_hal_sadc.h" +#include "x2600_hal_pdma.h" + +//#include "x2600_hal_sfcnor.h" + +#ifdef HAL_MSC_ENABLED + +#endif + +#ifdef HAL_I2C_ENABLED +#include "x2600_hal_i2c.h" +#endif + +#ifdef HAL_UART_ENABLED +#include "x2600_hal_uart.h" +#endif + +#ifdef HAL_ADC_ENABLED +#include "x2600_hal_adc.h" +#endif + +#ifdef HAL_SPI_ENABLED +#include "x2600_hal_spi.h" +#endif + +#ifdef HAL_WDT_ENABLED +#include "x2600_hal_wdt.h" +#endif + +#ifdef HAL_TCU_ENABLED +#include "x2600_hal_tcu.h" +#endif + +#ifdef HAL_RTC_ENABLED +#include "x2600_hal_rtc.h" +#endif + +#ifdef HAL_EFUSE_ENABLED +#include "x2600_ll_efuse.h" +#include "x2600_hal_efuse.h" +#endif + +#ifdef HAL_PWM_ENABLED +#include "x2600_hal_pwm.h" +#endif + +#ifdef HAL_GMAC_ENABLED +#include "x2600_hal_gmac.h" +#endif + +#ifdef HAL_USB_ENABLED +#include "x2600_hal_pcd.h" +#include "x2600_hal_pcd_ex.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* 2. Exported Types ---------------------------------------------- */ + +/* 3. Exported Constants ------------------------------------------ */ + +/* 4. Exported Macros --------------------------------------------- */ + +/* 5. Exported Funcs ---------------------------------------------- */ + +/* 6. Exported Variables ------------------------------------------ */ + +/* 7. Private Types ----------------------------------------------- */ + +/* 8. Private Constants ------------------------------------------- */ + +/* 9. Private Macros ---------------------------------------------- */ + +/* 10. Private Funcs ---------------------------------------------- */ + +/* 11. Private Variables ------------------------------------------ */ + +#ifdef __cplusplus +} +#endif +#endif /* __X2000_HAL_H__ */ diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/include/x2600_sysclk_conf.h b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/include/x2600_sysclk_conf.h new file mode 100644 index 00000000..2126aba0 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/include/x2600_sysclk_conf.h @@ -0,0 +1,68 @@ +/** + * @file x2600_sysclk_conf.h + * @author MPU系统软件部团队 + * @brief + * + * @copyright 版权所有 (北京君正集成电路股份有限公司) {2022} + * @copyright Copyright© 2022 Ingenic Semiconductor Co.,Ltd + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#ifndef __X2000_SYSCLK_CONF_H__ +#define __X2000_SYSCLK_CONF_H__ + +#ifdef __cplusplus +extern "C" { +#endif +/* 1. Includes ---------------------------------------------------- */ + +/* 2. Exported Types ---------------------------------------------- */ + + +/* 3. Exported Constants ------------------------------------------ */ + +/* 4. Exported Macros --------------------------------------------- */ +#define SYSCLK_EXTAL (24000000) +#define SYSCLK_APLL (1200000000) +#define SYSCLK_MPLL (1200000000) + +#define SystemCoreClock SYSCLK_APLL + +#define CGU_CONFIG_MSC_APLL_24M { \ + .PLLMux = MSC1CDR_SCLK_A, \ + .Div = 24, \ + .Config = 0 } + +#define CGU_CONFIG_MSC_APLL_48M { \ + .PLLMux = MSC1CDR_SCLK_A, \ + .Div = 11, \ + .Config = 0 } + + +#define CGU_CONFIG_SSI_MPLL_500K { \ + .PLLMux = SSICDR_MPLL, \ + .Div = 15, \ + .Config = 0 } + +/* 5. Exported Funcs ---------------------------------------------- */ + +/* 6. Exported Variables ------------------------------------------ */ + +/* 7. Private Types ----------------------------------------------- */ + +/* 8. Private Constants ------------------------------------------- */ + +/* 9. Private Macros ---------------------------------------------- */ + +/* 10. Private Funcs ---------------------------------------------- */ + +/* 11. Private Variables ------------------------------------------ */ + +#ifdef __cplusplus +} +#endif +#endif /* __X2000_HAL_ADC_H__ */ diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/main.c b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/main.c new file mode 100644 index 00000000..0663ce08 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/main.c @@ -0,0 +1,146 @@ +#include + +//#define TEST_ADC_DEBUG + +ADC_HandleTypeDef AdcHandle; +__IO ITStatus UartReady = RESET; +static int *seq1 =NULL; + +#ifdef TEST_ADC_DEBUG + static void dump_adc_regs(void); +#endif +static void Error_Handler(void); + + +int main(void) +{ + ADC_ChannelConfTypeDef sConfig; + unsigned int i=0; + unsigned int channal; + unsigned int data; + prom_printk("adc projects test!\n"); + + /* 实例化ADC句柄,配置初始化参数 */ + AdcHandle.Instance = SADC_Instance; + AdcHandle.Init.EXTEN = DISABLE; + + /* 取消初始化ADC外围设备 */ + if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK) { + Error_Handler(); + } + + /* 初始化ADC外围设备 */ + if (HAL_ADC_Init(&AdcHandle) != HAL_OK) { + Error_Handler(); + } + + /* 配置ADC 序列 */ + sConfig.Seq =SEQ1; + sConfig.Is_intc =DISABLE; + sConfig.Is_Cont =DISABLE; + sConfig.channal0 =0x76543210; + sConfig.channal1 =0xfedcba98; + sConfig.len =15; + if (HAL_ADC_ConfigSeq(&AdcHandle, &sConfig) != HAL_OK) { + Error_Handler(); + } + + /* ADC序列模数转换开始 */ + UartReady = RESET; + if (HAL_ADC_Start(&AdcHandle) != HAL_OK) { + Error_Handler(); + } +#ifdef TEST_ADC_DEBUG + dump_adc_regs(); +#endif + + while (1) { + /* 获取模数转换后数据 */ + while(HAL_ADC_POLLING_READY(&AdcHandle) !=HAL_OK); + for(i=0;i<=sConfig.len;i++){ + channal = (seq1[i] & (0xf<<12)) >>12; + data = seq1[i] & (0xfff); + data =1800 *data /4096; + prom_printk("channal= %d data=%d mv\n",channal,data); + } + + } + + + + return 0; +} + +void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *AdcHandle) +{ + seq1 = HAL_ADC_GetValue(AdcHandle); +} + +static void Error_Handler(void) +{ + prom_printk("Error %s %d\n", __func__,__LINE__); +} + +#ifdef TEST_ADC_DEBUG +static void dump_adc_regs(void) +{ + + prom_printk("%s %d\n",__func__,__LINE__); + int i = 0; + + prom_printk("ADCSR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSR)); + prom_printk("ADCIE: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCIE)); + prom_printk("ADCIE_RISCV: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCIE_RISCV)); + prom_printk("ADCIR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCIR)); + prom_printk("ADCIR_RISCV: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCIR_RISCV)); + prom_printk("ADCCR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCCR)); + prom_printk("ADCCFR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCCFR)); + prom_printk("ADCCLKR0: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCCLKR0)); + prom_printk("ADCCLKR1: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCCLKR1)); + prom_printk("ADCCLKR2: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCCLKR2)); + prom_printk("ADCEXT_GPIO_CR:0x%08x\n", READ_REG(AdcHandle.Instance->ADCEXT_GPIO_CR)); + + for (i = 0; i < 16; i++) + prom_printk("ADCAWD_CRn[%d]:0x%08x\n", i,READ_REG(AdcHandle.Instance->ADCAWD_CRn[i])); + + prom_printk("ADCAWD_SR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCAWD_SR)); + prom_printk("ADCAWD_IM: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCAWD_IM)); + prom_printk("ADCAWD_IM_RISCV: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCAWD_IM_RISCV)); + prom_printk("ADCAWD_IF: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCAWD_IF)); + prom_printk("ADCAWD_IF_RISCV: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCAWD_IF_RISCV)); + prom_printk("ADCDEBUG_CR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCDEBUG_CR)); + prom_printk("ADCDEBUG_FSM: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCDEBUG_FSM)); + prom_printk("ADCSEQ0_CR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ0_CR)); + prom_printk("ADCSEQ0_CNR0: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ0_CNR0)); + prom_printk("ADCSEQ0_DCR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ0_DCR)); + prom_printk("ADCSEQ0_DR0: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ0_DR0)); + prom_printk("ADCSEQ0_DR1: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ0_DR1)); + prom_printk("ADCSEQ1_CR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ1_CR)); + prom_printk("ADCSEQ1_CNR0: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ1_CNR0)); + prom_printk("ADCSEQ1_CNR1: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ1_CNR1)); + prom_printk("ADCSEQ1_DCR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ1_DCR)); + prom_printk("ADCSEQ1_DR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ1_DR)); + + for (i = 0; i < 8; i++) + prom_printk("ADCSEQ1_DLY[%d]: = 0x%08x\n", i,READ_REG(AdcHandle.Instance->ADCSEQ1_DLYn[i])); + + for (i = 0; i < 8; i++) + prom_printk("ADCSEQ1_CONT_CR[%d]: = 0x%08x\n", i, READ_REG(AdcHandle.Instance->ADCSEQ1_CONT_CRn[i])); + + prom_printk("ADCSEQ1_RCNT: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ1_RCNT)); + prom_printk("ADCSEQ1_DMA_RCNT: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ1_DMA_RCNT)); + prom_printk("ADCSEQ2_CR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ2_CR)); + prom_printk("ADCSEQ2_CNR0: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ2_CNR0)); + prom_printk("ADCSEQ2_DCR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ2_DCR)); + prom_printk("ADCSEQ2_DR: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ2_DR)); + + for (i = 0; i < 2; i++) + prom_printk("ADCSEQ2_DLYn[%d]: = 0x%08x\n", i,READ_REG(AdcHandle.Instance->ADCSEQ2_DLYn[i])); + + prom_printk("ADCSEQ2_RCNT: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ2_RCNT)); + prom_printk("ADCSEQ2_DMA_RCNT: 0x%08x\n", READ_REG(AdcHandle.Instance->ADCSEQ2_DMA_RCNT)); + +} +#endif + + diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/riscv32-gcc.cmake b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/riscv32-gcc.cmake new file mode 100644 index 00000000..d09813df --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/riscv32-gcc.cmake @@ -0,0 +1,18 @@ +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR riscv32) + +# Some default GCC settings +set(TOOLCHAIN_PREFIX "riscv32-ingenicv0-elf-") + +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) +set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) + +set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) +set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}size) + +set(CMAKE_EXECUTABLE_SUFFIX_ASM ".elf") +set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") +set(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf") + +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) -- Gitee