Initial commit of code
[barbilliards.git] / src / global.h
1 /* This program is free software: you can redistribute it and/or modify
2  * it under the terms of the GNU General Public License as published by
3  * the Free Software Foundation, either version 3 of the License, or
4  * (at your option) any later version.
5  *
6  * This program is distributed in the hope that it will be useful,
7  * but WITHOUT ANY WARRANTY; without even the implied warranty of
8  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9  * GNU General Public License for more details.
10  *
11  * You should have received a copy of the GNU General Public License
12  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
13  *
14  */
15 /** global definitions and methods (API)
16  *  @file global.h
17  *  @author King Kévin <kingkevin@cuvoodoo.info>
18  *  @date 2016
19  */
20 #pragma once
21
22 /** enable debugging functionalities */
23 #define DEBUG false
24
25 /** get the length of an array */
26 #define LENGTH(x) (sizeof(x) / sizeof((x)[0]))
27 /** concatenate 2 arguments */
28 #define CAT2(x,y) x##y
29 /** concatenate 3 arguments */
30 #define CAT3(x,y,z) x##y##z
31 /** concatenate 4 arguments */
32 #define CAT4(w,x,y,z) w##x##y##z
33
34 /** @defgroup reg_macro macros to  define values based on other defines values
35  *  @note used when the value is calculated or isn't a value
36  *  @{
37  */
38 /** get GPIO based on GPIO identifier */
39 #define GPIO(x) CAT2(GPIO,x)
40 /** get RCC for GPIO based on GPIO identifier */
41 #define RCC_GPIO(x) CAT2(RCC_GPIO,x)
42 /** get TIM based on TIM identifier */
43 #define TIM(x) CAT2(TIM,x)
44 /** get RCC for timer based on TIM identifier */
45 #define RCC_TIM(x) CAT2(RCC_TIM,x)
46 /** get NVIC IRQ for timer base on TIM identifier */
47 #define NVIC_TIM_IRQ(x) CAT3(NVIC_TIM,x,_IRQ)
48 /** get interrupt service routine for timer base on TIM identifier */
49 #define TIM_ISR(x) CAT3(tim,x,_isr)
50 /** get port based on TIMx_CHy identifier */
51 #define TIM_CH_PORT(x,y) CAT4(GPIO_BANK_TIM,x,_CH,y)
52 /** get pin based on TIMx_CHy identifier */
53 #define TIM_CH_PIN(x,y) CAT4(GPIO_TIM,x,_CH,y)
54 /** get RCC for port based on TIMx_CHy identifier */
55 #define RCC_TIM_CH(x,y) CAT4(RCC_TIM,x,_CH,y)
56 #define RCC_TIM1_CH1 RCC_GPIOA /**< RCC for port for on TIM1_CH1 */
57 #define RCC_TIM1_CH2 RCC_GPIOA /**< RCC for port for on TIM1_CH2 */
58 #define RCC_TIM1_CH3 RCC_GPIOA /**< RCC for port for on TIM1_CH3 */
59 #define RCC_TIM1_CH4 RCC_GPIOA /**< RCC for port for on TIM1_CH4 */
60 #define RCC_TIM1_CH1N RCC_GPIOB /**< RCC for port for on TIM1_CH1N */
61 #define RCC_TIM1_CH2N RCC_GPIOB /**< RCC for port for on TIM1_CH2N */
62 #define RCC_TIM1_CH3N RCC_GPIOB /**< RCC for port for on TIM1_CH3N */
63 #define RCC_TIM2_CH1_ETR RCC_GPIOA /**< RCC for port for on TIM2_CH1_ETR */
64 #define RCC_TIM2_CH2 RCC_GPIOA /**< RCC for port for on TIM2_CH2 */
65 #define RCC_TIM2_CH3 RCC_GPIOA /**< RCC for port for on TIM2_CH3 */
66 #define RCC_TIM2_CH4 RCC_GPIOA /**< RCC for port for on TIM2_CH4 */
67 #define RCC_TIM3_CH1 RCC_GPIOA /**< RCC for port for on TIM3_CH1 */
68 #define RCC_TIM3_CH2 RCC_GPIOA /**< RCC for port for on TIM3_CH2 */
69 #define RCC_TIM3_CH3 RCC_GPIOB /**< RCC for port for on TIM3_CH3 */
70 #define RCC_TIM3_CH4 RCC_GPIOB /**< RCC for port for on TIM3_CH4 */
71 #define RCC_TIM4_CH1 RCC_GPIOB /**< RCC for port for on TIM4_CH1 */
72 #define RCC_TIM4_CH2 RCC_GPIOB /**< RCC for port for on TIM4_CH2 */
73 #define RCC_TIM4_CH3 RCC_GPIOB /**< RCC for port for on TIM4_CH3 */
74 #define RCC_TIM4_CH4 RCC_GPIOB /**< RCC for port for on TIM4_CH4 */
75 #define RCC_TIM5_CH1 RCC_GPIOA /**< RCC for port for on TIM5_CH1 */
76 #define RCC_TIM5_CH2 RCC_GPIOA /**< RCC for port for on TIM5_CH2 */
77 #define RCC_TIM5_CH3 RCC_GPIOA /**< RCC for port for on TIM5_CH3 */
78 #define RCC_TIM5_CH4 RCC_GPIOA /**< RCC for port for on TIM5_CH4 */
79 /** get TIM_IC based on CHx identifier */
80 #define TIM_IC(x) CAT2(TIM_IC,x)
81 /** get TIM_IC_IN_TI based on CHx identifier */
82 #define TIM_IC_IN_TI(x) CAT2(TIM_IC_IN_TI,x)
83 /** get TIM_SR_CCxIF based on CHx identifier */
84 #define TIM_SR_CCIF(x) CAT3(TIM_SR_CC,x,IF)
85 /** get TIM_DIER_CCxIE based on CHx identifier */
86 #define TIM_DIER_CCIE(x) CAT3(TIM_DIER_CC,x,IE)
87 /** get TIM_CCRy register based on TIMx_CHy identifier */
88 #define TIM_CCR(x,y) CAT2(TIM_CCR,y)(TIM(x))
89 /** get external interrupt based on pin identifier */
90 #define EXTI(x) CAT2(EXTI,x)
91 /** get NVIC IRQ for external interrupt base on external interrupt/pin */
92 #define NVIC_EXTI_IRQ(x) CAT3(NVIC_EXTI,x,_IRQ)
93 #define NVIC_EXTI5_IRQ NVIC_EXTI9_5_IRQ /**< IRQ for line 9 to 5 for pin 5 */
94 #define NVIC_EXTI6_IRQ NVIC_EXTI9_5_IRQ /**< IRQ for line 9 to 5 for pin 6 */
95 #define NVIC_EXTI7_IRQ NVIC_EXTI9_5_IRQ /**< IRQ for line 9 to 5 for pin 7 */
96 #define NVIC_EXTI8_IRQ NVIC_EXTI9_5_IRQ /**< IRQ for line 9 to 5 for pin 8 */
97 #define NVIC_EXTI9_IRQ NVIC_EXTI9_5_IRQ /**< IRQ for line 9 to 5 for pin 9 */
98 #define NVIC_EXTI10_IRQ NVIC_EXTI15_10_IRQ /**< IRQ for line 15 to 10 for pin 10 */
99 #define NVIC_EXTI11_IRQ NVIC_EXTI15_10_IRQ /**< IRQ for line 15 to 10 for pin 11 */
100 #define NVIC_EXTI12_IRQ NVIC_EXTI15_10_IRQ /**< IRQ for line 15 to 10 for pin 12 */
101 #define NVIC_EXTI13_IRQ NVIC_EXTI15_10_IRQ /**< IRQ for line 15 to 10 for pin 13 */
102 #define NVIC_EXTI14_IRQ NVIC_EXTI15_10_IRQ /**< IRQ for line 15 to 10 for pin 14 */
103 #define NVIC_EXTI15_IRQ NVIC_EXTI15_10_IRQ /**< IRQ for line 15 to 10 for pin 15 */
104 /** get interrupt service routine for timer base on external interrupt/pin */
105 #define EXTI_ISR(x) CAT3(exti,x,_isr)
106 #define exti5_isr exti9_5_isr /**< isr for line 9 to 5 for pin 5 */
107 #define exti6_isr exti9_5_isr /**< isr for line 9 to 5 for pin 6 */
108 #define exti7_isr exti9_5_isr /**< isr for line 9 to 5 for pin 7 */
109 #define exti8_isr exti9_5_isr /**< isr for line 9 to 5 for pin 8 */
110 #define exti9_isr exti9_5_isr /**< isr for line 9 to 5 for pin 9 */
111 #define exti10_isr exti15_10_isr /**< isr for line 15 to 10 for pin 10 */
112 #define exti11_isr exti15_10_isr /**< isr for line 15 to 10 for pin 11 */
113 #define exti12_isr exti15_10_isr /**< isr for line 15 to 10 for pin 12 */
114 #define exti13_isr exti15_10_isr /**< isr for line 15 to 10 for pin 13 */
115 #define exti14_isr exti15_10_isr /**< isr for line 15 to 10 for pin 14 */
116 #define exti15_isr exti15_10_isr /**< isr for line 15 to 10 for pin 15 */
117 /** get USART based on USART identifier */
118 #define USART(x) CAT2(USART,x)
119 /** get RCC for USART based on USART identifier */
120 #define USART_RCC(x) CAT2(RCC_USART,x)
121 /** get NVIC IRQ for USART based on USART identifier */
122 #define USART_IRQ(x) CAT3(NVIC_USART,x,_IRQ)
123 /** get interrupt service routine for USART based on USART identifier */
124 #define USART_ISR(x) CAT3(usart,x,_isr)
125 /** get port for USART based on USART identifier */
126 #define USART_PORT(x) CAT2(USART_PORT,x)
127 #define USART_PORT1 GPIOA /**< USART 1 is on port A */
128 #define USART_PORT2 GPIOA /**< USART 2 is on port A */
129 #define USART_PORT3 GPIOB /**< USART 3 is on port B */
130 /** get RCC for USART port based on USART identifier */
131 #define USART_PORT_RCC(x) CAT2(RCC_USART_PORT,x)
132 #define RCC_USART_PORT1 RCC_GPIOA /**< USART 1 is on port A */
133 #define RCC_USART_PORT2 RCC_GPIOA /**< USART 2 is on port A */
134 #define RCC_USART_PORT3 RCC_GPIOB /**< USART 3 is on port B */
135 /** get transmit pin for USART based on USART identifier */
136 #define USART_PIN_TX(x) CAT3(GPIO_USART,x,_TX)
137 /** get receive pin for USART based on USART identifier */
138 #define USART_PIN_RX(x) CAT3(GPIO_USART,x,_RX)
139 /** get port based on ADC12_IN identifier */
140 #define ADC12_IN_PORT(x) CAT3(ADC12_IN,x,_PORT)
141 #define ADC12_IN0_PORT GPIOA /**< ADC12_IN0 is on PA0 */
142 #define ADC12_IN1_PORT GPIOA /**< ADC12_IN1 is on PA1 */
143 #define ADC12_IN2_PORT GPIOA /**< ADC12_IN2 is on PA2 */
144 #define ADC12_IN3_PORT GPIOA /**< ADC12_IN3 is on PA3 */
145 #define ADC12_IN4_PORT GPIOA /**< ADC12_IN4 is on PA4 */
146 #define ADC12_IN5_PORT GPIOA /**< ADC12_IN5 is on PA5 */
147 #define ADC12_IN6_PORT GPIOA /**< ADC12_IN6 is on PA6 */
148 #define ADC12_IN7_PORT GPIOA /**< ADC12_IN7 is on PA7 */
149 #define ADC12_IN8_PORT GPIOB /**< ADC12_IN8 is on PB0 */
150 #define ADC12_IN9_PORT GPIOB /**< ADC12_IN9 is on PB1 */
151 #define ADC12_IN10_PORT GPIOC /**< ADC12_IN10 is on PC0 */
152 #define ADC12_IN11_PORT GPIOC /**< ADC12_IN11 is on PC1 */
153 #define ADC12_IN12_PORT GPIOC /**< ADC12_IN12 is on PC2 */
154 #define ADC12_IN13_PORT GPIOC /**< ADC12_IN13 is on PC3 */
155 #define ADC12_IN14_PORT GPIOC /**< ADC12_IN14 is on PC4 */
156 #define ADC12_IN15_PORT GPIOC /**< ADC12_IN15 is on PC5 */
157 /** get pin based on ADC12_IN identifier */
158 #define ADC12_IN_PIN(x) CAT3(ADC12_IN,x,_PIN)
159 #define ADC12_IN0_PIN GPIO0 /**< ADC12_IN0 is on PA0 */
160 #define ADC12_IN1_PIN GPIO1 /**< ADC12_IN1 is on PA1 */
161 #define ADC12_IN2_PIN GPIO2 /**< ADC12_IN2 is on PA2 */
162 #define ADC12_IN3_PIN GPIO3 /**< ADC12_IN3 is on PA3 */
163 #define ADC12_IN4_PIN GPIO4 /**< ADC12_IN4 is on PA4 */
164 #define ADC12_IN5_PIN GPIO5 /**< ADC12_IN5 is on PA5 */
165 #define ADC12_IN6_PIN GPIO6 /**< ADC12_IN6 is on PA6 */
166 #define ADC12_IN7_PIN GPIO7 /**< ADC12_IN7 is on PA7 */
167 #define ADC12_IN8_PIN GPIO0 /**< ADC12_IN8 is on PB0 */
168 #define ADC12_IN9_PIN GPIO1 /**< ADC12_IN9 is on PB1 */
169 #define ADC12_IN10_PIN GPIO0 /**< ADC12_IN10 is on PC0 */
170 #define ADC12_IN11_PIN GPIO1 /**< ADC12_IN11 is on PC1 */
171 #define ADC12_IN12_PIN GPIO2 /**< ADC12_IN12 is on PC2 */
172 #define ADC12_IN13_PIN GPIO3 /**< ADC12_IN13 is on PC3 */
173 #define ADC12_IN14_PIN GPIO4 /**< ADC12_IN14 is on PC4 */
174 #define ADC12_IN15_PIN GPIO5 /**< ADC12_IN15 is on PC5 */
175 /** get RCC based on ADC12_IN identifier */
176 #define RCC_ADC12_IN(x) CAT2(RCC_ADC12_IN,x)
177 #define RCC_ADC12_IN0 RCC_GPIOA /**< ADC12_IN0 is on PA0 */
178 #define RCC_ADC12_IN1 RCC_GPIOA /**< ADC12_IN1 is on PA1 */
179 #define RCC_ADC12_IN2 RCC_GPIOA /**< ADC12_IN2 is on PA2 */
180 #define RCC_ADC12_IN3 RCC_GPIOA /**< ADC12_IN3 is on PA3 */
181 #define RCC_ADC12_IN4 RCC_GPIOA /**< ADC12_IN4 is on PA4 */
182 #define RCC_ADC12_IN5 RCC_GPIOA /**< ADC12_IN5 is on PA5 */
183 #define RCC_ADC12_IN6 RCC_GPIOA /**< ADC12_IN6 is on PA6 */
184 #define RCC_ADC12_IN7 RCC_GPIOA /**< ADC12_IN7 is on PA7 */
185 #define RCC_ADC12_IN8 RCC_GPIOB /**< ADC12_IN8 is on PB0 */
186 #define RCC_ADC12_IN9 RCC_GPIOB /**< ADC12_IN9 is on PB1 */
187 #define RCC_ADC12_IN10 RCC_GPIOC /**< ADC12_IN10 is on PC0 */
188 #define RCC_ADC12_IN11 RCC_GPIOC /**< ADC12_IN11 is on PC1 */
189 #define RCC_ADC12_IN12 RCC_GPIOC /**< ADC12_IN12 is on PC2 */
190 #define RCC_ADC12_IN13 RCC_GPIOC /**< ADC12_IN13 is on PC3 */
191 #define RCC_ADC12_IN14 RCC_GPIOC /**< ADC12_IN14 is on PC4 */
192 #define RCC_ADC12_IN15 RCC_GPIOC /**< ADC12_IN15 is on PC5 */
193 /** get channel based on ADC12_IN identifier */
194 #define ADC_CHANNEL(x) CAT2(ADC_CHANNEL,x)
195 /** get I2C based on I2C identifier */
196 #define I2C(x) CAT2(I2C,x)
197 /** get RCC for I2C based on I2C identifier */
198 #define RCC_I2C(x) CAT2(RCC_I2C,x)
199 /** get RCC for GPIO port for SCL based on I2C identifier */
200 #define RCC_I2C_SCL_PORT(x) CAT3(RCC_I2C,x,_PORT)
201 #define RCC_I2C1_PORT RCC_GPIOB /**< RCC for GPIO port for SCL for I2C1 */
202 #define RCC_I2C2_PORT RCC_GPIOB /**< RCC for GPIO port for SCL for I2C2 */
203 /** get RCC for GPIO port for SCL based on I2C identifier */
204 #define RCC_I2C_SDA_PORT(x) CAT3(RCC_I2C,x,_PORT)
205 #define RCC_I2C1_SDA_PORT RCC_GPIOB /**< RCC for GPIO port for SDA for I2C1 */
206 #define RCC_I2C2_SDA_PORT RCC_GPIOB /**< RCC for GPIO port for SDA for I2C2 */
207 /** get I2C port for SCL pin based on I2C identifier */
208 #define I2C_SCL_PORT(x) CAT3(GPIO_BANK_I2C,x,_SCL)
209 /** get I2C port for SDA pin based on I2C identifier */
210 #define I2C_SDA_PORT(x) CAT3(GPIO_BANK_I2C,x,_SDA)
211 /** get I2C pin for SCL pin based on I2C identifier */
212 #define I2C_SCL_PIN(x) CAT3(GPIO_I2C,x,_SCL)
213 /** get I2C port for SDA pin based on I2C identifier */
214 #define I2C_SDA_PIN(x) CAT3(GPIO_I2C,x,_SDA)
215 /** get SPI based on SPI identifier */
216 #define SPI(x) CAT2(SPI,x)
217 /** get RCC for SPI based on SPI identifier */
218 #define RCC_SPI(x) CAT2(RCC_SPI,x)
219 /** get RCC for GPIO port for SPI NSS signals */
220 #define RCC_SPI_NSS_PORT(x) CAT3(RCC_SPI,x,_NSS_PORT)
221 #define RCC_SPI1_NSS_PORT RCC_GPIOA /**< RCC for GPIO port for NSS for SPI1 */
222 #define RCC_SPI1_RE_NSS_PORT RCC_GPIOA /**< RCC for GPIO port for NSS for SPI1_RE */
223 #define RCC_SPI2_NSS_PORT RCC_GPIOB /**< RCC for GPIO port for NSS for SPI2 */
224 /** get RCC for GPIO port for SPI SCK signals */
225 #define RCC_SPI_SCK_PORT(x) CAT3(RCC_SPI,x,_SCK_PORT)
226 #define RCC_SPI1_SCK_PORT RCC_GPIOA /**< RCC for GPIO port for NSS for SPI1 */
227 #define RCC_SPI1_RE_SCK_PORT RCC_GPIOB /**< RCC for GPIO port for NSS for SPI1_RE */
228 #define RCC_SPI2_SCK_PORT RCC_GPIOB /**< RCC for GPIO port for NSS for SPI2 */
229 /** get RCC for GPIO port for SPI MISO signals */
230 #define RCC_SPI_MISO_PORT(x) CAT3(RCC_SPI,x,_MISO_PORT)
231 #define RCC_SPI1_MISO_PORT RCC_GPIOA /**< RCC for GPIO port for NSS for SPI1 */
232 #define RCC_SPI1_RE_MISO_PORT RCC_GPIOB /**< RCC for GPIO port for NSS for SPI1_RE */
233 #define RCC_SPI2_MISO_PORT RCC_GPIOB /**< RCC for GPIO port for NSS for SPI2 */
234 /** get RCC for GPIO port for SPI MOSI signals */
235 #define RCC_SPI_MOSI_PORT(x) CAT3(RCC_SPI,x,_MOSI_PORT)
236 #define RCC_SPI1_MOSI_PORT RCC_GPIOA /**< RCC for GPIO port for NSS for SPI1 */
237 #define RCC_SPI1_RE_MOSI_PORT RCC_GPIOB /**< RCC for GPIO port for NSS for SPI1_RE */
238 #define RCC_SPI2_MOSI_PORT RCC_GPIOB /**< RCC for GPIO port for NSS for SPI2 */
239 /** get SPI port for NSS signal based on SPI identifier */
240 #define SPI_NSS_PORT(x) CAT3(GPIO_BANK_SPI,x,_NSS)
241 /** get SPI port for SCK signal based on SPI identifier */
242 #define SPI_SCK_PORT(x) CAT3(GPIO_BANK_SPI,x,_SCK)
243 /** get SPI port for MISO signal based on SPI identifier */
244 #define SPI_MISO_PORT(x) CAT3(GPIO_BANK_SPI,x,_MISO)
245 /** get SPI port for MOSI signal based on SPI identifier */
246 #define SPI_MOSI_PORT(x) CAT3(GPIO_BANK_SPI,x,_MOSI)
247 /** get SPI pin for NSS signal based on SPI identifier */
248 #define SPI_NSS_PIN(x) CAT3(GPIO_SPI,x,_NSS)
249 /** get SPI pin for SCK signal based on SPI identifier */
250 #define SPI_SCK_PIN(x) CAT3(GPIO_SPI,x,_SCK)
251 /** get SPI pin for MISO signal based on SPI identifier */
252 #define SPI_MISO_PIN(x) CAT3(GPIO_SPI,x,_MISO)
253 /** get SPI pin for MOSI signal based on SPI identifier */
254 #define SPI_MOSI_PIN(x) CAT3(GPIO_SPI,x,_MOSI)
255
256 /** @} */
257
258 /** @defgroup board_led board LED GPIO
259  *  @{
260  */
261 #if defined(SYSTEM_BOARD) || defined(CORE_BOARD)
262 /* on system and core board LED is on pin 11/PA1 */
263 #define LED_PORT A /**< GPIO port (port A) */
264 #define LED_PIN 1 /**< GPIO pin (pin PA1) */
265 #elif defined(BLUE_PILL)
266 /* on minimum system LED is on pin 2/PC13 */
267 #define LED_PORT C /**< GPIO port (port C on blue pill) */
268 #define LED_PIN 13 /**< GPIO pin (pin PC13 on system board) */
269 #elif defined (MAPLE_MINI)
270 /* on maple mini LED is on pin 19/PB1 */
271 #define LED_PORT B /**< GPIO port (port B on maple mini) */
272 #define LED_PIN 1 /**< GPIO pin (pin PB1 on maple mini) */
273 #endif
274 /** @} */
275
276 /** @defgroup board_button board user button GPIO
277  *  @{
278  */
279 #if defined(MAPLE_MINI)
280 /* on maple mini user button is on 32/PB8 */
281 #define BUTTON_PORT B /**< GPIO port (port B on maple mini) */
282 #define BUTTON_PIN 8 /**< GPIO pin (pin PB8 on maple mini) */
283 #elif defined(CORE_BOARD)
284 /* on core board user button is on PA8 */
285 #define BUTTON_PORT A /**< GPIO port (port A) */
286 #define BUTTON_PIN 8 /**< GPIO pin (pin PA8) */
287 #endif
288 /** @} */
289
290 extern volatile bool button_flag; /**< flag set when board user button has been pressed/released */
291
292 /** get binary representation of a number
293  *  @param[in] binary number to represent in binary
294  *  @param[in] rjust justify representation with leading zeros
295  *  @return string with binary representation of the number
296  */
297 char* b2s(uint64_t binary, uint8_t rjust);
298
299 /** switch on board LED */
300 void led_on(void);
301
302 /** switch off board LED */
303 void led_off(void);
304
305 /** toggle board LED */
306 void led_toggle(void);
307
308 /** setup board peripherals */
309 void board_setup(void);
310