[FL-2969] FuriHal: add ADC API (#3583)

* Examples: remove unused context
* FuriHal: add simple ADC API
* Examples: add ADC example app
* FuriHal: add extended configuration options for ADC API
* FuriHal: add ADC clock configuration, fix calibration routine for single ended mode, new optimized parameters, documentation.
* FuriHal: add FuriHalAdcChannelTEMPSENSOR sampling time note
* FuriHal: update FuriHalAdcChannelVBAT description.
* FuriHal: use insomnia while ADC is acquired.
* Examples: cleanup example_adc a little bit
This commit is contained in:
あく
2024-04-18 00:17:40 +09:00
committed by GitHub
parent 1a40fae003
commit 70f93a48f5
16 changed files with 949 additions and 57 deletions

View File

@@ -1,5 +1,5 @@
entry,status,name,type,params
Version,+,60.8,,
Version,+,61.0,,
Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/cli/cli.h,,
Header,+,applications/services/cli/cli_vcp.h,,
@@ -199,6 +199,7 @@ Header,+,targets/f7/platform_specific/cxx_virtual_stub.h,,
Header,+,targets/f7/platform_specific/intrinsic_export.h,,
Header,+,targets/f7/platform_specific/math_wrapper.h,,
Header,+,targets/furi_hal_include/furi_hal.h,,
Header,+,targets/furi_hal_include/furi_hal_adc.h,,
Header,+,targets/furi_hal_include/furi_hal_bt.h,,
Header,+,targets/furi_hal_include/furi_hal_cortex.h,,
Header,+,targets/furi_hal_include/furi_hal_crypto.h,,
@@ -1086,6 +1087,16 @@ Function,+,furi_event_flag_get,uint32_t,FuriEventFlag*
Function,+,furi_event_flag_set,uint32_t,"FuriEventFlag*, uint32_t"
Function,+,furi_event_flag_wait,uint32_t,"FuriEventFlag*, uint32_t, uint32_t, uint32_t"
Function,+,furi_get_tick,uint32_t,
Function,+,furi_hal_adc_acquire,FuriHalAdcHandle*,
Function,+,furi_hal_adc_configure,void,FuriHalAdcHandle*
Function,+,furi_hal_adc_configure_ex,void,"FuriHalAdcHandle*, FuriHalAdcScale, FuriHalAdcClock, FuriHalAdcOversample, FuriHalAdcSamplingTime"
Function,+,furi_hal_adc_convert_temp,float,"FuriHalAdcHandle*, uint16_t"
Function,+,furi_hal_adc_convert_to_voltage,float,"FuriHalAdcHandle*, uint16_t"
Function,+,furi_hal_adc_convert_vbat,float,"FuriHalAdcHandle*, uint16_t"
Function,+,furi_hal_adc_convert_vref,float,"FuriHalAdcHandle*, uint16_t"
Function,+,furi_hal_adc_init,void,
Function,+,furi_hal_adc_read,uint16_t,"FuriHalAdcHandle*, FuriHalAdcChannel"
Function,+,furi_hal_adc_release,void,FuriHalAdcHandle*
Function,+,furi_hal_bt_change_app,FuriHalBleProfileBase*,"const FuriHalBleProfileTemplate*, FuriHalBleProfileParams, GapEventCallback, void*"
Function,+,furi_hal_bt_check_profile_type,_Bool,"FuriHalBleProfileBase*, const FuriHalBleProfileTemplate*"
Function,+,furi_hal_bt_clear_white_list,_Bool,
1 entry status name type params
2 Version + 60.8 61.0
3 Header + applications/services/bt/bt_service/bt.h
4 Header + applications/services/cli/cli.h
5 Header + applications/services/cli/cli_vcp.h
199 Header + targets/f7/platform_specific/intrinsic_export.h
200 Header + targets/f7/platform_specific/math_wrapper.h
201 Header + targets/furi_hal_include/furi_hal.h
202 Header + targets/furi_hal_include/furi_hal_adc.h
203 Header + targets/furi_hal_include/furi_hal_bt.h
204 Header + targets/furi_hal_include/furi_hal_cortex.h
205 Header + targets/furi_hal_include/furi_hal_crypto.h
1087 Function + furi_event_flag_set uint32_t FuriEventFlag*, uint32_t
1088 Function + furi_event_flag_wait uint32_t FuriEventFlag*, uint32_t, uint32_t, uint32_t
1089 Function + furi_get_tick uint32_t
1090 Function + furi_hal_adc_acquire FuriHalAdcHandle*
1091 Function + furi_hal_adc_configure void FuriHalAdcHandle*
1092 Function + furi_hal_adc_configure_ex void FuriHalAdcHandle*, FuriHalAdcScale, FuriHalAdcClock, FuriHalAdcOversample, FuriHalAdcSamplingTime
1093 Function + furi_hal_adc_convert_temp float FuriHalAdcHandle*, uint16_t
1094 Function + furi_hal_adc_convert_to_voltage float FuriHalAdcHandle*, uint16_t
1095 Function + furi_hal_adc_convert_vbat float FuriHalAdcHandle*, uint16_t
1096 Function + furi_hal_adc_convert_vref float FuriHalAdcHandle*, uint16_t
1097 Function + furi_hal_adc_init void
1098 Function + furi_hal_adc_read uint16_t FuriHalAdcHandle*, FuriHalAdcChannel
1099 Function + furi_hal_adc_release void FuriHalAdcHandle*
1100 Function + furi_hal_bt_change_app FuriHalBleProfileBase* const FuriHalBleProfileTemplate*, FuriHalBleProfileParams, GapEventCallback, void*
1101 Function + furi_hal_bt_check_profile_type _Bool FuriHalBleProfileBase*, const FuriHalBleProfileTemplate*
1102 Function + furi_hal_bt_clear_white_list _Bool

View File

@@ -31,6 +31,7 @@ void furi_hal_deinit_early(void) {
void furi_hal_init(void) {
furi_hal_mpu_init();
furi_hal_adc_init();
furi_hal_clock_init();
furi_hal_random_init();
furi_hal_serial_control_init();

View File

@@ -68,49 +68,161 @@ const GpioPin gpio_usb_dp = {.port = GPIOA, .pin = LL_GPIO_PIN_12};
const GpioPinRecord gpio_pins[] = {
// 5V: 1
{.pin = &gpio_ext_pa7, .name = "PA7", .number = 2, .debug = false},
{.pin = &gpio_ext_pa6, .name = "PA6", .number = 3, .debug = false},
{.pin = &gpio_ext_pa4, .name = "PA4", .number = 4, .debug = false},
{.pin = &gpio_ext_pb3, .name = "PB3", .number = 5, .debug = false},
{.pin = &gpio_ext_pb2, .name = "PB2", .number = 6, .debug = false},
{.pin = &gpio_ext_pc3, .name = "PC3", .number = 7, .debug = false},
{.pin = &gpio_ext_pa7,
.name = "PA7",
.channel = FuriHalAdcChannel12,
.number = 2,
.debug = false},
{.pin = &gpio_ext_pa6,
.name = "PA6",
.channel = FuriHalAdcChannel11,
.number = 3,
.debug = false},
{.pin = &gpio_ext_pa4,
.name = "PA4",
.channel = FuriHalAdcChannel9,
.number = 4,
.debug = false},
{.pin = &gpio_ext_pb3,
.name = "PB3",
.channel = FuriHalAdcChannelNone,
.number = 5,
.debug = false},
{.pin = &gpio_ext_pb2,
.name = "PB2",
.channel = FuriHalAdcChannelNone,
.number = 6,
.debug = false},
{.pin = &gpio_ext_pc3,
.name = "PC3",
.channel = FuriHalAdcChannel4,
.number = 7,
.debug = false},
// GND: 8
// Space
// 3v3: 9
{.pin = &gpio_swclk, .name = "PA14", .number = 10, .debug = true},
{.pin = &gpio_swclk,
.name = "PA14",
.channel = FuriHalAdcChannelNone,
.number = 10,
.debug = true},
// GND: 11
{.pin = &gpio_swdio, .name = "PA13", .number = 12, .debug = true},
{.pin = &gpio_usart_tx, .name = "PB6", .number = 13, .debug = true},
{.pin = &gpio_usart_rx, .name = "PB7", .number = 14, .debug = true},
{.pin = &gpio_ext_pc1, .name = "PC1", .number = 15, .debug = false},
{.pin = &gpio_ext_pc0, .name = "PC0", .number = 16, .debug = false},
{.pin = &gpio_ibutton, .name = "PB14", .number = 17, .debug = true},
{.pin = &gpio_swdio,
.name = "PA13",
.channel = FuriHalAdcChannelNone,
.number = 12,
.debug = true},
{.pin = &gpio_usart_tx,
.name = "PB6",
.channel = FuriHalAdcChannelNone,
.number = 13,
.debug = true},
{.pin = &gpio_usart_rx,
.name = "PB7",
.channel = FuriHalAdcChannelNone,
.number = 14,
.debug = true},
{.pin = &gpio_ext_pc1,
.name = "PC1",
.channel = FuriHalAdcChannel2,
.number = 15,
.debug = false},
{.pin = &gpio_ext_pc0,
.name = "PC0",
.channel = FuriHalAdcChannel1,
.number = 16,
.debug = false},
{.pin = &gpio_ibutton,
.name = "PB14",
.channel = FuriHalAdcChannelNone,
.number = 17,
.debug = true},
// GND: 18
// 2nd column
// 5V: 19
{.pin = &gpio_ext_pc5, .name = "PC5", .number = 20, .debug = false},
{.pin = &gpio_ext_pc4, .name = "PC4", .number = 21, .debug = false},
{.pin = &gpio_ext_pa5, .name = "PA5", .number = 22, .debug = false},
{.pin = &gpio_ext_pb9, .name = "PB9", .number = 23, .debug = false},
{.pin = &gpio_ext_pa0, .name = "PA0", .number = 24, .debug = false},
{.pin = &gpio_ext_pa1, .name = "PA1", .number = 25, .debug = false},
{.pin = &gpio_ext_pc5,
.name = "PC5",
.channel = FuriHalAdcChannel14,
.number = 20,
.debug = false},
{.pin = &gpio_ext_pc4,
.name = "PC4",
.channel = FuriHalAdcChannel13,
.number = 21,
.debug = false},
{.pin = &gpio_ext_pa5,
.name = "PA5",
.channel = FuriHalAdcChannel10,
.number = 22,
.debug = false},
{.pin = &gpio_ext_pb9,
.name = "PB9",
.channel = FuriHalAdcChannelNone,
.number = 23,
.debug = false},
{.pin = &gpio_ext_pa0,
.name = "PA0",
.channel = FuriHalAdcChannel5,
.number = 24,
.debug = false},
{.pin = &gpio_ext_pa1,
.name = "PA1",
.channel = FuriHalAdcChannel6,
.number = 25,
.debug = false},
// KEY: 26
// Space
// 3v3: 27
{.pin = &gpio_ext_pa15, .name = "PA15", .number = 28, .debug = false},
{.pin = &gpio_ext_pa15,
.name = "PA15",
.channel = FuriHalAdcChannelNone,
.number = 28,
.debug = false},
// GND: 29
{.pin = &gpio_ext_pe4, .name = "PE4", .number = 30, .debug = false},
{.pin = &gpio_ext_pa2, .name = "PA2", .number = 31, .debug = false},
{.pin = &gpio_ext_pb4, .name = "PB4", .number = 32, .debug = false},
{.pin = &gpio_ext_pb5, .name = "PB5", .number = 33, .debug = false},
{.pin = &gpio_ext_pd0, .name = "PD0", .number = 34, .debug = false},
{.pin = &gpio_ext_pb13, .name = "PB13", .number = 35, .debug = false},
{.pin = &gpio_ext_pe4,
.name = "PE4",
.channel = FuriHalAdcChannelNone,
.number = 30,
.debug = false},
{.pin = &gpio_ext_pa2,
.name = "PA2",
.channel = FuriHalAdcChannel7,
.number = 31,
.debug = false},
{.pin = &gpio_ext_pb4,
.name = "PB4",
.channel = FuriHalAdcChannelNone,
.number = 32,
.debug = false},
{.pin = &gpio_ext_pb5,
.name = "PB5",
.channel = FuriHalAdcChannelNone,
.number = 33,
.debug = false},
{.pin = &gpio_ext_pd0,
.name = "PD0",
.channel = FuriHalAdcChannelNone,
.number = 34,
.debug = false},
{.pin = &gpio_ext_pb13,
.name = "PB13",
.channel = FuriHalAdcChannelNone,
.number = 35,
.debug = false},
// GND: 36
/* Dangerous pins, may damage hardware */
{.pin = &gpio_usart_rx, .name = "PB7", .number = 0, .debug = true},
{.pin = &gpio_speaker, .name = "PB8", .number = 0, .debug = true},
{.pin = &gpio_usart_rx,
.name = "PB7",
.channel = FuriHalAdcChannelNone,
.number = 0,
.debug = true},
{.pin = &gpio_speaker,
.name = "PB8",
.channel = FuriHalAdcChannelNone,
.number = 0,
.debug = true},
};
const size_t gpio_pins_count = COUNT_OF(gpio_pins);

View File

@@ -1,9 +1,7 @@
#pragma once
#include <furi.h>
#include <stm32wbxx.h>
#include <stm32wbxx_ll_gpio.h>
#include <furi_hal_adc.h>
#ifdef __cplusplus
extern "C" {
@@ -41,6 +39,7 @@ typedef struct {
typedef struct {
const GpioPin* pin;
const char* name;
const FuriHalAdcChannel channel;
const uint8_t number;
const bool debug;
} GpioPinRecord;