Ярлыки

_GetPixelIndex (1) _SetPixelIndex (1) 3-phase (1) 800x480 (1) АЦП (1) генератор (1) синхронный усилитель (2) структура (1) учебный курс (1) шаговый двигатель (1) ШИМ (2) accert (1) AD7608 (1) AD8429 (1) ADC (5) amplifer (1) arccos (1) arcsin (1) arctang (2) arctg (3) ARM (2) arm_sqrt_q15 (2) assembler (6) ASSERT (1) atan (2) bit (1) Bitband (1) boot (3) bootlloader (1) BUTTON (1) C (5) C# (1) CAN (2) CC2530 (5) CMSIS (4) command (1) Cordic (1) Core746I (1) CubeMX (4) DBGMCU (2) debug (2) debug.ini (1) delegate (1) Digital Potentiometers (1) DigitalPOT (1) Discovery (1) DMA (9) DMA2D (1) DSP (1) DSP library (1) DWT (1) EFM32 (5) EmWin (9) EXTI (1) FATFS (1) FMC (2) FreeRTOS (2) gl868-dual cmux (1) GPIO (4) GUI (2) GUIBuilder (1) GUIDRV_CompactColor_16 (1) HAL (3) HappyGecko (1) Hard Fault (2) heap (1) I2C (1) ID (1) ILI9320 (1) ILI9325 (1) Initialisation (1) InitLTDC (1) Instrumentithion (1) Interrupt (4) ITR (1) JTAG (1) Keil (5) LCDConf (2) lock-in (1) LTCD (1) LTDC (3) main (1) memory (1) MINI_STM32 Revision 01 (1) nBoot0 (1) NVIC (1) OnePulse (2) OSAL (4) pack (1) phase (1) printf (3) Pulse (1) PWM (12) RCC (2) RCR (1) Register (1) RESET (2) RS232 (3) RSS (1) RTC (3) RTOS-RTX (1) RTT (1) RTX-RTOS (1) SDCard (1) SDRAM (6) Segger (2) SPI (3) sqrt (3) SSD1298 (1) SSD1963 (1) Standart Peripherial Library (3) STANDBAY (1) startup (1) STemWin (8) stepper motor (1) STlink (2) STM32 (17) STM32429ZI (1) STM32Cube (1) STM32DBG.IN (1) STM32F (28) STM32F0 (4) STM32F1 (13) STM32F4 (10) STM32F4 Discovery (1) STM32F407ZG (1) STM32F429 (2) STM32F746 (1) STOP (1) string (1) struct (1) SWD (1) SWD JTAG (1) Synhronization (1) system_stm32f4xx.c (1) SystemInit (1) SysTick (1) task (4) telit (1) TIM (27) typedef (1) UART (1) USART (9) viewer (2) WM_PAINT (1) Z-stack (5) ZigBee (5)

среда, 8 февраля 2012 г.

STM32F4 Discovery GPIO for C

// main.c

#include <stm32f4xx.h>

// Простая программная задержка
static void delay_cycles(uint32_t cycles)
{
    // Пока не вычтем до нуля, цикл не закончится
        while(cycles--);
}

// Здесь нельзя инициализировать глобальные переменные, не помеченные специально
// как не нуждающиеся в инициализации. Память инициализируется после вызова
// SystemInit и все значения будут затёрты.
//void SystemInit(void)
//{
//   // Пока тут ещё ничего нет.
//}

// Отсюда начинается выполнение пользовательского кода.
int main(void)
{
    // Светодиоды сидят на порту D и выводах 12 - 15.

    // Первым делом надо включить тактирование порту D.
    // За это отвечает 3 бит (GPIODEN) в регистре RCC_AHB1ENR (Reference manual, p.110)
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;

    // Дальше надо настроить выводы как выходы типа Push-pull, с максимальной частотой,
    // например, 50 МГц (от частоты зависит энергопотребление ножки).
 
    // Первый регистр, GPIOx_MODER: режим работы выхода, (RM, p. 148)
    // 2 бита на каждую ножку
    // 0: Вход, 1: выход, 2: альтернативная функция, 3: аналоговый
    GPIOD->MODER |= (1UL << 12 * 2) | (1UL << 13 * 2) | (1UL << 14 * 2) | (1UL << 15 * 2);
 
    // Второй регистр, GPIOx_OTYPER: тип выхода. Двухтактный (0) али открытый коллектор (1)
    // Один бит на каждую ножку. По умолчанию всё так, как и надо.
 
    // Третий регистр, GPIOx_OSPEEDR: максимальная скорость порта.
    // По умолчанию 2 МГц, так что ок.
 
    // Четвёртый регистр, GPIOx_PUPDR: куда он будет по умолчанию подтягивать, если выбран двухтактный режим.
    // 0: никуда, 1: питание, 2: земля, 3: резервировано. Два бита на вывод.
    // Допустим, к питанию.
    GPIOD->PUPDR |= (1UL << 12 * 2) | (1UL << 13 * 2) | (1UL << 14 * 2) | (1UL << 15 * 2);
 
    // Регистр вывода: GPIOx_ODR. Что запишешь, то на ножках и будет.
    // Есть регистр для установки битов и для их сброса (GPIOx_BSRR).
    // Младшие 2 байта отвечают за установку, старшие - за сброс.
 
    // Жги!
    GPIOD->BSRRL = (1UL << 12) | (1UL << 13) | (1UL << 14) | (1UL << 15);
    delay_cycles(1000000UL);
 
    // Утухни
    GPIOD->BSRRH = (1UL << 12) | (1UL << 13) | (1UL << 14) | (1UL << 15);
    delay_cycles(1000000UL);
 
    while(1)
    {
        // Зажжём 12й
        GPIOD->BSRRL = (1UL << 12);
     
                delay_cycles(1000000UL);
        // Погасим 12й
        GPIOD->BSRRH = (1UL << 12);
        // Зажжём 13й
        GPIOD->BSRRL = (1UL << 13);
     
                delay_cycles(1000000UL);
     
        // Погасим 13й
        GPIOD->BSRRH = (1UL << 13);
        // Зажжём 14й
        GPIOD->BSRRL = (1UL << 14);
     
                delay_cycles(1000000UL);
     
        // Погасим 14й
        GPIOD->BSRRH = (1UL << 14);
        // Зажжём 15й
        GPIOD->BSRRL = (1UL << 15);
     
                delay_cycles(1000000UL);
     
        // Погасим 15й
        GPIOD->BSRRH = (1UL << 15);
    }
}

Комментариев нет:

Отправить комментарий