Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
B
bioloid_stm32_fw
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
humanoides
bioloid_stm32_fw
Commits
6a1a6ecc
Commit
6a1a6ecc
authored
11 years ago
by
Sergi Hernandez
Browse files
Options
Downloads
Patches
Plain Diff
Changed the pushbutton implementation from timer to external interrupt.
parent
a534d0ea
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/bioloid_stm32.c
+8
-0
8 additions, 0 deletions
src/bioloid_stm32.c
src/gpio.c
+78
-54
78 additions, 54 deletions
src/gpio.c
with
86 additions
and
54 deletions
src/bioloid_stm32.c
+
8
−
0
View file @
6a1a6ecc
...
@@ -27,9 +27,15 @@ uint8_t read_operation(uint8_t address, uint8_t length, uint8_t *data)
...
@@ -27,9 +27,15 @@ uint8_t read_operation(uint8_t address, uint8_t length, uint8_t *data)
}
}
else
// RAM region
else
// RAM region
{
{
return
DYN_NO_ERROR
;
}
}
}
}
void
test_gpio
(
void
)
{
gpio_toggle_led
(
NORTH_LED
);
}
int32_t
main
(
void
)
int32_t
main
(
void
)
{
{
uint8_t
inst_packet
[
1024
];
uint8_t
inst_packet
[
1024
];
...
@@ -78,6 +84,8 @@ int32_t main(void)
...
@@ -78,6 +84,8 @@ int32_t main(void)
else
else
GPIO_ResetBits
(
GPIOD
,
GPIO_Pin_14
);
GPIO_ResetBits
(
GPIOD
,
GPIO_Pin_14
);
gpio_set_pushbutton_callback
(
NORTH_PB
,
test_gpio
);
while
(
1
)
/* main function does not return */
while
(
1
)
/* main function does not return */
{
{
if
(
dyn_slave_is_packet_ready
())
// check if a new instruction packet has been received
if
(
dyn_slave_is_packet_ready
())
// check if a new instruction packet has been received
...
...
This diff is collapsed.
Click to expand it.
src/gpio.c
+
78
−
54
View file @
6a1a6ecc
...
@@ -24,31 +24,43 @@
...
@@ -24,31 +24,43 @@
#define PUSH_BUTTON1_PIN GPIO_Pin_6
#define PUSH_BUTTON1_PIN GPIO_Pin_6
#define PUSH_BUTTON1_GPIO_PORT GPIOE
#define PUSH_BUTTON1_GPIO_PORT GPIOE
#define PUSH_BUTTON1_SOURCE GPIO_PinSource6
#define PUSH_BUTTON1_SOURCE GPIO_PinSource6
#define PUSH_BUTTON1_EXTI_PORT EXTI_PortSourceGPIOE
#define PUSH_BUTTON1_EXTI_PIN EXTI_PinSource6
#define PUSH_BUTTON1_EXTI_LINE EXTI_Line6
#define PUSH_BUTTON2_GPIO_CLK RCC_AHB1Periph_GPIOC
#define PUSH_BUTTON2_GPIO_CLK RCC_AHB1Periph_GPIOC
#define PUSH_BUTTON2_PIN GPIO_Pin_13
#define PUSH_BUTTON2_PIN GPIO_Pin_13
#define PUSH_BUTTON2_GPIO_PORT GPIOC
#define PUSH_BUTTON2_GPIO_PORT GPIOC
#define PUSH_BUTTON2_SOURCE GPIO_PinSource13
#define PUSH_BUTTON2_SOURCE GPIO_PinSource13
#define PUSH_BUTTON2_EXTI_PORT EXTI_PortSourceGPIOC
#define PUSH_BUTTON2_EXTI_PIN EXTI_PinSource13
#define PUSH_BUTTON2_EXTI_LINE EXTI_Line13
#define PUSH_BUTTON3_GPIO_CLK RCC_AHB1Periph_GPIOC
#define PUSH_BUTTON3_GPIO_CLK RCC_AHB1Periph_GPIOC
#define PUSH_BUTTON3_PIN GPIO_Pin_14
#define PUSH_BUTTON3_PIN GPIO_Pin_14
#define PUSH_BUTTON3_GPIO_PORT GPIOC
#define PUSH_BUTTON3_GPIO_PORT GPIOC
#define PUSH_BUTTON3_SOURCE GPIO_PinSource14
#define PUSH_BUTTON3_SOURCE GPIO_PinSource14
#define PUSH_BUTTON3_EXTI_PORT EXTI_PortSourceGPIOC
#define PUSH_BUTTON3_EXTI_PIN EXTI_PinSource14
#define PUSH_BUTTON3_EXTI_LINE EXTI_Line14
#define PUSH_BUTTON4_GPIO_CLK RCC_AHB1Periph_GPIOC
#define PUSH_BUTTON4_GPIO_CLK RCC_AHB1Periph_GPIOC
#define PUSH_BUTTON4_PIN GPIO_Pin_15
#define PUSH_BUTTON4_PIN GPIO_Pin_15
#define PUSH_BUTTON4_GPIO_PORT GPIOC
#define PUSH_BUTTON4_GPIO_PORT GPIOC
#define PUSH_BUTTON4_SOURCE GPIO_PinSource15
#define PUSH_BUTTON4_SOURCE GPIO_PinSource15
#define PUSH_BUTTON4_EXTI_PORT EXTI_PortSourceGPIOC
#define PUSH_BUTTON4_EXTI_PIN EXTI_PinSource15
#define PUSH_BUTTON4_EXTI_LINE EXTI_Line15
#define GPO_TIMER TIM2
#define GPO_TIMER TIM2
#define GPO_TIMER_CLK RCC_APB1Periph_TIM2
#define GPO_TIMER_CLK RCC_APB1Periph_TIM2
#define GPO_TIMER_IRQn TIM2_IRQn
#define GPO_TIMER_IRQn TIM2_IRQn
#define GPO_TIMER_IRQHandler TIM2_IRQHandler
#define GPO_TIMER_IRQHandler TIM2_IRQHandler
#define GPI_
TIMER
TIM3
#define GPI_
EXTI1_IRQn
EXTI9_5_IRQn
#define GPI_
TIMER_CLK RCC_APB1Periph_TIM3
#define GPI_
EXTI1_IRQHandler EXTI9_5_IRQHandler
#define GPI_
TIMER
_IRQn
TIM3
_IRQn
#define GPI_
EXTI2
_IRQn
EXTI15_10
_IRQn
#define GPI_
TIMER
_IRQHandler
TIM3
_IRQHandler
#define GPI_
EXTI2
_IRQHandler
EXTI15_10
_IRQHandler
// private variables
// private variables
// LED blink periods
// LED blink periods
...
@@ -62,39 +74,40 @@ void (*south_pb_callback)(void);
...
@@ -62,39 +74,40 @@ void (*south_pb_callback)(void);
void
(
*
east_pb_callback
)(
void
);
void
(
*
east_pb_callback
)(
void
);
void
(
*
west_pb_callback
)(
void
);
void
(
*
west_pb_callback
)(
void
);
// IRQ han
f
ler functions
// IRQ han
d
ler functions
void
GPI_
TIMER
_IRQHandler
(
void
)
void
GPI_
EXTI1
_IRQHandler
(
void
)
{
{
uint16_t
capture
;
if
(
EXTI_GetITStatus
(
PUSH_BUTTON1_EXTI_LINE
)
!=
RESET
)
static
uint8_t
north_pb_last
=
Bit_SET
,
south_pb_last
=
Bit_SET
,
east_pb_last
=
Bit_SET
,
west_pb_last
=
Bit_SET
;
{
uint8_t
north_pb_new
,
south_pb_new
,
east_pb_new
,
west_pb_new
;
if
(
north_pb_callback
!=
0
)
north_pb_callback
();
/* Clear the EXTI line 0 pending bit */
EXTI_ClearITPendingBit
(
PUSH_BUTTON1_EXTI_LINE
);
}
}
if
(
TIM_GetITStatus
(
GPI_TIMER
,
TIM_IT_CC1
)
!=
RESET
)
void
GPI_EXTI2_IRQHandler
(
void
)
{
if
(
EXTI_GetITStatus
(
PUSH_BUTTON2_EXTI_LINE
)
!=
RESET
)
{
{
TIM_ClearITPendingBit
(
GPI_TIMER
,
TIM_IT_CC1
);
if
(
south_pb_callback
!=
0
)
capture
=
TIM_GetCapture1
(
GPI_TIMER
);
south_pb_callback
();
TIM_SetCompare1
(
GPI_TIMER
,
capture
+
10
);
/* Clear the EXTI line 0 pending bit */
/* check all the pushbuttons */
EXTI_ClearITPendingBit
(
PUSH_BUTTON2_EXTI_LINE
);
north_pb_new
=
GPIO_ReadInputDataBit
(
PUSH_BUTTON1_GPIO_PORT
,
PUSH_BUTTON1_PIN
);
}
if
(
north_pb_last
==
Bit_SET
&&
north_pb_new
==
Bit_RESET
)
if
(
EXTI_GetITStatus
(
PUSH_BUTTON3_EXTI_LINE
)
!=
RESET
)
if
(
north_pb_callback
!=
0
)
{
north_pb_callback
();
if
(
east_pb_callback
!=
0
)
north_pb_last
=
north_pb_new
;
east_pb_callback
();
south_pb_new
=
GPIO_ReadInputDataBit
(
PUSH_BUTTON2_GPIO_PORT
,
PUSH_BUTTON2_PIN
);
/* Clear the EXTI line 0 pending bit */
if
(
south_pb_last
==
Bit_SET
&&
south_pb_new
==
Bit_RESET
)
EXTI_ClearITPendingBit
(
PUSH_BUTTON3_EXTI_LINE
);
if
(
south_pb_callback
!=
0
)
}
south_pb_callback
();
if
(
EXTI_GetITStatus
(
PUSH_BUTTON4_EXTI_LINE
)
!=
RESET
)
south_pb_last
=
south_pb_new
;
{
east_pb_new
=
GPIO_ReadInputDataBit
(
PUSH_BUTTON3_GPIO_PORT
,
PUSH_BUTTON3_PIN
);
if
(
west_pb_callback
!=
0
)
if
(
east_pb_last
==
Bit_SET
&&
east_pb_new
==
Bit_RESET
)
west_pb_callback
();
if
(
east_pb_callback
!=
0
)
/* Clear the EXTI line 0 pending bit */
east_pb_callback
();
EXTI_ClearITPendingBit
(
PUSH_BUTTON4_EXTI_LINE
);
east_pb_last
=
east_pb_new
;
west_pb_new
=
GPIO_ReadInputDataBit
(
PUSH_BUTTON4_GPIO_PORT
,
PUSH_BUTTON4_PIN
);
if
(
west_pb_last
==
Bit_SET
&&
west_pb_new
==
Bit_RESET
)
if
(
west_pb_callback
!=
0
)
west_pb_callback
();
west_pb_last
=
west_pb_new
;
}
}
}
}
...
@@ -137,15 +150,16 @@ void GPO_TIMER_IRQHandler(void)
...
@@ -137,15 +150,16 @@ void GPO_TIMER_IRQHandler(void)
// public functions
// public functions
void
gpio_init
(
void
)
void
gpio_init
(
void
)
{
{
GPIO_InitTypeDef
GPIO_InitStructure
;
GPIO_InitTypeDef
GPIO_InitStructure
;
TIM_TimeBaseInitTypeDef
TIM_TimeBaseStructure
;
TIM_TimeBaseInitTypeDef
TIM_TimeBaseStructure
;
NVIC_InitTypeDef
NVIC_InitStructure
;
NVIC_InitTypeDef
NVIC_InitStructure
;
TIM_OC
InitTypeDef
TIM_OC
InitStructure
;
EXTI_
InitTypeDef
EXTI_
InitStructure
;
/* enable clocks */
/* enable clocks */
RCC_AHB1PeriphClockCmd
(
LED1_GPIO_CLK
|
LED2_GPIO_CLK
|
LED3_GPIO_CLK
|
LED4_GPIO_CLK
,
ENABLE
);
RCC_AHB1PeriphClockCmd
(
LED1_GPIO_CLK
|
LED2_GPIO_CLK
|
LED3_GPIO_CLK
|
LED4_GPIO_CLK
,
ENABLE
);
RCC_AHB1PeriphClockCmd
(
PUSH_BUTTON1_GPIO_CLK
|
PUSH_BUTTON2_GPIO_CLK
|
PUSH_BUTTON3_GPIO_CLK
|
PUSH_BUTTON4_GPIO_CLK
,
ENABLE
);
RCC_AHB1PeriphClockCmd
(
PUSH_BUTTON1_GPIO_CLK
|
PUSH_BUTTON2_GPIO_CLK
|
PUSH_BUTTON3_GPIO_CLK
|
PUSH_BUTTON4_GPIO_CLK
,
ENABLE
);
RCC_APB1PeriphClockCmd
(
GPO_TIMER_CLK
|
GPI_TIMER_CLK
,
ENABLE
);
RCC_APB1PeriphClockCmd
(
GPO_TIMER_CLK
,
ENABLE
);
RCC_APB2PeriphClockCmd
(
RCC_APB2Periph_SYSCFG
,
ENABLE
);
/* GPIO Configuration */
/* GPIO Configuration */
GPIO_InitStructure
.
GPIO_Pin
=
LED1_PIN
;
GPIO_InitStructure
.
GPIO_Pin
=
LED1_PIN
;
...
@@ -197,9 +211,6 @@ void gpio_init(void)
...
@@ -197,9 +211,6 @@ void gpio_init(void)
NVIC_InitStructure
.
NVIC_IRQChannelCmd
=
ENABLE
;
NVIC_InitStructure
.
NVIC_IRQChannelCmd
=
ENABLE
;
NVIC_Init
(
&
NVIC_InitStructure
);
NVIC_Init
(
&
NVIC_InitStructure
);
NVIC_InitStructure
.
NVIC_IRQChannel
=
GPI_TIMER_IRQn
;
NVIC_Init
(
&
NVIC_InitStructure
);
/* LED's timer configuration */
/* LED's timer configuration */
TIM_TimeBaseStructure
.
TIM_Period
=
0xFFFF
;
TIM_TimeBaseStructure
.
TIM_Period
=
0xFFFF
;
TIM_TimeBaseStructure
.
TIM_Prescaler
=
0
;
TIM_TimeBaseStructure
.
TIM_Prescaler
=
0
;
...
@@ -210,19 +221,30 @@ void gpio_init(void)
...
@@ -210,19 +221,30 @@ void gpio_init(void)
TIM_PrescalerConfig
(
GPO_TIMER
,
42000
,
TIM_PSCReloadMode_Immediate
);
TIM_PrescalerConfig
(
GPO_TIMER
,
42000
,
TIM_PSCReloadMode_Immediate
);
TIM_SetClockDivision
(
GPO_TIMER
,
TIM_CKD_DIV2
);
TIM_SetClockDivision
(
GPO_TIMER
,
TIM_CKD_DIV2
);
/* pushbutton timer configuration */
/* Connect external interrupts */
TIM_TimeBaseStructure
.
TIM_Period
=
0xFFFF
;
SYSCFG_EXTILineConfig
(
PUSH_BUTTON1_EXTI_PORT
,
PUSH_BUTTON1_EXTI_PIN
);
TIM_TimeBaseStructure
.
TIM_Prescaler
=
0
;
SYSCFG_EXTILineConfig
(
PUSH_BUTTON2_EXTI_PORT
,
PUSH_BUTTON2_EXTI_PIN
);
TIM_TimeBaseStructure
.
TIM_ClockDivision
=
0
;
SYSCFG_EXTILineConfig
(
PUSH_BUTTON3_EXTI_PORT
,
PUSH_BUTTON3_EXTI_PIN
);
TIM_TimeBaseStructure
.
TIM_CounterMode
=
TIM_CounterMode_Up
;
SYSCFG_EXTILineConfig
(
PUSH_BUTTON4_EXTI_PORT
,
PUSH_BUTTON4_EXTI_PIN
);
TIM_TimeBaseInit
(
GPI_TIMER
,
&
TIM_TimeBaseStructure
);
TIM_Cmd
(
GPI_TIMER
,
ENABLE
);
/* configure external interrupts */
TIM_PrescalerConfig
(
GPI_TIMER
,
42000
,
TIM_PSCReloadMode_Immediate
);
EXTI_InitStructure
.
EXTI_Line
=
PUSH_BUTTON1_EXTI_LINE
|
PUSH_BUTTON2_EXTI_LINE
|
PUSH_BUTTON3_EXTI_LINE
|
PUSH_BUTTON4_EXTI_LINE
;
TIM_SetClockDivision
(
GPI_TIMER
,
TIM_CKD_DIV2
);
EXTI_InitStructure
.
EXTI_Mode
=
EXTI_Mode_Interrupt
;
TIM_OCInitStructure
.
TIM_Pulse
=
10
;
// 10 Hz
EXTI_InitStructure
.
EXTI_Trigger
=
EXTI_Trigger_Falling
;
TIM_OC1Init
(
GPI_TIMER
,
&
TIM_OCInitStructure
);
EXTI_InitStructure
.
EXTI_LineCmd
=
ENABLE
;
TIM_OC1PreloadConfig
(
GPI_TIMER
,
TIM_OCPreload_Disable
);
EXTI_Init
(
&
EXTI_InitStructure
);
TIM_ITConfig
(
GPI_TIMER
,
TIM_IT_CC1
,
ENABLE
);
NVIC_InitStructure
.
NVIC_IRQChannel
=
GPI_EXTI1_IRQn
;
NVIC_InitStructure
.
NVIC_IRQChannelPreemptionPriority
=
2
;
NVIC_InitStructure
.
NVIC_IRQChannelSubPriority
=
1
;
NVIC_InitStructure
.
NVIC_IRQChannelCmd
=
ENABLE
;
NVIC_Init
(
&
NVIC_InitStructure
);
NVIC_InitStructure
.
NVIC_IRQChannel
=
GPI_EXTI2_IRQn
;
NVIC_InitStructure
.
NVIC_IRQChannelPreemptionPriority
=
2
;
NVIC_InitStructure
.
NVIC_IRQChannelSubPriority
=
1
;
NVIC_InitStructure
.
NVIC_IRQChannelCmd
=
ENABLE
;
NVIC_Init
(
&
NVIC_InitStructure
);
}
}
void
gpio_set_led
(
led_t
led_id
)
void
gpio_set_led
(
led_t
led_id
)
...
@@ -371,6 +393,8 @@ uint8_t gpio_is_pushbutton_pressed(pushbutton_t pb_id)
...
@@ -371,6 +393,8 @@ uint8_t gpio_is_pushbutton_pressed(pushbutton_t pb_id)
return
0x00
;
return
0x00
;
break
;
break
;
}
}
return
0x00
;
}
}
void
gpio_set_pushbutton_callback
(
pushbutton_t
pb_id
,
void
(
*
callback
)(
void
))
void
gpio_set_pushbutton_callback
(
pushbutton_t
pb_id
,
void
(
*
callback
)(
void
))
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment