-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathledon.c
More file actions
94 lines (78 loc) · 2.37 KB
/
Copy pathledon.c
File metadata and controls
94 lines (78 loc) · 2.37 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
/* ledon.c -- user LED on
** Copyright (c) 2020-2026 Renaud Fivet
*/
/* Memory locations defined by linker script */
void __StackTop( void) ; /* __StackTop points after end of stack */
void Reset_Handler( void) ; /* Entry point for execution */
/* Interrupt vector table:
* 1 Stack Pointer reset value
* 15 System Exceptions
* NN Device specific Interrupts
*/
typedef void (*isr_p)( void) ;
isr_p const isr_vector[ 2] __attribute__((section(".isr_vector"))) = {
__StackTop,
/* System Exceptions */
Reset_Handler
} ;
typedef volatile unsigned long register_t ;
/** 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 b
#define LED_PIN 1
#define LED_ON 0
#define GPIO( x) CAT( gpio, x)
extern gpio_t GPIO( LED_IOP) ; /* gpioa: 0x48000000, gpiob: 0x48000400 */
/* gpioc: 0x48000800 */
void Reset_Handler( void) {
/* 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
GPIO( LED_IOP).odr = 1 << LED_PIN ; /* set PxN high (User LED) */
#endif
for( ;;) ;
}
/* end of ledon.c */