Второй урок уже более сложный и вариантов реализации будет четыре.
Ссылка на оригинал: 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);
}
}