From fa5c94f990cad79d234accd285642c2e073639bd Mon Sep 17 00:00:00 2001 From: ruizhao_bj Date: Mon, 22 May 2023 16:44:51 +0800 Subject: [PATCH] [Update] update sadc cpm interface and projects gpio interface. --- drivers/drivers-x2600/include/x2600_ll_cpm.h | 32 ++++++++ drivers/drivers-x2600/src/x2600_ll_cpm.c | 73 +++++++++++++++++++ .../Examples/adc/adc_ContConversion/Makefile | 2 + .../Examples/adc/adc_ContConversion/main.c | 23 ++++++ .../adc/adc_ExtTrigger_Watchdog/Makefile | 2 + .../adc/adc_ExtTrigger_Watchdog/main.c | 26 +++++++ .../adc/adc_ScanConversion_it/Makefile | 2 + .../Examples/adc/adc_ScanConversion_it/main.c | 21 ++++++ .../adc/adc_ScanConversion_polling/Makefile | 2 + .../adc/adc_ScanConversion_polling/main.c | 22 ++++++ 10 files changed, 205 insertions(+) diff --git a/drivers/drivers-x2600/include/x2600_ll_cpm.h b/drivers/drivers-x2600/include/x2600_ll_cpm.h index bc81f4ec..8a455960 100755 --- a/drivers/drivers-x2600/include/x2600_ll_cpm.h +++ b/drivers/drivers-x2600/include/x2600_ll_cpm.h @@ -163,6 +163,20 @@ typedef struct { * @} */ +/** + * @name SADC Exported CGU macro + * @{ + */ +#define SADCCDR_CONFIG (0UL) +#define SADCCDR_SCLK_A (0UL << SADCCDR_SADCCS_Pos) +#define SADCCDR_MPLL (1UL << SADCCDR_SADCCS_Pos) +#define SADCCDR_EPLL (2UL << SADCCDR_SADCCS_Pos) +/** + * @} + */ + + + /** * @name PWM Exported CGU macro * @{ @@ -283,6 +297,8 @@ typedef struct { /* 5. Exported Funcs ---------------------------------------------- */ HAL_StatusTypeDef CPM_CGU_PWM_Start(CPM_TypeDef *CPMx, LL_CPM_CGU_ConfigTypeDef *Config); HAL_StatusTypeDef CPM_CGU_PWM_Stop(CPM_TypeDef *CPMx); +HAL_StatusTypeDef CPM_CGU_SADC_Start(CPM_TypeDef *CPMx, LL_CPM_CGU_ConfigTypeDef *Config); +HAL_StatusTypeDef CPM_CGU_SADC_Stop(CPM_TypeDef *CPMx); #if 0 HAL_StatusTypeDef CPM_CGU_I2S0_Config(CPM_TypeDef *CPMx, LL_CPM_CGU_I2STypeDef *Config); HAL_StatusTypeDef CPM_CGU_I2S1_Config(CPM_TypeDef *CPMx, LL_CPM_CGU_I2STypeDef *Config); @@ -460,6 +476,22 @@ FunctionalState CPM_GATE_IsEnable(CPM_TypeDef *CPMx, uint32_t Clkid); * @} */ +/** + * @name SADC CGU macro + * @{ + */ +#define SADCCDR_CONTROL_MASK (SADCCDR_CE_SADC_Msk | SADCCDR_SADC_BUSY_Msk | SADCCDR_SADC_STOP_Msk) +#define SADCCDR_MUX_DIV_MASK (SADCCDR_SADC_Msk | SADCCDR_SADCCDR_Msk) +#define SADCCDR_CONFIG_MASK (SADCCDR_S_CLK1_SEL_Msk) + +#define IS_SADCCDR_CONFIG(val) ((val) == 0) +#define IS_SADCCDR_DIV(val) ((val) < 0x100) +#define IS_SADCCDR_PLLMUX(val) (((val) == SADCCDR_SCLK_A) || ((val) == SADCCDR_MPLL) || ((val) == SADCCDR_EPLL)) +/** + * @} + */ + + /** * @name CIM CGU macro * @{ diff --git a/drivers/drivers-x2600/src/x2600_ll_cpm.c b/drivers/drivers-x2600/src/x2600_ll_cpm.c index b524bdbe..a3c93c2d 100755 --- a/drivers/drivers-x2600/src/x2600_ll_cpm.c +++ b/drivers/drivers-x2600/src/x2600_ll_cpm.c @@ -928,6 +928,79 @@ HAL_StatusTypeDef CPM_CGU_CAN1_Stop(CPM_TypeDef *CPMx) #endif +/** + * @brief 配置SADC CGU时钟分频比,并打开时钟 + * @param CPMx: 指向CPMx的基地址 + * @param Config: 描述配置内容 + * @retval HAL Status. + */ + +HAL_StatusTypeDef CPM_CGU_SADC_Start(CPM_TypeDef *CPMx, LL_CPM_CGU_ConfigTypeDef *Config) +{ + uint32_t val; + uint32_t config; + uint32_t count; + /* 参数检查 */ + assert_param(IS_CPM_INSTALL(CPMx)); + assert_param(IS_SADCCDR_CONFIG(Config->Config)); + assert_param(IS_SADCCDR_DIV(Config->Div)); + assert_param(IS_SADCCDR_PLLMUX(Config->PLLMux)); + /* 读取SADCCDR寄存器值*/ + val = READ_REG(CPMx->SADCCDR); + val |= SADCCDR_CE_SADC; + /* 如果已打开时钟,先关闭时钟*/ + if (val & SADCCDR_SADC_STOP_Msk) { + val |= SADCCDR_SADC_STOP; + WRITE_REG(CPMx->SADCCDR, val); + count = SystemCoreClock / 8U / 1000U * 8; + /*等待BUSY. */ + while (--count && (READ_REG(CPMx->SADCCDR) & SADCCDR_SADC_BUSY)); + if (count == 0) { + return HAL_TIMEOUT; + } + } + /* 重新配时钟,并打开时钟*/ + config = Config->Div | Config->PLLMux | Config->Config; + WRITE_REG(CPMx->SADCCDR, config | SADCCDR_CE_SADC); + count = SystemCoreClock / 8U / 1000U * 8; + /* 等待时钟稳定 */ + while (--count && (READ_REG(CPMx->SADCCDR) & SADCCDR_SADC_BUSY)); + if (count == 0) { + return HAL_TIMEOUT; + } + /* 去掉CE_ENABLE.保护防止误操作 */ + WRITE_REG(CPMx->SADCCDR, config); + return HAL_OK; +} + +/** + * @brief 停止SADCCGU的时钟 + * @param CPMx: 指向CPMx的基地址 + * @retval HAL Status. + */ + +HAL_StatusTypeDef CPM_CGU_SADC_Stop(CPM_TypeDef *CPMx) +{ + uint32_t val; + uint32_t count; + /* 参数检查 */ + assert_param(IS_CPM_INSTALL(CPMx)); + /* 读取MSC0CDR寄存器值*/ + val = READ_REG(CPMx->SADCCDR); + /* 使能CE_ENABLE */ + val |= SADCCDR_CE_SADC; + /* 如果已打开时钟,才关闭时钟*/ + if (val & SADCCDR_SADC_STOP_Msk) { + val |= SADCCDR_SADC_STOP; + WRITE_REG(CPMx->SADCCDR, val); + count = SystemCoreClock / 8U / 1000U * 8; + while (--count && (READ_REG(CPMx->SADCCDR) & SADCCDR_SADC_BUSY)); + if (count == 0) { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} /** * @brief 配置PWMCGU时钟分频比,并打开时钟 * @param CPMx: 指向CPMx的基地址 diff --git a/projects/x2660-halley/Examples/adc/adc_ContConversion/Makefile b/projects/x2660-halley/Examples/adc/adc_ContConversion/Makefile index c1946e2d..1e7bbaab 100644 --- a/projects/x2660-halley/Examples/adc/adc_ContConversion/Makefile +++ b/projects/x2660-halley/Examples/adc/adc_ContConversion/Makefile @@ -33,6 +33,8 @@ $(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)/drivers/drivers-x2600/src/x2600_ll_cpm.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_ll_gpio.c \ $(SDK_PATH)/lib/libc/minimal/vsprintf.c \ $(SDK_PATH)/lib/libc/minimal/string.c \ $(SDK_PATH)/lib/libc/minimal/ctype.c \ diff --git a/projects/x2660-halley/Examples/adc/adc_ContConversion/main.c b/projects/x2660-halley/Examples/adc/adc_ContConversion/main.c index 7604fed2..1d826eb8 100644 --- a/projects/x2660-halley/Examples/adc/adc_ContConversion/main.c +++ b/projects/x2660-halley/Examples/adc/adc_ContConversion/main.c @@ -6,11 +6,31 @@ ADC_HandleTypeDef AdcHandle; __IO ITStatus UartReady = RESET; static int *seq1 =NULL; +/* APLL,1.2G 39+1=40分频,30M + * SADC phy工作时钟最高为30M,不建议修改 + */ +LL_CPM_CGU_ConfigTypeDef CGU_Config_ADC_30000000 = { + 0,39, 0 +}; + + #ifdef TEST_ADC_DEBUG static void dump_adc_regs(void); #endif static void Error_Handler(void); +void adc_setup(void) +{ + int i; + + CPM_GATE_Enable(CPM_Instance, CPM_CLKID_SADC); + + CPM_CGU_SADC_Start(CPM_Instance, &CGU_Config_ADC_30000000); + + for(i=5;i<21;i++){ + LL_GPIO_setPinMode(PB_Instance, i, GPIO_MODE_FUNCTION0); + } +} int main(void) { @@ -24,6 +44,9 @@ int main(void) AdcHandle.Instance = SADC_Instance; AdcHandle.Init.EXTEN = DISABLE; + /*ADC 初始化时钟、GPIO*/ + adc_setup(); + /* 取消初始化ADC外围设备 */ if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK) { Error_Handler(); diff --git a/projects/x2660-halley/Examples/adc/adc_ExtTrigger_Watchdog/Makefile b/projects/x2660-halley/Examples/adc/adc_ExtTrigger_Watchdog/Makefile index c1946e2d..1e7bbaab 100644 --- a/projects/x2660-halley/Examples/adc/adc_ExtTrigger_Watchdog/Makefile +++ b/projects/x2660-halley/Examples/adc/adc_ExtTrigger_Watchdog/Makefile @@ -33,6 +33,8 @@ $(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)/drivers/drivers-x2600/src/x2600_ll_cpm.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_ll_gpio.c \ $(SDK_PATH)/lib/libc/minimal/vsprintf.c \ $(SDK_PATH)/lib/libc/minimal/string.c \ $(SDK_PATH)/lib/libc/minimal/ctype.c \ diff --git a/projects/x2660-halley/Examples/adc/adc_ExtTrigger_Watchdog/main.c b/projects/x2660-halley/Examples/adc/adc_ExtTrigger_Watchdog/main.c index 327786b6..5a54a1d1 100644 --- a/projects/x2660-halley/Examples/adc/adc_ExtTrigger_Watchdog/main.c +++ b/projects/x2660-halley/Examples/adc/adc_ExtTrigger_Watchdog/main.c @@ -9,11 +9,30 @@ ADC_ExtConfTypeDef ExtHandle; __IO ITStatus UartReady = RESET; static int *seq1 =NULL; +/* APLL,1.2G 39+1=40分频,30M + * SADC phy工作时钟最高为30M,不建议修改 + */ +LL_CPM_CGU_ConfigTypeDef CGU_Config_ADC_30000000 = { + 0,39, 0 +}; + #ifdef TEST_ADC_DEBUG static void dump_adc_regs(void); #endif static void Error_Handler(void); +void adc_setup(void) +{ + int i; + + CPM_GATE_Enable(CPM_Instance, CPM_CLKID_SADC); + + CPM_CGU_SADC_Start(CPM_Instance, &CGU_Config_ADC_30000000); + + for(i=5;i<21;i++){ + LL_GPIO_setPinMode(PB_Instance, i, GPIO_MODE_FUNCTION0); + } +} int main(void) { @@ -26,6 +45,13 @@ int main(void) /* 实例化ADC句柄,配置初始化参数 */ AdcHandle.Instance = SADC_Instance; AdcHandle.Init.EXTEN = ENABLE; + + /*ADC 初始化时钟、GPIO*/ + adc_setup(); + + /*使用pwm_tcu_adc_trig gpio 事件触发SADC转换*/ + LL_GPIO_setPinMode(PC_Instance, 20, GPIO_MODE_FUNCTION1); + /* 取消初始化ADC外围设备 */ if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK) { Error_Handler(); diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/Makefile b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/Makefile index c1946e2d..1e7bbaab 100644 --- a/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/Makefile +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/Makefile @@ -33,6 +33,8 @@ $(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)/drivers/drivers-x2600/src/x2600_ll_cpm.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_ll_gpio.c \ $(SDK_PATH)/lib/libc/minimal/vsprintf.c \ $(SDK_PATH)/lib/libc/minimal/string.c \ $(SDK_PATH)/lib/libc/minimal/ctype.c \ diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/main.c b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/main.c index 9e803c98..e2152fdc 100644 --- a/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/main.c +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_it/main.c @@ -6,11 +6,29 @@ ADC_HandleTypeDef AdcHandle; __IO ITStatus UartReady = RESET; static int *seq1 =NULL; +/* APLL,1.2G 39+1=40分频,30M + * SADC phy工作时钟最高为30M,不建议修改 + */ +LL_CPM_CGU_ConfigTypeDef CGU_Config_ADC_30000000 = { + 0,39, 0 +}; #ifdef TEST_ADC_DEBUG static void dump_adc_regs(void); #endif static void Error_Handler(void); +void adc_setup(void) +{ + int i; + + CPM_GATE_Enable(CPM_Instance, CPM_CLKID_SADC); + + CPM_CGU_SADC_Start(CPM_Instance, &CGU_Config_ADC_30000000); + + for(i=5;i<21;i++){ + LL_GPIO_setPinMode(PB_Instance, i, GPIO_MODE_FUNCTION0); + } +} int main(void) { @@ -24,6 +42,9 @@ int main(void) AdcHandle.Instance = SADC_Instance; AdcHandle.Init.EXTEN = DISABLE; + /*ADC 初始化时钟、GPIO*/ + adc_setup(); + /* 取消初始化ADC外围设备 */ if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK) { Error_Handler(); diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/Makefile b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/Makefile index c1946e2d..1e7bbaab 100644 --- a/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/Makefile +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/Makefile @@ -33,6 +33,8 @@ $(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)/drivers/drivers-x2600/src/x2600_ll_cpm.c \ +$(SDK_PATH)/drivers/drivers-x2600/src/x2600_ll_gpio.c \ $(SDK_PATH)/lib/libc/minimal/vsprintf.c \ $(SDK_PATH)/lib/libc/minimal/string.c \ $(SDK_PATH)/lib/libc/minimal/ctype.c \ diff --git a/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/main.c b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/main.c index bf395577..1c5e35a8 100644 --- a/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/main.c +++ b/projects/x2660-halley/Examples/adc/adc_ScanConversion_polling/main.c @@ -6,11 +6,30 @@ ADC_HandleTypeDef AdcHandle; __IO ITStatus UartReady = RESET; static int *seq1 =NULL; +/* APLL,1.2G 39+1=40分频,30M + * SADC phy工作时钟最高为30M,不建议修改 + */ +LL_CPM_CGU_ConfigTypeDef CGU_Config_ADC_30000000 = { + 0,39, 0 +}; + #ifdef TEST_ADC_DEBUG static void dump_adc_regs(void); #endif static void Error_Handler(void); +void adc_setup(void) +{ + int i; + + CPM_GATE_Enable(CPM_Instance, CPM_CLKID_SADC); + + CPM_CGU_SADC_Start(CPM_Instance, &CGU_Config_ADC_30000000); + + for(i=5;i<21;i++){ + LL_GPIO_setPinMode(PB_Instance, i, GPIO_MODE_FUNCTION0); + } +} int main(void) { @@ -24,6 +43,9 @@ int main(void) AdcHandle.Instance = SADC_Instance; AdcHandle.Init.EXTEN = DISABLE; + /*ADC 初始化时钟、GPIO*/ + adc_setup(); + /* 取消初始化ADC外围设备 */ if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK) { Error_Handler(); -- Gitee