Урок 2
Бегущие огни
Сегодня попробуем помигать имеющимися четырьмя светодиодами.
Но сначала я хочу вас научить такой хитрости. Мы не будем заново создавать и генерировать проект и заново писать код в Keil, если нам в новом проекте нужно просто доработать предыдущий, но не затронуть предыдущий проект, оставив его в целости и сохранности.
Для этого мы создадим папку для нового проекта, например, по названию его TEST002.
Из папки с предыдущим проектом TEST001 в новую папку скопируем всё содержимое.
Переименуем 2 файла с именем проекта в папке также в имя нового проекта (test002)
Только одного переименования имени файла недостаточно. Откроем эти файлы в любом текстовом редакторе и во всех местах, где встречается test001 исправим эту строку в test002.
Запустим проект в Keil. Скомпилируем его. Прошьём контроллер. И мы видим, что светодиод синий у нас зажёгся. Тем самым мы научились упрощать себе жизнь. Нам не пришлось создавать новый проект, выбирать контроллер, подключать библиотеки, писать первоначальный код инициализации. Этим мы обеспечили себе некоторую экономию драгоценного времени.
Перейдём в файл main.с. Давайте сначала зажжем все 4 светодиода, исправив немного код в файле. Сначала давайте заглянем в Reference Manual и уточним, какие именно биты мы должны выставить в регистрах контроллера (нажмите на картинку для увеличения)
Получится у нас шестнадцатеричное число 0x55000000. Строка в коде, следовательно, примет следующий вид:
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // включим тактирование порта
GPIOD->MODER = 0x55000000; // включим ножки 12,13,14,15 на выход
Но это ещё не всё. Про регистр ODR также не будем забывать. Там нужно также включить нужные ножки в единицу (нажмите на картинку для увеличения)
Строка в коде изменится следующим образом
GPIOD->ODR = 0xF000; //зажжем светодиод, подключенный к лапке 15 порта
while(1)
Соберем код, прошьём контроллер и увидим, что все светодиоды у нас на отладочной плате светятся.
Прежде чем нам попытаться заставить мигать плату своими светодиодами, давайте будем потихоньку привыкать к грамотному оформлению нашего кода.
Добавим файл 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
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Ничего не понимаю, по ссылкам из гугла пришёл учиться дрыгать ногами МК, и сразу начинаю тупить. Почему GPIOD->MODER = 0x55000000? Ведь на картинке однозначно 0х5500 (и даже 0х00005500) по калькулятору. Полчаса гуглил какую-то чушь, может это особенности у СТМ такие. Потом начинает доходить, что на картинке кружочками отмечены MODER 4+5+6+7, а в тексте устанавливают 12+13+14+15. pookan bombanoolo sorry
Есть работа — управление 3х фазным мотором
Павел 89162322277
я делал через GPIOD->CRH |= 0x55550000
Спасибо огромное.
Классные уроки.
Уважаемый Narod_stream огромное спасибо за уроки.
Хоть убей не понимаю, как вы определяете какие ножки МК будете задействовать.
Если я правильно понял, то 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