Advertisement
teplofizik

gpio.c

Mar 4th, 2013
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.58 KB | None | 0 0
  1. Ф// ***********************************************************
  2. //  gpio.c
  3. //  Порты ввода-вывода
  4. //
  5. // ***********************************************************
  6.  
  7. #include "gpio.h"
  8. #include <stm32f4xx.h>
  9.  
  10. GPIO_TypeDef * Ports[9] = { GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH, GPIOI };
  11.  
  12. // Инициализация
  13. void gpio_Init(void)
  14. {
  15.     // Тактирование во все порты!
  16.     RCC->AHB1ENR |= 0 |
  17.                     RCC_AHB1ENR_GPIOAEN |
  18.                     RCC_AHB1ENR_GPIOBEN |
  19.                     RCC_AHB1ENR_GPIOCEN |
  20.                     RCC_AHB1ENR_GPIODEN |
  21.                     RCC_AHB1ENR_GPIOEEN |
  22.                     RCC_AHB1ENR_GPIOFEN |
  23.                     RCC_AHB1ENR_GPIOGEN |
  24.                     RCC_AHB1ENR_GPIOHEN |
  25.                     RCC_AHB1ENR_GPIOIEN |
  26.                     0;
  27. }
  28.  
  29. // Настроить вывод на выход
  30. void gpio_DigitalOutput(uint8_t Port, uint8_t Pin)
  31. {
  32.     // Очистим поле
  33.     Ports[Port]->MODER &= ~(0x03UL << (Pin * 2));
  34.    
  35.     // Режим выхода
  36.     // GP Output = 1
  37.     Ports[Port]->MODER |=  (0x01UL << (Pin * 2));
  38. }
  39.  
  40. // Настроить вывод на вход
  41. void gpio_DigitalInput(uint8_t Port, uint8_t Pin)
  42. {
  43.     // Очистим поле
  44.     // GP Input = 0
  45.     Ports[Port]->MODER &= ~(0x03UL << (Pin * 2));
  46. }
  47.  
  48. // Высокий уровень на ножке
  49. void gpio_HighLevel(uint8_t Port, uint8_t Pin)
  50. {
  51.     Ports[Port]->BSRRL = (1UL << (Pin & 0x0F));
  52. }
  53.  
  54. // Низкий уровень на ножке
  55. void gpio_LowLevel(uint8_t Port, uint8_t Pin)
  56. {
  57.     Ports[Port]->BSRRH = (1UL << (Pin & 0x0F));
  58. }
  59.  
  60. // Значение на ножке
  61. bool gpio_Value(uint8_t Port, uint8_t Pin)
  62. {
  63.     return ((Ports[Port]->IDR & (1 << Pin)) != 0);
  64. }
  65.  
  66. // Установить для вывода альтернативную функцию (0-3)
  67. void gpio_SetAlternateFunction(uint8_t Port, uint8_t Pin, uint8_t Function)
  68. {
  69.     Function &= 0x0F;
  70.    
  71.     // AF = 2
  72.     Ports[Port]->MODER &= ~(0x03UL << (Pin * 2));
  73.     Ports[Port]->MODER |=  (0x02UL << (Pin * 2));
  74.  
  75.     if(Pin < 8)
  76.     {
  77.         Pin &= 0x07;
  78.        
  79.         // Очистим, потом запишем
  80.         Ports[Port]->AFR[0] &= ~(0x0F << (Pin * 4));
  81.         Ports[Port]->AFR[0] |= ((uint32_t)Function << (Pin * 4));
  82.     }
  83.     else
  84.     {
  85.         Pin &= 0x07;
  86.        
  87.         // Очистим, потом запишем
  88.         Ports[Port]->AFR[1] &= ~(0x0F << (Pin * 4));
  89.         Ports[Port]->AFR[1] |= ((uint32_t)Function << (Pin * 4));
  90.     }
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement