- PVSM.RU - https://www.pvsm.ru -
Еще в студенческие годы мне пришлось весьма тесно обобщатся с микроконтроллерами, тогда это были 8-битные 8051 и AVR. Сейчас, захотев вернутся этому занятию, перевел свой взгляд на весьма широкое семейство контроллеров STM32. О них немало написано на просторах Сети, тем не менее я изъявил желание написать небольшой цикл статей о работе с STMками. Знакомство с ними я хотел бы начать, как говорят, с полного 0. Для экспериментов мною была приобретена простая и дешевая (3$) отладочная плата Maple Mini. Используемый в ней контроллер STM32F103CB обладает весьма внушительным букетом возможностей. (особенно в сравнении с решениями в своей ценовой категории). Подробно можно почитать в сети, и конечно же, в даташите. [1]. Родная Ардуиноподобная среда разработки мне сразу не пришлаcь по вкусу (на вкус и цвет, как говорят...). Из всего изобилия разнообразных сред разработки я остановил свой взгляд на mikroC for ARM компании mikroelektronika. Когда-то я сталкивался с их компиляторами(для 8081), мне весьма понравилось. Хоть и не без косяков, но решил попробовать.
Плата имеет такой вид, все очень просто и лаконично:
Принципиальная схема платы тоже проста, но все самое необходимое здесь есть:
Программатором выбран китайский клон ST-LINK2 (3$), тем не менее он отлично работает с mikroС
Ссылка на демо-версию mikroC [2]. Ограничение демо-версии: максимум 4KB бинарного кода. Не много, но для ознакомления вполне достаточно. С установкой приложения проблем возникнуть не должно, единственное нужно драйвера на ST-LINK2 поставить перед запуском инсталлятора mikroC.
После запуска и создания проекта нас приветствует окно приложения:
Первым делом после выбора типа используемого микроконтроллера необходимо настроить свойства нашего проекта. Конфигурация проекта mikroC вызывается сочетанием клавиш Shift-Ctrl-E (Project — Edit Project). Именно в этом окне настраиваются все прелести, связанные с непростой внутренней организацией системы тактирования STM32 микроконтроллеров. Вообще я советую хотя бы вкратце ознакомится с Reference manual [3]на данное семейство микроконтроллеров. К нему мы будем неоднократно возвращаться.
Блок-схема системы тактирования из даташита STM32F103
В данном окне задается конфигурация регистров RCC_CR и RCC_CGGR
MSU clock frequency выбираем частоту SYSCLOCK — 72МГц (72.000000)
Теперь можем сохранить настройки для нашего МК. Все готово для написания 1 программы. Как всегда поморгаем светодиодом (подключен к ножке PB1):
Для установки выходов GPIO порта на выход в microC есть функция
GPIO_Digital_Output(&GPIOх_BASE, _GPIO_PINMASK_ALL);// Настройка порта на выход
она включает тактирование блока GPIOх и прописывает значения в конфиграционный регистр. Данные которые записываем в порт заносим в регистр GPIOх_ODR.
GPIOх_ODR = ; // Региcтр записи в порт
Компилятор позволяет получить доступ к конкретному биту регистра или переменной. Для этого номер бита (начиная с 0) пишем после названия регистра через точку
REGx.by; // Доступ к отдельному (y) биту регистра (х)
Для формирования задержек используем встроенную функцию Delay_ms() (или Delay_us()) компилятора. Вот наша первая программа:
void main()
{
GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_1); //Делаем PB1 выходом
GPIOb_ODR.b1 = 0; //Записываем в регистр GPIOb_ODR в 15 бит = 0
while(1) // Бесконечный цикл
{
GPIOb_ODR.b1=~GPIOb_ODR.b1; //Инверсия 15 бита
Delay_ms(500); //Задержка 500 мс
}
}
Чтобы одна команда инициализации применялось сразу к нескольким ножкам порта пишем _GPIO_PINMASKn через оператор "или", например:
GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_1 | _GPIO_PINMASK_7); //PB1 и PB7 настроены на выход
GPIO_Digital_Output(&GPIOa_BASE, _GPIO_PINMASK_ALL ); //Все ноги PA настроены на выход
Теперь попробуем вывести меандр на один из выводов МК, переключая состояние вывода порта PB15 с интервалом 5 мс. :
void main()
{
GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_15);
GPIOb_ODR.b15 = 0;
while(1)
{
GPIOb_ODR.b15=~GPIOb_ODR.b15;
Delay_ms(5); // Задержка 5 мс.(Импульс 10 мс, частота 100 Гц)
}
}
На выводе PB15 имеем такой сигнал:
Если нам необходимо считать состояние порта, то используем регистр GPIOх_IDR, предварительно настроив порт на вход при помощи функции GPIO_Digital_Input (*port, pin_mask). На нашей плате есть кнопка, подключенная к выводу порта PB8. Следующая программа зажигает мигающий светодиод на выводе PB1 при нажатой кнопке.
void main()
{
GPIO_Digital_Output(&GPIOb_BASE, _GPIO_PINMASK_1);
GPIO_Digital_Input(&GPIOb_BASE, _GPIO_PINMASK_8); // Настраиваем вывод PB8 на вход
GPIOb_ODR.b1 = 0;
while(1)
{
if (GPIOb_IDR.b8) //Если кнопка нажата бит 8 регистра GPIOb_IDR равен 1
{
GPIOb_ODR.b1=~GPIOb_ODR.b1;
Delay_ms(500); //Задержка 500 мс
}
else
{
GPIOb_ODR.b1 = 0; //Если кнопку отпустили, погасить светодиод
}
}
}
На этом 1 часть подошла к концу. Во второй части я постараюсь Вас познакомить с реализацией ШИМ модуляции, работой с таймерами и функцией подавления дребезга контактов на кнопке.
Автор: kselltrum
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/stm32/224427
Ссылки в тексте:
[1] даташите.: http://www.st.com/content/ccc/resource/technical/document/datasheet/33/d4/6f/1d/df/0b/4c/6d/CD00161566.pdf/files/CD00161566.pdf/jcr:content/translations/en.CD00161566.pdf
[2] демо-версию mikroC: https://download.mikroe.com/setups/compilers/mikroc/arm/mikroc-arm-setup-v4.90.zip
[3] Reference manual : http://www.st.com/content/ccc/resource/technical/document/reference_manual/59/b9/ba/7f/11/af/43/d5/CD00171190.pdf/files/CD00171190.pdf/jcr:content/translations/en.CD00171190.pdf
[4] Источник: https://habrahabr.ru/post/318306/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox
Нажмите здесь для печати.