Advertisement
Guest User

Untitled

a guest
Aug 6th, 2012
1,046
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.11 KB | None | 0 0
  1. /////////////////////////////////////////////////////////////////
  2. // main.c
  3. //
  4. // Проект-пример
  5. /////////////////////////////////////////////////////////////////
  6.  
  7. #include <stm32f4xx.h>
  8.  
  9. // Простая программная задержка
  10. static void delay_cycles(uint32_t cycles)
  11. {
  12.     // Пока не вычтем до нуля, цикл не закончится
  13.     while(cycles--);
  14. }
  15.  
  16. // Здесь нельзя инициализировать глобальные переменные, не помеченные специально
  17. // как не нуждающиеся в инициализации. Память инициализируется после вызова
  18. // SystemInit и все значения будут затёрты.
  19. void SystemInit(void)
  20. {
  21.     // Пока тут ещё ничего нет.
  22. }
  23.  
  24. // Отсюда начинается выполнение пользовательского кода.
  25. int main(void)
  26. {
  27.     // Светодиоды сидят на порту D и выводах 12 - 15.
  28.  
  29.     // Первым делом надо включить тактирование порту D.
  30.     // За это отвечает 3 бит (GPIODEN) в регистре RCC_AHB1ENR (Reference manual, p.110)
  31.     RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
  32.  
  33.     // Дальше надо настроить выводы как выходы типа Push-pull, с максимальной частотой,
  34.     // например, 50 МГц (от частоты зависит энергопотребление ножки).
  35.    
  36.     // Первый регистр, GPIOx_MODER: режим работы выхода, (RM, p. 148)
  37.     // 2 бита на каждую ножку
  38.     // 0: Вход, 1: выход, 2: альтернативная функция, 3: аналоговый
  39.     GPIOD->MODER |= (1UL << 12 * 2) | (1UL << 13 * 2) | (1UL << 14 * 2) | (1UL << 15 * 2);
  40.    
  41.     // Второй регистр, GPIOx_OTYPER: тип выхода. Двухтактный (0) али открытый коллектор (1)
  42.     // Один бит на каждую ножку. По умолчанию всё так, как и надо.
  43.    
  44.     // Третий регистр, GPIOx_OSPEEDR: максимальная скорость порта.
  45.     // По умолчанию 2 МГц, так что ок.
  46.    
  47.     // Четвёртый регистр, GPIOx_PUPDR: куда он будет по умолчанию подтягивать, если выбран двухтактный режим.
  48.     // 0: никуда, 1: питание, 2: земля, 3: резервировано. Два бита на вывод.
  49.     // Допустим, к питанию.
  50.     GPIOD->PUPDR |= (1UL << 12 * 2) | (1UL << 13 * 2) | (1UL << 14 * 2) | (1UL << 15 * 2);
  51.    
  52.     // Регистр вывода: GPIOx_ODR. Что запишешь, то на ножках и будет.
  53.     // Есть регистр для установки битов и для их сброса (GPIOx_BSRR).
  54.     // Младшие 2 байта отвечают за установку, старшие - за сброс.
  55.    
  56.     // Жги!
  57.     GPIOD->BSRRL = (1UL << 12) | (1UL << 13) | (1UL << 14) | (1UL << 15);
  58.     delay_cycles(1000000UL);
  59.    
  60.     // Утухни
  61.     GPIOD->BSRRH = (1UL << 12) | (1UL << 13) | (1UL << 14) | (1UL << 15);
  62.     delay_cycles(1000000UL);
  63.    
  64.     while(1)
  65.     {
  66.         // Зажжём 12й
  67.         GPIOD->BSRRL = (1UL << 12);
  68.        
  69.         delay_cycles(1000000UL);
  70.         // Погасим 12й
  71.         GPIOD->BSRRH = (1UL << 12);
  72.         // Зажжём 13й
  73.         GPIOD->BSRRL = (1UL << 13);
  74.        
  75.         delay_cycles(1000000UL);
  76.        
  77.         // Погасим 13й
  78.         GPIOD->BSRRH = (1UL << 13);
  79.         // Зажжём 14й
  80.         GPIOD->BSRRL = (1UL << 14);
  81.        
  82.         delay_cycles(1000000UL);
  83.        
  84.         // Погасим 14й
  85.         GPIOD->BSRRH = (1UL << 14);
  86.         // Зажжём 15й
  87.         GPIOD->BSRRL = (1UL << 15);
  88.        
  89.         delay_cycles(1000000UL);
  90.        
  91.         // Погасим 15й
  92.         GPIOD->BSRRH = (1UL << 15);
  93.     }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement