|
9 | 9 |
|
10 | 10 | #define OUTPUT_TYPE_PUSH_PULL 0U |
11 | 11 | #define OUTPUT_TYPE_OPEN_DRAIN 1U |
| 12 | +#define GPIO_PIN_COUNT 16U |
12 | 13 |
|
13 | 14 | void set_gpio_mode(GPIO_TypeDef *GPIO, unsigned int pin, unsigned int mode) { |
14 | | - ENTER_CRITICAL(); |
15 | | - uint32_t tmp = GPIO->MODER; |
16 | | - tmp &= ~(3U << (pin * 2U)); |
17 | | - tmp |= (mode << (pin * 2U)); |
18 | | - register_set(&(GPIO->MODER), tmp, 0xFFFFFFFFU); |
19 | | - EXIT_CRITICAL(); |
| 15 | + if (pin < GPIO_PIN_COUNT) { |
| 16 | + ENTER_CRITICAL(); |
| 17 | + uint32_t shift = pin * 2U; |
| 18 | + uint32_t tmp = GPIO->MODER; |
| 19 | + tmp &= ~(3UL << shift); |
| 20 | + tmp |= (mode << shift); |
| 21 | + register_set(&(GPIO->MODER), tmp, 0xFFFFFFFFU); |
| 22 | + EXIT_CRITICAL(); |
| 23 | + } |
20 | 24 | } |
21 | 25 |
|
22 | 26 | void set_gpio_output(GPIO_TypeDef *GPIO, unsigned int pin, bool enabled) { |
@@ -51,12 +55,15 @@ void set_gpio_alternate(GPIO_TypeDef *GPIO, unsigned int pin, unsigned int mode) |
51 | 55 | } |
52 | 56 |
|
53 | 57 | void set_gpio_pullup(GPIO_TypeDef *GPIO, unsigned int pin, unsigned int mode) { |
54 | | - ENTER_CRITICAL(); |
55 | | - uint32_t tmp = GPIO->PUPDR; |
56 | | - tmp &= ~(3U << (pin * 2U)); |
57 | | - tmp |= (mode << (pin * 2U)); |
58 | | - register_set(&(GPIO->PUPDR), tmp, 0xFFFFFFFFU); |
59 | | - EXIT_CRITICAL(); |
| 58 | + if (pin < GPIO_PIN_COUNT) { |
| 59 | + ENTER_CRITICAL(); |
| 60 | + uint32_t shift = pin * 2U; |
| 61 | + uint32_t tmp = GPIO->PUPDR; |
| 62 | + tmp &= ~(3UL << shift); |
| 63 | + tmp |= (mode << shift); |
| 64 | + register_set(&(GPIO->PUPDR), tmp, 0xFFFFFFFFU); |
| 65 | + EXIT_CRITICAL(); |
| 66 | + } |
60 | 67 | } |
61 | 68 |
|
62 | 69 | int get_gpio_input(const GPIO_TypeDef *GPIO, unsigned int pin) { |
|
0 commit comments