Skip to content

Commit 81482e6

Browse files
committed
[NUCLEO_L152RE] Add gpio_irq api
1 parent 486ebec commit 81482e6

File tree

4 files changed

+38
-16
lines changed

4 files changed

+38
-16
lines changed

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/device.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#define DEVICE_PORTOUT 1
3535
#define DEVICE_PORTINOUT 1
3636

37-
#define DEVICE_INTERRUPTIN 0
37+
#define DEVICE_INTERRUPTIN 1
3838

3939
#define DEVICE_ANALOGIN 1
4040
#define DEVICE_ANALOGOUT 1

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/gpio_irq_api.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,8 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
8787

8888
if (pin == NC) return -1;
8989

90-
uint32_t pin_number = (uint32_t)pin;
91-
uint32_t pin_index = (pin_number & 0xF);
92-
uint32_t port_index = (pin_number >> 4);
90+
uint32_t port_index = STM_PORT(pin);
91+
uint32_t pin_index = STM_PIN(pin);
9392

9493
// Select irq number and vector
9594
switch (pin_index) {
@@ -161,12 +160,33 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
161160
return -1;
162161
}
163162

164-
// Enable GPIO and AFIO clocks
165-
RCC_APB2PeriphClockCmd((uint32_t)(RCC_APB2Periph_GPIOA << port_index), ENABLE);
166-
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
163+
// Enable GPIO clock
164+
switch (port_index) {
165+
case PortA:
166+
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
167+
break;
168+
case PortB:
169+
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
170+
break;
171+
case PortC:
172+
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
173+
break;
174+
case PortD:
175+
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);
176+
break;
177+
case PortH:
178+
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOH, ENABLE);
179+
break;
180+
default:
181+
error("GPIO port number is not correct.");
182+
break;
183+
}
167184

185+
// Enable SYSCFG clock
186+
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
187+
168188
// Connect EXTI line to pin
169-
GPIO_EXTILineConfig(port_index, pin_index);
189+
SYSCFG_EXTILineConfig(port_index, pin_index);
170190

171191
// Configure EXTI line
172192
EXTI_InitTypeDef EXTI_InitStructure;

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/port_api.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ PinName port_pin(PortName port, int pin_n) {
4343
void port_init(port_t *obj, PortName port, int mask, PinDirection dir) {
4444
GPIO_TypeDef *gpio;
4545

46-
uint32_t port_index = (uint32_t)port;
46+
uint32_t port_index = (uint32_t)port; // (0=A, 1=B, 2=C, 3=D, 4=E, 5=F, ...)
4747

4848
// Get GPIO structure base address and enable clock
49-
switch (port_index) {
49+
switch (port_index) {
5050
case PortA:
5151
gpio = (GPIO_TypeDef *)GPIOA_BASE;
5252
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

libraries/mbed/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/us_ticker.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@
3434

3535
#define TIM_MST TIM9
3636
#define TIM_MST_IRQ TIM9_IRQn
37-
#define TIM_MST_RCC RCC_APB2Periph_TIM9
37+
#define TIM_MST_RCC RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE)
3838

3939
#define TIM_SLV TIM4
4040
#define TIM_SLV_IRQ TIM4_IRQn
41-
#define TIM_SLV_RCC RCC_APB1Periph_TIM4
41+
#define TIM_SLV_RCC RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE)
4242

4343
#define MST_SLV_ITR TIM_TS_ITR3
4444

@@ -53,8 +53,8 @@ void us_ticker_init(void) {
5353
us_ticker_inited = 1;
5454

5555
// Enable Timers clock
56-
RCC_APB2PeriphClockCmd(TIM_MST_RCC, ENABLE);
57-
RCC_APB1PeriphClockCmd(TIM_SLV_RCC, ENABLE);
56+
TIM_MST_RCC;
57+
TIM_SLV_RCC;
5858

5959
// Master and Slave timers time base configuration
6060
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
@@ -94,9 +94,11 @@ uint32_t us_ticker_read() {
9494
// previous (incorrect) value of Slave and the new value of Master, which would return a
9595
// value in the past. Avoid this by computing consecutive values of the timer until they
9696
// are properly ordered.
97-
counter = counter2 = (uint32_t)((uint32_t)TIM_GetCounter(TIM_SLV) << 16) + (uint32_t)TIM_GetCounter(TIM_MST);
97+
counter = (uint32_t)((uint32_t)TIM_GetCounter(TIM_SLV) << 16);
98+
counter += (uint32_t)TIM_GetCounter(TIM_MST);
9899
while (1) {
99-
counter2 = (uint32_t)((uint32_t)TIM_GetCounter(TIM_SLV) << 16) + (uint32_t)TIM_GetCounter(TIM_MST);
100+
counter2 = (uint32_t)((uint32_t)TIM_GetCounter(TIM_SLV) << 16);
101+
counter2 += (uint32_t)TIM_GetCounter(TIM_MST);
100102
if (counter2 > counter) {
101103
break;
102104
}

0 commit comments

Comments
 (0)