Второй урок уже более сложный и вариантов реализации будет четыре.
Ссылка на оригинал: https://www.youtube.com/watch?v=zcoIPwW … mp;index=2
ВАРИАНТ №1.
Вариант реализации точно такой же как у автора видео.
Недостатки варианта:
- задержка блокирующая. Значение задержки нужно угадывать.
Вполне рабочий вариант, но в нем не используються аппаратные возможности МК.
/* Includes */ #include "stm32f4xx.h" /* Private macro */ // гасим все светодиоды #define LED_CLR_ALL GPIOD->BSRR = GPIO_BSRR_BR_12 | GPIO_BSRR_BR_13 | GPIO_BSRR_BR_14 | GPIO_BSRR_BR_15 // включаем соотв.светодиод #define LED1_SET GPIOD->BSRR = GPIO_BSRR_BS_12 #define LED2_SET GPIOD->BSRR = GPIO_BSRR_BS_13 #define LED3_SET GPIOD->BSRR = GPIO_BSRR_BS_14 #define LED4_SET GPIOD->BSRR = GPIO_BSRR_BS_15 #define DELAY_INIT_CNT 500000 /* Private variables */ /* Private function prototypes */ /* Private functions */ void RCC_Init(void); void GPIO_Init(void); void Delay(__IO uint32_t tDelay); void RCC_Init(void) { RCC->AHB1ENR = RCC_AHB1ENR_GPIODEN; // включаем тактирование GPIOD } void GPIO_Init(void) { GPIOD->MODER = GPIO_MODER_MODER12_0 | GPIO_MODER_MODER13_0 | GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0; // настраиваем PD12, PD13, PD14, PD15 как "двухтактный выход общего назначения" } // блокирующая задержка void Delay(__IO uint32_t tDelay) { while(tDelay--); } int main(void) { RCC_Init(); GPIO_Init(); while(1) { LED_CLR_ALL; LED1_SET; Delay(DELAY_INIT_CNT); LED_CLR_ALL; LED2_SET; Delay(DELAY_INIT_CNT); LED_CLR_ALL; LED3_SET; Delay(DELAY_INIT_CNT); LED_CLR_ALL; LED4_SET; Delay(DELAY_INIT_CNT); } }