Sei sulla pagina 1di 3

/*---------------------------------------------------------------------------Inputs: buttons on a breadboard

Outputs: RGB LED


GOOD LUCK!
*----------------------------------------------------------------------------*/
#include "leds.h"
#include "switches.h"
#include "interrupts.h"
volatile int done;
//Simple software debouncing
void delay(float time){
volatile int i;
for(i=0; i<1000000*time; i++);
}
/*---------------------------------------------------------------------------Interrupt handler functions
*----------------------------------------------------------------------------*/
void EXTI15_10_IRQHandler(void){
//Clear pending interrupts
NVIC_ClearPendingIRQ(EXTI15_10_IRQn);
//Check if button 1 was pressed
if((GPIOA->IDR >> SWITCH_1) & 0x1)
done = 1;
//Clear the EXTI pending register
EXTI->PR |= (0x01 << SWITCH_1);
}
void EXTI3_IRQHandler(void){
//Clear pending interrupts
NVIC_ClearPendingIRQ(EXTI3_IRQn); //clear pending
//Check if button 1 was pressed
if((GPIOB->IDR >> SWITCH_2) & 0x1)
done = 2;
//Clear the EXTI pending register
EXTI->PR |= (0x01 << SWITCH_2);
}
void EXTI9_5_IRQHandler(void){
//Clear pending interrupts
NVIC_ClearPendingIRQ(EXTI9_5_IRQn);
//Check if button 1 was pressed
if((GPIOB->IDR >> SWITCH_3) & 0x1)
done = 3;
//Clear the EXTI pending register
EXTI->PR |= (0x01 << SWITCH_3);
}
void EXTI4_IRQHandler(void){

//Clear pending interrupts


NVIC_ClearPendingIRQ(EXTI4_IRQn);
//Check if button 1 was pressed
if((GPIOB->IDR >> SWITCH_4) & 0x1)
done = 4;
//Clear the EXTI pending register
EXTI->PR |= (0x01 << SWITCH_4);
}
/*---------------------------------------------------------------------------MAIN function
*----------------------------------------------------------------------------*/
int main(void){
//Initialise LEDs, buttons and interrupts
init_RGB();
init_switches();
init_interrupts();
done ^= 4;
while(1){
switch(done){
case 1 :toggle_all();
//
//

for(int i = 0;i<10;i++)
GPIOB->ODR |= ODR(RED_LE

//

GPIOA->ODR |= ODR(GREEN_

D);
LED) | ODR(BLUE_LED);
break;
case 2 :toggle_all();
//for(int i = 0;i<10;i++)
//GPIOB->ODR |= ODR(RED_LED);
//
GPIOA->ODR |= ODR(GREEN_
LED) | ODR(BLUE_LED);
break;
case 3 :toggle_all();
//
//

for(int i = 0;i<10;i++)
GPIOB->ODR |= ODR(RED_LE

D);
//

GPIOA->ODR |= ODR(GREEN_

LED) | ODR(BLUE_LED);
break;
case 4 :GPIOB->ODR |= ODR(RED_LED);
GPIOA->ODR |= ODR(GREEN_
LED) | ODR(BLUE_LED);
break;
}
done ^= 4;
delay(0.5);
if (done == 0) //if done == 0, processor goes to sleep
{__wfi();}
}
}
// *******************************ARM University Program Copyright (c) ARM Ltd 2

014*************************************

Potrebbero piacerti anche