STM Урок 2. Бегущие огни



Урок 2

 

Бегущие огни

 

Сегодня попробуем помигать имеющимися четырьмя светодиодами.

Но сначала я хочу вас научить такой хитрости. Мы не будем заново создавать и генерировать проект и заново писать код в Keil, если нам в новом проекте нужно просто доработать предыдущий, но не затронуть предыдущий проект, оставив его в целости и сохранности.

Для этого мы создадим папку для нового проекта, например, по названию его TEST002.

 

image01

 

Из папки с предыдущим проектом TEST001 в новую папку скопируем всё содержимое.

Переименуем 2 файла с именем проекта в папке также в имя нового проекта (test002)

 

image03

 

Только одного переименования имени файла недостаточно. Откроем эти файлы в любом текстовом редакторе и во всех местах, где встречается test001 исправим эту строку в test002.

 

image02  

 

Запустим проект в Keil. Скомпилируем его. Прошьём контроллер. И мы видим, что светодиод синий у нас зажёгся. Тем самым мы научились упрощать себе жизнь. Нам не пришлось создавать новый проект, выбирать контроллер, подключать библиотеки, писать первоначальный код инициализации. Этим мы обеспечили себе некоторую экономию драгоценного времени.

 

 

Перейдём в файл main.с. Давайте сначала зажжем все 4 светодиода, исправив немного код в файле. Сначала давайте заглянем в Reference Manual и уточним, какие именно биты мы должны выставить в регистрах контроллера (нажмите на картинку для увеличения)

 

image05_0500

 

Получится у нас шестнадцатеричное число 0x55000000. Строка в коде, следовательно, примет следующий вид:

 

RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // включим тактирование порта

GPIOD->MODER = 0x55000000; // включим ножки 12,13,14,15 на выход

Но это ещё не всё. Про регистр ODR также не будем забывать. Там нужно также включить нужные ножки в единицу (нажмите на картинку для увеличения)

 

image04_0500

 

Строка в коде изменится следующим образом

        GPIOD->ODR = 0xF000; //зажжем светодиод, подключенный к лапке 15 порта

        while(1)

Соберем код, прошьём контроллер и увидим, что все светодиоды у нас на отладочной плате светятся.

 

image00

 

Прежде чем нам попытаться заставить мигать плату своими светодиодами, давайте будем потихоньку привыкать к грамотному оформлению нашего кода.

Добавим файл main.h в проект в папку user проекта.

Для этого можно взять данный файл с любого проекта avr и оставить там только вот это

#ifndef MAIN_H_

#define MAIN_H_

 

#endif /* MAIN_H_ */

 

Подключим его в файле main.c

 

#include «main.h»

#include «stm32f4xx.h»

 

 

Также подключение файла библиотеки stm32f4xx.h, код по инициализации порта можно тоже оформить в данный файл, а также туда добавить код задержки

 

#ifndef MAIN_H_

#define MAIN_H_

 

#include «stm32f4xx.h»

 

void port_ini(void);

void delay(int n);

 

void port_ini(void)

{

        RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // включим тактирование порта

        GPIOD->MODER = 0x55000000; // включим ножки 12,13,14,15 на выход

        GPIOD->OTYPER = 0; //подтянем резистор ко всем ножкам порта

        GPIOD->OSPEEDR = 0; //установим скорость LOW на все лапки порта

        GPIOD->ODR = 0; // весь порт D в 0

}

        

void delay(int n)

{

        while(n>0) n—;

}

 

#endif /* MAIN_H_ */

 

Функцию main() меняем до такого вот состояния

int main(void)

{

        port_ini();

        while(1)

        {

                //1100

//0110

//0011

//1001

                GPIOD->ODR = 0xC000;

                delay(4000000);

                GPIOD->ODR = 0x6000;

                delay(4000000);

                GPIOD->ODR = 0x3000;

                delay(4000000);

                GPIOD->ODR = 0x9000;

                delay(4000000);

        }

}

 

Создадим в той же папке и подключим файл ports.h в модуле main.h

 

#include «stm32f4xx.h»

#include «ports.h»

 

Первоначальное содержание файла ports.h

 

#ifndef PORTS_H_

#define PORTS_H_

 

#endif /* PORTS_H_ */

 

Добавим туда дефайны портов

#ifndef PORTS_H_

#define PORTS_H_

 

#define PORTD0 0

#define PORTD1 1

#define PORTD2 2

#define PORTD3 3

#define PORTD4 4

#define PORTD5 5

#define PORTD6 6

#define PORTD7 7

#define PORTD8 8

#define PORTD9 9

#define PORTD10 10

#define PORTD11 11

#define PORTD12 12

#define PORTD13 13

#define PORTD14 14

#define PORTD15 15

 

#endif /* PORTS_H_ */

 

Меняем код в бесконечном цикле

//1100

//0110

//0011

//1001

GPIOD->ODR = (1<<PORTD12)|(1<<PORTD13);

delay(4000000);

GPIOD->ODR = (1<<PORTD13)|(1<<PORTD14);

delay(4000000);

GPIOD->ODR = (1<<PORTD14)|(1<<PORTD15);

delay(4000000);

GPIOD->ODR = (1<<PORTD12)|(1<<PORTD15);

delay(4000000);

 

Также попробуем внешнюю лапку порта D например PD0

Повесим на нее светодиод через резистор 680 ом (желательно не меньше)

Меняем код в инициализации портов

RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // включим тактирование порта

GPIOD->MODER = 0x55555555; // включим все ножки порта D на выход

GPIOD->OTYPER = 0; //подтянем резистор ко всем ножкам порта

 

Добавим также код в бесконечном цикле

GPIOD->ODR = (1<<PORTD12)|(1<<PORTD15);

delay(4000000);

GPIOD->ODR = (1<<PORTD0);

delay(4000000);

 

Проверим код, собрав проект и прошив контроллер. Наши светодиоды мигают по 2 сразу, а также в пятом цикле светится внешний светодиод

 

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

Исходный код

 

 

Купить плату можно здесь STM32F4-DISCOVERY

 

Смотреть ВИДЕОУРОК

 

STM32 Бегущие огни

 

6 комментариев на “STM Урок 2. Бегущие огни
  1. meh:

    Ничего не понимаю, по ссылкам из гугла пришёл учиться дрыгать ногами МК, и сразу начинаю тупить. Почему GPIOD->MODER = 0x55000000? Ведь на картинке однозначно 0х5500 (и даже 0х00005500) по калькулятору. Полчаса гуглил какую-то чушь, может это особенности у СТМ такие. Потом начинает доходить, что на картинке кружочками отмечены MODER 4+5+6+7, а в тексте устанавливают 12+13+14+15. pookan bombanoolo sorry

  2. Daksell:

    я делал через GPIOD->CRH |= 0x55550000

  3. Богдан:

    Спасибо огромное.
    Классные уроки.

  4. Богдан:

    Уважаемый Narod_stream огромное спасибо за уроки.

  5. Алексей:

    Хоть убей не понимаю, как вы определяете какие ножки МК будете задействовать.
    Если я правильно понял, то 32 ножки- это биты в int. Если это ножки 12,13,14,15 то…
    берем калькулятор и переводим 00000000000000001111000000000000 в hex, получаем 61440
    Но я дилетант. Можно ссылку, где бы это объяснялось?

    У меня нет опыта программирования. Есть хелм, где бы можно было почитать, что значат вот эти функции, операторы… или как это называется?
    #ifndef MAIN_H_

    #define MAIN_H_

    #include «stm32f4xx.h»

    void port_ini(void);

    void delay(int n);

    void port_ini(void)

    {

    RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // включим тактирование порта

    GPIOD->MODER = 0x55000000; // включим ножки 12,13,14,15 на выход

    GPIOD->OTYPER = 0; //подтянем резистор ко всем ножкам порта

    GPIOD->OSPEEDR = 0; //установим скорость LOW на все лапки порта

    GPIOD->ODR = 0; // весь порт D в 0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*