19 #define PORTA_EXTICR 0x0 20 #define PORTB_EXTICR 0x1 21 #define PORTC_EXTICR 0x2 23 static void ( *pin0_handler)(void);
24 static void ( *pin1_handler)(void);
25 static void ( *pin2_handler)(void);
26 static void ( *pin3_handler)(void);
27 static void ( *pin4_handler)(void);
28 static void ( *pin5_handler)(void);
29 static void ( *pin6_handler)(void);
30 static void ( *pin7_handler)(void);
31 static void ( *pin8_handler)(void);
32 static void ( *pin9_handler)(void);
33 static void ( *pin10_handler)(void);
34 static void ( *pin11_handler)(void);
35 static void ( *pin12_handler)(void);
36 static void ( *pin13_handler)(void);
37 static void ( *pin14_handler)(void);
38 static void ( *pin15_handler)(void);
40 static mcu_error gpio_setEXTIPortMask(
gpio_pin pin, uint8_t mask,
void (*handle)(
void));
41 static uint8_t gpio_translatePin(
gpio_pin pin);
47 uint8_t correspontingPin = gpio_translatePin(pin);
55 rcc_periph_clock_enable(RCC_GPIOA);
59 rcc_periph_clock_enable(RCC_GPIOB);
63 rcc_periph_clock_enable(RCC_GPIOC);
77 if(correspontingPin > 0x07){
79 (*((
volatile unsigned long *)(
GPIO_BASE+port+
CRH_OFFSET))) |= (mode<<((correspontingPin-0x08)<<2));
80 (*((
volatile unsigned long *)(
GPIO_BASE+port+
CRH_OFFSET))) &= ~((mode^0xF)<<((correspontingPin-0x08)<<2));
83 (*((
volatile unsigned long *)(
GPIO_BASE+port+
CRL_OFFSET))) |= (mode<<(correspontingPin<<2));
84 (*((
volatile unsigned long *)(
GPIO_BASE+port+
CRL_OFFSET))) &= ~((mode^0xF)<<(correspontingPin<<2));
137 rcc_periph_clock_enable(RCC_AFIO);
139 uint8_t correspondingPin = gpio_translatePin(pin);
142 if((EXTI_IMR & pin)){
159 gpio_setEXTIPortMask(pin, PORTA_EXTICR, handle);
164 gpio_setEXTIPortMask(pin, PORTB_EXTICR, handle);
169 gpio_setEXTIPortMask(pin, PORTC_EXTICR, handle);
183 exti_enable_request(pin);
188 exti_set_trigger(pin,EXTI_TRIGGER_RISING);
194 exti_set_trigger(pin,EXTI_TRIGGER_FALLING);
200 exti_set_trigger(pin,EXTI_TRIGGER_BOTH);
214 if(correspondingPin == 0){
216 nvic_enable_irq(NVIC_EXTI0_IRQ);
218 else if(correspondingPin == 1){
220 nvic_enable_irq(NVIC_EXTI1_IRQ);
222 else if(correspondingPin == 2){
224 nvic_enable_irq(NVIC_EXTI2_IRQ);
226 else if(correspondingPin == 3){
228 nvic_enable_irq(NVIC_EXTI3_IRQ);
230 else if(correspondingPin == 4){
232 nvic_enable_irq(NVIC_EXTI4_IRQ);
234 else if(correspondingPin <= 9){
236 nvic_enable_irq(NVIC_EXTI9_5_IRQ);
238 else if(correspondingPin <= 15){
239 nvic_enable_irq(NVIC_EXTI15_10_IRQ);
257 static mcu_error gpio_setEXTIPortMask(
gpio_pin pin, uint8_t mask,
void (*handle)(
void)){
263 AFIO_EXTICR(0) &= ~(0xF);
264 AFIO_EXTICR(0) |= (mask);
265 pin0_handler = handle;
270 AFIO_EXTICR(0) &= ~(0xF<<4);
271 AFIO_EXTICR(0) |= (mask << 0x4);
272 pin1_handler = handle;
277 AFIO_EXTICR(0) &= ~(0xF<<8);
278 AFIO_EXTICR(0) |= (mask << 0x8);
279 pin2_handler = handle;
284 AFIO_EXTICR(0) &= ~(0xF<<12);
285 AFIO_EXTICR(0) |= (mask << 0xC);
286 pin3_handler = handle;
291 AFIO_EXTICR(1) &= ~(0xF);
292 AFIO_EXTICR(1) |= (mask);
293 pin4_handler = handle;
298 AFIO_EXTICR(1) &= ~(0xF<<4);
299 AFIO_EXTICR(1) |= (mask << 0x4);
300 pin5_handler = handle;
305 AFIO_EXTICR(1) &= ~(0xF<<8);
306 AFIO_EXTICR(1) |= (mask << 0x8);
307 pin6_handler = handle;
312 AFIO_EXTICR(1) &= ~(0xF<<12);
313 AFIO_EXTICR(1) |= (mask << 0xC);
314 pin7_handler = handle;
319 AFIO_EXTICR(2) &= ~(0xF);
320 AFIO_EXTICR(2) |= (mask);
321 pin8_handler = handle;
326 AFIO_EXTICR(2) &= ~(0xF<<4);
327 AFIO_EXTICR(2) |= (mask << 0x4);
328 pin9_handler = handle;
333 AFIO_EXTICR(2) &= ~(0xF<<8);
334 AFIO_EXTICR(2) |= (mask << 0x8);
335 pin10_handler = handle;
340 AFIO_EXTICR(2) &= ~(0xF<<12);
341 AFIO_EXTICR(2) |= (mask << 0xC);
342 pin11_handler = handle;
347 AFIO_EXTICR(3) &= ~(0xF);
348 AFIO_EXTICR(3) |= (mask);
349 pin12_handler = handle;
354 AFIO_EXTICR(3) &= ~(0xF<<4);
355 AFIO_EXTICR(3) |= (mask << 0x4);
356 pin13_handler = handle;
361 AFIO_EXTICR(3) &= ~(0xF<<8);
362 AFIO_EXTICR(3) |= (mask << 0x8);
363 pin14_handler = handle;
367 AFIO_EXTICR(3) &= ~(0xF<<12);
368 AFIO_EXTICR(3) |= (mask << 0xC);
369 pin15_handler = handle;
386 void exti0_isr(
void){
388 exti_reset_request(EXTI0);
392 void exti1_isr(
void){
394 exti_reset_request(EXTI1);
398 void exti2_isr(
void){
400 exti_reset_request(EXTI2);
404 void exti3_isr(
void){
406 exti_reset_request(EXTI3);
410 void exti4_isr(
void){
412 exti_reset_request(EXTI4);
416 void exti9_5_isr(
void){
420 if((EXTI_PR &
PIN5) != 0){
422 exti_reset_request(EXTI5);
425 if((EXTI_PR &
PIN6) != 0){
427 exti_reset_request(EXTI6);
430 if((EXTI_PR &
PIN7) != 0){
432 exti_reset_request(EXTI7);
435 if((EXTI_PR &
PIN8) != 0){
437 exti_reset_request(EXTI8);
440 if((EXTI_PR &
PIN9) != 0){
442 exti_reset_request(EXTI9);
448 void exti15_10_isr(
void){
450 if((EXTI_PR &
PIN10) != 0){
452 exti_reset_request(EXTI10);
456 if((EXTI_PR &
PIN11) != 0){
458 exti_reset_request(EXTI11);
461 if((EXTI_PR &
PIN12) != 0){
463 exti_reset_request(EXTI12);
466 if((EXTI_PR &
PIN13) != 0){
468 exti_reset_request(EXTI13);
471 if((EXTI_PR &
PIN14) != 0){
473 exti_reset_request(EXTI14);
476 if((EXTI_PR &
PIN15) != 0){
478 exti_reset_request(EXTI15);
486 uint8_t correspondingPin = gpio_translatePin(pin);
489 if(correspondingPin == 0){
491 nvic_enable_irq(NVIC_EXTI0_IRQ);
493 else if(correspondingPin == 1){
495 nvic_enable_irq(NVIC_EXTI1_IRQ);
497 else if(correspondingPin == 2){
499 nvic_enable_irq(NVIC_EXTI2_IRQ);
501 else if(correspondingPin == 3){
503 nvic_enable_irq(NVIC_EXTI3_IRQ);
505 else if(correspondingPin == 4){
507 nvic_enable_irq(NVIC_EXTI4_IRQ);
509 else if(correspondingPin <= 9){
511 nvic_enable_irq(NVIC_EXTI9_5_IRQ);
513 else if(correspondingPin <= 15){
514 nvic_enable_irq(NVIC_EXTI15_10_IRQ);
527 exti_disable_request(pin);
531 static uint8_t gpio_translatePin(
gpio_pin pin){
533 uint8_t correspontingPin;
538 correspontingPin = 0x00;
542 correspontingPin = 0x01;
546 correspontingPin = 0x02;
550 correspontingPin = 0x03;
554 correspontingPin = 0x04;
558 correspontingPin = 0x05;
562 correspontingPin = 0x06;
566 correspontingPin = 0x07;
570 correspontingPin = 0x08;
574 correspontingPin = 0x09;
578 correspontingPin = 0x0A;
582 correspontingPin = 0x0B;
586 correspontingPin = 0x0C;
590 correspontingPin = 0x0D;
594 correspontingPin = 0x0E;
598 correspontingPin = 0x0F;
602 correspontingPin = 0;
606 return correspontingPin;
gpio_port
GPIO ports available for the MCU.
Header file for stm32f103 GPIO.
void pinToggle(gpio_port port, gpio_pin pin)
Toggle the output of a given pin on a port.
void pinLow(gpio_port port, gpio_pin pin)
Set a given gpio pin on a port to logic low.
gpio_state
GPIO pin states.
ERROR GPIO: Port doesn't exist.
void MCU_printError(mcu_error errorNum)
Print a given error number as a character stream.
Control register low memory offset.
Base memory address for GPIO peripheral.
uint8_t MCU_debugIsEnabled(void)
Checks if debug is enabled.
mcu_error GPIO_ISRDisable(gpio_pin pin)
Disable interrupts on a gpio port / pin.
ERROR GPIO: Pin doesn't exist.
Port bit set/reset register.
void pinHigh(gpio_port port, gpio_pin pin)
Set a given gpio pin on a port to logic high.
ERROR GPIO: ISR EXTI line in use.
Setup the port for digital input.
Interrupt occurs on falling edge detection.
gpio_pin
GPIO pins available for each port.
Interrupt occurs on rising edge detection.
Interrupt occurs on rising and falling edge detection.
gpio_isr
GPIO interrupt options for pins.
ERROR GPIO: ISR trigger doesn't exist.
mcu_error pinSetup(gpio_mode mode, gpio_port port, gpio_pin pin)
Setup a GPIO pin for a given function.
void pinWrite(gpio_port port, gpio_pin pin, gpio_state state)
Set a given gpio pin on a port to a logic state.
uint8_t pinRead(gpio_port port, gpio_pin pin)
Read the current digital value of an input pin.
mcu_error GPIO_ISREnable(gpio_port port, gpio_pin pin, gpio_isr trigger, void(*handle)(void))
Setup interrupts on a gpio port / pin.
gpio_mode
GPIO setup options.
Port input data register.
mcu_error
Error enumerators for the Debug peripheral.
Control register high memory offset.