Lucky Yu / Mbed 2 deprecated SOLamr_base_controller

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
spiderkiller
Date:
Sun May 17 07:03:08 2020 +0000
Commit message:
good;

Changed in this revision

Encoder/Encoder.h Show annotated file Show diff for this revision Revisions of this file
Encoder/EncoderInit.cpp Show annotated file Show diff for this revision Revisions of this file
Encoder/EncoderMspInitF0.cpp Show annotated file Show diff for this revision Revisions of this file
Encoder/EncoderMspInitF1.cpp Show annotated file Show diff for this revision Revisions of this file
Encoder/EncoderMspInitF3.cpp Show annotated file Show diff for this revision Revisions of this file
Encoder/EncoderMspInitF4.cpp Show annotated file Show diff for this revision Revisions of this file
Encoder/EncoderMspInitL0.cpp Show annotated file Show diff for this revision Revisions of this file
Encoder/EncoderMspInitL1.cpp Show annotated file Show diff for this revision Revisions of this file
Encoder/EncoderMspInitL4.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 534dccd9b32a Encoder/Encoder.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Encoder/Encoder.h	Sun May 17 07:03:08 2020 +0000
@@ -0,0 +1,6 @@
+#ifndef ENCODER_H
+#define ENCODER_H
+
+void EncoderInit(TIM_Encoder_InitTypeDef * encoder, TIM_HandleTypeDef * timer, TIM_TypeDef * TIMx, uint32_t maxcount, uint32_t encmode);
+
+#endif
\ No newline at end of file
diff -r 000000000000 -r 534dccd9b32a Encoder/EncoderInit.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Encoder/EncoderInit.cpp	Sun May 17 07:03:08 2020 +0000
@@ -0,0 +1,35 @@
+#include "mbed.h"
+
+void EncoderInit(TIM_Encoder_InitTypeDef * encoder, TIM_HandleTypeDef * timer, TIM_TypeDef * TIMx, uint32_t maxcount, uint32_t encmode)
+{
+
+    timer->Instance = TIMx;
+    timer->Init.Period = maxcount;
+    timer->Init.CounterMode = TIM_COUNTERMODE_UP;
+    timer->Init.Prescaler = 0;
+    timer->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+
+    encoder->EncoderMode = encmode;
+
+    encoder->IC1Filter = 0x0F;
+    encoder->IC1Polarity = TIM_INPUTCHANNELPOLARITY_RISING;
+    encoder->IC1Prescaler = TIM_ICPSC_DIV4;
+    encoder->IC1Selection = TIM_ICSELECTION_DIRECTTI;
+
+    encoder->IC2Filter = 0x0F;
+    encoder->IC2Polarity = TIM_INPUTCHANNELPOLARITY_FALLING;
+    encoder->IC2Prescaler = TIM_ICPSC_DIV4;
+    encoder->IC2Selection = TIM_ICSELECTION_DIRECTTI;
+
+
+    if (HAL_TIM_Encoder_Init(timer, encoder) != HAL_OK) {
+        printf("Couldn't Init Encoder\r\n");
+        while (1) {}
+    }
+
+    if(HAL_TIM_Encoder_Start(timer,TIM_CHANNEL_1)!=HAL_OK) {
+        printf("Couldn't Start Encoder\r\n");
+        while (1) {}
+    }
+}
+
diff -r 000000000000 -r 534dccd9b32a Encoder/EncoderMspInitF0.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Encoder/EncoderMspInitF0.cpp	Sun May 17 07:03:08 2020 +0000
@@ -0,0 +1,37 @@
+#include "mbed.h"
+/*
+ * HAL_TIM_Encoder_MspInit()
+ * Overrides the __weak function stub in stm32f0xx_hal_tim.h
+ *
+ * Edit the below for your preferred pin wiring & pullup/down
+ * I have encoder common at 3V3, using GPIO_PULLDOWN on inputs.
+ * Encoder A&B outputs connected directly to GPIOs.
+ *
+ * http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00088500.pdf
+ * Table 11 has GPIO alternate function pinout mappings.
+ *
+ * TIM1_CH1: AF2 @ PA_8 - TIM1 used as system ticker under mbed, so unavailable
+ * TIM1_CH2: AF2 @ PA_9
+ *
+ * TIM3_CH1: AF1 @ PA_6, PB_4; AF0 @ PC_6*  *only for F030xC devices
+ * TIM3_CH2: AF1 @ PA_7, PB_5; AF0 @ PC_7*
+ *
+ */
+
+#ifdef TARGET_STM32F0
+void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
+{
+    GPIO_InitTypeDef GPIO_InitStruct;
+
+    if (htim->Instance == TIM3) { //PB_4 PB_5 = Nucleo D5 D4
+        __TIM3_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+}
+#endif
\ No newline at end of file
diff -r 000000000000 -r 534dccd9b32a Encoder/EncoderMspInitF1.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Encoder/EncoderMspInitF1.cpp	Sun May 17 07:03:08 2020 +0000
@@ -0,0 +1,74 @@
+#include "mbed.h"
+/*
+ * HAL_TIM_Encoder_MspInit()
+ * Overrides the __weak function stub in stm32f1xx_hal_tim.h
+ *
+ * Edit the below for your preferred pin wiring & pullup/down
+ * I have encoder common at 3V3, using GPIO_PULLDOWN on inputs.
+ * Encoder A&B outputs connected directly to GPIOs.
+ *
+ * http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00161566.pdf
+ * Table 5 has GPIO alternate function pinout mappings.
+ *
+ * TIM1_CH1: default PA_8, remap PE_9
+ * TIM1_CH2: default PA_9, remap PE_11
+ *
+ * TIM2_CH1: default PA_0 
+ * TIM2_CH2: default PA_1, remap PB_3
+ *
+ * TIM3_CH1: default PA_6, remap PB_4, PC_6
+ * TIM3_CH2: default PA_7, remap PB_5, PC_7
+ *
+ * TIM4_CH1: default PB_6, remap PD_12
+ * TIM4_CH2: default PB_7, remap PD_13
+ *
+ * NB one of these timers will be the employed by mbed as systick, unavailable as encoder.
+ */
+
+#ifdef TARGET_STM32F1
+void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
+{
+    GPIO_InitTypeDef GPIO_InitStruct;
+
+    if (htim->Instance == TIM1) { //PA8 PA9 = Nucleo D7 D8
+        __TIM1_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+//        GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM2) { //PA0 PA1 = Nucleo A0 A1
+        __TIM2_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+//        GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM3) { //PA6 PA7 = Nucleo D12 D11
+        __TIM3_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+//        GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM4) { // PB6 PB7 = Nucleo D10 MORPHO PB7
+        __TIM4_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+//        GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+}
+#endif
\ No newline at end of file
diff -r 000000000000 -r 534dccd9b32a Encoder/EncoderMspInitF3.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Encoder/EncoderMspInitF3.cpp	Sun May 17 07:03:08 2020 +0000
@@ -0,0 +1,82 @@
+#include "mbed.h"
+/*
+ * HAL_TIM_Encoder_MspInit()
+ * Overrides the __weak function stub in stm32f3xx_hal_tim.h
+ *
+ * Edit the below for your preferred pin wiring & pullup/down
+ * I have encoder common at 3V3, using GPIO_PULLDOWN on inputs.
+ * Encoder A&B outputs connected directly to GPIOs.
+ *
+ * http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00093333.pdf
+ * http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00097745.pdf
+ * http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00133117.pdf
+ * Table 14 has GPIO alternate function pinout mappings.
+ *
+ * TIM1_CH1: AF2 @ PC_0, PE_9; AF6 @ PA_8
+ * TIM1_CH2: AF2 @ PC_1, PE_11; AF6 @ PA_9
+ *
+ * (TIM2_CH1: AF1 @ PA_0, PA_5, PA_15; AF2 @ PD_3)  TIM2 is the mbed system ticker, so unavailable as encoder.
+ * (TIM2_CH2: AF1 @ PA_1, PB_3; AF2 @ PD_4)
+ *
+ * TIM3_CH1: AF2 @ PA_6, PB_4, PC_6, PE_2           not for F302R8, OK @ F334R8
+ * TIM3_CH2: AF2 @ PA_4, PA_7, PB_5, PC_7, PE_3
+ *
+ * TIM4_CH1: AF2 @ PB_6, PD_12; AF10 @ PA_11        not for both F302R8 & F334R8
+ * TIM4_CH2: AF2 @ PB_7, PD_13; AF10 @ PA_12
+ *
+ */
+
+#ifdef TARGET_STM32F3
+
+void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
+{
+    GPIO_InitTypeDef GPIO_InitStruct;
+
+    if (htim->Instance == TIM1) { //PA8 PA9 = Nucleo D7 D8
+        __TIM1_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF6_TIM1;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+#if 0 //TIM2 is the mbed system ticker
+    else if (htim->Instance == TIM2) { //PA0 PA1 = Nucleo A0 A1
+        __TIM2_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+#endif
+#if defined TARGET_STM32F334R8
+    else if (htim->Instance == TIM3) { //PB4 PB5 = Nucleo D5 D4
+        __TIM3_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+#endif
+#if 0
+    else if (htim->Instance == TIM4) { // PB6 PB7 = Nucleo D10 MORPHO_PB7
+        __TIM4_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+#endif
+}
+#endif
\ No newline at end of file
diff -r 000000000000 -r 534dccd9b32a Encoder/EncoderMspInitF4.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Encoder/EncoderMspInitF4.cpp	Sun May 17 07:03:08 2020 +0000
@@ -0,0 +1,76 @@
+#include "mbed.h"
+/*
+ * HAL_TIM_Encoder_MspInit()
+ * Overrides the __weak function stub in stm32f4xx_hal_tim.h
+ *
+ * Edit the below for your preferred pin wiring & pullup/down
+ * I have encoder common at 3V3, using GPIO_PULLDOWN on inputs.
+ * Encoder A&B outputs connected directly to GPIOs.
+ *
+ * www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00102166.pdf
+ * www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00141306.pdf
+ *
+ * TIM1_CH1: AF1 @ PA_8, PE_9 
+ * TIM1_CH2: AF1 @ PA_9, PE_11 
+ *
+ * TIM2_CH1: AF1 @ PA_0, PA_5, PA_15, PB_8*     *F446 only
+ * TIM2_CH2: AF1 @ PA_1, PB_3, PB_9*            *F446 only
+ *
+ * TIM3_CH1: AF2 @ PA_6, PB_4, PC_6
+ * TIM3_CH2: AF2 @ PA_7, PB_5, PC_7
+ *
+ * TIM4_CH1: AF2 @ PB_6, PD_12
+ * TIM4_CH2: AF2 @ PB_7, PD_13
+ *
+ * TIM5_CH1: AF2 @ PA_0*    *TIM5 used by mbed system ticker so unavailable
+ * TIM5_CH2: AF2 @ PA_1*
+ *
+ */
+
+#ifdef TARGET_STM32F4
+void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
+{
+    GPIO_InitTypeDef GPIO_InitStruct;
+
+    if (htim->Instance == TIM1) { //PA8 PA9 = Nucleo D7 D8
+        __TIM1_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM2) { //PA0 PA1 = Nucleo A0 A1
+        __TIM2_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM3) { //PB4 PB5 = Nucleo D5 D4
+        __TIM3_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM4) { // PB6 PB7 = Nucleo D10 MORPHO_PB7
+        __TIM4_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+}
+#endif
\ No newline at end of file
diff -r 000000000000 -r 534dccd9b32a Encoder/EncoderMspInitL0.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Encoder/EncoderMspInitL0.cpp	Sun May 17 07:03:08 2020 +0000
@@ -0,0 +1,28 @@
+#include "mbed.h"
+/*
+ * HAL_TIM_Encoder_MspInit()
+ * Overrides the __weak function stub in stm32f4xx_hal_tim.h
+ *
+ * Edit the below for your preferred pin wiring & pullup/down
+ * I have encoder common at 3V3, using GPIO_PULLDOWN on inputs.
+ * Encoder A&B outputs connected directly to GPIOs.
+ *
+ */
+
+#ifdef TARGET_STM32L0
+void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
+{
+    GPIO_InitTypeDef GPIO_InitStruct;
+
+    if (htim->Instance == TIM2) { //PA0 PA1 = Nucleo A0 A1
+        __TIM2_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+}
+#endif
\ No newline at end of file
diff -r 000000000000 -r 534dccd9b32a Encoder/EncoderMspInitL1.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Encoder/EncoderMspInitL1.cpp	Sun May 17 07:03:08 2020 +0000
@@ -0,0 +1,63 @@
+#include "mbed.h"
+/*
+ * HAL_TIM_Encoder_MspInit()
+ * Overrides the __weak function stub in stm32l4xx_hal_tim.h
+ *
+ * Edit the below for your preferred pin wiring & pullup/down
+ * I have encoder common at 3V3, using GPIO_PULLDOWN on inputs.
+ * Encoder A&B outputs connected directly to GPIOs.
+ *
+ * http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00098321.pdf
+ * Table 9 has GPIO alternate function pinout mappings.
+ *
+ * TIM2_CH1: AF1 @ PA_0, PA_5, PA_15, PE_9
+ * TIM2_CH2: AF1 @ PA_1, PB_3, PE_10
+ *
+ * TIM3_CH1: AF2 @ PA_6, PB_4, PC_6, PE_3
+ * TIM3_CH2: AF2 @ PA_7, PB_5, PC_7, PE_4
+ *
+ * TIM4_CH1: AF2 @ PB_6, PD_12
+ * TIM4_CH2: AF2 @ PB_7, PD_13
+ *
+ * TIM5_CH1: AF2 @ PA_0*    *TIM5 used by mbed system ticker so unavailable
+ * TIM5_CH2: AF2 @ PA_1*
+ *
+ */
+
+#ifdef TARGET_STM32L1
+void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
+{
+    GPIO_InitTypeDef GPIO_InitStruct;
+
+    if (htim->Instance == TIM2) { //PA0 PA1 = Nucleo A0 A1
+        __TIM2_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM3) { //PB4 PB5 = Nucleo D5 D4
+        __TIM3_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM4) { // PB6 PB7 = Nucleo D10 MORPHO_PB7
+        __TIM4_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+}
+#endif
\ No newline at end of file
diff -r 000000000000 -r 534dccd9b32a Encoder/EncoderMspInitL4.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Encoder/EncoderMspInitL4.cpp	Sun May 17 07:03:08 2020 +0000
@@ -0,0 +1,86 @@
+#include "mbed.h"
+/*
+ * HAL_TIM_Encoder_MspInit()
+ * Overrides the __weak function stub in stm32f4xx_hal_tim.h
+ *
+ * Edit the below for your preferred pin wiring & pullup/down
+ * I have encoder common at 3V3, using GPIO_PULLDOWN on inputs.
+ * Encoder A&B outputs connected directly to GPIOs.
+ *
+ * http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00108832.pdf
+ * Table 15 has GPIOx AFx pinouts
+ *
+ * TIM1_CH1: AF1 @ PA8, PE9
+ * TIM1_CH2: AF1 @ PA9, PE11
+ *
+ * TIM2_CH1: AF1 @ PA0, PA5, PA15
+ * TIM2_CH2: AF1 @ PA1, PB3
+ *
+ * TIM3_CH1: AF2 @ PA6, PB4, PC6, PE3
+ * TIM3_CH2: AF2 @ PA7, PB5, PC7, PE4
+ *
+ * TIM4_CH1: AF2 @ PB6, PD12
+ * TIM4_CH2: AF2 @ PB7, PD13
+ *
+ * TIM5_CH1: AF2 @ PA0, PF6
+ * TIM5_CH2: AF2 @ PA1, PF7
+ *
+ */
+
+#ifdef TARGET_STM32L4
+void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
+{
+    GPIO_InitTypeDef GPIO_InitStruct;
+
+    if (htim->Instance == TIM1) {       //PA8 PA9 = Nucleo D7 D8
+        __TIM1_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM2) {  //PA0 PA1 = Nucleo A0 A1
+        __TIM2_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM3) {  //PB4 PB5 = Nucleo D5 D4
+        __TIM3_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM4) { // PB6 PB7 = Nucleo D10 MORPHO_PB7
+        __TIM4_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM5) { // here for completeness, mbed sytem timer uses this
+        __TIM5_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF2_TIM5;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+}
+#endif
\ No newline at end of file
diff -r 000000000000 -r 534dccd9b32a main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun May 17 07:03:08 2020 +0000
@@ -0,0 +1,77 @@
+#include "mbed.h"
+#include "Encoder.h"
+
+//STM mbed bug: these macros are MISSING from stm32f3xx_hal_tim.h
+#ifdef TARGET_STM32F3
+#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT)
+#define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__)            (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR))
+#endif
+
+// For encoder
+TIM_Encoder_InitTypeDef encoder2, encoder3;
+TIM_HandleTypeDef   timer2, timer3;
+
+//For usb port serial 
+Serial pc(USBTX, USBRX);
+//Led on F4446RE
+DigitalOut  my_led(LED1);
+// Blue button on F446RE
+InterruptIn my_button(USER_BUTTON);
+
+// For PWM for control DC-motor
+PwmOut      motor_R(D2);
+DigitalOut  motor_R_dir(D3);
+PwmOut      motor_L(D7);
+DigitalOut  motor_L_dir(D6);
+
+void pressed() {
+    // Event handler, pressed blue button 
+    // Reverse direction of motor 
+    motor_R_dir = !motor_R_dir;
+    motor_L_dir = !motor_L_dir;
+}
+
+int main()
+{
+    motor_R_dir = 0;
+    motor_L_dir = 0;
+    // Set PWM
+    motor_R.period_ms(10);
+    motor_L.period_ms(10);
+    
+    // Set button
+    my_button.fall(&pressed); // falling trigger
+
+    pc.baud (115200); // USB port baud rate
+    
+    //counting on both A&B inputs, 4 ticks per cycle, full 32-bit count
+    EncoderInit(&encoder2, &timer2, TIM2, 0xffffffff, TIM_ENCODERMODE_TI12);//PA0 PA1 = Nucleo A0 A1 // right motor encoder
+
+    //counting on both A&B inputs, 4 ticks per cycle, full 32-bit count
+    EncoderInit(&encoder3, &timer3, TIM3, 0xffffffff, TIM_ENCODERMODE_TI12);//PB4 PB5 = Nucleo D5 D4// left motor encoder
+    
+    while (1) {
+        uint32_t en_count_R=0, en_count_L=0;
+        int8_t en_dir_R, en_dir_L;
+        
+        //OK 401 411 446 NOK 030
+        //count2=TIM2->CNT;
+        //dir2=TIM2->CR1&TIM_CR1_DIR;
+        en_count_R=__HAL_TIM_GET_COUNTER(&timer2);
+        en_dir_R = __HAL_TIM_IS_TIM_COUNTING_DOWN(&timer2);
+
+        //OK 401 411 446 030
+        //count3=TIM3->CNT;
+        //dir3=TIM3->CR1&TIM_CR1_DIR;
+        en_count_L=__HAL_TIM_GET_COUNTER(&timer3);
+        en_dir_L = __HAL_TIM_IS_TIM_COUNTING_DOWN(&timer3);
+        
+        printf("%d%s %d%s \r\n", en_count_R, en_dir_R==0 ? "+":"-",en_count_L, en_dir_L==0 ? "+":"-");
+        
+        // Controll motor                                      
+        motor_R.write(0.1); // duty time 10%
+        motor_L.write(0.1);
+        my_led = !my_led; // blink LED on STM
+        wait(0.01); // 10 ms
+    }
+}
diff -r 000000000000 -r 534dccd9b32a mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun May 17 07:03:08 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file