AlbaniGang / Mbed 2 deprecated Rome_P3

Dependencies:   mbed

Committer:
stollpa1
Date:
Wed Apr 08 09:13:33 2020 +0000
Revision:
1:bba0ec7e075a
Parent:
0:0a667cdbf4c1
P4 init;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wengefa1 0:0a667cdbf4c1 1 /*
wengefa1 0:0a667cdbf4c1 2 * EncoderCounter.cpp
wengefa1 0:0a667cdbf4c1 3 * Copyright (c) 2020, ZHAW
wengefa1 0:0a667cdbf4c1 4 * All rights reserved.
wengefa1 0:0a667cdbf4c1 5 */
wengefa1 0:0a667cdbf4c1 6
wengefa1 0:0a667cdbf4c1 7 #include "EncoderCounter.h"
wengefa1 0:0a667cdbf4c1 8
wengefa1 0:0a667cdbf4c1 9 using namespace std;
wengefa1 0:0a667cdbf4c1 10
wengefa1 0:0a667cdbf4c1 11 /**
wengefa1 0:0a667cdbf4c1 12 * Creates and initialises the driver to read the quadrature
wengefa1 0:0a667cdbf4c1 13 * encoder counter of the STM32 microcontroller.
wengefa1 0:0a667cdbf4c1 14 * @param a the input pin for the channel A.
wengefa1 0:0a667cdbf4c1 15 * @param b the input pin for the channel B.
wengefa1 0:0a667cdbf4c1 16 */
wengefa1 0:0a667cdbf4c1 17 EncoderCounter::EncoderCounter(PinName a, PinName b) {
wengefa1 0:0a667cdbf4c1 18
wengefa1 0:0a667cdbf4c1 19 // check pins
wengefa1 0:0a667cdbf4c1 20
wengefa1 0:0a667cdbf4c1 21 if ((a == PA_15) && (b == PB_3)) {
wengefa1 0:0a667cdbf4c1 22
wengefa1 0:0a667cdbf4c1 23 // pinmap OK for TIM2 CH1 and CH2
wengefa1 0:0a667cdbf4c1 24
wengefa1 0:0a667cdbf4c1 25 TIM = TIM2;
wengefa1 0:0a667cdbf4c1 26
wengefa1 0:0a667cdbf4c1 27 // configure reset and clock control registers
wengefa1 0:0a667cdbf4c1 28
wengefa1 0:0a667cdbf4c1 29 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // manually enable port B (port A enabled by mbed library)
wengefa1 0:0a667cdbf4c1 30
wengefa1 0:0a667cdbf4c1 31 // configure general purpose I/O registers
wengefa1 0:0a667cdbf4c1 32
wengefa1 0:0a667cdbf4c1 33 GPIOA->MODER &= ~GPIO_MODER_MODER15; // reset port A15
wengefa1 0:0a667cdbf4c1 34 GPIOA->MODER |= GPIO_MODER_MODER15_1; // set alternate mode of port A15
wengefa1 0:0a667cdbf4c1 35 GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR15; // reset pull-up/pull-down on port A15
wengefa1 0:0a667cdbf4c1 36 GPIOA->PUPDR |= GPIO_PUPDR_PUPDR15_1; // set input as pull-down
wengefa1 0:0a667cdbf4c1 37 GPIOA->AFR[1] &= ~0xF0000000; // reset alternate function of port A15
wengefa1 0:0a667cdbf4c1 38 GPIOA->AFR[1] |= 1 << 4*7; // set alternate funtion 1 of port A15
wengefa1 0:0a667cdbf4c1 39
wengefa1 0:0a667cdbf4c1 40 GPIOB->MODER &= ~GPIO_MODER_MODER3; // reset port B3
wengefa1 0:0a667cdbf4c1 41 GPIOB->MODER |= GPIO_MODER_MODER3_1; // set alternate mode of port B3
wengefa1 0:0a667cdbf4c1 42 GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR3; // reset pull-up/pull-down on port B3
wengefa1 0:0a667cdbf4c1 43 GPIOB->PUPDR |= GPIO_PUPDR_PUPDR3_1; // set input as pull-down
wengefa1 0:0a667cdbf4c1 44 GPIOB->AFR[0] &= ~(0xF << 4*3); // reset alternate function of port B3
wengefa1 0:0a667cdbf4c1 45 GPIOB->AFR[0] |= 1 << 4*3; // set alternate funtion 1 of port B3
wengefa1 0:0a667cdbf4c1 46
wengefa1 0:0a667cdbf4c1 47 // configure reset and clock control registers
wengefa1 0:0a667cdbf4c1 48
wengefa1 0:0a667cdbf4c1 49 RCC->APB1RSTR |= RCC_APB1RSTR_TIM2RST; //reset TIM2 controller
wengefa1 0:0a667cdbf4c1 50 RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM2RST;
wengefa1 0:0a667cdbf4c1 51
wengefa1 0:0a667cdbf4c1 52 RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // TIM2 clock enable
wengefa1 0:0a667cdbf4c1 53
wengefa1 0:0a667cdbf4c1 54 } else if ((a == PB_4) && (b == PC_7)) {
wengefa1 0:0a667cdbf4c1 55
wengefa1 0:0a667cdbf4c1 56 // pinmap OK for TIM3 CH1 and CH2
wengefa1 0:0a667cdbf4c1 57
wengefa1 0:0a667cdbf4c1 58 TIM = TIM3;
wengefa1 0:0a667cdbf4c1 59
wengefa1 0:0a667cdbf4c1 60 // configure reset and clock control registers
wengefa1 0:0a667cdbf4c1 61
wengefa1 0:0a667cdbf4c1 62 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // manually enable port B
wengefa1 0:0a667cdbf4c1 63 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; // manually enable port C
wengefa1 0:0a667cdbf4c1 64
wengefa1 0:0a667cdbf4c1 65 // configure general purpose I/O registers
wengefa1 0:0a667cdbf4c1 66
wengefa1 0:0a667cdbf4c1 67 GPIOB->MODER &= ~GPIO_MODER_MODER4; // reset port B4
wengefa1 0:0a667cdbf4c1 68 GPIOB->MODER |= GPIO_MODER_MODER4_1; // set alternate mode of port B4
wengefa1 0:0a667cdbf4c1 69 GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR4; // reset pull-up/pull-down on port B4
wengefa1 0:0a667cdbf4c1 70 GPIOB->PUPDR |= GPIO_PUPDR_PUPDR4_1; // set input as pull-down
wengefa1 0:0a667cdbf4c1 71 GPIOB->AFR[0] &= ~(0xF << 4*4); // reset alternate function of port B4
wengefa1 0:0a667cdbf4c1 72 GPIOB->AFR[0] |= 2 << 4*4; // set alternate funtion 2 of port B4
wengefa1 0:0a667cdbf4c1 73
wengefa1 0:0a667cdbf4c1 74 GPIOC->MODER &= ~GPIO_MODER_MODER7; // reset port C7
wengefa1 0:0a667cdbf4c1 75 GPIOC->MODER |= GPIO_MODER_MODER7_1; // set alternate mode of port C7
wengefa1 0:0a667cdbf4c1 76 GPIOC->PUPDR &= ~GPIO_PUPDR_PUPDR7; // reset pull-up/pull-down on port C7
wengefa1 0:0a667cdbf4c1 77 GPIOC->PUPDR |= GPIO_PUPDR_PUPDR7_1; // set input as pull-down
wengefa1 0:0a667cdbf4c1 78 GPIOC->AFR[0] &= ~0xF0000000; // reset alternate function of port C7
wengefa1 0:0a667cdbf4c1 79 GPIOC->AFR[0] |= 2 << 4*7; // set alternate funtion 2 of port C7
wengefa1 0:0a667cdbf4c1 80
wengefa1 0:0a667cdbf4c1 81 // configure reset and clock control registers
wengefa1 0:0a667cdbf4c1 82
wengefa1 0:0a667cdbf4c1 83 RCC->APB1RSTR |= RCC_APB1RSTR_TIM3RST; //reset TIM3 controller
wengefa1 0:0a667cdbf4c1 84 RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM3RST;
wengefa1 0:0a667cdbf4c1 85
wengefa1 0:0a667cdbf4c1 86 RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; // TIM3 clock enable
wengefa1 0:0a667cdbf4c1 87
wengefa1 0:0a667cdbf4c1 88 } else if ((a == PD_12) && (b == PD_13)) {
wengefa1 0:0a667cdbf4c1 89
wengefa1 0:0a667cdbf4c1 90 // pinmap OK for TIM4 CH1 and CH2
wengefa1 0:0a667cdbf4c1 91
wengefa1 0:0a667cdbf4c1 92 TIM = TIM4;
wengefa1 0:0a667cdbf4c1 93
wengefa1 0:0a667cdbf4c1 94 // configure reset and clock control registers
wengefa1 0:0a667cdbf4c1 95
wengefa1 0:0a667cdbf4c1 96 RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // manually enable port D
wengefa1 0:0a667cdbf4c1 97
wengefa1 0:0a667cdbf4c1 98 // configure general purpose I/O registers
wengefa1 0:0a667cdbf4c1 99
wengefa1 0:0a667cdbf4c1 100 GPIOD->MODER &= ~GPIO_MODER_MODER12; // reset port D12
wengefa1 0:0a667cdbf4c1 101 GPIOD->MODER |= GPIO_MODER_MODER12_1; // set alternate mode of port D12
wengefa1 0:0a667cdbf4c1 102 GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR12; // reset pull-up/pull-down on port D12
wengefa1 0:0a667cdbf4c1 103 GPIOD->PUPDR |= GPIO_PUPDR_PUPDR12_1; // set input as pull-down
wengefa1 0:0a667cdbf4c1 104 GPIOD->AFR[1] &= ~(0xF << 4*4); // reset alternate function of port D12
wengefa1 0:0a667cdbf4c1 105 GPIOD->AFR[1] |= 2 << 4*4; // set alternate funtion 2 of port D12
wengefa1 0:0a667cdbf4c1 106
wengefa1 0:0a667cdbf4c1 107 GPIOD->MODER &= ~GPIO_MODER_MODER13; // reset port D13
wengefa1 0:0a667cdbf4c1 108 GPIOD->MODER |= GPIO_MODER_MODER13_1; // set alternate mode of port D13
wengefa1 0:0a667cdbf4c1 109 GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR13; // reset pull-up/pull-down on port D13
wengefa1 0:0a667cdbf4c1 110 GPIOD->PUPDR |= GPIO_PUPDR_PUPDR13_1; // set input as pull-down
wengefa1 0:0a667cdbf4c1 111 GPIOD->AFR[1] &= ~(0xF << 4*5); // reset alternate function of port D13
wengefa1 0:0a667cdbf4c1 112 GPIOD->AFR[1] |= 2 << 4*5; // set alternate funtion 2 of port D13
wengefa1 0:0a667cdbf4c1 113
wengefa1 0:0a667cdbf4c1 114 // configure reset and clock control registers
wengefa1 0:0a667cdbf4c1 115
wengefa1 0:0a667cdbf4c1 116 RCC->APB1RSTR |= RCC_APB1RSTR_TIM4RST; //reset TIM4 controller
wengefa1 0:0a667cdbf4c1 117 RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM4RST;
wengefa1 0:0a667cdbf4c1 118
wengefa1 0:0a667cdbf4c1 119 RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; // TIM4 clock enable
wengefa1 0:0a667cdbf4c1 120
wengefa1 0:0a667cdbf4c1 121 } else {
wengefa1 0:0a667cdbf4c1 122
wengefa1 0:0a667cdbf4c1 123 printf("pinmap not found for peripheral\n");
wengefa1 0:0a667cdbf4c1 124
wengefa1 0:0a667cdbf4c1 125 TIM = NULL;
wengefa1 0:0a667cdbf4c1 126 }
wengefa1 0:0a667cdbf4c1 127
wengefa1 0:0a667cdbf4c1 128 // configure general purpose timer 2, 3 or 4
wengefa1 0:0a667cdbf4c1 129
wengefa1 0:0a667cdbf4c1 130 if (TIM != NULL) {
wengefa1 0:0a667cdbf4c1 131
wengefa1 0:0a667cdbf4c1 132 TIM->CR1 = 0x0000; // counter disable
wengefa1 0:0a667cdbf4c1 133 TIM->CR2 = 0x0000; // reset master mode selection
wengefa1 0:0a667cdbf4c1 134 TIM->SMCR = TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; // counting on both TI1 & TI2 edges
wengefa1 0:0a667cdbf4c1 135 TIM->CCMR1 = TIM_CCMR1_CC2S_0 | TIM_CCMR1_CC1S_0;
wengefa1 0:0a667cdbf4c1 136 TIM->CCMR2 = 0x0000; // reset capture mode register 2
wengefa1 0:0a667cdbf4c1 137 TIM->CCER = TIM_CCER_CC2E | TIM_CCER_CC1E;
wengefa1 0:0a667cdbf4c1 138 TIM->CNT = 0x0000; // reset counter value
wengefa1 0:0a667cdbf4c1 139 TIM->ARR = 0xFFFF; // auto reload register
wengefa1 0:0a667cdbf4c1 140 TIM->CR1 = TIM_CR1_CEN; // counter enable
wengefa1 0:0a667cdbf4c1 141 }
wengefa1 0:0a667cdbf4c1 142 }
wengefa1 0:0a667cdbf4c1 143
wengefa1 0:0a667cdbf4c1 144 /**
wengefa1 0:0a667cdbf4c1 145 * Deletes this EncoderCounter object.
wengefa1 0:0a667cdbf4c1 146 */
wengefa1 0:0a667cdbf4c1 147 EncoderCounter::~EncoderCounter() {}
wengefa1 0:0a667cdbf4c1 148
wengefa1 0:0a667cdbf4c1 149 /**
wengefa1 0:0a667cdbf4c1 150 * Resets the counter value to zero.
wengefa1 0:0a667cdbf4c1 151 */
wengefa1 0:0a667cdbf4c1 152 void EncoderCounter::reset() {
wengefa1 0:0a667cdbf4c1 153
wengefa1 0:0a667cdbf4c1 154 TIM->CNT = 0x0000;
wengefa1 0:0a667cdbf4c1 155 }
wengefa1 0:0a667cdbf4c1 156
wengefa1 0:0a667cdbf4c1 157 /**
wengefa1 0:0a667cdbf4c1 158 * Resets the counter value to a given offset value.
wengefa1 0:0a667cdbf4c1 159 * @param offset the offset value to reset the counter to.
wengefa1 0:0a667cdbf4c1 160 */
wengefa1 0:0a667cdbf4c1 161 void EncoderCounter::reset(short offset) {
wengefa1 0:0a667cdbf4c1 162
wengefa1 0:0a667cdbf4c1 163 TIM->CNT = -offset;
wengefa1 0:0a667cdbf4c1 164 }
wengefa1 0:0a667cdbf4c1 165
wengefa1 0:0a667cdbf4c1 166 /**
wengefa1 0:0a667cdbf4c1 167 * Reads the quadrature encoder counter value.
wengefa1 0:0a667cdbf4c1 168 * @return the quadrature encoder counter as a signed 16-bit integer value.
wengefa1 0:0a667cdbf4c1 169 */
wengefa1 0:0a667cdbf4c1 170 short EncoderCounter::read() {
wengefa1 0:0a667cdbf4c1 171
wengefa1 0:0a667cdbf4c1 172 return (short)(-TIM->CNT);
wengefa1 0:0a667cdbf4c1 173 }
wengefa1 0:0a667cdbf4c1 174
wengefa1 0:0a667cdbf4c1 175 /**
wengefa1 0:0a667cdbf4c1 176 * The empty operator is a shorthand notation of the <code>read()</code> method.
wengefa1 0:0a667cdbf4c1 177 */
wengefa1 0:0a667cdbf4c1 178 EncoderCounter::operator short() {
wengefa1 0:0a667cdbf4c1 179
wengefa1 0:0a667cdbf4c1 180 return read();
wengefa1 0:0a667cdbf4c1 181 }
wengefa1 0:0a667cdbf4c1 182