From bcd8f2431a5f6543ba073f075f927470a72ab61d Mon Sep 17 00:00:00 2001 From: bcostm Date: Wed, 5 Oct 2016 10:06:15 +0200 Subject: [PATCH 1/3] STM32F1xx - Add ADC internal channel (Temperature) --- .../TARGET_BLUEPILL_F103C8/PeripheralPins.c | 1 + .../TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PinNames.h | 11 +++++++---- .../TARGET_DISCO_F100RB/PeripheralPins.c | 1 + .../TARGET_STM32F1/TARGET_DISCO_F100RB/PinNames.h | 11 +++++++---- .../TARGET_NUCLEO_F103RB/PeripheralPins.c | 1 + .../TARGET_STM32F1/TARGET_NUCLEO_F103RB/PinNames.h | 11 +++++++---- targets/TARGET_STM/TARGET_STM32F1/analogin_api.c | 11 ++++++++--- 7 files changed, 32 insertions(+), 15 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PeripheralPins.c index def0f64c79..b845ac6ec5 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PeripheralPins.c +++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PeripheralPins.c @@ -55,6 +55,7 @@ const PinMap PinMap_ADC[] = { {PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC_IN13 {PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC_IN14 {PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC_IN15 + {ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // ADC_IN16 {NC, NC, 0} }; diff --git a/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PinNames.h b/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PinNames.h index 7901a63198..54e6b3c70a 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PinNames.h +++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PinNames.h @@ -43,14 +43,14 @@ extern "C" { #define STM_PIN_DATA_EXT(MODE, PUPD, AFNUM, CHANNEL, INVERTED) ((int)(((MODE & 0x0F) << 0) |\ ((PUPD & 0x07) << 4) |\ ((AFNUM & 0x0F) << 7) |\ - ((CHANNEL & 0x0F) << 11) |\ - ((INVERTED & 0x01) << 15))) + ((CHANNEL & 0x1F) << 11) |\ + ((INVERTED & 0x01) << 16))) #define STM_PIN_MODE(X) (((X) >> 0) & 0x0F) #define STM_PIN_PUPD(X) (((X) >> 4) & 0x07) #define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F) -#define STM_PIN_CHANNEL(X) (((X) >> 11) & 0x0F) -#define STM_PIN_INVERTED(X) (((X) >> 15) & 0x01) +#define STM_PIN_CHANNEL(X) (((X) >> 11) & 0x1F) +#define STM_PIN_INVERTED(X) (((X) >> 16) & 0x01) #define STM_MODE_INPUT (0) #define STM_MODE_OUTPUT_PP (1) @@ -130,6 +130,9 @@ typedef enum { PD_2 = 0x32, + // ADC internal channels + ADC_TEMP = 0xF0, + // PCB printout A0 = PA_0, A1 = PA_1, diff --git a/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PeripheralPins.c index 3c56da6e45..e368495573 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PeripheralPins.c +++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PeripheralPins.c @@ -55,6 +55,7 @@ const PinMap PinMap_ADC[] = { {PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC_IN13 {PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC_IN14 {PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC_IN15 + {ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // ADC_IN16 {NC, NC, 0} }; diff --git a/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PinNames.h b/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PinNames.h index ef766d40c4..eaa0652a31 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PinNames.h +++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PinNames.h @@ -43,14 +43,14 @@ extern "C" { #define STM_PIN_DATA_EXT(MODE, PUPD, AFNUM, CHANNEL, INVERTED) ((int)(((MODE & 0x0F) << 0) |\ ((PUPD & 0x07) << 4) |\ ((AFNUM & 0x0F) << 7) |\ - ((CHANNEL & 0x0F) << 11) |\ - ((INVERTED & 0x01) << 15))) + ((CHANNEL & 0x1F) << 11) |\ + ((INVERTED & 0x01) << 16))) #define STM_PIN_MODE(X) (((X) >> 0) & 0x0F) #define STM_PIN_PUPD(X) (((X) >> 4) & 0x07) #define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F) -#define STM_PIN_CHANNEL(X) (((X) >> 11) & 0x0F) -#define STM_PIN_INVERTED(X) (((X) >> 15) & 0x01) +#define STM_PIN_CHANNEL(X) (((X) >> 11) & 0x1F) +#define STM_PIN_INVERTED(X) (((X) >> 16) & 0x01) #define STM_MODE_INPUT (0) #define STM_MODE_OUTPUT_PP (1) @@ -132,6 +132,9 @@ typedef enum { PD_1 = 0x31, PD_2 = 0x32, + // ADC internal channels + ADC_TEMP = 0xF0, + // Arduino connector namings PA0 = PA_0, PA1 = PA_1, diff --git a/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PeripheralPins.c index fe9360e2b5..36c7ee21ec 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PeripheralPins.c +++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PeripheralPins.c @@ -55,6 +55,7 @@ const PinMap PinMap_ADC[] = { {PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC_IN13 {PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC_IN14 {PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC_IN15 + {ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // ADC_IN16 {NC, NC, 0} }; diff --git a/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PinNames.h b/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PinNames.h index 87efd687a6..b1a1d2397a 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PinNames.h +++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PinNames.h @@ -43,14 +43,14 @@ extern "C" { #define STM_PIN_DATA_EXT(MODE, PUPD, AFNUM, CHANNEL, INVERTED) ((int)(((MODE & 0x0F) << 0) |\ ((PUPD & 0x07) << 4) |\ ((AFNUM & 0x0F) << 7) |\ - ((CHANNEL & 0x0F) << 11) |\ - ((INVERTED & 0x01) << 15))) + ((CHANNEL & 0x1F) << 11) |\ + ((INVERTED & 0x01) << 16))) #define STM_PIN_MODE(X) (((X) >> 0) & 0x0F) #define STM_PIN_PUPD(X) (((X) >> 4) & 0x07) #define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F) -#define STM_PIN_CHANNEL(X) (((X) >> 11) & 0x0F) -#define STM_PIN_INVERTED(X) (((X) >> 15) & 0x01) +#define STM_PIN_CHANNEL(X) (((X) >> 11) & 0x1F) +#define STM_PIN_INVERTED(X) (((X) >> 16) & 0x01) #define STM_MODE_INPUT (0) #define STM_MODE_OUTPUT_PP (1) @@ -130,6 +130,9 @@ typedef enum { PD_2 = 0x32, + // ADC internal channels + ADC_TEMP = 0xF0, + // Arduino connector namings A0 = PA_0, A1 = PA_1, diff --git a/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c index 3f102b0e16..5230697cbd 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c @@ -1,5 +1,5 @@ /* mbed Microcontroller Library - * Copyright (c) 2014, STMicroelectronics + * Copyright (c) 2016, STMicroelectronics * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -52,8 +52,10 @@ void analogin_init(analogin_t *obj, PinName pin) MBED_ASSERT(function != (uint32_t)NC); obj->channel = STM_PIN_CHANNEL(function); - // Configure GPIO - pinmap_pinout(pin, PinMap_ADC); + // Configure GPIO excepted for internal channels (Temperature) + if (obj->channel != 16) { + pinmap_pinout(pin, PinMap_ADC); + } // Save pin number for the read function obj->pin = pin; @@ -147,6 +149,9 @@ static inline uint16_t adc_read(analogin_t *obj) case 15: sConfig.Channel = ADC_CHANNEL_15; break; + case 16: + sConfig.Channel = ADC_CHANNEL_16; + break; default: return 0; } From 354ffe84ab4b79dbaadd44ba7f9a468681cd10e2 Mon Sep 17 00:00:00 2001 From: bcostm Date: Wed, 5 Oct 2016 11:12:47 +0200 Subject: [PATCH 2/3] Add channel 17 for Vref --- .../TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PeripheralPins.c | 1 + .../TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PinNames.h | 7 ++++--- .../TARGET_STM32F1/TARGET_DISCO_F100RB/PeripheralPins.c | 1 + .../TARGET_STM32F1/TARGET_DISCO_F100RB/PinNames.h | 7 ++++--- .../TARGET_STM32F1/TARGET_NUCLEO_F103RB/PeripheralPins.c | 1 + .../TARGET_STM32F1/TARGET_NUCLEO_F103RB/PinNames.h | 7 ++++--- targets/TARGET_STM/TARGET_STM32F1/analogin_api.c | 7 +++++-- 7 files changed, 20 insertions(+), 11 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PeripheralPins.c index b845ac6ec5..ca5fcf9134 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PeripheralPins.c +++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PeripheralPins.c @@ -56,6 +56,7 @@ const PinMap PinMap_ADC[] = { {PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC_IN14 {PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC_IN15 {ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // ADC_IN16 + {ADC_VREF, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // ADC_IN17 {NC, NC, 0} }; diff --git a/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PinNames.h b/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PinNames.h index 54e6b3c70a..a4253c997f 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PinNames.h +++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_BLUEPILL_F103C8/PinNames.h @@ -46,9 +46,9 @@ extern "C" { ((CHANNEL & 0x1F) << 11) |\ ((INVERTED & 0x01) << 16))) -#define STM_PIN_MODE(X) (((X) >> 0) & 0x0F) -#define STM_PIN_PUPD(X) (((X) >> 4) & 0x07) -#define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F) +#define STM_PIN_MODE(X) (((X) >> 0) & 0x0F) +#define STM_PIN_PUPD(X) (((X) >> 4) & 0x07) +#define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F) #define STM_PIN_CHANNEL(X) (((X) >> 11) & 0x1F) #define STM_PIN_INVERTED(X) (((X) >> 16) & 0x01) @@ -132,6 +132,7 @@ typedef enum { // ADC internal channels ADC_TEMP = 0xF0, + ADC_VREF = 0xF1, // PCB printout A0 = PA_0, diff --git a/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PeripheralPins.c index e368495573..38e2827c25 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PeripheralPins.c +++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PeripheralPins.c @@ -56,6 +56,7 @@ const PinMap PinMap_ADC[] = { {PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC_IN14 {PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC_IN15 {ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // ADC_IN16 + {ADC_VREF, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // ADC_IN17 {NC, NC, 0} }; diff --git a/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PinNames.h b/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PinNames.h index eaa0652a31..5cdac4ee4a 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PinNames.h +++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_DISCO_F100RB/PinNames.h @@ -46,9 +46,9 @@ extern "C" { ((CHANNEL & 0x1F) << 11) |\ ((INVERTED & 0x01) << 16))) -#define STM_PIN_MODE(X) (((X) >> 0) & 0x0F) -#define STM_PIN_PUPD(X) (((X) >> 4) & 0x07) -#define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F) +#define STM_PIN_MODE(X) (((X) >> 0) & 0x0F) +#define STM_PIN_PUPD(X) (((X) >> 4) & 0x07) +#define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F) #define STM_PIN_CHANNEL(X) (((X) >> 11) & 0x1F) #define STM_PIN_INVERTED(X) (((X) >> 16) & 0x01) @@ -134,6 +134,7 @@ typedef enum { // ADC internal channels ADC_TEMP = 0xF0, + ADC_VREF = 0xF1, // Arduino connector namings PA0 = PA_0, diff --git a/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PeripheralPins.c index 36c7ee21ec..444cd36216 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PeripheralPins.c +++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PeripheralPins.c @@ -56,6 +56,7 @@ const PinMap PinMap_ADC[] = { {PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC_IN14 {PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC_IN15 {ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // ADC_IN16 + {ADC_VREF, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // ADC_IN17 {NC, NC, 0} }; diff --git a/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PinNames.h b/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PinNames.h index b1a1d2397a..cbfd8f673d 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PinNames.h +++ b/targets/TARGET_STM/TARGET_STM32F1/TARGET_NUCLEO_F103RB/PinNames.h @@ -46,9 +46,9 @@ extern "C" { ((CHANNEL & 0x1F) << 11) |\ ((INVERTED & 0x01) << 16))) -#define STM_PIN_MODE(X) (((X) >> 0) & 0x0F) -#define STM_PIN_PUPD(X) (((X) >> 4) & 0x07) -#define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F) +#define STM_PIN_MODE(X) (((X) >> 0) & 0x0F) +#define STM_PIN_PUPD(X) (((X) >> 4) & 0x07) +#define STM_PIN_AFNUM(X) (((X) >> 7) & 0x0F) #define STM_PIN_CHANNEL(X) (((X) >> 11) & 0x1F) #define STM_PIN_INVERTED(X) (((X) >> 16) & 0x01) @@ -132,6 +132,7 @@ typedef enum { // ADC internal channels ADC_TEMP = 0xF0, + ADC_VREF = 0xF1, // Arduino connector namings A0 = PA_0, diff --git a/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c index 5230697cbd..44e830b92b 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c @@ -52,8 +52,8 @@ void analogin_init(analogin_t *obj, PinName pin) MBED_ASSERT(function != (uint32_t)NC); obj->channel = STM_PIN_CHANNEL(function); - // Configure GPIO excepted for internal channels (Temperature) - if (obj->channel != 16) { + // Configure GPIO excepted for internal channels (Temperature, Vref) + if ((obj->channel != 16) && (obj->channel != 17)) { pinmap_pinout(pin, PinMap_ADC); } @@ -152,6 +152,9 @@ static inline uint16_t adc_read(analogin_t *obj) case 16: sConfig.Channel = ADC_CHANNEL_16; break; + case 17: + sConfig.Channel = ADC_CHANNEL_17; + break; default: return 0; } From ed411983a01a8d181bc139e7c8bceeb37ae09673 Mon Sep 17 00:00:00 2001 From: bcostm Date: Wed, 5 Oct 2016 15:06:35 +0200 Subject: [PATCH 3/3] Use ADC internal channels specific definitions --- targets/TARGET_STM/TARGET_STM32F1/analogin_api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c b/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c index 44e830b92b..d419d87a6b 100644 --- a/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c +++ b/targets/TARGET_STM/TARGET_STM32F1/analogin_api.c @@ -150,10 +150,10 @@ static inline uint16_t adc_read(analogin_t *obj) sConfig.Channel = ADC_CHANNEL_15; break; case 16: - sConfig.Channel = ADC_CHANNEL_16; + sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; break; case 17: - sConfig.Channel = ADC_CHANNEL_17; + sConfig.Channel = ADC_CHANNEL_VREFINT; break; default: return 0;