remaining warning is pin redefinition, can be ignored added working motor init parameters added function descriptions added sd card functionality (commented out because of hardware problems) added adc functionality (implemented but not used because of hardware problems)alice
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.660739989" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/> | <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.660739989" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/> | ||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1749471754" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/> | <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1749471754" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/> | ||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.771602116" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="NUCLEO-F401RE" valueType="string"/> | <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.771602116" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="NUCLEO-F401RE" valueType="string"/> | ||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1323549252" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || NUCLEO-F401RE || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy | ../FATFS/Target | ../FATFS/App | ../Middlewares/Third_Party/FatFs/src || || || USE_HAL_DRIVER | STM32F401xE || || Drivers | Core/Startup | Middlewares | Core | FATFS || || || ${workspace_loc:/${ProjName}/STM32F401RETX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || " valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1323549252" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || NUCLEO-F401RE || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../FATFS/App | ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../FATFS/Target | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy | ../Middlewares/Third_Party/FatFs/src || || || USE_HAL_DRIVER | STM32F401xE || || Drivers | Core/Startup | Middlewares | Core | FATFS || || || ${workspace_loc:/${ProjName}/STM32F401RETX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || " valueType="string"/> | |||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.689670736" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/> | <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.689670736" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/> | ||||
<builder buildPath="${workspace_loc:/RTC}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.801006825" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/> | <builder buildPath="${workspace_loc:/RTC}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.801006825" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/> | ||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.92913197" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler"> | <tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.92913197" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler"> |
/* Private variables ---------------------------------------------------------*/ | /* Private variables ---------------------------------------------------------*/ | ||||
SPI_HandleTypeDef hspi1; | SPI_HandleTypeDef hspi1; | ||||
ADC_HandleTypeDef hadc1; | ADC_HandleTypeDef hadc1; | ||||
RTC_HandleTypeDef hrtc; | RTC_HandleTypeDef hrtc; | ||||
UART_HandleTypeDef huart2; | UART_HandleTypeDef huart2; | ||||
int DaysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; | int DaysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; | ||||
int DaysInMonthLeapYear[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; | int DaysInMonthLeapYear[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; | ||||
bool leapYear = false; | bool leapYear = false; | ||||
int singleStepsFor180Deg = 100; // The stepper motor needs 200 single steps for 360 deg, equals 100 steps for 180 deg | |||||
int stepsFor180Deg = 1600; // The stepper motor needs 200 single steps for 360 deg, equals 100 steps for 180 deg, 180 Deg in 1/16 steps equals 1600 1/16 steps | |||||
int leapsFor180Deg = 5; // Determines how big the amount of single steps is to complete 180 degrees of rotation | int leapsFor180Deg = 5; // Determines how big the amount of single steps is to complete 180 degrees of rotation | ||||
bool alarmSunriseFlag = false; | bool alarmSunriseFlag = false; | ||||
bool alarmSunsetFlag = false; | bool alarmSunsetFlag = false; | ||||
bool makeStepFlag = false; | bool makeStepFlag = false; | ||||
/* Initialization parameters. */ | |||||
l6208_Init_t initDeviceParameters = | |||||
{ | |||||
1500, //Acceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes | |||||
20, //Acceleration current torque in % (from 0 to 100) | |||||
1500, //Deceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes | |||||
20, //Deceleration current torque in % (from 0 to 100) | |||||
1500, //Running speed in step/s or (1/16)th step/s for microstep modes | |||||
10, //Running current torque in % (from 0 to 100) | |||||
5, //Holding current torque in % (from 0 to 100) | |||||
STEP_MODE_1_16, //Step mode via enum motorStepMode_t | |||||
FAST_DECAY, //Decay mode via enum motorDecayMode_t | |||||
0, //Dwelling time in ms | |||||
FALSE, //Automatic HIZ STOP | |||||
100000 //VREFA and VREFB PWM frequency (Hz) | |||||
}; | |||||
typedef struct { | typedef struct { | ||||
int hours; | int hours; | ||||
int minutes; | int minutes; | ||||
int year; | int year; | ||||
} timeAndDate; | } timeAndDate; | ||||
typedef struct { | |||||
char hours[10]; | |||||
char minutes[10]; | |||||
char seconds[10]; | |||||
char *fullTimeStamp; | |||||
} timeStamp; | |||||
timeStamp time; | |||||
// SD CARD Variables | // SD CARD Variables | ||||
FATFS fs; | FATFS fs; | ||||
FATFS *pfs; | FATFS *pfs; | ||||
static void MX_SPI1_Init(void); | static void MX_SPI1_Init(void); | ||||
static void MX_ADC1_Init(void); | static void MX_ADC1_Init(void); | ||||
static void MyFlagInterruptHandler(void); | static void MyFlagInterruptHandler(void); | ||||
void MyErrorHandler(uint16_t error); | |||||
void ButtonHandler(void); | void ButtonHandler(void); | ||||
/* USER CODE BEGIN PFP */ | /* USER CODE BEGIN PFP */ | ||||
} | } | ||||
/******************************************************************************* | /******************************************************************************* | ||||
* Function Name : set_Alarm | |||||
* Description : sets the wake up Alarm | |||||
* Function Name : set_alarm | |||||
* Description : sets alarm A or B | |||||
*******************************************************************************/ | *******************************************************************************/ | ||||
void set_alarm(int h, int min, int weekDay, char* alarm, RTC_AlarmTypeDef* alarmInstance) | void set_alarm(int h, int min, int weekDay, char* alarm, RTC_AlarmTypeDef* alarmInstance) | ||||
{ | { | ||||
} | } | ||||
void get_time(timeStamp *time){ | |||||
char str[200]; | |||||
if (HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK) | |||||
{ | |||||
sprintf(time->hours, "%d", sTime.Hours); | |||||
sprintf(time->minutes, "%d", sTime.Minutes); | |||||
sprintf(time->seconds, "%d", sTime.Seconds); | |||||
} | |||||
strcpy(str, time->hours); | |||||
strcat(str, ":"); | |||||
strcat(str, time->minutes); | |||||
strcat(str, ":"); | |||||
strcat(str, time->seconds); | |||||
strcat(str, " | "); | |||||
time->fullTimeStamp = str; | |||||
} | |||||
// sending to UART | |||||
/******************************************************************************* | |||||
* Function Name : transmit_uart | |||||
* Description : Transmit a string over uart | |||||
*******************************************************************************/ | |||||
void transmit_uart(char *string){ | void transmit_uart(char *string){ | ||||
//char str[200]; | |||||
//get_time(&time); | |||||
//strcat(time.fullTimeStamp, string); | |||||
//strcpy(str, time.fullTimeStamp); | |||||
uint8_t len = strlen(string); | uint8_t len = strlen(string); | ||||
HAL_UART_Transmit(&huart2, (uint8_t*) string, len, 200); | HAL_UART_Transmit(&huart2, (uint8_t*) string, len, 200); | ||||
} | } | ||||
/*************************************************************************************************** | |||||
* Function Name : set_time_and_date | |||||
* Description : Overwriting the date given in timeanddate with the current time and date from rtc | |||||
****************************************************************************************************/ | |||||
void set_time_and_date(timeAndDate *timeanddate){ | void set_time_and_date(timeAndDate *timeanddate){ | ||||
if (HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK) | if (HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK) | ||||
} | } | ||||
} | } | ||||
/******************************************************************************* | |||||
* Function Name : calc_interval_duration | |||||
* Description : Calculate the duration between the two given time/dates | |||||
* Return : The duration as an integer | |||||
*******************************************************************************/ | |||||
int calc_interval_duration(timeAndDate *sunrise, timeAndDate *sunset){ | int calc_interval_duration(timeAndDate *sunrise, timeAndDate *sunset){ | ||||
int duration_h=0; | int duration_h=0; | ||||
int duration_m=0; | int duration_m=0; | ||||
return (duration_h * 60 + duration_m) / leapsFor180Deg; | return (duration_h * 60 + duration_m) / leapsFor180Deg; | ||||
} | } | ||||
/******************************************************************************* | |||||
* Function Name : generate_filename | |||||
* Description : Short function to generate a filename with the current date | |||||
*******************************************************************************/ | |||||
void generate_filename(timeAndDate *date){ | void generate_filename(timeAndDate *date){ | ||||
sprintf(filename, "%02d%02d%02d.txt", date->year, date->month, date->day); | sprintf(filename, "%02d%02d%02d.txt", date->year, date->month, date->day); | ||||
} | } | ||||
*/ | */ | ||||
int main(void) | int main(void) | ||||
{ | { | ||||
/* USER CODE BEGIN 1 */ | |||||
/* USER CODE BEGIN 1 */ | |||||
/* USER CODE END 1 */ | |||||
/* USER CODE END 1 */ | |||||
/* MCU Configuration--------------------------------------------------------*/ | |||||
/* MCU Configuration--------------------------------------------------------*/ | |||||
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ | |||||
HAL_Init(); | |||||
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ | |||||
HAL_Init(); | |||||
/* USER CODE BEGIN Init */ | |||||
/* USER CODE BEGIN Init */ | |||||
/* USER CODE END Init */ | |||||
/* USER CODE END Init */ | |||||
/* Configure the system clock */ | |||||
SystemClock_Config(); | |||||
/* Configure the system clock */ | |||||
SystemClock_Config(); | |||||
/* USER CODE BEGIN SysInit */ | |||||
/* USER CODE BEGIN SysInit */ | |||||
/* USER CODE END SysInit */ | |||||
/* USER CODE END SysInit */ | |||||
/* Initialize all configured peripherals */ | |||||
MX_GPIO_Init(); | |||||
MX_USART2_UART_Init(); | |||||
MX_RTC_Init(); | |||||
MX_SPI1_Init(); | |||||
MX_FATFS_Init(); | |||||
MX_ADC1_Init(); | |||||
/* USER CODE BEGIN 2 */ | |||||
/* Initialize all configured peripherals */ | |||||
MX_GPIO_Init(); | |||||
MX_USART2_UART_Init(); | |||||
MX_RTC_Init(); | |||||
MX_SPI1_Init(); | |||||
MX_FATFS_Init(); | |||||
MX_ADC1_Init(); | |||||
/* USER CODE BEGIN 2 */ | |||||
//######### Inits of the Motor control library ######### | |||||
//######### Inits of the Motor control library ######### | |||||
/* Set the L6208 library to use 1 device */ | |||||
BSP_MotorControl_SetNbDevices(BSP_MOTOR_CONTROL_BOARD_ID_L6208, 1); | |||||
BSP_MotorControl_Init(BSP_MOTOR_CONTROL_BOARD_ID_L6208, NULL); | |||||
/* Set the L6208 library to use 1 device */ | |||||
BSP_MotorControl_SetNbDevices(BSP_MOTOR_CONTROL_BOARD_ID_L6208, 1); | |||||
/* Attach the function MyFlagInterruptHandler (defined below) to the flag interrupt */ | |||||
BSP_MotorControl_AttachFlagInterrupt(MyFlagInterruptHandler); | |||||
BSP_MotorControl_Init(BSP_MOTOR_CONTROL_BOARD_ID_L6208, &initDeviceParameters); | |||||
/* Attach the function MyErrorHandler (defined below) to the error Handler*/ | |||||
BSP_MotorControl_AttachErrorHandler(Error_Handler); | |||||
//BSP_MotorControl_Init(BSP_MOTOR_CONTROL_BOARD_ID_L6208, NULL); //Default params | |||||
/* Set Systick Interrupt priority highest to ensure no lock by using HAL_Delay */ | |||||
HAL_NVIC_SetPriority(SysTick_IRQn, 0x0, 0x0); | |||||
/* Attach the function MyFlagInterruptHandler (defined below) to the flag interrupt */ | |||||
BSP_MotorControl_AttachFlagInterrupt(MyFlagInterruptHandler); | |||||
/* Configure KEY Button */ | |||||
BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_EXTI); | |||||
/* Attach the function MyErrorHandler (defined below) to the error Handler*/ | |||||
BSP_MotorControl_AttachErrorHandler(MyErrorHandler); | |||||
/* Disable the power bridges after initialization */ | |||||
BSP_MotorControl_CmdDisable(0); | |||||
/* Set Systick Interrupt priority highest to ensure no lock by using HAL_Delay */ | |||||
HAL_NVIC_SetPriority(SysTick_IRQn, 0x0, 0x0); | |||||
//######### Mount SD-Card ######### | |||||
/* Configure KEY Button */ | |||||
//BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_EXTI); | |||||
fres = f_mount(&fs, "", 0); | |||||
if (fres == FR_OK) { | |||||
transmit_uart("SD card is mounted successfully!\r\n"); | |||||
} else if (fres != FR_OK) { | |||||
transmit_uart("SD card is not mounted!\r\n"); | |||||
} | |||||
//######### Variable inits ######### | |||||
timeAndDate sunrise, sunset, wakeUpTimeForStep, tomorrowsDate, initialDate; | |||||
sunrise = sunset = wakeUpTimeForStep = tomorrowsDate = initialDate = (timeAndDate) {\ | |||||
0, | |||||
0, | |||||
0, | |||||
0, | |||||
0, | |||||
0, | |||||
0 | |||||
}; | |||||
/* Disable the power bridges after initialization */ | |||||
BSP_MotorControl_CmdDisable(0); | |||||
int32_t pos=0; | |||||
uint32_t freqPwm=0; | |||||
uint32_t timeToNextStep_m=0; | |||||
uint32_t alarmB_h = 0; | |||||
uint32_t alarmB_m = 0; | |||||
uint32_t alarmB_wd = 0; | |||||
uint32_t stepsToMake = singleStepsFor180Deg / leapsFor180Deg; // The amount of single steps to make to complete 180/5 degrees | |||||
/* USER CODE END 2 */ | |||||
/* Infinite loop */ | |||||
/* USER CODE BEGIN WHILE */ | |||||
int32_t pos=0; | |||||
uint32_t freqPwm=0; | |||||
freqPwm = BSP_MotorControl_GetBridgeInputPwmFreq(0); | freqPwm = BSP_MotorControl_GetBridgeInputPwmFreq(0); | ||||
BSP_MotorControl_SetBridgeInputPwmFreq(0, freqPwm>>1); | BSP_MotorControl_SetBridgeInputPwmFreq(0, freqPwm>>1); | ||||
// current position | |||||
pos = BSP_MotorControl_GetPosition(0); | pos = BSP_MotorControl_GetPosition(0); | ||||
// set current position to home | |||||
BSP_MotorControl_SetHome(0, pos); | BSP_MotorControl_SetHome(0, pos); | ||||
BSP_MotorControl_SelectStepMode(0, STEP_MODE_FULL); | |||||
//######### Mount SD-Card ######### | |||||
/* The SD Card is not working at the moment due to getting FR_NOT_READY | |||||
* when connecting the SD Card Pins with the SPI Pins on the mounted X-NUCLEO Motor driver. | |||||
* When dismounting the motor driver and connecting it via cables, there is unusual behaviour of the motor mnovement. | |||||
* The SD Card though, works when the SD Card Breakout is connected directly to the NUCLEO board. | |||||
* | |||||
fres = f_mount(&fs, "", 0); | |||||
if (fres == FR_OK) { | |||||
transmit_uart("SD card is mounted successfully!\r\n"); | |||||
} else if (fres != FR_OK) { | |||||
transmit_uart("SD card is not mounted!\r\n"); | |||||
} | |||||
*/ | |||||
while (1) | |||||
{ | |||||
//######### Start ADC ######### | |||||
//######### Start ADC Conversion ######### | |||||
HAL_ADC_Start(&hadc1); | |||||
//######### Variable inits ######### | |||||
timeAndDate sunrise, sunset, wakeUpTimeForStep, tomorrowsDate, initialDate; | |||||
sunrise = sunset = wakeUpTimeForStep = tomorrowsDate = initialDate = (timeAndDate) {\ | |||||
0, | |||||
0, | |||||
0, | |||||
0, | |||||
0, | |||||
0, | |||||
0 | |||||
}; | |||||
uint32_t timeToNextStep_m=0; | |||||
uint32_t alarmB_h = 0; | |||||
uint32_t alarmB_m = 0; | |||||
uint32_t alarmB_wd = 0; | |||||
uint32_t stepsToMake = stepsFor180Deg / leapsFor180Deg; // The amount of single steps to make to complete 180/x degrees ^= 1600/x | |||||
// Start ADC Conversion | |||||
HAL_ADC_Start(&hadc1); | |||||
/* USER CODE END 2 */ | |||||
//######### Motor settings and motor test ######### | |||||
/* Infinite loop */ | |||||
/* USER CODE BEGIN WHILE */ | |||||
while (1) | |||||
{ | |||||
HAL_Delay(2000); | HAL_Delay(2000); | ||||
transmit_uart("Resetting motor position and calculating new dates and times.\r\n"); | transmit_uart("Resetting motor position and calculating new dates and times.\r\n"); | ||||
BSP_MotorControl_Move(0, FORWARD, 300); | |||||
BSP_MotorControl_WaitWhileActive(0); | |||||
BSP_MotorControl_Move(0, FORWARD, 300); | |||||
BSP_MotorControl_WaitWhileActive(0); | |||||
BSP_MotorControl_Move(0, FORWARD, 300); | |||||
BSP_MotorControl_WaitWhileActive(0); | |||||
BSP_MotorControl_GoHome(0); | BSP_MotorControl_GoHome(0); | ||||
BSP_MotorControl_WaitWhileActive(0); | BSP_MotorControl_WaitWhileActive(0); | ||||
/* USER CODE END WHILE */ | |||||
/* USER CODE END WHILE */ | |||||
/* USER CODE BEGIN 3 */ | |||||
/* USER CODE BEGIN 3 */ | |||||
set_time_and_date(&initialDate); | set_time_and_date(&initialDate); | ||||
leap_year_check(initialDate.year); | leap_year_check(initialDate.year); | ||||
generate_filename(&tomorrowsDate); | generate_filename(&tomorrowsDate); | ||||
//######### SD Card Write ######### | |||||
/* The SD Card is not working at the moment due to getting FR_NOT_READY | |||||
* when connecting the SD Card Pins with the SPI Pins on the mounted X-NUCLEO Motor driver. | |||||
* When dismounting the motor driver and connecting it via cables, there is unusual behaviour of the motor mnovement. | |||||
* The SD Card though, works when the SD Card Breakout is connected directly to the NUCLEO board. | |||||
* | |||||
// Open file with tomorrows date as file name | // Open file with tomorrows date as file name | ||||
fres = f_open(&fil, filename, FA_OPEN_APPEND | FA_WRITE | FA_READ); | fres = f_open(&fil, filename, FA_OPEN_APPEND | FA_WRITE | FA_READ); | ||||
if (fres == FR_OK) { | if (fres == FR_OK) { | ||||
transmit_uart("File was not opened!\r\n"); | transmit_uart("File was not opened!\r\n"); | ||||
} | } | ||||
f_puts("Cancer", &fil); | |||||
f_puts("Data", &fil); | |||||
/* Close file */ | |||||
//Close file | |||||
fres = f_close(&fil); | fres = f_close(&fil); | ||||
if (fres == FR_OK) { | if (fres == FR_OK) { | ||||
transmit_uart("File is closed.\r\n"); | transmit_uart("File is closed.\r\n"); | ||||
} else if (fres != FR_OK) { | } else if (fres != FR_OK) { | ||||
transmit_uart("File was not closed.\r\n"); | transmit_uart("File was not closed.\r\n"); | ||||
} | } | ||||
*/ | |||||
//Calculate sunrise and sunset time for tomorrow | //Calculate sunrise and sunset time for tomorrow | ||||
calc_sunrise_sunset(&initialDate, &sunrise, &sunset, &tomorrowsDate); | calc_sunrise_sunset(&initialDate, &sunrise, &sunset, &tomorrowsDate); | ||||
sunrise.minutes = 0; | sunrise.minutes = 0; | ||||
sunrise.weekDay = 7; | sunrise.weekDay = 7; | ||||
sunset.hours = 14; | |||||
sunset.minutes = 30; | |||||
sunset.hours = 16; | |||||
sunset.minutes = 00; | |||||
sunset.weekDay = 7; | sunset.weekDay = 7; | ||||
//Calculate the time for next motor step in minutes | //Calculate the time for next motor step in minutes | ||||
BSP_MotorControl_GoHome(0); | BSP_MotorControl_GoHome(0); | ||||
BSP_MotorControl_WaitWhileActive(0); | BSP_MotorControl_WaitWhileActive(0); | ||||
} | |||||
/* USER CODE END 3 */ | |||||
} | |||||
/* USER CODE END 3 */ | |||||
} | } | ||||
/** | /** | ||||
} | } | ||||
/** | /** | ||||
* @brief RTC Initialization Function | * @brief RTC Initialization Function | ||||
* @param None | * @param None | ||||
* @retval None | * @retval None | ||||
BSP_MotorControl_CmdDisable(0); | BSP_MotorControl_CmdDisable(0); | ||||
} | } | ||||
void ButtonHandler(void) | |||||
{ | |||||
gButtonPressed = TRUE; | |||||
/* Let 200 ms before clearing the IT for key debouncing */ | |||||
HAL_Delay(200); | |||||
__HAL_GPIO_EXTI_CLEAR_IT(KEY_BUTTON_PIN); | |||||
HAL_NVIC_ClearPendingIRQ(KEY_BUTTON_EXTI_IRQn); | |||||
} | |||||
/* USER CODE END 4 */ | /* USER CODE END 4 */ | ||||
/** | /** | ||||
/* USER CODE END Error_Handler_Debug */ | /* USER CODE END Error_Handler_Debug */ | ||||
} | } | ||||
void MyErrorHandler(uint16_t error) | |||||
{ | |||||
// Motor error handler | |||||
/* Backup error number */ | |||||
gLastError = error; | |||||
/* Infinite loop */ | |||||
while(1) | |||||
{ | |||||
} | |||||
} | |||||
void ButtonHandler(void) | |||||
{ | |||||
gButtonPressed = TRUE; | |||||
/* Let 200 ms before clearing the IT for key debouncing */ | |||||
HAL_Delay(200); | |||||
__HAL_GPIO_EXTI_CLEAR_IT(KEY_BUTTON_PIN); | |||||
HAL_NVIC_ClearPendingIRQ(KEY_BUTTON_EXTI_IRQn); | |||||
} | |||||
#ifdef USE_FULL_ASSERT | #ifdef USE_FULL_ASSERT | ||||
/** | /** | ||||
* @brief Reports the name of the source file and the source line number | * @brief Reports the name of the source file and the source line number |
} | } | ||||
/** | /** | ||||
* @brief RTC MSP Initialization | * @brief RTC MSP Initialization | ||||
* This function configures the hardware resources used in this example | * This function configures the hardware resources used in this example | ||||
* @param hrtc: RTC handle pointer | * @param hrtc: RTC handle pointer |
****************************************************************************** | ****************************************************************************** | ||||
* @attention | * @attention | ||||
* | * | ||||
* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | * | ||||
* Redistribution and use in source and binary forms, with or without modification, | |||||
* are permitted provided that the following conditions are met: | |||||
* 1. Redistributions of source code must retain the above copyright notice, | |||||
* this list of conditions and the following disclaimer. | |||||
* 2. Redistributions in binary form must reproduce the above copyright notice, | |||||
* this list of conditions and the following disclaimer in the documentation | |||||
* and/or other materials provided with the distribution. | |||||
* 3. Neither the name of STMicroelectronics nor the names of its contributors | |||||
* may be used to endorse or promote products derived from this software | |||||
* without specific prior written permission. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
* This software component is licensed by ST under BSD 3-Clause license, | |||||
* the "License"; You may not use this file except in compliance with the | |||||
* License. You may obtain a copy of the License at: | |||||
* opensource.org/licenses/BSD-3-Clause | |||||
* | * | ||||
****************************************************************************** | ****************************************************************************** | ||||
*/ | */ | ||||
*/ | */ | ||||
typedef struct | typedef struct | ||||
{ | { | ||||
uint32_t ClockPrescaler; /*!< Select ADC clock prescaler. The clock is common for | |||||
all the ADCs. | |||||
This parameter can be a value of @ref ADC_ClockPrescaler */ | |||||
uint32_t Resolution; /*!< Configures the ADC resolution. | |||||
This parameter can be a value of @ref ADC_Resolution */ | |||||
uint32_t DataAlign; /*!< Specifies ADC data alignment to right (MSB on register bit 11 and LSB on register bit 0) (default setting) | |||||
or to left (if regular group: MSB on register bit 15 and LSB on register bit 4, if injected group (MSB kept as signed value due to potential negative value after offset application): MSB on register bit 14 and LSB on register bit 3). | |||||
This parameter can be a value of @ref ADC_Data_align */ | |||||
uint32_t ScanConvMode; /*!< Configures the sequencer of regular and injected groups. | |||||
This parameter can be associated to parameter 'DiscontinuousConvMode' to have main sequence subdivided in successive parts. | |||||
If disabled: Conversion is performed in single mode (one channel converted, the one defined in rank 1). | |||||
Parameters 'NbrOfConversion' and 'InjectedNbrOfConversion' are discarded (equivalent to set to 1). | |||||
If enabled: Conversions are performed in sequence mode (multiple ranks defined by 'NbrOfConversion'/'InjectedNbrOfConversion' and each channel rank). | |||||
Scan direction is upward: from rank1 to rank 'n'. | |||||
This parameter can be set to ENABLE or DISABLE */ | |||||
uint32_t EOCSelection; /*!< Specifies what EOC (End Of Conversion) flag is used for conversion by polling and interruption: end of conversion of each rank or complete sequence. | |||||
This parameter can be a value of @ref ADC_EOCSelection. | |||||
Note: For injected group, end of conversion (flag&IT) is raised only at the end of the sequence. | |||||
Therefore, if end of conversion is set to end of each conversion, injected group should not be used with interruption (HAL_ADCEx_InjectedStart_IT) | |||||
or polling (HAL_ADCEx_InjectedStart and HAL_ADCEx_InjectedPollForConversion). By the way, polling is still possible since driver will use an estimated timing for end of injected conversion. | |||||
Note: If overrun feature is intended to be used, use ADC in mode 'interruption' (function HAL_ADC_Start_IT() ) with parameter EOCSelection set to end of each conversion or in mode 'transfer by DMA' (function HAL_ADC_Start_DMA()). | |||||
If overrun feature is intended to be bypassed, use ADC in mode 'polling' or 'interruption' with parameter EOCSelection must be set to end of sequence */ | |||||
uint32_t ContinuousConvMode; /*!< Specifies whether the conversion is performed in single mode (one conversion) or continuous mode for regular group, | |||||
after the selected trigger occurred (software start or external trigger). | |||||
This parameter can be set to ENABLE or DISABLE. */ | |||||
uint32_t NbrOfConversion; /*!< Specifies the number of ranks that will be converted within the regular group sequencer. | |||||
To use regular group sequencer and convert several ranks, parameter 'ScanConvMode' must be enabled. | |||||
This parameter must be a number between Min_Data = 1 and Max_Data = 16. */ | |||||
uint32_t DiscontinuousConvMode; /*!< Specifies whether the conversions sequence of regular group is performed in Complete-sequence/Discontinuous-sequence (main sequence subdivided in successive parts). | |||||
Discontinuous mode is used only if sequencer is enabled (parameter 'ScanConvMode'). If sequencer is disabled, this parameter is discarded. | |||||
Discontinuous mode can be enabled only if continuous mode is disabled. If continuous mode is enabled, this parameter setting is discarded. | |||||
This parameter can be set to ENABLE or DISABLE. */ | |||||
uint32_t NbrOfDiscConversion; /*!< Specifies the number of discontinuous conversions in which the main sequence of regular group (parameter NbrOfConversion) will be subdivided. | |||||
If parameter 'DiscontinuousConvMode' is disabled, this parameter is discarded. | |||||
This parameter must be a number between Min_Data = 1 and Max_Data = 8. */ | |||||
uint32_t ExternalTrigConv; /*!< Selects the external event used to trigger the conversion start of regular group. | |||||
If set to ADC_SOFTWARE_START, external triggers are disabled. | |||||
If set to external trigger source, triggering is on event rising edge by default. | |||||
This parameter can be a value of @ref ADC_External_trigger_Source_Regular */ | |||||
uint32_t ExternalTrigConvEdge; /*!< Selects the external trigger edge of regular group. | |||||
If trigger is set to ADC_SOFTWARE_START, this parameter is discarded. | |||||
This parameter can be a value of @ref ADC_External_trigger_edge_Regular */ | |||||
uint32_t DMAContinuousRequests; /*!< Specifies whether the DMA requests are performed in one shot mode (DMA transfer stop when number of conversions is reached) | |||||
or in Continuous mode (DMA transfer unlimited, whatever number of conversions). | |||||
Note: In continuous mode, DMA must be configured in circular mode. Otherwise an overrun will be triggered when DMA buffer maximum pointer is reached. | |||||
Note: This parameter must be modified when no conversion is on going on both regular and injected groups (ADC disabled, or ADC enabled without continuous mode or external trigger that could launch a conversion). | |||||
This parameter can be set to ENABLE or DISABLE. */ | |||||
uint32_t ClockPrescaler; /*!< Select ADC clock prescaler. The clock is common for | |||||
all the ADCs. | |||||
This parameter can be a value of @ref ADC_ClockPrescaler */ | |||||
uint32_t Resolution; /*!< Configures the ADC resolution. | |||||
This parameter can be a value of @ref ADC_Resolution */ | |||||
uint32_t DataAlign; /*!< Specifies ADC data alignment to right (MSB on register bit 11 and LSB on register bit 0) (default setting) | |||||
or to left (if regular group: MSB on register bit 15 and LSB on register bit 4, if injected group (MSB kept as signed value due to potential negative value after offset application): MSB on register bit 14 and LSB on register bit 3). | |||||
This parameter can be a value of @ref ADC_Data_align */ | |||||
uint32_t ScanConvMode; /*!< Configures the sequencer of regular and injected groups. | |||||
This parameter can be associated to parameter 'DiscontinuousConvMode' to have main sequence subdivided in successive parts. | |||||
If disabled: Conversion is performed in single mode (one channel converted, the one defined in rank 1). | |||||
Parameters 'NbrOfConversion' and 'InjectedNbrOfConversion' are discarded (equivalent to set to 1). | |||||
If enabled: Conversions are performed in sequence mode (multiple ranks defined by 'NbrOfConversion'/'InjectedNbrOfConversion' and each channel rank). | |||||
Scan direction is upward: from rank1 to rank 'n'. | |||||
This parameter can be set to ENABLE or DISABLE */ | |||||
uint32_t EOCSelection; /*!< Specifies what EOC (End Of Conversion) flag is used for conversion by polling and interruption: end of conversion of each rank or complete sequence. | |||||
This parameter can be a value of @ref ADC_EOCSelection. | |||||
Note: For injected group, end of conversion (flag&IT) is raised only at the end of the sequence. | |||||
Therefore, if end of conversion is set to end of each conversion, injected group should not be used with interruption (HAL_ADCEx_InjectedStart_IT) | |||||
or polling (HAL_ADCEx_InjectedStart and HAL_ADCEx_InjectedPollForConversion). By the way, polling is still possible since driver will use an estimated timing for end of injected conversion. | |||||
Note: If overrun feature is intended to be used, use ADC in mode 'interruption' (function HAL_ADC_Start_IT() ) with parameter EOCSelection set to end of each conversion or in mode 'transfer by DMA' (function HAL_ADC_Start_DMA()). | |||||
If overrun feature is intended to be bypassed, use ADC in mode 'polling' or 'interruption' with parameter EOCSelection must be set to end of sequence */ | |||||
FunctionalState ContinuousConvMode; /*!< Specifies whether the conversion is performed in single mode (one conversion) or continuous mode for regular group, | |||||
after the selected trigger occurred (software start or external trigger). | |||||
This parameter can be set to ENABLE or DISABLE. */ | |||||
uint32_t NbrOfConversion; /*!< Specifies the number of ranks that will be converted within the regular group sequencer. | |||||
To use regular group sequencer and convert several ranks, parameter 'ScanConvMode' must be enabled. | |||||
This parameter must be a number between Min_Data = 1 and Max_Data = 16. */ | |||||
FunctionalState DiscontinuousConvMode; /*!< Specifies whether the conversions sequence of regular group is performed in Complete-sequence/Discontinuous-sequence (main sequence subdivided in successive parts). | |||||
Discontinuous mode is used only if sequencer is enabled (parameter 'ScanConvMode'). If sequencer is disabled, this parameter is discarded. | |||||
Discontinuous mode can be enabled only if continuous mode is disabled. If continuous mode is enabled, this parameter setting is discarded. | |||||
This parameter can be set to ENABLE or DISABLE. */ | |||||
uint32_t NbrOfDiscConversion; /*!< Specifies the number of discontinuous conversions in which the main sequence of regular group (parameter NbrOfConversion) will be subdivided. | |||||
If parameter 'DiscontinuousConvMode' is disabled, this parameter is discarded. | |||||
This parameter must be a number between Min_Data = 1 and Max_Data = 8. */ | |||||
uint32_t ExternalTrigConv; /*!< Selects the external event used to trigger the conversion start of regular group. | |||||
If set to ADC_SOFTWARE_START, external triggers are disabled. | |||||
If set to external trigger source, triggering is on event rising edge by default. | |||||
This parameter can be a value of @ref ADC_External_trigger_Source_Regular */ | |||||
uint32_t ExternalTrigConvEdge; /*!< Selects the external trigger edge of regular group. | |||||
If trigger is set to ADC_SOFTWARE_START, this parameter is discarded. | |||||
This parameter can be a value of @ref ADC_External_trigger_edge_Regular */ | |||||
FunctionalState DMAContinuousRequests; /*!< Specifies whether the DMA requests are performed in one shot mode (DMA transfer stop when number of conversions is reached) | |||||
or in Continuous mode (DMA transfer unlimited, whatever number of conversions). | |||||
Note: In continuous mode, DMA must be configured in circular mode. Otherwise an overrun will be triggered when DMA buffer maximum pointer is reached. | |||||
Note: This parameter must be modified when no conversion is on going on both regular and injected groups (ADC disabled, or ADC enabled without continuous mode or external trigger that could launch a conversion). | |||||
This parameter can be set to ENABLE or DISABLE. */ | |||||
}ADC_InitTypeDef; | }ADC_InitTypeDef; | ||||
uint32_t Channel; /*!< Configures ADC channel for the analog watchdog. | uint32_t Channel; /*!< Configures ADC channel for the analog watchdog. | ||||
This parameter has an effect only if watchdog mode is configured on single channel | This parameter has an effect only if watchdog mode is configured on single channel | ||||
This parameter can be a value of @ref ADC_channels */ | This parameter can be a value of @ref ADC_channels */ | ||||
uint32_t ITMode; /*!< Specifies whether the analog watchdog is configured | |||||
FunctionalState ITMode; /*!< Specifies whether the analog watchdog is configured | |||||
is interrupt mode or in polling mode. | is interrupt mode or in polling mode. | ||||
This parameter can be set to ENABLE or DISABLE */ | This parameter can be set to ENABLE or DISABLE */ | ||||
uint32_t WatchdogNumber; /*!< Reserved for future use, can be set to 0 */ | uint32_t WatchdogNumber; /*!< Reserved for future use, can be set to 0 */ | ||||
/** | /** | ||||
* @brief ADC handle Structure definition | * @brief ADC handle Structure definition | ||||
*/ | */ | ||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
typedef struct __ADC_HandleTypeDef | |||||
#else | |||||
typedef struct | typedef struct | ||||
#endif | |||||
{ | { | ||||
ADC_TypeDef *Instance; /*!< Register base address */ | ADC_TypeDef *Instance; /*!< Register base address */ | ||||
__IO uint32_t State; /*!< ADC communication state */ | __IO uint32_t State; /*!< ADC communication state */ | ||||
__IO uint32_t ErrorCode; /*!< ADC Error code */ | __IO uint32_t ErrorCode; /*!< ADC Error code */ | ||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
void (* ConvCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC conversion complete callback */ | |||||
void (* ConvHalfCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC conversion DMA half-transfer callback */ | |||||
void (* LevelOutOfWindowCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC analog watchdog 1 callback */ | |||||
void (* ErrorCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC error callback */ | |||||
void (* InjectedConvCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC group injected conversion complete callback */ | |||||
void (* MspInitCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC Msp Init callback */ | |||||
void (* MspDeInitCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC Msp DeInit callback */ | |||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
}ADC_HandleTypeDef; | }ADC_HandleTypeDef; | ||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
/** | |||||
* @brief HAL ADC Callback ID enumeration definition | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
HAL_ADC_CONVERSION_COMPLETE_CB_ID = 0x00U, /*!< ADC conversion complete callback ID */ | |||||
HAL_ADC_CONVERSION_HALF_CB_ID = 0x01U, /*!< ADC conversion DMA half-transfer callback ID */ | |||||
HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID = 0x02U, /*!< ADC analog watchdog 1 callback ID */ | |||||
HAL_ADC_ERROR_CB_ID = 0x03U, /*!< ADC error callback ID */ | |||||
HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID = 0x04U, /*!< ADC group injected conversion complete callback ID */ | |||||
HAL_ADC_MSPINIT_CB_ID = 0x05U, /*!< ADC Msp Init callback ID */ | |||||
HAL_ADC_MSPDEINIT_CB_ID = 0x06U /*!< ADC Msp DeInit callback ID */ | |||||
} HAL_ADC_CallbackIDTypeDef; | |||||
/** | |||||
* @brief HAL ADC Callback pointer definition | |||||
*/ | |||||
typedef void (*pADC_CallbackTypeDef)(ADC_HandleTypeDef *hadc); /*!< pointer to a ADC callback function */ | |||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
/** | /** | ||||
* @} | * @} | ||||
*/ | */ | ||||
enable/disable, erroneous state */ | enable/disable, erroneous state */ | ||||
#define HAL_ADC_ERROR_OVR 0x02U /*!< Overrun error */ | #define HAL_ADC_ERROR_OVR 0x02U /*!< Overrun error */ | ||||
#define HAL_ADC_ERROR_DMA 0x04U /*!< DMA transfer error */ | #define HAL_ADC_ERROR_DMA 0x04U /*!< DMA transfer error */ | ||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
#define HAL_ADC_ERROR_INVALID_CALLBACK (0x10U) /*!< Invalid Callback error */ | |||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
/** | /** | ||||
* @} | * @} | ||||
*/ | */ | ||||
* @param __HANDLE__ ADC handle | * @param __HANDLE__ ADC handle | ||||
* @retval None | * @retval None | ||||
*/ | */ | ||||
#define __HAL_ADC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_ADC_STATE_RESET) | |||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
#define __HAL_ADC_RESET_HANDLE_STATE(__HANDLE__) \ | |||||
do{ \ | |||||
(__HANDLE__)->State = HAL_ADC_STATE_RESET; \ | |||||
(__HANDLE__)->MspInitCallback = NULL; \ | |||||
(__HANDLE__)->MspDeInitCallback = NULL; \ | |||||
} while(0) | |||||
#else | |||||
#define __HAL_ADC_RESET_HANDLE_STATE(__HANDLE__) \ | |||||
((__HANDLE__)->State = HAL_ADC_STATE_RESET) | |||||
#endif | |||||
/** | /** | ||||
* @brief Enable the ADC peripheral. | * @brief Enable the ADC peripheral. | ||||
HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc); | HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc); | ||||
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc); | void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc); | ||||
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc); | void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc); | ||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
/* Callbacks Register/UnRegister functions ***********************************/ | |||||
HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID, pADC_CallbackTypeDef pCallback); | |||||
HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID); | |||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
/** | /** | ||||
* @} | * @} | ||||
*/ | */ |
****************************************************************************** | ****************************************************************************** | ||||
* @attention | * @attention | ||||
* | * | ||||
* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | * | ||||
* Redistribution and use in source and binary forms, with or without modification, | |||||
* are permitted provided that the following conditions are met: | |||||
* 1. Redistributions of source code must retain the above copyright notice, | |||||
* this list of conditions and the following disclaimer. | |||||
* 2. Redistributions in binary form must reproduce the above copyright notice, | |||||
* this list of conditions and the following disclaimer in the documentation | |||||
* and/or other materials provided with the distribution. | |||||
* 3. Neither the name of STMicroelectronics nor the names of its contributors | |||||
* may be used to endorse or promote products derived from this software | |||||
* without specific prior written permission. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
* This software component is licensed by ST under BSD 3-Clause license, | |||||
* the "License"; You may not use this file except in compliance with the | |||||
* License. You may obtain a copy of the License at: | |||||
* opensource.org/licenses/BSD-3-Clause | |||||
* | * | ||||
****************************************************************************** | ****************************************************************************** | ||||
*/ | */ | ||||
*/ | */ | ||||
typedef struct | typedef struct | ||||
{ | { | ||||
uint32_t InjectedChannel; /*!< Selection of ADC channel to configure | |||||
This parameter can be a value of @ref ADC_channels | |||||
Note: Depending on devices, some channels may not be available on package pins. Refer to device datasheet for channels availability. */ | |||||
uint32_t InjectedRank; /*!< Rank in the injected group sequencer | |||||
This parameter must be a value of @ref ADCEx_injected_rank | |||||
Note: In case of need to disable a channel or change order of conversion sequencer, rank containing a previous channel setting can be overwritten by the new channel setting (or parameter number of conversions can be adjusted) */ | |||||
uint32_t InjectedSamplingTime; /*!< Sampling time value to be set for the selected channel. | |||||
Unit: ADC clock cycles | |||||
Conversion time is the addition of sampling time and processing time (12 ADC clock cycles at ADC resolution 12 bits, 11 cycles at 10 bits, 9 cycles at 8 bits, 7 cycles at 6 bits). | |||||
This parameter can be a value of @ref ADC_sampling_times | |||||
Caution: This parameter updates the parameter property of the channel, that can be used into regular and/or injected groups. | |||||
If this same channel has been previously configured in the other group (regular/injected), it will be updated to last setting. | |||||
Note: In case of usage of internal measurement channels (VrefInt/Vbat/TempSensor), | |||||
sampling time constraints must be respected (sampling time can be adjusted in function of ADC clock frequency and sampling time setting) | |||||
Refer to device datasheet for timings values, parameters TS_vrefint, TS_temp (values rough order: 4us min). */ | |||||
uint32_t InjectedOffset; /*!< Defines the offset to be subtracted from the raw converted data (for channels set on injected group only). | |||||
Offset value must be a positive number. | |||||
Depending of ADC resolution selected (12, 10, 8 or 6 bits), | |||||
this parameter must be a number between Min_Data = 0x000 and Max_Data = 0xFFF, 0x3FF, 0xFF or 0x3F respectively. */ | |||||
uint32_t InjectedNbrOfConversion; /*!< Specifies the number of ranks that will be converted within the injected group sequencer. | |||||
To use the injected group sequencer and convert several ranks, parameter 'ScanConvMode' must be enabled. | |||||
This parameter must be a number between Min_Data = 1 and Max_Data = 4. | |||||
Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to | |||||
configure a channel on injected group can impact the configuration of other channels previously set. */ | |||||
uint32_t InjectedDiscontinuousConvMode; /*!< Specifies whether the conversions sequence of injected group is performed in Complete-sequence/Discontinuous-sequence (main sequence subdivided in successive parts). | |||||
Discontinuous mode is used only if sequencer is enabled (parameter 'ScanConvMode'). If sequencer is disabled, this parameter is discarded. | |||||
Discontinuous mode can be enabled only if continuous mode is disabled. If continuous mode is enabled, this parameter setting is discarded. | |||||
This parameter can be set to ENABLE or DISABLE. | |||||
Note: For injected group, number of discontinuous ranks increment is fixed to one-by-one. | |||||
Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to | |||||
configure a channel on injected group can impact the configuration of other channels previously set. */ | |||||
uint32_t AutoInjectedConv; /*!< Enables or disables the selected ADC automatic injected group conversion after regular one | |||||
This parameter can be set to ENABLE or DISABLE. | |||||
Note: To use Automatic injected conversion, discontinuous mode must be disabled ('DiscontinuousConvMode' and 'InjectedDiscontinuousConvMode' set to DISABLE) | |||||
Note: To use Automatic injected conversion, injected group external triggers must be disabled ('ExternalTrigInjecConv' set to ADC_SOFTWARE_START) | |||||
Note: In case of DMA used with regular group: if DMA configured in normal mode (single shot) JAUTO will be stopped upon DMA transfer complete. | |||||
To maintain JAUTO always enabled, DMA must be configured in circular mode. | |||||
Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to | |||||
configure a channel on injected group can impact the configuration of other channels previously set. */ | |||||
uint32_t ExternalTrigInjecConv; /*!< Selects the external event used to trigger the conversion start of injected group. | |||||
If set to ADC_INJECTED_SOFTWARE_START, external triggers are disabled. | |||||
If set to external trigger source, triggering is on event rising edge. | |||||
This parameter can be a value of @ref ADCEx_External_trigger_Source_Injected | |||||
Note: This parameter must be modified when ADC is disabled (before ADC start conversion or after ADC stop conversion). | |||||
If ADC is enabled, this parameter setting is bypassed without error reporting (as it can be the expected behaviour in case of another parameter update on the fly) | |||||
Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to | |||||
configure a channel on injected group can impact the configuration of other channels previously set. */ | |||||
uint32_t ExternalTrigInjecConvEdge; /*!< Selects the external trigger edge of injected group. | |||||
This parameter can be a value of @ref ADCEx_External_trigger_edge_Injected. | |||||
If trigger is set to ADC_INJECTED_SOFTWARE_START, this parameter is discarded. | |||||
Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to | |||||
configure a channel on injected group can impact the configuration of other channels previously set. */ | |||||
uint32_t InjectedChannel; /*!< Selection of ADC channel to configure | |||||
This parameter can be a value of @ref ADC_channels | |||||
Note: Depending on devices, some channels may not be available on package pins. Refer to device datasheet for channels availability. */ | |||||
uint32_t InjectedRank; /*!< Rank in the injected group sequencer | |||||
This parameter must be a value of @ref ADCEx_injected_rank | |||||
Note: In case of need to disable a channel or change order of conversion sequencer, rank containing a previous channel setting can be overwritten by the new channel setting (or parameter number of conversions can be adjusted) */ | |||||
uint32_t InjectedSamplingTime; /*!< Sampling time value to be set for the selected channel. | |||||
Unit: ADC clock cycles | |||||
Conversion time is the addition of sampling time and processing time (12 ADC clock cycles at ADC resolution 12 bits, 11 cycles at 10 bits, 9 cycles at 8 bits, 7 cycles at 6 bits). | |||||
This parameter can be a value of @ref ADC_sampling_times | |||||
Caution: This parameter updates the parameter property of the channel, that can be used into regular and/or injected groups. | |||||
If this same channel has been previously configured in the other group (regular/injected), it will be updated to last setting. | |||||
Note: In case of usage of internal measurement channels (VrefInt/Vbat/TempSensor), | |||||
sampling time constraints must be respected (sampling time can be adjusted in function of ADC clock frequency and sampling time setting) | |||||
Refer to device datasheet for timings values, parameters TS_vrefint, TS_temp (values rough order: 4us min). */ | |||||
uint32_t InjectedOffset; /*!< Defines the offset to be subtracted from the raw converted data (for channels set on injected group only). | |||||
Offset value must be a positive number. | |||||
Depending of ADC resolution selected (12, 10, 8 or 6 bits), | |||||
this parameter must be a number between Min_Data = 0x000 and Max_Data = 0xFFF, 0x3FF, 0xFF or 0x3F respectively. */ | |||||
uint32_t InjectedNbrOfConversion; /*!< Specifies the number of ranks that will be converted within the injected group sequencer. | |||||
To use the injected group sequencer and convert several ranks, parameter 'ScanConvMode' must be enabled. | |||||
This parameter must be a number between Min_Data = 1 and Max_Data = 4. | |||||
Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to | |||||
configure a channel on injected group can impact the configuration of other channels previously set. */ | |||||
FunctionalState InjectedDiscontinuousConvMode; /*!< Specifies whether the conversions sequence of injected group is performed in Complete-sequence/Discontinuous-sequence (main sequence subdivided in successive parts). | |||||
Discontinuous mode is used only if sequencer is enabled (parameter 'ScanConvMode'). If sequencer is disabled, this parameter is discarded. | |||||
Discontinuous mode can be enabled only if continuous mode is disabled. If continuous mode is enabled, this parameter setting is discarded. | |||||
This parameter can be set to ENABLE or DISABLE. | |||||
Note: For injected group, number of discontinuous ranks increment is fixed to one-by-one. | |||||
Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to | |||||
configure a channel on injected group can impact the configuration of other channels previously set. */ | |||||
FunctionalState AutoInjectedConv; /*!< Enables or disables the selected ADC automatic injected group conversion after regular one | |||||
This parameter can be set to ENABLE or DISABLE. | |||||
Note: To use Automatic injected conversion, discontinuous mode must be disabled ('DiscontinuousConvMode' and 'InjectedDiscontinuousConvMode' set to DISABLE) | |||||
Note: To use Automatic injected conversion, injected group external triggers must be disabled ('ExternalTrigInjecConv' set to ADC_SOFTWARE_START) | |||||
Note: In case of DMA used with regular group: if DMA configured in normal mode (single shot) JAUTO will be stopped upon DMA transfer complete. | |||||
To maintain JAUTO always enabled, DMA must be configured in circular mode. | |||||
Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to | |||||
configure a channel on injected group can impact the configuration of other channels previously set. */ | |||||
uint32_t ExternalTrigInjecConv; /*!< Selects the external event used to trigger the conversion start of injected group. | |||||
If set to ADC_INJECTED_SOFTWARE_START, external triggers are disabled. | |||||
If set to external trigger source, triggering is on event rising edge. | |||||
This parameter can be a value of @ref ADCEx_External_trigger_Source_Injected | |||||
Note: This parameter must be modified when ADC is disabled (before ADC start conversion or after ADC stop conversion). | |||||
If ADC is enabled, this parameter setting is bypassed without error reporting (as it can be the expected behaviour in case of another parameter update on the fly) | |||||
Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to | |||||
configure a channel on injected group can impact the configuration of other channels previously set. */ | |||||
uint32_t ExternalTrigInjecConvEdge; /*!< Selects the external trigger edge of injected group. | |||||
This parameter can be a value of @ref ADCEx_External_trigger_edge_Injected. | |||||
If trigger is set to ADC_INJECTED_SOFTWARE_START, this parameter is discarded. | |||||
Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to | |||||
configure a channel on injected group can impact the configuration of other channels previously set. */ | |||||
}ADC_InjectionConfTypeDef; | }ADC_InjectionConfTypeDef; | ||||
/** | /** | ||||
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F410xx || STM32F412Zx || | #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F410xx || STM32F412Zx || | ||||
STM32F412Vx || STM32F412Rx || STM32F412Cx */ | STM32F412Vx || STM32F412Rx || STM32F412Cx */ | ||||
#if defined(STM32F413xx) || defined(STM32F423xx) | |||||
#define ADC_CHANNEL_TEMPSENSOR ((uint32_t)ADC_CHANNEL_18) | |||||
#endif /* STM32F413xx || STM32F423xx */ | |||||
#if defined(STM32F411xE) || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ | |||||
defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) | |||||
#if defined(STM32F411xE) || defined(STM32F413xx) || defined(STM32F423xx) || defined(STM32F427xx) || defined(STM32F437xx) ||\ | |||||
defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) | |||||
#define ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT 0x10000000U /* Dummy bit for driver internal usage, not used in ADC channel setting registers CR1 or SQRx */ | #define ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT 0x10000000U /* Dummy bit for driver internal usage, not used in ADC channel setting registers CR1 or SQRx */ | ||||
#define ADC_CHANNEL_TEMPSENSOR ((uint32_t)ADC_CHANNEL_18 | ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT) | #define ADC_CHANNEL_TEMPSENSOR ((uint32_t)ADC_CHANNEL_18 | ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT) | ||||
#endif /* STM32F411xE || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ | |||||
#endif /* STM32F411xE || STM32F413xx || STM32F423xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ | |||||
/** | /** | ||||
* @} | * @} | ||||
*/ | */ |
(#) Optionally, in case of usage of DMA: | (#) Optionally, in case of usage of DMA: | ||||
(++) Deinitialize the DMA using function HAL_DMA_DeInit(). | (++) Deinitialize the DMA using function HAL_DMA_DeInit(). | ||||
(++) Disable the NVIC for DMA using function HAL_NVIC_DisableIRQ(DMAx_Channelx_IRQn) | (++) Disable the NVIC for DMA using function HAL_NVIC_DisableIRQ(DMAx_Channelx_IRQn) | ||||
*** Callback registration *** | |||||
============================================================================== | |||||
[..] | |||||
The compilation flag USE_HAL_ADC_REGISTER_CALLBACKS, when set to 1, | |||||
allows the user to configure dynamically the driver callbacks. | |||||
Use Functions @ref HAL_ADC_RegisterCallback() | |||||
to register an interrupt callback. | |||||
[..] | |||||
Function @ref HAL_ADC_RegisterCallback() allows to register following callbacks: | |||||
(+) ConvCpltCallback : ADC conversion complete callback | |||||
(+) ConvHalfCpltCallback : ADC conversion DMA half-transfer callback | |||||
(+) LevelOutOfWindowCallback : ADC analog watchdog 1 callback | |||||
(+) ErrorCallback : ADC error callback | |||||
(+) InjectedConvCpltCallback : ADC group injected conversion complete callback | |||||
(+) InjectedQueueOverflowCallback : ADC group injected context queue overflow callback | |||||
(+) LevelOutOfWindow2Callback : ADC analog watchdog 2 callback | |||||
(+) LevelOutOfWindow3Callback : ADC analog watchdog 3 callback | |||||
(+) EndOfSamplingCallback : ADC end of sampling callback | |||||
(+) MspInitCallback : ADC Msp Init callback | |||||
(+) MspDeInitCallback : ADC Msp DeInit callback | |||||
This function takes as parameters the HAL peripheral handle, the Callback ID | |||||
and a pointer to the user callback function. | |||||
[..] | |||||
Use function @ref HAL_ADC_UnRegisterCallback to reset a callback to the default | |||||
weak function. | |||||
[..] | |||||
@ref HAL_ADC_UnRegisterCallback takes as parameters the HAL peripheral handle, | |||||
and the Callback ID. | |||||
This function allows to reset following callbacks: | |||||
(+) ConvCpltCallback : ADC conversion complete callback | |||||
(+) ConvHalfCpltCallback : ADC conversion DMA half-transfer callback | |||||
(+) LevelOutOfWindowCallback : ADC analog watchdog 1 callback | |||||
(+) ErrorCallback : ADC error callback | |||||
(+) InjectedConvCpltCallback : ADC group injected conversion complete callback | |||||
(+) InjectedQueueOverflowCallback : ADC group injected context queue overflow callback | |||||
(+) LevelOutOfWindow2Callback : ADC analog watchdog 2 callback | |||||
(+) LevelOutOfWindow3Callback : ADC analog watchdog 3 callback | |||||
(+) EndOfSamplingCallback : ADC end of sampling callback | |||||
(+) MspInitCallback : ADC Msp Init callback | |||||
(+) MspDeInitCallback : ADC Msp DeInit callback | |||||
[..] | |||||
By default, after the @ref HAL_ADC_Init() and when the state is @ref HAL_ADC_STATE_RESET | |||||
all callbacks are set to the corresponding weak functions: | |||||
examples @ref HAL_ADC_ConvCpltCallback(), @ref HAL_ADC_ErrorCallback(). | |||||
Exception done for MspInit and MspDeInit functions that are | |||||
reset to the legacy weak functions in the @ref HAL_ADC_Init()/ @ref HAL_ADC_DeInit() only when | |||||
these callbacks are null (not registered beforehand). | |||||
[..] | |||||
If MspInit or MspDeInit are not null, the @ref HAL_ADC_Init()/ @ref HAL_ADC_DeInit() | |||||
keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. | |||||
[..] | |||||
Callbacks can be registered/unregistered in @ref HAL_ADC_STATE_READY state only. | |||||
Exception done MspInit/MspDeInit functions that can be registered/unregistered | |||||
in @ref HAL_ADC_STATE_READY or @ref HAL_ADC_STATE_RESET state, | |||||
thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. | |||||
[..] | |||||
Then, the user first registers the MspInit/MspDeInit user callbacks | |||||
using @ref HAL_ADC_RegisterCallback() before calling @ref HAL_ADC_DeInit() | |||||
or @ref HAL_ADC_Init() function. | |||||
[..] | |||||
When the compilation flag USE_HAL_ADC_REGISTER_CALLBACKS is set to 0 or | |||||
not defined, the callback registration feature is not available and all callbacks | |||||
are set to the corresponding weak functions. | |||||
@endverbatim | @endverbatim | ||||
****************************************************************************** | ****************************************************************************** | ||||
* @attention | * @attention | ||||
* | * | ||||
* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | * | ||||
* Redistribution and use in source and binary forms, with or without modification, | |||||
* are permitted provided that the following conditions are met: | |||||
* 1. Redistributions of source code must retain the above copyright notice, | |||||
* this list of conditions and the following disclaimer. | |||||
* 2. Redistributions in binary form must reproduce the above copyright notice, | |||||
* this list of conditions and the following disclaimer in the documentation | |||||
* and/or other materials provided with the distribution. | |||||
* 3. Neither the name of STMicroelectronics nor the names of its contributors | |||||
* may be used to endorse or promote products derived from this software | |||||
* without specific prior written permission. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
* This software component is licensed by ST under BSD 3-Clause license, | |||||
* the "License"; You may not use this file except in compliance with the | |||||
* License. You may obtain a copy of the License at: | |||||
* opensource.org/licenses/BSD-3-Clause | |||||
* | * | ||||
****************************************************************************** | ****************************************************************************** | ||||
*/ | */ | ||||
if(hadc->State == HAL_ADC_STATE_RESET) | if(hadc->State == HAL_ADC_STATE_RESET) | ||||
{ | { | ||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
/* Init the ADC Callback settings */ | |||||
hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback; /* Legacy weak callback */ | |||||
hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback; /* Legacy weak callback */ | |||||
hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback; /* Legacy weak callback */ | |||||
hadc->ErrorCallback = HAL_ADC_ErrorCallback; /* Legacy weak callback */ | |||||
hadc->InjectedConvCpltCallback = HAL_ADCEx_InjectedConvCpltCallback; /* Legacy weak callback */ | |||||
if (hadc->MspInitCallback == NULL) | |||||
{ | |||||
hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */ | |||||
} | |||||
/* Init the low level hardware */ | |||||
hadc->MspInitCallback(hadc); | |||||
#else | |||||
/* Init the low level hardware */ | |||||
HAL_ADC_MspInit(hadc); | |||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
/* Initialize ADC error code */ | /* Initialize ADC error code */ | ||||
ADC_CLEAR_ERRORCODE(hadc); | ADC_CLEAR_ERRORCODE(hadc); | ||||
/* Allocate lock resource and initialize it */ | /* Allocate lock resource and initialize it */ | ||||
hadc->Lock = HAL_UNLOCKED; | hadc->Lock = HAL_UNLOCKED; | ||||
/* Init the low level hardware */ | |||||
HAL_ADC_MspInit(hadc); | |||||
} | } | ||||
/* Configuration of ADC parameters if previous preliminary actions are */ | /* Configuration of ADC parameters if previous preliminary actions are */ | ||||
/* correctly completed. */ | /* correctly completed. */ | ||||
if(HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON)) | if(HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON)) | ||||
{ | { | ||||
/* DeInit the low level hardware */ | |||||
HAL_ADC_MspDeInit(hadc); | |||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
if (hadc->MspDeInitCallback == NULL) | |||||
{ | |||||
hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */ | |||||
} | |||||
/* DeInit the low level hardware: RCC clock, NVIC */ | |||||
hadc->MspDeInitCallback(hadc); | |||||
#else | |||||
/* DeInit the low level hardware: RCC clock, NVIC */ | |||||
HAL_ADC_MspDeInit(hadc); | |||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
/* Set ADC error code to none */ | /* Set ADC error code to none */ | ||||
ADC_CLEAR_ERRORCODE(hadc); | ADC_CLEAR_ERRORCODE(hadc); | ||||
return tmp_hal_status; | return tmp_hal_status; | ||||
} | } | ||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
/** | |||||
* @brief Register a User ADC Callback | |||||
* To be used instead of the weak predefined callback | |||||
* @param hadc Pointer to a ADC_HandleTypeDef structure that contains | |||||
* the configuration information for the specified ADC. | |||||
* @param CallbackID ID of the callback to be registered | |||||
* This parameter can be one of the following values: | |||||
* @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID ADC conversion complete callback ID | |||||
* @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID ADC conversion DMA half-transfer callback ID | |||||
* @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID ADC analog watchdog 1 callback ID | |||||
* @arg @ref HAL_ADC_ERROR_CB_ID ADC error callback ID | |||||
* @arg @ref HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID ADC group injected conversion complete callback ID | |||||
* @arg @ref HAL_ADC_MSPINIT_CB_ID ADC Msp Init callback ID | |||||
* @arg @ref HAL_ADC_MSPDEINIT_CB_ID ADC Msp DeInit callback ID | |||||
* @param pCallback pointer to the Callback function | |||||
* @retval HAL status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID, pADC_CallbackTypeDef pCallback) | |||||
{ | |||||
HAL_StatusTypeDef status = HAL_OK; | |||||
if (pCallback == NULL) | |||||
{ | |||||
/* Update the error code */ | |||||
hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; | |||||
return HAL_ERROR; | |||||
} | |||||
if ((hadc->State & HAL_ADC_STATE_READY) != 0UL) | |||||
{ | |||||
switch (CallbackID) | |||||
{ | |||||
case HAL_ADC_CONVERSION_COMPLETE_CB_ID : | |||||
hadc->ConvCpltCallback = pCallback; | |||||
break; | |||||
case HAL_ADC_CONVERSION_HALF_CB_ID : | |||||
hadc->ConvHalfCpltCallback = pCallback; | |||||
break; | |||||
case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID : | |||||
hadc->LevelOutOfWindowCallback = pCallback; | |||||
break; | |||||
case HAL_ADC_ERROR_CB_ID : | |||||
hadc->ErrorCallback = pCallback; | |||||
break; | |||||
case HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID : | |||||
hadc->InjectedConvCpltCallback = pCallback; | |||||
break; | |||||
case HAL_ADC_MSPINIT_CB_ID : | |||||
hadc->MspInitCallback = pCallback; | |||||
break; | |||||
case HAL_ADC_MSPDEINIT_CB_ID : | |||||
hadc->MspDeInitCallback = pCallback; | |||||
break; | |||||
default : | |||||
/* Update the error code */ | |||||
hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; | |||||
/* Return error status */ | |||||
status = HAL_ERROR; | |||||
break; | |||||
} | |||||
} | |||||
else if (HAL_ADC_STATE_RESET == hadc->State) | |||||
{ | |||||
switch (CallbackID) | |||||
{ | |||||
case HAL_ADC_MSPINIT_CB_ID : | |||||
hadc->MspInitCallback = pCallback; | |||||
break; | |||||
case HAL_ADC_MSPDEINIT_CB_ID : | |||||
hadc->MspDeInitCallback = pCallback; | |||||
break; | |||||
default : | |||||
/* Update the error code */ | |||||
hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; | |||||
/* Return error status */ | |||||
status = HAL_ERROR; | |||||
break; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
/* Update the error code */ | |||||
hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; | |||||
/* Return error status */ | |||||
status = HAL_ERROR; | |||||
} | |||||
return status; | |||||
} | |||||
/** | |||||
* @brief Unregister a ADC Callback | |||||
* ADC callback is redirected to the weak predefined callback | |||||
* @param hadc Pointer to a ADC_HandleTypeDef structure that contains | |||||
* the configuration information for the specified ADC. | |||||
* @param CallbackID ID of the callback to be unregistered | |||||
* This parameter can be one of the following values: | |||||
* @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID ADC conversion complete callback ID | |||||
* @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID ADC conversion DMA half-transfer callback ID | |||||
* @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID ADC analog watchdog 1 callback ID | |||||
* @arg @ref HAL_ADC_ERROR_CB_ID ADC error callback ID | |||||
* @arg @ref HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID ADC group injected conversion complete callback ID | |||||
* @arg @ref HAL_ADC_MSPINIT_CB_ID ADC Msp Init callback ID | |||||
* @arg @ref HAL_ADC_MSPDEINIT_CB_ID ADC Msp DeInit callback ID | |||||
* @retval HAL status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID) | |||||
{ | |||||
HAL_StatusTypeDef status = HAL_OK; | |||||
if ((hadc->State & HAL_ADC_STATE_READY) != 0UL) | |||||
{ | |||||
switch (CallbackID) | |||||
{ | |||||
case HAL_ADC_CONVERSION_COMPLETE_CB_ID : | |||||
hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback; | |||||
break; | |||||
case HAL_ADC_CONVERSION_HALF_CB_ID : | |||||
hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback; | |||||
break; | |||||
case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID : | |||||
hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback; | |||||
break; | |||||
case HAL_ADC_ERROR_CB_ID : | |||||
hadc->ErrorCallback = HAL_ADC_ErrorCallback; | |||||
break; | |||||
case HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID : | |||||
hadc->InjectedConvCpltCallback = HAL_ADCEx_InjectedConvCpltCallback; | |||||
break; | |||||
case HAL_ADC_MSPINIT_CB_ID : | |||||
hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */ | |||||
break; | |||||
case HAL_ADC_MSPDEINIT_CB_ID : | |||||
hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */ | |||||
break; | |||||
default : | |||||
/* Update the error code */ | |||||
hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; | |||||
/* Return error status */ | |||||
status = HAL_ERROR; | |||||
break; | |||||
} | |||||
} | |||||
else if (HAL_ADC_STATE_RESET == hadc->State) | |||||
{ | |||||
switch (CallbackID) | |||||
{ | |||||
case HAL_ADC_MSPINIT_CB_ID : | |||||
hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */ | |||||
break; | |||||
case HAL_ADC_MSPDEINIT_CB_ID : | |||||
hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */ | |||||
break; | |||||
default : | |||||
/* Update the error code */ | |||||
hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; | |||||
/* Return error status */ | |||||
status = HAL_ERROR; | |||||
break; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
/* Update the error code */ | |||||
hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK; | |||||
/* Return error status */ | |||||
status = HAL_ERROR; | |||||
} | |||||
return status; | |||||
} | |||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
/** | /** | ||||
* @brief Initializes the ADC MSP. | * @brief Initializes the ADC MSP. | ||||
* @param hadc pointer to a ADC_HandleTypeDef structure that contains | * @param hadc pointer to a ADC_HandleTypeDef structure that contains | ||||
/* Check if Multimode enabled */ | /* Check if Multimode enabled */ | ||||
if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) | if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) | ||||
{ | { | ||||
/* if no external trigger present enable software conversion of regular channels */ | |||||
if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) | |||||
#if defined(ADC2) && defined(ADC3) | |||||
if((hadc->Instance == ADC1) || ((hadc->Instance == ADC2) && ((ADC->CCR & ADC_CCR_MULTI_Msk) < ADC_CCR_MULTI_0)) \ | |||||
|| ((hadc->Instance == ADC3) && ((ADC->CCR & ADC_CCR_MULTI_Msk) < ADC_CCR_MULTI_4))) | |||||
{ | { | ||||
/* Enable the selected ADC software conversion for regular group */ | |||||
hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; | |||||
#endif /* ADC2 || ADC3 */ | |||||
/* if no external trigger present enable software conversion of regular channels */ | |||||
if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) | |||||
{ | |||||
/* Enable the selected ADC software conversion for regular group */ | |||||
hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; | |||||
} | |||||
#if defined(ADC2) && defined(ADC3) | |||||
} | } | ||||
#endif /* ADC2 || ADC3 */ | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
/* Check if Multimode enabled */ | /* Check if Multimode enabled */ | ||||
if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) | if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) | ||||
{ | { | ||||
/* if no external trigger present enable software conversion of regular channels */ | |||||
if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) | |||||
#if defined(ADC2) && defined(ADC3) | |||||
if((hadc->Instance == ADC1) || ((hadc->Instance == ADC2) && ((ADC->CCR & ADC_CCR_MULTI_Msk) < ADC_CCR_MULTI_0)) \ | |||||
|| ((hadc->Instance == ADC3) && ((ADC->CCR & ADC_CCR_MULTI_Msk) < ADC_CCR_MULTI_4))) | |||||
{ | { | ||||
/* Enable the selected ADC software conversion for regular group */ | |||||
hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; | |||||
#endif /* ADC2 || ADC3 */ | |||||
/* if no external trigger present enable software conversion of regular channels */ | |||||
if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) | |||||
{ | |||||
/* Enable the selected ADC software conversion for regular group */ | |||||
hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; | |||||
} | |||||
#if defined(ADC2) && defined(ADC3) | |||||
} | } | ||||
#endif /* ADC2 || ADC3 */ | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
} | } | ||||
} | } | ||||
/* Conversion complete callback */ | |||||
/* Conversion complete callback */ | |||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
hadc->ConvCpltCallback(hadc); | |||||
#else | |||||
HAL_ADC_ConvCpltCallback(hadc); | HAL_ADC_ConvCpltCallback(hadc); | ||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
/* Clear regular group conversion flag */ | /* Clear regular group conversion flag */ | ||||
__HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_STRT | ADC_FLAG_EOC); | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_STRT | ADC_FLAG_EOC); | ||||
} | } | ||||
/* Conversion complete callback */ | /* Conversion complete callback */ | ||||
HAL_ADCEx_InjectedConvCpltCallback(hadc); | |||||
/* Conversion complete callback */ | |||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
hadc->InjectedConvCpltCallback(hadc); | |||||
#else | |||||
HAL_ADCEx_InjectedConvCpltCallback(hadc); | |||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
/* Clear injected group conversion flag */ | /* Clear injected group conversion flag */ | ||||
__HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_JSTRT | ADC_FLAG_JEOC)); | __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_JSTRT | ADC_FLAG_JEOC)); | ||||
/* Set ADC state */ | /* Set ADC state */ | ||||
SET_BIT(hadc->State, HAL_ADC_STATE_AWD1); | SET_BIT(hadc->State, HAL_ADC_STATE_AWD1); | ||||
/* Level out of window callback */ | |||||
/* Level out of window callback */ | |||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
hadc->LevelOutOfWindowCallback(hadc); | |||||
#else | |||||
HAL_ADC_LevelOutOfWindowCallback(hadc); | HAL_ADC_LevelOutOfWindowCallback(hadc); | ||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
/* Clear the ADC analog watchdog flag */ | /* Clear the ADC analog watchdog flag */ | ||||
__HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD); | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD); | ||||
__HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR); | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR); | ||||
/* Error callback */ | /* Error callback */ | ||||
HAL_ADC_ErrorCallback(hadc); | |||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
hadc->ErrorCallback(hadc); | |||||
#else | |||||
HAL_ADC_ErrorCallback(hadc); | |||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
/* Clear the Overrun flag */ | /* Clear the Overrun flag */ | ||||
__HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR); | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR); | ||||
/* Check if Multimode enabled */ | /* Check if Multimode enabled */ | ||||
if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) | if(HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_MULTI)) | ||||
{ | { | ||||
/* if no external trigger present enable software conversion of regular channels */ | |||||
if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) | |||||
#if defined(ADC2) && defined(ADC3) | |||||
if((hadc->Instance == ADC1) || ((hadc->Instance == ADC2) && ((ADC->CCR & ADC_CCR_MULTI_Msk) < ADC_CCR_MULTI_0)) \ | |||||
|| ((hadc->Instance == ADC3) && ((ADC->CCR & ADC_CCR_MULTI_Msk) < ADC_CCR_MULTI_4))) | |||||
{ | { | ||||
/* Enable the selected ADC software conversion for regular group */ | |||||
hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; | |||||
#endif /* ADC2 || ADC3 */ | |||||
/* if no external trigger present enable software conversion of regular channels */ | |||||
if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET) | |||||
{ | |||||
/* Enable the selected ADC software conversion for regular group */ | |||||
hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART; | |||||
} | |||||
#if defined(ADC2) && defined(ADC3) | |||||
} | } | ||||
#endif /* ADC2 || ADC3 */ | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
/* control register) */ | /* control register) */ | ||||
tmpADC_Common = ADC_COMMON_REGISTER(hadc); | tmpADC_Common = ADC_COMMON_REGISTER(hadc); | ||||
/* if ADC1 Channel_18 is selected enable VBAT Channel */ | |||||
/* if ADC1 Channel_18 is selected for VBAT Channel ennable VBATE */ | |||||
if ((hadc->Instance == ADC1) && (sConfig->Channel == ADC_CHANNEL_VBAT)) | if ((hadc->Instance == ADC1) && (sConfig->Channel == ADC_CHANNEL_VBAT)) | ||||
{ | { | ||||
/* Disable the TEMPSENSOR channel in case of using board with multiplixed ADC_CHANNEL_VBAT & ADC_CHANNEL_TEMPSENSOR*/ | |||||
if ((uint16_t)ADC_CHANNEL_TEMPSENSOR == (uint16_t)ADC_CHANNEL_VBAT) | |||||
{ | |||||
tmpADC_Common->CCR &= ~ADC_CCR_TSVREFE; | |||||
} | |||||
/* Enable the VBAT channel*/ | /* Enable the VBAT channel*/ | ||||
tmpADC_Common->CCR |= ADC_CCR_VBATE; | tmpADC_Common->CCR |= ADC_CCR_VBATE; | ||||
} | } | ||||
/* if ADC1 Channel_16 or Channel_17 is selected enable TSVREFE Channel(Temperature sensor and VREFINT) */ | |||||
/* if ADC1 Channel_16 or Channel_18 is selected for Temperature sensor or | |||||
Channel_17 is selected for VREFINT enable TSVREFE */ | |||||
if ((hadc->Instance == ADC1) && ((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR) || (sConfig->Channel == ADC_CHANNEL_VREFINT))) | if ((hadc->Instance == ADC1) && ((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR) || (sConfig->Channel == ADC_CHANNEL_VREFINT))) | ||||
{ | { | ||||
/* Enable the TSVREFE channel*/ | |||||
/* Disable the VBAT channel in case of using board with multiplixed ADC_CHANNEL_VBAT & ADC_CHANNEL_TEMPSENSOR*/ | |||||
if ((uint16_t)ADC_CHANNEL_TEMPSENSOR == (uint16_t)ADC_CHANNEL_VBAT) | |||||
{ | |||||
tmpADC_Common->CCR &= ~ADC_CCR_VBATE; | |||||
} | |||||
/* Enable the Temperature sensor and VREFINT channel*/ | |||||
tmpADC_Common->CCR |= ADC_CCR_TSVREFE; | tmpADC_Common->CCR |= ADC_CCR_TSVREFE; | ||||
if((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR)) | if((sConfig->Channel == ADC_CHANNEL_TEMPSENSOR)) | ||||
/* Enable or disable ADC continuous conversion mode */ | /* Enable or disable ADC continuous conversion mode */ | ||||
hadc->Instance->CR2 &= ~(ADC_CR2_CONT); | hadc->Instance->CR2 &= ~(ADC_CR2_CONT); | ||||
hadc->Instance->CR2 |= ADC_CR2_CONTINUOUS(hadc->Init.ContinuousConvMode); | |||||
hadc->Instance->CR2 |= ADC_CR2_CONTINUOUS((uint32_t)hadc->Init.ContinuousConvMode); | |||||
if(hadc->Init.DiscontinuousConvMode != DISABLE) | if(hadc->Init.DiscontinuousConvMode != DISABLE) | ||||
{ | { | ||||
/* Enable or disable ADC DMA continuous request */ | /* Enable or disable ADC DMA continuous request */ | ||||
hadc->Instance->CR2 &= ~(ADC_CR2_DDS); | hadc->Instance->CR2 &= ~(ADC_CR2_DDS); | ||||
hadc->Instance->CR2 |= ADC_CR2_DMAContReq(hadc->Init.DMAContinuousRequests); | |||||
hadc->Instance->CR2 |= ADC_CR2_DMAContReq((uint32_t)hadc->Init.DMAContinuousRequests); | |||||
/* Enable or disable ADC end of conversion selection */ | /* Enable or disable ADC end of conversion selection */ | ||||
hadc->Instance->CR2 &= ~(ADC_CR2_EOCS); | hadc->Instance->CR2 &= ~(ADC_CR2_EOCS); | ||||
} | } | ||||
/* Conversion complete callback */ | /* Conversion complete callback */ | ||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
hadc->ConvCpltCallback(hadc); | |||||
#else | |||||
HAL_ADC_ConvCpltCallback(hadc); | HAL_ADC_ConvCpltCallback(hadc); | ||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
} | } | ||||
else | |||||
else /* DMA and-or internal error occurred */ | |||||
{ | { | ||||
/* Call DMA error callback */ | |||||
hadc->DMA_Handle->XferErrorCallback(hdma); | |||||
if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) != 0UL) | |||||
{ | |||||
/* Call HAL ADC Error Callback function */ | |||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
hadc->ErrorCallback(hadc); | |||||
#else | |||||
HAL_ADC_ErrorCallback(hadc); | |||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
} | |||||
else | |||||
{ | |||||
/* Call DMA error callback */ | |||||
hadc->DMA_Handle->XferErrorCallback(hdma); | |||||
} | |||||
} | } | ||||
} | } | ||||
static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma) | static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma) | ||||
{ | { | ||||
ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; | ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; | ||||
/* Conversion complete callback */ | |||||
HAL_ADC_ConvHalfCpltCallback(hadc); | |||||
/* Half conversion callback */ | |||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
hadc->ConvHalfCpltCallback(hadc); | |||||
#else | |||||
HAL_ADC_ConvHalfCpltCallback(hadc); | |||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
} | } | ||||
/** | /** | ||||
hadc->State= HAL_ADC_STATE_ERROR_DMA; | hadc->State= HAL_ADC_STATE_ERROR_DMA; | ||||
/* Set ADC error code to DMA error */ | /* Set ADC error code to DMA error */ | ||||
hadc->ErrorCode |= HAL_ADC_ERROR_DMA; | hadc->ErrorCode |= HAL_ADC_ERROR_DMA; | ||||
HAL_ADC_ErrorCallback(hadc); | |||||
/* Error callback */ | |||||
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) | |||||
hadc->ErrorCallback(hadc); | |||||
#else | |||||
HAL_ADC_ErrorCallback(hadc); | |||||
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */ | |||||
} | } | ||||
/** | /** |
****************************************************************************** | ****************************************************************************** | ||||
* @file stm32f4xx_hal_adc_ex.c | * @file stm32f4xx_hal_adc_ex.c | ||||
* @author MCD Application Team | * @author MCD Application Team | ||||
* @brief This file provides firmware functions to manage the following | |||||
* @brief This file provides firmware functions to manage the following | |||||
* functionalities of the ADC extension peripheral: | * functionalities of the ADC extension peripheral: | ||||
* + Extended features functions | * + Extended features functions | ||||
* | |||||
* | |||||
@verbatim | @verbatim | ||||
============================================================================== | ============================================================================== | ||||
##### How to use this driver ##### | ##### How to use this driver ##### | ||||
(##) Enable the ADC interface clock using __HAL_RCC_ADC_CLK_ENABLE() | (##) Enable the ADC interface clock using __HAL_RCC_ADC_CLK_ENABLE() | ||||
(##) ADC pins configuration | (##) ADC pins configuration | ||||
(+++) Enable the clock for the ADC GPIOs using the following function: | (+++) Enable the clock for the ADC GPIOs using the following function: | ||||
__HAL_RCC_GPIOx_CLK_ENABLE() | |||||
(+++) Configure these ADC pins in analog mode using HAL_GPIO_Init() | |||||
__HAL_RCC_GPIOx_CLK_ENABLE() | |||||
(+++) Configure these ADC pins in analog mode using HAL_GPIO_Init() | |||||
(##) In case of using interrupts (e.g. HAL_ADC_Start_IT()) | (##) In case of using interrupts (e.g. HAL_ADC_Start_IT()) | ||||
(+++) Configure the ADC interrupt priority using HAL_NVIC_SetPriority() | (+++) Configure the ADC interrupt priority using HAL_NVIC_SetPriority() | ||||
(+++) Enable the ADC IRQ handler using HAL_NVIC_EnableIRQ() | (+++) Enable the ADC IRQ handler using HAL_NVIC_EnableIRQ() | ||||
(+++) Configure the priority and enable the NVIC for the transfer complete | (+++) Configure the priority and enable the NVIC for the transfer complete | ||||
interrupt on the two DMA Streams. The output stream should have higher | interrupt on the two DMA Streams. The output stream should have higher | ||||
priority than the input stream. | priority than the input stream. | ||||
(#) Configure the ADC Prescaler, conversion resolution and data alignment | |||||
using the HAL_ADC_Init() function. | |||||
(#) Configure the ADC Prescaler, conversion resolution and data alignment | |||||
using the HAL_ADC_Init() function. | |||||
(#) Configure the ADC Injected channels group features, use HAL_ADC_Init() | (#) Configure the ADC Injected channels group features, use HAL_ADC_Init() | ||||
and HAL_ADC_ConfigChannel() functions. | and HAL_ADC_ConfigChannel() functions. | ||||
(#) Three operation modes are available within this driver : | |||||
(#) Three operation modes are available within this driver: | |||||
*** Polling mode IO operation *** | *** Polling mode IO operation *** | ||||
================================= | ================================= | ||||
[..] | |||||
(+) Start the ADC peripheral using HAL_ADCEx_InjectedStart() | |||||
[..] | |||||
(+) Start the ADC peripheral using HAL_ADCEx_InjectedStart() | |||||
(+) Wait for end of conversion using HAL_ADC_PollForConversion(), at this stage | (+) Wait for end of conversion using HAL_ADC_PollForConversion(), at this stage | ||||
user can specify the value of timeout according to his end application | |||||
user can specify the value of timeout according to his end application | |||||
(+) To read the ADC converted values, use the HAL_ADCEx_InjectedGetValue() function. | (+) To read the ADC converted values, use the HAL_ADCEx_InjectedGetValue() function. | ||||
(+) Stop the ADC peripheral using HAL_ADCEx_InjectedStop() | (+) Stop the ADC peripheral using HAL_ADCEx_InjectedStop() | ||||
*** Interrupt mode IO operation *** | |||||
*** Interrupt mode IO operation *** | |||||
=================================== | =================================== | ||||
[..] | |||||
(+) Start the ADC peripheral using HAL_ADCEx_InjectedStart_IT() | |||||
[..] | |||||
(+) Start the ADC peripheral using HAL_ADCEx_InjectedStart_IT() | |||||
(+) Use HAL_ADC_IRQHandler() called under ADC_IRQHandler() Interrupt subroutine | (+) Use HAL_ADC_IRQHandler() called under ADC_IRQHandler() Interrupt subroutine | ||||
(+) At ADC end of conversion HAL_ADCEx_InjectedConvCpltCallback() function is executed and user can | |||||
(+) At ADC end of conversion HAL_ADCEx_InjectedConvCpltCallback() function is executed and user can | |||||
add his own code by customization of function pointer HAL_ADCEx_InjectedConvCpltCallback | add his own code by customization of function pointer HAL_ADCEx_InjectedConvCpltCallback | ||||
(+) In case of ADC Error, HAL_ADCEx_InjectedErrorCallback() function is executed and user can | (+) In case of ADC Error, HAL_ADCEx_InjectedErrorCallback() function is executed and user can | ||||
add his own code by customization of function pointer HAL_ADCEx_InjectedErrorCallback | add his own code by customization of function pointer HAL_ADCEx_InjectedErrorCallback | ||||
(+) Stop the ADC peripheral using HAL_ADCEx_InjectedStop_IT() | (+) Stop the ADC peripheral using HAL_ADCEx_InjectedStop_IT() | ||||
*** DMA mode IO operation *** | |||||
============================== | |||||
[..] | |||||
(+) Start the ADC peripheral using HAL_ADCEx_InjectedStart_DMA(), at this stage the user specify the length | |||||
of data to be transferred at each end of conversion | |||||
(+) At The end of data transfer ba HAL_ADCEx_InjectedConvCpltCallback() function is executed and user can | |||||
add his own code by customization of function pointer HAL_ADCEx_InjectedConvCpltCallback | |||||
(+) In case of transfer Error, HAL_ADCEx_InjectedErrorCallback() function is executed and user can | |||||
add his own code by customization of function pointer HAL_ADCEx_InjectedErrorCallback | |||||
(+) Stop the ADC peripheral using HAL_ADCEx_InjectedStop_DMA() | |||||
*** Multi mode ADCs Regular channels configuration *** | *** Multi mode ADCs Regular channels configuration *** | ||||
====================================================== | ====================================================== | ||||
[..] | |||||
(+) Select the Multi mode ADC regular channels features (dual or triple mode) | |||||
and configure the DMA mode using HAL_ADCEx_MultiModeConfigChannel() functions. | |||||
(+) Start the ADC peripheral using HAL_ADCEx_MultiModeStart_DMA(), at this stage the user specify the length | |||||
of data to be transferred at each end of conversion | |||||
[..] | |||||
(+) Select the Multi mode ADC regular channels features (dual or triple mode) | |||||
and configure the DMA mode using HAL_ADCEx_MultiModeConfigChannel() functions. | |||||
(+) Start the ADC peripheral using HAL_ADCEx_MultiModeStart_DMA(), at this stage the user specify the length | |||||
of data to be transferred at each end of conversion | |||||
(+) Read the ADCs converted values using the HAL_ADCEx_MultiModeGetValue() function. | (+) Read the ADCs converted values using the HAL_ADCEx_MultiModeGetValue() function. | ||||
@endverbatim | @endverbatim | ||||
****************************************************************************** | ****************************************************************************** | ||||
* @attention | * @attention | ||||
* | * | ||||
* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without modification, | |||||
* are permitted provided that the following conditions are met: | |||||
* 1. Redistributions of source code must retain the above copyright notice, | |||||
* this list of conditions and the following disclaimer. | |||||
* 2. Redistributions in binary form must reproduce the above copyright notice, | |||||
* this list of conditions and the following disclaimer in the documentation | |||||
* and/or other materials provided with the distribution. | |||||
* 3. Neither the name of STMicroelectronics nor the names of its contributors | |||||
* may be used to endorse or promote products derived from this software | |||||
* without specific prior written permission. | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | * | ||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
* This software component is licensed by ST under BSD 3-Clause license, | |||||
* the "License"; You may not use this file except in compliance with the | |||||
* License. You may obtain a copy of the License at: | |||||
* opensource.org/licenses/BSD-3-Clause | |||||
* | * | ||||
****************************************************************************** | ****************************************************************************** | ||||
*/ | |||||
*/ | |||||
/* Includes ------------------------------------------------------------------*/ | /* Includes ------------------------------------------------------------------*/ | ||||
#include "stm32f4xx_hal.h" | #include "stm32f4xx_hal.h" |
#MicroXplorer Configuration settings - do not modify | #MicroXplorer Configuration settings - do not modify | ||||
ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_0 | |||||
ADC1.ContinuousConvMode=ENABLE | |||||
ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag,master,ContinuousConvMode | |||||
ADC1.NbrOfConversionFlag=1 | |||||
ADC1.Rank-0\#ChannelRegularConversion=1 | |||||
ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_3CYCLES | |||||
ADC1.master=1 | |||||
FATFS.IPParameters=_USE_LFN,_MAX_SS | FATFS.IPParameters=_USE_LFN,_MAX_SS | ||||
FATFS._MAX_SS=4096 | FATFS._MAX_SS=4096 | ||||
FATFS._USE_LFN=1 | FATFS._USE_LFN=1 | ||||
File.Version=6 | File.Version=6 | ||||
KeepUserPlacement=false | KeepUserPlacement=false | ||||
Mcu.Family=STM32F4 | Mcu.Family=STM32F4 | ||||
Mcu.IP0=FATFS | |||||
Mcu.IP1=NVIC | |||||
Mcu.IP2=RCC | |||||
Mcu.IP3=RTC | |||||
Mcu.IP4=SYS | |||||
Mcu.IP5=USART2 | |||||
Mcu.IPNb=6 | |||||
Mcu.IP0=ADC1 | |||||
Mcu.IP1=FATFS | |||||
Mcu.IP2=NVIC | |||||
Mcu.IP3=RCC | |||||
Mcu.IP4=RTC | |||||
Mcu.IP5=SYS | |||||
Mcu.IP6=USART2 | |||||
Mcu.IPNb=7 | |||||
Mcu.Name=STM32F401R(D-E)Tx | Mcu.Name=STM32F401R(D-E)Tx | ||||
Mcu.Package=LQFP64 | Mcu.Package=LQFP64 | ||||
Mcu.Pin0=PC13-ANTI_TAMP | Mcu.Pin0=PC13-ANTI_TAMP | ||||
Mcu.Pin1=PC14-OSC32_IN | Mcu.Pin1=PC14-OSC32_IN | ||||
Mcu.Pin10=PB3 | |||||
Mcu.Pin11=PB6 | |||||
Mcu.Pin12=VP_FATFS_VS_Generic | |||||
Mcu.Pin13=VP_RTC_VS_RTC_Activate | |||||
Mcu.Pin14=VP_RTC_VS_RTC_Calendar | |||||
Mcu.Pin15=VP_RTC_VS_RTC_Alarm_B_Intern | |||||
Mcu.Pin16=VP_RTC_VS_RTC_Alarm_A_Intern | |||||
Mcu.Pin17=VP_SYS_VS_Systick | |||||
Mcu.Pin10=PA14 | |||||
Mcu.Pin11=PB3 | |||||
Mcu.Pin12=PB6 | |||||
Mcu.Pin13=VP_FATFS_VS_Generic | |||||
Mcu.Pin14=VP_RTC_VS_RTC_Activate | |||||
Mcu.Pin15=VP_RTC_VS_RTC_Calendar | |||||
Mcu.Pin16=VP_RTC_VS_RTC_Alarm_B_Intern | |||||
Mcu.Pin17=VP_RTC_VS_RTC_Alarm_A_Intern | |||||
Mcu.Pin18=VP_SYS_VS_Systick | |||||
Mcu.Pin2=PC15-OSC32_OUT | Mcu.Pin2=PC15-OSC32_OUT | ||||
Mcu.Pin3=PH0 - OSC_IN | Mcu.Pin3=PH0 - OSC_IN | ||||
Mcu.Pin4=PH1 - OSC_OUT | Mcu.Pin4=PH1 - OSC_OUT | ||||
Mcu.Pin5=PA2 | |||||
Mcu.Pin6=PA3 | |||||
Mcu.Pin7=PA5 | |||||
Mcu.Pin8=PA13 | |||||
Mcu.Pin9=PA14 | |||||
Mcu.PinsNb=18 | |||||
Mcu.Pin5=PA0-WKUP | |||||
Mcu.Pin6=PA2 | |||||
Mcu.Pin7=PA3 | |||||
Mcu.Pin8=PA5 | |||||
Mcu.Pin9=PA13 | |||||
Mcu.PinsNb=19 | |||||
Mcu.ThirdPartyNb=0 | Mcu.ThirdPartyNb=0 | ||||
Mcu.UserConstants= | Mcu.UserConstants= | ||||
Mcu.UserName=STM32F401RETx | Mcu.UserName=STM32F401RETx | ||||
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false | NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false | ||||
NVIC.SysTick_IRQn=true\:0\:0\:true\:false\:true\:true\:true | NVIC.SysTick_IRQn=true\:0\:0\:true\:false\:true\:true\:true | ||||
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false | NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false | ||||
PA0-WKUP.Locked=true | |||||
PA0-WKUP.Signal=ADCx_IN0 | |||||
PA13.GPIOParameters=GPIO_Label | PA13.GPIOParameters=GPIO_Label | ||||
PA13.GPIO_Label=TMS | PA13.GPIO_Label=TMS | ||||
PA13.Locked=true | PA13.Locked=true | ||||
RTC.Format=RTC_FORMAT_BIN | RTC.Format=RTC_FORMAT_BIN | ||||
RTC.IPParameters=Format,Date,Year,Alarm,Alarm_B | RTC.IPParameters=Format,Date,Year,Alarm,Alarm_B | ||||
RTC.Year=21 | RTC.Year=21 | ||||
SH.ADCx_IN0.0=ADC1_IN0,IN0 | |||||
SH.ADCx_IN0.ConfNb=1 | |||||
SH.GPXTI13.0=GPIO_EXTI13 | SH.GPXTI13.0=GPIO_EXTI13 | ||||
SH.GPXTI13.ConfNb=1 | SH.GPXTI13.ConfNb=1 | ||||
USART2.IPParameters=VirtualMode | USART2.IPParameters=VirtualMode |