CuVoodoo STM32F1 firmware template
global.h
Go to the documentation of this file.
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  */
20 #pragma once
21 
23 #define DEBUG false
24 
26 #define LENGTH(x) (sizeof(x) / sizeof((x)[0]))
27 
28 #define CAT2(x,y) x##y
29 
30 #define CAT3(x,y,z) x##y##z
31 
32 #define CAT4(w,x,y,z) w##x##y##z
33 
35 #define COMPUTE_BUILD_YEAR \
36  ( \
37  (__DATE__[ 7] - '0') * 1000 + \
38  (__DATE__[ 8] - '0') * 100 + \
39  (__DATE__[ 9] - '0') * 10 + \
40  (__DATE__[10] - '0') \
41  )
42 
43 #define COMPUTE_BUILD_DAY \
44  ( \
45  ((__DATE__[4] >= '0') ? (__DATE__[4] - '0') * 10 : 0) + \
46  (__DATE__[5] - '0') \
47  )
48 
49 #define BUILD_MONTH_IS_JAN (__DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n')
50 
51 #define BUILD_MONTH_IS_FEB (__DATE__[0] == 'F')
52 
53 #define BUILD_MONTH_IS_MAR (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r')
54 
55 #define BUILD_MONTH_IS_APR (__DATE__[0] == 'A' && __DATE__[1] == 'p')
56 
57 #define BUILD_MONTH_IS_MAY (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y')
58 
59 #define BUILD_MONTH_IS_JUN (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n')
60 
61 #define BUILD_MONTH_IS_JUL (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l')
62 
63 #define BUILD_MONTH_IS_AUG (__DATE__[0] == 'A' && __DATE__[1] == 'u')
64 
65 #define BUILD_MONTH_IS_SEP (__DATE__[0] == 'S')
66 
67 #define BUILD_MONTH_IS_OCT (__DATE__[0] == 'O')
68 
69 #define BUILD_MONTH_IS_NOV (__DATE__[0] == 'N')
70 
71 #define BUILD_MONTH_IS_DEC (__DATE__[0] == 'D')
72 
73 #define COMPUTE_BUILD_MONTH \
74  ( \
75  (BUILD_MONTH_IS_JAN) ? 1 : \
76  (BUILD_MONTH_IS_FEB) ? 2 : \
77  (BUILD_MONTH_IS_MAR) ? 3 : \
78  (BUILD_MONTH_IS_APR) ? 4 : \
79  (BUILD_MONTH_IS_MAY) ? 5 : \
80  (BUILD_MONTH_IS_JUN) ? 6 : \
81  (BUILD_MONTH_IS_JUL) ? 7 : \
82  (BUILD_MONTH_IS_AUG) ? 8 : \
83  (BUILD_MONTH_IS_SEP) ? 9 : \
84  (BUILD_MONTH_IS_OCT) ? 10 : \
85  (BUILD_MONTH_IS_NOV) ? 11 : \
86  (BUILD_MONTH_IS_DEC) ? 12 : \
87  /* error default */ 99 \
88  )
89 
90 #define BUILD_DATE_IS_BAD (__DATE__[0] == '?')
91 
92 #define BUILD_YEAR ((BUILD_DATE_IS_BAD) ? 0 : COMPUTE_BUILD_YEAR)
93 
94 #define BUILD_MONTH ((BUILD_DATE_IS_BAD) ? 99 : COMPUTE_BUILD_MONTH)
95 
96 #define BUILD_DAY ((BUILD_DATE_IS_BAD) ? 99 : COMPUTE_BUILD_DAY)
97 
103 #define GPIO(x) CAT2(GPIO,x)
104 
105 #define RCC_GPIO(x) CAT2(RCC_GPIO,x)
106 
107 #define TIM(x) CAT2(TIM,x)
108 
109 #define RCC_TIM(x) CAT2(RCC_TIM,x)
110 
111 #define NVIC_TIM_IRQ(x) CAT3(NVIC_TIM,x,_IRQ)
112 
113 #define TIM_ISR(x) CAT3(tim,x,_isr)
114 
115 #define TIM_CH_PORT(x,y) CAT4(GPIO_BANK_TIM,x,_CH,y)
116 
117 #define TIM_CH_PIN(x,y) CAT4(GPIO_TIM,x,_CH,y)
118 
119 #define RCC_TIM_CH(x,y) CAT4(RCC_TIM,x,_CH,y)
120 #define RCC_TIM1_CH1 RCC_GPIOA
121 #define RCC_TIM1_CH2 RCC_GPIOA
122 #define RCC_TIM1_CH3 RCC_GPIOA
123 #define RCC_TIM1_CH4 RCC_GPIOA
124 #define RCC_TIM1_CH1N RCC_GPIOB
125 #define RCC_TIM1_CH2N RCC_GPIOB
126 #define RCC_TIM1_CH3N RCC_GPIOB
127 #define RCC_TIM2_CH1_ETR RCC_GPIOA
128 #define RCC_TIM2_CH2 RCC_GPIOA
129 #define RCC_TIM2_CH3 RCC_GPIOA
130 #define RCC_TIM2_CH4 RCC_GPIOA
131 #define RCC_TIM3_CH1 RCC_GPIOA
132 #define RCC_TIM3_CH2 RCC_GPIOA
133 #define RCC_TIM3_CH3 RCC_GPIOB
134 #define RCC_TIM3_CH4 RCC_GPIOB
135 #define RCC_TIM4_CH1 RCC_GPIOB
136 #define RCC_TIM4_CH2 RCC_GPIOB
137 #define RCC_TIM4_CH3 RCC_GPIOB
138 #define RCC_TIM4_CH4 RCC_GPIOB
139 #define RCC_TIM5_CH1 RCC_GPIOA
140 #define RCC_TIM5_CH2 RCC_GPIOA
141 #define RCC_TIM5_CH3 RCC_GPIOA
142 #define RCC_TIM5_CH4 RCC_GPIOA
144 #define TIM_IC(x) CAT2(TIM_IC,x)
145 
146 #define TIM_IC_IN_TI(x) CAT2(TIM_IC_IN_TI,x)
147 
148 #define TIM_SR_CCIF(x) CAT3(TIM_SR_CC,x,IF)
149 
150 #define TIM_SR_CCOF(x) CAT3(TIM_SR_CC,x,OF)
151 
152 #define TIM_DIER_CCIE(x) CAT3(TIM_DIER_CC,x,IE)
153 
154 #define TIM_CCR(x,y) CAT2(TIM_CCR,y)(TIM(x))
155 
156 #define EXTI(x) CAT2(EXTI,x)
157 
158 #define NVIC_EXTI_IRQ(x) CAT3(NVIC_EXTI,x,_IRQ)
159 #define NVIC_EXTI5_IRQ NVIC_EXTI9_5_IRQ
160 #define NVIC_EXTI6_IRQ NVIC_EXTI9_5_IRQ
161 #define NVIC_EXTI7_IRQ NVIC_EXTI9_5_IRQ
162 #define NVIC_EXTI8_IRQ NVIC_EXTI9_5_IRQ
163 #define NVIC_EXTI9_IRQ NVIC_EXTI9_5_IRQ
164 #define NVIC_EXTI10_IRQ NVIC_EXTI15_10_IRQ
165 #define NVIC_EXTI11_IRQ NVIC_EXTI15_10_IRQ
166 #define NVIC_EXTI12_IRQ NVIC_EXTI15_10_IRQ
167 #define NVIC_EXTI13_IRQ NVIC_EXTI15_10_IRQ
168 #define NVIC_EXTI14_IRQ NVIC_EXTI15_10_IRQ
169 #define NVIC_EXTI15_IRQ NVIC_EXTI15_10_IRQ
171 #define EXTI_ISR(x) CAT3(exti,x,_isr)
172 #define exti5_isr exti9_5_isr
173 #define exti6_isr exti9_5_isr
174 #define exti7_isr exti9_5_isr
175 #define exti8_isr exti9_5_isr
176 #define exti9_isr exti9_5_isr
177 #define exti10_isr exti15_10_isr
178 #define exti11_isr exti15_10_isr
179 #define exti12_isr exti15_10_isr
180 #define exti13_isr exti15_10_isr
181 #define exti14_isr exti15_10_isr
182 #define exti15_isr exti15_10_isr
184 #define USART(x) CAT2(USART,x)
185 
186 #define RCC_USART(x) CAT2(RCC_USART,x)
187 
188 #define RST_USART(x) CAT2(RST_USART,x)
189 
190 #define USART_IRQ(x) CAT3(NVIC_USART,x,_IRQ)
191 
192 #define USART_ISR(x) CAT3(usart,x,_isr)
193 
194 #define USART_TX_PORT(x) CAT3(GPIO_BANK_USART,x,_TX)
195 
196 #define USART_RX_PORT(x) CAT3(GPIO_BANK_USART,x,_RX)
197 
198 #define USART_RTS_PORT(x) CAT3(GPIO_BANK_USART,x,_RTS)
199 
200 #define USART_CTS_PORT(x) CAT3(GPIO_BANK_USART,x,_CTS)
201 
202 #define USART_TX_PIN(x) CAT3(GPIO_USART,x,_TX)
203 
204 #define USART_RX_PIN(x) CAT3(GPIO_USART,x,_RX)
205 
206 #define USART_RTS_PIN(x) CAT3(GPIO_USART,x,_RTS)
207 
208 #define USART_CTS_PIN(x) CAT3(GPIO_USART,x,_CTS)
209 
210 #define RCC_USART_PORT(x) CAT2(RCC_USART_PORT,x)
211 #define RCC_USART_PORT1 RCC_GPIOA
212 #define RCC_USART_PORT2 RCC_GPIOA
213 #define RCC_USART_PORT3 RCC_GPIOB
215 #define ADC12_IN_PORT(x) CAT3(ADC12_IN,x,_PORT)
216 #define ADC12_IN0_PORT GPIOA
217 #define ADC12_IN1_PORT GPIOA
218 #define ADC12_IN2_PORT GPIOA
219 #define ADC12_IN3_PORT GPIOA
220 #define ADC12_IN4_PORT GPIOA
221 #define ADC12_IN5_PORT GPIOA
222 #define ADC12_IN6_PORT GPIOA
223 #define ADC12_IN7_PORT GPIOA
224 #define ADC12_IN8_PORT GPIOB
225 #define ADC12_IN9_PORT GPIOB
226 #define ADC12_IN10_PORT GPIOC
227 #define ADC12_IN11_PORT GPIOC
228 #define ADC12_IN12_PORT GPIOC
229 #define ADC12_IN13_PORT GPIOC
230 #define ADC12_IN14_PORT GPIOC
231 #define ADC12_IN15_PORT GPIOC
233 #define ADC12_IN_PIN(x) CAT3(ADC12_IN,x,_PIN)
234 #define ADC12_IN0_PIN GPIO0
235 #define ADC12_IN1_PIN GPIO1
236 #define ADC12_IN2_PIN GPIO2
237 #define ADC12_IN3_PIN GPIO3
238 #define ADC12_IN4_PIN GPIO4
239 #define ADC12_IN5_PIN GPIO5
240 #define ADC12_IN6_PIN GPIO6
241 #define ADC12_IN7_PIN GPIO7
242 #define ADC12_IN8_PIN GPIO0
243 #define ADC12_IN9_PIN GPIO1
244 #define ADC12_IN10_PIN GPIO0
245 #define ADC12_IN11_PIN GPIO1
246 #define ADC12_IN12_PIN GPIO2
247 #define ADC12_IN13_PIN GPIO3
248 #define ADC12_IN14_PIN GPIO4
249 #define ADC12_IN15_PIN GPIO5
251 #define RCC_ADC12_IN(x) CAT2(RCC_ADC12_IN,x)
252 #define RCC_ADC12_IN0 RCC_GPIOA
253 #define RCC_ADC12_IN1 RCC_GPIOA
254 #define RCC_ADC12_IN2 RCC_GPIOA
255 #define RCC_ADC12_IN3 RCC_GPIOA
256 #define RCC_ADC12_IN4 RCC_GPIOA
257 #define RCC_ADC12_IN5 RCC_GPIOA
258 #define RCC_ADC12_IN6 RCC_GPIOA
259 #define RCC_ADC12_IN7 RCC_GPIOA
260 #define RCC_ADC12_IN8 RCC_GPIOB
261 #define RCC_ADC12_IN9 RCC_GPIOB
262 #define RCC_ADC12_IN10 RCC_GPIOC
263 #define RCC_ADC12_IN11 RCC_GPIOC
264 #define RCC_ADC12_IN12 RCC_GPIOC
265 #define RCC_ADC12_IN13 RCC_GPIOC
266 #define RCC_ADC12_IN14 RCC_GPIOC
267 #define RCC_ADC12_IN15 RCC_GPIOC
269 #define ADC_CHANNEL(x) CAT2(ADC_CHANNEL,x)
270 
271 #define SPI(x) CAT2(SPI,x)
272 
273 #define RCC_SPI(x) CAT2(RCC_SPI,x)
274 
275 #define RCC_SPI_NSS_PORT(x) CAT3(RCC_SPI,x,_NSS_PORT)
276 #define RCC_SPI1_NSS_PORT RCC_GPIOA
277 #define RCC_SPI1_RE_NSS_PORT RCC_GPIOA
278 #define RCC_SPI2_NSS_PORT RCC_GPIOB
280 #define RCC_SPI_SCK_PORT(x) CAT3(RCC_SPI,x,_SCK_PORT)
281 #define RCC_SPI1_SCK_PORT RCC_GPIOA
282 #define RCC_SPI1_RE_SCK_PORT RCC_GPIOB
283 #define RCC_SPI2_SCK_PORT RCC_GPIOB
285 #define RCC_SPI_MISO_PORT(x) CAT3(RCC_SPI,x,_MISO_PORT)
286 #define RCC_SPI1_MISO_PORT RCC_GPIOA
287 #define RCC_SPI1_RE_MISO_PORT RCC_GPIOB
288 #define RCC_SPI2_MISO_PORT RCC_GPIOB
290 #define RCC_SPI_MOSI_PORT(x) CAT3(RCC_SPI,x,_MOSI_PORT)
291 #define RCC_SPI1_MOSI_PORT RCC_GPIOA
292 #define RCC_SPI1_RE_MOSI_PORT RCC_GPIOB
293 #define RCC_SPI2_MOSI_PORT RCC_GPIOB
295 #define SPI_NSS_PORT(x) CAT3(GPIO_BANK_SPI,x,_NSS)
296 
297 #define SPI_SCK_PORT(x) CAT3(GPIO_BANK_SPI,x,_SCK)
298 
299 #define SPI_MISO_PORT(x) CAT3(GPIO_BANK_SPI,x,_MISO)
300 
301 #define SPI_MOSI_PORT(x) CAT3(GPIO_BANK_SPI,x,_MOSI)
302 
303 #define SPI_NSS_PIN(x) CAT3(GPIO_SPI,x,_NSS)
304 
305 #define SPI_SCK_PIN(x) CAT3(GPIO_SPI,x,_SCK)
306 
307 #define SPI_MISO_PIN(x) CAT3(GPIO_SPI,x,_MISO)
308 
309 #define SPI_MOSI_PIN(x) CAT3(GPIO_SPI,x,_MOSI)
310 
311 #define SPI_CRC_PR(x) CAT3(SPI,x,_CRCPR)
312 
313 #define SPI_CRC_TXR(x) CAT3(SPI,x,_TXCRCR)
314 
315 #define SPI_CRC_RXR(x) CAT3(SPI,x,_RXCRCR)
316 
317 #define DMA_SPI(x) CAT2(DMA_SPI,x)
318 #define DMA_SPI1 DMA1
319 #define DMA_SPI2 DMA1
320 #define DMA_SPI3 DMA2
322 #define RCC_DMA_SPI(x) CAT2(RCC_DMA_SPI,x)
323 #define RCC_DMA_SPI1 RCC_DMA1
324 #define RCC_DMA_SPI2 RCC_DMA1
325 #define RCC_DMA_SPI3 RCC_DMA2
327 #define DMA_CHANNEL_SPI_TX(x) CAT3(DMA_CHANNEL_SPI,x,_TX)
328 #define DMA_CHANNEL_SPI1_TX DMA_CHANNEL3
329 #define DMA_CHANNEL_SPI2_TX DMA_CHANNEL5
330 #define DMA_CHANNEL_SPI3_TX DMA_CHANNEL2
332 #define DMA_CHANNEL_SPI_RX(x) CAT3(DMA_CHANNEL_SPI,x,_RX)
333 #define DMA_CHANNEL_SPI1_RX DMA_CHANNEL4
334 #define DMA_CHANNEL_SPI2_RX DMA_CHANNEL2
335 #define DMA_CHANNEL_SPI3_RX DMA_CHANNEL1
337 #define DMA_IRQ_SPI_TX(x) CAT3(NVIC_DMA_CHANNEL_IRQ_SPI,x,_TX)
338 #define NVIC_DMA_CHANNEL_IRQ_SPI1_TX NVIC_DMA1_CHANNEL3_IRQ
339 #define NVIC_DMA_CHANNEL_IRQ_SPI2_TX NVIC_DMA1_CHANNEL5_IRQ
340 #define NVIC_DMA_CHANNEL_IRQ_SPI3_TX NVIC_DMA2_CHANNEL2_IRQ
342 #define DMA_IRQ_SPI_RX(x) CAT3(NVIC_DMA_CHANNEL_IRQ_SPI,x,_RX)
343 #define NVIC_DMA_CHANNEL_IRQ_SPI1_RX NVIC_DMA1_CHANNEL4_IRQ
344 #define NVIC_DMA_CHANNEL_IRQ_SPI2_RX NVIC_DMA1_CHANNEL2_IRQ
345 #define NVIC_DMA_CHANNEL_IRQ_SPI3_RX NVIC_DMA2_CHANNEL1_IRQ
347 #define DMA_ISR_SPI_TX(x) CAT3(DMA_CHANNEL_ISR_SPI,x,_TX)
348 #define DMA_CHANNEL_ISR_SPI1_TX dma1_channel3_isr
349 #define DMA_CHANNEL_ISR_SPI2_TX dma1_channel5_isr
350 #define DMA_CHANNEL_ISR_SPI3_TX dma2_channel2_isr
352 #define DMA_ISR_SPI_RX(x) CAT3(DMA_CHANNEL_ISR_SPI,x,_RX)
353 #define DMA_CHANNEL_ISR_SPI1_RX dma1_channel4_isr
354 #define DMA_CHANNEL_ISR_SPI2_RX dma1_channel2_isr
355 #define DMA_CHANNEL_ISR_SPI3_RX dma2_channel1_isr
361 #if defined(SYSTEM_BOARD) || defined(CORE_BOARD)
362  /* on system and core board LED is on pin 11/PA1 */
363  #define LED_PORT A
364  #define LED_PIN 1
365  #define LED_ON 0
366 #elif defined(BLUE_PILL)
367  /* on minimum system LED is on pin 2/PC13 */
368  #define LED_PORT C
369  #define LED_PIN 13
370  #define LED_ON 0
371 #elif defined (MAPLE_MINI)
372  /* on maple mini LED is on pin 19/PB1 */
373  #define LED_PORT B
374  #define LED_PIN 1
375  #define LED_ON 1
376 #elif defined (BUSVOODOO)
377  /* on BusVoodoo LED is on pin PA8 */
378  #define LED_PORT A
379  #define LED_PIN 8
380  #define LED_ON 1
381 #endif
382 
387 #if defined(MAPLE_MINI)
388  /* on maple mini user button is on 32/PB8 */
389  #define BUTTON_PORT B
390  #define BUTTON_PIN 8
391  #define BUTTON_PRESSED 1
392 #elif defined(CORE_BOARD)
393  /* on core board user button is on PA8 */
394  #define BUTTON_PORT A
395  #define BUTTON_PIN 8
396  #define BUTTON_PRESSED 0
397 #endif
398 
403 #if defined(MAPLE_MINI)
404  /* use button */
405  #define DFU_FORCE_PORT BUTTON_PORT
406  #define DFU_FORCE_PIN BUTTON_PIN
407  #define DFU_FORCE_VALUE 1
408 #elif defined(CORE_BOARD)
409  /* use button */
410  #define DFU_FORCE_PORT BUTTON_PORT
411  #define DFU_FORCE_PIN BUTTON_PIN
412  #define DFU_FORCE_VALUE 0
413 #elif defined(BUSVOODOO)
414 #if BUSVOODOO_HARDWARE_VERSION==0
415  /* on BusVoodoo v0 DFU input is on PC7 */
416  #define DFU_FORCE_PORT C
417  #define DFU_FORCE_PIN 7
418  #define DFU_FORCE_VALUE 1
419 #else
420  /* on BusVoodoo vA DFU input is on PC4 */
421  #define DFU_FORCE_PORT C
422  #define DFU_FORCE_PIN 4
423  #define DFU_FORCE_VALUE 1
424 #endif
425 #else
426  /* use the JNTRST pin as GPIO (SWJ will still be working, minus NTRST) */
427  #define DFU_FORCE_PORT B
428  #define DFU_FORCE_PIN 4
429  #define DFU_FORCE_VALUE 0
430 #endif
431 
436 extern char __application_beginning;
440 extern char __application_end;
444 extern char __flash_end;
446 extern volatile bool button_flag;
448 extern volatile bool user_input_available;
449 
455 char* b2s(uint64_t binary, uint8_t rjust);
457 void led_on(void);
459 void led_off(void);
461 void led_toggle(void);
465 void sleep_us(uint32_t duration);
469 void sleep_ms(uint32_t duration);
475 char user_input_get(void);
480 void user_input_store(char c);
482 void board_setup(void);
483 
void led_off(void)
switch off board LED
Definition: global.c:80
char __application_beginning
symbol for beginning of the application
void led_on(void)
switch on board LED
Definition: global.c:67
char __flash_end
symbol for end of flash
void led_toggle(void)
toggle board LED
Definition: global.c:94
void sleep_us(uint32_t duration)
go to sleep for some microseconds
Definition: global.c:102
void sleep_ms(uint32_t duration)
go to sleep for some milliseconds
Definition: global.c:117
char * b2s(uint64_t binary, uint8_t rjust)
get binary representation of a number
Definition: global.c:44
char user_input_get(void)
get user input
Definition: global.c:145
char __application_end
symbol for end of the application
volatile bool user_input_available
flag set when user input is available
Definition: global.c:36
volatile bool button_flag
flag set when board user button has been pressed/released
Definition: global.c:35
void board_setup(void)
setup board peripherals
Definition: global.c:169
void user_input_store(char c)
store user input
Definition: global.c:157