-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathboard.c
More file actions
116 lines (96 loc) · 2.78 KB
/
Copy pathboard.c
File metadata and controls
116 lines (96 loc) · 2.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/* board.c -- board mapping abstraction
** Copyright (c) 2020-2026 Renaud Fivet
**
** user LED toggled every second
** SysTick interrupt every second
*/
typedef volatile unsigned long register_t ;
/** CORE **********************************************************************/
extern struct {
register_t csr ;
register_t rvr ;
register_t cvr ;
register_t calib ;
} systick ; /* 0xE000E010 */
/** PERIPH ********************************************************************/
#define CAT( a, b) a##b
#define HEXA( a) CAT( 0x, a)
#define RCC_AHBENR_IOPxEN( h) (1 << (17 + HEXA( h) - 0xA))
extern struct {
register_t cr ;
register_t cfgr ;
register_t cir ;
register_t apb2rstr ;
register_t apb1rstr ;
register_t ahbenr ;
register_t apb2enr ;
register_t apb1enr ;
register_t bdcr ;
register_t csr ;
register_t ahbrstr ;
register_t cfgr2 ;
register_t cfgr3 ;
register_t cr2 ;
} rcc ; /* 0x40021000 */
typedef struct {
register_t moder ;
register_t otyper ;
register_t ospeedr ; /* B..F */
register_t pupdr ;
register_t idr ;
register_t odr ;
register_t bsrr ;
register_t lckr ;
register_t afrl ;
register_t afrh ;
register_t brr ;
} gpio_t ;
/* user LED ON:
Board LED_IOP LED_PIN LED_ON
No LED undefined
V1.1/Baite a 4 0
V2.00 a 4 1
Nucleo a 5 1
vcc-gnd b 1 0
Discovery c 8 or 9 1
*/
#define LED_IOP a
#define LED_PIN 4
#define LED_ON 1
#ifdef LED_ON
# define GPIO( x) CAT( gpio, x)
extern gpio_t GPIO( LED_IOP) ; /* gpioa: 0x48000000, gpiob: 0x48000400 */
/* gpioc: 0x48000800 */
#endif
void SysTick_Handler( void) {
#ifdef LED_ON
GPIO( LED_IOP).odr ^= 1 << LED_PIN ; /* toggle PxN (User LED) */
#endif
}
int init( void) {
#define CLOCK 8000000 /* By default HCLK == HSI [8MHZ] */
/* SYSTICK */
#if CLOCK > 0x1000000
# define TICKDIV 8
# define TICKSRC 0 /* STK_CSR_CLKSOURCE == HCLK / 8 */
#else
# define TICKDIV 1
# define TICKSRC 4 /* STK_CSR_CLKSOURCE == HCLK */
#endif
systick.rvr = (CLOCK / TICKDIV) - 1 ;
systick.cvr = 0 ;
systick.csr = TICKSRC | 3 ; /* CLKSOURCE, Interrupt ON, Enable */
/* SysTick_Handler will execute every 1s from now on */
#ifdef LED_ON
/* User LED ON */
rcc.ahbenr |= RCC_AHBENR_IOPxEN( LED_IOP) ; /* Enable IOPx periph */
GPIO( LED_IOP).moder |= 1 << (LED_PIN * 2) ; /* Output [01], over default 00 */
/* OTYPER Push-Pull by default */
/* PxN output default LOW at reset */
# if LED_ON
SysTick_Handler() ;
# endif
#endif
return 0 ;
}
/* end of board.c */