libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_gpio.cpp
1#include "stm32_gpio.hpp"
2
3#ifdef HAL_GPIO_MODULE_ENABLED
4
5using namespace LibXR;
6
7STM32GPIO* STM32GPIO::map[STM32_GPIO_EXTI_NUMBER] = {nullptr};
8
15stm32_gpio_exti_t STM32_GPIO_EXTI_GetID(uint16_t pin)
16{ // NOLINT
17 uint8_t pin_num = __builtin_ctz(pin);
18
19 if (pin == 0 || pin_num > 15)
20 {
21 ASSERT(false);
22 return STM32_GPIO_EXTI_NUMBER;
23 }
24
25#if defined(STM32F0) || defined(STM32G0) || defined(STM32L0)
26 if (pin_num <= 1)
27 {
28 return STM32_GPIO_EXTI_0_1;
29 }
30 else if (pin_num <= 3)
31 {
32 return STM32_GPIO_EXTI_2_3;
33 }
34 else
35 {
36 return STM32_GPIO_EXTI_4_15;
37 }
38
39#else
40 if (pin_num <= 4)
41 {
42 return static_cast<stm32_gpio_exti_t>(pin_num);
43 }
44 else if (pin_num <= 9)
45 {
46 return STM32_GPIO_EXTI_5_9;
47 }
48 else
49 {
50 return STM32_GPIO_EXTI_10_15;
51 }
52
53#endif
54
55 return STM32_GPIO_EXTI_NUMBER;
56}
57
58STM32GPIO::STM32GPIO(GPIO_TypeDef* port, uint16_t pin, IRQn_Type irq)
59 : port_(port), pin_(pin), irq_(irq)
60{
61 if (irq_ != NonMaskableInt_IRQn)
62 {
63 map[STM32_GPIO_EXTI_GetID(pin)] = this;
64 }
65}
66
68{
69 ASSERT(irq_ != NonMaskableInt_IRQn);
70 HAL_NVIC_EnableIRQ(irq_);
71 return ErrorCode::OK;
72}
73
75{
76 ASSERT(irq_ != NonMaskableInt_IRQn);
77 HAL_NVIC_DisableIRQ(irq_);
78 return ErrorCode::OK;
79}
80
81extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
82{
83 auto id = STM32_GPIO_EXTI_GetID(GPIO_Pin);
84 auto gpio = STM32GPIO::map[id];
85
86 if (gpio)
87 {
88 gpio->callback_.Run(true);
89 }
90}
91
92#endif
ErrorCode DisableInterrupt()
禁用 GPIO 引脚中断。Disables the GPIO pin interrupt.
ErrorCode EnableInterrupt()
使能 GPIO 引脚中断。Enables the GPIO pin interrupt.
LibXR 命名空间