diff --git a/cpu/soc-x2600/include/sadc.h b/cpu/soc-x2600/include/sadc.h index cb7e2af1c0aa6b32ccfa9a3509e83ca446da6fc9..de8651d2523278c9e21d155e5ffd7f41467c7a3c 100644 --- a/cpu/soc-x2600/include/sadc.h +++ b/cpu/soc-x2600/include/sadc.h @@ -1401,6 +1401,8 @@ typedef struct { /********* Register BitField Details: ADC_SEQ0_DCR BASE+0x0108 *********/ #define ADC_SEQ0_DCR_DRT_CUS3_Pos (19U) +#define ADC_SEQ0_DCR_DRT_CUSALL_Msk (0xfUL << ADC_SEQ0_DCR_DRT_CUS3_Pos) /*!< 0x00080000 */ +#define ADC_SEQ0_DCR_DRT_CUSALL ADC_SEQ0_DCR_DRT_CUSALL_Msk #define ADC_SEQ0_DCR_DRT_CUS3_Msk (0x1UL << ADC_SEQ0_DCR_DRT_CUS3_Pos) /*!< 0x00080000 */ #define ADC_SEQ0_DCR_DRT_CUS3 ADC_SEQ0_DCR_DRT_CUS3_Msk #define ADC_SEQ0_DCR_DRT_CUS3_0 (0x1UL << ADC_SEQ0_DCR_DRT_CUS3_Pos) /*!< 0x00080000 */ @@ -1521,6 +1523,8 @@ typedef struct { /********* Register BitField Details: ADC_SEQ1_CR BASE+0x0200 *********/ #define ADC_SEQ1_CR_STORAGE15_Pos (31U) +#define ADC_SEQ1_CR_STORAGEALL_Msk (0xffffUL << ADC_SEQ1_CR_STORAGE15_Pos) /*!< 0x80000000 */ +#define ADC_SEQ1_CR_STORAGEALL ADC_SEQ1_CR_STORAGEALL_Msk #define ADC_SEQ1_CR_STORAGE15_Msk (0x1UL << ADC_SEQ1_CR_STORAGE15_Pos) /*!< 0x80000000 */ #define ADC_SEQ1_CR_STORAGE15 ADC_SEQ1_CR_STORAGE15_Msk #define ADC_SEQ1_CR_STORAGE15_0 (0x1UL << ADC_SEQ1_CR_STORAGE15_Pos) /*!< 0x80000000 */ @@ -1736,6 +1740,8 @@ typedef struct { /********* Register BitField Details: ADC_SEQ1_DCR BASE+0x020c *********/ #define ADC_SEQ1_DCR_DRT_CUS15_Pos (31U) +#define ADC_SEQ1_DCR_DRT_CUSALL_Msk (0xffffUL << ADC_SEQ1_DCR_DRT_CUS15_Pos) /*!< 0x80000000 */ +#define ADC_SEQ1_DCR_DRT_CUSALL ADC_SEQ1_DCR_DRT_CUSALL_Msk #define ADC_SEQ1_DCR_DRT_CUS15_Msk (0x1UL << ADC_SEQ1_DCR_DRT_CUS15_Pos) /*!< 0x80000000 */ #define ADC_SEQ1_DCR_DRT_CUS15 ADC_SEQ1_DCR_DRT_CUS15_Msk #define ADC_SEQ1_DCR_DRT_CUS15_0 (0x1UL << ADC_SEQ1_DCR_DRT_CUS15_Pos) /*!< 0x80000000 */ diff --git a/drivers/drivers-x2600/include/x2600_hal_conf.h b/drivers/drivers-x2600/include/x2600_hal_conf.h index 6a1a4849b8013dd37d07923491d9c26cf702e7a2..94c536ea5966235e8b35319b9a1c82c3d9eb810d 100644 --- a/drivers/drivers-x2600/include/x2600_hal_conf.h +++ b/drivers/drivers-x2600/include/x2600_hal_conf.h @@ -10,10 +10,10 @@ /* Hal Module selections. */ #define HAL_UART_ENABLED +#define HAL_ADC_ENABLED #if 0 #define HAL_MSC_ENABLED #define HAL_I2C_ENABLED -#define HAL_ADC_ENABLED #define HAL_SPI_ENABLED #define HAL_WDT_ENABLED #define HAL_TCU_ENABLED @@ -51,7 +51,7 @@ #endif #ifdef HAL_ADC_ENABLED -#include "x2600_hal_adc.h" +#include "x2600_hal_sadc.h" #endif #ifdef HAL_SPI_ENABLED diff --git a/drivers/drivers-x2600/include/x2600_hal_sadc.h b/drivers/drivers-x2600/include/x2600_hal_sadc.h new file mode 100644 index 0000000000000000000000000000000000000000..ac3e50d17032e4e6a203b85334b714dcf38b62cc --- /dev/null +++ b/drivers/drivers-x2600/include/x2600_hal_sadc.h @@ -0,0 +1,501 @@ +/** + * @file x2600_hal_sadc.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 __X2600_HAL_SADC_H__ +#define __X2600_HAL_SADC_H__ + + +/** + * @addtogroup group_SADC + * @{ + */ + +/** + * @addtogroup g_X2600_SADC_HAL_Driver SADC HAL 驱动 + * @{ + */ + +/* 1. 头文件 (Includes)----------------------------------------------- */ +#include "x2600_hal.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* 2. 导出的类型 (Exported Types)--------------------------------------- */ +/** + * @defgroup SADC_exported_types SADC 导出的类型 (Exported Types) + * @{ + */ + +/** @defgroup ADC_exported_types_group1 ADC 全局状态定义 + * @{ + */ +#define HAL_ADC_STATE_RESET 0x00000000U /*!< ADC 尚未初始化或禁用 */ +#define HAL_ADC_STATE_READY 0x00000001U /*!< ADC 外围设备可供使用 */ +#define HAL_ADC_STATE_BUSY_INTERNAL 0x00000002U /*!< ADC 忙于内部处理 */ +/** + * @} + */ + +/** @defgroup ADC_exported_types_group2 ADC 句柄结构体定义 + * @{ + */ +/** + * @brief ADC 初始化参数 + */ +typedef struct { + FunctionalState EXTEN; /*!< 指定是否使用外部触发方式. (ENABLE or DISABLE) */ +} ADC_InitTypeDef; + +enum SEQUENCE{ /*!< 指定使用哪一个序列*/ + SEQ0, + SEQ1, + SEQ2, +}; + +/* + *@brief 序列的配置 + */ +typedef struct{ + enum SEQUENCE Seq; /*!< 使用的序列*/ + FunctionalState Is_intc; /*!< 使用中断模式或者轮询模式*/ + FunctionalState Is_Cont; /*!< 是否使用连续扫描 */ + unsigned int channal0; /*!< 序列采集的编号*/ + unsigned int channal1; /*!< 序列采集的编号*/ + unsigned int len; /*!< 序列采集长度*/ +}ADC_ChannelConfTypeDef; + + +/* + *@brief SADC 句柄结构体定义 + */ +typedef struct{ + SADC_TypeDef * Instance; /*!< ADC 寄存器基地址 */ + ADC_InitTypeDef Init; /*!< ADC 初始化参数 */ + __IO uint32_t Seq; /*!< ADC 用于记录当前配置的序列 */ + __IO uint32_t len; /*!< ADC 用于记录当前配置的序列长度 */ + HAL_LockTypeDef Lock; /*!< ADC 锁资源 */ + __IO uint32_t State; /*!< ADC 通讯状态 */ + __IO uint32_t ErrorCode; /*!< ADC 错误代码 */ +#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) + void (* MspInitCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC Msp Init callback函数 */ + void (* MspDeInitCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC Msp DeInit callback函数 */ +#endif +}ADC_HandleTypeDef; + +/* + *brief SADC Callback ID 枚举类型定义 + */ + +typedef enum { + HAL_ADC_CONVERSION_COMPLETE_CB_ID = 0x00U, /*!< ADC conversion complete callback ID */ + HAL_ADC_MSPINIT_CB_ID = 0x01U, /*!< ADC Msp Init callback ID */ + HAL_ADC_MSPDEINIT_CB_ID = 0x02U /*!< ADC Msp DeInit callback ID */ +} HAL_ADC_CallbackIDTypeDef; + +/* + *brief SADC callback 函数类型定义 + */ + +typedef void (*pADC_CallbackTypeDef)(ADC_HandleTypeDef *hadc); /*!< 指向ADC callback的函数指针 */ + +/** + * @} + */ +/* 3. 导出常量定义 Exported Constants ----------------------------------- */ +/** + * @defgroup SADC_exported_constants SADC 导出的常量 Exported Constants + * @{ + */ + +/* + *brief ADC 错误码定义 + */ +#define HAL_ADC_ERROR_NONE 0x00U /*!< 无错误状态 */ +#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) +#define HAL_ADC_ERROR_INVALID_CALLBACK (0x10U) /*!< 无效的回调函数 */ +#endif + +/*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) +#define ADC_IT_SEQ2_DR_FLAG ((uint32_t)ADC_IR_FORRISCV_SEQ2_DR) +#define ADC_IT_SEQ1_DMA_FIN_FLAG ((uint32_t)ADC_IR_FORRISCV_SEQ1_DMA_FIN) +#define ADC_IT_SEQ2_DMA_FIN_FLAG ((uint32_t)ADC_IR_FORRISCV_SEQ2_DMA_FIN) + +/*ADC watchdog 触发中断标志*/ +#define ADC_CH0_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH0_LTR_FLG) +#define ADC_CH1_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH1_LTR_FLG) +#define ADC_CH2_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH2_LTR_FLG) +#define ADC_CH3_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH3_LTR_FLG) +#define ADC_CH4_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH4_LTR_FLG) +#define ADC_CH5_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH5_LTR_FLG) +#define ADC_CH6_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH6_LTR_FLG) +#define ADC_CH7_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH7_LTR_FLG) +#define ADC_CH8_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH8_LTR_FLG) +#define ADC_CH9_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH9_LTR_FLG) +#define ADC_CH10_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH10_LTR_FLG) +#define ADC_CH11_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH11_LTR_FLG) +#define ADC_CH12_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH12_LTR_FLG) +#define ADC_CH13_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH13_LTR_FLG) +#define ADC_CH14_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH14_LTR_FLG) +#define ADC_CH15_LTR_FLAG ((uint32_t)ADC_AWD_SR_CH15_LTR_FLG) +#define ADC_CH0_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH0_HTR_FLG) +#define ADC_CH1_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH1_HTR_FLG) +#define ADC_CH2_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH2_HTR_FLG) +#define ADC_CH3_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH3_HTR_FLG) +#define ADC_CH4_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH4_HTR_FLG) +#define ADC_CH5_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH5_HTR_FLG) +#define ADC_CH6_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH6_HTR_FLG) +#define ADC_CH7_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH7_HTR_FLG) +#define ADC_CH8_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH8_HTR_FLG) +#define ADC_CH9_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH9_HTR_FLG) +#define ADC_CH10_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH10_HTR_FLG) +#define ADC_CH11_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH11_HTR_FLG) +#define ADC_CH12_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH12_HTR_FLG) +#define ADC_CH13_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH13_HTR_FLG) +#define ADC_CH14_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH14_HTR_FLG) +#define ADC_CH15_HTR_FLAG ((uint32_t)ADC_AWD_SR_CH15_HTR_FLG) + +/** + * @} + */ +/* 4. 导出宏定义 Exported Macros --------------------------------------- */ +/** + * @defgroup SADC_exported_macros SADC 导出宏 Exported Macros + * @{ + */ + +/* + *brief SADC 中断使能寄存:0x08 + */ +#define __HAL_ADC_IT_SEQ0_DR(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ0_DR) +#define __HAL_ADC_MASKIT_SEQ0_DR(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ0_DR) +#define __HAL_ADC_IT_SEQ1_DR(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ1_DR) +#define __HAL_ADC_MASKIT_SEQ1_DR(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ1_DR) +#define __HAL_ADC_IT_SEQ2_DR(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ2_DR) +#define __HAL_ADC_MASKIT_SEQ2_DR(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ2_DR) +#define __HAL_ADC_IT_SEQ0_SOQ(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ0_SOQ) +#define __HAL_ADC_IT_SEQ1_SOQ(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ1_SOQ) +#define __HAL_ADC_IT_SEQ2_SOQ(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ2_SOQ) +#define __HAL_ADC_IT_SEQ0_EOQ(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ0_EOQ) +#define __HAL_ADC_IT_SEQ1_EOQ(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ1_EOQ) +#define __HAL_ADC_IT_SEQ2_EOQ(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ2_EOQ) +#define __HAL_ADC_IT_SEQ0_EVT_OVR(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ0_EVT_OVR) +#define __HAL_ADC_IT_SEQ1_EVT_OVR(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ1_EVT_OVR) +#define __HAL_ADC_IT_SEQ2_EVT_OVR(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ2_EVT_OVR) +#define __HAL_ADC_IT_SEQ1_DMA_FIN(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ1_DMA_FIN) +#define __HAL_ADC_IT_SEQ2_DMA_FIN(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCIE_RISCV,ADC_IE_FORRISCV_SEQ2_DMA_FIN) +#define __HAL_ADC_MASK_ALL_IT(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->ADCIE_RISCV,0) + +/* + *brief SADC 中断状态清除寄存器:0x10 + */ +#define __HAL_ADC_CLEAN_IT_FLAG(__HANDLE__,__FLAG__) SET_BIT((__HANDLE__)->Instance->ADCIR_RISCV,__FLAG__) +#define __HAL_ADC_CLEAN_ALL_IT_FLAG(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->ADCIR_RISCV,0xffffffff) +#define __HAL_ADC_GET_IT_FLAG(__HANDLE__) READ_REG((__HANDLE__)->Instance->ADCIR_RISCV) + +/* + *brief SADC 控制寄存器:0x14 + */ +#define __HAL_ADC_SEQ0_START(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCCR,ADC_CR_SEQ0_START) +#define __HAL_ADC_SEQ1_START(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCCR,ADC_CR_SEQ1_START) +#define __HAL_ADC_SEQ2_START(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCCR,ADC_CR_SEQ2_START) +#define __HAL_ADC_SEQ0_RESET(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCCR,ADC_CR_SEQ0_RESET) +#define __HAL_ADC_SEQ1_RESET(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCCR,ADC_CR_SEQ1_RESET) +#define __HAL_ADC_SEQ2_RESET(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCCR,ADC_CR_SEQ2_RESET) + +/* + *brief SADC 配置寄存器:0x18 + */ +#define __HAL_ADC_PHY_SEL_EOC(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCCFR,ADC_CFR_PHY_SEL_EOC) +#define __HAL_ADC_PHY_SEL_EN(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCCFR,ADC_CFR_PHY_SEL_EN) +#define __HAL_ADC_PHY_SEL_RESET(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCCFR,ADC_CFR_PHY_RESET) +#define __HAL_ADC_PHY_CLEAN_RESET(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCCFR,ADC_CFR_PHY_RESET) +#define __HAL_ADC_PHY_PD_DISABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCCFR,ADC_CFR_PHY_PD) +#define __HAL_ADC_PHY_PD_ENABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCCFR,ADC_CFR_PHY_PD) +#define __HAL_ADC_BREAK_MD(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCCFR,ADC_CFR_BREAK_MD) +#define __HAL_ADC_SEQ2_PRI(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCCFR,ADC_CFR_SEQ2_PRI,(VAL << ADC_CFR_SEQ2_PRI_Pos)) +#define __HAL_ADC_SEQ1_PRI(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCCFR,ADC_CFR_SEQ1_PRI,(VAL << ADC_CFR_SEQ1_PRI_Pos)) +#define __HAL_ADC_SEQ0_PRI(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCCFR,ADC_CFR_SEQ0_PRI,(VAL << ADC_CFR_SEQ0_PRI_Pos) + +/* + *brief SADC 时钟寄存器:0x1c + */ +#define __HAL_ADC_CLK_DIV(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCCLKR0,ADC_CLKR0_ADCCLK_DIV,(VAL << ADC_CLKR0_ADCCLK_DIV_Pos)) +#define __HAL_ADC_SEQ1_CONTCLK_DIV(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCCLKR0,ADC_CLKR0_SEQ1_CONTCLK_DIV,(VAL << ADC_CLKR0_SEQ1_CONTCLK_DIV_Pos)) + +/* + *brief SADC 时钟寄存器:0x20 + */ +#define __HAL_ADC_SEQ1_DLYCLK_DIV(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCCLKR1,ADC_CLKR1_SEQ1_DLYCLK_DIV,(VAL << ADC_CLKR1_SEQ1_DLYCLK_DIV_Pos)) + +/* + *brief SADC 时钟寄存器:0x24 + */ +#define __HAL_ADC_SEQ2_DLYCLK_DIV(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCCLKR2,ADC_CLKR2_SEQ2_DLYCLK_DIV,(VAL << ADC_CLKR2_SEQ2_DLYCLK_DIV_Pos)) + +/* + *brief SADC watchdog 控制寄存器:0x2c-0x68 + */ +#define __HAL_ADC_AWD_CRn_HTR_EN(__HANDLE__,I) SET_BIT((__HANDLE__)->Instance->ADCAWD_CRn[I],ADC_AWD_CRn_HTR_EN) +#define __HAL_ADC_AWD_CRn_HTR(__HANDLE__,I,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCAWD_CRn[I],ADC_AWD_CRn_HTR,(VAL << ADC_AWD_CRn_HTR_Pos)) +#define __HAL_ADC_AWD_CRn_LTR_EN(__HANDLE__,I) SET_BIT((__HANDLE__)->Instance->ADCAWD_CRn[I],ADC_AWD_CRn_LTR_EN) +#define __HAL_ADC_AWD_CRn_LTR(__HANDLE__,I,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCAWD_CRn[I],ADC_AWD_CRn_LTR,(VAL << ADC_AWD_CRn_LTR_Pos)) + +/* + *brief SADC watchdog 中断状态清除寄存器:0x6c + */ +#define __HAL_ADC_CLEAN_AWD_IT_FLAG(__HANDLE__,__FLAG__) SET_BIT((__HANDLE__)->Instance->ADCAWD_SR,__FLAG__) + +/* + *brief SADC WATCHDOG中断控制器:0x74 + */ +#define __HAL_ADC_AWD_IT_CH0_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH0_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH1_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH1_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH2_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH2_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH3_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH3_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH4_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH4_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH5_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH5_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH6_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH6_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH7_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH7_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH8_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH8_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH9_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH9_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH10_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH10_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH11_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH11_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH12_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH12_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH13_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH13_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH14_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH14_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH15_LTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH15_LTR_FLG) +#define __HAL_ADC_AWD_IT_CH0_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH0_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH1_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH1_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH2_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH2_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH3_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH3_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH4_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH4_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH5_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH5_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH6_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH6_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH7_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH7_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH8_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH8_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH9_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH9_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH10_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH10_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH11_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH11_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH12_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH12_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH13_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH13_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH14_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH14_HTR_FLG) +#define __HAL_ADC_AWD_IT_CH15_HTR_EN(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCAWD_IM_RISCV,ADC_AWD_IM_FORRISCV_CH15_HTR_FLG) + +/* + *brief SADC WATCHDOG获取中断标志 + */ +#define __HAL_ADC_GET_AWD_IT_FLAG(__HANDLE__) READ_REG((__HANDLE__)->Instance->ADCAWD_IF_RISCV) + + +/* + *brief SADC SEQ0控制寄存器:0x100 + */ +#define __HAL_ADC_SEQ0_CHNUM_EN(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCSEQ0_CR,ADC_SEQ0_CR_CH_NUM_EN) +#define __HAL_ADC_SEQ0_LEN(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ0_CR,ADC_SEQ0_CR_LEN,(VAL << ADC_SEQ0_CR_LEN_Pos)) + +/* + *brief SADC SEQ0通道转换控制器:0x104 + */ +#define __HAL_ADC_SEQ0_CNR0(__HANDLE__,VAL) WRITE_REG((__HANDLE__)->Instance->ADCSEQ0_CNR0,VAL) + +/* + *brief SADC SEQ0数据控制寄存器0x108 + */ +#define __HAL_ADC_SEQ0_DRT_CUS(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ0_DCR,ADC_SEQ0_DCR_DRT_CUSALL,(VAL << ADC_SEQ0_DCR_DRT_CUS0_Pos)) +#define __HAL_ADC_SEQ0_DRT(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCSEQ0_DCR,ADC_SEQ0_DCR_DRT) + +/* + *brief SADC SEQ0数据寄存器0 :0x10c + */ +#define __HAL_ADC_SEQ0_READ_DR0(__HANDLE__) READ_REG((__HANDLE__)->Instance->ADCSEQ0_DR0) + +/* + *brief SADC SEQ0数据寄存器0 :0x110 + */ +#define __HAL_ADC_SEQ0_READ_DR1(__HANDLE__) READ_REG((__HANDLE__)->Instance->ADCSEQ0_DR1) + +/* + *brief SADC SEQ1控制寄存器:0x200 + */ +#define __HAL_ADC_SEQ1_STORAGE(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ1_CR,ADC_SEQ1_CR_STORAGEALL,(VAL << ADC_SEQ1_CR_STORAGE0_Pos)) +#define __HAL_ADC_SEQ1_LEN(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ1_CR,ADC_SEQ1_CR_LEN,(VAL << ADC_SEQ1_CR_LEN_Pos)) +#define __HAL_ADC_SEQ1_EXT_TCU_SEL(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ1_CR,ADC_SEQ1_CR_EXT_TCU_CH_SEL,(VAL << ADC_SEQ1_CR_EXT_TCU_CH_SEL_Pos)) +#define __HAL_ADC_SEQ1_EXTSEL(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ1_CR,ADC_SEQ1_CR_EXTSEL,(VAL << ADC_SEQ1_CR_EXTSEL_Pos)) +#define __HAL_ADC_SEQ1_COUT_GLEN(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ1_CR,ADC_SEQ1_CR_CONT_GLEN,(VAL << ADC_SEQ1_CR_CONT_GLEN_Pos)) +#define __HAL_ADC_SEQ1_CONT_EN(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCSEQ1_CR,ADC_SEQ1_CR_CONT_EN) +#define __HAL_ADC_SEQ1_CONT_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCSEQ1_CR,ADC_SEQ1_CR_CONT_EN) +#define __HAL_ADC_SEQ1_CH_NUM_EN(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCSEQ1_CR,ADC_SEQ1_CR_CH_NUM_EN) + +/* + *brief SADC SEQ1通道转换寄存器0:0x204 + */ +#define __HAL_ADC_SEQ1_CNR0(__HANDLE__,VAL) WRITE_REG((__HANDLE__)->Instance->ADCSEQ1_CNR0,VAL) + +/* + *brief SADC SEQ1数据寄存器1:0x208 + */ +#define __HAL_ADC_SEQ1_CNR1(__HANDLE__,VAL) WRITE_REG((__HANDLE__)->Instance->ADCSEQ1_CNR1,VAL) + +/* + *brief SADC SEQ1 数据控制寄存器 :0x20c + */ +#define __HAL_ADC_SEQ1_DRT_CUS(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ1_DCR,ADC_SEQ1_DCR_DRT_CUSALL,(VAL << ADC_SEQ1_DCR_DRT_CUS0_Pos)) +#define __HAL_ADC_SEQ1_DRT(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ1_DCR,ADC_SEQ1_DCR_DRT,(VAL << ADC_SEQ1_DCR_DRT_Pos)) +#define __HAL_ADC_SEQ1_DMA_EN(__HANDLE__) SET_BIT((__HANDLE__)->Instance->ADCSEQ1_DCR,ADC_SEQ1_DCR_DMA_MD) +#define __HAL_ADC_SEQ1_DMA_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->ADCSEQ1_DCR,ADC_SEQ1_DCR_DMA_MD) +#define __HAL_ADC_SEQ1_READ_FIFO_CNT(__HANDLE__) (READ_REG((__HANDLE__)->Instance->ADCSEQ1_DCR)) &0x3f +/* + *brief SADC SEQ1 数据寄存器 :0x210 + */ +#define __HAL_ADC_SEQ1_READ_DR(__HANDLE__) READ_REG((__HANDLE__)->Instance->ADCSEQ1_DR) + +/* + *brief SADC SEQ1 序列转换延迟时间寄存器 :0x214-230 序列转换延迟周期的个数 + */ +#define __HAL_ADC_SEQ1_SINGULAR_DLY(__HANDLE__,I,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ1_DLYn[I],ADC_SEQ1_DLYn_DLY_CNT1_3_5_7_9_11_13_15, (VAL << ADC_SEQ1_DLYn_DLY_CNT1_3_5_7_9_11_13_15_Pos)) +#define __HAL_ADC_SEQ1_DUAL_DLY(__HANDLE__,I,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ1_DLYn[I],ADC_SEQ1_DLYn_DLY_CNT0_2_4_6_8_10_11_12_14,(VAL << ADC_SEQ1_DLYn_DLY_CNT0_2_4_6_8_10_11_12_14_Pos)) + +/* + *brief SADC SEQ1 分组转换延迟时间寄存器 :0x234-250 分组转换延迟周期的个数 + */ +#define __HAL_ADC_SEQ1_CONT_CNT(__HANDLE__,I,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ1_CONT_CRn[I],ADC_SEQ1_CONT_CRn_CONT_CNT,(VAL << ADC_SEQ1_CONT_CRn_CONT_CNT_Pos)) +#define __HAL_ADC_SEQ1_CONT_CR_LEN(__HANDLE__,I,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ1_CONT_CRn[I],ADC_SEQ1_CONT_CRn_LEN,(VAL << ADC_SEQ1_CONT_CRn_LEN_Pos)) + + +/* + *brief SADC SEQ1 读取fifo次数寄存器 + */ +#define __HAL_ADC_SET_SEQ1_RCNT_MAX(__HANDLE__,VAL) MODIFY_REG((__HANDLE__)->Instance->ADCSEQ1_RCNT,ADC_SEQ1_RCNT_MAX,(VAL << ADC_SEQ1_RCNT_MAX_Pos)) +#define __HAL_ADC_READ_SEQ1_RCNT_CNT(__HANDLE__) READ_REG((__HANDLE__)->Instance->ADCSEQ1_RCNT)&0xffff + + +/** + * @} + */ +/* 5. 导出函数申明 Exported Funcs --------------------------------------- */ +/** + * @defgroup SADC_exported_funcs SADC 导出函数申明 Exported Funcs + * @{ + */ + +HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc); /*!< ADC 外围设备初始化 */ +HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc); /*!< ADC 取消外围设备初始化 */ +__weak void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc); /*!< ADC MCU相关初始化 */ +__weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc); /*!< ADC 取消MCU相关初始化 */ + + +#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) +HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, + HAL_ADC_CallbackIDTypeDef CallbackID, pADC_CallbackTypeDef pCallback); /*!< ADC 注册回调函数 */ +HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, + HAL_ADC_CallbackIDTypeDef CallbackID); /*!< ADC 取消注册回调函数 */ +#endif + +HAL_StatusTypeDef HAL_ADC_ConfigSeq(ADC_HandleTypeDef *hadc, ADC_ChannelConfTypeDef *sConfig); /*!< ADC 序列配置*/ +int *HAL_ADC_GetValue(ADC_HandleTypeDef *hadc); /*!< ADC 获取转换后的数据*/ +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转换回调函数,需要用户自定义*/ + + +/** + * @} + */ +/* 6. 导出变量申明 (Exported Variables) --------------------------------- */ +/** + * @defgroup SADC_exported_var SADC 导出变量申明 (Exported Variables) + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 7. 私有类型定义 (Private Types) -------------------------------------- */ +/** + * @defgroup SADC_private_types SADC 私有类型定义 (Private Types) + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 8. 私有常量定义Private Constants ------------------------------------- */ +/** + * @defgroup SADC_private_constants SADC 私有常量定义Private Constants + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 9. 私有宏定义 (Private Macros) -------------------------------------- */ +/** + * @defgroup SADC_private_macros SADC 私有宏定义 (Private Macros) + * @{ + */ +#define IS_ADC_ALL_INSTANCE(__INSTANCE__) ((__INSTANCE__) == SADC_Instance) + +#define ADC_CLEAR_ERRORCODE(__HANDLE__) ((__HANDLE__)->ErrorCode = HAL_ADC_ERROR_NONE) + +/** + * @} + */ +/* 10. 私有函数申明 (Private Funcs) ------------------------------------- */ +/** + * @defgroup SADC_private_funcs SADC 私有函数申明 (Private Funcs) + * @{ + */ + + +/** + * @} + */ +/* 11. 私有变量申明 Private Variables ----------------------------------- */ +/** + * @defgroup SADC_private_var SADC 私有变量申明 (Private Variables) + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif +#endif /* __X2600_HAL_SADC_H__ */ diff --git a/drivers/drivers-x2600/include/x2600_ll_sadc.h b/drivers/drivers-x2600/include/x2600_ll_sadc.h new file mode 100644 index 0000000000000000000000000000000000000000..677ff2e26bb8284beb7d3e2a4507e06aeff56ff4 --- /dev/null +++ b/drivers/drivers-x2600/include/x2600_ll_sadc.h @@ -0,0 +1,166 @@ +/** + * @file x2600_ll_sadc.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 __X2600_LL_SADC_H__ +#define __X2600_LL_SADC_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @addtogroup group_SADC + * @{ + */ + +/** + * @addtogroup g_X2600_SADC_LL_Driver SADC LL 驱动 + * @{ + */ + +/* 1. 头文件 (Includes)----------------------------------------------- */ +//删除此行,添加内容 +//删除此行,添加内容 +/* 2. 导出的类型 (Exported Types)--------------------------------------- */ +/** + * @defgroup SADC_exported_types SADC 导出的类型 (Exported Types) + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 3. 导出常量定义 Exported Constants ----------------------------------- */ +/** + * @defgroup SADC_exported_constants SADC 导出的常量 Exported Constants + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 4. 导出宏定义 Exported Macros --------------------------------------- */ +/** + * @defgroup SADC_exported_macros SADC 导出宏 Exported Macros + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 5. 导出函数申明 Exported Funcs --------------------------------------- */ +/** + * @defgroup SADC_exported_funcs SADC 导出函数申明 Exported Funcs + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 6. 导出变量申明 (Exported Variables) --------------------------------- */ +/** + * @defgroup SADC_exported_var SADC 导出变量申明 (Exported Variables) + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 7. 私有类型定义 (Private Types) -------------------------------------- */ +/** + * @defgroup SADC_private_types SADC 私有类型定义 (Private Types) + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 8. 私有常量定义Private Constants ------------------------------------- */ +/** + * @defgroup SADC_private_constants SADC 私有常量定义Private Constants + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 9. 私有宏定义 (Private Macros) -------------------------------------- */ +/** + * @defgroup SADC_private_macros SADC 私有宏定义 (Private Macros) + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 10. 私有函数申明 (Private Funcs) ------------------------------------- */ +/** + * @defgroup SADC_private_funcs SADC 私有函数申明 (Private Funcs) + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 11. 私有变量申明 Private Variables ----------------------------------- */ +/** + * @defgroup SADC_private_var SADC 私有变量申明 (Private Variables) + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif +#endif /* __X2600_LL_SADC_H__ */ diff --git a/drivers/drivers-x2600/src/x2600_hal_sadc.c b/drivers/drivers-x2600/src/x2600_hal_sadc.c new file mode 100644 index 0000000000000000000000000000000000000000..8c5731c50b46a28cb0a8ab3d23a0c178474a5a94 --- /dev/null +++ b/drivers/drivers-x2600/src/x2600_hal_sadc.c @@ -0,0 +1,569 @@ +/** + * @file x2600_hal_sadc.c + * @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. + @verbatim + ============================================================================== + ##### 使用说明 ##### + ============================================================================== + [特点] + (#) 支持12bit 12通道采样 有三个可自定义的转换序列. + (#) 支持单次 连续 扫描等多种转换模式. + (#) 具有看门狗功能 能检测输入电压是否超过用户设置的阈值 + + SEQ0 SEQ1 SEQ2 + +序列最大长度 4 16 8 + +转换方式 扫描转换 √ √ √ + + 连续转换 √ √ + + 分组连续转换 √ + +触发方式 寄存器触发 √ √ √ + +外部TCU触发(time和GPIO) √ √ + +可配置转换间的延迟时间 √ √ + +可配置是否保存数据 √ √ +数据存取方式 4个寄存器 32深度FIFO 16深度FIFO + +支持DMA √ √ + + @endverbatim + */ + +/* 1.头文件 (Includes)------------------------------------------------ */ +#include "x2600_hal_sadc.h" +#include "x2600_hal.h" +#include "x2600_hal_lock.h" +/** @addtogroup g_X2600_SADC_HAL_Driver + * @{ + */ + +/* 2.私有常量定义Private Constants -------------------------------------- */ +/** + * @addtogroup SADC_private_constants + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 3. 私有类型定义 (Private Types) -------------------------------------- */ +/** + * @addtogroup SADC_private_types + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 4. 私有宏定义 (Private Macros) -------------------------------------- */ +/** + * @addtogroup SADC_private_macros + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 5. 私有变量申明 Private Variables ------------------------------------ */ +/** + * @addtogroup SADC_private_var + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 6. 私有函数申明 (Private Funcs) -------------------------------------- */ +/** + * @addtogroup SADC_private_funcs + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 7. 私有函数实现 (Private Funcs) -------------------------------------- */ +/** + * @defgroup SADC_private_funcs_impl SADC 私有函数实现 + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 8. 导出函数实现------------------------------------------------------- */ +/** + * @defgroup SADC_exported_funcs_impl SADC 导出函数实现 + * @{ + */ + +/** + *@brief 初始化 ADC MCU相关配置 + *@param 指向包含ADC模块配置信息的ADC_HandleTypeDef结构的hadc指针 + *@retval None + */ +__weak void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc) +{ + /* 防止未使用的参数编译警告 */ + UNUSED(hadc); + /* NOTE : 不应修改此函数,当需要回调时,应在用户文件中实现HAL_ADC_MspInit */ +} + +/** + *@brief 取消初始化 ADC MCU相关配置 + *@param 指向包含ADC模块配置信息的ADC_HandleTypeDef结构的hadc指针 + *@retval None + */ +__weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc) +{ + /* 防止未使用的参数编译警告 */ + UNUSED(hadc); + /* NOTE : 不应修改此函数,当需要回调时,应在用户文件中实现HAL_ADC_MspInit */ +} + +/** + * @brief 完成模数转换调用的回调函数 + * @param 指向包含ADC模块配置信息的ADC_HandleTypeDef结构的hadc指针 + * @retval None + */ +__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) +{ + /* 防止未使用的参数编译警告 */ + UNUSED(hadc); + /* NOTE : 不应修改此函数,当需要回调时,应在用户文件中实现HAL_ADC_MspInit */ +} + + + +/** + *@brief 根据指定的参数初始化ADCx外围设备. + *@param 指向ADC_HandleTypeDef结构的hadc指针,该结构包含指定ADC的配置信息. + *@retval HAL status + */ + +HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc) +{ + HAL_StatusTypeDef tmp_hal_status = HAL_OK; + + /* 检查adc句柄 */ + if(hadc == NULL){ + return HAL_ERROR; + } + + /* 检查参数 */ + assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.EXTEN)); + + if(hadc->State == HAL_ADC_STATE_RESET){ +#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) + if (hadc->MspInitCallback == NULL) { + hadc->MspInitCallback = HAL_ADC_MspInit; + } + + hadc->MspInitCallback(hadc); +#else + HAL_ADC_MspInit(hadc); +#endif + } + /* 掉电 sadc phy */ + __HAL_ADC_PHY_PD_DISABLE(hadc); + + /* 关闭sadc 中断、清空中断标志位 */ + __HAL_ADC_MASK_ALL_IT(hadc); + __HAL_ADC_CLEAN_ALL_IT_FLAG(hadc); + + /* ADC 使能*/ + __HAL_ADC_PHY_PD_ENABLE(hadc); + __HAL_ADC_PHY_SEL_EN(hadc); + __HAL_ADC_PHY_CLEAN_RESET(hadc); + + /* 清ADC错误状态 */ + ADC_CLEAR_ERRORCODE(hadc); + + /* 初始化锁资源 */ + __HAL_Lock_Init(&hadc->Lock); + + hadc->State = HAL_ADC_STATE_READY; + + return tmp_hal_status; +} + +/** + *@brief 取消初始化ADCx外围设备. + *@param 指向ADC_HandleTypeDef结构的hadc指针,该结构包含指定ADC的配置信息. + *@retval HAL status + */ + +HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc) +{ + HAL_StatusTypeDef tmp_hal_status = HAL_OK; + + /* 检查分配的ADC句柄 */ + if (hadc == NULL) { + return HAL_ERROR; + } + + /* 检查参数 */ + assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); + + /* 设置ADC Busy 状态 */ + SET_BIT(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL); + + /* 禁用所选ADC外围设备(Power Down) */ + __HAL_ADC_PHY_PD_DISABLE(hadc); + +#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) + /* 取消初始化MCU相关配置 :GPIO, CLOCK, INTC */ + hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback; + + if (hadc->MspDeInitCallback == NULL) { + hadc->MspDeInitCallback = HAL_ADC_MspDeInit; + } + + hadc->MspDeInitCallback(hadc); +#else + HAL_ADC_MspDeInit(hadc); +#endif + + /* 清ADC错误状态 */ + ADC_CLEAR_ERRORCODE(hadc); + hadc->State = HAL_ADC_STATE_RESET; + + return tmp_hal_status; +} + + +#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) +/** + *@brief 注册要使用的用户ADC回调函数,代替weak函数 + *@param 指向包含指定ADC配置信息的ADC_HandleTypeDef结构的hadc指针 + *@param 要注册的回调的CallbackID + *@param 指向回调函数的pCallback指针 + *@retval HAL 状态 + */ +HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID, pADC_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) { + hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; + return HAL_ERROR; + } + + if ((hadc->State & HAL_ADC_STATE_READY) != 0UL) { + switch (CallbackID) { + case HAL_ADC_CONVERSION_COMPLETE_CB_ID : + hadc->ConvCpltCallback = pCallback; + break; + + case HAL_ADC_MSPINIT_CB_ID : + hadc->MspInitCallback = pCallback; + break; + + case HAL_ADC_MSPDEINIT_CB_ID : + hadc->MspDeInitCallback = pCallback; + break; + + default : + hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; + status = HAL_ERROR; + break; + } + } else if (HAL_ADC_STATE_RESET == hadc->State) { + switch (CallbackID) { + case HAL_ADC_MSPINIT_CB_ID : + hadc->MspInitCallback = pCallback; + break; + + case HAL_ADC_MSPDEINIT_CB_ID : + hadc->MspDeInitCallback = pCallback; + break; + + default : + hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; + status = HAL_ERROR; + break; + } + } else { + hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; + status = HAL_ERROR; + } + + return status; +} + +/** + *@brief 注销ADC回调, ADC回调被重定向到weak函数 + *@param 指向包含指定ADC配置信息的ADC_HandleTypeDef结构的hadc指针 + *@param 要注册的回调的CallbackID + *@param 指向回调函数的pCallback指针 + *@retval HAL 状态 + **/ +HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + if ((hadc->State & HAL_ADC_STATE_READY) != 0UL) { + switch (CallbackID) { + case HAL_ADC_CONVERSION_COMPLETE_CB_ID : + hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback; + break; + + case HAL_ADC_MSPINIT_CB_ID : + hadc->MspInitCallback = HAL_ADC_MspInit; + break; + + case HAL_ADC_MSPDEINIT_CB_ID : + hadc->MspDeInitCallback = HAL_ADC_MspDeInit; + break; + + default : + hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; + status = HAL_ERROR; + break; + } + } else if (HAL_ADC_STATE_RESET == hadc->State) { + switch (CallbackID) { + case HAL_ADC_MSPINIT_CB_ID : + hadc->MspInitCallback = HAL_ADC_MspInit; + break; + + case HAL_ADC_MSPDEINIT_CB_ID : + hadc->MspDeInitCallback = HAL_ADC_MspDeInit; + break; + + default : + hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; + status = HAL_ERROR; + break; + } + } else { + hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; + status = HAL_ERROR; + } + + return status; +} +#endif + +/* + *brief SADC 序列配置函数 + *@param 指向包含指定ADC配置信息的ADC_HandleTypeDef结构的hadc指针 + *@param 指向包含指定ADC配置信息的ADC_HandleTypeDef结构的hadc指针 + **/ + +HAL_StatusTypeDef HAL_ADC_ConfigSeq(ADC_HandleTypeDef *hadc, ADC_ChannelConfTypeDef *sConfig) +{ + + __HAL_Lock(&hadc->Lock); + + hadc->Seq =sConfig->Seq; + hadc->len =sConfig->len; + + /* 序列 0 1 2 的配置: 序列的长度、序列的编号、序列是否使用连续转换 */ + if(sConfig->Seq == SEQ0){ + __HAL_ADC_SEQ0_CNR0(hadc,sConfig->channal0); + __HAL_ADC_SEQ0_CHNUM_EN(hadc); + __HAL_ADC_SEQ0_LEN(hadc,sConfig->len); + + /*使用中断模式或轮询模式*/ + if(sConfig->Is_intc){ + __HAL_ADC_IT_SEQ0_DR(hadc); + }else{ + __HAL_ADC_MASKIT_SEQ0_DR(hadc); + } + }else if(sConfig->Seq == SEQ1){ + __HAL_ADC_SEQ1_LEN(hadc,sConfig->len); + __HAL_ADC_SEQ1_CH_NUM_EN(hadc); + __HAL_ADC_SEQ1_CNR0(hadc,sConfig->channal0); + if(sConfig->len >7){ + __HAL_ADC_SEQ1_CNR1(hadc,sConfig->channal1); + } + + if(sConfig->Is_Cont){ + __HAL_ADC_SEQ1_CONT_EN(hadc); + }else{ + __HAL_ADC_SEQ1_CONT_DISABLE(hadc); + } + + /*使用中断模式或轮询模式*/ + if(sConfig->Is_intc){ + __HAL_ADC_IT_SEQ1_DR(hadc); + }else{ + __HAL_ADC_MASKIT_SEQ1_DR(hadc); + } + }else if(sConfig->Seq == SEQ2){ + }else{ + prom_printk("error seq, reconfigure seq\n"); + return HAL_ERROR; + } + + __HAL_UnLock(&hadc->Lock); + + return HAL_OK; +} + +/** + * @brief ADC中断处理函数 + * @param 中断号irq + * @param 外部参数data + * @retval None + */ +void HAL_ADC_IRQHandler(int irq, void *data) +{ + uint32_t it_flag = 0; + uint32_t wdt_flag= 0; + ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)data; + + it_flag = __HAL_ADC_GET_IT_FLAG(hadc); + + if(it_flag & ADC_IT_SEQ0_DR_FLAG){ + __HAL_ADC_CLEAN_IT_FLAG(hadc,ADC_IT_SEQ0_DR_FLAG); + goto out; + } + if(it_flag & ADC_IT_SEQ1_DR_FLAG){ + __HAL_ADC_CLEAN_IT_FLAG(hadc,ADC_IT_SEQ1_DR_FLAG); + goto out; + } + if(it_flag & ADC_IT_SEQ2_DR_FLAG){ + __HAL_ADC_CLEAN_IT_FLAG(hadc,ADC_IT_SEQ2_DR_FLAG); + goto out; + } + return ; + +out: + /* 完成模数转换调用回调函数 */ +#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) + hadc->ConvCpltCallback(hadc); +#else + HAL_ADC_ConvCpltCallback(hadc); +#endif +} + +/** + * @brief 获取ADC模数转换的数据 + * @param 指向包含指定ADC配置信息的ADC_HandleTypeDef结构的hadc指针 + * @retval 获取的序列转换的数据 + */ + +int *HAL_ADC_GetValue(ADC_HandleTypeDef *hadc) +{ + static int Seq0[2]; + static int Seq1[16]; + static int Seq2[8]; + unsigned int i =0; + unsigned int fifo_val=0; + + + if(hadc->Seq == SEQ0){ + Seq0[0]= __HAL_ADC_SEQ0_READ_DR0(hadc); + if(hadc->len > 1){ + Seq0[1]=__HAL_ADC_SEQ0_READ_DR1(hadc); + } + + return Seq0; + } + if(hadc->Seq == SEQ1){ + fifo_val = __HAL_ADC_SEQ1_READ_FIFO_CNT(hadc); + for(i=0; iState != HAL_ADC_STATE_READY) { + return HAL_ERROR; + } + + __HAL_Lock(&hadc->Lock); + + /* 使能转换序列 */ + if(hadc->Seq == SEQ0){ + __HAL_ADC_SEQ0_START(hadc); + }else if(hadc->Seq == SEQ1){ + __HAL_ADC_SEQ1_START(hadc); + }else{ + __HAL_ADC_SEQ2_START(hadc); + } + __HAL_UnLock(&hadc->Lock); + + return HAL_OK; +} + +/** + * @brief ADC通道模数转换停止 + * @param 指向包含指定ADC配置信息的ADC_HandleTypeDef结构的hadc指针 + * @retval HAL 状态 + */ +HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc) +{ + if (hadc->State != HAL_ADC_STATE_READY) { + return HAL_ERROR; + } + + __HAL_Lock(&hadc->Lock); + + /* 使能转换序列 */ + if(hadc->Seq == SEQ0){ + __HAL_ADC_SEQ0_RESET(hadc); + }else if(hadc->Seq == SEQ1){ + __HAL_ADC_SEQ1_RESET(hadc); + }else{ + __HAL_ADC_SEQ2_RESET(hadc); + } + __HAL_UnLock(&hadc->Lock); + + return HAL_OK; +} + + + +/** + * @} + */ + +/** + * @} + */ diff --git a/drivers/drivers-x2600/src/x2600_ll_sadc.c b/drivers/drivers-x2600/src/x2600_ll_sadc.c new file mode 100644 index 0000000000000000000000000000000000000000..0d5834288bfa01b9a307b80945ef957343a6570a --- /dev/null +++ b/drivers/drivers-x2600/src/x2600_ll_sadc.c @@ -0,0 +1,121 @@ +/** + * @file x2600_ll_sadc.c + * @author MPU系统软件部团队 + * @brief 该文件提供固件功能,用于管理模数转换器(ADC)外围设备的以下功能: + * +初始化和反初始化功能 + * +IO操作功能 + * + * @copyright 版权所有 (北京君正集成电路股份有限公司) {2023} + * @copyright Copyright© 2023 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. + @verbatim + ============================================================================== + ##### 使用说明 ##### + ============================================================================== + [特点] + (#)支持12bit 16通道采样 有三个可自定义的转换序列 + (#)支持单次、连续、扫描等多种转换模式。 + (#)具有看门狗功能,能检测输入电压是否超过用户设置的阈值。 + @endverbatim + */ + +/* 1.头文件 (Includes)------------------------------------------------ */ + +#include "x2600_hal.h" + +/** @addtogroup g_X2600_SADC_LL_Driver + * @{ + */ + +/* 2.私有常量定义Private Constants -------------------------------------- */ +/** + * @addtogroup SADC_private_constants + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 3. 私有类型定义 (Private Types) -------------------------------------- */ +/** + * @addtogroup SADC_private_types + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 4. 私有宏定义 (Private Macros) -------------------------------------- */ +/** + * @addtogroup SADC_private_macros + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 5. 私有变量申明 Private Variables ------------------------------------ */ +/** + * @addtogroup SADC_private_var + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 6. 私有函数申明 (Private Funcs) -------------------------------------- */ +/** + * @addtogroup SADC_private_funcs + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 7. 私有函数实现 (Private Funcs) -------------------------------------- */ +/** + * @defgroup SADC_private_funcs_impl SADC 私有函数实现 + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ +/* 8. 导出函数实现------------------------------------------------------- */ +/** + * @defgroup SADC_exported_funcs_impl SADC 导出函数实现 + * @{ + */ + +// 删除此行, 添加内容 +// 删除此行, 添加内容 + +/** + * @} + */ + +/** + * @} + */ diff --git a/projects/x2660-halley/Examples/adc/.vscode/cmake-kits.json b/projects/x2660-halley/Examples/adc/.vscode/cmake-kits.json new file mode 100644 index 0000000000000000000000000000000000000000..e9582fe33014473bf341fbc830ad74c0aa07a2c3 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/.vscode/cmake-kits.json @@ -0,0 +1,18 @@ +[ + { + "name": "RISCV GCC for ingenic cross compile on Windows", + + "toolchainFile": "riscv32-gcc.cmake", + "preferredGenerator": { + "name":"MinGW Makefiles" + } + }, + { + "name": "RISCV GCC for ingenic cross compile on Linux", + "toolchainFile": "riscv32-gcc.cmake", + "preferredGenerator": { + "name":"Unix Makefiles" + } + } +] + \ No newline at end of file diff --git a/projects/x2660-halley/Examples/adc/.vscode/launch.json b/projects/x2660-halley/Examples/adc/.vscode/launch.json new file mode 100644 index 0000000000000000000000000000000000000000..617a05ab10014630b8e312aaf86f2ff06444a181 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/.vscode/launch.json @@ -0,0 +1,55 @@ +{ + "version": "0.2.0", + "configurations": [ + // GDB Debugging: + { + "program": "${command:cmake.launchTargetPath}", + "name": "Launch (gdb)", + "request": "launch", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "openOnSessionStart", + "type": "cppdbg", + "MIMode": "gdb", + "miDebuggerPath": "riscv32-ingenicv0-elf-gdb", + "miDebuggerArgs": "", + "miDebuggerServerAddress": "localhost:3333", + "targetArchitecture": "mips", + "preLaunchTask": "adb forward", + "customLaunchSetupCommands": [ + { + "description": "gdb 启用整齐打印", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "text":"cd ${workspaceFolder}", + "ignoreFailures": false + }, + { + "text":"file build/${command:cmake.buildType}/${command:cmake.launchTargetFilename}", + "ignoreFailures": false + }, + { + "text": "target remote localhost:3333", + "ignoreFailures": false + }, + { + "text": "monitor reset halt", + "ignoreFailures": false + }, + { + "text": "load", + "ignoreFailures": false + } + ], + "logging": { + "engineLogging": false, + "programOutput": true + } + } + ] + } + \ No newline at end of file diff --git a/projects/x2660-halley/Examples/adc/.vscode/settings.json b/projects/x2660-halley/Examples/adc/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..872b961e85cbaa315c582bff1c82e4e5070e9f89 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "cmake.buildDirectory": "${workspaceFolder}/build/${buildType}", + "files.associations": { + "*.build": "makefile", + "*.mk": "makefile", + "Makefile*": "makefile" + } +} diff --git a/projects/x2660-halley/Examples/adc/.vscode/tasks.json b/projects/x2660-halley/Examples/adc/.vscode/tasks.json new file mode 100644 index 0000000000000000000000000000000000000000..53b4731ee6a20f793285233363f06a966abe8d27 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "adb forward", + "type": "shell", + "command": "adb forward tcp:3333 tcp:3333", + }, + ] +} \ No newline at end of file diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/CMakeLists.txt b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/CMakeLists.txt new file mode 100755 index 0000000000000000000000000000000000000000..c365bc74d75ae43ebb024dc66e31c2f8ba851032 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/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_it/Makefile b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..c1946e2de2262ef897fc98746f7361057b672dc6 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/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_it/README.md b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8c20233185b487a4e068da2e81eed35477855bb6 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/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_it/include/board_eth_phy_conf.h b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/include/board_eth_phy_conf.h new file mode 100644 index 0000000000000000000000000000000000000000..c907ead4a2298d34794f0491a29781cf67ffdb68 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/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_it/include/x2600_hal_conf.h b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/include/x2600_hal_conf.h new file mode 100644 index 0000000000000000000000000000000000000000..bdada2a1260273bcb9ba64e6d3aae149dc206e22 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/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_it/include/x2600_sysclk_conf.h b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/include/x2600_sysclk_conf.h new file mode 100644 index 0000000000000000000000000000000000000000..2126aba0a20f4eeb6815996fe9550f9a0aacb380 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/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_it/main.c b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/main.c new file mode 100644 index 0000000000000000000000000000000000000000..9e803c98ac1fc41b0c9dc99fb2851852331206a6 --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/main.c @@ -0,0 +1,151 @@ +#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(); + } + + /* 注册中断 */ + ll_request_irq(IRQ_INTC0_SADC, HAL_ADC_IRQHandler, (void *)&AdcHandle); + + /* 配置ADC 序列 */ + sConfig.Seq =SEQ1; + sConfig.Is_intc =ENABLE; + 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 (UartReady != SET); + 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); + } + + UartReady = RESET; + } + + + + return 0; +} + +void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *AdcHandle) +{ + seq1 = HAL_ADC_GetValue(AdcHandle); + UartReady = SET; +} + +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_it/riscv32-gcc.cmake b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/riscv32-gcc.cmake new file mode 100644 index 0000000000000000000000000000000000000000..d09813df61ac4d343b4b4890668528bf54e9cedc --- /dev/null +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/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)