Ярлыки

_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)

четверг, 11 декабря 2014 г.

STM32F407

Любая ножка порта GPIO может быть настроена в одной из четырех возможных конфигураций:
• Input (вход): Floating (плавающий вход с высоким входным сопротивлением, ничем не нагруженный), Pull-up (с верхним нагрузочным резистором), Pull-down (с нижним нагрузочным резистором).
• Output (выход): Push-Pull двухтактный ключ (Pull-up с верхней нагрузкой, Pull-down с нижней нагрузкой или no Pull просто двухтактный выход), Open Drain открытый сток (Pull-up, Pull-down или no Pull). В режиме выхода может быть запрограммирована скорость работы порта: 2 МГц, 25 МГц, 50 МГц или 100 МГц.
• Alternate Function (альтернативная функция): Push-Pull (Pull-up, Pull-down или no Pull), Open Drain (Pull-up, Pull-down или no Pull).
• Analog (аналоговая линия): этот режим необходим, когда вывод используется как канал ADC (АЦП) или выход DAC (ЦАП).
Во время активного сигнала сброса и сразу после его окончания все альтернативные функции на выводах портов не активны (за исключением выводов, задействованных под JTAG), и все порты оказываются сконфигурированными как плавающие входы с высоким сопротивлением.
Выводы генератора LSE (OSC32_IN и OSC32_OUT) могут использоваться как GPIO (PC14 и PC15 соответственно), если генератор LSE выключен. LSE имеет приоритет перед функцией GPIO.

Выводы генератора HSE (OSC_IN и OSC_OUT) могут использоваться как GPIO (PH0 и PH1), когда генератор HSE выключен (основной кварцевый генератор не используется, что бывает очень редко). HSE имеет приоритет над функцией GPIO.
Чтобы порт начал работать в режиме программного ввода/вывода, нужно 2 вещи: разрешить его тактирование, и настроить параметры порта.

Настройка тактирования порта
Чтобы порт GPIOx начал работать, и можно было программно управлять состоянием его ножек, нужно включить тактирование порта. Каждый из портов GPIOx подключен к ядру микроконтроллера через шину AHB1, и для управления включения тактирования в нормальном режиме работы служит регистр RCC_AHB1ENR.


 Например, чтобы пользоваться ножкой PA3 как портом ввода/вывода, нужно разрешить тактирование GPIOA, для чего в разряд GPIOAEN надо записать единицу. Для этой цели служат удобные библиотечные функции (в этом примере разрешено тактирование порта GPIOA):

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

Управление портом как выходом
Для того, чтобы можно было начать управлять выводом, переводя его в состояние лог. 0 или лог. 1, порт надо настроить. Пример настройки порта PF6 как выхода:
/* Разрешить тактирование GPIOF */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
  
/* Конфигурирование ножки PF6, туда подключен светодиод STAT1
 платы разработчика Olimex STM32-P407 */
GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOF, &GPIO_InitStructure);
После того, как порт настроен, можно его программно переключать в любое нужное состояние. Для переключения порта служат регистры BSRRL и BSRRH, пример:
   /* Бесконечный цикл мигания светодиодом STAT1 */
   while(1)
   {
      GPIOF->BSRRL = GPIO_Pin_6; //STAT==1, светодиод горит
      Delay(3000000L);
      GPIOF->BSRRH = GPIO_Pin_6; //STAT==0, светодиод погас
      Delay(3000000L);
   }
Для управления ножками можно также применять удобные функции GPIO_SetBits и GPIO_ResetBits.
Чтение состояния порта как входа
Получить текущее состояние ножки порта, работающей в режиме входа, можно с помощью функции GPIO_ReadInputDataBit(). Но для начала нужно соответствующие ножки настроить как входы, и разрешить тактирование порта. Вот пример настройки портов для чтения джойстика платы Olimex STM32-P407 [2]:
/* Разрешить тактирование GPIOG, туда подключены контакты джойстика. */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
  
/* Конфигурирование ножек джойстика платы разработчика Olimex STM32-P407. 
 * PG6 RIGHT
 * PG7 UP
 * PG8 DOWN
 * PG11 LEFT
 * PG15 CENT */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_15; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; 
GPIO_Init(GPIOG, &GPIO_InitStructure);
Как опрашивать состояние порта:
if(GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_15))
{
   //сюда попадаем, если с входа прочитана лог. 1.
   ...
}
http://microsin.net/programming/ARM/stm32f407-peripheral-clock-enable.html
http://microsin.net/programming/ARM/stm32f407-gpio-pins-alternate-function.html


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

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