|
9 | 9 | // |
10 | 10 | //===----------------------------------------------------------------------===// |
11 | 11 |
|
12 | | -enum GPIOBank: Int { |
13 | | - case a, b, c, d, e, f, g, h, i, j, k |
14 | | -} |
15 | | -typealias GPIOPin = Int |
16 | | - |
17 | | -// I1 pin on STM32F746 Discovery Board |
18 | | -//let ledConfig: (GPIOBank, GPIOPin) = (.i, 1) |
19 | | - |
20 | | -// A5 aka "Arduino D13" pin on Nucleo-64 boards |
21 | | -let ledConfig: (GPIOBank, GPIOPin) = (.a, 5) |
22 | | - |
23 | | -#if STM32F74_F75 |
24 | | - |
25 | | -typealias Board = STM32F746Board |
26 | | -enum STM32F746Board { |
27 | | - static func initialize() { |
28 | | - // (1) AHB1ENR[i] = 1 ... enable clock |
29 | | - setRegisterBit( |
30 | | - baseAddress: RCC.BaseAddress, offset: RCC.Offsets.AHB1ENR, bit: 8, |
31 | | - value: 1) |
32 | | - // (2) MODER[1] = 1 ... set mode to output |
33 | | - setRegisterTwoBitField( |
34 | | - baseAddress: GPIO.GPIOi_BaseAddress, offset: GPIO.Offsets.MODER, |
35 | | - bitsStartingAt: 2, value: 1) |
36 | | - // (3) OTYPER[1] = 0 ... output type is push-pull |
37 | | - setRegisterBit( |
38 | | - baseAddress: GPIO.GPIOi_BaseAddress, offset: GPIO.Offsets.OTYPER, bit: 1, |
39 | | - value: 0) |
40 | | - // (4) OSPEEDR[1] = 2 ... speed is high |
41 | | - setRegisterTwoBitField( |
42 | | - baseAddress: GPIO.GPIOi_BaseAddress, offset: GPIO.Offsets.OSPEEDR, |
43 | | - bitsStartingAt: 2, value: 2) |
44 | | - // (5) PUPDR[1] = 2 ... set pull to down |
45 | | - setRegisterTwoBitField( |
46 | | - baseAddress: GPIO.GPIOi_BaseAddress, offset: GPIO.Offsets.PUPDR, |
47 | | - bitsStartingAt: 2, value: 2) |
48 | | - |
49 | | - ledOff() |
50 | | - } |
51 | | - |
52 | | - static func ledOn() { |
53 | | - // ODR[1] = 1 |
54 | | - setRegisterBit( |
55 | | - baseAddress: GPIO.GPIOi_BaseAddress, offset: GPIO.Offsets.ODR, bit: 1, |
56 | | - value: 1) |
57 | | - } |
58 | | - |
59 | | - static func ledOff() { |
60 | | - // ODR[1] = 0 |
61 | | - setRegisterBit( |
62 | | - baseAddress: GPIO.GPIOi_BaseAddress, offset: GPIO.Offsets.ODR, bit: 1, |
63 | | - value: 0) |
64 | | - } |
65 | | - |
66 | | - static func delay(milliseconds: Int) { |
67 | | - for _ in 0..<10_000 * milliseconds { |
68 | | - nop() |
69 | | - } |
70 | | - } |
71 | | -} |
72 | | - |
73 | | -#elseif STM32F1 |
74 | | - |
75 | | -typealias Board = STM32F1Board |
76 | | -enum STM32F1Board { |
77 | | - static func initialize() { |
78 | | - // (1) IOPENR[ledConfig.0] = 1 ... enable clock |
79 | | - setRegisterBit( |
80 | | - baseAddress: RCC.BaseAddress, offset: RCC.Offsets.APB2ENR, bit: RCC.APB2ENRBit(for: ledConfig.0), |
81 | | - value: 1) |
82 | | - // (2) MODE[1] = 0b11 ... set mode to output, high speed |
83 | | - setRegisterTwoBitField( |
84 | | - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), offset: GPIO.Offsets.CRL, |
85 | | - bitsStartingAt: 4 * ledConfig.1, value: 3) |
86 | | - // (3) CNF[1] = 0b00 ... general purpose, push-pull |
87 | | - setRegisterTwoBitField( |
88 | | - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), offset: GPIO.Offsets.CRL, |
89 | | - bitsStartingAt: 4 * ledConfig.1 + 2, value: 0) |
| 12 | +#if STM32F746G_DISCOVERY |
90 | 13 |
|
91 | | - ledOff() |
92 | | - } |
93 | | - |
94 | | - static func ledOn() { |
95 | | - // ODR[1] = 1 |
96 | | - setRegisterBit( |
97 | | - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), offset: GPIO.Offsets.ODR, bit: ledConfig.1, |
98 | | - value: 1) |
99 | | - } |
100 | | - |
101 | | - static func ledOff() { |
102 | | - // ODR[1] = 0 |
103 | | - setRegisterBit( |
104 | | - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), offset: GPIO.Offsets.ODR, bit: ledConfig.1, |
105 | | - value: 0) |
106 | | - } |
107 | | - |
108 | | - static func delay(milliseconds: Int) { |
109 | | - for _ in 0..<10_000 * milliseconds { |
110 | | - nop() |
111 | | - } |
112 | | - } |
113 | | -} |
| 14 | +// I1 pin aka "Arduino D13" pin on STM32F746 Discovery Board |
| 15 | +// https://www.st.com/resource/en/schematic_pack/mb1191-f746ngh6-c01_schematic.pdf |
| 16 | +let ledConfig: (GPIOBank, GPIOPin) = (.i, 1) |
114 | 17 |
|
115 | | -#elseif STM32C0 |
| 18 | +#elseif NUCLEO_F103RB |
116 | 19 |
|
117 | | -typealias Board = STM32C0Board |
118 | | -enum STM32C0Board { |
119 | | - static func initialize() { |
120 | | - // (1) IOPENR[ledConfig.0] = 1 ... enable clock |
121 | | - setRegisterBit( |
122 | | - baseAddress: RCC.BaseAddress, offset: RCC.Offsets.IOPENR, bit: ledConfig.0.rawValue, |
123 | | - value: 1) |
124 | | - // (2) MODER[1] = 1 ... set mode to output |
125 | | - setRegisterTwoBitField( |
126 | | - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), offset: GPIO.Offsets.MODER, |
127 | | - bitsStartingAt: 2 * ledConfig.1, value: 1) |
128 | | - // (3) OTYPER[1] = 0 ... output type is push-pull |
129 | | - setRegisterBit( |
130 | | - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), offset: GPIO.Offsets.OTYPER, bit: ledConfig.1, |
131 | | - value: 0) |
132 | | - // (4) OSPEEDR[1] = 2 ... speed is high |
133 | | - setRegisterTwoBitField( |
134 | | - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), offset: GPIO.Offsets.OSPEEDR, |
135 | | - bitsStartingAt: 2 * ledConfig.1, value: 2) |
136 | | - // (5) PUPDR[1] = 2 ... set pull to down |
137 | | - setRegisterTwoBitField( |
138 | | - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), offset: GPIO.Offsets.PUPDR, |
139 | | - bitsStartingAt: 2 * ledConfig.1, value: 2) |
| 20 | +// A5 pin aka "Arduino D13" pin on Nucleo-64 boards |
| 21 | +// https://www.st.com/resource/en/user_manual/um1724-stm32-nucleo64-boards-mb1136-stmicroelectronics.pdf |
| 22 | +let ledConfig: (GPIOBank, GPIOPin) = (.a, 5) |
140 | 23 |
|
141 | | - ledOff() |
142 | | - } |
| 24 | +#else |
143 | 25 |
|
144 | | - static func ledOn() { |
145 | | - // ODR[1] = 1 |
146 | | - setRegisterBit( |
147 | | - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), offset: GPIO.Offsets.ODR, bit: ledConfig.1, |
148 | | - value: 1) |
149 | | - } |
150 | | - |
151 | | - static func ledOff() { |
152 | | - // ODR[1] = 0 |
153 | | - setRegisterBit( |
154 | | - baseAddress: GPIO.GPIOBaseAddress(for: ledConfig.0), offset: GPIO.Offsets.ODR, bit: ledConfig.1, |
155 | | - value: 0) |
156 | | - } |
157 | | - |
158 | | - static func delay(milliseconds: Int) { |
159 | | - for _ in 0..<10_000 * milliseconds { |
160 | | - nop() |
161 | | - } |
162 | | - } |
163 | | -} |
| 26 | +#error("Unknown board") |
164 | 27 |
|
165 | 28 | #endif |
166 | 29 |
|
|
0 commit comments