Advertisement
phillip_bourdon234

GPIO_Driver.c

Feb 28th, 2021 (edited)
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.82 KB | None | 0 0
  1. #include "GPIO_Driver.h"
  2. #include <stdint.h>
  3.  
  4. uint32_t static PINPOS[16] =
  5. {                                        
  6.     (0x00),
  7.   (0x04),
  8.     (0x08),
  9.     (0x0C),
  10.     (0x10),
  11.     (0x14),
  12.     (0x18),
  13.     (0x1C),
  14.     (0x00),
  15.     (0x04),
  16.     (0x08),
  17.     (0x0C),
  18.     (0x10),
  19.     (0x14),
  20.     (0x18),
  21.     (0x1C)
  22. };
  23.  
  24. //=====================================================================================================================
  25. //                                                  GPIO CONFIGURATIONS
  26. //=====================================================================================================================
  27. void config_pin(GPIO_TypeDef *port, uint32_t pinNumber, uint32_t mode, uint32_t pinSpeed, uint32_t modeType)
  28. {
  29.     if(pinNumber >= 8)
  30.     {
  31.            
  32.         switch(modeType)
  33.         {
  34.                
  35.             //OUTPUT and INPUT MODES
  36.             case OUTPUT_GEN_PURPOSE | INPUT_ANALOG:
  37.                 port->CRH &= ~( (1<<CNF_POS_BIT1) | (1<<CNF_POS_BIT2) );
  38.             break;
  39.            
  40.             case OUTPUT_OD | INPUT_FLOATING:
  41.                 port->CRH &= ~(1<<CNF_POS_BIT2);
  42.                 port->CRH |= (1<<CNF_POS_BIT1);
  43.             break;
  44.            
  45.             case OUTPUT_ALT_FUNCTION | INPUT_PU_PD:
  46.                 port->CRH |= (1<<CNF_POS_BIT2);  
  47.                 port->CRH &= ~(1<<CNF_POS_BIT1);
  48.             break;
  49.            
  50.             case OUTPUT_ALT_FUNCTION_OD:
  51.                 port->CRH |= (1<<CNF_POS_BIT2);  
  52.                 port->CRH |= (1<<CNF_POS_BIT1);
  53.             break;
  54.         }
  55.        
  56.         if(mode == INPUT)
  57.         {
  58.             port->CRH &= ~( (1<<MODE_POS_BIT1) | (1<<MODE_POS_BIT2) );
  59.         }
  60.         else
  61.         {
  62.             port->CRH |= ( pinSpeed << MODE_POS_BIT1 );
  63.         }
  64.        
  65.     }
  66.     else
  67.     {
  68.        
  69.         switch(modeType)
  70.         {
  71.            
  72.             //OUTPUT and INPUT MODES
  73.             case OUTPUT_GEN_PURPOSE | INPUT_ANALOG:
  74.                 port->CRL &= ~( (1<<CNF_POS_BIT1) | (1<<CNF_POS_BIT2) );
  75.             break;
  76.            
  77.             case OUTPUT_OD | INPUT_FLOATING:
  78.                 port->CRL &= ~(1<<CNF_POS_BIT2);
  79.                 port->CRL |= (1<<CNF_POS_BIT1);
  80.             break;
  81.                
  82.             case OUTPUT_ALT_FUNCTION | INPUT_PU_PD:
  83.                 port->CRL |= (1<<CNF_POS_BIT2);  
  84.                 port->CRL &= ~(1<<CNF_POS_BIT1);
  85.             break;
  86.            
  87.             case OUTPUT_ALT_FUNCTION_OD:
  88.                 port->CRL |= (1<<CNF_POS_BIT2);  
  89.                 port->CRL |= (1<<CNF_POS_BIT1);
  90.             break;
  91.         }
  92.        
  93.         if(mode == INPUT)
  94.         {
  95.             port->CRL &= ~( (1<<MODE_POS_BIT1) | (1<<MODE_POS_BIT2) );
  96.         }
  97.         else
  98.         {
  99.             port->CRL |= ( pinSpeed << MODE_POS_BIT1 );
  100.         }
  101.        
  102.     }
  103.    
  104. }
  105.  
  106. void init_gpio(GPIO_TYPE gpio_type)
  107. {
  108.    
  109.     if(gpio_type.port == PORTA)
  110.     {
  111.         CLOCK_GPIO_EN_PORTA;
  112.     }
  113.     else if(gpio_type.port == PORTB)
  114.     {
  115.         CLOCK_GPIO_EN_PORTB;
  116.     }
  117.     else if(gpio_type.port == PORTC)
  118.     {
  119.         CLOCK_GPIO_EN_PORTC;
  120.     }
  121.     else if(gpio_type.port == PORTD)
  122.     {
  123.         CLOCK_GPIO_EN_PORTD;
  124.     }
  125.    
  126.     config_pin(gpio_type.port, gpio_type.pin, gpio_type.mode, gpio_type.speed, gpio_type.mode_type);
  127.    
  128. }
  129.  
  130. //=====================================================================================================================
  131. //                                                  GPIO COMMANDS
  132. //=====================================================================================================================
  133. void pin_write(GPIO_TypeDef *port, uint32_t pinNumber, uint32_t state)
  134. {
  135.    
  136.     if(state == 1)
  137.     {
  138.         port->BSRR = (1<<pinNumber);
  139.     }
  140.     else
  141.     {
  142.         port->BSRR = (1<<(pinNumber+16));
  143.     }
  144.    
  145. }
  146.  
  147. void pin_toggle(GPIO_TypeDef *port, uint32_t pinNumber)
  148. {
  149.    
  150.     port->ODR ^= (1<<pinNumber);
  151.    
  152. }
  153.  
  154. uint32_t pin_read(GPIO_TypeDef *port, uint32_t pinNumber)
  155. {
  156.     uint32_t bitStatus;
  157.    
  158.     if((port->IDR & (1<<pinNumber)) != (uint32_t)LOW)
  159.   {
  160.         bitStatus = 1;
  161.   }
  162.   else
  163.   {
  164.     bitStatus = 0;
  165.   }
  166.   return bitStatus;
  167. }
  168.  
  169. //=====================================================================================================================
  170. //                                                      GPIO INTERRUPT COMMANDS
  171. //=====================================================================================================================
  172. void config_gpio_interrupt(GPIO_TypeDef *port, uint32_t pinNumber, edge_select edge)
  173. {
  174.     RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //set timer for the AFIO
  175.    
  176.     //set configurations for port A
  177.     if(port == PORTA)
  178.     {
  179.         switch(pinNumber)
  180.         {
  181.            
  182.             case 0:
  183.                 AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI0_PA;
  184.             break;
  185.            
  186.             case 1:
  187.                 AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI1_PA;
  188.             break;
  189.            
  190.             case 2:
  191.                 AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI2_PA;
  192.             break;
  193.            
  194.             case 3:
  195.                 AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI3_PA;
  196.             break;
  197.            
  198.             case 4:
  199.                 AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI4_PA;
  200.             break;
  201.            
  202.             case 5:
  203.                 AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI5_PA;
  204.             break;
  205.            
  206.             case 6:
  207.                 AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI6_PA;
  208.             break;
  209.            
  210.             case 7:
  211.                 AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI7_PA;
  212.             break;
  213.            
  214.             case 8:
  215.                 AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI8_PA;
  216.             break;
  217.            
  218.             case 9:
  219.                 AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI9_PA;
  220.             break;
  221.                
  222.             case 10:
  223.                 AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI10_PA;
  224.             break;
  225.            
  226.             case 11:
  227.                 AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI11_PA;
  228.             break;
  229.            
  230.             case 12:
  231.                 AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI12_PA;
  232.             break;
  233.            
  234.             case 13:
  235.                 AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI13_PA;
  236.             break;
  237.            
  238.             case 14:
  239.                 AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI14_PA;
  240.             break;
  241.            
  242.             case 15:
  243.                 AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI15_PA;
  244.             break;
  245.         }
  246.     }
  247.    
  248.     //set configurations for port B
  249.     if(port == PORTB)
  250.     {
  251.         switch(pinNumber)
  252.         {
  253.            
  254.             case 0:
  255.                 AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI0_PB;
  256.             break;
  257.            
  258.             case 1:
  259.                 AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI1_PB;
  260.             break;
  261.            
  262.             case 2:
  263.                 AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI2_PB;
  264.             break;
  265.            
  266.             case 3:
  267.                 AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI3_PB;
  268.             break;
  269.            
  270.             case 4:
  271.                 AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI4_PB;
  272.             break;
  273.            
  274.             case 5:
  275.                 AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI5_PB;
  276.             break;
  277.            
  278.             case 6:
  279.                 AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI6_PB;
  280.             break;
  281.            
  282.             case 7:
  283.                 AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI7_PB;
  284.             break;
  285.            
  286.             case 8:
  287.                 AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI8_PB;
  288.             break;
  289.            
  290.             case 9:
  291.                 AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI9_PB;
  292.             break;
  293.                
  294.             case 10:
  295.                 AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI10_PB;
  296.             break;
  297.            
  298.             case 11:
  299.                 AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI11_PB;
  300.             break;
  301.            
  302.             case 12:
  303.                 AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI12_PB;
  304.             break;
  305.            
  306.             case 13:
  307.                 AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI13_PB;
  308.             break;
  309.            
  310.             case 14:
  311.                 AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI14_PB;
  312.             break;
  313.            
  314.             case 15:
  315.                 AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI15_PB;
  316.             break;
  317.         }
  318.     }
  319.    
  320.     //set configurations for port C
  321.     if(port == PORTC)
  322.     {
  323.         switch(pinNumber)
  324.         {
  325.            
  326.             case 0:
  327.                 AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI0_PC;
  328.             break;
  329.            
  330.             case 1:
  331.                 AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI1_PC;
  332.             break;
  333.            
  334.             case 2:
  335.                 AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI2_PC;
  336.             break;
  337.            
  338.             case 3:
  339.                 AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI3_PC;
  340.             break;
  341.            
  342.             case 4:
  343.                 AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI4_PC;
  344.             break;
  345.            
  346.             case 5:
  347.                 AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI5_PC;
  348.             break;
  349.            
  350.             case 6:
  351.                 AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI6_PC;
  352.             break;
  353.            
  354.             case 7:
  355.                 AFIO->EXTICR[1] = AFIO_EXTICR2_EXTI7_PC;
  356.             break;
  357.            
  358.             case 8:
  359.                 AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI8_PC;
  360.             break;
  361.            
  362.             case 9:
  363.                 AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI9_PC;
  364.             break;
  365.                
  366.             case 10:
  367.                 AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI10_PC;
  368.             break;
  369.            
  370.             case 11:
  371.                 AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI11_PC;
  372.             break;
  373.            
  374.             case 12:
  375.                 AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI12_PC;
  376.             break;
  377.            
  378.             case 13:
  379.                 AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI13_PC;
  380.             break;
  381.            
  382.             case 14:
  383.                 AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI14_PC;
  384.             break;
  385.            
  386.             case 15:
  387.                 AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI15_PC;
  388.             break;
  389.         }
  390.     }
  391.    
  392.     //configure the edge of the interrupt
  393.     if(edge == RISING_EDGE)
  394.     {
  395.         EXTI->RTSR |= (1<<pinNumber);
  396.     }
  397.     else if(edge == FALLING_EDGE)
  398.     {
  399.         EXTI->FTSR |= (1<<pinNumber);
  400.     }
  401.     else if(edge == RISING_FALLING_EDGE)
  402.     {
  403.         EXTI->RTSR |= (1<<pinNumber);
  404.         EXTI->FTSR |= (1<<pinNumber);
  405.     }
  406.    
  407. }
  408.  
  409. void enable_gpio_interrupt(uint32_t pinNumber, IRQn_Type irqNumber)
  410. {
  411.     //enable interrupt in the EXTI
  412.     EXTI->IMR |= (1<<pinNumber);
  413.    
  414.     //enable interupt in the NVIC
  415.     NVIC_EnableIRQ(irqNumber);
  416. }
  417.  
  418.  
  419.  
  420. void clear_gpio_interrupt(uint32_t pinNumber)
  421. {
  422.     EXTI->PR |= (1<<pinNumber);
  423. }
  424. //=====================================================================================================================
  425. //                                                  SLEEP FUNCTIONS
  426. //=====================================================================================================================
  427.  
  428. void goToSleep(void)
  429. {
  430.       //enable control clock for PWR
  431.         RCC->APB1ENR |= RCC_APB1ENR_PWREN;
  432.    
  433.         //set deep sleep bit in the Cortex System Control register
  434.         SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  435.    
  436.         //set Standby mode
  437.         PWR->CR |= PWR_CR_PDDS;
  438.    
  439.         //clear wake up flag
  440.         PWR->CR |= PWR_CR_CWUF;
  441.    
  442.         //enable wake up pin
  443.         PWR->CSR |= PWR_CSR_EWUP;
  444.  
  445.         //put the STM to sleep
  446.         __WFI();
  447.    
  448.  
  449. }
  450.  
  451.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement