ad转换完成
This commit is contained in:
parent
9f1717211d
commit
e4c3e59332
|
@ -1,14 +1,14 @@
|
||||||
[PreviousLibFiles]
|
[PreviousLibFiles]
|
||||||
LibFiles=Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_system.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_bus.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_utils.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dmamux.h;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_gpio.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_tim.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_dma.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_rcc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_utils.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_exti.c;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_system.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_bus.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_utils.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dmamux.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h;
|
LibFiles=Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_system.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_adc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_bus.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_utils.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dmamux.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_tim.h;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_gpio.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_adc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_dma.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_rcc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_utils.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_exti.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_tim.c;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_system.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_adc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_bus.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_utils.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dmamux.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_tim.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f407xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h;
|
||||||
|
|
||||||
[PreviousUsedKeilFiles]
|
[PreviousUsedKeilFiles]
|
||||||
SourceFiles=..\Src\main.c;..\Src\gpio.c;..\Src\tim.c;..\Src\stm32f4xx_it.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_gpio.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_tim.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_dma.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_rcc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_utils.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_exti.c;..\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;..\\Src\system_stm32f4xx.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_gpio.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_tim.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_dma.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_rcc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_utils.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_exti.c;..\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;..\\Src\system_stm32f4xx.c;;;
|
SourceFiles=..\Src\main.c;..\Src\gpio.c;..\Src\adc.c;..\Src\dma.c;..\Src\tim.c;..\Src\stm32f4xx_it.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_gpio.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_adc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_dma.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_rcc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_utils.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_exti.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_tim.c;..\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;..\\Src\system_stm32f4xx.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_gpio.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_adc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_dma.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_rcc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_utils.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_exti.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_tim.c;..\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;..\\Src\system_stm32f4xx.c;;;
|
||||||
HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Inc;
|
HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Inc;
|
||||||
CDefines=USE_FULL_LL_DRIVER;HSE_VALUE:8000000;HSE_STARTUP_TIMEOUT:100;LSE_STARTUP_TIMEOUT:5000;LSE_VALUE:32768;EXTERNAL_CLOCK_VALUE:12288000;HSI_VALUE:16000000;LSI_VALUE:32000;VDD_VALUE:3300;PREFETCH_ENABLE:1;INSTRUCTION_CACHE_ENABLE:1;DATA_CACHE_ENABLE:1;STM32F407xx;USE_FULL_LL_DRIVER;HSE_VALUE:8000000;HSE_STARTUP_TIMEOUT:100;LSE_STARTUP_TIMEOUT:5000;LSE_VALUE:32768;EXTERNAL_CLOCK_VALUE:12288000;HSI_VALUE:16000000;LSI_VALUE:32000;VDD_VALUE:3300;PREFETCH_ENABLE:1;INSTRUCTION_CACHE_ENABLE:1;DATA_CACHE_ENABLE:1;
|
CDefines=USE_FULL_LL_DRIVER;HSE_VALUE:8000000;HSE_STARTUP_TIMEOUT:100;LSE_STARTUP_TIMEOUT:5000;LSE_VALUE:32768;EXTERNAL_CLOCK_VALUE:12288000;HSI_VALUE:16000000;LSI_VALUE:32000;VDD_VALUE:3300;PREFETCH_ENABLE:1;INSTRUCTION_CACHE_ENABLE:1;DATA_CACHE_ENABLE:1;STM32F407xx;USE_FULL_LL_DRIVER;HSE_VALUE:8000000;HSE_STARTUP_TIMEOUT:100;LSE_STARTUP_TIMEOUT:5000;LSE_VALUE:32768;EXTERNAL_CLOCK_VALUE:12288000;HSI_VALUE:16000000;LSI_VALUE:32000;VDD_VALUE:3300;PREFETCH_ENABLE:1;INSTRUCTION_CACHE_ENABLE:1;DATA_CACHE_ENABLE:1;
|
||||||
|
|
||||||
[PreviousGenFiles]
|
[PreviousGenFiles]
|
||||||
HeaderPath=..\Inc
|
HeaderPath=..\Inc
|
||||||
HeaderFiles=gpio.h;tim.h;stm32f4xx_it.h;stm32_assert.h;main.h;
|
HeaderFiles=gpio.h;adc.h;dma.h;tim.h;stm32f4xx_it.h;stm32_assert.h;main.h;
|
||||||
SourcePath=..\Src
|
SourcePath=..\Src
|
||||||
SourceFiles=gpio.c;tim.c;stm32f4xx_it.c;main.c;
|
SourceFiles=gpio.c;adc.c;dma.c;tim.c;stm32f4xx_it.c;main.c;
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,8 @@
|
||||||
"intelliSenseMode": "windows-gcc-x64",
|
"intelliSenseMode": "windows-gcc-x64",
|
||||||
"compilerArgs": [
|
"compilerArgs": [
|
||||||
""
|
""
|
||||||
]
|
],
|
||||||
|
"configurationProvider": "cl.eide"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"version": 4
|
"version": 4
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
{
|
{
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "C/C++ Runner: Debug Session",
|
"name": "C/C++ Runner: Debug Session",
|
||||||
"type": "cppdbg",
|
"type": "cppdbg",
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,922 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file stm32f4xx_ll_adc.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @brief ADC LL module driver
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2017 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
#if defined(USE_FULL_LL_DRIVER)
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "stm32f4xx_ll_adc.h"
|
||||||
|
#include "stm32f4xx_ll_bus.h"
|
||||||
|
|
||||||
|
#ifdef USE_FULL_ASSERT
|
||||||
|
#include "stm32_assert.h"
|
||||||
|
#else
|
||||||
|
#define assert_param(expr) ((void)0U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** @addtogroup STM32F4xx_LL_Driver
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined (ADC1) || defined (ADC2) || defined (ADC3)
|
||||||
|
|
||||||
|
/** @addtogroup ADC_LL ADC
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Private types -------------------------------------------------------------*/
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
/* Private constants ---------------------------------------------------------*/
|
||||||
|
/* Private macros ------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/** @addtogroup ADC_LL_Private_Macros
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Check of parameters for configuration of ADC hierarchical scope: */
|
||||||
|
/* common to several ADC instances. */
|
||||||
|
#define IS_LL_ADC_COMMON_CLOCK(__CLOCK__) \
|
||||||
|
( ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV2) \
|
||||||
|
|| ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV4) \
|
||||||
|
|| ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV6) \
|
||||||
|
|| ((__CLOCK__) == LL_ADC_CLOCK_SYNC_PCLK_DIV8) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* Check of parameters for configuration of ADC hierarchical scope: */
|
||||||
|
/* ADC instance. */
|
||||||
|
#define IS_LL_ADC_RESOLUTION(__RESOLUTION__) \
|
||||||
|
( ((__RESOLUTION__) == LL_ADC_RESOLUTION_12B) \
|
||||||
|
|| ((__RESOLUTION__) == LL_ADC_RESOLUTION_10B) \
|
||||||
|
|| ((__RESOLUTION__) == LL_ADC_RESOLUTION_8B) \
|
||||||
|
|| ((__RESOLUTION__) == LL_ADC_RESOLUTION_6B) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_DATA_ALIGN(__DATA_ALIGN__) \
|
||||||
|
( ((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_RIGHT) \
|
||||||
|
|| ((__DATA_ALIGN__) == LL_ADC_DATA_ALIGN_LEFT) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_SCAN_SELECTION(__SCAN_SELECTION__) \
|
||||||
|
( ((__SCAN_SELECTION__) == LL_ADC_SEQ_SCAN_DISABLE) \
|
||||||
|
|| ((__SCAN_SELECTION__) == LL_ADC_SEQ_SCAN_ENABLE) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_SEQ_SCAN_MODE(__SEQ_SCAN_MODE__) \
|
||||||
|
( ((__SCAN_MODE__) == LL_ADC_SEQ_SCAN_DISABLE) \
|
||||||
|
|| ((__SCAN_MODE__) == LL_ADC_SEQ_SCAN_ENABLE) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* Check of parameters for configuration of ADC hierarchical scope: */
|
||||||
|
/* ADC group regular */
|
||||||
|
#define IS_LL_ADC_REG_TRIG_SOURCE(__REG_TRIG_SOURCE__) \
|
||||||
|
( ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_SOFTWARE) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH1) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH2) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM1_CH3) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH2) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH3) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_CH4) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM2_TRGO) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_CH1) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM3_TRGO) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM4_CH4) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM5_CH1) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM5_CH2) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM5_CH3) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM8_CH1) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_TIM8_TRGO) \
|
||||||
|
|| ((__REG_TRIG_SOURCE__) == LL_ADC_REG_TRIG_EXT_EXTI_LINE11) \
|
||||||
|
)
|
||||||
|
#define IS_LL_ADC_REG_CONTINUOUS_MODE(__REG_CONTINUOUS_MODE__) \
|
||||||
|
( ((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_SINGLE) \
|
||||||
|
|| ((__REG_CONTINUOUS_MODE__) == LL_ADC_REG_CONV_CONTINUOUS) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_REG_DMA_TRANSFER(__REG_DMA_TRANSFER__) \
|
||||||
|
( ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_NONE) \
|
||||||
|
|| ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_LIMITED) \
|
||||||
|
|| ((__REG_DMA_TRANSFER__) == LL_ADC_REG_DMA_TRANSFER_UNLIMITED) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_REG_FLAG_EOC_SELECTION(__REG_FLAG_EOC_SELECTION__) \
|
||||||
|
( ((__REG_FLAG_EOC_SELECTION__) == LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV) \
|
||||||
|
|| ((__REG_FLAG_EOC_SELECTION__) == LL_ADC_REG_FLAG_EOC_UNITARY_CONV) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_REG_SEQ_SCAN_LENGTH(__REG_SEQ_SCAN_LENGTH__) \
|
||||||
|
( ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_DISABLE) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_3RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_4RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_5RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_7RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_8RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_9RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_10RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_11RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_12RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_13RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_14RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_15RANKS) \
|
||||||
|
|| ((__REG_SEQ_SCAN_LENGTH__) == LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(__REG_SEQ_DISCONT_MODE__) \
|
||||||
|
( ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_DISABLE) \
|
||||||
|
|| ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_1RANK) \
|
||||||
|
|| ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_2RANKS) \
|
||||||
|
|| ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_3RANKS) \
|
||||||
|
|| ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_4RANKS) \
|
||||||
|
|| ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_5RANKS) \
|
||||||
|
|| ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_6RANKS) \
|
||||||
|
|| ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_7RANKS) \
|
||||||
|
|| ((__REG_SEQ_DISCONT_MODE__) == LL_ADC_REG_SEQ_DISCONT_8RANKS) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* Check of parameters for configuration of ADC hierarchical scope: */
|
||||||
|
/* ADC group injected */
|
||||||
|
#define IS_LL_ADC_INJ_TRIG_SOURCE(__INJ_TRIG_SOURCE__) \
|
||||||
|
( ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_SOFTWARE) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_CH4) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM1_TRGO) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_CH1) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM2_TRGO) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM3_CH2) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM3_CH4) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH1) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH2) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_CH3) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM4_TRGO) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM5_CH4) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM5_TRGO) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH2) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH3) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_TIM8_CH4) \
|
||||||
|
|| ((__INJ_TRIG_SOURCE__) == LL_ADC_INJ_TRIG_EXT_EXTI_LINE15) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_INJ_TRIG_EXT_EDGE(__INJ_TRIG_EXT_EDGE__) \
|
||||||
|
( ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_RISING) \
|
||||||
|
|| ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_FALLING) \
|
||||||
|
|| ((__INJ_TRIG_EXT_EDGE__) == LL_ADC_INJ_TRIG_EXT_RISINGFALLING) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_INJ_TRIG_AUTO(__INJ_TRIG_AUTO__) \
|
||||||
|
( ((__INJ_TRIG_AUTO__) == LL_ADC_INJ_TRIG_INDEPENDENT) \
|
||||||
|
|| ((__INJ_TRIG_AUTO__) == LL_ADC_INJ_TRIG_FROM_GRP_REGULAR) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_INJ_SEQ_SCAN_LENGTH(__INJ_SEQ_SCAN_LENGTH__) \
|
||||||
|
( ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_DISABLE) \
|
||||||
|
|| ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS) \
|
||||||
|
|| ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_3RANKS) \
|
||||||
|
|| ((__INJ_SEQ_SCAN_LENGTH__) == LL_ADC_INJ_SEQ_SCAN_ENABLE_4RANKS) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_INJ_SEQ_SCAN_DISCONT_MODE(__INJ_SEQ_DISCONT_MODE__) \
|
||||||
|
( ((__INJ_SEQ_DISCONT_MODE__) == LL_ADC_INJ_SEQ_DISCONT_DISABLE) \
|
||||||
|
|| ((__INJ_SEQ_DISCONT_MODE__) == LL_ADC_INJ_SEQ_DISCONT_1RANK) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#if defined(ADC_MULTIMODE_SUPPORT)
|
||||||
|
/* Check of parameters for configuration of ADC hierarchical scope: */
|
||||||
|
/* multimode. */
|
||||||
|
#if defined(ADC3)
|
||||||
|
#define IS_LL_ADC_MULTI_MODE(__MULTI_MODE__) \
|
||||||
|
( ((__MULTI_MODE__) == LL_ADC_MULTI_INDEPENDENT) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIMULT) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INTERL) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_SIMULT) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_ALTERN) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INT_INJ_SIM) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_SIM) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_REG_SIM_INJ_ALT) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_INJ_SIMULT) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_REG_SIMULT) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_REG_INTERL) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_TRIPLE_INJ_ALTERN) \
|
||||||
|
)
|
||||||
|
#else
|
||||||
|
#define IS_LL_ADC_MULTI_MODE(__MULTI_MODE__) \
|
||||||
|
( ((__MULTI_MODE__) == LL_ADC_MULTI_INDEPENDENT) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIMULT) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INTERL) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_SIMULT) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_INJ_ALTERN) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_SIM) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_SIM_INJ_ALT) \
|
||||||
|
|| ((__MULTI_MODE__) == LL_ADC_MULTI_DUAL_REG_INT_INJ_SIM) \
|
||||||
|
)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define IS_LL_ADC_MULTI_DMA_TRANSFER(__MULTI_DMA_TRANSFER__) \
|
||||||
|
( ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_EACH_ADC) \
|
||||||
|
|| ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_LIMIT_1) \
|
||||||
|
|| ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_LIMIT_2) \
|
||||||
|
|| ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_LIMIT_3) \
|
||||||
|
|| ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_UNLMT_1) \
|
||||||
|
|| ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_UNLMT_2) \
|
||||||
|
|| ((__MULTI_DMA_TRANSFER__) == LL_ADC_MULTI_REG_DMA_UNLMT_3) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_MULTI_TWOSMP_DELAY(__MULTI_TWOSMP_DELAY__) \
|
||||||
|
( ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_6CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_7CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_8CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_9CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_10CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_11CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_12CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_13CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_14CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_15CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_16CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_17CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_18CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_19CYCLES) \
|
||||||
|
|| ((__MULTI_TWOSMP_DELAY__) == LL_ADC_MULTI_TWOSMP_DELAY_20CYCLES) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define IS_LL_ADC_MULTI_MASTER_SLAVE(__MULTI_MASTER_SLAVE__) \
|
||||||
|
( ((__MULTI_MASTER_SLAVE__) == LL_ADC_MULTI_MASTER) \
|
||||||
|
|| ((__MULTI_MASTER_SLAVE__) == LL_ADC_MULTI_SLAVE) \
|
||||||
|
|| ((__MULTI_MASTER_SLAVE__) == LL_ADC_MULTI_MASTER_SLAVE) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#endif /* ADC_MULTIMODE_SUPPORT */
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
|
||||||
|
/* Exported functions --------------------------------------------------------*/
|
||||||
|
/** @addtogroup ADC_LL_Exported_Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @addtogroup ADC_LL_EF_Init
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief De-initialize registers of all ADC instances belonging to
|
||||||
|
* the same ADC common instance to their default reset values.
|
||||||
|
* @param ADCxy_COMMON ADC common instance
|
||||||
|
* (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() )
|
||||||
|
* @retval An ErrorStatus enumeration value:
|
||||||
|
* - SUCCESS: ADC common registers are de-initialized
|
||||||
|
* - ERROR: not applicable
|
||||||
|
*/
|
||||||
|
ErrorStatus LL_ADC_CommonDeInit(ADC_Common_TypeDef *ADCxy_COMMON)
|
||||||
|
{
|
||||||
|
/* Check the parameters */
|
||||||
|
assert_param(IS_ADC_COMMON_INSTANCE(ADCxy_COMMON));
|
||||||
|
|
||||||
|
|
||||||
|
/* Force reset of ADC clock (core clock) */
|
||||||
|
LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_ADC);
|
||||||
|
|
||||||
|
/* Release reset of ADC clock (core clock) */
|
||||||
|
LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_ADC);
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize some features of ADC common parameters
|
||||||
|
* (all ADC instances belonging to the same ADC common instance)
|
||||||
|
* and multimode (for devices with several ADC instances available).
|
||||||
|
* @note The setting of ADC common parameters is conditioned to
|
||||||
|
* ADC instances state:
|
||||||
|
* All ADC instances belonging to the same ADC common instance
|
||||||
|
* must be disabled.
|
||||||
|
* @param ADCxy_COMMON ADC common instance
|
||||||
|
* (can be set directly from CMSIS definition or by using helper macro @ref __LL_ADC_COMMON_INSTANCE() )
|
||||||
|
* @param ADC_CommonInitStruct Pointer to a @ref LL_ADC_CommonInitTypeDef structure
|
||||||
|
* @retval An ErrorStatus enumeration value:
|
||||||
|
* - SUCCESS: ADC common registers are initialized
|
||||||
|
* - ERROR: ADC common registers are not initialized
|
||||||
|
*/
|
||||||
|
ErrorStatus LL_ADC_CommonInit(ADC_Common_TypeDef *ADCxy_COMMON, LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct)
|
||||||
|
{
|
||||||
|
ErrorStatus status = SUCCESS;
|
||||||
|
|
||||||
|
/* Check the parameters */
|
||||||
|
assert_param(IS_ADC_COMMON_INSTANCE(ADCxy_COMMON));
|
||||||
|
assert_param(IS_LL_ADC_COMMON_CLOCK(ADC_CommonInitStruct->CommonClock));
|
||||||
|
|
||||||
|
#if defined(ADC_MULTIMODE_SUPPORT)
|
||||||
|
assert_param(IS_LL_ADC_MULTI_MODE(ADC_CommonInitStruct->Multimode));
|
||||||
|
if(ADC_CommonInitStruct->Multimode != LL_ADC_MULTI_INDEPENDENT)
|
||||||
|
{
|
||||||
|
assert_param(IS_LL_ADC_MULTI_DMA_TRANSFER(ADC_CommonInitStruct->MultiDMATransfer));
|
||||||
|
assert_param(IS_LL_ADC_MULTI_TWOSMP_DELAY(ADC_CommonInitStruct->MultiTwoSamplingDelay));
|
||||||
|
}
|
||||||
|
#endif /* ADC_MULTIMODE_SUPPORT */
|
||||||
|
|
||||||
|
/* Note: Hardware constraint (refer to description of functions */
|
||||||
|
/* "LL_ADC_SetCommonXXX()" and "LL_ADC_SetMultiXXX()"): */
|
||||||
|
/* On this STM32 series, setting of these features is conditioned to */
|
||||||
|
/* ADC state: */
|
||||||
|
/* All ADC instances of the ADC common group must be disabled. */
|
||||||
|
if(__LL_ADC_IS_ENABLED_ALL_COMMON_INSTANCE(ADCxy_COMMON) == 0UL)
|
||||||
|
{
|
||||||
|
/* Configuration of ADC hierarchical scope: */
|
||||||
|
/* - common to several ADC */
|
||||||
|
/* (all ADC instances belonging to the same ADC common instance) */
|
||||||
|
/* - Set ADC clock (conversion clock) */
|
||||||
|
/* - multimode (if several ADC instances available on the */
|
||||||
|
/* selected device) */
|
||||||
|
/* - Set ADC multimode configuration */
|
||||||
|
/* - Set ADC multimode DMA transfer */
|
||||||
|
/* - Set ADC multimode: delay between 2 sampling phases */
|
||||||
|
#if defined(ADC_MULTIMODE_SUPPORT)
|
||||||
|
if(ADC_CommonInitStruct->Multimode != LL_ADC_MULTI_INDEPENDENT)
|
||||||
|
{
|
||||||
|
MODIFY_REG(ADCxy_COMMON->CCR,
|
||||||
|
ADC_CCR_ADCPRE
|
||||||
|
| ADC_CCR_MULTI
|
||||||
|
| ADC_CCR_DMA
|
||||||
|
| ADC_CCR_DDS
|
||||||
|
| ADC_CCR_DELAY
|
||||||
|
,
|
||||||
|
ADC_CommonInitStruct->CommonClock
|
||||||
|
| ADC_CommonInitStruct->Multimode
|
||||||
|
| ADC_CommonInitStruct->MultiDMATransfer
|
||||||
|
| ADC_CommonInitStruct->MultiTwoSamplingDelay
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MODIFY_REG(ADCxy_COMMON->CCR,
|
||||||
|
ADC_CCR_ADCPRE
|
||||||
|
| ADC_CCR_MULTI
|
||||||
|
| ADC_CCR_DMA
|
||||||
|
| ADC_CCR_DDS
|
||||||
|
| ADC_CCR_DELAY
|
||||||
|
,
|
||||||
|
ADC_CommonInitStruct->CommonClock
|
||||||
|
| LL_ADC_MULTI_INDEPENDENT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
LL_ADC_SetCommonClock(ADCxy_COMMON, ADC_CommonInitStruct->CommonClock);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Initialization error: One or several ADC instances belonging to */
|
||||||
|
/* the same ADC common instance are not disabled. */
|
||||||
|
status = ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set each @ref LL_ADC_CommonInitTypeDef field to default value.
|
||||||
|
* @param ADC_CommonInitStruct Pointer to a @ref LL_ADC_CommonInitTypeDef structure
|
||||||
|
* whose fields will be set to default values.
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void LL_ADC_CommonStructInit(LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct)
|
||||||
|
{
|
||||||
|
/* Set ADC_CommonInitStruct fields to default values */
|
||||||
|
/* Set fields of ADC common */
|
||||||
|
/* (all ADC instances belonging to the same ADC common instance) */
|
||||||
|
ADC_CommonInitStruct->CommonClock = LL_ADC_CLOCK_SYNC_PCLK_DIV2;
|
||||||
|
|
||||||
|
#if defined(ADC_MULTIMODE_SUPPORT)
|
||||||
|
/* Set fields of ADC multimode */
|
||||||
|
ADC_CommonInitStruct->Multimode = LL_ADC_MULTI_INDEPENDENT;
|
||||||
|
ADC_CommonInitStruct->MultiDMATransfer = LL_ADC_MULTI_REG_DMA_EACH_ADC;
|
||||||
|
ADC_CommonInitStruct->MultiTwoSamplingDelay = LL_ADC_MULTI_TWOSMP_DELAY_5CYCLES;
|
||||||
|
#endif /* ADC_MULTIMODE_SUPPORT */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief De-initialize registers of the selected ADC instance
|
||||||
|
* to their default reset values.
|
||||||
|
* @note To reset all ADC instances quickly (perform a hard reset),
|
||||||
|
* use function @ref LL_ADC_CommonDeInit().
|
||||||
|
* @param ADCx ADC instance
|
||||||
|
* @retval An ErrorStatus enumeration value:
|
||||||
|
* - SUCCESS: ADC registers are de-initialized
|
||||||
|
* - ERROR: ADC registers are not de-initialized
|
||||||
|
*/
|
||||||
|
ErrorStatus LL_ADC_DeInit(ADC_TypeDef *ADCx)
|
||||||
|
{
|
||||||
|
ErrorStatus status = SUCCESS;
|
||||||
|
|
||||||
|
/* Check the parameters */
|
||||||
|
assert_param(IS_ADC_ALL_INSTANCE(ADCx));
|
||||||
|
|
||||||
|
/* Disable ADC instance if not already disabled. */
|
||||||
|
if(LL_ADC_IsEnabled(ADCx) == 1UL)
|
||||||
|
{
|
||||||
|
/* Set ADC group regular trigger source to SW start to ensure to not */
|
||||||
|
/* have an external trigger event occurring during the conversion stop */
|
||||||
|
/* ADC disable process. */
|
||||||
|
LL_ADC_REG_SetTriggerSource(ADCx, LL_ADC_REG_TRIG_SOFTWARE);
|
||||||
|
|
||||||
|
/* Set ADC group injected trigger source to SW start to ensure to not */
|
||||||
|
/* have an external trigger event occurring during the conversion stop */
|
||||||
|
/* ADC disable process. */
|
||||||
|
LL_ADC_INJ_SetTriggerSource(ADCx, LL_ADC_INJ_TRIG_SOFTWARE);
|
||||||
|
|
||||||
|
/* Disable the ADC instance */
|
||||||
|
LL_ADC_Disable(ADCx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check whether ADC state is compliant with expected state */
|
||||||
|
/* (hardware requirements of bits state to reset registers below) */
|
||||||
|
if(READ_BIT(ADCx->CR2, ADC_CR2_ADON) == 0UL)
|
||||||
|
{
|
||||||
|
/* ========== Reset ADC registers ========== */
|
||||||
|
/* Reset register SR */
|
||||||
|
CLEAR_BIT(ADCx->SR,
|
||||||
|
( LL_ADC_FLAG_STRT
|
||||||
|
| LL_ADC_FLAG_JSTRT
|
||||||
|
| LL_ADC_FLAG_EOCS
|
||||||
|
| LL_ADC_FLAG_OVR
|
||||||
|
| LL_ADC_FLAG_JEOS
|
||||||
|
| LL_ADC_FLAG_AWD1 )
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Reset register CR1 */
|
||||||
|
CLEAR_BIT(ADCx->CR1,
|
||||||
|
( ADC_CR1_OVRIE | ADC_CR1_RES | ADC_CR1_AWDEN
|
||||||
|
| ADC_CR1_JAWDEN
|
||||||
|
| ADC_CR1_DISCNUM | ADC_CR1_JDISCEN | ADC_CR1_DISCEN
|
||||||
|
| ADC_CR1_JAUTO | ADC_CR1_AWDSGL | ADC_CR1_SCAN
|
||||||
|
| ADC_CR1_JEOCIE | ADC_CR1_AWDIE | ADC_CR1_EOCIE
|
||||||
|
| ADC_CR1_AWDCH )
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Reset register CR2 */
|
||||||
|
CLEAR_BIT(ADCx->CR2,
|
||||||
|
( ADC_CR2_SWSTART | ADC_CR2_EXTEN | ADC_CR2_EXTSEL
|
||||||
|
| ADC_CR2_JSWSTART | ADC_CR2_JEXTEN | ADC_CR2_JEXTSEL
|
||||||
|
| ADC_CR2_ALIGN | ADC_CR2_EOCS
|
||||||
|
| ADC_CR2_DDS | ADC_CR2_DMA
|
||||||
|
| ADC_CR2_CONT | ADC_CR2_ADON )
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Reset register SMPR1 */
|
||||||
|
CLEAR_BIT(ADCx->SMPR1,
|
||||||
|
( ADC_SMPR1_SMP18 | ADC_SMPR1_SMP17 | ADC_SMPR1_SMP16
|
||||||
|
| ADC_SMPR1_SMP15 | ADC_SMPR1_SMP14 | ADC_SMPR1_SMP13
|
||||||
|
| ADC_SMPR1_SMP12 | ADC_SMPR1_SMP11 | ADC_SMPR1_SMP10)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Reset register SMPR2 */
|
||||||
|
CLEAR_BIT(ADCx->SMPR2,
|
||||||
|
( ADC_SMPR2_SMP9
|
||||||
|
| ADC_SMPR2_SMP8 | ADC_SMPR2_SMP7 | ADC_SMPR2_SMP6
|
||||||
|
| ADC_SMPR2_SMP5 | ADC_SMPR2_SMP4 | ADC_SMPR2_SMP3
|
||||||
|
| ADC_SMPR2_SMP2 | ADC_SMPR2_SMP1 | ADC_SMPR2_SMP0)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Reset register JOFR1 */
|
||||||
|
CLEAR_BIT(ADCx->JOFR1, ADC_JOFR1_JOFFSET1);
|
||||||
|
/* Reset register JOFR2 */
|
||||||
|
CLEAR_BIT(ADCx->JOFR2, ADC_JOFR2_JOFFSET2);
|
||||||
|
/* Reset register JOFR3 */
|
||||||
|
CLEAR_BIT(ADCx->JOFR3, ADC_JOFR3_JOFFSET3);
|
||||||
|
/* Reset register JOFR4 */
|
||||||
|
CLEAR_BIT(ADCx->JOFR4, ADC_JOFR4_JOFFSET4);
|
||||||
|
|
||||||
|
/* Reset register HTR */
|
||||||
|
SET_BIT(ADCx->HTR, ADC_HTR_HT);
|
||||||
|
/* Reset register LTR */
|
||||||
|
CLEAR_BIT(ADCx->LTR, ADC_LTR_LT);
|
||||||
|
|
||||||
|
/* Reset register SQR1 */
|
||||||
|
CLEAR_BIT(ADCx->SQR1,
|
||||||
|
( ADC_SQR1_L
|
||||||
|
| ADC_SQR1_SQ16
|
||||||
|
| ADC_SQR1_SQ15 | ADC_SQR1_SQ14 | ADC_SQR1_SQ13)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Reset register SQR2 */
|
||||||
|
CLEAR_BIT(ADCx->SQR2,
|
||||||
|
( ADC_SQR2_SQ12 | ADC_SQR2_SQ11 | ADC_SQR2_SQ10
|
||||||
|
| ADC_SQR2_SQ9 | ADC_SQR2_SQ8 | ADC_SQR2_SQ7)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Reset register SQR3 */
|
||||||
|
CLEAR_BIT(ADCx->SQR3,
|
||||||
|
( ADC_SQR3_SQ6 | ADC_SQR3_SQ5 | ADC_SQR3_SQ4
|
||||||
|
| ADC_SQR3_SQ3 | ADC_SQR3_SQ2 | ADC_SQR3_SQ1)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Reset register JSQR */
|
||||||
|
CLEAR_BIT(ADCx->JSQR,
|
||||||
|
( ADC_JSQR_JL
|
||||||
|
| ADC_JSQR_JSQ4 | ADC_JSQR_JSQ3
|
||||||
|
| ADC_JSQR_JSQ2 | ADC_JSQR_JSQ1 )
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Reset register DR */
|
||||||
|
/* bits in access mode read only, no direct reset applicable */
|
||||||
|
|
||||||
|
/* Reset registers JDR1, JDR2, JDR3, JDR4 */
|
||||||
|
/* bits in access mode read only, no direct reset applicable */
|
||||||
|
|
||||||
|
/* Reset register CCR */
|
||||||
|
CLEAR_BIT(ADC->CCR, ADC_CCR_TSVREFE | ADC_CCR_ADCPRE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize some features of ADC instance.
|
||||||
|
* @note These parameters have an impact on ADC scope: ADC instance.
|
||||||
|
* Affects both group regular and group injected (availability
|
||||||
|
* of ADC group injected depends on STM32 families).
|
||||||
|
* Refer to corresponding unitary functions into
|
||||||
|
* @ref ADC_LL_EF_Configuration_ADC_Instance .
|
||||||
|
* @note The setting of these parameters by function @ref LL_ADC_Init()
|
||||||
|
* is conditioned to ADC state:
|
||||||
|
* ADC instance must be disabled.
|
||||||
|
* This condition is applied to all ADC features, for efficiency
|
||||||
|
* and compatibility over all STM32 families. However, the different
|
||||||
|
* features can be set under different ADC state conditions
|
||||||
|
* (setting possible with ADC enabled without conversion on going,
|
||||||
|
* ADC enabled with conversion on going, ...)
|
||||||
|
* Each feature can be updated afterwards with a unitary function
|
||||||
|
* and potentially with ADC in a different state than disabled,
|
||||||
|
* refer to description of each function for setting
|
||||||
|
* conditioned to ADC state.
|
||||||
|
* @note After using this function, some other features must be configured
|
||||||
|
* using LL unitary functions.
|
||||||
|
* The minimum configuration remaining to be done is:
|
||||||
|
* - Set ADC group regular or group injected sequencer:
|
||||||
|
* map channel on the selected sequencer rank.
|
||||||
|
* Refer to function @ref LL_ADC_REG_SetSequencerRanks().
|
||||||
|
* - Set ADC channel sampling time
|
||||||
|
* Refer to function LL_ADC_SetChannelSamplingTime();
|
||||||
|
* @param ADCx ADC instance
|
||||||
|
* @param ADC_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure
|
||||||
|
* @retval An ErrorStatus enumeration value:
|
||||||
|
* - SUCCESS: ADC registers are initialized
|
||||||
|
* - ERROR: ADC registers are not initialized
|
||||||
|
*/
|
||||||
|
ErrorStatus LL_ADC_Init(ADC_TypeDef *ADCx, LL_ADC_InitTypeDef *ADC_InitStruct)
|
||||||
|
{
|
||||||
|
ErrorStatus status = SUCCESS;
|
||||||
|
|
||||||
|
/* Check the parameters */
|
||||||
|
assert_param(IS_ADC_ALL_INSTANCE(ADCx));
|
||||||
|
|
||||||
|
assert_param(IS_LL_ADC_RESOLUTION(ADC_InitStruct->Resolution));
|
||||||
|
assert_param(IS_LL_ADC_DATA_ALIGN(ADC_InitStruct->DataAlignment));
|
||||||
|
assert_param(IS_LL_ADC_SCAN_SELECTION(ADC_InitStruct->SequencersScanMode));
|
||||||
|
|
||||||
|
/* Note: Hardware constraint (refer to description of this function): */
|
||||||
|
/* ADC instance must be disabled. */
|
||||||
|
if(LL_ADC_IsEnabled(ADCx) == 0UL)
|
||||||
|
{
|
||||||
|
/* Configuration of ADC hierarchical scope: */
|
||||||
|
/* - ADC instance */
|
||||||
|
/* - Set ADC data resolution */
|
||||||
|
/* - Set ADC conversion data alignment */
|
||||||
|
MODIFY_REG(ADCx->CR1,
|
||||||
|
ADC_CR1_RES
|
||||||
|
| ADC_CR1_SCAN
|
||||||
|
,
|
||||||
|
ADC_InitStruct->Resolution
|
||||||
|
| ADC_InitStruct->SequencersScanMode
|
||||||
|
);
|
||||||
|
|
||||||
|
MODIFY_REG(ADCx->CR2,
|
||||||
|
ADC_CR2_ALIGN
|
||||||
|
,
|
||||||
|
ADC_InitStruct->DataAlignment
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Initialization error: ADC instance is not disabled. */
|
||||||
|
status = ERROR;
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set each @ref LL_ADC_InitTypeDef field to default value.
|
||||||
|
* @param ADC_InitStruct Pointer to a @ref LL_ADC_InitTypeDef structure
|
||||||
|
* whose fields will be set to default values.
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void LL_ADC_StructInit(LL_ADC_InitTypeDef *ADC_InitStruct)
|
||||||
|
{
|
||||||
|
/* Set ADC_InitStruct fields to default values */
|
||||||
|
/* Set fields of ADC instance */
|
||||||
|
ADC_InitStruct->Resolution = LL_ADC_RESOLUTION_12B;
|
||||||
|
ADC_InitStruct->DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
|
||||||
|
|
||||||
|
/* Enable scan mode to have a generic behavior with ADC of other */
|
||||||
|
/* STM32 families, without this setting available: */
|
||||||
|
/* ADC group regular sequencer and ADC group injected sequencer depend */
|
||||||
|
/* only of their own configuration. */
|
||||||
|
ADC_InitStruct->SequencersScanMode = LL_ADC_SEQ_SCAN_ENABLE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize some features of ADC group regular.
|
||||||
|
* @note These parameters have an impact on ADC scope: ADC group regular.
|
||||||
|
* Refer to corresponding unitary functions into
|
||||||
|
* @ref ADC_LL_EF_Configuration_ADC_Group_Regular
|
||||||
|
* (functions with prefix "REG").
|
||||||
|
* @note The setting of these parameters by function @ref LL_ADC_Init()
|
||||||
|
* is conditioned to ADC state:
|
||||||
|
* ADC instance must be disabled.
|
||||||
|
* This condition is applied to all ADC features, for efficiency
|
||||||
|
* and compatibility over all STM32 families. However, the different
|
||||||
|
* features can be set under different ADC state conditions
|
||||||
|
* (setting possible with ADC enabled without conversion on going,
|
||||||
|
* ADC enabled with conversion on going, ...)
|
||||||
|
* Each feature can be updated afterwards with a unitary function
|
||||||
|
* and potentially with ADC in a different state than disabled,
|
||||||
|
* refer to description of each function for setting
|
||||||
|
* conditioned to ADC state.
|
||||||
|
* @note After using this function, other features must be configured
|
||||||
|
* using LL unitary functions.
|
||||||
|
* The minimum configuration remaining to be done is:
|
||||||
|
* - Set ADC group regular or group injected sequencer:
|
||||||
|
* map channel on the selected sequencer rank.
|
||||||
|
* Refer to function @ref LL_ADC_REG_SetSequencerRanks().
|
||||||
|
* - Set ADC channel sampling time
|
||||||
|
* Refer to function LL_ADC_SetChannelSamplingTime();
|
||||||
|
* @param ADCx ADC instance
|
||||||
|
* @param ADC_REG_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure
|
||||||
|
* @retval An ErrorStatus enumeration value:
|
||||||
|
* - SUCCESS: ADC registers are initialized
|
||||||
|
* - ERROR: ADC registers are not initialized
|
||||||
|
*/
|
||||||
|
ErrorStatus LL_ADC_REG_Init(ADC_TypeDef *ADCx, LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct)
|
||||||
|
{
|
||||||
|
ErrorStatus status = SUCCESS;
|
||||||
|
|
||||||
|
/* Check the parameters */
|
||||||
|
assert_param(IS_ADC_ALL_INSTANCE(ADCx));
|
||||||
|
assert_param(IS_LL_ADC_REG_TRIG_SOURCE(ADC_REG_InitStruct->TriggerSource));
|
||||||
|
assert_param(IS_LL_ADC_REG_SEQ_SCAN_LENGTH(ADC_REG_InitStruct->SequencerLength));
|
||||||
|
if(ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE)
|
||||||
|
{
|
||||||
|
assert_param(IS_LL_ADC_REG_SEQ_SCAN_DISCONT_MODE(ADC_REG_InitStruct->SequencerDiscont));
|
||||||
|
}
|
||||||
|
assert_param(IS_LL_ADC_REG_CONTINUOUS_MODE(ADC_REG_InitStruct->ContinuousMode));
|
||||||
|
assert_param(IS_LL_ADC_REG_DMA_TRANSFER(ADC_REG_InitStruct->DMATransfer));
|
||||||
|
|
||||||
|
/* ADC group regular continuous mode and discontinuous mode */
|
||||||
|
/* can not be enabled simultenaeously */
|
||||||
|
assert_param((ADC_REG_InitStruct->ContinuousMode == LL_ADC_REG_CONV_SINGLE)
|
||||||
|
|| (ADC_REG_InitStruct->SequencerDiscont == LL_ADC_REG_SEQ_DISCONT_DISABLE));
|
||||||
|
|
||||||
|
/* Note: Hardware constraint (refer to description of this function): */
|
||||||
|
/* ADC instance must be disabled. */
|
||||||
|
if(LL_ADC_IsEnabled(ADCx) == 0UL)
|
||||||
|
{
|
||||||
|
/* Configuration of ADC hierarchical scope: */
|
||||||
|
/* - ADC group regular */
|
||||||
|
/* - Set ADC group regular trigger source */
|
||||||
|
/* - Set ADC group regular sequencer length */
|
||||||
|
/* - Set ADC group regular sequencer discontinuous mode */
|
||||||
|
/* - Set ADC group regular continuous mode */
|
||||||
|
/* - Set ADC group regular conversion data transfer: no transfer or */
|
||||||
|
/* transfer by DMA, and DMA requests mode */
|
||||||
|
/* Note: On this STM32 series, ADC trigger edge is set when starting */
|
||||||
|
/* ADC conversion. */
|
||||||
|
/* Refer to function @ref LL_ADC_REG_StartConversionExtTrig(). */
|
||||||
|
if(ADC_REG_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE)
|
||||||
|
{
|
||||||
|
MODIFY_REG(ADCx->CR1,
|
||||||
|
ADC_CR1_DISCEN
|
||||||
|
| ADC_CR1_DISCNUM
|
||||||
|
,
|
||||||
|
ADC_REG_InitStruct->SequencerDiscont
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MODIFY_REG(ADCx->CR1,
|
||||||
|
ADC_CR1_DISCEN
|
||||||
|
| ADC_CR1_DISCNUM
|
||||||
|
,
|
||||||
|
LL_ADC_REG_SEQ_DISCONT_DISABLE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
MODIFY_REG(ADCx->CR2,
|
||||||
|
ADC_CR2_EXTSEL
|
||||||
|
| ADC_CR2_EXTEN
|
||||||
|
| ADC_CR2_CONT
|
||||||
|
| ADC_CR2_DMA
|
||||||
|
| ADC_CR2_DDS
|
||||||
|
,
|
||||||
|
(ADC_REG_InitStruct->TriggerSource & ADC_CR2_EXTSEL)
|
||||||
|
| ADC_REG_InitStruct->ContinuousMode
|
||||||
|
| ADC_REG_InitStruct->DMATransfer
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Set ADC group regular sequencer length and scan direction */
|
||||||
|
/* Note: Hardware constraint (refer to description of this function): */
|
||||||
|
/* Note: If ADC instance feature scan mode is disabled */
|
||||||
|
/* (refer to ADC instance initialization structure */
|
||||||
|
/* parameter @ref SequencersScanMode */
|
||||||
|
/* or function @ref LL_ADC_SetSequencersScanMode() ), */
|
||||||
|
/* this parameter is discarded. */
|
||||||
|
LL_ADC_REG_SetSequencerLength(ADCx, ADC_REG_InitStruct->SequencerLength);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Initialization error: ADC instance is not disabled. */
|
||||||
|
status = ERROR;
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set each @ref LL_ADC_REG_InitTypeDef field to default value.
|
||||||
|
* @param ADC_REG_InitStruct Pointer to a @ref LL_ADC_REG_InitTypeDef structure
|
||||||
|
* whose fields will be set to default values.
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void LL_ADC_REG_StructInit(LL_ADC_REG_InitTypeDef *ADC_REG_InitStruct)
|
||||||
|
{
|
||||||
|
/* Set ADC_REG_InitStruct fields to default values */
|
||||||
|
/* Set fields of ADC group regular */
|
||||||
|
/* Note: On this STM32 series, ADC trigger edge is set when starting */
|
||||||
|
/* ADC conversion. */
|
||||||
|
/* Refer to function @ref LL_ADC_REG_StartConversionExtTrig(). */
|
||||||
|
ADC_REG_InitStruct->TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;
|
||||||
|
ADC_REG_InitStruct->SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;
|
||||||
|
ADC_REG_InitStruct->SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
|
||||||
|
ADC_REG_InitStruct->ContinuousMode = LL_ADC_REG_CONV_SINGLE;
|
||||||
|
ADC_REG_InitStruct->DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize some features of ADC group injected.
|
||||||
|
* @note These parameters have an impact on ADC scope: ADC group injected.
|
||||||
|
* Refer to corresponding unitary functions into
|
||||||
|
* @ref ADC_LL_EF_Configuration_ADC_Group_Regular
|
||||||
|
* (functions with prefix "INJ").
|
||||||
|
* @note The setting of these parameters by function @ref LL_ADC_Init()
|
||||||
|
* is conditioned to ADC state:
|
||||||
|
* ADC instance must be disabled.
|
||||||
|
* This condition is applied to all ADC features, for efficiency
|
||||||
|
* and compatibility over all STM32 families. However, the different
|
||||||
|
* features can be set under different ADC state conditions
|
||||||
|
* (setting possible with ADC enabled without conversion on going,
|
||||||
|
* ADC enabled with conversion on going, ...)
|
||||||
|
* Each feature can be updated afterwards with a unitary function
|
||||||
|
* and potentially with ADC in a different state than disabled,
|
||||||
|
* refer to description of each function for setting
|
||||||
|
* conditioned to ADC state.
|
||||||
|
* @note After using this function, other features must be configured
|
||||||
|
* using LL unitary functions.
|
||||||
|
* The minimum configuration remaining to be done is:
|
||||||
|
* - Set ADC group injected sequencer:
|
||||||
|
* map channel on the selected sequencer rank.
|
||||||
|
* Refer to function @ref LL_ADC_INJ_SetSequencerRanks().
|
||||||
|
* - Set ADC channel sampling time
|
||||||
|
* Refer to function LL_ADC_SetChannelSamplingTime();
|
||||||
|
* @param ADCx ADC instance
|
||||||
|
* @param ADC_INJ_InitStruct Pointer to a @ref LL_ADC_INJ_InitTypeDef structure
|
||||||
|
* @retval An ErrorStatus enumeration value:
|
||||||
|
* - SUCCESS: ADC registers are initialized
|
||||||
|
* - ERROR: ADC registers are not initialized
|
||||||
|
*/
|
||||||
|
ErrorStatus LL_ADC_INJ_Init(ADC_TypeDef *ADCx, LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct)
|
||||||
|
{
|
||||||
|
ErrorStatus status = SUCCESS;
|
||||||
|
|
||||||
|
/* Check the parameters */
|
||||||
|
assert_param(IS_ADC_ALL_INSTANCE(ADCx));
|
||||||
|
assert_param(IS_LL_ADC_INJ_TRIG_SOURCE(ADC_INJ_InitStruct->TriggerSource));
|
||||||
|
assert_param(IS_LL_ADC_INJ_SEQ_SCAN_LENGTH(ADC_INJ_InitStruct->SequencerLength));
|
||||||
|
if(ADC_INJ_InitStruct->SequencerLength != LL_ADC_INJ_SEQ_SCAN_DISABLE)
|
||||||
|
{
|
||||||
|
assert_param(IS_LL_ADC_INJ_SEQ_SCAN_DISCONT_MODE(ADC_INJ_InitStruct->SequencerDiscont));
|
||||||
|
}
|
||||||
|
assert_param(IS_LL_ADC_INJ_TRIG_AUTO(ADC_INJ_InitStruct->TrigAuto));
|
||||||
|
|
||||||
|
/* Note: Hardware constraint (refer to description of this function): */
|
||||||
|
/* ADC instance must be disabled. */
|
||||||
|
if(LL_ADC_IsEnabled(ADCx) == 0UL)
|
||||||
|
{
|
||||||
|
/* Configuration of ADC hierarchical scope: */
|
||||||
|
/* - ADC group injected */
|
||||||
|
/* - Set ADC group injected trigger source */
|
||||||
|
/* - Set ADC group injected sequencer length */
|
||||||
|
/* - Set ADC group injected sequencer discontinuous mode */
|
||||||
|
/* - Set ADC group injected conversion trigger: independent or */
|
||||||
|
/* from ADC group regular */
|
||||||
|
/* Note: On this STM32 series, ADC trigger edge is set when starting */
|
||||||
|
/* ADC conversion. */
|
||||||
|
/* Refer to function @ref LL_ADC_INJ_StartConversionExtTrig(). */
|
||||||
|
if(ADC_INJ_InitStruct->SequencerLength != LL_ADC_REG_SEQ_SCAN_DISABLE)
|
||||||
|
{
|
||||||
|
MODIFY_REG(ADCx->CR1,
|
||||||
|
ADC_CR1_JDISCEN
|
||||||
|
| ADC_CR1_JAUTO
|
||||||
|
,
|
||||||
|
ADC_INJ_InitStruct->SequencerDiscont
|
||||||
|
| ADC_INJ_InitStruct->TrigAuto
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MODIFY_REG(ADCx->CR1,
|
||||||
|
ADC_CR1_JDISCEN
|
||||||
|
| ADC_CR1_JAUTO
|
||||||
|
,
|
||||||
|
LL_ADC_REG_SEQ_DISCONT_DISABLE
|
||||||
|
| ADC_INJ_InitStruct->TrigAuto
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
MODIFY_REG(ADCx->CR2,
|
||||||
|
ADC_CR2_JEXTSEL
|
||||||
|
| ADC_CR2_JEXTEN
|
||||||
|
,
|
||||||
|
(ADC_INJ_InitStruct->TriggerSource & ADC_CR2_JEXTSEL)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Note: Hardware constraint (refer to description of this function): */
|
||||||
|
/* Note: If ADC instance feature scan mode is disabled */
|
||||||
|
/* (refer to ADC instance initialization structure */
|
||||||
|
/* parameter @ref SequencersScanMode */
|
||||||
|
/* or function @ref LL_ADC_SetSequencersScanMode() ), */
|
||||||
|
/* this parameter is discarded. */
|
||||||
|
LL_ADC_INJ_SetSequencerLength(ADCx, ADC_INJ_InitStruct->SequencerLength);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Initialization error: ADC instance is not disabled. */
|
||||||
|
status = ERROR;
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set each @ref LL_ADC_INJ_InitTypeDef field to default value.
|
||||||
|
* @param ADC_INJ_InitStruct Pointer to a @ref LL_ADC_INJ_InitTypeDef structure
|
||||||
|
* whose fields will be set to default values.
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void LL_ADC_INJ_StructInit(LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct)
|
||||||
|
{
|
||||||
|
/* Set ADC_INJ_InitStruct fields to default values */
|
||||||
|
/* Set fields of ADC group injected */
|
||||||
|
ADC_INJ_InitStruct->TriggerSource = LL_ADC_INJ_TRIG_SOFTWARE;
|
||||||
|
ADC_INJ_InitStruct->SequencerLength = LL_ADC_INJ_SEQ_SCAN_DISABLE;
|
||||||
|
ADC_INJ_InitStruct->SequencerDiscont = LL_ADC_INJ_SEQ_DISCONT_DISABLE;
|
||||||
|
ADC_INJ_InitStruct->TrigAuto = LL_ADC_INJ_TRIG_INDEPENDENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* ADC1 || ADC2 || ADC3 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* USE_FULL_LL_DRIVER */
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
/* USER CODE BEGIN Header */
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file adc.h
|
||||||
|
* @brief This file contains all the function prototypes for
|
||||||
|
* the adc.c file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2024 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
/* USER CODE END Header */
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __ADC_H__
|
||||||
|
#define __ADC_H__
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Includes */
|
||||||
|
|
||||||
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Private defines */
|
||||||
|
|
||||||
|
/* USER CODE END Private defines */
|
||||||
|
|
||||||
|
void MX_ADC1_Init(void);
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Prototypes */
|
||||||
|
|
||||||
|
/* USER CODE END Prototypes */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __ADC_H__ */
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
/* USER CODE BEGIN Header */
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file dma.h
|
||||||
|
* @brief This file contains all the function prototypes for
|
||||||
|
* the dma.c file
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2024 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
/* USER CODE END Header */
|
||||||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||||
|
#ifndef __DMA_H__
|
||||||
|
#define __DMA_H__
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
/* DMA memory to memory transfer handles -------------------------------------*/
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Includes */
|
||||||
|
|
||||||
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Private defines */
|
||||||
|
|
||||||
|
/* USER CODE END Private defines */
|
||||||
|
|
||||||
|
void MX_DMA_Init(void);
|
||||||
|
|
||||||
|
/* USER CODE BEGIN Prototypes */
|
||||||
|
|
||||||
|
/* USER CODE END Prototypes */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __DMA_H__ */
|
||||||
|
|
16
Inc/main.h
16
Inc/main.h
|
@ -23,12 +23,13 @@
|
||||||
#define __MAIN_H
|
#define __MAIN_H
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C"
|
extern "C" {
|
||||||
{
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "stm32f4xx_ll_adc.h"
|
||||||
|
#include "stm32f4xx_ll_dma.h"
|
||||||
#include "stm32f4xx_ll_rcc.h"
|
#include "stm32f4xx_ll_rcc.h"
|
||||||
#include "stm32f4xx_ll_bus.h"
|
#include "stm32f4xx_ll_bus.h"
|
||||||
#include "stm32f4xx_ll_system.h"
|
#include "stm32f4xx_ll_system.h"
|
||||||
|
@ -36,7 +37,6 @@ extern "C"
|
||||||
#include "stm32f4xx_ll_cortex.h"
|
#include "stm32f4xx_ll_cortex.h"
|
||||||
#include "stm32f4xx_ll_utils.h"
|
#include "stm32f4xx_ll_utils.h"
|
||||||
#include "stm32f4xx_ll_pwr.h"
|
#include "stm32f4xx_ll_pwr.h"
|
||||||
#include "stm32f4xx_ll_dma.h"
|
|
||||||
#include "stm32f4xx_ll_tim.h"
|
#include "stm32f4xx_ll_tim.h"
|
||||||
#include "stm32f4xx_ll_gpio.h"
|
#include "stm32f4xx_ll_gpio.h"
|
||||||
|
|
||||||
|
@ -80,15 +80,15 @@ extern "C"
|
||||||
#define LED_GREEN_Pin LL_GPIO_PIN_1
|
#define LED_GREEN_Pin LL_GPIO_PIN_1
|
||||||
#define LED_GREEN_GPIO_Port GPIOE
|
#define LED_GREEN_GPIO_Port GPIOE
|
||||||
#ifndef NVIC_PRIORITYGROUP_0
|
#ifndef NVIC_PRIORITYGROUP_0
|
||||||
#define NVIC_PRIORITYGROUP_0 ((uint32_t)0x00000007) /*!< 0 bit for pre-emption priority, \
|
#define NVIC_PRIORITYGROUP_0 ((uint32_t)0x00000007) /*!< 0 bit for pre-emption priority,
|
||||||
4 bits for subpriority */
|
4 bits for subpriority */
|
||||||
#define NVIC_PRIORITYGROUP_1 ((uint32_t)0x00000006) /*!< 1 bit for pre-emption priority, \
|
#define NVIC_PRIORITYGROUP_1 ((uint32_t)0x00000006) /*!< 1 bit for pre-emption priority,
|
||||||
3 bits for subpriority */
|
3 bits for subpriority */
|
||||||
#define NVIC_PRIORITYGROUP_2 ((uint32_t)0x00000005) /*!< 2 bits for pre-emption priority, \
|
#define NVIC_PRIORITYGROUP_2 ((uint32_t)0x00000005) /*!< 2 bits for pre-emption priority,
|
||||||
2 bits for subpriority */
|
2 bits for subpriority */
|
||||||
#define NVIC_PRIORITYGROUP_3 ((uint32_t)0x00000004) /*!< 3 bits for pre-emption priority, \
|
#define NVIC_PRIORITYGROUP_3 ((uint32_t)0x00000004) /*!< 3 bits for pre-emption priority,
|
||||||
1 bit for subpriority */
|
1 bit for subpriority */
|
||||||
#define NVIC_PRIORITYGROUP_4 ((uint32_t)0x00000003) /*!< 4 bits for pre-emption priority, \
|
#define NVIC_PRIORITYGROUP_4 ((uint32_t)0x00000003) /*!< 4 bits for pre-emption priority,
|
||||||
0 bit for subpriority */
|
0 bit for subpriority */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,9 @@ void SVC_Handler(void);
|
||||||
void DebugMon_Handler(void);
|
void DebugMon_Handler(void);
|
||||||
void PendSV_Handler(void);
|
void PendSV_Handler(void);
|
||||||
void SysTick_Handler(void);
|
void SysTick_Handler(void);
|
||||||
|
void ADC_IRQHandler(void);
|
||||||
void TIM6_DAC_IRQHandler(void);
|
void TIM6_DAC_IRQHandler(void);
|
||||||
|
void DMA2_Stream0_IRQHandler(void);
|
||||||
/* USER CODE BEGIN EFP */
|
/* USER CODE BEGIN EFP */
|
||||||
|
|
||||||
/* USER CODE END EFP */
|
/* USER CODE END EFP */
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
[BREAKPOINTS]
|
||||||
|
ForceImpTypeAny = 0
|
||||||
|
ShowInfoWin = 1
|
||||||
|
EnableFlashBP = 2
|
||||||
|
BPDuringExecution = 0
|
||||||
|
[CFI]
|
||||||
|
CFISize = 0x00
|
||||||
|
CFIAddr = 0x00
|
||||||
|
[CPU]
|
||||||
|
MonModeVTableAddr = 0xFFFFFFFF
|
||||||
|
MonModeDebug = 0
|
||||||
|
MaxNumAPs = 0
|
||||||
|
LowPowerHandlingMode = 0
|
||||||
|
OverrideMemMap = 0
|
||||||
|
AllowSimulation = 1
|
||||||
|
ScriptFile=""
|
||||||
|
[FLASH]
|
||||||
|
RMWThreshold = 0x400
|
||||||
|
Loaders=""
|
||||||
|
EraseType = 0x00
|
||||||
|
CacheExcludeSize = 0x00
|
||||||
|
CacheExcludeAddr = 0x00
|
||||||
|
MinNumBytesFlashDL = 0
|
||||||
|
SkipProgOnCRCMatch = 1
|
||||||
|
VerifyDownload = 1
|
||||||
|
AllowCaching = 1
|
||||||
|
EnableFlashDL = 2
|
||||||
|
Override = 0
|
||||||
|
Device="ARM7"
|
||||||
|
[GENERAL]
|
||||||
|
WorkRAMSize = 0x00
|
||||||
|
WorkRAMAddr = 0x00
|
||||||
|
RAMUsageLimit = 0x00
|
||||||
|
[SWO]
|
||||||
|
SWOLogFile=""
|
||||||
|
[MEM]
|
||||||
|
RdOverrideOrMask = 0x00
|
||||||
|
RdOverrideAndMask = 0xFFFFFFFF
|
||||||
|
RdOverrideAddr = 0xFFFFFFFF
|
||||||
|
WrOverrideOrMask = 0x00
|
||||||
|
WrOverrideAndMask = 0xFFFFFFFF
|
||||||
|
WrOverrideAddr = 0xFFFFFFFF
|
||||||
|
[RAM]
|
||||||
|
VerifyDownload = 0x00
|
|
@ -103,7 +103,7 @@
|
||||||
<bEvRecOn>1</bEvRecOn>
|
<bEvRecOn>1</bEvRecOn>
|
||||||
<bSchkAxf>0</bSchkAxf>
|
<bSchkAxf>0</bSchkAxf>
|
||||||
<bTchkAxf>0</bTchkAxf>
|
<bTchkAxf>0</bTchkAxf>
|
||||||
<nTsel>3</nTsel>
|
<nTsel>4</nTsel>
|
||||||
<sDll></sDll>
|
<sDll></sDll>
|
||||||
<sDllPa></sDllPa>
|
<sDllPa></sDllPa>
|
||||||
<sDlgDll></sDlgDll>
|
<sDlgDll></sDlgDll>
|
||||||
|
@ -114,9 +114,18 @@
|
||||||
<tDlgDll></tDlgDll>
|
<tDlgDll></tDlgDll>
|
||||||
<tDlgPa></tDlgPa>
|
<tDlgPa></tDlgPa>
|
||||||
<tIfile></tIfile>
|
<tIfile></tIfile>
|
||||||
<pMon>BIN\CMSIS_AGDI.dll</pMon>
|
<pMon>Segger\JL2CM3.dll</pMon>
|
||||||
</DebugOpt>
|
</DebugOpt>
|
||||||
<TargetDriverDllRegistry>
|
<TargetDriverDllRegistry>
|
||||||
|
<SetRegEntry>
|
||||||
|
<Number>0</Number>
|
||||||
|
<Key>DLGUARM</Key>
|
||||||
|
</SetRegEntry>
|
||||||
|
<SetRegEntry>
|
||||||
|
<Number>0</Number>
|
||||||
|
<Key>JL2CM3</Key>
|
||||||
|
<Name>-U601012352 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGTx$CMSIS\Flash\STM32F4xx_1024.FLM)</Name>
|
||||||
|
</SetRegEntry>
|
||||||
<SetRegEntry>
|
<SetRegEntry>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
<Key>ARMRTXEVENTFLAGS</Key>
|
<Key>ARMRTXEVENTFLAGS</Key>
|
||||||
|
@ -137,11 +146,6 @@
|
||||||
<Key>CMSIS_AGDI</Key>
|
<Key>CMSIS_AGDI</Key>
|
||||||
<Name>-X"" -O206 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGTx$CMSIS\Flash\STM32F4xx_1024.FLM)</Name>
|
<Name>-X"" -O206 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGTx$CMSIS\Flash\STM32F4xx_1024.FLM)</Name>
|
||||||
</SetRegEntry>
|
</SetRegEntry>
|
||||||
<SetRegEntry>
|
|
||||||
<Number>0</Number>
|
|
||||||
<Key>DLGUARM</Key>
|
|
||||||
<Name></Name>
|
|
||||||
</SetRegEntry>
|
|
||||||
<SetRegEntry>
|
<SetRegEntry>
|
||||||
<Number>0</Number>
|
<Number>0</Number>
|
||||||
<Key>UL2CM3</Key>
|
<Key>UL2CM3</Key>
|
||||||
|
@ -154,6 +158,36 @@
|
||||||
</SetRegEntry>
|
</SetRegEntry>
|
||||||
</TargetDriverDllRegistry>
|
</TargetDriverDllRegistry>
|
||||||
<Breakpoint/>
|
<Breakpoint/>
|
||||||
|
<WatchWindow1>
|
||||||
|
<Ww>
|
||||||
|
<count>0</count>
|
||||||
|
<WinNumber>1</WinNumber>
|
||||||
|
<ItemText>p,0x0A</ItemText>
|
||||||
|
</Ww>
|
||||||
|
<Ww>
|
||||||
|
<count>1</count>
|
||||||
|
<WinNumber>1</WinNumber>
|
||||||
|
<ItemText>adcs</ItemText>
|
||||||
|
</Ww>
|
||||||
|
<Ww>
|
||||||
|
<count>2</count>
|
||||||
|
<WinNumber>1</WinNumber>
|
||||||
|
<ItemText>app</ItemText>
|
||||||
|
</Ww>
|
||||||
|
<Ww>
|
||||||
|
<count>3</count>
|
||||||
|
<WinNumber>1</WinNumber>
|
||||||
|
<ItemText>board,0x0A</ItemText>
|
||||||
|
</Ww>
|
||||||
|
</WatchWindow1>
|
||||||
|
<MemoryWindow1>
|
||||||
|
<Mm>
|
||||||
|
<WinNumber>1</WinNumber>
|
||||||
|
<SubType>0</SubType>
|
||||||
|
<ItemText>0x2001C9C0</ItemText>
|
||||||
|
<AccSizeX>0</AccSizeX>
|
||||||
|
</Mm>
|
||||||
|
</MemoryWindow1>
|
||||||
<Tracepoint>
|
<Tracepoint>
|
||||||
<THDelay>0</THDelay>
|
<THDelay>0</THDelay>
|
||||||
</Tracepoint>
|
</Tracepoint>
|
||||||
|
@ -228,7 +262,7 @@
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>Application/User</GroupName>
|
<GroupName>Application/User</GroupName>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>1</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<cbSel>0</cbSel>
|
<cbSel>0</cbSel>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
|
@ -263,6 +297,30 @@
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>../Src/adc.c</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>adc.c</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>2</GroupNumber>
|
||||||
|
<FileNumber>5</FileNumber>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>../Src/dma.c</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>dma.c</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>2</GroupNumber>
|
||||||
|
<FileNumber>6</FileNumber>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>../Src/tim.c</PathWithFileName>
|
<PathWithFileName>../Src/tim.c</PathWithFileName>
|
||||||
<FilenameWithoutPath>tim.c</FilenameWithoutPath>
|
<FilenameWithoutPath>tim.c</FilenameWithoutPath>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
|
@ -270,7 +328,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>2</GroupNumber>
|
<GroupNumber>2</GroupNumber>
|
||||||
<FileNumber>5</FileNumber>
|
<FileNumber>7</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -290,7 +348,7 @@
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>6</FileNumber>
|
<FileNumber>8</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -302,19 +360,19 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>7</FileNumber>
|
<FileNumber>9</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_tim.c</PathWithFileName>
|
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_adc.c</PathWithFileName>
|
||||||
<FilenameWithoutPath>stm32f4xx_ll_tim.c</FilenameWithoutPath>
|
<FilenameWithoutPath>stm32f4xx_ll_adc.c</FilenameWithoutPath>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<bShared>0</bShared>
|
<bShared>0</bShared>
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>8</FileNumber>
|
<FileNumber>10</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -326,7 +384,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>9</FileNumber>
|
<FileNumber>11</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -338,7 +396,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>10</FileNumber>
|
<FileNumber>12</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -350,7 +408,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>11</FileNumber>
|
<FileNumber>13</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -360,6 +418,18 @@
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<bShared>0</bShared>
|
<bShared>0</bShared>
|
||||||
</File>
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>3</GroupNumber>
|
||||||
|
<FileNumber>14</FileNumber>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_tim.c</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>stm32f4xx_ll_tim.c</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
</Group>
|
</Group>
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
|
@ -370,7 +440,7 @@
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>12</FileNumber>
|
<FileNumber>15</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -390,7 +460,7 @@
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>13</FileNumber>
|
<FileNumber>16</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -410,7 +480,7 @@
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>14</FileNumber>
|
<FileNumber>17</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -430,7 +500,7 @@
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>15</FileNumber>
|
<FileNumber>18</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -442,7 +512,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>16</FileNumber>
|
<FileNumber>19</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -454,7 +524,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>17</FileNumber>
|
<FileNumber>20</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -466,7 +536,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>18</FileNumber>
|
<FileNumber>21</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -478,7 +548,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>19</FileNumber>
|
<FileNumber>22</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -490,7 +560,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>20</FileNumber>
|
<FileNumber>23</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -502,7 +572,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>21</FileNumber>
|
<FileNumber>24</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -514,7 +584,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>22</FileNumber>
|
<FileNumber>25</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -526,7 +596,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>23</FileNumber>
|
<FileNumber>26</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -538,7 +608,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>24</FileNumber>
|
<FileNumber>27</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -550,7 +620,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>25</FileNumber>
|
<FileNumber>28</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -562,7 +632,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>26</FileNumber>
|
<FileNumber>29</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -574,7 +644,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>27</FileNumber>
|
<FileNumber>30</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -588,13 +658,13 @@
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>User/system</GroupName>
|
<GroupName>User/system</GroupName>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>1</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<cbSel>0</cbSel>
|
<cbSel>0</cbSel>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>28</FileNumber>
|
<FileNumber>31</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -606,7 +676,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>29</FileNumber>
|
<FileNumber>32</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -618,7 +688,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>30</FileNumber>
|
<FileNumber>33</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -630,7 +700,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>31</FileNumber>
|
<FileNumber>34</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -642,7 +712,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>32</FileNumber>
|
<FileNumber>35</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -654,7 +724,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>33</FileNumber>
|
<FileNumber>36</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -666,7 +736,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>34</FileNumber>
|
<FileNumber>37</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -678,7 +748,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>35</FileNumber>
|
<FileNumber>38</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -690,7 +760,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>36</FileNumber>
|
<FileNumber>39</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -702,7 +772,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>37</FileNumber>
|
<FileNumber>40</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -714,7 +784,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>38</FileNumber>
|
<FileNumber>41</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
@ -726,7 +796,7 @@
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>39</FileNumber>
|
<FileNumber>42</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
|
|
@ -53,7 +53,7 @@
|
||||||
<CreateExecutable>1</CreateExecutable>
|
<CreateExecutable>1</CreateExecutable>
|
||||||
<CreateLib>0</CreateLib>
|
<CreateLib>0</CreateLib>
|
||||||
<CreateHexFile>1</CreateHexFile>
|
<CreateHexFile>1</CreateHexFile>
|
||||||
<DebugInformation>0</DebugInformation>
|
<DebugInformation>1</DebugInformation>
|
||||||
<BrowseInformation>1</BrowseInformation>
|
<BrowseInformation>1</BrowseInformation>
|
||||||
<ListingPath></ListingPath>
|
<ListingPath></ListingPath>
|
||||||
<HexFormatSelection>1</HexFormatSelection>
|
<HexFormatSelection>1</HexFormatSelection>
|
||||||
|
@ -403,6 +403,118 @@
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>../Src/gpio.c</FilePath>
|
<FilePath>../Src/gpio.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>adc.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>../Src/adc.c</FilePath>
|
||||||
|
<FileOption>
|
||||||
|
<CommonProperty>
|
||||||
|
<UseCPPCompiler>2</UseCPPCompiler>
|
||||||
|
<RVCTCodeConst>0</RVCTCodeConst>
|
||||||
|
<RVCTZI>0</RVCTZI>
|
||||||
|
<RVCTOtherData>0</RVCTOtherData>
|
||||||
|
<ModuleSelection>0</ModuleSelection>
|
||||||
|
<IncludeInBuild>1</IncludeInBuild>
|
||||||
|
<AlwaysBuild>2</AlwaysBuild>
|
||||||
|
<GenerateAssemblyFile>2</GenerateAssemblyFile>
|
||||||
|
<AssembleAssemblyFile>2</AssembleAssemblyFile>
|
||||||
|
<PublicsOnly>2</PublicsOnly>
|
||||||
|
<StopOnExitCode>11</StopOnExitCode>
|
||||||
|
<CustomArgument></CustomArgument>
|
||||||
|
<IncludeLibraryModules></IncludeLibraryModules>
|
||||||
|
<ComprImg>1</ComprImg>
|
||||||
|
</CommonProperty>
|
||||||
|
<FileArmAds>
|
||||||
|
<Cads>
|
||||||
|
<interw>2</interw>
|
||||||
|
<Optim>0</Optim>
|
||||||
|
<oTime>2</oTime>
|
||||||
|
<SplitLS>2</SplitLS>
|
||||||
|
<OneElfS>2</OneElfS>
|
||||||
|
<Strict>2</Strict>
|
||||||
|
<EnumInt>2</EnumInt>
|
||||||
|
<PlainCh>2</PlainCh>
|
||||||
|
<Ropi>2</Ropi>
|
||||||
|
<Rwpi>2</Rwpi>
|
||||||
|
<wLevel>0</wLevel>
|
||||||
|
<uThumb>2</uThumb>
|
||||||
|
<uSurpInc>2</uSurpInc>
|
||||||
|
<uC99>2</uC99>
|
||||||
|
<uGnu>2</uGnu>
|
||||||
|
<useXO>2</useXO>
|
||||||
|
<v6Lang>0</v6Lang>
|
||||||
|
<v6LangP>0</v6LangP>
|
||||||
|
<vShortEn>2</vShortEn>
|
||||||
|
<vShortWch>2</vShortWch>
|
||||||
|
<v6Lto>2</v6Lto>
|
||||||
|
<v6WtE>2</v6WtE>
|
||||||
|
<v6Rtti>2</v6Rtti>
|
||||||
|
<VariousControls>
|
||||||
|
<MiscControls></MiscControls>
|
||||||
|
<Define></Define>
|
||||||
|
<Undefine></Undefine>
|
||||||
|
<IncludePath></IncludePath>
|
||||||
|
</VariousControls>
|
||||||
|
</Cads>
|
||||||
|
</FileArmAds>
|
||||||
|
</FileOption>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>dma.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>../Src/dma.c</FilePath>
|
||||||
|
<FileOption>
|
||||||
|
<CommonProperty>
|
||||||
|
<UseCPPCompiler>2</UseCPPCompiler>
|
||||||
|
<RVCTCodeConst>0</RVCTCodeConst>
|
||||||
|
<RVCTZI>0</RVCTZI>
|
||||||
|
<RVCTOtherData>0</RVCTOtherData>
|
||||||
|
<ModuleSelection>0</ModuleSelection>
|
||||||
|
<IncludeInBuild>1</IncludeInBuild>
|
||||||
|
<AlwaysBuild>2</AlwaysBuild>
|
||||||
|
<GenerateAssemblyFile>2</GenerateAssemblyFile>
|
||||||
|
<AssembleAssemblyFile>2</AssembleAssemblyFile>
|
||||||
|
<PublicsOnly>2</PublicsOnly>
|
||||||
|
<StopOnExitCode>11</StopOnExitCode>
|
||||||
|
<CustomArgument></CustomArgument>
|
||||||
|
<IncludeLibraryModules></IncludeLibraryModules>
|
||||||
|
<ComprImg>1</ComprImg>
|
||||||
|
</CommonProperty>
|
||||||
|
<FileArmAds>
|
||||||
|
<Cads>
|
||||||
|
<interw>2</interw>
|
||||||
|
<Optim>0</Optim>
|
||||||
|
<oTime>2</oTime>
|
||||||
|
<SplitLS>2</SplitLS>
|
||||||
|
<OneElfS>2</OneElfS>
|
||||||
|
<Strict>2</Strict>
|
||||||
|
<EnumInt>2</EnumInt>
|
||||||
|
<PlainCh>2</PlainCh>
|
||||||
|
<Ropi>2</Ropi>
|
||||||
|
<Rwpi>2</Rwpi>
|
||||||
|
<wLevel>0</wLevel>
|
||||||
|
<uThumb>2</uThumb>
|
||||||
|
<uSurpInc>2</uSurpInc>
|
||||||
|
<uC99>2</uC99>
|
||||||
|
<uGnu>2</uGnu>
|
||||||
|
<useXO>2</useXO>
|
||||||
|
<v6Lang>0</v6Lang>
|
||||||
|
<v6LangP>0</v6LangP>
|
||||||
|
<vShortEn>2</vShortEn>
|
||||||
|
<vShortWch>2</vShortWch>
|
||||||
|
<v6Lto>2</v6Lto>
|
||||||
|
<v6WtE>2</v6WtE>
|
||||||
|
<v6Rtti>2</v6Rtti>
|
||||||
|
<VariousControls>
|
||||||
|
<MiscControls></MiscControls>
|
||||||
|
<Define></Define>
|
||||||
|
<Undefine></Undefine>
|
||||||
|
<IncludePath></IncludePath>
|
||||||
|
</VariousControls>
|
||||||
|
</Cads>
|
||||||
|
</FileArmAds>
|
||||||
|
</FileOption>
|
||||||
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<FileName>tim.c</FileName>
|
<FileName>tim.c</FileName>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
|
@ -475,9 +587,9 @@
|
||||||
<FilePath>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_gpio.c</FilePath>
|
<FilePath>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_gpio.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<FileName>stm32f4xx_ll_tim.c</FileName>
|
<FileName>stm32f4xx_ll_adc.c</FileName>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_tim.c</FilePath>
|
<FilePath>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_adc.c</FilePath>
|
||||||
<FileOption>
|
<FileOption>
|
||||||
<CommonProperty>
|
<CommonProperty>
|
||||||
<UseCPPCompiler>2</UseCPPCompiler>
|
<UseCPPCompiler>2</UseCPPCompiler>
|
||||||
|
@ -601,6 +713,62 @@
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_exti.c</FilePath>
|
<FilePath>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_exti.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>stm32f4xx_ll_tim.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_tim.c</FilePath>
|
||||||
|
<FileOption>
|
||||||
|
<CommonProperty>
|
||||||
|
<UseCPPCompiler>2</UseCPPCompiler>
|
||||||
|
<RVCTCodeConst>0</RVCTCodeConst>
|
||||||
|
<RVCTZI>0</RVCTZI>
|
||||||
|
<RVCTOtherData>0</RVCTOtherData>
|
||||||
|
<ModuleSelection>0</ModuleSelection>
|
||||||
|
<IncludeInBuild>1</IncludeInBuild>
|
||||||
|
<AlwaysBuild>2</AlwaysBuild>
|
||||||
|
<GenerateAssemblyFile>2</GenerateAssemblyFile>
|
||||||
|
<AssembleAssemblyFile>2</AssembleAssemblyFile>
|
||||||
|
<PublicsOnly>2</PublicsOnly>
|
||||||
|
<StopOnExitCode>11</StopOnExitCode>
|
||||||
|
<CustomArgument></CustomArgument>
|
||||||
|
<IncludeLibraryModules></IncludeLibraryModules>
|
||||||
|
<ComprImg>1</ComprImg>
|
||||||
|
</CommonProperty>
|
||||||
|
<FileArmAds>
|
||||||
|
<Cads>
|
||||||
|
<interw>2</interw>
|
||||||
|
<Optim>0</Optim>
|
||||||
|
<oTime>2</oTime>
|
||||||
|
<SplitLS>2</SplitLS>
|
||||||
|
<OneElfS>2</OneElfS>
|
||||||
|
<Strict>2</Strict>
|
||||||
|
<EnumInt>2</EnumInt>
|
||||||
|
<PlainCh>2</PlainCh>
|
||||||
|
<Ropi>2</Ropi>
|
||||||
|
<Rwpi>2</Rwpi>
|
||||||
|
<wLevel>0</wLevel>
|
||||||
|
<uThumb>2</uThumb>
|
||||||
|
<uSurpInc>2</uSurpInc>
|
||||||
|
<uC99>2</uC99>
|
||||||
|
<uGnu>2</uGnu>
|
||||||
|
<useXO>2</useXO>
|
||||||
|
<v6Lang>0</v6Lang>
|
||||||
|
<v6LangP>0</v6LangP>
|
||||||
|
<vShortEn>2</vShortEn>
|
||||||
|
<vShortWch>2</vShortWch>
|
||||||
|
<v6Lto>2</v6Lto>
|
||||||
|
<v6WtE>2</v6WtE>
|
||||||
|
<v6Rtti>2</v6Rtti>
|
||||||
|
<VariousControls>
|
||||||
|
<MiscControls></MiscControls>
|
||||||
|
<Define></Define>
|
||||||
|
<Undefine></Undefine>
|
||||||
|
<IncludePath></IncludePath>
|
||||||
|
</VariousControls>
|
||||||
|
</Cads>
|
||||||
|
</FileArmAds>
|
||||||
|
</FileOption>
|
||||||
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
<Group>
|
<Group>
|
||||||
|
@ -725,57 +893,6 @@
|
||||||
<FileName>adcs.c</FileName>
|
<FileName>adcs.c</FileName>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>..\User\system\bsp\adcs.c</FilePath>
|
<FilePath>..\User\system\bsp\adcs.c</FilePath>
|
||||||
<FileOption>
|
|
||||||
<CommonProperty>
|
|
||||||
<UseCPPCompiler>2</UseCPPCompiler>
|
|
||||||
<RVCTCodeConst>0</RVCTCodeConst>
|
|
||||||
<RVCTZI>0</RVCTZI>
|
|
||||||
<RVCTOtherData>0</RVCTOtherData>
|
|
||||||
<ModuleSelection>0</ModuleSelection>
|
|
||||||
<IncludeInBuild>0</IncludeInBuild>
|
|
||||||
<AlwaysBuild>0</AlwaysBuild>
|
|
||||||
<GenerateAssemblyFile>2</GenerateAssemblyFile>
|
|
||||||
<AssembleAssemblyFile>2</AssembleAssemblyFile>
|
|
||||||
<PublicsOnly>2</PublicsOnly>
|
|
||||||
<StopOnExitCode>11</StopOnExitCode>
|
|
||||||
<CustomArgument></CustomArgument>
|
|
||||||
<IncludeLibraryModules></IncludeLibraryModules>
|
|
||||||
<ComprImg>1</ComprImg>
|
|
||||||
</CommonProperty>
|
|
||||||
<FileArmAds>
|
|
||||||
<Cads>
|
|
||||||
<interw>2</interw>
|
|
||||||
<Optim>0</Optim>
|
|
||||||
<oTime>2</oTime>
|
|
||||||
<SplitLS>2</SplitLS>
|
|
||||||
<OneElfS>2</OneElfS>
|
|
||||||
<Strict>2</Strict>
|
|
||||||
<EnumInt>2</EnumInt>
|
|
||||||
<PlainCh>2</PlainCh>
|
|
||||||
<Ropi>2</Ropi>
|
|
||||||
<Rwpi>2</Rwpi>
|
|
||||||
<wLevel>0</wLevel>
|
|
||||||
<uThumb>2</uThumb>
|
|
||||||
<uSurpInc>2</uSurpInc>
|
|
||||||
<uC99>2</uC99>
|
|
||||||
<uGnu>2</uGnu>
|
|
||||||
<useXO>2</useXO>
|
|
||||||
<v6Lang>0</v6Lang>
|
|
||||||
<v6LangP>0</v6LangP>
|
|
||||||
<vShortEn>2</vShortEn>
|
|
||||||
<vShortWch>2</vShortWch>
|
|
||||||
<v6Lto>2</v6Lto>
|
|
||||||
<v6WtE>2</v6WtE>
|
|
||||||
<v6Rtti>2</v6Rtti>
|
|
||||||
<VariousControls>
|
|
||||||
<MiscControls></MiscControls>
|
|
||||||
<Define></Define>
|
|
||||||
<Undefine></Undefine>
|
|
||||||
<IncludePath></IncludePath>
|
|
||||||
</VariousControls>
|
|
||||||
</Cads>
|
|
||||||
</FileArmAds>
|
|
||||||
</FileOption>
|
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<FileName>bsp.c</FileName>
|
<FileName>bsp.c</FileName>
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
:020000040800F2
|
:020000040800F2
|
||||||
:1000000080180020A101000815070008130200084D
|
:10000000F01C0020A1010008990C00085D02000806
|
||||||
:10001000110700080D020008550900080000000043
|
:10001000950C000817020008D90E00080000000027
|
||||||
:100020000000000000000000000000001B070008A6
|
:100020000000000000000000000000009F0C00081D
|
||||||
:100030001102000800000000190700081D07000851
|
:100030005B020008000000009D0C0008A10C0008F5
|
||||||
:10004000BB010008BB010008BB010008BB010008A0
|
:10004000BB010008BB010008BB010008BB010008A0
|
||||||
:10005000BB010008BB010008BB010008BB01000890
|
:10005000BB010008BB010008BB010008BB01000890
|
||||||
:10006000BB010008BB010008BB010008BB01000880
|
:10006000BB010008BB010008BB010008BB01000880
|
||||||
:10007000BB010008BB010008BB010008BB01000870
|
:10007000BB010008BB010008BB010008BB01000870
|
||||||
:10008000BB010008BB010008BB010008BB01000860
|
:10008000BB010008BB0100080D020008BB0100080D
|
||||||
:10009000BB010008BB010008BB010008BB01000850
|
:10009000BB010008BB010008BB010008BB01000850
|
||||||
:1000A000BB010008BB010008BB010008BB01000840
|
:1000A000BB010008BB010008BB010008BB01000840
|
||||||
:1000B000BB010008BB010008BB010008BB01000830
|
:1000B000BB010008BB010008BB010008BB01000830
|
||||||
|
@ -16,200 +16,396 @@
|
||||||
:1000E000BB010008BB010008BB010008BB01000800
|
:1000E000BB010008BB010008BB010008BB01000800
|
||||||
:1000F000BB010008BB010008BB010008BB010008F0
|
:1000F000BB010008BB010008BB010008BB010008F0
|
||||||
:10010000BB010008BB010008BB010008BB010008DF
|
:10010000BB010008BB010008BB010008BB010008DF
|
||||||
:10011000BB010008BB0100086D080008BB01000816
|
:10011000BB010008BB010008F10D0008BB0100088D
|
||||||
:10012000BB010008BB010008BB010008BB010008BF
|
:1001200051020008BB010008BB010008BB01000828
|
||||||
:10013000BB010008BB010008BB010008BB010008AF
|
:10013000BB010008BB010008BB010008BB010008AF
|
||||||
:10014000BB010008BB010008BB010008BB0100089F
|
:10014000BB010008BB010008BB010008BB0100089F
|
||||||
:10015000BB010008BB010008BB010008BB0100088F
|
:10015000BB010008BB010008BB010008BB0100088F
|
||||||
:10016000BB010008BB010008BB010008BB0100087F
|
:10016000BB010008BB010008BB010008BB0100087F
|
||||||
:10017000BB010008BB010008BB0100080000000033
|
:10017000BB010008BB010008BB0100080000000033
|
||||||
:10018000BB010008BB010008DFF810D000F02CF81C
|
:10018000BB010008BB010008DFF810D000F02CF81C
|
||||||
:1001900000480047C90A0008AFF30080801800201B
|
:1001900000480047C1150008AFF30080F01C0020A4
|
||||||
:1001A0000648804706480047FEE7FEE7FEE7FEE711
|
:1001A0000648804706480047FEE7FEE7FEE7FEE711
|
||||||
:1001B000FEE7FEE7FEE7FEE7FEE7FEE75908000878
|
:1001B000FEE7FEE7FEE7FEE7FEE7FEE7DD0D0008EF
|
||||||
:1001C00089010008D2B201E000F8012B491EFBD2E0
|
:1001C00089010008D2B201E000F8012B491EFBD2E0
|
||||||
:1001D00070470022F6E710B513460A460446194652
|
:1001D00070470022F6E710B513460A460446194652
|
||||||
:1001E000FFF7F0FF204610BD064C074D06E0E06823
|
:1001E000FFF7F0FF204610BD064C074D06E0E06823
|
||||||
:1001F00040F0010394E8070098471034AC42F6D36E
|
:1001F00040F0010394E8070098471034AC42F6D36E
|
||||||
:10020000FFF7C6FFB00C0008D00C000800BFFEE7E7
|
:10020000FFF7C6FFE01800081019000810B500201D
|
||||||
:10021000704700BFFEE7000008B5054909680143C3
|
:1002100000F0CAFE10BD00BFFEE7000030B5024688
|
||||||
:10022000034A1160114609680140009100BF08BDF2
|
:100220000B4600BF7AB90220084C616920EA01043C
|
||||||
:1002300030380240F0B502460B4600240021186811
|
:1002300001EA000544EA0544044DAC6100BF01E059
|
||||||
:1002400090FAA0F0B0FA80F48AE00125A540186881
|
:1002400000BF00BFFCE700BF012030BD001002402E
|
||||||
:1002500000EA050100297DD05868012802D05868BD
|
:1002500010B5002000F07CFE10BD704700BFFEE727
|
||||||
:1002600002281CD19868956891FAA1F6B6FA86F62C
|
:100260002DE9F04105460C460026606800B100BF4C
|
||||||
:1002700077000326BE40B54391FAA1F6B6FA86F69A
|
:10027000134800F04FF80746124800F04BF80743C8
|
||||||
:10028000760000FA06F63543956000BFD8685568D9
|
:10028000114800F047F80743AFB9606860B1D4E99E
|
||||||
:100290008D4301FB00F63543556000BF00BF186970
|
:1002900000010843A1680843E168084369680B4A04
|
||||||
:1002A000D56891FAA1F6B6FA86F677000326BE4025
|
:1002A00011400843686007E0686808490840216811
|
||||||
:1002B000B54391FAA1F6B6FA86F6760000FA06F68C
|
:1002B0000843686000E001263046BDE8F081000098
|
||||||
:1002C0003543D56000BF5868022831D191FAA1F0BA
|
:1002C000002001400021014000220140E010FCFF1D
|
||||||
:1002D000B0FA80F0082814D25869156A91FAA1F68C
|
:1002D000816821F0010181607047000070B504461B
|
||||||
:1002E000B6FA86F6B7000F26BE40B54391FAA1F6DE
|
:1002E0000D460026204600F015F870B9A968286868
|
||||||
:1002F000B6FA86F6B60000FA06F63543156200BF78
|
:1002F00008436168064A114008436060A06820F422
|
||||||
:1003000016E05869556A0E0A96FAA6F6B6FA86F607
|
:10030000006069680843A06000E00126304670BDC7
|
||||||
:10031000B7000F26BE40B5430E0A96FAA6F6B6FA07
|
:10031000FFFEFFFC0146886800F001007047000006
|
||||||
:1003200086F6B60000FA06F63543556200BF00BFF8
|
:1003200070B504460D460026686800B100BF20463F
|
||||||
:100330005868156891FAA1F6B6FA86F67700032692
|
:10033000FFF7F0FF00BB686830B1606820F46840E8
|
||||||
:10034000BE40B54391FAA1F6B6FA86F6760000FAF9
|
:10034000A9680843606003E0606820F4684060606A
|
||||||
:1003500006F600E003E03543156000BF00BF641CF3
|
:10035000286800F07060E968084329690843A168CB
|
||||||
:100360001868E04000287FF470AFF0BD02480068D4
|
:10036000074A11400843A0606868E16A21F47001FF
|
||||||
:10037000401C014908607047480000204FF47A7122
|
:100370000143E16200BF00E00126304670BD00008D
|
||||||
:10038000B0FBF1F2521E4FF0E0235A6100229A6155
|
:10038000FDFCFFC070B501F440744FF4407595FA60
|
||||||
:1003900005221A6100BF70470149086070470000DC
|
:10039000A5F5B5FA85F5EC4000F12C0505EB8403D5
|
||||||
:1003A0000000002010B5024613682C4882420ED08F
|
:1003A0001C6801F01F061F25B540AC4302F01F0575
|
||||||
:1003B000B2F1804F0BD02A48824208D029488242AD
|
:1003B00001F01F06B5402C431C6070BD70B501F004
|
||||||
:1003C00005D02948824202D02848824204D123F035
|
:1003C00000744FF0007595FAA5F5B5FA85F5EC4087
|
||||||
:1003D00070004C6840EA04032048824220D0B2F109
|
:1003D00000F10C0505EB84031C6801F0F8754FF083
|
||||||
:1003E000804F1DD01E4882421AD01E48824217D02C
|
:1003E000F87696FAA6F6B6FA86F6F5400726AE40F7
|
||||||
:1003F0001D48824214D01D48824211D01C488242BE
|
:1003F000B44301F0F8754FF0F87696FAA6F6B6FA1F
|
||||||
:100400000ED01C4882420BD01B48824208D01B48A9
|
:1004000086F6F54002FA05F52C431C6070BD426883
|
||||||
:10041000824205D01A48824202D01A48824204D150
|
:1004100022F440020A4342607047426822F44002DC
|
||||||
:1004200023F44070CC6840EA040313608868D0620B
|
:100420000A4342607047000008B505490968014366
|
||||||
:1004300000BF0888906200BF0848824202D00B4883
|
:10043000034A1160114609680140009100BF08BDE0
|
||||||
:10044000824203D10869106300BF00BF00BF50693A
|
:1004400030380240F0B502460B46002400211868FF
|
||||||
:1004500040F00100506100BF002010BD00000140CD
|
:1004500090FAA0F0B0FA80F48AE00125A54018686F
|
||||||
:100460000004004000080040000C0040000401406F
|
:1004600000EA050100297DD05868012802D05868AB
|
||||||
:100470000040014000440140004801400018004095
|
:1004700002281CD19868956891FAA1F6B6FA86F61A
|
||||||
:10048000001C0040002000400146086900F0010007
|
:1004800077000326BE40B54391FAA1F6B6FA86F688
|
||||||
:100490007047000000B587B0182101A8FFF799FE4A
|
:10049000760000FA06F63543956000BFD8685568C7
|
||||||
:1004A0001020FFF7B9FE4FF48070FFF7B5FE04206F
|
:1004A0008D4301FB00F63543556000BF00BF18695E
|
||||||
:1004B000FFF7B2FE2020FFF7AFFE8020FFF7ACFE73
|
:1004B000D56891FAA1F6B6FA86F677000326BE4013
|
||||||
:1004C0000120FFF7A9FE0220FFF7A6FE4020FFF75C
|
:1004C000B54391FAA1F6B6FA86F6760000FA06F67A
|
||||||
:1004D000A3FE0820FFF7A0FE03203A49886100BF71
|
:1004D0003543D56000BF5868022831D191FAA1F0A8
|
||||||
:1004E0004FF6FC700190032002900020059001A9B6
|
:1004E000B0FA80F0082814D25869156A91FAA1F67A
|
||||||
:1004F0003448FFF79FFE40F6FF7001900320029002
|
:1004F000B6FA86F6B7000F26BE40B54391FAA1F6CC
|
||||||
:100500000020059001A93048FFF794FE43F6FF70E4
|
:10050000B6FA86F6B60000FA06F63543156200BF65
|
||||||
:100510000190032002900020059001A92B48FFF7CD
|
:1005100016E05869556A0E0A96FAA6F6B6FA86F6F5
|
||||||
:1005200089FE4FF6FF700190032002900020059095
|
:10052000B7000F26BE40B5430E0A96FAA6F6B6FAF5
|
||||||
:1005300001A92748FFF77EFE49F6FF7001900320CE
|
:1005300086F6B60000FA06F63543556200BF00BFE6
|
||||||
:1005400002900020059001A92248FFF773FE4FF6A4
|
:100540005868156891FAA1F6B6FA86F67700032680
|
||||||
:10055000FC700190032002900020059001A91E4824
|
:10055000BE40B54391FAA1F6B6FA86F6760000FAE7
|
||||||
:10056000FFF768FE4FF6FF70019003200290002015
|
:1005600006F600E003E03543156000BF00BF641CE1
|
||||||
:10057000059001A91948FFF75DFE4FF6FF70019045
|
:100570001868E04000287FF470AFF0BD10B5426904
|
||||||
:10058000032002900020059001A91548FFF752FEB4
|
:1005800021EA020302EA010443EA0443836110BD45
|
||||||
:100590004FF6FF700190032002900020059001A902
|
:1005900002480068401C0149086070474C00002078
|
||||||
:1005A0001048FFF747FE032001900120029002202F
|
:1005A0004FF47A71B0FBF1F2521E4FF0E0235A6122
|
||||||
:1005B000039000200490059001A90248FFF73AFE3D
|
:1005B00000229A6105221A6100BF70470149086054
|
||||||
:1005C00007B000BD001002400020024000080240B9
|
:1005C000704700000000002010B5024613682C4858
|
||||||
:1005D0000014024000000240001C024000040240DF
|
:1005D00082420ED0B2F1804F0BD02A48824208D01E
|
||||||
:1005E00000180240000C02402DE9F04186B01421B1
|
:1005E0002948824205D02948824202D028488242C6
|
||||||
:1005F00001A8FFF7EEFD1020414909680143404A78
|
:1005F00004D123F070004C6840EA04032048824292
|
||||||
:100600001160114609680140009100BF00BF36210A
|
:1006000020D0B2F1804F1DD01E4882421AD01E4821
|
||||||
:100610003C4B1B68C3F30220062400250346C3F1AC
|
:10061000824217D01D48824214D01D48824211D018
|
||||||
:10062000070CBCF1040F02D94FF0040C01E0C3F138
|
:100620001C4882420ED01C4882420BD01B4882429A
|
||||||
:10063000070C674603F1040CBCF1070F02D24FF020
|
:1006300008D01B48824205D01A48824202D01A488C
|
||||||
:10064000000C01E0A3F1030C66464FF0010C0CFA1C
|
:10064000824204D123F44070CC6840EA0403136072
|
||||||
:1006500007FCACF1010C0CEA040C0CFA06FC4FF0A0
|
:100650008868D06200BF0888906200BF0848824264
|
||||||
:10066000010808FA06F8A8F1010808EA05084CEAAA
|
:1006600002D00B48824203D10869106300BF00BF6B
|
||||||
:10067000080200BF002904DB1007030E2248435480
|
:1006700000BF506940F00100506100BF002010BD74
|
||||||
:1006800007E01007040E1F480C3001F00F031B1F7A
|
:10068000000001400004004000080040000C004051
|
||||||
:10069000C45400BF3620002809DB00F01F020121EE
|
:100690000004014000400140004401400048014086
|
||||||
:1006A00091404209920002F1E022C2F8001100BF1D
|
:1006A00000180040001C004000200040014608697E
|
||||||
:1006B00044F29F10ADF804000020029063200390E4
|
:1006B00000F00100704708B54FF0E0210969009192
|
||||||
:1006C00001A91248FFF76EFE00BF1048006820F035
|
:1006C00000BF411C01B1401C06E04FF0E021096968
|
||||||
:1006D00080000E49086000BF0020496821F07001C9
|
:1006D00001F4803101B1401E0028F6D108BD0000B0
|
||||||
:1006E00001430A4A516000BF00BF1046806820F0F5
|
:1006E0002DE9F0418EB000200B900C900D9014215C
|
||||||
:1006F00080001146886000BF06B0BDE8F0810000B0
|
:1006F00006A8FFF76EFD002002900390049005907D
|
||||||
:10070000403802400CED00E000E400E00010004042
|
:100700004FF48070874909680143864A1160114699
|
||||||
:1007100000BFFEE700BFFEE770477047704700006C
|
:1007100009680140019100BF00BF834800210A46DB
|
||||||
:1007200070B505204749096821F007010143454A92
|
:10072000824B5B5CC35823F0606313437F4C645C73
|
||||||
:10073000116000BF00BF00BF4248006800F0070022
|
:10073000035100BF00BF7D4B5B5CC35823F0C00377
|
||||||
:100740000528F8D14FF480403F49096821F48041E1
|
:1007400013437A4C645C035100BF00BF774B5B5C82
|
||||||
:1007500001433D4A116000BF00BF3C48006840F4BF
|
:10075000C35823F440331343744C645C035100BF0B
|
||||||
:1007600080303A49086000BF00BF00BF37480068CA
|
:100760008215724B5B5CC35823F4907313436F4C38
|
||||||
:10077000C0F340400028F8D04FF480000421A822A4
|
:10077000645C035100BF0A466C4B5B5CC35823F4B6
|
||||||
:10078000002340EA010444EA8214304D2D1D2D68F7
|
:1007800000731343694C645C035100BF0215674B4F
|
||||||
:100790002F4E35402C432D4D2D1D2C602C462468AA
|
:100790005B5CC35823F480631343644C645C035173
|
||||||
:1007A00024F440341C432C6000BF00BF281F0068A5
|
:1007A00000BFC214614B5B5CC35823F4C0531343B6
|
||||||
:1007B00040F08070291F086000BF00BF00BF2348C1
|
:1007B0005E4C645C035100BF92005C4B5B5CC358B1
|
||||||
:1007C0000068C0F340600028F8D000BF00BF1E489A
|
:1007C00023F4C0431343594C645C035100BF00BF82
|
||||||
:1007D0004068C0F380300028F8D000201B49083161
|
:1007D000564A525C0244526922F00402534B5B5C5D
|
||||||
:1007E000096821F0F0010143184A0832116000BF86
|
:1007E00003445A6100BF1221514B1B68C3F302201E
|
||||||
:1007F0004FF4A0501146096821F4E0510143116003
|
:1007F000002425460346C3F1070CBCF1040F02D9BF
|
||||||
:1008000000BF4FF400401146096821F460410143E4
|
:100800004FF0040C01E0C3F1070C674603F1040C40
|
||||||
:10081000116000BF02201146096821F00301014365
|
:10081000BCF1070F02D24FF0000C01E0A3F1030C72
|
||||||
:10082000116000BF00BF00BF08480830006800F03A
|
:1008200066464FF0010C0CFA07FCACF1010C0CEA27
|
||||||
:100830000C000828F7D10748FFF7A0FD0548FFF78F
|
:10083000040C0CFA06FC4FF0010808FA06F8A8F1BF
|
||||||
:10084000ABFD70BD003C024000700040003802402B
|
:10084000010808EA05084CEA080200BF002904DB99
|
||||||
:100850000080BFFF007A030A0348006840F470007C
|
:100850001007030E3748435407E01007040E3448CE
|
||||||
:10086000014908607047000088ED00E010B5374886
|
:100860000C3001F00F031B1FC45400BF12200028DE
|
||||||
:10087000FFF70AFE012868D100BF00BF33480069B6
|
:1008700009DB00F01F02012191404209920002F1C0
|
||||||
:10088000C0F3400060B100BF3048C068C0F3400012
|
:10088000E022C2F8001100BF00200B900C904FF442
|
||||||
:1008900030B100BF6FF002002C49086100BF00BFFB
|
:1008900080700D900BA92848FFF720FD00200690DE
|
||||||
:1008A00000BF2A480069C0F3800060B100BF27483C
|
:1008A0004FF48010079000200890022009904FF428
|
||||||
:1008B000C068C0F3800030B100BF6FF0040023496E
|
:1008B00040700A9006A92048FFF732FD00201E492B
|
||||||
:1008C000086100BF00BF00BF20480069C0F3C0003E
|
:1008C000896821F4806101431B4A916000BF4FF4A5
|
||||||
:1008D00060B100BF1D48C068C0F3C00030B100BFA8
|
:1008D000803002900020039002A91848FFF7C0FC66
|
||||||
:1008E0006FF008001949086100BF00BF00BF17483A
|
:1008E000174A4FF400711448FFF74CFD02221449D7
|
||||||
:1008F0000069C0F3001060B100BF1448C068C0F3C5
|
:1008F0001148FFF763FD4FF400011048FFF787FD33
|
||||||
:10090000001030B100BF6FF010001049086100BF47
|
:10090000104A910D0C48FFF73DFD02220D490A489F
|
||||||
:1009100000BF0E48FFF7B8FD01280CD100BF0B48FF
|
:10091000FFF754FD4FF400010848FFF778FD0EB0D3
|
||||||
:10092000C06800F0010030B100BF6FF0010007495E
|
:10092000BDE8F081443802400064024058180008D5
|
||||||
:10093000086100BF00BF00BFFFF718FD00BF0448FB
|
:100930000CED00E000E400E0002001400023014055
|
||||||
:100940000068401C0249086000BF10BD0010004054
|
:1009400010002081110050812DE9F8414FF4800002
|
||||||
:100950004000002000BFFEE702E008C8121F08C1E7
|
:100950002E49096801432D4A11601146096801407A
|
||||||
:10096000002AFAD170477047002001E001C1121F30
|
:10096000009100BF00BF3821294B1B68C3F3022050
|
||||||
:10097000002AFBD170470000014601F1100000E0A1
|
:10097000002425460346C3F1070CBCF1040F02D93D
|
||||||
:10098000001D02681AB9024A12689042F8D37047F3
|
:100980004FF0040C01E0C3F1070C674603F1040CBF
|
||||||
:100990001C00002010B50648046803E02046FFF75D
|
:10099000BCF1070F02D24FF0000C01E0A3F1030CF1
|
||||||
:1009A000EBFF0446034800688442F7D310BD000003
|
:1009A00066464FF0010C0CFA07FCACF1010C0CEAA6
|
||||||
:1009B000180000201C00002000200B4908600B4993
|
:1009B000040C0CFA06FC4FF0010808FA06F8A8F13E
|
||||||
:1009C000086000BF00BF0A48006840F00100084905
|
:1009C000010808EA05084CEA080200BF002904DB18
|
||||||
:1009D000086000BF00BF0846C06840F00100C86062
|
:1009D0001007030E0F48435407E01007040E0C489D
|
||||||
:1009E00000BF00BF70470000040000200C00002082
|
:1009E0000C3001F00F031B1FC45400BF3820002837
|
||||||
:1009F0000010004010B5034800F00AF8024800F06B
|
:1009F00009DB00F01F02012191404209920002F13F
|
||||||
:100A000031F810BD040000200C00002070470000E9
|
:100A0000E022C2F8001100BFBDE8F8813038024092
|
||||||
:100A100008B5014600200090086810B1112813D1D4
|
:100A10000CED00E000E400E000B587B0182101A86B
|
||||||
:100A200008E000BF00BF0B480068486000BF11200D
|
:100A2000FFF7D7FB1020FFF7FFFC4FF48070FFF7B4
|
||||||
:100A3000086000BF074A48681268101A0A2801D2E5
|
:100A3000FBFC0420FFF7F8FC2020FFF7F5FC8020EA
|
||||||
:100A4000002008BD00BFEDE70020086000900320F3
|
:100A4000FFF7F2FC0120FFF7EFFC0220FFF7ECFCC0
|
||||||
:100A5000F7E70000400000200149086070470000EF
|
:100A50004020FFF7E9FC0820FFF7E6FC03203A49B5
|
||||||
:100A60004400002018B5014600200090086810B12D
|
:100A6000886100BF4FF6FC700190032002900020C7
|
||||||
:100A700024281FD114E000BF0220114B5A6920EA3C
|
:100A7000059001A93448FFF7E5FC40F6FF700190AE
|
||||||
:100A8000020302EA000443EA04430D4CA36100BFE1
|
:100A8000032002900020059001A93048FFF7DAFC0E
|
||||||
:100A900000BF0C480068486000BF2420086000BF09
|
:100A900043F6FF700190032002900020059001A909
|
||||||
:100AA000084A48681268101A642801D2002018BD4C
|
:100AA0002B48FFF7CFFC4FF6FF7001900320029018
|
||||||
:100AB00000BFE1E70020086000900320F7E7000096
|
:100AB0000020059001A92748FFF7C4FC49F6FF7004
|
||||||
:100AC000001002404000002008B54FF4804040492B
|
:100AC0000190032002900020059001A92248FFF721
|
||||||
:100AD000096801433E4A11601146096801400091CE
|
:100AD000B9FC4FF6FC7001900320029000200590B5
|
||||||
:100AE00000BF00BF8003111F09680143121F11607E
|
:100AE00001A91E48FFF7AEFC4FF6FF7001900320EE
|
||||||
:100AF000114609680140009100BF00BF0320024673
|
:100AF00002900020059001A91948FFF7A3FC4FF6CA
|
||||||
:100B0000344B19684FF6FF031940334B0B4343EA4C
|
:100B0000FF700190032002900020059001A9154874
|
||||||
:100B10000221304B196000BF011F1B68C3F3022084
|
:100B1000FFF798FC4FF6FF70019003200290002031
|
||||||
:100B20000F2400250346C3F1070CBCF1040F02D9C2
|
:100B2000059001A91048FFF78DFC032001900120DA
|
||||||
:100B30004FF0040C01E0C3F1070C674603F1040C0D
|
:100B300002900220039000200490059001A9024831
|
||||||
:100B4000BCF1070F02D24FF0000C01E0A3F1030C3F
|
:100B4000FFF780FC07B000BD00100240002002400B
|
||||||
:100B500066464FF0010C0CFA07FCACF1010C0CEAF4
|
:100B5000000802400014024000000240001C024055
|
||||||
:100B6000040C0CFA06FC4FF0010808FA06F8A8F18C
|
:100B60000004024000180240000C02402DE9F04150
|
||||||
:100B7000010808EA05084CEA080200BF002904DB66
|
:100B700086B0142101A8FFF72CFB10204149096819
|
||||||
:100B80001007030E1548435407E01007040E1148E0
|
:100B80000143404A1160114609680140009100BFCD
|
||||||
:100B90000C3001F00F031B1FC45400BFFFF7C0FD52
|
:100B900000BF36213C4B1B68C3F30220062400250E
|
||||||
:100BA0000F4800680F49B0FBF1F084B22046FFF710
|
:100BA0000346C3F1070CBCF1040F02D94FF0040C4B
|
||||||
:100BB00053FFFFF76FFCFFF717FD002000F014F85C
|
:100BB00001E0C3F1070C674603F1040CBCF1070F19
|
||||||
:100BC000FFF724FFFFF7F8FE01E0FFF713FFFCE754
|
:100BC00002D24FF0000C01E0A3F1030C66464FF097
|
||||||
:100BD000443802400CED00E00000FA0500E400E0BB
|
:100BD000010C0CFA07FCACF1010C0CEA040C0CFA49
|
||||||
:100BE0000000002040420F0010B504460C4951F8A7
|
:100BE00006FC4FF0010808FA06F8A8F1010808EA27
|
||||||
:100BF00024104A000B4951F82400002100F036F877
|
:100BF00005084CEA080200BF002904DB1007030EB9
|
||||||
:100C0000094951F824200749083951F824000021E6
|
:100C00002248435407E01007040E1F480C3001F03F
|
||||||
:100C100000F02CF8012103480830015510BD0000F8
|
:100C10000F031B1FC45400BF3620002809DB00F05F
|
||||||
:100C2000980C000834000020A80C000810B50146FC
|
:100C20001F02012191404209920002F1E022C2F824
|
||||||
:100C30000023002207E00B4850F8210030F8120092
|
:100C3000001100BF44F29F10ADF8040000200290A4
|
||||||
:100C400000B15B1C521C084850F821009042F2D8B9
|
:100C40006320039001A91248FFF7BEFC00BF1048C3
|
||||||
:100C500064205843044C54F82140B0FBF4F0C0B277
|
:100C5000006820F080000E49086000BF002049684D
|
||||||
:100C600010BD000034000020980C000830B5034689
|
:100C600021F0700101430A4A516000BF00BF1046E5
|
||||||
:100C700001E003F8011B141EA2F10102F9D130BDFD
|
:100C7000806820F080001146886000BF06B0BDE8A3
|
||||||
:100C80005F6C697374006C69737420616C6C2063B1
|
:100C8000F0810000403802400CED00E000E400E09C
|
||||||
:100C90006F6D6D616E6400000002000000000000D6
|
:100C90000010004000BFFEE700BFFEE7704770474E
|
||||||
:100CA0000800000008000000001000000000000024
|
:100CA0007047000070B505204749096821F0070129
|
||||||
:100CB000D00C00080000002068000000580900085F
|
:100CB0000143454A116000BF00BF00BF42480068C1
|
||||||
:100CC000380D0008680000201818000068090008A6
|
:100CC00000F007000528F8D14FF480403F4909683B
|
||||||
:100CD0000024F400000000000000000000000000FC
|
:100CD00021F4804101433D4A116000BF00BF3C4800
|
||||||
:100CE0000000000000000000000000000000000004
|
:100CE000006840F480303A49086000BF00BF00BF90
|
||||||
:100CF00000000000E90B00082D0C00088000002017
|
:100CF00037480068C0F340400028F8D04FF4800027
|
||||||
:100D000020000020801000202200002000000000B1
|
:100D00000421A822002340EA010444EA8214304D61
|
||||||
:100D100000000000000000000000000000000000D3
|
:100D10002D1D2D682F4E35402C432D4D2D1D2C6043
|
||||||
:100D20000000000000000000800C0008860C000895
|
:100D20002C46246824F440341C432C6000BF00BFD0
|
||||||
:080D3000C6E533B49509000883
|
:100D3000281F006840F08070291F086000BF00BFB6
|
||||||
|
:100D400000BF23480068C0F340600028F8D000BF0F
|
||||||
|
:100D500000BF1E484068C0F380300028F8D0002053
|
||||||
|
:100D60001B490831096821F0F0010143184A083293
|
||||||
|
:100D7000116000BF4FF4A0501146096821F4E05102
|
||||||
|
:100D80000143116000BF4FF400401146096821F48F
|
||||||
|
:100D900060410143116000BF02201146096821F043
|
||||||
|
:100DA00003010143116000BF00BF00BF08480830C5
|
||||||
|
:100DB000006800F00C000828F7D10748FFF7F0FBA7
|
||||||
|
:100DC0000548FFF7FBFB70BD003C0240007000408F
|
||||||
|
:100DD000003802400080BFFF007A030A0348006821
|
||||||
|
:100DE00040F47000014908607047000088ED00E0A1
|
||||||
|
:100DF00010B53748FFF75AFC012868D100BF00BF83
|
||||||
|
:100E000033480069C0F3400060B100BF3048C0689B
|
||||||
|
:100E1000C0F3400030B100BF6FF002002C49086100
|
||||||
|
:100E200000BF00BF00BF2A480069C0F3800060B166
|
||||||
|
:100E300000BF2748C068C0F3800030B100BF6FF02A
|
||||||
|
:100E400004002349086100BF00BF00BF20480069BB
|
||||||
|
:100E5000C0F3C00060B100BF1D48C068C0F3C0004F
|
||||||
|
:100E600030B100BF6FF008001949086100BF00BF32
|
||||||
|
:100E700000BF17480069C0F3001060B100BF1448FC
|
||||||
|
:100E8000C068C0F3001030B100BF6FF0100010490F
|
||||||
|
:100E9000086100BF00BF0E48FFF708FC01280CD115
|
||||||
|
:100EA00000BF0B48C06800F0010030B100BF6FF018
|
||||||
|
:100EB00001000749086100BF00BF00BFFFF768FBE2
|
||||||
|
:100EC00000BF04480068401C0249086000BF10BD14
|
||||||
|
:100ED000001000404400002000BFFEE702E008C808
|
||||||
|
:100EE000121F08C1002AFAD170477047002001E0A4
|
||||||
|
:100EF00001C1121F002AFBD170470000014601F119
|
||||||
|
:100F0000100000E0001D02681AB9024A12689042FF
|
||||||
|
:100F1000F8D370472400002010B50648046803E0A9
|
||||||
|
:100F20002046FFF7EBFF0446034800688442F7D3EE
|
||||||
|
:100F300010BD0000200000202400002010B501E0BA
|
||||||
|
:100F400000F8011B131EA2F10104A2B2F8D110BDDA
|
||||||
|
:100F500070B5054605EBC500124901EB80040CB1E4
|
||||||
|
:100F6000012100E00021084640F22911FFF756F95F
|
||||||
|
:100F700060680168C1F3C02139B160684FF4006155
|
||||||
|
:100F8000816000BF2068FFF7A3F960680168C1F3C2
|
||||||
|
:100F9000402129B160684FF40071816000BF00BF3B
|
||||||
|
:100FA00070BD00008018002070B5054605EBC50037
|
||||||
|
:100FB0000D4901EB80040CB1012100E0002108463D
|
||||||
|
:100FC0004FF4A071FFF72AF920680168C1F34011BE
|
||||||
|
:100FD00041B16069401C606120686FF020010160D0
|
||||||
|
:100FE00000BF00BF70BD0000801800200146002037
|
||||||
|
:100FF00001F001020AB1421CD0B201F002020AB1B2
|
||||||
|
:10100000421CD0B201F004020AB1421CD0B201F07D
|
||||||
|
:1010100008020AB1421CD0B201F010020AB1421C0F
|
||||||
|
:10102000D0B201F020020AB1421CD0B201F040025D
|
||||||
|
:101030000AB1421CD0B201F080020AB1421CD0B207
|
||||||
|
:1010400001F480720AB1421CD0B201F400720AB1FC
|
||||||
|
:10105000421CD0B201F480620AB1421CD0B201F449
|
||||||
|
:1010600000620AB1421CD0B201F480520AB1421CA3
|
||||||
|
:10107000D0B201F400520AB1421CD0B201F4804255
|
||||||
|
:101080000AB1421CD0B201F400420AB1421CD0B2F3
|
||||||
|
:1010900001F480320AB1421CD0B201F400220AB13C
|
||||||
|
:1010A000421CD0B201F480220AB1421CD0B201F439
|
||||||
|
:1010B00000320AB1421CD0B2704700002DE9FF4F48
|
||||||
|
:1010C00081B006460F469046DDE90F95032E01DA02
|
||||||
|
:1010D000012100E0002108461C21FFF79FF80FB115
|
||||||
|
:1010E000012100E0002108461D21FFF797F8B8F123
|
||||||
|
:1010F000000F01D0012100E0002108461E21FFF76A
|
||||||
|
:101100008DF8B9F1000F01DD012100E00021084652
|
||||||
|
:101110001F21FFF783F806EBC600744901EB80043A
|
||||||
|
:10112000242200212046FFF709FF2760C4F804802D
|
||||||
|
:101130000498A0600E98E0602561A4F818902846F5
|
||||||
|
:10114000FFF754FFA076A07E00FB09F0A083A08BE0
|
||||||
|
:101150004FEA400A5146012000F060FB2062216AFC
|
||||||
|
:1011600009B1012100E0002108463221FFF756F8BD
|
||||||
|
:10117000A18B49040A0C0021206AFFF7DFFE201D25
|
||||||
|
:1011800007C85B4B5B5CC35823F060631343DFF815
|
||||||
|
:1011900060C11CF801C040F80C3000BF554AD4E9CA
|
||||||
|
:1011A0000101534B5B5CC358DFF84CC103EA0C03ED
|
||||||
|
:1011B0001343DFF83CC11CF801C040F80C3000BFFD
|
||||||
|
:1011C0004FF0000BD4E900A0A1684FF0000ECDF85D
|
||||||
|
:1011D00000E0BBF1000F04D10AF14C0ECDF800E0A5
|
||||||
|
:1011E00003E0DFF818E1CDF800E0009AD4E901ABA4
|
||||||
|
:1011F000236ADFF8FCE01EF80BE05AF80EE00EF070
|
||||||
|
:10120000C00C00BFBCF1400F0ED1DFF8E4A01AF80B
|
||||||
|
:1012100001A08244CAF80C20DFF8D4A01AF801A07B
|
||||||
|
:101220008244CAF808300DE0DFF8C4A01AF801A023
|
||||||
|
:101230008244CAF80820DFF8B8A01AF801A0824456
|
||||||
|
:10124000CAF80C3000BFA28BD4E90101284B5B5CCB
|
||||||
|
:1012500003445B686FF30F031343DFF894C01CF87B
|
||||||
|
:1012600001C08444CCF8043000BFD4E90101204A15
|
||||||
|
:10127000525C825842F001021D4B5B5CC25000BFC1
|
||||||
|
:1012800002212068826822F002020A43826000BFC5
|
||||||
|
:101290004FF440712068826822F440720A438260F1
|
||||||
|
:1012A00000BF05F4002028B14FF4000113480838AE
|
||||||
|
:1012B000FFF7B3F805F4003028B14FF400010F48F0
|
||||||
|
:1012C0000838FFF7AAF80A20FFF7F5F920688168C7
|
||||||
|
:1012D00041F00101816000BF2068816841F08041D8
|
||||||
|
:1012E000816000BF05B0BDE8F08F000080180020CD
|
||||||
|
:1012F000B4180008002D02001F80FCFF08230140E5
|
||||||
|
:101300002DE9F04705468846032D01DA012100E06A
|
||||||
|
:1013100000210846EE21FEF781FF4FF0000900266C
|
||||||
|
:1013200005EBC500104901EB80040CB1012100E080
|
||||||
|
:1013300000210846F221FEF771FF206A00EB480702
|
||||||
|
:10134000002006E039880E44411C88B2A17E07EBDC
|
||||||
|
:101350004107218B8142F5DC208BB6FBF0F01FFAB0
|
||||||
|
:1013600080F94846BDE8F087801800200C4B1988AA
|
||||||
|
:101370009B1C1A88431A00EE903AF8EEE01A531AB2
|
||||||
|
:1013800000EE903AF8EEE00A81EEA01ADFED051AC1
|
||||||
|
:10139000F3EE0E0A41EE210AB0EE600A704700003B
|
||||||
|
:1013A0002C7AFF1F0000A0420E49098840F6E44253
|
||||||
|
:1013B000514340F6FF72B1FBF2F100EE101AB8EEA5
|
||||||
|
:1013C000400AF0EE400A00EE100AB8EE400A80EE45
|
||||||
|
:1013D000801A9FED050A21EE001ADFED041A81EE56
|
||||||
|
:1013E000210A70472A7AFF1F00F07F4500007A44E7
|
||||||
|
:1013F00000200B4908600B49086000BF00BF0A4885
|
||||||
|
:10140000006840F001000849086000BF00BF0846BE
|
||||||
|
:10141000C06840F00100C86000BF00BF7047000016
|
||||||
|
:1014200008000020100000200010004010B5034804
|
||||||
|
:1014300000F01CF8024800F087F810BD08000020FA
|
||||||
|
:10144000100000200EB54FF420204FF4C871002288
|
||||||
|
:101450001346CDE900210290024A03490020FFF71C
|
||||||
|
:101460002DFE0EBD006402400020014038B5044648
|
||||||
|
:1014700000200090206810B112281DD112E000BF9A
|
||||||
|
:1014800000F02AF80F4880ED000A00F041F80D48FE
|
||||||
|
:1014900080ED010A00BF0C480068606000BF1220A8
|
||||||
|
:1014A000206000BF084960680968081A642801D2F2
|
||||||
|
:1014B000002038BD00BFE3E700202060009003203B
|
||||||
|
:1014C000F7E70000180000204400002001490860F0
|
||||||
|
:1014D000704700004800002010B52DED028B9FEDF5
|
||||||
|
:1014E0000A0AB0EE408A00210846FFF709FF0749C3
|
||||||
|
:1014F00008800888FFF73AFFB0EE408AB0EE480A4D
|
||||||
|
:10150000BDEC028B10BD00000000000004000020B4
|
||||||
|
:1015100010B52DED028B9FED0A0AB0EE408A012135
|
||||||
|
:101520000020FFF7EDFE074948804888FFF73CFFA1
|
||||||
|
:10153000B0EE408AB0EE480ABDEC028B10BD000050
|
||||||
|
:10154000000000000400002038B504460020009090
|
||||||
|
:10155000206810B1252816D10BE000BF012000F053
|
||||||
|
:1015600019F800BF0A480068606000BF25202060AD
|
||||||
|
:1015700000BF074960680968081A642801D2002082
|
||||||
|
:1015800038BD00BFEAE70020206000900320F7E7A5
|
||||||
|
:101590004400002010B5044614B1012C0AD104E027
|
||||||
|
:1015A00001210648FEF7EAFF05E002210348FEF7A5
|
||||||
|
:1015B000E5FF00E000BF00BF10BD000000100240CA
|
||||||
|
:1015C00008B54FF48040444909680143424A11601C
|
||||||
|
:1015D000114609680140009100BF00BF8003111F40
|
||||||
|
:1015E00009680143121F116011460968014000910A
|
||||||
|
:1015F00000BF00BF03200246384B19684FF6FF03B7
|
||||||
|
:101600001940374B0B4343EA0221344B196000BFAA
|
||||||
|
:10161000011F1B68C3F302200F2400250346C3F1FA
|
||||||
|
:10162000070CBCF1040F02D94FF0040C01E0C3F128
|
||||||
|
:10163000070C674603F1040CBCF1070F02D24FF010
|
||||||
|
:10164000000C01E0A3F1030C66464FF0010C0CFA0C
|
||||||
|
:1016500007FCACF1010C0CEA040C0CFA06FC4FF090
|
||||||
|
:10166000010808FA06F8A8F1010808EA05084CEA9A
|
||||||
|
:10167000080200BF002904DB1007030E1948435479
|
||||||
|
:1016800007E01007040E15480C3001F00F031B1F74
|
||||||
|
:10169000C45400BFFFF706FB134800681349B0FBB2
|
||||||
|
:1016A000F1F084B22046FFF711FFFFF7B5F9FFF71D
|
||||||
|
:1016B0004BF9FFF75BFAFFF713F8002000F018F87A
|
||||||
|
:1016C000012000F015F8FFF7BDFEFFF791FE01E0E5
|
||||||
|
:1016D000FFF7ACFEFCE70000443802400CED00E0F0
|
||||||
|
:1016E0000000FA0500E400E00000002040420F0086
|
||||||
|
:1016F00010B504460C4951F824104A000B4951F822
|
||||||
|
:101700002400002100F09EF8094951F824200749DF
|
||||||
|
:10171000083951F82400002100F094F80121034811
|
||||||
|
:101720000830015510BD00009C180008380000204A
|
||||||
|
:10173000AC1800082DE9F04704460F460025A946DD
|
||||||
|
:101740002348005D20B922481838016820468847A0
|
||||||
|
:101750001FB94FF0FF30BDE8F0871E4850F8240055
|
||||||
|
:10176000B7FBF0F61B4850F82400B7FBF0F100FB84
|
||||||
|
:10177000117000B1761C184850F82400451E22E074
|
||||||
|
:101780001348083850F8240030F8150010B909F152
|
||||||
|
:10179000010901E04FF00009B14513D14FF00008F5
|
||||||
|
:1017A00009E00B48083850F8240005EB080220F83F
|
||||||
|
:1017B000126008F10108B045F3D3064850F8240040
|
||||||
|
:1017C0006843C8E76D1E002DDADA4FF0FF30C2E73C
|
||||||
|
:1017D00040000020A41800089C18000810B501461D
|
||||||
|
:1017E0000023002207E00B4850F8210030F81200D7
|
||||||
|
:1017F00000B15B1C521C084850F821009042F2D8FE
|
||||||
|
:1018000064205843044C54F82140B0FBF4F0C0B2BB
|
||||||
|
:1018100010BD0000380000209C18000870B5044678
|
||||||
|
:101820000E4631462046FFF785FF0546681C08B97D
|
||||||
|
:10183000002070BD024850F824002844F9E7000059
|
||||||
|
:101840003000002030B5034601E003F8011B141EF0
|
||||||
|
:10185000A2F10102F9D130BD102840587088A0B81B
|
||||||
|
:10186000000000000404040000080000000800005C
|
||||||
|
:10187000080000000800020406080A0C0001020328
|
||||||
|
:101880000405065F6C697374006C69737420616C85
|
||||||
|
:101890006C20636F6D6D616E6400000000020000DB
|
||||||
|
:1018A0000002000008000000080000000010000016
|
||||||
|
:1018B00000100000102840587088A0B800000000F8
|
||||||
|
:1018C00004040400000800000008000008000000F4
|
||||||
|
:1018D0000800020406080A0C0001020304050600C1
|
||||||
|
:1018E00010190008000000206C000000DC0E000849
|
||||||
|
:1018F0007C1900086C000020841C0000EC0E00081D
|
||||||
|
:101900007C19000800C0012000100000EC0E000847
|
||||||
|
:101910000024F400000000000000000000000000AF
|
||||||
|
:1019200000000000000000000000000000000000B7
|
||||||
|
:101930000000000000000000F1160008DD1700089C
|
||||||
|
:101940008000002000C001208010002080140020B2
|
||||||
|
:101950000000000000000000000000000000000087
|
||||||
|
:1019600000000000000000000000000083180008D4
|
||||||
|
:0C19700089180008C6E533B4190F000800
|
||||||
:040000050800018965
|
:040000050800018965
|
||||||
:00000001FF
|
:00000001FF
|
||||||
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
/* USER CODE BEGIN Header */
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file adc.c
|
||||||
|
* @brief This file provides code for the configuration
|
||||||
|
* of the ADC instances.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2024 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
/* USER CODE END Header */
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "adc.h"
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 0 */
|
||||||
|
|
||||||
|
/* USER CODE END 0 */
|
||||||
|
|
||||||
|
/* ADC1 init function */
|
||||||
|
void MX_ADC1_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* USER CODE BEGIN ADC1_Init 0 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC1_Init 0 */
|
||||||
|
|
||||||
|
LL_ADC_InitTypeDef ADC_InitStruct = {0};
|
||||||
|
LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};
|
||||||
|
LL_ADC_CommonInitTypeDef ADC_CommonInitStruct = {0};
|
||||||
|
|
||||||
|
/* Peripheral clock enable */
|
||||||
|
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);
|
||||||
|
|
||||||
|
/* ADC1 DMA Init */
|
||||||
|
|
||||||
|
/* ADC1 Init */
|
||||||
|
LL_DMA_SetChannelSelection(DMA2, LL_DMA_STREAM_0, LL_DMA_CHANNEL_0);
|
||||||
|
|
||||||
|
LL_DMA_SetDataTransferDirection(DMA2, LL_DMA_STREAM_0, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
|
||||||
|
|
||||||
|
LL_DMA_SetStreamPriorityLevel(DMA2, LL_DMA_STREAM_0, LL_DMA_PRIORITY_LOW);
|
||||||
|
|
||||||
|
LL_DMA_SetMode(DMA2, LL_DMA_STREAM_0, LL_DMA_MODE_CIRCULAR);
|
||||||
|
|
||||||
|
LL_DMA_SetPeriphIncMode(DMA2, LL_DMA_STREAM_0, LL_DMA_PERIPH_NOINCREMENT);
|
||||||
|
|
||||||
|
LL_DMA_SetMemoryIncMode(DMA2, LL_DMA_STREAM_0, LL_DMA_MEMORY_INCREMENT);
|
||||||
|
|
||||||
|
LL_DMA_SetPeriphSize(DMA2, LL_DMA_STREAM_0, LL_DMA_PDATAALIGN_HALFWORD);
|
||||||
|
|
||||||
|
LL_DMA_SetMemorySize(DMA2, LL_DMA_STREAM_0, LL_DMA_MDATAALIGN_HALFWORD);
|
||||||
|
|
||||||
|
LL_DMA_DisableFifoMode(DMA2, LL_DMA_STREAM_0);
|
||||||
|
|
||||||
|
/* ADC1 interrupt Init */
|
||||||
|
NVIC_SetPriority(ADC_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
|
||||||
|
NVIC_EnableIRQ(ADC_IRQn);
|
||||||
|
|
||||||
|
/* USER CODE BEGIN ADC1_Init 1 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC1_Init 1 */
|
||||||
|
|
||||||
|
/** Common config
|
||||||
|
*/
|
||||||
|
ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;
|
||||||
|
ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
|
||||||
|
ADC_InitStruct.SequencersScanMode = LL_ADC_SEQ_SCAN_ENABLE;
|
||||||
|
LL_ADC_Init(ADC1, &ADC_InitStruct);
|
||||||
|
ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;
|
||||||
|
ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS;
|
||||||
|
ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
|
||||||
|
ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_CONTINUOUS;
|
||||||
|
ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED;
|
||||||
|
LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct);
|
||||||
|
LL_ADC_REG_SetFlagEndOfConversion(ADC1, LL_ADC_REG_FLAG_EOC_SEQUENCE_CONV);
|
||||||
|
ADC_CommonInitStruct.CommonClock = LL_ADC_CLOCK_SYNC_PCLK_DIV4;
|
||||||
|
ADC_CommonInitStruct.Multimode = LL_ADC_MULTI_INDEPENDENT;
|
||||||
|
LL_ADC_CommonInit(__LL_ADC_COMMON_INSTANCE(ADC1), &ADC_CommonInitStruct);
|
||||||
|
|
||||||
|
/** Configure Regular Channel
|
||||||
|
*/
|
||||||
|
LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_TEMPSENSOR);
|
||||||
|
LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_TEMPSENSOR, LL_ADC_SAMPLINGTIME_28CYCLES);
|
||||||
|
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_PATH_INTERNAL_TEMPSENSOR);
|
||||||
|
|
||||||
|
/** Configure Regular Channel
|
||||||
|
*/
|
||||||
|
LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_2, LL_ADC_CHANNEL_VREFINT);
|
||||||
|
LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_VREFINT, LL_ADC_SAMPLINGTIME_28CYCLES);
|
||||||
|
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_PATH_INTERNAL_VREFINT);
|
||||||
|
/* USER CODE BEGIN ADC1_Init 2 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC1_Init 2 */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 1 */
|
||||||
|
|
||||||
|
/* USER CODE END 1 */
|
|
@ -0,0 +1,56 @@
|
||||||
|
/* USER CODE BEGIN Header */
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file dma.c
|
||||||
|
* @brief This file provides code for the configuration
|
||||||
|
* of all the requested memory to memory DMA transfers.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* Copyright (c) 2024 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
/* USER CODE END Header */
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "dma.h"
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 0 */
|
||||||
|
|
||||||
|
/* USER CODE END 0 */
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* Configure DMA */
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 1 */
|
||||||
|
|
||||||
|
/* USER CODE END 1 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable DMA controller clock
|
||||||
|
*/
|
||||||
|
void MX_DMA_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Init with LL driver */
|
||||||
|
/* DMA controller clock enable */
|
||||||
|
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA2);
|
||||||
|
|
||||||
|
/* DMA interrupt init */
|
||||||
|
/* DMA2_Stream0_IRQn interrupt configuration */
|
||||||
|
NVIC_SetPriority(DMA2_Stream0_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
|
||||||
|
NVIC_EnableIRQ(DMA2_Stream0_IRQn);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* USER CODE BEGIN 2 */
|
||||||
|
|
||||||
|
/* USER CODE END 2 */
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
/* USER CODE END Header */
|
/* USER CODE END Header */
|
||||||
/* Includes ------------------------------------------------------------------*/
|
/* Includes ------------------------------------------------------------------*/
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
#include "adc.h"
|
||||||
|
#include "dma.h"
|
||||||
#include "tim.h"
|
#include "tim.h"
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
|
|
||||||
|
@ -94,9 +96,12 @@ int main(void)
|
||||||
|
|
||||||
/* Initialize all configured peripherals */
|
/* Initialize all configured peripherals */
|
||||||
MX_GPIO_Init();
|
MX_GPIO_Init();
|
||||||
|
MX_DMA_Init();
|
||||||
MX_TIM6_Init();
|
MX_TIM6_Init();
|
||||||
|
MX_ADC1_Init();
|
||||||
/* USER CODE BEGIN 2 */
|
/* USER CODE BEGIN 2 */
|
||||||
my_mem_init(SRAMIN); // Initialize internal memory pool 1
|
my_mem_init(SRAMIN); // Initialize internal memory pool 1
|
||||||
|
my_mem_init(SRAMEX); // Initialize external memory pool 2
|
||||||
board_init();
|
board_init();
|
||||||
app_init();
|
app_init();
|
||||||
/* USER CODE END 2 */
|
/* USER CODE END 2 */
|
||||||
|
|
|
@ -202,6 +202,20 @@ void SysTick_Handler(void)
|
||||||
/* please refer to the startup file (startup_stm32f4xx.s). */
|
/* please refer to the startup file (startup_stm32f4xx.s). */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles ADC1, ADC2 and ADC3 global interrupts.
|
||||||
|
*/
|
||||||
|
void ADC_IRQHandler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN ADC_IRQn 0 */
|
||||||
|
|
||||||
|
/* USER CODE END ADC_IRQn 0 */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN ADC_IRQn 1 */
|
||||||
|
adc_env_callback(ADCS_1);
|
||||||
|
/* USER CODE END ADC_IRQn 1 */
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function handles TIM6 global interrupt, DAC1 and DAC2 underrun error interrupts.
|
* @brief This function handles TIM6 global interrupt, DAC1 and DAC2 underrun error interrupts.
|
||||||
*/
|
*/
|
||||||
|
@ -221,6 +235,20 @@ void TIM6_DAC_IRQHandler(void)
|
||||||
/* USER CODE END TIM6_DAC_IRQn 1 */
|
/* USER CODE END TIM6_DAC_IRQn 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles DMA2 stream0 global interrupt.
|
||||||
|
*/
|
||||||
|
void DMA2_Stream0_IRQHandler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN DMA2_Stream0_IRQn 0 */
|
||||||
|
|
||||||
|
/* USER CODE END DMA2_Stream0_IRQn 0 */
|
||||||
|
|
||||||
|
/* USER CODE BEGIN DMA2_Stream0_IRQn 1 */
|
||||||
|
adc_dma_callback(ADCS_1);
|
||||||
|
/* USER CODE END DMA2_Stream0_IRQn 1 */
|
||||||
|
}
|
||||||
|
|
||||||
/* USER CODE BEGIN 1 */
|
/* USER CODE BEGIN 1 */
|
||||||
|
|
||||||
/* USER CODE END 1 */
|
/* USER CODE END 1 */
|
||||||
|
|
|
@ -13,8 +13,9 @@ static uint8_t business_inspection(struct flow *fl)
|
||||||
FL_HEAD(fl);
|
FL_HEAD(fl);
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
app.cpu_temperature = get_cpu_temperature();
|
||||||
FL_LOCK_DELAY(fl, FL_CLOCK_100MSEC);
|
app.cpu_volt = get_cpu_voltage();
|
||||||
|
FL_LOCK_DELAY(fl, FL_CLOCK_SEC);
|
||||||
}
|
}
|
||||||
FL_TAIL(fl);
|
FL_TAIL(fl);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,8 @@
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
float32 cpu_temperature;
|
||||||
|
float32 cpu_volt;
|
||||||
} app_t;
|
} app_t;
|
||||||
|
|
||||||
extern app_t app;
|
extern app_t app;
|
||||||
|
|
|
@ -1,281 +1,13 @@
|
||||||
#include "work.h"
|
#include "work.h"
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
#define OUTPUT_INFORMATION_CYCLE_BASE 100
|
|
||||||
#define DISTANCE 1000
|
|
||||||
#define SPEED 80
|
|
||||||
#define TARGET_POS 500
|
|
||||||
#define TARGET_SPEED 20
|
|
||||||
work_t work;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 输出信息
|
|
||||||
*
|
|
||||||
* 该函数用于输出一些信息,具体输出内容未实现。
|
|
||||||
*/
|
|
||||||
static void output_information(void)
|
|
||||||
{
|
|
||||||
char data[128];
|
|
||||||
uint8_t len = 0;
|
|
||||||
int32_t rst = 0;
|
|
||||||
osel_memset((uint8_t *)data, 0, ARRAY_LEN(data));
|
|
||||||
|
|
||||||
if (work.type == WORK_MOTOR_POS)
|
|
||||||
{
|
|
||||||
rst = snprintf(data, ARRAY_LEN(data), "%d,%d,%f\r\n", work.target_pos, work.encoder_cnt, work.pwm_percent);
|
|
||||||
}
|
|
||||||
else if (work.type == WORK_MOTOR_SPEED)
|
|
||||||
{
|
|
||||||
rst = snprintf(data, ARRAY_LEN(data), "%d,%d,%f\r\n", work.target_speed, work.encoder_show, work.pwm_percent);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rst == 0 || rst > ARRAY_LEN(data))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = osel_mstrlen((uint8_t *)data);
|
|
||||||
uart_send((uint8_t *)data, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pwm_map(void)
|
|
||||||
{
|
|
||||||
set_motor_pwm(work.pwm_percent);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pwm_s_curve(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static void motor_pos(void)
|
|
||||||
{
|
|
||||||
int32_t code = work.encoder_cnt;
|
|
||||||
work.pwm_percent = work.pid.pid_u.fuzzy.execute(&work.pid.pid_u.fuzzy, work.target_pos, code);
|
|
||||||
set_motor_pwm(work.pwm_percent);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void motor_speed(void)
|
|
||||||
{
|
|
||||||
int32_t code = work.encoder_cnt;
|
|
||||||
work.target_speed_filter = lpf_update(&work.target_speed_lpf, work.target_speed);
|
|
||||||
work.encoder_show = lpf_update(&work.encoder_lpf, work.encoder_cnt);
|
|
||||||
work.encoder_cnt = 0;
|
|
||||||
work.pwm_percent = work.pid.pid_u.fuzzy.execute(&work.pid.pid_u.fuzzy, work.target_speed_filter + 1, code); // 补偿1
|
|
||||||
set_motor_pwm(work.pwm_percent);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pwm_map_key_handle(button_id_e id)
|
|
||||||
{
|
|
||||||
int8_t min = -100, max = 100;
|
|
||||||
int8_t step = 10;
|
|
||||||
switch (id)
|
|
||||||
{
|
|
||||||
case KEY_ADD:
|
|
||||||
if (work.pwm_percent < max)
|
|
||||||
{
|
|
||||||
work.pwm_percent += step;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case KEY_SUB:
|
|
||||||
if (work.pwm_percent > min)
|
|
||||||
{
|
|
||||||
work.pwm_percent -= step;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case KEY_S:
|
|
||||||
work.pwm_percent = 10;
|
|
||||||
work.encoder_cnt = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void motot_pos_key_handle(button_id_e id)
|
|
||||||
{
|
|
||||||
int16_t min = 0, max = DISTANCE;
|
|
||||||
int16_t step = 100;
|
|
||||||
switch (id)
|
|
||||||
{
|
|
||||||
case KEY_ADD:
|
|
||||||
if (work.target_pos < max)
|
|
||||||
{
|
|
||||||
work.target_pos += step;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case KEY_SUB:
|
|
||||||
if (work.target_pos > min)
|
|
||||||
{
|
|
||||||
work.target_pos -= step;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case KEY_S:
|
|
||||||
work.target_pos = TARGET_POS;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void motor_speed_key_handle(button_id_e id)
|
|
||||||
{
|
|
||||||
int16_t min = TARGET_SPEED, max = SPEED;
|
|
||||||
int16_t step = 5;
|
|
||||||
switch (id)
|
|
||||||
{
|
|
||||||
case KEY_ADD:
|
|
||||||
if (work.target_speed < max)
|
|
||||||
{
|
|
||||||
work.target_speed += step;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case KEY_SUB:
|
|
||||||
if (work.target_speed > min)
|
|
||||||
{
|
|
||||||
work.target_speed -= step;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case KEY_S:
|
|
||||||
work.target_speed = TARGET_SPEED;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void work_key_handle_cb(button_id_e id)
|
|
||||||
{
|
|
||||||
|
|
||||||
switch (work.type)
|
|
||||||
{
|
|
||||||
case WORK_PWM_MAP:
|
|
||||||
pwm_map_key_handle(id);
|
|
||||||
break;
|
|
||||||
case WORK_MOTOR_POS:
|
|
||||||
motot_pos_key_handle(id);
|
|
||||||
break;
|
|
||||||
case WORK_MOTOR_SPEED:
|
|
||||||
motor_speed_key_handle(id);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
DBG_ASSERT(FALSE __DBG_LINE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void work_data_update(void)
|
|
||||||
{
|
|
||||||
work.pid.pid_u.fuzzy.set_kp(&work.pid.pid_u.fuzzy, work.pid_params.kp);
|
|
||||||
work.pid.pid_u.fuzzy.set_ki(&work.pid.pid_u.fuzzy, work.pid_params.ki);
|
|
||||||
work.pid.pid_u.fuzzy.set_kd(&work.pid.pid_u.fuzzy, work.pid_params.kd);
|
|
||||||
}
|
|
||||||
|
|
||||||
void work_process(void)
|
void work_process(void)
|
||||||
{
|
{
|
||||||
switch (work.type)
|
|
||||||
{
|
|
||||||
case WORK_PWM_MAP:
|
|
||||||
pwm_map();
|
|
||||||
break;
|
|
||||||
case WORK_MOTOR_POS:
|
|
||||||
motor_pos();
|
|
||||||
break;
|
|
||||||
case WORK_MOTOR_SPEED:
|
|
||||||
motor_speed();
|
|
||||||
break;
|
|
||||||
case WORK_S_CURVE:
|
|
||||||
pwm_s_curve();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (work.enter_cnt++ % (OUTPUT_INFORMATION_CYCLE_BASE / work.timer_cycle) == 0)
|
|
||||||
{
|
|
||||||
output_information();
|
|
||||||
}
|
|
||||||
work_data_update();
|
|
||||||
}
|
|
||||||
|
|
||||||
void work_encoder_exti(void)
|
|
||||||
{
|
|
||||||
if (GPIO_READ(MOTOR_B_GPIO_Port, MOTOR_B_Pin) == 1)
|
|
||||||
{
|
|
||||||
work.encoder_cnt++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
work.encoder_cnt--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void work_init(void)
|
void work_init(void)
|
||||||
{
|
{
|
||||||
osel_memset((uint8_t *)&work, 0, sizeof(work_t));
|
osel_memset((uint8_t *)&work, 0, sizeof(work_t));
|
||||||
PWM_START(PWM_TIM, PWM_CHANNEL);
|
|
||||||
PWM_SET_DUTY(PWM_TIM, PWM_CHANNEL, 0);
|
|
||||||
work.pwm_feq = PWM_GET_FREQ(PWM_TIM);
|
|
||||||
work.pwm_arr = PWM_GET_ARR(PWM_TIM);
|
|
||||||
work.type = WORK_PWM_MAP;
|
|
||||||
|
|
||||||
// PID初始化
|
|
||||||
|
|
||||||
{
|
|
||||||
work.pid.type = PID_TYPE_FUZZY;
|
|
||||||
work.pid.pid_u.fuzzy.deadzone_dir = DEAD_ZONE_BOTH;
|
|
||||||
|
|
||||||
work.pid_params.dead_zone = 1;
|
|
||||||
|
|
||||||
if (work.type == WORK_MOTOR_POS)
|
|
||||||
{
|
|
||||||
work.pid_params.kp = 1;
|
|
||||||
work.pid_params.ki = 0.01f;
|
|
||||||
work.pid_params.kd = 10;
|
|
||||||
work.pid.sub_type = PID_SUB_TYPE_POSITION;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
work.pid_params.kp = 0.01;
|
|
||||||
work.pid_params.ki = 0.1f;
|
|
||||||
work.pid_params.kd = 0;
|
|
||||||
work.pid.sub_type = PID_SUB_TYPE_INCREMENT;
|
|
||||||
}
|
|
||||||
pid_constructor(&work.pid);
|
|
||||||
|
|
||||||
if (work.type == WORK_MOTOR_POS)
|
|
||||||
{
|
|
||||||
work.pid.pid_u.fuzzy.set_ctrl_prm(&work.pid.pid_u.fuzzy, work.pid_params.kp, work.pid_params.ki,
|
|
||||||
work.pid_params.kd, work.pid_params.dead_zone, 0, -90, 90); // 电机输出不要超过90
|
|
||||||
work.pid.pid_u.fuzzy.set_kd_enable(&work.pid.pid_u.fuzzy, TRUE);
|
|
||||||
work.position = &work.pid.pid_u.fuzzy.pri_u.position;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
work.pid.pid_u.fuzzy.set_ctrl_prm(&work.pid.pid_u.fuzzy, work.pid_params.kp, work.pid_params.ki,
|
|
||||||
work.pid_params.kd, work.pid_params.dead_zone, 0, -1 * ((int32_t)SPEED), SPEED);
|
|
||||||
work.pid.pid_u.fuzzy.set_kd_enable(&work.pid.pid_u.fuzzy, FALSE);
|
|
||||||
work.increment = &work.pid.pid_u.fuzzy.pri_u.increment;
|
|
||||||
work.encoder_lpf.alpha = work.pid_params.ki * 1.5f;
|
|
||||||
lpf_init(&work.encoder_lpf);
|
|
||||||
|
|
||||||
work.target_speed_lpf.alpha = work.pid_params.ki * 1.5f;
|
|
||||||
lpf_init(&work.target_speed_lpf);
|
|
||||||
|
|
||||||
// 改变定时器周期
|
|
||||||
uint16_t arr = LL_TIM_GetAutoReload(WORK_TIM);
|
|
||||||
LL_TIM_SetAutoReload(WORK_TIM, arr * 10 - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
work.target_pos = TARGET_POS;
|
|
||||||
work.target_speed = TARGET_SPEED;
|
|
||||||
work.timer_cycle = TIM_CYCLE(WORK_TIM);
|
|
||||||
if (work.type == WORK_PWM_MAP)
|
|
||||||
{
|
|
||||||
work.pwm_percent = 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,47 +7,17 @@
|
||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
// PWM占空比映射到电机
|
|
||||||
WORK_PWM_MAP = 0,
|
|
||||||
// 电机位置控制
|
|
||||||
WORK_MOTOR_POS = 1,
|
|
||||||
// 电机速度控制
|
|
||||||
WORK_MOTOR_SPEED = 2,
|
|
||||||
// S曲线
|
|
||||||
WORK_S_CURVE = 3,
|
|
||||||
} work_e;
|
} work_e;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
work_e type;
|
work_e type;
|
||||||
uint8_t timer_cycle; // 定时器周期
|
|
||||||
uint32_t enter_cnt; // 进入次数
|
|
||||||
int32_t encoder_cnt; // 编码器位置
|
|
||||||
int32_t encoder_show; // 滤波后的编码器位置
|
|
||||||
float32 pwm_percent; // PWM占空比
|
|
||||||
uint32_t pwm_feq; // PWM频率
|
|
||||||
uint16_t pwm_arr; // PWM自动重装载值
|
|
||||||
pid_t pid;
|
|
||||||
pid_common_position_t *position;
|
|
||||||
pid_common_increment_t *increment;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
float32 kp;
|
|
||||||
float32 ki;
|
|
||||||
float32 kd;
|
|
||||||
float32 dead_zone;
|
|
||||||
} pid_params;
|
|
||||||
|
|
||||||
int32_t target_pos; // 目标位置
|
|
||||||
int32_t target_speed; // 目标速度
|
|
||||||
int32_t target_speed_filter;
|
|
||||||
lpf_t encoder_lpf;
|
|
||||||
lpf_t target_speed_lpf;
|
|
||||||
} work_t;
|
} work_t;
|
||||||
extern work_t work;
|
extern work_t work;
|
||||||
|
|
||||||
void work_init(void);
|
void work_init(void);
|
||||||
void work_process(void);
|
void work_process(void);
|
||||||
void work_key_handle_cb(button_id_e id);
|
|
||||||
void work_encoder_exti(void);
|
|
||||||
#endif // __WORK_H__
|
#endif // __WORK_H__
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
|
|
||||||
|
board_t board;
|
||||||
|
|
||||||
void led_open(led_e led)
|
void led_open(led_e led)
|
||||||
{
|
{
|
||||||
switch (led)
|
switch (led)
|
||||||
|
@ -51,4 +53,32 @@ void led_toggle(led_e led)
|
||||||
*/
|
*/
|
||||||
void board_init(void)
|
void board_init(void)
|
||||||
{
|
{
|
||||||
|
adc_init(ADCS_1, ADC1, DMA2, LL_DMA_STREAM_0, LL_DMA_CHANNEL_0, 400,
|
||||||
|
INTEMP | INVREF); // 初始化ADC1通道,默认采集AD
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 获取当前CPU温度
|
||||||
|
* @return {float32} CPU温度
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
float32 get_cpu_temperature(void)
|
||||||
|
{
|
||||||
|
float32 tmp = 0.0f;
|
||||||
|
board.adc_raw[ADC_TEMP_CHANNEL] = adc_result_average(ADCS_1, ADC_TEMP_CHANNEL);
|
||||||
|
tmp = adc_result_temperature(board.adc_raw[ADC_TEMP_CHANNEL]);
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 获取当前CPU电压
|
||||||
|
* @return {float32} CPU电压
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
float32 get_cpu_voltage(void)
|
||||||
|
{
|
||||||
|
float32 tmp = 0.0f;
|
||||||
|
board.adc_raw[ADC_INVREF_CHANNEL] = adc_result_average(ADCS_1, ADC_INVREF_CHANNEL);
|
||||||
|
tmp = adc_result_value_local(board.adc_raw[ADC_INVREF_CHANNEL]);
|
||||||
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,9 +13,29 @@ typedef enum
|
||||||
LED_GREEN,
|
LED_GREEN,
|
||||||
} led_e;
|
} led_e;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ADC通道定义: 主频4、分频系数8,根据公式 TCONV(转换时间) = (采样时间 + 12.5 个周期)/(主频/ADC分频系数) 计算每个通道单个采集时间
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
ADC_TEMP_CHANNEL, ///< 内部参考温度
|
||||||
|
ADC_INVREF_CHANNEL, ///< 内部参考电压
|
||||||
|
ADC1_MAX, ///< ADC1通道最大数量
|
||||||
|
} adc1_channel_e;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t adc_raw[ADC1_MAX];
|
||||||
|
} board_t;
|
||||||
|
|
||||||
|
extern board_t board;
|
||||||
|
|
||||||
void board_init(void);
|
void board_init(void);
|
||||||
|
|
||||||
void led_open(led_e led);
|
void led_open(led_e led);
|
||||||
void led_close(led_e led);
|
void led_close(led_e led);
|
||||||
void led_toggle(led_e led);
|
void led_toggle(led_e led);
|
||||||
|
|
||||||
|
float32 get_cpu_temperature(void);
|
||||||
|
float32 get_cpu_voltage(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,161 @@
|
||||||
|
#include "dac161p997.h"
|
||||||
|
#include "delay.h"
|
||||||
|
|
||||||
|
static dac161p997_t _handle;
|
||||||
|
|
||||||
|
static void dac161p997_output_0()
|
||||||
|
{
|
||||||
|
_handle.io->set(*_handle.io);
|
||||||
|
delay_us(DUTY_CYCLE_25);
|
||||||
|
_handle.io->reset(*_handle.io);
|
||||||
|
delay_us(DUTY_CYCLE_75);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dac161p997_output_1()
|
||||||
|
{
|
||||||
|
_handle.io->set(*_handle.io);
|
||||||
|
delay_us(DUTY_CYCLE_75);
|
||||||
|
_handle.io->reset(*_handle.io);
|
||||||
|
delay_us(DUTY_CYCLE_25);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dac161p997_output_d()
|
||||||
|
{
|
||||||
|
_handle.io->set(*_handle.io);
|
||||||
|
delay_us(DUTY_CYCLE_50);
|
||||||
|
_handle.io->reset(*_handle.io);
|
||||||
|
delay_us(DUTY_CYCLE_50);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 输出DAC161符号
|
||||||
|
*
|
||||||
|
* 根据传入的符号类型,调用相应的DAC161输出函数。
|
||||||
|
*
|
||||||
|
* @param sym 符号类型,可以是ZERO_SYM、ONE_SYM或其他值。
|
||||||
|
*/
|
||||||
|
static void dac161p997_output_symbol(uint8_t sym)
|
||||||
|
{
|
||||||
|
switch (sym)
|
||||||
|
{
|
||||||
|
case ZERO_SYM:
|
||||||
|
dac161p997_output_0();
|
||||||
|
break;
|
||||||
|
case ONE_SYM:
|
||||||
|
dac161p997_output_1();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dac161p997_output_d();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 向DAC161写入寄存器
|
||||||
|
*
|
||||||
|
* 向DAC161写入一个16位的数据,并附加一个8位的标签。
|
||||||
|
* 芯片会回复一个应答信号,此处忽略应答信号。可以通过设置寄存器关闭应答信号。
|
||||||
|
* @param data 要写入的数据,16位。
|
||||||
|
* @param tag 附加的标签,8位。tag = 0时,写DAC寄存器;tag = 1时,写配置寄存器。
|
||||||
|
*/
|
||||||
|
void dac161p997_swif_write_reg(uint16_t data, uint8_t tag)
|
||||||
|
{
|
||||||
|
uint8_t plow, phigh;
|
||||||
|
uint16_t i, tmp;
|
||||||
|
|
||||||
|
/* compute parity low */
|
||||||
|
tmp = data & 0x00ff; // get least significant byte
|
||||||
|
for (plow = 0; tmp != 0; tmp >>= 1)
|
||||||
|
{
|
||||||
|
if (tmp & 0x1) // test if lsb is 1
|
||||||
|
plow++; // count number of bits equal to 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plow & 0x1) // check if number of 1s is odd
|
||||||
|
plow = 0; // set even parity
|
||||||
|
else
|
||||||
|
plow = 1; // else set odd parity
|
||||||
|
|
||||||
|
/* compute parity high */
|
||||||
|
tmp = (data & 0xff00) >> 8; // get most significant byte
|
||||||
|
for (phigh = 0; tmp != 0; tmp >>= 1)
|
||||||
|
{
|
||||||
|
if (tmp & 0x1) // test if lsb is 1
|
||||||
|
phigh++; // count number of bits equal to 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if (phigh & 0x1) // check if number of 1s is odd
|
||||||
|
phigh = 0; // set even parity
|
||||||
|
else
|
||||||
|
phigh = 1; // set odd parity
|
||||||
|
|
||||||
|
phigh = phigh ^ tag; // parity high is for high slice = tag + 1 byte
|
||||||
|
|
||||||
|
dac161p997_output_symbol(IDLE_SYM); // Frame start: send an idle symbol first
|
||||||
|
dac161p997_output_symbol(tag);
|
||||||
|
|
||||||
|
tmp = data;
|
||||||
|
for (i = 0; i < 16; i++) // send 16 data bits msb to lsb
|
||||||
|
{
|
||||||
|
if (tmp & 0x8000)
|
||||||
|
{
|
||||||
|
dac161p997_output_symbol(ONE_SYM); // send 1
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dac161p997_output_symbol(ZERO_SYM); // send 0
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = tmp << 1; // move next data bit to msb
|
||||||
|
}
|
||||||
|
|
||||||
|
dac161p997_output_symbol(phigh); // send parity high bit
|
||||||
|
dac161p997_output_symbol(plow); // send parity low bit
|
||||||
|
|
||||||
|
dac161p997_output_symbol(IDLE_SYM); // send idle
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 设置DAC161输出电流
|
||||||
|
*
|
||||||
|
* 通过向DAC161写入指定的电流值来设置其输出电流,输出电流持续时间100ms。
|
||||||
|
*
|
||||||
|
* @param current 要设置的电流值
|
||||||
|
*/
|
||||||
|
void dac161p997_output_current(float32 current)
|
||||||
|
{
|
||||||
|
uint8_t adc = (uint16_t)(current * DAC161P997_CURRENT_SLOPE) >> 8;
|
||||||
|
static uint8_t last_adc;
|
||||||
|
if (adc == last_adc)
|
||||||
|
{
|
||||||
|
last_adc = adc;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dac161p997_swif_write_reg(DAC161P997_LCK_REG_UNLOCK, CONFIG_WRITE);
|
||||||
|
dac161p997_swif_write_reg(DAC161P997_ERR_LOW_REG + adc, CONFIG_WRITE);
|
||||||
|
dac161p997_swif_write_reg(DAC161P997_LCK_REG_LOCK, CONFIG_WRITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 初始化DAC161设备
|
||||||
|
*
|
||||||
|
* 此函数用于初始化DAC161设备,进行必要的配置,以便设备正常工作。
|
||||||
|
* 写寄存器之前要先解锁,具体配置寄存器根据需要配置的寄存器而定
|
||||||
|
* 具体步骤包括:
|
||||||
|
* 1. 解锁DAC161的配置寄存器
|
||||||
|
* 2. 配置DAC161的错误下限寄存器
|
||||||
|
* 3. 锁定DAC161的配置寄存器
|
||||||
|
*/
|
||||||
|
void dac161p997_init()
|
||||||
|
{
|
||||||
|
_handle.io = gpio_create(DAC161P997_IO_PORT, DAC161P997_IO_PIN);
|
||||||
|
dac161p997_swif_write_reg(DAC161P997_LCK_REG_UNLOCK, CONFIG_WRITE);
|
||||||
|
dac161p997_swif_write_reg(DAC161P997_CONFIG2_REG +
|
||||||
|
DAC161P997_CONFIG2_REG_LOOP +
|
||||||
|
DAC161P997_CONFIG2_REG_CHANNEL +
|
||||||
|
DAC161P997_CONFIG2_REG_PARITY +
|
||||||
|
DAC161P997_CONFIG2_REG_FRAME,
|
||||||
|
CONFIG_WRITE);
|
||||||
|
dac161p997_swif_write_reg(DAC161P997_LCK_REG_LOCK, CONFIG_WRITE);
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
#ifndef __DAC161P997_H__
|
||||||
|
#define __DAC161P997_H__
|
||||||
|
#include "main.h"
|
||||||
|
#include "gpios.h"
|
||||||
|
|
||||||
|
#define DAC161P997_IO_PORT (DAC161P997_GPIO_Port)
|
||||||
|
#define DAC161P997_IO_PIN (DAC161P997_Pin)
|
||||||
|
|
||||||
|
#define DAC161P997_CURRENT_SLOPE 2730.625f // adc = (current / 24) * 0xffff
|
||||||
|
|
||||||
|
// Symbol Periods
|
||||||
|
#define DUTY_CYCLE_100 (1000U) // (CPU_CLK / BAUD_RATE)
|
||||||
|
#define DUTY_CYCLE_75 (DUTY_CYCLE_100 * 0.75f)
|
||||||
|
#define DUTY_CYCLE_50 (DUTY_CYCLE_100 * 0.50f)
|
||||||
|
#define DUTY_CYCLE_25 (DUTY_CYCLE_100 * 0.25f)
|
||||||
|
|
||||||
|
/************************************************************
|
||||||
|
* TI DAC161P997 REGISTER SET ADDRESSES
|
||||||
|
************************************************************/
|
||||||
|
#define DAC161P997_LCK_REG (0x0000)
|
||||||
|
#define DAC161P997_CONFIG1_REG (0x0100)
|
||||||
|
#define DAC161P997_CONFIG2_REG (0x0200)
|
||||||
|
#define DAC161P997_CONFIG3_REG (0x0300)
|
||||||
|
#define DAC161P997_ERR_LOW_REG (0x0400)
|
||||||
|
#define DAC161P997_ERR_HIGH_REG (0x0500)
|
||||||
|
|
||||||
|
// TI DAC161P997 Register Bits
|
||||||
|
#define DAC161P997_LCK_REG_LOCK (0x00AA) // any value other than 0x95
|
||||||
|
#define DAC161P997_LCK_REG_UNLOCK (0x0095)
|
||||||
|
#define DAC161P997_CONFIG1_REG_RST (0x0001)
|
||||||
|
#define DAC161P997_CONFIG1_REG_NOP (0 * 0x08u)
|
||||||
|
#define DAC161P997_CONFIG1_REG_SET_ERR (1 * 0x08u)
|
||||||
|
#define DAC161P997_CONFIG1_REG_CLEAR_ERR (2 * 0x08u)
|
||||||
|
#define DAC161P997_CONFIG1_REG_NOP3 (3 * 0x08u)
|
||||||
|
#define DAC161P997_CONFIG2_REG_LOOP (0x0001)
|
||||||
|
#define DAC161P997_CONFIG2_REG_CHANNEL (0x0002)
|
||||||
|
#define DAC161P997_CONFIG2_REG_PARITY (0x0004)
|
||||||
|
#define DAC161P997_CONFIG2_REG_FRAME (0x0008)
|
||||||
|
#define DAC161P997_CONFIG2_REG_ACK_EN (0x0010)
|
||||||
|
#define DAC161P997_CONFIG3_REG_RX_ERR_CNT_16 (0x000F)
|
||||||
|
#define DAC161P997_CONFIG3_REG_RX_ERR_CNT_8 (0x0007)
|
||||||
|
#define DAC161P997_CONFIG3_REG_RX_ERR_CNT_1 (0x0000)
|
||||||
|
|
||||||
|
// Tags
|
||||||
|
#define DACCODE_WRITE (0x00)
|
||||||
|
#define CONFIG_WRITE (0x01)
|
||||||
|
|
||||||
|
// Valid Symbols
|
||||||
|
#define ZERO_SYM (0x00)
|
||||||
|
#define ONE_SYM (0x01)
|
||||||
|
#define IDLE_SYM (0x02)
|
||||||
|
#define STATIC_LOW_SYM (0x03)
|
||||||
|
|
||||||
|
// DAC Codes for different currents
|
||||||
|
#define DACCODE_0mA (0x0000)
|
||||||
|
#define DACCODE_4mA (0x2AAA)
|
||||||
|
#define DACCODE_8mA (0x5555)
|
||||||
|
#define DACCODE_12mA (0x7FFF)
|
||||||
|
#define DACCODE_16mA (0xAAAA)
|
||||||
|
#define DACCODE_20mA (0xD555)
|
||||||
|
#define DACCODE_24mA (0xFFFF)
|
||||||
|
|
||||||
|
// cycles
|
||||||
|
// #define QUARTER_CYCLES (625)
|
||||||
|
// #define HALF_CYCLES (1250)
|
||||||
|
// #define THREE_CYCLES (1875)
|
||||||
|
// #define FULL_CYCLES (2500)
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
gpio_t *io;
|
||||||
|
} dac161p997_t;
|
||||||
|
|
||||||
|
void dac161p997_output_0(void);
|
||||||
|
void dac161p997_output_1(void);
|
||||||
|
void dac161p997_output_d(void);
|
||||||
|
void dac161p997_output_symbol(uint8_t sym);
|
||||||
|
void dac161p997_swif_write_reg(uint16_t data, uint8_t tag);
|
||||||
|
extern void dac161p997_output_current(float32 current);
|
||||||
|
extern void dac161p997_init(void);
|
||||||
|
#endif
|
|
@ -0,0 +1,219 @@
|
||||||
|
/**
|
||||||
|
* @file eeprom_fm24.c
|
||||||
|
* @author xxx
|
||||||
|
* @date 2023-08-29 07:58:27
|
||||||
|
* @brief 用于实现FM24 EEPROM相关的读写操作
|
||||||
|
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
#include "entity.h"
|
||||||
|
#include "board.h"
|
||||||
|
#include "eeprom_fm24.h"
|
||||||
|
#include "delay.h"
|
||||||
|
|
||||||
|
#define FM24_SPI SPI1
|
||||||
|
|
||||||
|
#define EEPROM_FM24_CS_PORT EE3_CS_GPIO_Port
|
||||||
|
#define EEPROM_FM24_CS_PIN EE3_CS_Pin
|
||||||
|
#define EEPROM_FM24_MOSI_PORT SPI_MOSI_GPIO_Port
|
||||||
|
#define EEPROM_FM24_MOSI_PIN SPI_MOSI_Pin
|
||||||
|
#define EEPROM_FM24_MISO_PORT SPI_MISO_GPIO_Port
|
||||||
|
#define EEPROM_FM24_MISO_PIN SPI_MISO_Pin
|
||||||
|
#define EEPROM_FM24_SCK_PORT SPI_CLK_GPIO_Port
|
||||||
|
#define EEPROM_FM24_SCK_PIN SPI_CLK_Pin
|
||||||
|
|
||||||
|
static fm24_t _eeprom_fm24;
|
||||||
|
|
||||||
|
void eeprom_fm24_init(void)
|
||||||
|
{
|
||||||
|
spi_gpio_group_t gpios;
|
||||||
|
spi_normal_config_t cfg;
|
||||||
|
osel_memset((uint8_t *)&cfg, 0, sizeof(spi_normal_config_t));
|
||||||
|
// 创建CS引脚
|
||||||
|
gpios.cs = gpio_create(EEPROM_FM24_CS_PORT, EEPROM_FM24_CS_PIN);
|
||||||
|
gpios.mosi = gpio_create(EEPROM_FM24_MOSI_PORT, EEPROM_FM24_MOSI_PIN);
|
||||||
|
gpios.sck = gpio_create(EEPROM_FM24_SCK_PORT, EEPROM_FM24_SCK_PIN);
|
||||||
|
gpios.miso = gpio_create(EEPROM_FM24_MISO_PORT, EEPROM_FM24_MISO_PIN);
|
||||||
|
gpios.rst = gpio_create(NULL, 0);
|
||||||
|
gpios.rdy = gpio_create(NULL, 0);
|
||||||
|
|
||||||
|
// 创建SPI对象
|
||||||
|
eeprom_fm24_get()->spi = spi_create(SPI_TYPE_NORMAL, gpios, 0);
|
||||||
|
DBG_ASSERT(eeprom_fm24_get() != NULL __DBG_LINE);
|
||||||
|
cfg.cmd_rdsr = FM24_CMD_RDSR;
|
||||||
|
cfg.cmd_wrsr = FM24_CMD_WRSR;
|
||||||
|
cfg.cmd_wren = FM24_CMD_WREN;
|
||||||
|
cfg.cmd_wrdi = FM24_CMD_WRDI;
|
||||||
|
cfg.cmd_write = FM24_CMD_WRITE;
|
||||||
|
cfg.cmd_read = FM24_CMD_READ;
|
||||||
|
cfg.dummy_byte = FM24_DUMMY_BYTE;
|
||||||
|
cfg.address_bytes = 2;
|
||||||
|
cfg.page_size = FM24_PAGE_SIZE;
|
||||||
|
cfg.total_size = FM24_SIZE;
|
||||||
|
cfg.continuous_write = FALSE;
|
||||||
|
osel_memcpy((uint8_t *)&eeprom_fm24_get()->spi->cfg, (uint8_t *)&cfg, sizeof(spi_normal_config_t));
|
||||||
|
// 使能SPI
|
||||||
|
eeprom_fm24_get()->spi->interface.hardware_enable(eeprom_fm24_get()->spi, FM24_SPI);
|
||||||
|
// 这里需要复位下SPI,否则读出的数据不对
|
||||||
|
eeprom_fm24_get()->spi->interface.u.normal.spi_reset(eeprom_fm24_get()->spi);
|
||||||
|
|
||||||
|
eeprom_fm24_write_protection_close();
|
||||||
|
// eeprom_fm24_test();
|
||||||
|
}
|
||||||
|
|
||||||
|
fm24_t *eeprom_fm24_get(void)
|
||||||
|
{
|
||||||
|
return &_eeprom_fm24;
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeprom_fm24_dinit(void)
|
||||||
|
{
|
||||||
|
LL_SPI_Disable(FM24_SPI);
|
||||||
|
GPIO_SET_ANALOG(eeprom_fm24_get()->spi->gpios.mosi->port, eeprom_fm24_get()->spi->gpios.mosi->pin);
|
||||||
|
GPIO_SET_ANALOG(eeprom_fm24_get()->spi->gpios.miso->port, eeprom_fm24_get()->spi->gpios.miso->pin);
|
||||||
|
GPIO_SET_ANALOG(eeprom_fm24_get()->spi->gpios.sck->port, eeprom_fm24_get()->spi->gpios.sck->pin);
|
||||||
|
GPIO_SET_ANALOG(eeprom_fm24_get()->spi->gpios.cs->port, eeprom_fm24_get()->spi->gpios.cs->pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeprom_fm24_enable(void)
|
||||||
|
{
|
||||||
|
uint16_t count = 100;
|
||||||
|
LL_SPI_Enable(FM24_SPI);
|
||||||
|
// 判断SPI是否使能成功
|
||||||
|
while (LL_SPI_IsEnabled(FM24_SPI) != 1)
|
||||||
|
{
|
||||||
|
if (count-- == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__NOP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void eeprom_fm24_disable(void)
|
||||||
|
{
|
||||||
|
uint16_t count = 100;
|
||||||
|
LL_SPI_Disable(FM24_SPI);
|
||||||
|
// 判断SPI是否关闭成功
|
||||||
|
while (LL_SPI_IsEnabled(FM24_SPI) != 0)
|
||||||
|
{
|
||||||
|
if (count-- == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__NOP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 关闭EEPROM FM24的写保护
|
||||||
|
*
|
||||||
|
* 此函数用于关闭EEPROM FM24的写保护功能,允许对其进行写操作。
|
||||||
|
*
|
||||||
|
* 调用此函数前,应确保EEPROM FM24的SPI接口已正确初始化。
|
||||||
|
*/
|
||||||
|
void eeprom_fm24_write_protection_close(void)
|
||||||
|
{
|
||||||
|
DBG_ASSERT(eeprom_fm24_get()->spi != NULL __DBG_LINE);
|
||||||
|
eeprom_fm24_enable();
|
||||||
|
eeprom_fm24_get()->spi->interface.u.normal.spi_write_reg(eeprom_fm24_get()->spi, eeprom_fm24_get()->spi->cfg.cmd_wrsr, 0);
|
||||||
|
eeprom_fm24_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 获取EEPROM FM24的写保护状态
|
||||||
|
*
|
||||||
|
* 获取EEPROM FM24的写保护状态。
|
||||||
|
*
|
||||||
|
* @return BOOL 返回TRUE表示没有写保护,返回FALSE表示有写保护
|
||||||
|
*/
|
||||||
|
BOOL eeprom_fm24_write_protection_state(void)
|
||||||
|
{
|
||||||
|
DBG_ASSERT(eeprom_fm24_get()->spi != NULL __DBG_LINE);
|
||||||
|
eeprom_fm24_enable();
|
||||||
|
eeprom_fm24_get()->write_protection.data = eeprom_fm24_get()->spi->interface.u.normal.spi_read_reg(eeprom_fm24_get()->spi, eeprom_fm24_get()->spi->cfg.cmd_rdsr);
|
||||||
|
eeprom_fm24_disable();
|
||||||
|
|
||||||
|
if (eeprom_fm24_get()->write_protection.bits.bp0 == 1 ||
|
||||||
|
eeprom_fm24_get()->write_protection.bits.bp1 == 1 ||
|
||||||
|
eeprom_fm24_get()->write_protection.bits.wpen == 1)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL eeprom_fm24_write(uint32_t write_addr, uint8_t *data, uint16_t length)
|
||||||
|
{
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
if (length == 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
// 开启和关闭SPI对读写实时性有影响
|
||||||
|
eeprom_fm24_enable();
|
||||||
|
ret = eeprom_fm24_get()->spi->interface.u.normal.spi_write(eeprom_fm24_get()->spi, write_addr, data, length);
|
||||||
|
eeprom_fm24_disable();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL eeprom_fm24_read(uint32_t read_addr, uint8_t *data, uint16_t length)
|
||||||
|
{
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
if (length == 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
// 开启和关闭SPI对读写实时性有影响
|
||||||
|
eeprom_fm24_enable();
|
||||||
|
ret = eeprom_fm24_get()->spi->interface.u.normal.spi_read(eeprom_fm24_get()->spi, read_addr, data, length);
|
||||||
|
eeprom_fm24_disable();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL eeprom_fm24_test(void)
|
||||||
|
{
|
||||||
|
const uint8_t buf_size = 5;
|
||||||
|
uint16_t test_address = FM24_TEST_PAGE * FM24_PAGE_SIZE;
|
||||||
|
uint8_t buf[buf_size];
|
||||||
|
uint8_t rbuf[buf_size];
|
||||||
|
osel_memset(buf, 0, buf_size);
|
||||||
|
osel_memset(rbuf, 0, buf_size);
|
||||||
|
buf[0] = 0xD5;
|
||||||
|
buf[1] = 0xC8;
|
||||||
|
buf[2] = 0x00;
|
||||||
|
buf[3] = 0x01;
|
||||||
|
buf[4] = 0x02;
|
||||||
|
buf[buf_size - 1] = 0xfe;
|
||||||
|
eeprom_fm24_write(test_address, buf, buf_size);
|
||||||
|
__NOP();
|
||||||
|
eeprom_fm24_read(test_address, rbuf, buf_size);
|
||||||
|
if (osel_memcmp(buf, rbuf, buf_size) == 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 获取FM24 EEPROM的状态
|
||||||
|
*
|
||||||
|
* 获取FM24 EEPROM的当前状态。该函数始终返回TRUE,表示EEPROM正常工作。
|
||||||
|
*
|
||||||
|
* @return BOOL 始终返回TRUE
|
||||||
|
*/
|
||||||
|
BOOL eeprom_fm24_status_get(void)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
|
@ -0,0 +1,158 @@
|
||||||
|
/**
|
||||||
|
* @file eeprom_fm24.h
|
||||||
|
* @author xxx
|
||||||
|
* @date 2023-08-30 14:05:55
|
||||||
|
* @brief FM24系列EEPROM驱动 https://zhuanlan.zhihu.com/p/598934638
|
||||||
|
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EEPROM_FM24_H__
|
||||||
|
#define __EEPROM_FM24_H__
|
||||||
|
#include "main.h"
|
||||||
|
#include "spis.h"
|
||||||
|
// High-endurance 100 trillion (1014) read/writes
|
||||||
|
|
||||||
|
//========在此设定芯片地址=============
|
||||||
|
|
||||||
|
#define W_ADD_COM 0xa0 // 写字节命令及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 0
|
||||||
|
|
||||||
|
#define R_ADD_COM 0xa1 // 读命令字节及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 1
|
||||||
|
|
||||||
|
//=======在此设定芯片型号, 1代表24C01; 16代表24C16; 512代表24C512
|
||||||
|
|
||||||
|
//=======在此设定芯片型号, 1代表24C01; 16代表24C16; 512代表24C512
|
||||||
|
|
||||||
|
#define e2prom 256 //
|
||||||
|
|
||||||
|
#if e2prom == 1
|
||||||
|
#define FM24_PAGE_SIZE 16
|
||||||
|
#define FM24_SIZE (128 * 8)
|
||||||
|
#elif e2prom == 2
|
||||||
|
#define FM24_PAGE_SIZE 16
|
||||||
|
#define FM24_SIZE (256 * 8)
|
||||||
|
#elif e2prom == 4
|
||||||
|
#define FM24_PAGE_SIZE 32
|
||||||
|
#define FM24_SIZE (512 * 8)
|
||||||
|
#elif e2prom == 8
|
||||||
|
#define FM24_PAGE_SIZE 64
|
||||||
|
#define FM24_SIZE (1024 * 8)
|
||||||
|
#elif e2prom == 16
|
||||||
|
#define FM24_PAGE_SIZE 128
|
||||||
|
#define FM24_SIZE (2048 * 8)
|
||||||
|
#elif e2prom == 32
|
||||||
|
#define FM24_PAGE_SIZE 128
|
||||||
|
#define FM24_SIZE (4096 * 8)
|
||||||
|
#elif e2prom == 64
|
||||||
|
#define FM24_PAGE_SIZE 256
|
||||||
|
#define FM24_SIZE (8192 * 8)
|
||||||
|
#elif e2prom == 128
|
||||||
|
#define FM24_PAGE_SIZE 256
|
||||||
|
#define FM24_SIZE (16384)
|
||||||
|
#elif e2prom == 256
|
||||||
|
#define FM24_PAGE_SIZE 256
|
||||||
|
#define FM24_SIZE (32768) // 32K 128页
|
||||||
|
#elif e2prom == 512
|
||||||
|
#define FM24_PAGE_SIZE 512
|
||||||
|
#define FM24_SIZE (65536)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FM24_CMD_RDSR 0x05 /*!< Read Status Register instruction */
|
||||||
|
#define FM24_CMD_WRSR 0x01 /*!< Write Status Register instruction */
|
||||||
|
|
||||||
|
#define FM24_CMD_WREN 0x06 /*!< Write enable instruction */
|
||||||
|
#define FM24_CMD_WRDI 0x04 /*!< Write disable instruction */
|
||||||
|
|
||||||
|
#define FM24_CMD_READ 0x03 /*!< Read from Memory instruction */
|
||||||
|
#define FM24_CMD_WRITE 0x02 /*!< Write to Memory instruction */
|
||||||
|
|
||||||
|
#define FM24_DUMMY_BYTE 0x00 ///< 无用数据
|
||||||
|
|
||||||
|
#define FM24_TEST_PAGE 0 ///< 测试页地址
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
uint8_t data;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint8_t reserve1 : 1;
|
||||||
|
uint8_t wel : 1; ///< Write enable latch
|
||||||
|
uint8_t bp0 : 1; ///< Block protect 0
|
||||||
|
uint8_t bp1 : 1; ///< Block protect 1
|
||||||
|
uint8_t reserve2 : 3;
|
||||||
|
uint8_t wpen : 1; ///< Write protect enable
|
||||||
|
} bits;
|
||||||
|
} fm24_write_protection_u;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
fm24_write_protection_u write_protection;
|
||||||
|
spi_t *spi;
|
||||||
|
} fm24_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes the FM24 EEPROM module.
|
||||||
|
*/
|
||||||
|
extern void eeprom_fm24_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Deinitializes the FM24 EEPROM module.
|
||||||
|
*/
|
||||||
|
extern void eeprom_fm24_dinit(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the fm24_t handle of the FM24 EEPROM module.
|
||||||
|
* @return The fm24_t handle of the FM24 EEPROM module.
|
||||||
|
*/
|
||||||
|
extern fm24_t *eeprom_fm24_get(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the FM24 EEPROM module.
|
||||||
|
*/
|
||||||
|
extern void eeprom_fm24_enable(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disables the FM24 EEPROM module.
|
||||||
|
*/
|
||||||
|
extern void eeprom_fm24_disable(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reads data from the FM24 EEPROM module.
|
||||||
|
* @param read_addr The starting address to read from.
|
||||||
|
* @param data Pointer to the buffer to store the read data.
|
||||||
|
* @param length The number of bytes to read.
|
||||||
|
* @return TRUE if the read operation is successful, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
extern BOOL eeprom_fm24_read(uint32_t read_addr, uint8_t *data, uint16_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Writes data to the FM24 EEPROM module.
|
||||||
|
* @param write_addr The starting address to write to.
|
||||||
|
* @param data Pointer to the data to be written.
|
||||||
|
* @param length The number of bytes to write.
|
||||||
|
* @return TRUE if the write operation is successful, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
extern BOOL eeprom_fm24_write(uint32_t write_addr, uint8_t *data, uint16_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Closes the write protection of the FM24 EEPROM module.
|
||||||
|
*/
|
||||||
|
extern void eeprom_fm24_write_protection_close(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the write protection state of the FM24 EEPROM module.
|
||||||
|
* @return TRUE if the FM24 EEPROM module is not write-protected, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
extern BOOL eeprom_fm24_write_protection_state(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Performs a test on the FM24 EEPROM module.
|
||||||
|
*/
|
||||||
|
extern BOOL eeprom_fm24_test(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the status of the FM24 EEPROM module.
|
||||||
|
* @return TRUE if the FM24 EEPROM module is ready, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
extern BOOL eeprom_fm24_status_get(void);
|
||||||
|
|
||||||
|
#endif // __EEPROM_FM24_H__
|
|
@ -0,0 +1,152 @@
|
||||||
|
#include "eeprom_lc02b.h"
|
||||||
|
#include "delay.h"
|
||||||
|
|
||||||
|
#define W_ADD_COM 0xa8 // 写字节命令及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 0
|
||||||
|
#define R_ADD_COM 0xa9 // 读命令字节及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 1
|
||||||
|
#define PAGE_SIZE 8U
|
||||||
|
#define SIZE 256U
|
||||||
|
|
||||||
|
#define EEPROM_LC02B_SDA_PORT I2C1_SDA_GPIO_Port
|
||||||
|
#define EEPROM_LC02B_SDA_PIN I2C1_SDA_Pin
|
||||||
|
#define EEPROM_LC02B_SCL_PORT I2C1_SCL_GPIO_Port
|
||||||
|
#define EEPROM_LC02B_SCL_PIN I2C1_SCL_Pin
|
||||||
|
|
||||||
|
static i2c_t *eeprom_24lc028bt_i2c;
|
||||||
|
|
||||||
|
void eeprom_lc02b_test(void)
|
||||||
|
{
|
||||||
|
#define TEST_SIZE 15
|
||||||
|
uint16_t test_address = SIZE - TEST_SIZE;
|
||||||
|
uint8_t buf[TEST_SIZE];
|
||||||
|
for (uint8_t i = 0; i < TEST_SIZE; i++)
|
||||||
|
{
|
||||||
|
buf[i] = i + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
eeprom_lc02b_write(test_address, buf, TEST_SIZE);
|
||||||
|
LL_mDelay(10);
|
||||||
|
osel_memset(buf, 0, ARRAY_LEN(buf));
|
||||||
|
eeprom_lc02b_read(test_address, buf, TEST_SIZE);
|
||||||
|
|
||||||
|
__NOP();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 获取EEPROM LC02B的状态
|
||||||
|
*
|
||||||
|
* 此函数用于获取EEPROM LC02B的当前状态。
|
||||||
|
*
|
||||||
|
* @return 如果EEPROM LC02B处于正常状态,则返回TRUE;否则返回FALSE。
|
||||||
|
* 注意:在本实现中,总是返回TRUE,因为这是一个简单的示例函数。
|
||||||
|
*/
|
||||||
|
BOOL eeprom_lc02b_status_get(void)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief EEPROM LC02B初始化
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
void eeprom_lc02b_init(void)
|
||||||
|
{
|
||||||
|
i2c_gpio_group_t gpios;
|
||||||
|
gpios.scl = gpio_create(EEPROM_LC02B_SCL_PORT, EEPROM_LC02B_SCL_PIN);
|
||||||
|
gpios.sda = gpio_create(EEPROM_LC02B_SDA_PORT, EEPROM_LC02B_SDA_PIN);
|
||||||
|
|
||||||
|
eeprom_24lc028bt_i2c = i2c_create(gpios, 10);
|
||||||
|
// eeprom_lc02b_test();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief EEPROM LC02B反初始化
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
void eeprom_lc02b_dinit(void)
|
||||||
|
{
|
||||||
|
GPIO_SET_ANALOG(EEPROM_LC02B_SDA_PORT, EEPROM_LC02B_SDA_PIN);
|
||||||
|
GPIO_SET_ANALOG(EEPROM_LC02B_SCL_PORT, EEPROM_LC02B_SCL_PIN);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief 写入数据
|
||||||
|
* @param {uint32_t} write_addr
|
||||||
|
* @param {uint8_t} *data
|
||||||
|
* @param {uint16_t} length
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
void eeprom_lc02b_write(uint32_t write_addr, uint8_t *data, uint16_t length)
|
||||||
|
{
|
||||||
|
// 发送开始信号
|
||||||
|
eeprom_24lc028bt_i2c->interface.start(eeprom_24lc028bt_i2c);
|
||||||
|
// 发送写入地址命令
|
||||||
|
eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, W_ADD_COM);
|
||||||
|
// 等待写入地址命令响应
|
||||||
|
eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
|
||||||
|
// 发送要写入的地址
|
||||||
|
eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, (uint8_t)write_addr);
|
||||||
|
eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
|
||||||
|
|
||||||
|
// 循环写入数据
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
// 写入一个字节数据
|
||||||
|
eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, *data++);
|
||||||
|
// 等待响应
|
||||||
|
eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
|
||||||
|
write_addr++;
|
||||||
|
if (write_addr % PAGE_SIZE == 0)
|
||||||
|
{
|
||||||
|
eeprom_24lc028bt_i2c->interface.stop(eeprom_24lc028bt_i2c);
|
||||||
|
LL_mDelay(10); // 延时10ms,等待写入完成
|
||||||
|
eeprom_24lc028bt_i2c->interface.start(eeprom_24lc028bt_i2c);
|
||||||
|
eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, W_ADD_COM);
|
||||||
|
eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
|
||||||
|
eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, (uint8_t)write_addr);
|
||||||
|
eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 写入完成,停止I2C总线
|
||||||
|
eeprom_24lc028bt_i2c->interface.stop(eeprom_24lc028bt_i2c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 读取数据
|
||||||
|
* @param {uint32_t} read_addr
|
||||||
|
* @param {uint8_t} *data
|
||||||
|
* @param {uint16_t} length
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
void eeprom_lc02b_read(uint32_t read_addr, uint8_t *data, uint16_t length)
|
||||||
|
{
|
||||||
|
// 发送开始信号
|
||||||
|
eeprom_24lc028bt_i2c->interface.start(eeprom_24lc028bt_i2c);
|
||||||
|
// 发送写入地址命令
|
||||||
|
eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, W_ADD_COM);
|
||||||
|
// 等待写入地址命令响应
|
||||||
|
eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
|
||||||
|
|
||||||
|
// 发送要读取的地址
|
||||||
|
eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, (uint8_t)read_addr);
|
||||||
|
eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
|
||||||
|
|
||||||
|
// 发送开始信号
|
||||||
|
eeprom_24lc028bt_i2c->interface.start(eeprom_24lc028bt_i2c);
|
||||||
|
// 发送读取地址命令
|
||||||
|
eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, R_ADD_COM);
|
||||||
|
// 等待读取地址命令响应
|
||||||
|
eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
|
||||||
|
// 循环读取数据
|
||||||
|
for (uint16_t i = 0; i < length - 1; i++)
|
||||||
|
{
|
||||||
|
// 读取一个字节数据
|
||||||
|
*data++ = eeprom_24lc028bt_i2c->interface.read_byte(eeprom_24lc028bt_i2c, TRUE);
|
||||||
|
}
|
||||||
|
*data++ = eeprom_24lc028bt_i2c->interface.read_byte(eeprom_24lc028bt_i2c, FALSE);
|
||||||
|
// 停止I2C总线
|
||||||
|
eeprom_24lc028bt_i2c->interface.stop(eeprom_24lc028bt_i2c);
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
/**
|
||||||
|
* @file eeprom_lc02b.h
|
||||||
|
* @author xxx
|
||||||
|
* @date 2023-12-27 14:44:02
|
||||||
|
* @brief
|
||||||
|
* @copyright Copyright (c) 2024 by xxx, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
#ifndef __EEPROM_LC02B_H
|
||||||
|
#define __EEPROM_LC02B_H
|
||||||
|
#include "main.h"
|
||||||
|
#include "entity.h"
|
||||||
|
|
||||||
|
#define PRRESSURE_CALIBRATION_ADDRESS 0x00 ///< 压力校准地址
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes the LC02B EEPROM module.
|
||||||
|
*/
|
||||||
|
void eeprom_lc02b_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Deinitializes the LC02B EEPROM module.
|
||||||
|
*/
|
||||||
|
void eeprom_lc02b_dinit(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Writes data to the LC02B EEPROM module.
|
||||||
|
*
|
||||||
|
* @param write_addr The starting address to write the data.
|
||||||
|
* @param data The pointer to the data to be written.
|
||||||
|
* @param length The length of the data to be written.
|
||||||
|
*/
|
||||||
|
void eeprom_lc02b_write(uint32_t write_addr, uint8_t *data, uint16_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reads data from the LC02B EEPROM module.
|
||||||
|
*
|
||||||
|
* @param read_addr The starting address to read the data.
|
||||||
|
* @param data The pointer to store the read data.
|
||||||
|
* @param length The length of the data to be read.
|
||||||
|
*/
|
||||||
|
void eeprom_lc02b_read(uint32_t read_addr, uint8_t *data, uint16_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Performs a test on the LC02B EEPROM module.
|
||||||
|
*/
|
||||||
|
void eeprom_lc02b_test(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the LC02B EEPROM status.
|
||||||
|
*
|
||||||
|
* This function is used to get the current status of the LC02B EEPROM.
|
||||||
|
*
|
||||||
|
* @return TRUE if the LC02B EEPROM is in normal status, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
BOOL eeprom_lc02b_status_get(void);
|
||||||
|
#endif ///< !__EEPROM_LC02B_H
|
|
@ -0,0 +1,331 @@
|
||||||
|
/**
|
||||||
|
* @file eeprom_m95.c
|
||||||
|
* @author xxx
|
||||||
|
* @date 2023-08-30 08:58:43
|
||||||
|
* @brief 用于实现M95 EEPROM相关的读写操作
|
||||||
|
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "eeprom_m95.h"
|
||||||
|
#include "spis.h"
|
||||||
|
#include "delay.h"
|
||||||
|
#include "entity.h"
|
||||||
|
#include "board.h"
|
||||||
|
#include "diagnosis.h"
|
||||||
|
#include "storage.h"
|
||||||
|
|
||||||
|
#define M95_SPI SPI1
|
||||||
|
|
||||||
|
#define EEPROM_M95_1_CS_PORT EE1_CS_GPIO_Port
|
||||||
|
#define EEPROM_M95_1_CS_PIN EE1_CS_Pin
|
||||||
|
#define EEPROM_M95_2_CS_PORT EE2_CS_GPIO_Port
|
||||||
|
#define EEPROM_M95_2_CS_PIN EE2_CS_Pin
|
||||||
|
|
||||||
|
// 下面宏定义为2个EEPROM_M95的引脚定义
|
||||||
|
#define EEPROM_M95_MOSI_PORT SPI_MOSI_GPIO_Port
|
||||||
|
#define EEPROM_M95_MOSI_PIN SPI_MOSI_Pin
|
||||||
|
#define EEPROM_M95_MISO_PORT SPI_MISO_GPIO_Port
|
||||||
|
#define EEPROM_M95_MISO_PIN SPI_MISO_Pin
|
||||||
|
#define EEPROM_M95_SCK_PORT SPI_CLK_GPIO_Port
|
||||||
|
#define EEPROM_M95_SCK_PIN SPI_CLK_Pin
|
||||||
|
|
||||||
|
m95_number_t eeprom_m95s[M95_MAX];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 初始化EEPROM_M95eeprom_m95s
|
||||||
|
* @param {m95_number_e} num
|
||||||
|
* @return {*}
|
||||||
|
* @note 初始化函数对板卡上不同的芯片定义了块大小
|
||||||
|
*/
|
||||||
|
void eeprom_m95_init(m95_number_e num)
|
||||||
|
{
|
||||||
|
DBG_ASSERT(num < M95_MAX __DBG_LINE);
|
||||||
|
spi_gpio_group_t gpios;
|
||||||
|
spi_t *eeprom_m95_spi;
|
||||||
|
spi_normal_config_t cfg;
|
||||||
|
osel_memset((uint8_t *)&cfg, 0, sizeof(spi_normal_config_t));
|
||||||
|
cfg.cmd_rdsr = M95_CMD_RDSR;
|
||||||
|
cfg.cmd_wrsr = M95_CMD_WRSR;
|
||||||
|
cfg.cmd_wren = M95_CMD_WREN;
|
||||||
|
cfg.cmd_wrdi = M95_CMD_WRDI;
|
||||||
|
cfg.cmd_write = M95_CMD_WRITE;
|
||||||
|
cfg.cmd_read = M95_CMD_READ;
|
||||||
|
cfg.dummy_byte = M95_DUMMY_BYTE;
|
||||||
|
cfg.continuous_write = FALSE;
|
||||||
|
// 128 byte
|
||||||
|
if (num == M95_1)
|
||||||
|
{
|
||||||
|
// 创建CS引脚
|
||||||
|
gpios.cs = gpio_create(EEPROM_M95_1_CS_PORT, EEPROM_M95_1_CS_PIN);
|
||||||
|
|
||||||
|
cfg.address_bytes = 3;
|
||||||
|
cfg.page_size = M95_PAGE_SIZE_256;
|
||||||
|
cfg.total_size = _M95M02_;
|
||||||
|
}
|
||||||
|
// 256 byte
|
||||||
|
else if (num == M95_2)
|
||||||
|
{
|
||||||
|
// 创建CS引脚
|
||||||
|
gpios.cs = gpio_create(EEPROM_M95_2_CS_PORT, EEPROM_M95_2_CS_PIN);
|
||||||
|
|
||||||
|
cfg.address_bytes = 3;
|
||||||
|
cfg.page_size = M95_PAGE_SIZE_256;
|
||||||
|
cfg.total_size = _M95M02_;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DBG_ASSERT(FALSE __DBG_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
gpios.mosi = gpio_create(EEPROM_M95_MOSI_PORT, EEPROM_M95_MOSI_PIN);
|
||||||
|
gpios.sck = gpio_create(EEPROM_M95_SCK_PORT, EEPROM_M95_SCK_PIN);
|
||||||
|
gpios.miso = gpio_create(EEPROM_M95_MISO_PORT, EEPROM_M95_MISO_PIN);
|
||||||
|
gpios.rst = gpio_create(NULL, 0);
|
||||||
|
gpios.rdy = gpio_create(NULL, 0);
|
||||||
|
|
||||||
|
// 创建SPI对象
|
||||||
|
eeprom_m95_spi = spi_create(SPI_TYPE_NORMAL, gpios, 10);
|
||||||
|
DBG_ASSERT(eeprom_m95_spi != NULL __DBG_LINE);
|
||||||
|
osel_memcpy((uint8_t *)&eeprom_m95_spi->cfg, (uint8_t *)&cfg, sizeof(spi_normal_config_t));
|
||||||
|
// 使能SPI
|
||||||
|
eeprom_m95_spi->interface.hardware_enable(eeprom_m95_spi, M95_SPI);
|
||||||
|
eeprom_m95s[num].num = num;
|
||||||
|
eeprom_m95s[num].spi = eeprom_m95_spi;
|
||||||
|
// 这里需要设置,否则读出的数据不对
|
||||||
|
eeprom_m95_spi->interface.u.normal.spi_reset(eeprom_m95_spi);
|
||||||
|
eeprom_m95_write_protection_close(num); // 关闭写保护
|
||||||
|
|
||||||
|
// eeprom_m95_test(num);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 反初始化EEPROM_M95
|
||||||
|
* @param {m95_number_e} num
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
void eeprom_m95_dinit(m95_number_e num)
|
||||||
|
{
|
||||||
|
LL_SPI_Disable(M95_SPI);
|
||||||
|
GPIO_SET_ANALOG(eeprom_m95s[num].spi->gpios.mosi->port, eeprom_m95s[num].spi->gpios.mosi->pin);
|
||||||
|
GPIO_SET_ANALOG(eeprom_m95s[num].spi->gpios.miso->port, eeprom_m95s[num].spi->gpios.miso->pin);
|
||||||
|
GPIO_SET_ANALOG(eeprom_m95s[num].spi->gpios.sck->port, eeprom_m95s[num].spi->gpios.sck->pin);
|
||||||
|
GPIO_SET_ANALOG(eeprom_m95s[num].spi->gpios.cs->port, eeprom_m95s[num].spi->gpios.cs->pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief M95 EEPROM使能
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
void eeprom_m95_enable(void)
|
||||||
|
{
|
||||||
|
uint16_t count = 100;
|
||||||
|
LL_SPI_Enable(M95_SPI);
|
||||||
|
// 判断SPI是否使能成功
|
||||||
|
while (LL_SPI_IsEnabled(M95_SPI) != 1)
|
||||||
|
{
|
||||||
|
if (count-- == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__NOP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief M95 EEPROM失能
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
void eeprom_m95_disable(void)
|
||||||
|
{
|
||||||
|
uint16_t count = 100;
|
||||||
|
LL_SPI_Disable(M95_SPI);
|
||||||
|
// 判断SPI是否关闭成功
|
||||||
|
while (LL_SPI_IsEnabled(M95_SPI) != 0)
|
||||||
|
{
|
||||||
|
if (count-- == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__NOP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 关闭EEPROM M95写保护
|
||||||
|
*
|
||||||
|
* 关闭指定M95 EEPROM的写保护功能。
|
||||||
|
*
|
||||||
|
* @param num 指定M95 EEPROM的编号
|
||||||
|
*/
|
||||||
|
void eeprom_m95_write_protection_close(m95_number_e num)
|
||||||
|
{
|
||||||
|
spi_t *handle = eeprom_m95s[num].spi;
|
||||||
|
DBG_ASSERT(handle != NULL __DBG_LINE);
|
||||||
|
eeprom_m95_enable();
|
||||||
|
handle->interface.u.normal.spi_write_reg(handle, handle->cfg.cmd_wrsr, 0);
|
||||||
|
eeprom_m95_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 获取M95 EEPROM写保护状态(软件)
|
||||||
|
*
|
||||||
|
* 根据传入的M95编号获取其写保护状态。
|
||||||
|
*
|
||||||
|
* @param num M95编号
|
||||||
|
* @return 如果M95 EEPROM处于写保护状态,则返回FALSE;否则返回TRUE。
|
||||||
|
*/
|
||||||
|
BOOL eeprom_m95_write_protection_state(m95_number_e num)
|
||||||
|
{
|
||||||
|
spi_t *handle = eeprom_m95s[num].spi;
|
||||||
|
DBG_ASSERT(handle != NULL __DBG_LINE);
|
||||||
|
eeprom_m95_enable();
|
||||||
|
eeprom_m95s[num].write_protection.data = handle->interface.u.normal.spi_read_reg(handle, handle->cfg.cmd_rdsr);
|
||||||
|
eeprom_m95_disable();
|
||||||
|
|
||||||
|
if (eeprom_m95s[num].write_protection.bits.bp0 == 1 ||
|
||||||
|
eeprom_m95s[num].write_protection.bits.bp1 == 1 ||
|
||||||
|
eeprom_m95s[num].write_protection.bits.srwd == 1)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 读取M95 EEPROM内存数据
|
||||||
|
* @param num EEPROM模块编号(0或1)
|
||||||
|
* @param read_addr 要读取的地址
|
||||||
|
* @param data 存储读取数据的缓冲区
|
||||||
|
* @param length 要读取的数据长度
|
||||||
|
* @return {*}
|
||||||
|
*/
|
||||||
|
BOOL eeprom_m95_read(m95_number_e num, uint32_t read_addr, uint8_t *data, uint16_t length)
|
||||||
|
{
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
if (length == 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
spi_t *eeprom_m95_spi = eeprom_m95s[num].spi; // 获取EEPROM模块的SPI配置
|
||||||
|
DBG_ASSERT(eeprom_m95_spi != NULL __DBG_LINE);
|
||||||
|
// 开启和关闭SPI对读写实时性有影响
|
||||||
|
eeprom_m95_enable();
|
||||||
|
ret = eeprom_m95_spi->interface.u.normal.spi_read(eeprom_m95_spi, read_addr, data, length);
|
||||||
|
eeprom_m95_disable();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 向M95 EEPROM内存写入数据
|
||||||
|
* @param num EEPROM模块编号(0或1)
|
||||||
|
* @param write_addr 要写入的地址
|
||||||
|
* @param data 包含要写入数据的缓冲区
|
||||||
|
* @param length 要写入的数据长度
|
||||||
|
* @return {*}
|
||||||
|
*/
|
||||||
|
BOOL eeprom_m95_write(m95_number_e num, uint32_t write_addr, uint8_t *data, uint16_t length)
|
||||||
|
{
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
if (length == 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
spi_t *eeprom_m95_spi = eeprom_m95s[num].spi;
|
||||||
|
DBG_ASSERT(eeprom_m95_spi != NULL __DBG_LINE);
|
||||||
|
// 开启和关闭SPI对读写实时性有影响
|
||||||
|
eeprom_m95_enable();
|
||||||
|
ret = eeprom_m95_spi->interface.u.normal.spi_write(eeprom_m95_spi, write_addr, data, length);
|
||||||
|
eeprom_m95_disable();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL eeprom_m95_1_read(uint32_t addr, uint8_t *buf, uint16_t size)
|
||||||
|
{
|
||||||
|
return eeprom_m95_read(M95_1, addr, buf, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL eeprom_m95_1_write(uint32_t addr, uint8_t *buf, uint16_t size)
|
||||||
|
{
|
||||||
|
return eeprom_m95_write(M95_1, addr, (uint8_t *)buf, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL eeprom_m95_2_read(uint32_t addr, uint8_t *buf, uint16_t size)
|
||||||
|
{
|
||||||
|
return eeprom_m95_read(M95_2, addr, buf, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL eeprom_m95_2_write(uint32_t addr, uint8_t *buf, uint16_t size)
|
||||||
|
{
|
||||||
|
return eeprom_m95_write(M95_2, addr, (uint8_t *)buf, size);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief 用于M95 EEPROM测试
|
||||||
|
* @param {m95_number_e} num
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
BOOL eeprom_m95_test(m95_number_e num)
|
||||||
|
{
|
||||||
|
const uint8_t buf_size = 5;
|
||||||
|
storage_t *st = storage_init(M95_TEST_PAGE * M95_PAGE_SIZE_256, M95_PAGE_SIZE_256);
|
||||||
|
DBG_ASSERT(st != NULL __DBG_LINE);
|
||||||
|
|
||||||
|
if (num == M95_1)
|
||||||
|
{
|
||||||
|
st->ops.read = eeprom_m95_1_read;
|
||||||
|
st->ops.write = eeprom_m95_1_write;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
st->ops.read = eeprom_m95_2_read;
|
||||||
|
st->ops.write = eeprom_m95_2_write;
|
||||||
|
}
|
||||||
|
uint8_t buf[buf_size];
|
||||||
|
uint8_t rbuf[buf_size];
|
||||||
|
storage_add_node(st, 0, buf_size);
|
||||||
|
osel_memset(buf, 0, buf_size);
|
||||||
|
buf[0] = 0xD5;
|
||||||
|
buf[1] = 0xC8;
|
||||||
|
buf[2] = num;
|
||||||
|
buf[3] = 0xaa;
|
||||||
|
buf[4] = 0xbb;
|
||||||
|
storage_write(st, 0, buf);
|
||||||
|
__NOP();
|
||||||
|
storage_read(st, 0, rbuf);
|
||||||
|
storage_destroy(st);
|
||||||
|
if (osel_memcmp(buf, rbuf, buf_size) == 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 获取EEPROM M95状态
|
||||||
|
*
|
||||||
|
* 获取EEPROM M95设备的工作状态。
|
||||||
|
*
|
||||||
|
* @param num EEPROM M95设备编号
|
||||||
|
*
|
||||||
|
* @return 如果EEPROM M95设备正常工作,返回TRUE;否则返回FALSE
|
||||||
|
*/
|
||||||
|
BOOL eeprom_m95_status_get(m95_number_e num)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
|
@ -0,0 +1,166 @@
|
||||||
|
/**
|
||||||
|
* @file eeprom_m95.h
|
||||||
|
* @author xxx
|
||||||
|
* @date 2023-08-30 14:05:55
|
||||||
|
* @brief 头文件 eeprom_m95.h
|
||||||
|
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EEPROM_M95_H
|
||||||
|
#define __EEPROM_M95_H
|
||||||
|
#include "main.h"
|
||||||
|
#include "spis.h"
|
||||||
|
|
||||||
|
#define _M95010_ 128
|
||||||
|
#define _M95020_ 256
|
||||||
|
#define _M95040_ 512
|
||||||
|
|
||||||
|
#define _M95080_ 1024
|
||||||
|
#define _M95160_ 2048
|
||||||
|
#define _M95320_ 4096
|
||||||
|
#define _M95640_ 8192
|
||||||
|
|
||||||
|
#define _M95128_ 16384
|
||||||
|
#define _M95256_ 32768
|
||||||
|
|
||||||
|
#define _M95512_ 65536 ///< 65K
|
||||||
|
#define _M95M02_ 262144 ///< 256K
|
||||||
|
|
||||||
|
#define _M95_SIZE _M95512_
|
||||||
|
|
||||||
|
#define M95_CMD_RDSR 0x05 /*!< Read Status Register instruction */
|
||||||
|
#define M95_CMD_WRSR 0x01 /*!< Write Status Register instruction */
|
||||||
|
|
||||||
|
#define M95_CMD_WREN 0x06 /*!< Write enable instruction */
|
||||||
|
#define M95_CMD_WRDI 0x04 /*!< Write disable instruction */
|
||||||
|
|
||||||
|
#define M95_CMD_READ 0x03 /*!< Read from Memory instruction */
|
||||||
|
#define M95_CMD_WRITE 0x02 /*!< Write to Memory instruction */
|
||||||
|
|
||||||
|
///< Instruction available only for the M95_2-D device.
|
||||||
|
#define M95_CMD_RDID 0x83 /*!< Read identification page*/
|
||||||
|
#define M95_CMD_WRID 0x82 /*!< Write identification page*/
|
||||||
|
#define M95_CMD_RDLS 0x83 /*!< Reads the Identification page lock status*/
|
||||||
|
#define M95_CMD_LID 0x82 /*!< Locks the Identification page in read-only mode*/
|
||||||
|
|
||||||
|
#define M95_DUMMY_BYTE 0xA5 ///< 虚拟字节
|
||||||
|
|
||||||
|
#define M95_TEST_PAGE 0 ///< 测试页地址
|
||||||
|
|
||||||
|
///< 定义存储器大小(Bytes)
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
M95_PAGE_SIZE_16 = 16, ///< _M95010_ 、_M95020_ 、_M95040_
|
||||||
|
M95_PAGE_SIZE_32 = 32, ///< _M95080_ 、_M95160_、_M95320_、_M95640_
|
||||||
|
M95_PAGE_SIZE_64 = 64, ///< _M95128_、_M95256_
|
||||||
|
M95_PAGE_SIZE_128 = 128, ///< _M95512_
|
||||||
|
M95_PAGE_SIZE_256 = 256, ///< _M95M02_
|
||||||
|
} m95_page_size_e;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
M95_1,
|
||||||
|
M95_2,
|
||||||
|
M95_MAX,
|
||||||
|
} m95_number_e; ///< 板卡上2块m95芯片定义
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
uint8_t data;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint8_t wip : 1; ///< Write in progress
|
||||||
|
uint8_t wel : 1; ///< Write enable latch
|
||||||
|
uint8_t bp0 : 1; ///< Block protect 0
|
||||||
|
uint8_t bp1 : 1; ///< Block protect 1
|
||||||
|
uint8_t reserve : 3;
|
||||||
|
uint8_t srwd : 1; ///< Status register write protect
|
||||||
|
} bits;
|
||||||
|
} m95_write_protection_u;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
m95_number_e num;
|
||||||
|
m95_write_protection_u write_protection;
|
||||||
|
spi_t *spi;
|
||||||
|
} m95_number_t;
|
||||||
|
|
||||||
|
extern m95_number_t eeprom_m95s[M95_MAX]; ///< m95芯片数组
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes the M95 EEPROM module.
|
||||||
|
*
|
||||||
|
* @param num The M95 EEPROM number.
|
||||||
|
*/
|
||||||
|
extern void eeprom_m95_init(m95_number_e num);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Deinitializes the M95 EEPROM module.
|
||||||
|
*
|
||||||
|
* @param num The M95 EEPROM number.
|
||||||
|
*/
|
||||||
|
extern void eeprom_m95_dinit(m95_number_e num);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables the M95 EEPROM module.
|
||||||
|
*/
|
||||||
|
extern void eeprom_m95_enable(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disables the M95 EEPROM module.
|
||||||
|
*/
|
||||||
|
extern void eeprom_m95_disable(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Closes the write protection of the M95 EEPROM module.
|
||||||
|
*
|
||||||
|
* @param num The M95 EEPROM number.
|
||||||
|
*/
|
||||||
|
extern void eeprom_m95_write_protection_close(m95_number_e num);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief write protection state of the M95 EEPROM module.
|
||||||
|
*
|
||||||
|
* @param num The M95 EEPROM number.
|
||||||
|
*/
|
||||||
|
extern BOOL eeprom_m95_write_protection_state(m95_number_e num);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reads data from the M95 EEPROM module.
|
||||||
|
*
|
||||||
|
* @param num The M95 EEPROM number.
|
||||||
|
* @param read_addr The address to read from.
|
||||||
|
* @param data The buffer to store the read data.
|
||||||
|
* @param length The number of bytes to read.
|
||||||
|
*/
|
||||||
|
extern BOOL eeprom_m95_read(m95_number_e num, uint32_t read_addr, uint8_t *data, uint16_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Writes data to the M95 EEPROM module.
|
||||||
|
*
|
||||||
|
* @param num The M95 EEPROM number.
|
||||||
|
* @param write_addr The address to write to.
|
||||||
|
* @param data The data to write.
|
||||||
|
* @param length The number of bytes to write.
|
||||||
|
*/
|
||||||
|
extern BOOL eeprom_m95_write(m95_number_e num, uint32_t write_addr, uint8_t *data, uint16_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Performs a test on the M95 EEPROM module.
|
||||||
|
*
|
||||||
|
* @param num The M95 EEPROM number.
|
||||||
|
*/
|
||||||
|
extern BOOL eeprom_m95_test(m95_number_e num);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the status of the M95 EEPROM module.
|
||||||
|
*
|
||||||
|
* @param num The M95 EEPROM number.
|
||||||
|
*/
|
||||||
|
extern BOOL eeprom_m95_status_get(m95_number_e num);
|
||||||
|
|
||||||
|
extern BOOL eeprom_m95_1_read(uint32_t addr, uint8_t *buf, uint16_t size);
|
||||||
|
extern BOOL eeprom_m95_1_write(uint32_t addr, uint8_t *buf, uint16_t size);
|
||||||
|
extern BOOL eeprom_m95_2_read(uint32_t addr, uint8_t *buf, uint16_t size);
|
||||||
|
extern BOOL eeprom_m95_2_write(uint32_t addr, uint8_t *buf, uint16_t size);
|
||||||
|
#endif ///< __EEPROM_M95_H
|
|
@ -0,0 +1,107 @@
|
||||||
|
/**
|
||||||
|
* @file ntc_3950.c
|
||||||
|
* @author xxx
|
||||||
|
* @date 2023-08-30 08:58:43
|
||||||
|
* @brief 用于实现NTC的应用功能
|
||||||
|
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ntc_3950.h"
|
||||||
|
#define CPU_VREF 2.5
|
||||||
|
#define NTC_VREF 2.5
|
||||||
|
#define TABLE_SIZE 185
|
||||||
|
#define NTC_SERIES_RESISTOR 200000 ///< 200K
|
||||||
|
#define BASE_TEMP -55
|
||||||
|
|
||||||
|
const uint32_t _table[TABLE_SIZE] = {
|
||||||
|
8989000, 8242680, 7592960, 7021380, 6513750, // -55,-54,-53,-52,-51
|
||||||
|
6059060, 5648680, 5275800, 4935020, 4621990, 4333220, 4065840, 3817520, 3586310, 3370600, // -50,-49,-48,-47,-46,-45,-44,-43,-42,-41
|
||||||
|
3169000, 2980330, 2803600, 2637910, 2482470, 2336580, 2199620, 2071020, 1950230, 1836790, // -40,-39,-38,-37,-36,-35,-34,-33,-32,-31
|
||||||
|
1730230, 1630150, 1536140, 1447840, 1364900, 1287000, 1213820, 1145090, 1080530, 1019890, // -30,-29,-28,-27,-26,-25,-24,-23,-22,-21
|
||||||
|
962912, 909379, 859074, 811797, 767359, 725581, 686296, 649348, 614590, 581883, // -20,-19,-18,-17,-16,-15,-14,-13,-12,-11
|
||||||
|
551100, 522117, 494824, 469113, 444886, 422050, 400518, 380209, 361048, 342963, // -10,-9,-8,-7,-6,-5,-4,-3,-2,-1
|
||||||
|
326560, 309764, 294529, 280131, 266520, 253647, 241470, 229946, 219036, 208706, // 0,1, 2, 3,4,5,6,7,8,9
|
||||||
|
198920, 189647, 180857, 172523, 164618, 157118, 150000, 143243, 136827, 130731, // 10,11 ,12, 13,14,15,16,17,18,19
|
||||||
|
124940, 119435, 114202, 109225, 104491, 100000, 95699, 91617, 87731, 84028, // 20,21, 22, 23,24,25,26,27,28,29
|
||||||
|
80501, 77140, 73936, 70881, 67968, 65188, 62537, 60006, 57590, 55283, // 30,31, 32, 33,34,35,36,37,38,39
|
||||||
|
53080, 50976, 48965, 47044, 45207, 43451, 41771, 40165, 38628, 37157, // 40,41, 42, 43,34,35,36,37,38,39
|
||||||
|
35750, 34402, 33112, 31876, 30692, 29558, 28471, 27429, 26430, 25472, // 50,51, 52, 53,54,55,56,57,58,59
|
||||||
|
24554, 23672, 22827, 22016, 21237, 20489, 19771, 19082, 18420, 17784, // 60,61, 62, 63,64,65,66,67,68,69
|
||||||
|
17172, 16585, 16020, 15477, 14955, 14453, 13970, 13505, 13058, 12628, // 70,71, 72, 73,74,75,76,77,78,79
|
||||||
|
12213, 11815, 11431, 11061, 10705, 10362, 10031, 9712, 9405, 9110, // 80,81, 82, 83,84,85,86,87,88,89
|
||||||
|
8824, 8549, 8284, 8028, 7782, 7544, 7314, 7093, 6879, 6673, // 90,91, 92, 93,94,95,96,97,98,99
|
||||||
|
6474, 6281, 6096, 5916, 5743, 5576, 5415, 5259, 5108, 4963, // 101,102, 103,104,105,106,107,108,109
|
||||||
|
4822, 4687, 4555, 4428, 4306, 4187, 4073, 3962, 3855, 3751, // 111,112, 113,114,115,116,117,118,119
|
||||||
|
3651, 3555, 3461, 3371, 3283, 3199, 3100, 3099, 2899, 2799, // 121,122, 123,124,125,126,127,128,129
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 温度查表
|
||||||
|
* @param {uint32_t} *list
|
||||||
|
* @param {uint32_t} rt
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
static uint8_t ntc_lookup(const uint32_t *list, uint32_t rt)
|
||||||
|
{
|
||||||
|
uint8_t middle = 0;
|
||||||
|
uint8_t indexL = 0;
|
||||||
|
uint8_t indexR = TABLE_SIZE - 1;
|
||||||
|
if (rt >= *(list + 0))
|
||||||
|
return 0;
|
||||||
|
if (rt <= *(list + TABLE_SIZE - 1))
|
||||||
|
return TABLE_SIZE - 1;
|
||||||
|
|
||||||
|
while ((indexR - indexL) > 1)
|
||||||
|
{
|
||||||
|
middle = (indexL + indexR) >> 1;
|
||||||
|
if (rt == *(list + middle))
|
||||||
|
return middle;
|
||||||
|
else if (rt > *(list + middle))
|
||||||
|
indexR = middle;
|
||||||
|
else if (rt < *(list + middle))
|
||||||
|
indexL = middle;
|
||||||
|
}
|
||||||
|
return indexL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 获取温度值,单位为0.1摄氏度
|
||||||
|
* @param {uint16_t} adc采集值
|
||||||
|
* @return {float32_u} 温度值
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
float32_u ntc_get_temp(uint16_t adc)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint8_t index = 0;
|
||||||
|
int16_t data = 0;
|
||||||
|
int16_t t = 0;
|
||||||
|
int16_t result = 0;
|
||||||
|
uint32_t rt = 0;
|
||||||
|
const int16_t base = BASE_TEMP * 10;
|
||||||
|
float32_u res;
|
||||||
|
res.f = BASE_TEMP;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ad = (4095*rt)/(rt+10000)
|
||||||
|
*
|
||||||
|
* rt = (ad*NTC_SERIES_RESISTOR*CPU_VREF)/(NTC_VREF*4095-CPU_VREF*ad)
|
||||||
|
*/
|
||||||
|
rt = (adc * NTC_SERIES_RESISTOR * CPU_VREF) / (NTC_VREF * 4095 - CPU_VREF * adc);
|
||||||
|
index = ntc_lookup(_table, rt);
|
||||||
|
if (rt >= _table[0])
|
||||||
|
return res;
|
||||||
|
if (rt <= *(_table + TABLE_SIZE - 1))
|
||||||
|
{
|
||||||
|
result = (TABLE_SIZE - 1) * 10 + base;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data = _table[index] - _table[index + 1];
|
||||||
|
t = 10 * (_table[index] - rt) / data;
|
||||||
|
result = base + index * 10 + t;
|
||||||
|
}
|
||||||
|
res.f = result / 10.0;
|
||||||
|
return res;
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
/**
|
||||||
|
* @file ntc_3950.h
|
||||||
|
* @author xxx
|
||||||
|
* @date 2023-08-30 14:05:55
|
||||||
|
* @brief 头文件 ntc_3950.h
|
||||||
|
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __NTC_B3950_H__
|
||||||
|
#define __NTC_B3950_H__
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
extern float32_u ntc_get_temp(uint16_t adc); ///< 获取温度值
|
||||||
|
|
||||||
|
#endif ///< __NTC_B3950_H__
|
|
@ -0,0 +1,541 @@
|
||||||
|
/**
|
||||||
|
* @file rtc_rx8010.c
|
||||||
|
* @author xxx
|
||||||
|
* @date 2023-08-30 08:58:43
|
||||||
|
* @brief 用于实现RTC芯片RX8010的应用功能
|
||||||
|
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "rtc_rx8010.h"
|
||||||
|
#include "i2cs.h"
|
||||||
|
#include "delay.h"
|
||||||
|
|
||||||
|
#define RTC_RX8010_SDA_PORT RTC_SDA_GPIO_Port
|
||||||
|
#define RTC_RX8010_SDA_PIN RTC_SDA_Pin
|
||||||
|
#define RTC_RX8010_SCL_PORT RTC_SCL_GPIO_Port
|
||||||
|
#define RTC_RX8010_SCL_PIN RTC_SCL_Pin
|
||||||
|
|
||||||
|
static i2c_t *rtc;
|
||||||
|
|
||||||
|
/* sec, min, hour, week, day, month, year */
|
||||||
|
// static uint8_t calendar[7] = {0, 0, 0, 1, 29, 2, 98};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 从RTC芯片的指定地址读取一个字节数据
|
||||||
|
* @param {uint8_t} *read_buf
|
||||||
|
* @param {uint8_t} addr
|
||||||
|
* @return {*}
|
||||||
|
*/
|
||||||
|
static BOOL rtc_read_byte(uint8_t *read_buf, uint8_t addr)
|
||||||
|
{
|
||||||
|
uint8_t *p = read_buf;
|
||||||
|
|
||||||
|
/* 发送起始信号 */
|
||||||
|
rtc->interface.start(rtc);
|
||||||
|
|
||||||
|
/* 发送从机地址 + 读写方向 */
|
||||||
|
rtc->interface.write_byte(rtc, RTC_WR_ADDR); /* 此处是写方向,因为要发送读地址 */
|
||||||
|
if (rtc->interface.wait_ack(rtc) != TRUE)
|
||||||
|
{
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 发送读地址 */
|
||||||
|
rtc->interface.write_byte(rtc, addr);
|
||||||
|
if (rtc->interface.wait_ack(rtc) != TRUE)
|
||||||
|
{
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 重新发送起始信号。前面的代码的目的向RTC传送地址,下面开始读取数据 */
|
||||||
|
rtc->interface.start(rtc);
|
||||||
|
|
||||||
|
/* 发送从机地址 + 读写方向 */
|
||||||
|
rtc->interface.write_byte(rtc, RTC_RD_ADDR); /* 此处是读方向,因为要开始读数据了 */
|
||||||
|
if (rtc->interface.wait_ack(rtc) != TRUE)
|
||||||
|
{
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
/* 读取数据 */
|
||||||
|
*p = rtc->interface.read_byte(rtc, FALSE); /* 读1个字节 */
|
||||||
|
|
||||||
|
/* 命令执行成功,发送I2C总线停止信号 */
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 从RTC芯片的指定地址读取若干数据
|
||||||
|
* @param {uint8_t} *read_buf
|
||||||
|
* @param {uint8_t} addr
|
||||||
|
* @param {int} size
|
||||||
|
* @return {*}
|
||||||
|
*/
|
||||||
|
static BOOL rtc_read_bytes(uint8_t *read_buf, uint8_t addr, int size)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
/* 发送起始信号 */
|
||||||
|
rtc->interface.start(rtc);
|
||||||
|
|
||||||
|
/* 发送从机地址 + 读写方向 */
|
||||||
|
rtc->interface.write_byte(rtc, RTC_WR_ADDR); /* 此处是写方向,因为要发送读地址 */
|
||||||
|
if (rtc->interface.wait_ack(rtc) != TRUE)
|
||||||
|
{
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 发送读地址 */
|
||||||
|
rtc->interface.write_byte(rtc, addr);
|
||||||
|
if (rtc->interface.wait_ack(rtc) != TRUE)
|
||||||
|
{
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 重新发送起始信号。前面的代码的目的向RTC传送地址,下面开始读取数据 */
|
||||||
|
rtc->interface.start(rtc);
|
||||||
|
|
||||||
|
/* 发送从机地址 + 读写方向 */
|
||||||
|
rtc->interface.write_byte(rtc, RTC_RD_ADDR); /* 此处是读方向,因为要开始读数据了 */
|
||||||
|
if (rtc->interface.wait_ack(rtc) != TRUE)
|
||||||
|
{
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 循环读取数据,RTC芯片地址自动自增 */
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
/* 每读完1个字节后,需要发送Ack, 最后一个字节需要发Nack */
|
||||||
|
if (i != (size - 1))
|
||||||
|
{
|
||||||
|
read_buf[i] = rtc->interface.read_byte(rtc, TRUE); /* 读1个字节 */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
read_buf[i] = rtc->interface.read_byte(rtc, FALSE); /* 读1个字节 */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 命令执行成功,发送I2C总线停止信号 */
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 向RTC芯片的指定地址写入一个数据
|
||||||
|
* @param {uint8_t} data
|
||||||
|
* @param {uint8_t} addr
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
static BOOL rtc_write_byte(uint8_t data, uint8_t addr)
|
||||||
|
{
|
||||||
|
int retry = 0;
|
||||||
|
|
||||||
|
/* 尝试与RTC芯片建立I2C通讯 */
|
||||||
|
for (retry = 0; retry < 100; retry++)
|
||||||
|
{
|
||||||
|
rtc->interface.start(rtc); /* 发送起始信号 */
|
||||||
|
rtc->interface.write_byte(rtc, RTC_WR_ADDR); /* 发送从机地址 + 读写方向 */
|
||||||
|
if (rtc->interface.wait_ack(rtc) == TRUE)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (retry == 100)
|
||||||
|
{
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 发送起始写地址 */
|
||||||
|
rtc->interface.write_byte(rtc, addr);
|
||||||
|
if (rtc->interface.wait_ack(rtc) != TRUE)
|
||||||
|
{
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 写入数据 */
|
||||||
|
rtc->interface.write_byte(rtc, data);
|
||||||
|
if (rtc->interface.wait_ack(rtc) != TRUE)
|
||||||
|
{
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 命令执行成功,发送I2C总线停止信号 */
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 向RTC芯片的指定地址写入若干数据
|
||||||
|
* @param {uint8_t} *write_buf
|
||||||
|
* @param {uint8_t} addr
|
||||||
|
* @param {int} size
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
static BOOL rtc_write_bytes(uint8_t *write_buf, uint8_t addr, int size)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
int retry = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
|
/* 尝试与RTC芯片建立I2C通讯 */
|
||||||
|
for (retry = 0; retry < 100; retry++)
|
||||||
|
{
|
||||||
|
rtc->interface.start(rtc); /* 发送起始信号 */
|
||||||
|
rtc->interface.write_byte(rtc, RTC_WR_ADDR); /* 发送从机地址 + 读写方向 */
|
||||||
|
if (rtc->interface.wait_ack(rtc) == TRUE)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (retry == 100)
|
||||||
|
{
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 发送起始写地址 */
|
||||||
|
rtc->interface.write_byte(rtc, addr);
|
||||||
|
if (rtc->interface.wait_ack(rtc) != TRUE)
|
||||||
|
{
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 循环写入数据,RTC芯片地址自动自增 */
|
||||||
|
rtc->interface.write_byte(rtc, write_buf[i]);
|
||||||
|
if (rtc->interface.wait_ack(rtc) != TRUE)
|
||||||
|
{
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 命令执行成功,发送I2C总线停止信号 */
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 假读RTC芯片,任意读地址,不判断RTC响应
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
static void rtc_dummy_read(void)
|
||||||
|
{
|
||||||
|
rtc->interface.start(rtc);
|
||||||
|
rtc->interface.write_byte(rtc, RTC_WR_ADDR);
|
||||||
|
rtc->interface.write_byte(rtc, 0x20);
|
||||||
|
|
||||||
|
rtc->interface.start(rtc);
|
||||||
|
rtc->interface.write_byte(rtc, RTC_RD_ADDR);
|
||||||
|
rtc->interface.read_byte(rtc, FALSE);
|
||||||
|
|
||||||
|
rtc->interface.stop(rtc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 用于检查VLF,寄存器地址:0x1e bit[1]
|
||||||
|
* @return {uint8_t} 0 = VLF位为0,1 = VLF位为1
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
static uint8_t rtc_check_vlf(void)
|
||||||
|
{
|
||||||
|
uint8_t flag_register = 1;
|
||||||
|
uint8_t vlf = 0;
|
||||||
|
|
||||||
|
rtc_read_byte(&flag_register, RTC_FLAG_ADDR);
|
||||||
|
|
||||||
|
vlf = (flag_register & 0x02);
|
||||||
|
if (vlf == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 等待VLF位清除,寄存器地址:0x1e bit[1]
|
||||||
|
* @return {uint8_t} 0 = 清零成功,1 = 清零失败,2 = 无需清零
|
||||||
|
*/
|
||||||
|
static uint8_t rtc_wait_vlf_clear(void)
|
||||||
|
{
|
||||||
|
uint8_t ret = 1;
|
||||||
|
uint8_t i = 0;
|
||||||
|
uint8_t vlf;
|
||||||
|
|
||||||
|
for (i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
vlf = rtc_check_vlf();
|
||||||
|
|
||||||
|
if (vlf == 0)
|
||||||
|
{
|
||||||
|
ret = ((i > 0) ? 0 : 2);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 清除VLF */
|
||||||
|
rtc_write_byte(0, RTC_FLAG_ADDR);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 复位
|
||||||
|
* @return {BOOL} FALSE = 复位成功,TRUE = 复位失败
|
||||||
|
*/
|
||||||
|
static BOOL rtc_soft_reset(void)
|
||||||
|
{
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
|
ret = rtc_write_byte(0x00, 0x1f);
|
||||||
|
ret = rtc_write_byte(0x80, 0x1f);
|
||||||
|
ret = rtc_write_byte(0xd3, 0x60);
|
||||||
|
ret = rtc_write_byte(0x03, 0x66);
|
||||||
|
ret = rtc_write_byte(0x02, 0x6b);
|
||||||
|
ret = rtc_write_byte(0x01, 0x6b);
|
||||||
|
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
LL_mDelay(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 时钟寄存器初始化函数
|
||||||
|
* @return {BOOL} TRUE = 初始化成功,FALSE = 初始化失败
|
||||||
|
*/
|
||||||
|
static BOOL rtc_clock_reginit(void)
|
||||||
|
{
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
|
/* set reserve register */
|
||||||
|
ret = rtc_write_byte(RTC_REG17_DATA, RTC_REG17_ADDR);
|
||||||
|
ret = rtc_write_byte(RTC_REG30_DATA, RTC_REG30_ADDR);
|
||||||
|
ret = rtc_write_byte(RTC_REG31_DATA, RTC_REG31_ADDR);
|
||||||
|
ret = rtc_write_byte(RTC_IRQ_DATA, RTC_IRQ_ADDR);
|
||||||
|
/* write 0x04 to reg_0x1d */
|
||||||
|
ret = rtc_write_byte(0x04, 0x1d);
|
||||||
|
/* write 0x00 to reg_0x1e */
|
||||||
|
ret = rtc_write_byte(0x00, 0x1e);
|
||||||
|
/* stop clock */
|
||||||
|
ret = rtc_write_byte(0x40, RTC_CONTROL_ADDR);
|
||||||
|
/* set the present time */
|
||||||
|
// ret = rtc_write_bytes(calendar, RTC_CLOCK_ADDR, sizeof(calendar));
|
||||||
|
/* start clock */
|
||||||
|
ret = rtc_write_byte(0x00, RTC_CONTROL_ADDR);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief RTC芯片初始化
|
||||||
|
* @return {BOOL} TRUE = 成功,FALSE = 失败
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
BOOL rtc_init(void)
|
||||||
|
{
|
||||||
|
i2c_gpio_group_t gpios;
|
||||||
|
int ret = 1;
|
||||||
|
gpios.scl = gpio_create(RTC_RX8010_SCL_PORT, RTC_RX8010_SCL_PIN);
|
||||||
|
gpios.sda = gpio_create(RTC_RX8010_SDA_PORT, RTC_RX8010_SDA_PIN);
|
||||||
|
|
||||||
|
rtc = i2c_create(gpios, 10);
|
||||||
|
|
||||||
|
rtc_dummy_read();
|
||||||
|
/* wait for VLF bit clear */
|
||||||
|
ret = rtc_wait_vlf_clear();
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
/* software reset */
|
||||||
|
ret = rtc_soft_reset();
|
||||||
|
if (ret == FALSE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ret == 1)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* register initialize */
|
||||||
|
|
||||||
|
return rtc_clock_reginit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief RTC芯片反初始化
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
BOOL rtc_dinit(void)
|
||||||
|
{
|
||||||
|
GPIO_SET_ANALOG(RTC_RX8010_SCL_PORT, RTC_RX8010_SCL_PIN);
|
||||||
|
GPIO_SET_ANALOG(RTC_RX8010_SDA_PORT, RTC_RX8010_SDA_PIN);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 从RTC芯片读取时间
|
||||||
|
* @param {uint8_t} *read_buf - 接收缓存指针,用于接收读取到的数据
|
||||||
|
* @return {BOOL} TRUE = 成功,FALSE = 失败
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
BOOL rtc_get_clock_time(uint8_t *read_buf)
|
||||||
|
{
|
||||||
|
return rtc_read_bytes(read_buf, RTC_CLOCK_ADDR, 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 向RTC芯片写入时间
|
||||||
|
* @param {rtc_date} *data - 发送缓存指针,用于存储要发送的数据
|
||||||
|
* @return {BOOL} TRUE = 成功,FALSE = 失败
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
BOOL rtc_set_clock_time(rtc_date *data)
|
||||||
|
{
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
uint8_t tmp[7];
|
||||||
|
tmp[0] = data->second;
|
||||||
|
tmp[1] = data->minute;
|
||||||
|
tmp[2] = data->hour;
|
||||||
|
tmp[3] = data->weekday;
|
||||||
|
tmp[4] = data->day;
|
||||||
|
tmp[5] = data->month;
|
||||||
|
tmp[6] = data->year;
|
||||||
|
|
||||||
|
tmp[3] = (rtc_week_e)tmp[3]; // 改成星期几
|
||||||
|
|
||||||
|
/* stop clock */
|
||||||
|
ret = rtc_write_byte(0x40, RTC_CONTROL_ADDR);
|
||||||
|
/* set the present time */
|
||||||
|
ret = rtc_write_bytes(tmp, RTC_CLOCK_ADDR, sizeof(tmp));
|
||||||
|
/* start clock */
|
||||||
|
ret = rtc_write_byte(0x00, RTC_CONTROL_ADDR);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取实时时钟(RTC)的时间戳
|
||||||
|
*
|
||||||
|
* 该函数从RTC设备中获取当前的日期和时间,并将其转换为自1970年1月1日以来的秒数(时间戳)。
|
||||||
|
* 如果无法从RTC设备中获取时间,则返回0。
|
||||||
|
*
|
||||||
|
* @return 返回从1970年1月1日以来的秒数(时间戳),如果无法获取时间则返回0。
|
||||||
|
*/
|
||||||
|
uint32_t rtc_timestamp(void)
|
||||||
|
{
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
uint8_t tmp[7];
|
||||||
|
rtc_date_t date;
|
||||||
|
rtc_time_t time;
|
||||||
|
ret = rtc_get_clock_time(tmp);
|
||||||
|
if (ret == FALSE)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
date.year = hex_format_dec(tmp[6]);
|
||||||
|
date.month = hex_format_dec(tmp[5]);
|
||||||
|
date.day = hex_format_dec(tmp[4]);
|
||||||
|
time.hour = hex_format_dec(tmp[2]);
|
||||||
|
time.minute = hex_format_dec(tmp[1]);
|
||||||
|
time.second = hex_format_dec(tmp[0]);
|
||||||
|
return time2stamp(&date, &time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 将星期转为星期码
|
||||||
|
* @param {uint8_t} *weekday 星期几
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
void rtc_weekday_convert(uint8_t *weekday)
|
||||||
|
{
|
||||||
|
switch (*weekday)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
*weekday = MON;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
*weekday = TUE;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
*weekday = WED;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
*weekday = THUR;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
*weekday = FRI;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
*weekday = SAT;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
*weekday = SUN;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
*weekday = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 将星期码转为星期
|
||||||
|
* @param {uint8_t} *weekday 星期码
|
||||||
|
* @return {*}
|
||||||
|
* @note
|
||||||
|
*/
|
||||||
|
void rtc_weekday_rconvert(uint8_t *weekday)
|
||||||
|
{
|
||||||
|
switch (*weekday)
|
||||||
|
{
|
||||||
|
case MON:
|
||||||
|
*weekday = 1;
|
||||||
|
break;
|
||||||
|
case TUE:
|
||||||
|
*weekday = 2;
|
||||||
|
break;
|
||||||
|
case WED:
|
||||||
|
*weekday = 3;
|
||||||
|
break;
|
||||||
|
case THUR:
|
||||||
|
*weekday = 4;
|
||||||
|
break;
|
||||||
|
case FRI:
|
||||||
|
*weekday = 5;
|
||||||
|
break;
|
||||||
|
case SAT:
|
||||||
|
*weekday = 6;
|
||||||
|
break;
|
||||||
|
case SUN:
|
||||||
|
*weekday = 7;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
*weekday = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
/**
|
||||||
|
* @file rtc_rx8010.h
|
||||||
|
* @author xxx
|
||||||
|
* @date 2023-08-30 14:05:55
|
||||||
|
* @brief 头文件 rtc_rx8010.h
|
||||||
|
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __RTC_RX8010_H__
|
||||||
|
#define __RTC_RX8010_H__
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#define RTC_DEVICE_ADDR 0x32
|
||||||
|
|
||||||
|
#define RTC_WR_ADDR ((RTC_DEVICE_ADDR << 1) | 0)
|
||||||
|
#define RTC_RD_ADDR ((RTC_DEVICE_ADDR << 1) | 1)
|
||||||
|
|
||||||
|
#define RTC_FLAG_ADDR 0x1e
|
||||||
|
#define RTC_CLOCK_ADDR 0x10
|
||||||
|
#define RTC_CONTROL_ADDR 0x1f
|
||||||
|
|
||||||
|
#define RTC_REG17_ADDR 0x17
|
||||||
|
#define RTC_REG17_DATA 0xd8
|
||||||
|
|
||||||
|
#define RTC_REG30_ADDR 0x30
|
||||||
|
#define RTC_REG30_DATA 0x00
|
||||||
|
|
||||||
|
#define RTC_REG31_ADDR 0x31
|
||||||
|
#define RTC_REG31_DATA 0x08
|
||||||
|
|
||||||
|
#define RTC_IRQ_ADDR 0x32
|
||||||
|
#define RTC_IRQ_DATA 0x00
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SUN = BIT0,
|
||||||
|
MON = BIT1,
|
||||||
|
TUE = BIT2,
|
||||||
|
WED = BIT3,
|
||||||
|
THUR = BIT4,
|
||||||
|
FRI = BIT5,
|
||||||
|
SAT = BIT6
|
||||||
|
} rtc_week_e; ///< 星期码
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t year; ///< 7 bit - 1 63
|
||||||
|
uint8_t month; ///< 4 bit
|
||||||
|
uint8_t day; ///< 5 bit
|
||||||
|
uint8_t weekday; ///< rtc_week_e
|
||||||
|
uint8_t hour; ///< 5 bit
|
||||||
|
uint8_t minute; ///< 6 bit
|
||||||
|
uint8_t second; ///< 6 bit
|
||||||
|
} rtc_date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes the RTC module.
|
||||||
|
* @return TRUE if the initialization is successful, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
extern BOOL rtc_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Deinitializes the RTC module.
|
||||||
|
* @return TRUE if the deinitialization is successful, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
extern BOOL rtc_dinit(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Retrieves the current clock time from the RTC module.
|
||||||
|
* @param read_buf Pointer to the buffer to store the clock time.
|
||||||
|
* @return TRUE if the clock time is successfully retrieved, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
extern BOOL rtc_get_clock_time(uint8_t *read_buf);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the clock time in the RTC module.
|
||||||
|
* @param data Pointer to the RTC date structure containing the new clock time.
|
||||||
|
* @return TRUE if the clock time is successfully set, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
extern BOOL rtc_set_clock_time(rtc_date *data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Retrieves the current alarm time from the RTC module.
|
||||||
|
* @param read_buf Pointer to the buffer to store the alarm time.
|
||||||
|
* @return TRUE if the alarm time is successfully retrieved, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
extern uint32_t rtc_timestamp(void);
|
||||||
|
/**
|
||||||
|
* @brief Converts the weekday value to a human-readable format.
|
||||||
|
* @param weekday Pointer to the weekday value to be converted.
|
||||||
|
*/
|
||||||
|
extern void rtc_weekday_convert(uint8_t *weekday);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the weekday value from a human-readable format to the RTC format.
|
||||||
|
* @param weekday Pointer to the weekday value to be converted.
|
||||||
|
*/
|
||||||
|
extern void rtc_weekday_rconvert(uint8_t *weekday);
|
||||||
|
#endif ///< !__RTC_RX8010_H__
|
|
@ -0,0 +1,160 @@
|
||||||
|
#include "sht40.h"
|
||||||
|
#include "i2cs.h"
|
||||||
|
#define SHT40_SDA_PORT I2C1_SDA_GPIO_Port
|
||||||
|
#define SHT40_SDA_PIN I2C1_SDA_Pin
|
||||||
|
#define SHT40_SCL_PORT I2C1_SCL_GPIO_Port
|
||||||
|
#define SHT40_SCL_PIN I2C1_SCL_Pin
|
||||||
|
|
||||||
|
#define SHT40_I2C_ADDRESS 0x44
|
||||||
|
#define SHT40_MEASURE_CMD 0xFD // 2*8-bit T-data:8-bit CRC:2*8-bit RH-data: 8-bit CRC
|
||||||
|
|
||||||
|
static i2c_t *sht40_i2c;
|
||||||
|
static uint8_t crc8(uint8_t *data, uint8_t len);
|
||||||
|
|
||||||
|
void sht40_test(void)
|
||||||
|
{
|
||||||
|
float32 temperature = 0;
|
||||||
|
float32 humidity = 0;
|
||||||
|
sht40_read(&temperature, &humidity);
|
||||||
|
|
||||||
|
__NOP();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief 初始化 SHT40 传感器
|
||||||
|
*
|
||||||
|
* 该函数用于初始化 SHT40 传感器,包括创建 I2C 通讯所需的 GPIO 引脚和 I2C 通讯对象。
|
||||||
|
*
|
||||||
|
* 初始化完成后,sht40_i2c 变量将用于后续的 SHT40 传感器通信。
|
||||||
|
*/
|
||||||
|
void sht40_init(void)
|
||||||
|
{
|
||||||
|
i2c_gpio_group_t gpios;
|
||||||
|
gpios.scl = gpio_create(SHT40_SCL_PORT, SHT40_SCL_PIN);
|
||||||
|
gpios.sda = gpio_create(SHT40_SDA_PORT, SHT40_SDA_PIN);
|
||||||
|
|
||||||
|
sht40_i2c = i2c_create(gpios, 10);
|
||||||
|
DBG_ASSERT(sht40_i2c != NULL __DBG_LINE);
|
||||||
|
|
||||||
|
// sht40_test(); // 测试 SHT40
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 初始化 SHT40 传感器
|
||||||
|
*
|
||||||
|
* 此函数用于初始化 SHT40 温湿度传感器,以便进行后续的温度和湿度测量。
|
||||||
|
*
|
||||||
|
* 注意:该函数没有返回值,也不接受任何参数。
|
||||||
|
*/
|
||||||
|
void sht40_dinit(void)
|
||||||
|
{
|
||||||
|
GPIO_SET_ANALOG(SHT40_SDA_PORT, SHT40_SDA_PIN);
|
||||||
|
GPIO_SET_ANALOG(SHT40_SCL_PORT, SHT40_SCL_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 读取温湿度传感器数据
|
||||||
|
*
|
||||||
|
* 从温湿度传感器读取温度和湿度数据,并将读取到的数据存储在传入的浮点数指针指向的位置。
|
||||||
|
*
|
||||||
|
* @param temperature 用于存储读取到的温度值的浮点数指针
|
||||||
|
* @param humidity 用于存储读取到的湿度值的浮点数指针
|
||||||
|
*/
|
||||||
|
BOOL sht40_read(float32 *temperature, float32 *humidity)
|
||||||
|
{
|
||||||
|
uint8_t data[6];
|
||||||
|
|
||||||
|
osel_memset(data, 0, ARRAY_LEN(data));
|
||||||
|
// 发送开始信号
|
||||||
|
sht40_i2c->interface.start(sht40_i2c);
|
||||||
|
// 发送写入地址命令
|
||||||
|
sht40_i2c->interface.write_byte(sht40_i2c, SHT40_I2C_ADDRESS << 1);
|
||||||
|
// 等待写入地址命令响应
|
||||||
|
if (sht40_i2c->interface.wait_ack(sht40_i2c) == FALSE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
// 发送测量命令
|
||||||
|
sht40_i2c->interface.write_byte(sht40_i2c, SHT40_MEASURE_CMD);
|
||||||
|
// 等待测量命令响应
|
||||||
|
if (sht40_i2c->interface.wait_ack(sht40_i2c) == FALSE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
// 停止I2C总线
|
||||||
|
sht40_i2c->interface.stop(sht40_i2c);
|
||||||
|
|
||||||
|
LL_mDelay(10); // 根据 SHT40 数据手册,等待至少 10ms
|
||||||
|
|
||||||
|
// 发送开始信号
|
||||||
|
sht40_i2c->interface.start(sht40_i2c);
|
||||||
|
// 发送写入地址命令
|
||||||
|
sht40_i2c->interface.write_byte(sht40_i2c, (SHT40_I2C_ADDRESS << 1) | 1);
|
||||||
|
// 等待写入地址命令响应
|
||||||
|
if (sht40_i2c->interface.wait_ack(sht40_i2c) == FALSE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < ARRAY_LEN(data); i++)
|
||||||
|
{
|
||||||
|
if (i == 5)
|
||||||
|
{
|
||||||
|
data[i] = sht40_i2c->interface.read_byte(sht40_i2c, FALSE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data[i] = sht40_i2c->interface.read_byte(sht40_i2c, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 停止I2C总线
|
||||||
|
sht40_i2c->interface.stop(sht40_i2c);
|
||||||
|
|
||||||
|
*temperature = 0;
|
||||||
|
*humidity = 0;
|
||||||
|
if (crc8(&data[0], 2) != data[2] || crc8(&data[3], 2) != data[5])
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*temperature = (float32)((uint16_t)data[0] << 8 | data[1]) * 175 / 65535 - 45;
|
||||||
|
*humidity = (float32)((uint16_t)data[3] << 8 | data[4]) * 125 / 65535 - 6;
|
||||||
|
if (*humidity > 100)
|
||||||
|
{
|
||||||
|
*humidity = 100;
|
||||||
|
}
|
||||||
|
if (*humidity < 0)
|
||||||
|
{
|
||||||
|
*humidity = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief crc8校验函数,多项式为 x^8 + x^5 + x^4 + 1
|
||||||
|
* @param data 要校验的数据
|
||||||
|
* @param len 要校验的数据的字节数
|
||||||
|
* @retval 校验结果
|
||||||
|
* @note 该校验适合SHT3温湿度传感器的数据校验
|
||||||
|
*/
|
||||||
|
static uint8_t crc8(uint8_t *data, uint8_t len)
|
||||||
|
{
|
||||||
|
const uint8_t polynomial = 0x31;
|
||||||
|
uint8_t crc = 0xFF;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < len; ++i)
|
||||||
|
{
|
||||||
|
crc ^= *data++;
|
||||||
|
|
||||||
|
for (j = 0; j < 8; ++j)
|
||||||
|
{
|
||||||
|
crc = (crc & 0x80) ? (crc << 1) ^ polynomial : (crc << 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return crc;
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
#ifndef __SHT40_H
|
||||||
|
#define __SHT40_H
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
void sht40_init(void); ///< 初始化 SHT40 传感器
|
||||||
|
void sht40_dinit(void); ///< 反初始化 SHT40 传感器
|
||||||
|
BOOL sht40_read(float32 *temperature, float32 *humidity); ///< 读取温湿度传感器数据
|
||||||
|
|
||||||
|
#endif ///< !__SHT40_H
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
// mem2内存参数设定.mem2的内存池处于外部SRAM里面
|
// mem2内存参数设定.mem2的内存池处于外部SRAM里面
|
||||||
#define MEM2_BLOCK_SIZE 8 // 一个内存块大小为32字节
|
#define MEM2_BLOCK_SIZE 8 // 一个内存块大小为32字节
|
||||||
#define MEM2_MAX_SIZE 0 * 1024 // 因为精英版没有外扩内存,故这里设置一个最小值
|
#define MEM2_MAX_SIZE 4 * 1024 // 因为精英版没有外扩内存,故这里设置一个最小值
|
||||||
#define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE / MEM2_BLOCK_SIZE // 内存表大小
|
#define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE / MEM2_BLOCK_SIZE // 内存表大小
|
||||||
|
|
||||||
// 内存管理控制器结构体
|
// 内存管理控制器结构体
|
||||||
|
|
|
@ -33,9 +33,7 @@ BOOL DBG_ASSERT(uint8_t cond _DBG_LINE_)
|
||||||
if ((cond) == FALSE)
|
if ((cond) == FALSE)
|
||||||
{
|
{
|
||||||
// dbg_assert_line = line;
|
// dbg_assert_line = line;
|
||||||
#if DEBUG_ENABLE == FALSE
|
|
||||||
sys_soft_reset();
|
|
||||||
#endif
|
|
||||||
GPIO_TOGGLE(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
|
GPIO_TOGGLE(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -47,8 +47,8 @@ sizeof(B) = 8(内存空间大小8个字节)
|
||||||
// 内存池(32字节对齐)
|
// 内存池(32字节对齐)
|
||||||
// 可控制的内存大小
|
// 可控制的内存大小
|
||||||
__attribute__((aligned(32))) uint8_t mem1base[MEM1_MAX_SIZE]; // 内部SRAM内存池
|
__attribute__((aligned(32))) uint8_t mem1base[MEM1_MAX_SIZE]; // 内部SRAM内存池
|
||||||
__attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE];
|
// __attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE];
|
||||||
// __attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); // 外部SRAM内存池
|
__attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((at(0x2001C000))); // 外部SRAM内存池
|
||||||
// 内存管理表
|
// 内存管理表
|
||||||
// 可控制的内存控制块个数(每个内存块大小为32字节)
|
// 可控制的内存控制块个数(每个内存块大小为32字节)
|
||||||
uint16_t mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; // 内部SRAM内存池MAP
|
uint16_t mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; // 内部SRAM内存池MAP
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @file adcs.c
|
* @file adcs.c
|
||||||
* @author xxx
|
* @author xxx
|
||||||
* @date 2023-09-04 15:59:16
|
* @date 2023-09-04 15:59:16
|
||||||
* @brief LL库ADC驱动
|
* @brief LL库ADC驱动 STM32F407
|
||||||
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
|
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ static uint8_t adc_get_channels_count(uint32_t channnels); // 通过用户配置
|
||||||
* @return {*}
|
* @return {*}
|
||||||
* @note TCONV(转换时间) = (采样时间 + 12.5 个周期)/(主频/ADC分频系数)
|
* @note TCONV(转换时间) = (采样时间 + 12.5 个周期)/(主频/ADC分频系数)
|
||||||
*/
|
*/
|
||||||
void adc_init(adcs_e num, ADC_TypeDef *adc, DMA_TypeDef *dma, uint32_t dma_channel, uint16_t adc_cct, uint32_t channels)
|
void adc_init(adcs_e num, ADC_TypeDef *adc, DMA_TypeDef *dma, uint32_t dma_stream, uint32_t dma_channel, uint16_t adc_cct, uint32_t channels)
|
||||||
{
|
{
|
||||||
DBG_ASSERT(num < ADCS_MAX __DBG_LINE);
|
DBG_ASSERT(num < ADCS_MAX __DBG_LINE);
|
||||||
DBG_ASSERT(adc != NULL __DBG_LINE);
|
DBG_ASSERT(adc != NULL __DBG_LINE);
|
||||||
|
@ -34,6 +34,7 @@ void adc_init(adcs_e num, ADC_TypeDef *adc, DMA_TypeDef *dma, uint32_t dma_chann
|
||||||
osel_memset((uint8_t *)p, 0, sizeof(adcs_t));
|
osel_memset((uint8_t *)p, 0, sizeof(adcs_t));
|
||||||
p->adc = adc;
|
p->adc = adc;
|
||||||
p->dma = dma;
|
p->dma = dma;
|
||||||
|
p->dma_stream = dma_stream;
|
||||||
p->dma_channel = dma_channel;
|
p->dma_channel = dma_channel;
|
||||||
p->channels.data = channels;
|
p->channels.data = channels;
|
||||||
p->adc_cct = adc_cct;
|
p->adc_cct = adc_cct;
|
||||||
|
@ -49,36 +50,40 @@ void adc_init(adcs_e num, ADC_TypeDef *adc, DMA_TypeDef *dma, uint32_t dma_chann
|
||||||
DBG_ASSERT(p->adc_value != NULL __DBG_LINE);
|
DBG_ASSERT(p->adc_value != NULL __DBG_LINE);
|
||||||
osel_memset((uint8_t *)p->adc_value, 0, sizeof(uint16_t) * p->adc_sum);
|
osel_memset((uint8_t *)p->adc_value, 0, sizeof(uint16_t) * p->adc_sum);
|
||||||
|
|
||||||
uint32_t backup_setting_adc_dma_transfer = 0U;
|
LL_DMA_SetChannelSelection(p->dma, p->dma_stream, p->dma_channel);
|
||||||
backup_setting_adc_dma_transfer = LL_ADC_REG_GetDMATransfer(p->adc);
|
LL_DMA_ConfigTransfer(p->dma, p->dma_stream,
|
||||||
LL_ADC_REG_SetDMATransfer(p->adc, LL_ADC_REG_DMA_TRANSFER_NONE);
|
LL_DMA_DIRECTION_PERIPH_TO_MEMORY |
|
||||||
|
LL_DMA_MODE_CIRCULAR |
|
||||||
|
LL_DMA_PERIPH_NOINCREMENT |
|
||||||
|
LL_DMA_MEMORY_INCREMENT |
|
||||||
|
LL_DMA_PDATAALIGN_HALFWORD |
|
||||||
|
LL_DMA_MDATAALIGN_HALFWORD |
|
||||||
|
LL_DMA_PRIORITY_HIGH);
|
||||||
|
LL_DMA_ConfigAddresses(p->dma, p->dma_stream,
|
||||||
|
LL_ADC_DMA_GetRegAddr(p->adc, LL_ADC_DMA_REG_REGULAR_DATA),
|
||||||
|
(uint32_t)p->adc_value,
|
||||||
|
LL_DMA_GetDataTransferDirection(p->dma, p->dma_stream));
|
||||||
|
|
||||||
// ADC开始校准
|
LL_DMA_SetDataLength(p->dma, p->dma_stream, p->adc_sum);
|
||||||
LL_ADC_StartCalibration(p->adc, LL_ADC_SINGLE_ENDED);
|
LL_DMA_EnableStream(p->dma, p->dma_stream);
|
||||||
// 等待校准完成
|
|
||||||
while (LL_ADC_IsCalibrationOnGoing(p->adc))
|
LL_ADC_REG_SetContinuousMode(p->adc, LL_ADC_REG_CONV_CONTINUOUS);
|
||||||
;
|
LL_ADC_REG_SetDMATransfer(p->adc, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);
|
||||||
LL_ADC_REG_SetDMATransfer(p->adc, backup_setting_adc_dma_transfer);
|
|
||||||
LL_mDelay(10);
|
|
||||||
LL_ADC_EnableIT_OVR(p->adc);
|
|
||||||
LL_ADC_Enable(p->adc);
|
|
||||||
LL_mDelay(10);
|
|
||||||
|
|
||||||
if (BIT_IS_SET(channels, INVREF))
|
if (BIT_IS_SET(channels, INVREF))
|
||||||
{
|
{
|
||||||
// 使能VREFINT
|
// 使能VREFINT
|
||||||
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(p->adc), LL_ADC_PATH_INTERNAL_VREFINT);
|
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(p->adc), LL_ADC_PATH_INTERNAL_VREFINT);
|
||||||
}
|
}
|
||||||
|
if (BIT_IS_SET(channels, INTEMP))
|
||||||
LL_DMA_SetDataLength(p->dma, p->dma_channel, p->adc_sum);
|
|
||||||
LL_DMA_SetPeriphAddress(p->dma, p->dma_channel, LL_ADC_DMA_GetRegAddr(p->adc, LL_ADC_DMA_REG_REGULAR_DATA));
|
|
||||||
LL_DMA_SetMemoryAddress(p->dma, p->dma_channel, (uint32_t)p->adc_value);
|
|
||||||
LL_DMA_EnableChannel(p->dma, p->dma_channel);
|
|
||||||
|
|
||||||
if (backup_setting_adc_dma_transfer == LL_ADC_REG_DMA_TRANSFER_UNLIMITED)
|
|
||||||
{
|
{
|
||||||
LL_ADC_REG_StartConversion(p->adc); // 开始转换
|
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(p->adc), LL_ADC_PATH_INTERNAL_TEMPSENSOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LL_mDelay(10);
|
||||||
|
// 启动 ADC 转换
|
||||||
|
LL_ADC_Enable(p->adc);
|
||||||
|
LL_ADC_REG_StartConversionSWStart(p->adc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -91,18 +96,7 @@ void adc_init(adcs_e num, ADC_TypeDef *adc, DMA_TypeDef *dma, uint32_t dma_chann
|
||||||
void start_sample(adcs_e num)
|
void start_sample(adcs_e num)
|
||||||
{
|
{
|
||||||
DBG_ASSERT(num < ADCS_MAX __DBG_LINE);
|
DBG_ASSERT(num < ADCS_MAX __DBG_LINE);
|
||||||
adcs_t *p = &adcs[num];
|
// adcs_t *p = &adcs[num];
|
||||||
LL_DMA_SetDataLength(p->dma, p->dma_channel, p->adc_sum);
|
|
||||||
LL_DMA_SetPeriphAddress(p->dma, p->dma_channel, LL_ADC_DMA_GetRegAddr(p->adc, LL_ADC_DMA_REG_REGULAR_DATA));
|
|
||||||
LL_DMA_SetMemoryAddress(p->dma, p->dma_channel, (uint32_t)p->adc_value);
|
|
||||||
LL_DMA_EnableChannel(p->dma, p->dma_channel);
|
|
||||||
|
|
||||||
LL_ADC_ClearFlag_OVR(p->adc);
|
|
||||||
LL_ADC_ClearFlag_EOC(p->adc);
|
|
||||||
LL_ADC_REG_StartConversion(p->adc); // 开始转换
|
|
||||||
|
|
||||||
// ADC开始校准
|
|
||||||
LL_ADC_StartCalibration(p->adc, LL_ADC_SINGLE_ENDED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -115,14 +109,7 @@ void start_sample(adcs_e num)
|
||||||
void stop_sample(adcs_e num)
|
void stop_sample(adcs_e num)
|
||||||
{
|
{
|
||||||
DBG_ASSERT(num < ADCS_MAX __DBG_LINE);
|
DBG_ASSERT(num < ADCS_MAX __DBG_LINE);
|
||||||
adcs_t *p = &adcs[num];
|
// adcs_t *p = &adcs[num];
|
||||||
|
|
||||||
LL_ADC_REG_StopConversion(p->adc);
|
|
||||||
while (LL_ADC_REG_IsConversionOngoing(p->adc) != 0)
|
|
||||||
;
|
|
||||||
LL_DMA_DisableChannel(p->dma, p->dma_channel);
|
|
||||||
DMA_CLEAR_FLAG_TC_CHANNEL(p->dma, p->dma_channel);
|
|
||||||
DMA_CLEAR_FLAG_TE_CHANNEL(p->dma, p->dma_channel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -147,8 +134,6 @@ void adc_dinit(adcs_e num)
|
||||||
{
|
{
|
||||||
DBG_ASSERT(num < ADCS_MAX __DBG_LINE);
|
DBG_ASSERT(num < ADCS_MAX __DBG_LINE);
|
||||||
adcs_t *p = &adcs[num];
|
adcs_t *p = &adcs[num];
|
||||||
LL_ADC_REG_StopConversion(p->adc);
|
|
||||||
LL_DMA_DisableChannel(p->dma, p->dma_channel);
|
|
||||||
LL_ADC_Disable(p->adc);
|
LL_ADC_Disable(p->adc);
|
||||||
if (p->adc_value != NULL)
|
if (p->adc_value != NULL)
|
||||||
{
|
{
|
||||||
|
@ -190,7 +175,7 @@ uint16_t adc_result_median_average(adcs_e num, uint8_t chan)
|
||||||
|
|
||||||
if (p->adc_cct <= 2)
|
if (p->adc_cct <= 2)
|
||||||
return 0; // 如果adc_cct小于等于2,直接返回0
|
return 0; // 如果adc_cct小于等于2,直接返回0
|
||||||
p->median_average_ticks.uticks = sys_get_tick();
|
|
||||||
uint16_t adc_temp[p->adc_cct];
|
uint16_t adc_temp[p->adc_cct];
|
||||||
uint32_t adc_sum = 0;
|
uint32_t adc_sum = 0;
|
||||||
uint16_t count = p->adc_cct >> 2; // 使用位移操作计算n的值
|
uint16_t count = p->adc_cct >> 2; // 使用位移操作计算n的值
|
||||||
|
@ -212,13 +197,6 @@ uint16_t adc_result_median_average(adcs_e num, uint8_t chan)
|
||||||
|
|
||||||
// 计算平均值,确保不会除以0
|
// 计算平均值,确保不会除以0
|
||||||
uint16_t res = adc_sum / (p->adc_cct - (count << 1));
|
uint16_t res = adc_sum / (p->adc_cct - (count << 1));
|
||||||
|
|
||||||
p->median_average_ticks.ticks_current = sys_get_tick() - p->median_average_ticks.uticks;
|
|
||||||
if (p->median_average_ticks.ticks_current > p->median_average_ticks.ticks_max)
|
|
||||||
{
|
|
||||||
p->median_average_ticks.ticks_max = p->median_average_ticks.ticks_current;
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,8 +214,6 @@ uint16_t adc_result_median(adcs_e num, uint8_t chan)
|
||||||
adcs_t *p = &adcs[num];
|
adcs_t *p = &adcs[num];
|
||||||
DBG_ASSERT(p != NULL __DBG_LINE);
|
DBG_ASSERT(p != NULL __DBG_LINE);
|
||||||
|
|
||||||
p->median_ticks.uticks = sys_get_tick();
|
|
||||||
|
|
||||||
uint16_t adc_temp[p->adc_cct];
|
uint16_t adc_temp[p->adc_cct];
|
||||||
// 减少重复计算,计算基础偏移量
|
// 减少重复计算,计算基础偏移量
|
||||||
uint16_t *adc_values = (uint16_t *)p->adc_value + chan;
|
uint16_t *adc_values = (uint16_t *)p->adc_value + chan;
|
||||||
|
@ -247,12 +223,6 @@ uint16_t adc_result_median(adcs_e num, uint8_t chan)
|
||||||
}
|
}
|
||||||
insertion_sort(adc_temp, p->adc_cct);
|
insertion_sort(adc_temp, p->adc_cct);
|
||||||
res = adc_temp[p->adc_cct >> 1];
|
res = adc_temp[p->adc_cct >> 1];
|
||||||
|
|
||||||
p->median_ticks.ticks_current = sys_get_tick() - p->median_ticks.uticks;
|
|
||||||
if (p->median_ticks.ticks_current > p->median_ticks.ticks_max)
|
|
||||||
{
|
|
||||||
p->median_ticks.ticks_max = p->median_ticks.ticks_current;
|
|
||||||
}
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,8 +241,6 @@ uint16_t adc_result_average(adcs_e num, uint8_t chan)
|
||||||
adcs_t *p = &adcs[num];
|
adcs_t *p = &adcs[num];
|
||||||
DBG_ASSERT(p != NULL __DBG_LINE);
|
DBG_ASSERT(p != NULL __DBG_LINE);
|
||||||
|
|
||||||
p->average_ticks.uticks = sys_get_tick();
|
|
||||||
|
|
||||||
// 减少重复计算,计算基础偏移量
|
// 减少重复计算,计算基础偏移量
|
||||||
uint16_t *adc_values = (uint16_t *)p->adc_value + chan;
|
uint16_t *adc_values = (uint16_t *)p->adc_value + chan;
|
||||||
for (uint16_t i = 0; i < p->adc_cct; ++i, adc_values += p->adc_chans_count)
|
for (uint16_t i = 0; i < p->adc_cct; ++i, adc_values += p->adc_chans_count)
|
||||||
|
@ -281,12 +249,6 @@ uint16_t adc_result_average(adcs_e num, uint8_t chan)
|
||||||
}
|
}
|
||||||
res = adc_sum / p->adc_cct;
|
res = adc_sum / p->adc_cct;
|
||||||
|
|
||||||
p->average_ticks.ticks_current = sys_get_tick() - p->average_ticks.uticks;
|
|
||||||
if (p->average_ticks.ticks_current > p->average_ticks.ticks_max)
|
|
||||||
{
|
|
||||||
p->average_ticks.ticks_max = p->average_ticks.ticks_current;
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,10 +298,6 @@ void adc_dma_callback(adcs_e num)
|
||||||
if (LL_DMA_IsActiveFlag_TC1(p->dma) != 0)
|
if (LL_DMA_IsActiveFlag_TC1(p->dma) != 0)
|
||||||
{
|
{
|
||||||
LL_DMA_ClearFlag_TC1(p->dma);
|
LL_DMA_ClearFlag_TC1(p->dma);
|
||||||
// 停止ADC转换
|
|
||||||
LL_ADC_REG_StopConversion(p->adc);
|
|
||||||
// 关闭ADC,可以不关闭但是校准无法清除
|
|
||||||
// LL_ADC_Disable(p->adc);
|
|
||||||
}
|
}
|
||||||
// 检查DMA1的传输错误标志是否为1,如果是,则清除该标志
|
// 检查DMA1的传输错误标志是否为1,如果是,则清除该标志
|
||||||
if (LL_DMA_IsActiveFlag_TE1(p->dma) != 0)
|
if (LL_DMA_IsActiveFlag_TE1(p->dma) != 0)
|
||||||
|
@ -361,17 +319,7 @@ void adc_env_callback(adcs_e num)
|
||||||
if (LL_ADC_IsActiveFlag_OVR(p->adc) != 0)
|
if (LL_ADC_IsActiveFlag_OVR(p->adc) != 0)
|
||||||
{
|
{
|
||||||
p->ovr_count++;
|
p->ovr_count++;
|
||||||
LL_ADC_REG_StopConversion(p->adc);
|
|
||||||
LL_DMA_DisableChannel(p->dma, p->dma_channel);
|
|
||||||
|
|
||||||
LL_DMA_SetDataLength(p->dma, p->dma_channel, p->adc_sum);
|
|
||||||
LL_DMA_SetPeriphAddress(p->dma, p->dma_channel, LL_ADC_DMA_GetRegAddr(p->adc, LL_ADC_DMA_REG_REGULAR_DATA));
|
|
||||||
LL_DMA_SetMemoryAddress(p->dma, p->dma_channel, (uint32_t)p->adc_value);
|
|
||||||
LL_DMA_EnableChannel(p->dma, p->dma_channel);
|
|
||||||
|
|
||||||
LL_ADC_ClearFlag_OVR(p->adc);
|
LL_ADC_ClearFlag_OVR(p->adc);
|
||||||
LL_ADC_ClearFlag_EOC(p->adc);
|
|
||||||
LL_ADC_REG_StartConversion(p->adc); // 开始转换
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,9 +17,6 @@
|
||||||
|
|
||||||
#ifndef __ADCS_H__
|
#ifndef __ADCS_H__
|
||||||
#define __ADCS_H__
|
#define __ADCS_H__
|
||||||
|
|
||||||
#include "lib.h"
|
|
||||||
#include "main.h"
|
|
||||||
#include "sys.h"
|
#include "sys.h"
|
||||||
|
|
||||||
#define ADC_CHANNEL_MAX 18 ///< Maximum number of ADC channels
|
#define ADC_CHANNEL_MAX 18 ///< Maximum number of ADC channels
|
||||||
|
@ -85,6 +82,7 @@ typedef struct
|
||||||
{
|
{
|
||||||
ADC_TypeDef *adc; ///< ADC peripheral
|
ADC_TypeDef *adc; ///< ADC peripheral
|
||||||
DMA_TypeDef *dma; ///< DMA peripheral
|
DMA_TypeDef *dma; ///< DMA peripheral
|
||||||
|
uint32_t dma_stream; ///< DMA stream
|
||||||
uint32_t dma_channel; ///< DMA channel
|
uint32_t dma_channel; ///< DMA channel
|
||||||
adcs_channels_u channels; ///< ADC channels
|
adcs_channels_u channels; ///< ADC channels
|
||||||
uint32_t ovr_count; ///< ADC overflow count
|
uint32_t ovr_count; ///< ADC overflow count
|
||||||
|
@ -94,9 +92,6 @@ typedef struct
|
||||||
uint16_t adc_sum; ///< Channel acquisition count
|
uint16_t adc_sum; ///< Channel acquisition count
|
||||||
__IO uint16_t *adc_value; ///< Address to store ADC conversion results
|
__IO uint16_t *adc_value; ///< Address to store ADC conversion results
|
||||||
|
|
||||||
utime_ticks_t median_average_ticks; ///< Median average filtering ticks
|
|
||||||
utime_ticks_t median_ticks; ///< Median filtering ticks
|
|
||||||
utime_ticks_t average_ticks; ///< Average filtering ticks
|
|
||||||
} adcs_t;
|
} adcs_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -111,7 +106,7 @@ typedef struct
|
||||||
* @param adc_cct The ADC continuous conversion mode.
|
* @param adc_cct The ADC continuous conversion mode.
|
||||||
* @param channels The number of ADC channels to be converted.
|
* @param channels The number of ADC channels to be converted.
|
||||||
*/
|
*/
|
||||||
extern void adc_init(adcs_e num, ADC_TypeDef *adc, DMA_TypeDef *dma, uint32_t dma_channel, uint16_t adc_cct, uint32_t channels);
|
extern void adc_init(adcs_e num, ADC_TypeDef *adc, DMA_TypeDef *dma, uint32_t dma_stream, uint32_t dma_channel, uint16_t adc_cct, uint32_t channels);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Starts the ADC conversion.
|
* @brief Starts the ADC conversion.
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#define __BSP_H__
|
#define __BSP_H__
|
||||||
|
|
||||||
#include "gpios.h"
|
#include "gpios.h"
|
||||||
// #include "adcs.h"
|
#include "adcs.h"
|
||||||
// #include "dacs.h"
|
// #include "dacs.h"
|
||||||
// #include "dmas.h"
|
// #include "dmas.h"
|
||||||
#include "tims.h"
|
#include "tims.h"
|
||||||
|
|
53
motor.ioc
53
motor.ioc
|
@ -1,36 +1,67 @@
|
||||||
#MicroXplorer Configuration settings - do not modify
|
#MicroXplorer Configuration settings - do not modify
|
||||||
|
ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_TEMPSENSOR
|
||||||
|
ADC1.Channel-1\#ChannelRegularConversion=ADC_CHANNEL_VREFINT
|
||||||
|
ADC1.ContinuousConvMode=ENABLE
|
||||||
|
ADC1.DMAContinuousRequests=ENABLE
|
||||||
|
ADC1.EOCSelection=ADC_EOC_SEQ_CONV
|
||||||
|
ADC1.IPParameters=Rank-0\#ChannelRegularConversion,master,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag,Rank-1\#ChannelRegularConversion,Channel-1\#ChannelRegularConversion,SamplingTime-1\#ChannelRegularConversion,NbrOfConversion,ContinuousConvMode,DMAContinuousRequests,EOCSelection
|
||||||
|
ADC1.NbrOfConversion=2
|
||||||
|
ADC1.NbrOfConversionFlag=1
|
||||||
|
ADC1.Rank-0\#ChannelRegularConversion=1
|
||||||
|
ADC1.Rank-1\#ChannelRegularConversion=2
|
||||||
|
ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_28CYCLES
|
||||||
|
ADC1.SamplingTime-1\#ChannelRegularConversion=ADC_SAMPLETIME_28CYCLES
|
||||||
|
ADC1.master=1
|
||||||
CAD.formats=
|
CAD.formats=
|
||||||
CAD.pinconfig=
|
CAD.pinconfig=
|
||||||
CAD.provider=
|
CAD.provider=
|
||||||
|
Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY
|
||||||
|
Dma.ADC1.0.FIFOMode=DMA_FIFOMODE_DISABLE
|
||||||
|
Dma.ADC1.0.Instance=DMA2_Stream0
|
||||||
|
Dma.ADC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
|
||||||
|
Dma.ADC1.0.MemInc=DMA_MINC_ENABLE
|
||||||
|
Dma.ADC1.0.Mode=DMA_CIRCULAR
|
||||||
|
Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
|
||||||
|
Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE
|
||||||
|
Dma.ADC1.0.Priority=DMA_PRIORITY_LOW
|
||||||
|
Dma.ADC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
|
||||||
|
Dma.Request0=ADC1
|
||||||
|
Dma.RequestsNb=1
|
||||||
File.Version=6
|
File.Version=6
|
||||||
GPIO.groupedBy=Group By Peripherals
|
GPIO.groupedBy=Group By Peripherals
|
||||||
KeepUserPlacement=false
|
KeepUserPlacement=false
|
||||||
Mcu.CPN=STM32F407IGT7
|
Mcu.CPN=STM32F407IGT7
|
||||||
Mcu.Family=STM32F4
|
Mcu.Family=STM32F4
|
||||||
Mcu.IP0=NVIC
|
Mcu.IP0=ADC1
|
||||||
Mcu.IP1=RCC
|
Mcu.IP1=DMA
|
||||||
Mcu.IP2=SYS
|
Mcu.IP2=NVIC
|
||||||
Mcu.IP3=TIM6
|
Mcu.IP3=RCC
|
||||||
Mcu.IPNb=4
|
Mcu.IP4=SYS
|
||||||
|
Mcu.IP5=TIM6
|
||||||
|
Mcu.IPNb=6
|
||||||
Mcu.Name=STM32F407I(E-G)Tx
|
Mcu.Name=STM32F407I(E-G)Tx
|
||||||
Mcu.Package=LQFP176
|
Mcu.Package=LQFP176
|
||||||
Mcu.Pin0=PC14-OSC32_IN
|
Mcu.Pin0=PC14-OSC32_IN
|
||||||
Mcu.Pin1=PC15-OSC32_OUT
|
Mcu.Pin1=PC15-OSC32_OUT
|
||||||
|
Mcu.Pin10=VP_SYS_VS_Systick
|
||||||
|
Mcu.Pin11=VP_TIM6_VS_ClockSourceINT
|
||||||
Mcu.Pin2=PH0-OSC_IN
|
Mcu.Pin2=PH0-OSC_IN
|
||||||
Mcu.Pin3=PH1-OSC_OUT
|
Mcu.Pin3=PH1-OSC_OUT
|
||||||
Mcu.Pin4=PA13
|
Mcu.Pin4=PA13
|
||||||
Mcu.Pin5=PA14
|
Mcu.Pin5=PA14
|
||||||
Mcu.Pin6=PE0
|
Mcu.Pin6=PE0
|
||||||
Mcu.Pin7=PE1
|
Mcu.Pin7=PE1
|
||||||
Mcu.Pin8=VP_SYS_VS_Systick
|
Mcu.Pin8=VP_ADC1_TempSens_Input
|
||||||
Mcu.Pin9=VP_TIM6_VS_ClockSourceINT
|
Mcu.Pin9=VP_ADC1_Vref_Input
|
||||||
Mcu.PinsNb=10
|
Mcu.PinsNb=12
|
||||||
Mcu.ThirdPartyNb=0
|
Mcu.ThirdPartyNb=0
|
||||||
Mcu.UserConstants=
|
Mcu.UserConstants=
|
||||||
Mcu.UserName=STM32F407IGTx
|
Mcu.UserName=STM32F407IGTx
|
||||||
MxCube.Version=6.9.2
|
MxCube.Version=6.9.2
|
||||||
MxDb.Version=DB.6.0.92
|
MxDb.Version=DB.6.0.92
|
||||||
|
NVIC.ADC_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||||
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
|
NVIC.DMA2_Stream0_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
|
||||||
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
NVIC.ForceEnableDMAVector=true
|
NVIC.ForceEnableDMAVector=true
|
||||||
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
|
@ -95,7 +126,7 @@ ProjectManager.ToolChainLocation=
|
||||||
ProjectManager.UAScriptAfterPath=
|
ProjectManager.UAScriptAfterPath=
|
||||||
ProjectManager.UAScriptBeforePath=
|
ProjectManager.UAScriptBeforePath=
|
||||||
ProjectManager.UnderRoot=false
|
ProjectManager.UnderRoot=false
|
||||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-LL-false,2-MX_GPIO_Init-GPIO-false-LL-true,3-MX_TIM6_Init-TIM6-false-LL-true
|
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-LL-false,2-MX_GPIO_Init-GPIO-false-LL-true,3-MX_DMA_Init-DMA-false-LL-true,4-MX_TIM6_Init-TIM6-false-LL-true,5-MX_ADC1_Init-ADC1-false-LL-true
|
||||||
RCC.48MHZClocksFreq_Value=84000000
|
RCC.48MHZClocksFreq_Value=84000000
|
||||||
RCC.AHBFreq_Value=168000000
|
RCC.AHBFreq_Value=168000000
|
||||||
RCC.APB1CLKDivider=RCC_HCLK_DIV4
|
RCC.APB1CLKDivider=RCC_HCLK_DIV4
|
||||||
|
@ -131,6 +162,10 @@ RCC.VcooutputI2S=192000000
|
||||||
TIM6.IPParameters=Prescaler,Period
|
TIM6.IPParameters=Prescaler,Period
|
||||||
TIM6.Period=99
|
TIM6.Period=99
|
||||||
TIM6.Prescaler=16799
|
TIM6.Prescaler=16799
|
||||||
|
VP_ADC1_TempSens_Input.Mode=IN-TempSens
|
||||||
|
VP_ADC1_TempSens_Input.Signal=ADC1_TempSens_Input
|
||||||
|
VP_ADC1_Vref_Input.Mode=IN-Vrefint
|
||||||
|
VP_ADC1_Vref_Input.Signal=ADC1_Vref_Input
|
||||||
VP_SYS_VS_Systick.Mode=SysTick
|
VP_SYS_VS_Systick.Mode=SysTick
|
||||||
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
|
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
|
||||||
VP_TIM6_VS_ClockSourceINT.Mode=Enable_Timer
|
VP_TIM6_VS_ClockSourceINT.Mode=Enable_Timer
|
||||||
|
|
Loading…
Reference in New Issue