Skip to content
Snippets Groups Projects
Commit 6a1a6ecc authored by Sergi Hernandez's avatar Sergi Hernandez
Browse files

Changed the pushbutton implementation from timer to external interrupt.

parent a534d0ea
No related branches found
No related tags found
No related merge requests found
...@@ -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
......
...@@ -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 hanfler functions // IRQ handler 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_OCInitTypeDef TIM_OCInitStructure; 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))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment