Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: serial_connected_mcu_nucleo rotary_encoder_mbed serial_connected_mcu_nucleo omuni_speed_pid ... more
Fork of rotary_encoder by
Revision 9:d1e6284a13ab, committed 2016-05-21
- Comitter:
- inst
- Date:
- Sat May 21 03:19:33 2016 +0000
- Parent:
- 8:0a217d9f31c7
- Child:
- 10:684e1604e5ea
- Commit message:
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HAL_TIM_Encoder_MspInit/EncoderMspInitF0.cpp Sat May 21 03:19:33 2016 +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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HAL_TIM_Encoder_MspInit/EncoderMspInitF1.cpp Sat May 21 03:19:33 2016 +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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HAL_TIM_Encoder_MspInit/EncoderMspInitF3.cpp Sat May 21 03:19:33 2016 +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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HAL_TIM_Encoder_MspInit/EncoderMspInitF4.cpp Sat May 21 03:19:33 2016 +0000
@@ -0,0 +1,73 @@
+#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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HAL_TIM_Encoder_MspInit/EncoderMspInitL0.cpp Sat May 21 03:19:33 2016 +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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HAL_TIM_Encoder_MspInit/EncoderMspInitL1.cpp Sat May 21 03:19:33 2016 +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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HAL_TIM_Encoder_MspInit/EncoderMspInitL4.cpp Sat May 21 03:19:33 2016 +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
--- a/rotary_encoder_a_phase.hpp Sat May 21 02:52:16 2016 +0000
+++ b/rotary_encoder_a_phase.hpp Sat May 21 03:19:33 2016 +0000
@@ -2,7 +2,6 @@
#define INCLUDED_ROTARY_ENCODER_A_PHASE_H
#include "rotary_encoder_base.hpp"
-#include "mbed.h"
class rotary_encoder_a_phase : public rotary_encoder_base {
public:
--- a/rotary_encoder_ab_phase.hpp Sat May 21 02:52:16 2016 +0000
+++ b/rotary_encoder_ab_phase.hpp Sat May 21 03:19:33 2016 +0000
@@ -2,7 +2,6 @@
#define INCLUDED_ROTARY_ENCODER_AB_PHASE_H
#include "rotary_encoder_base.hpp"
-#include "mbed.h"
class rotary_encoder_ab_phase : public rotary_encoder_base {
public:
--- a/rotary_encoder_base/EncoderMspInitF4.cpp Sat May 21 02:52:16 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-#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
--- a/rotary_encoder_base/rotary_encoder_base.cpp Sat May 21 02:52:16 2016 +0000
+++ b/rotary_encoder_base/rotary_encoder_base.cpp Sat May 21 03:19:33 2016 +0000
@@ -1,57 +1,28 @@
#include "rotary_encoder_base.hpp"
#include "rotary_encoder.hpp"
-#include "mbed.h"
+#include "rotary_encoder_base_impl.hpp"
rotary_encoder_base::rotary_encoder_base(TIM_TypeDef* timer_type,
uint32_t encoder_mode,
- size_t resolution) : rotary_encoder(resolution) {
- timer_handler_.Instance = timer_type;
- timer_handler_.Init.Period = max_counts_;
- timer_handler_.Init.CounterMode = TIM_COUNTERMODE_UP;
- timer_handler_.Init.Prescaler = 0;
- timer_handler_.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
-
- TIM_Encoder_InitTypeDef encoder;
- encoder.EncoderMode = encoder_mode;
-
- encoder.IC1Filter = 0x0F;
- encoder.IC1Polarity = TIM_INPUTCHANNELPOLARITY_RISING;
- encoder.IC1Prescaler = TIM_ICPSC_DIV4;
- encoder.IC1Selection = TIM_ICSELECTION_DIRECTTI;
+ size_t resolution) : rotary_encoder(resolution),
+ encoder_(new rotary_encoder_base_impl(timer_type, encoder_mode, resolution)) {}
- encoder.IC2Filter = 0x0F;
- encoder.IC2Polarity = TIM_INPUTCHANNELPOLARITY_FALLING;
- encoder.IC2Prescaler = TIM_ICPSC_DIV4;
- encoder.IC2Selection = TIM_ICSELECTION_DIRECTTI;
-
- if (HAL_TIM_Encoder_Init(&timer_handler_, &encoder) != HAL_OK) {
- error("couldn't init encoder\n");
- }
+rotary_encoder_base::~rotary_encoder_base() {
+ delete encoder_;
}
-rotary_encoder_base::~rotary_encoder_base() {}
-
int32_t rotary_encoder_base::get_counts() const {
- int32_t counts = timer_handler_.Instance->CNT;
-
- if (counts > (max_counts_ >> 1)) {
- return counts - max_counts_;
- }
- return counts;
+ return encoder_->get_counts();
}
void rotary_encoder_base::reset() {
- timer_handler_.Instance->CNT = 0;
+ encoder_->reset();
}
void rotary_encoder_base::start() {
- if(HAL_TIM_Encoder_Start(&timer_handler_, TIM_CHANNEL_1) != HAL_OK) {
- error("couldn't start encoder\r\n");
- }
+ encoder_->start();
}
void rotary_encoder_base::stop() {
- if(HAL_TIM_Encoder_Stop(&timer_handler_, TIM_CHANNEL_1) != HAL_OK) {
- error("couldn't start encoder\r\n");
- }
+ encoder_->stop();
}
--- a/rotary_encoder_base/rotary_encoder_base.hpp Sat May 21 02:52:16 2016 +0000
+++ b/rotary_encoder_base/rotary_encoder_base.hpp Sat May 21 03:19:33 2016 +0000
@@ -4,6 +4,8 @@
#include "mbed.h"
#include "rotary_encoder.hpp"
+class rotary_encoder_base_impl;
+
class rotary_encoder_base : public rotary_encoder {
public:
rotary_encoder_base(TIM_TypeDef* timer_type,
@@ -18,7 +20,7 @@
virtual void stop();
protected:
- TIM_HandleTypeDef timer_handler_;
+ rotary_encoder_base_impl* encoder_;
};
#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/rotary_encoder_base/rotary_encoder_base_impl.cpp Sat May 21 03:19:33 2016 +0000
@@ -0,0 +1,57 @@
+#include "rotary_encoder_base_impl.hpp"
+#include "rotary_encoder.hpp"
+#include "mbed.h"
+
+rotary_encoder_base_impl::rotary_encoder_base_impl(TIM_TypeDef* timer_type,
+ uint32_t encoder_mode,
+ size_t resolution) : rotary_encoder(resolution) {
+ timer_handler_.Instance = timer_type;
+ timer_handler_.Init.Period = max_counts_;
+ timer_handler_.Init.CounterMode = TIM_COUNTERMODE_UP;
+ timer_handler_.Init.Prescaler = 0;
+ timer_handler_.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+
+ TIM_Encoder_InitTypeDef encoder;
+ encoder.EncoderMode = encoder_mode;
+
+ 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_handler_, &encoder) != HAL_OK) {
+ error("couldn't init encoder\n");
+ }
+}
+
+rotary_encoder_base_impl::~rotary_encoder_base_impl() {}
+
+int32_t rotary_encoder_base_impl::get_counts() const {
+ int32_t counts = timer_handler_.Instance->CNT;
+
+ if (counts > (max_counts_ >> 1)) {
+ return counts - max_counts_;
+ }
+ return counts;
+}
+
+void rotary_encoder_base_impl::reset() {
+ timer_handler_.Instance->CNT = 0;
+}
+
+void rotary_encoder_base_impl::start() {
+ if(HAL_TIM_Encoder_Start(&timer_handler_, TIM_CHANNEL_1) != HAL_OK) {
+ error("couldn't start encoder\r\n");
+ }
+}
+
+void rotary_encoder_base_impl::stop() {
+ if(HAL_TIM_Encoder_Stop(&timer_handler_, TIM_CHANNEL_1) != HAL_OK) {
+ error("couldn't start encoder\r\n");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/rotary_encoder_base/rotary_encoder_base_impl.hpp Sat May 21 03:19:33 2016 +0000
@@ -0,0 +1,24 @@
+#ifndef INCLUDED_ROTARY_ENCODER_BASE_IMPL_H
+#define INCLUDED_ROTARY_ENCODER_BASE_IMPL_H
+
+#include "mbed.h"
+#include "rotary_encoder.hpp"
+
+class rotary_encoder_base_impl : public rotary_encoder {
+public:
+ rotary_encoder_base_impl(TIM_TypeDef* timer_type,
+ uint32_t encoder_mode,
+ size_t resolution);
+ virtual ~rotary_encoder_base_impl();
+
+ virtual int32_t get_counts() const;
+
+ virtual void reset();
+ virtual void start();
+ virtual void stop();
+
+protected:
+ TIM_HandleTypeDef timer_handler_;
+};
+
+#endif
