В данном уроке мы поморгаем светодиодом, тем самым проверим работу микроконтроллера и освоим основы программирования на микроконтроллере STM32F103.
В предыдущем уроке мы настраивали периферию нашего микроконтроллера с помощью программы STM32CubeMX.
В данном случаи мы можем настроить наши ножки на вход или выход также в данной программе. Для этого надо выбрать необходимую ножку, нажать на нее левой клавишей и выбрать необходимый режим работы:
Далее перейдя в свойства ножки выставить дополнительные ее параметры если это необходимо(подтяжка резисторов к питанию или к земле, рабочую частоту и т.д.):
После чего мы создаем проект и уже можем используя библиотеку HALL управлять нашими ножками, например:
Устанавливаем логический ноль на ножке 14 порта В:
Так же можно используя регистры, настроить любую ножку в нужный нам режим самостоятельно.
Для этого нужно немного познакомится с регистрами ввода/вывода:
Первое, что мы видим, что для ножек от 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 */