Пишем программный код для мигания светодиодом с помощью микроконтроллера STM32f103 используя библиотеку HAL и CMSIS .

В данном уроке мы поморгаем светодиодом, тем самым проверим работу микроконтроллера и освоим основы программирования на микроконтроллере STM32F103.

В предыдущем уроке мы настраивали периферию нашего микроконтроллера с помощью программы STM32CubeMX. 
В данном случаи мы можем настроить наши ножки на вход или выход также в данной программе. Для этого надо выбрать необходимую ножку, нажать на нее левой клавишей и выбрать необходимый режим работы:

Далее перейдя в свойства ножки выставить дополнительные ее параметры если это необходимо(подтяжка резисторов к питанию или к земле, рабочую частоту и т.д.):

После чего мы создаем проект и уже можем используя библиотеку HALL управлять нашими ножками, например:

Устанавливаем логический ноль на ножке 14 порта В:

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
Устанавливаем логическую единицу на ножке 14 порта В:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);

Так же можно используя регистры, настроить любую ножку в нужный нам режим самостоятельно.

Для этого нужно немного познакомится с регистрами ввода/вывода:

Первое, что мы видим, что для ножек от 0 до 7 мы используем регистр GPIOx_CRL, для ножек от 8 до 15 используем регистр GPIOx_CRH.  Каждый «блок» разделен на 4 значения: 

После настройки режима работы: вход/выход значения битов CNFx отличается:

Теперь мы можем настроить ножку 14 порта В на выход и поморгать ним.

Для начала надо включить тактирование порта В: RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; Без включения тактирования наш порт В работать не будет. 

GPIOB->CRH | = GPIO_CRH_MODE14_1 ;

GPIOB->CRH &= ~GPIO_CRH_MODE14_0 ;

GPIOB->CRH&= ~GPIO_CRH_CNF14_1;

GPIOB->CRH &= ~GPIO_CRH_CNF14_0;

Так же нам понадобиться еще один регистр:

GPIOx_ODR — Регистр выходных данных. Определяет логический уровень, формируемый на соответствующих выводах порта, работающих в режиме выхода. Доступен для записи и для чтения. 

Что бы включить/выключить нужную ножку мы прописываем:

GPIOB->ODR &= ~ GPIO_ODR_ODR14; // на выходе логический ноль

GPIOB->ODR |= GPIO_ODR_ODR14; // на выходе логическая единица

Программный код для библиотеки HAL:-

 /* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
HAL_Delay(1000);
}
/* USER CODE END 3 */

Программный код на CMSIS, единственно, мы пока возьмем задержку с библиотеки HAL:

 /* USER CODE BEGIN 2 */
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
GPIOB->CRH |= GPIO_CRH_MODE14_1 ;
GPIOB->CRH &= ~GPIO_CRH_MODE14_0 ;
GPIOB->CRH &= ~GPIO_CRH_CNF14_1;
GPIOB->CRH &= ~GPIO_CRH_CNF14_0;
/* USER CODE END 2 */

/* USER CODE BEGIN 3 */
GPIOB->ODR &= ~ GPIO_ODR_ODR14; // на выходе логический ноль
HAL_Delay(500);
GPIOB->ODR |= GPIO_ODR_ODR14; // на выходе логическая единица
HAL_Delay(500);
}
/* USER CODE END 3 */