STM32 HAL driver for the MAX30102 pulse oximeter and heart rate sensor.
Caution
This library is NOT intended for clinical use. Proceed at your own risk.
- In STM32CubeMX, set I2C1 to "I2C" and USART1 to "asynchronous"
- Set up an external interrupt pin in GPIO settings, use "external interrupt mode with falling edge trigger detection" and "pull-up" settings.
- Activate the external interrupt in NVIC settings by checking the corresponding box.
- Connect the INT# pin of your MAX30102 to this external interrupt pin.
- Save and generate code.
- Include
max30102_for_stm32_hal.h"
:
#include "max30102_for_stm32_hal.h"
- If necessary, override the built-in plot function
__weak void max30102_plot(uint32_t ir_sample, uint32_t red_sample)
in the main file outside the main function:
void max30102_plot(uint32_t ir_sample, uint32_t red_sample) { / * Insert your printing logic here * / }
- Declare an
max30102_t
object:
max30102_t max30102;
- Initiate the
max30102_t
object and pass the corresponding I2C handle:
max30102_init(&max30102, &hi2c1);
- Reset the sensor and clear FIFO pointers:
max30102_reset(&max30102); max30102_clear_fifo(&max30102);
- Set up sensor configurations:
// FIFO configurations max30102_set_fifo_config(&max30102, max30102_smp_ave_8, 1, 7); // LED configurations max30102_set_led_pulse_width(&max30102, max30102_spo2_16_bit); max30102_set_adc_resolution(&max30102, max30102_spo2_adc_2048); max30102_set_sampling_rate(&max30102, max30102_spo2_800); max30102_set_led_current_1(&max30102, 6.2); max30102_set_led_current_2(&max30102, 6.2);
- Enter measurement mode:
// Enter SpO2 mode max30102_set_mode(&max30102, max30102_spo2);
- Enable the required interrupts:
// Enable FIFO_A_FULL interrupt max30102_set_a_full(&max30102, 1); // Enable die temperature measurement max30102_set_die_temp_en(&max30102, 1); // Enable DIE_TEMP_RDY interrupt max30102_set_die_temp_rdy(&max30102, 1);
- Run interrupt handler once interrupt flag is active:
while (1) { // If interrupt flag is active if (max30102_has_interrupt(&max30102)) // Run interrupt handler to read FIFO max30102_interrupt_handler(&max30102); }
- Include
max30102_for_stm32_hal.h"
:
#include "max30102_for_stm32_hal.h"
- Declare the
max30102_t
object as extern:
extern max30102_t max30102;
- In the corresponding external interrupt handler function, call:
max30102_on_interrupt(&max30102);
- Complie and flash program to microcontroller.
- Read the results from a serial monitor/plotter.
- Refer to ./examples (
main.c
,stm32f1xx_it.c
) and datasheets for further information.