STM32. GPIO. Порты ввода-вывода

Порты ввода-вывода STM32 (GPIO)

7.1.4 Alternate functions (AF)
7.1.7 Input configuration
7.1.8 Output configuration
7.1.9 Alternate function configuration
7.1.10 Analog configuration
7.1.11 GPIO configurations for device peripherals

7.2.3 Port input data register (GPIOx_IDR) (x=A..G)
7.2.4 Port output data register (GPIOx_ODR) (x=A..G)
7.2.5 Port bit set/reset register (GPIOx_BSRR) (x=A..G)
7.2.6 Port bit reset register (GPIOx_BRR) (x=A..G)
7.4 AFIO registers

Практическая часть.
Создаем проект как в предыдущей части или используем уже готовый.
Создаем исходники и заголовочные файлы main (основной код, цикл), delays (файл с задержками, будет пополняться), stm32vldiscovery (диоды, кнопки и тд).
Заголовочные файлы должны иметь вид:

#ifndef MAIN_H_
#define MAIN_H_
// some text here
#endif

и оканчиваться пустой строкой.

В примере будем как всегда и во все времена мигать диодом. Для этого надо настроить ножки PC8, PC9 на вывод и создать функцию задержки для мигания.
Настраиваем ножки, для этого необходимо подать тактирование на PORTC, подключенный к шине APB2, а ножки настроить в режиме выхода с подтяжкой Push-Pull, работающего на частоте... на любой частоте, возьмем по максимуму 50 МГц. Код:
        // Подаем тактирование
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
// Выход с частотой 50 МГц
GPIOC->CRH |= GPIO_CRH_MODE8 | GPIO_CRH_MODE9;
// Режим PUSH-PULL
GPIOC->CRH &= ~GPIO_CRH_CNF8;
GPIOC->CRH &= ~GPIO_CRH_CNF9;
И помещаем код в функцию void led_init() и помещаем в исходники stm32vldiscovery.

Задержка. Для задержки пишем простую функцию, в теле которой будет бесполезный цикл, ничто не делающий заданное количество итераций раз.
void soft_delay(uint32_t time)
{
while(time)
time--;
}
Помещаем функцию в исходники delays.

Примечание: используем uint8_t, uint16_t, uint32_t чтоб не ломать голову с архитектурой и разрядностью.

В main.h подключаем заголовочные файлы stm32vldiscovery.h, delays.h, в main.c пишем основной код:
int main(void)
{
led_init(); // инициализация
for(;;)
{
GPIOC->BSRR |= GPIO_BSRR_BS8 | GPIO_BSRR_BR9; // включить 1, выключить 2
soft_delay(8000000); // пауза
GPIOC->BSRR |= GPIO_BSRR_BR8 | GPIO_BSRR_BS9; // выключить 1, включить 2
soft_delay(8000000); // пауза
}
}

Скачать проект: https://drive.google.com/open?id=1zLBN_1tk_g1khl3Ip5W4x2Lp3HLPoZ9S

Комментарии

Популярные сообщения из этого блога

STM32. Часть 4. Задержки, таймеры, системный таймер SysTick

AVR. Assembler. Алгоритмы.

STM32. Создание проекта в Keil.