/****************************gpio.c*********************************/
// http://microtechnics.ru/stm32-uchebnyj-kurs-gpio-porty-vvoda-vyvoda/
//Подключаем все нужные файлы
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
/*******************************************************************/
//Тут будет вся инициализация всей использующейся периферии
void initAll()
{
    //Объявляем переменную port типа GPIO_InitTypeDef
    GPIO_InitTypeDef port;
    //Это функция из файла stm32f10x_rcc.c, включает тактирование на GPIOA
    //GPIOA сидит на шине APB2
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    //Про эту функцию напишу чуть ниже
    GPIO_StructInit(&port);
    //Заполняем поля структуры нужными значениями
    //Первый вывод – вход для обработки нажатия кнопки – PA1
    port.GPIO_Mode = GPIO_Mode_IPD;
    port.GPIO_Pin = GPIO_Pin_1;
    port.GPIO_Speed = GPIO_Speed_2MHz;
    //А про эту функцию мы уже говорили
    //Отметим только что один из параметров – указатель(!) на
    //нашу структуру
    GPIO_Init(GPIOA, &port);
    //Настраиваем вывод, на котором будет висеть диодик – PA0
    port.GPIO_Mode = GPIO_Mode_Out_PP;
    port.GPIO_Pin = GPIO_Pin_0;
    port.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOA, &port);
}
/*******************************************************************/
int main()
{
    //Объявляем переменную для хранения состояния кнопки
    uint8_t buttonState = 0;
    initAll();
    while(1)
    {
        //С помощью функции из SPL считываем из внешнего мира
        //состояние кнопки
        buttonState = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);
        if (buttonState == 1)
        {
            GPIO_SetBits(GPIOA, GPIO_Pin_0);
        }
        else
        {
            GPIO_ResetBits(GPIOA, GPIO_Pin_0);
        }
    }
}
/****************************End of file****************************/
