Захотелось посмотреть на новое, для меня, семейство МК - STM32.
Для начала прикупил в "сети" отладочную плату STM32L-DISKOVERY.
На плате установлен 32-битный ARM-микроконтроллер STM32L152RBT6 семейства Cortex-M3 (128 KБ Flash, 16 KБ RAM и 4 KБ EEPROM)
Интерфейсы USB 2.0 FS, 3xUSART, 2xSPI, 2xI2C, 8 таймеров
24-канальный 12-бит АЦП 1мкс, компараторы, 2х12-бит ЦАП
плюс:
- Отладчик ST-Link 2 для отладки и прошивки с выведенным разъёмом SWD для программирования других плат и контроллеров
- Выведены штырьки для подключения внешнего питания 5 В и 3.3 В
- Есть кнопка сброса
- Два светодиода и одна кнопка, доступные для программирования
- Емкостной аналоговый датчик прикосновений в виде полосы, который так же можно использовать как 4 сенсорные кнопки
- 4-символьный 24-сегментный LCD в корпусе DIP28
- Все 51 ножки, доступных для I/O, выведены на штырьки по периметру платы
Вообще первое впечетление от платы - вещь конечно мощная, но все немного сложнее AVR.Кроме того ,информации именно по этой плате маловато, в основном все материалы идут по STM32F .Но кое-чего я все-таки "нарыл".Поначалу "покурил" мануал, очень понравилась ,вот эта диаграма, все предельно просто расписано:
Сначала среду розработки выбрал для себя CooCox,поскольку являюсь сторонником бесплатного софта.Об установке почитал здесь .Для програматора-отладчика установил, вот этот драйвер - st-link_v2_usbdriver.
Итак,с чего-же начать? Конечно-же с банального мигания светодиодами,благо на плате их есть 2 ,синий(PB7) и зеленый(PB6).
Пример 1 - http://chipspace.ru/stm32-project-iar-ewarm-porty-1/
Светодиоды поочередно мигают.Хоть в даной ссылке проект для IAR EWARM, у меня он скомпилировался и в CoIDe.
Пример 2 - http://php.ua/blog/2012-10-22/stm32l-discovery-...167
Используется прерывания от таймера, чтобы когда он переполнится, сработало прерывание и светодиоды сменили свое состояние.По даной ссылке имеется проект для Keil,хотя у меня тот-же код скомпилировался и в CoIDe.
Далее,по аналогии , как я делал с AVR - подключение LCD.Сразу на ум попадает LCD 1602 с контроллером HD44780.Но на плате STM32L discovery имеется свой LCD ,подробней можно почитать здесь : http://chipspace.ru/stm32l-discovery-lcd/ .
Вполне не плохо , но как оказалось , при всей "многоногости"(64) STM32L152RBT6, после подключения LCD - оставалось не так уж много свободных пинов , давайте проанализируем их.
На сам LCD задействовано 28 пинов.
Кроме того 6 пинов (по 2 на порты A,B,C) задействованы на "linear touch sensor" (Емкостной аналоговый датчик прикосновений в виде полосы, который так же можно использовать как 4 сенсорные кнопки),причем эти пины даже не выведены на торцы платы.
Еще 2 пина PB6,PB7 - подключены светодиоды (LED) и PA0 - кнопка (BUTTON)
Далее:
PB2 - задействован на boot1;
PC14,PC15 - osc32 (подключен часовой кварц 32 кГц);
PH0,PH1 - osc предназначены для подключения внешнего кварца для STM32L152RBT6;
PA13,PA14 - интерфейс SWD;
PA4,PC13 - интерфейс измерения;
Согласно мануала UM1079, таблица Extension connectors ,свободных от "board function" пинов (Free I/O) - 5 шт (PA5,PA11,PA12,PC13,PD2) ,причем PA11,PA12 аппаратный USB.Как видите "не густо"...
Cледующий шаг - вывод переменной на LCD.Для этого нужна библиотека поддерживающая встроеный дисплей.Я попробовал этот пример - http://chipspace.ru/stm32l-discovery-lcd-2/.
На этом же ресурсе есть статья "STM32L-DYSCOVERY. АЦ-преобразование и вывод на дисплей" - http://chipspace.ru/stm32l-discovery-adc-lcd/ ,взяв ее за основу.Пересобрал проект под CoIDE, но вот незадача, программа работала не совсем коректно,происходила "засветка" некоторых сегментов 5 и 6 цифры дисплея.Хотя при прошивке HEX-ом из статьи все работало нормально.
И тут попалась на глаза еще одна бесплатная IDE - Em::Blocks 2.20. Пересобрал проект в ней ,и все заработало коректно.К сожелению Em::Blocks 2.20 с оф-сайта скачать невозможно,сайт стоит,поэтому вылаживаю здесь - https://yadi.sk/d/UKt31o3pbr2nW (Em::Blocks 2.20).
И напоследок,на базе вышеизложеного проекта - просто пример вывод переменной на LCD.В цикле while к переменной а постоянно добавляется единица, естественно это все удовольствие выводится на экран LCD.
#include "stm32l1xx.h"
#include "lcd_gpio_init.h"
#include "stm32l_discovery_lcd.h"
uint16_t a; //Переменная для хранения результата преобразования
uint16_t strDisp[6]; //Массив символов для вывода на дисплей
void convert_into_char(uint32_t number, uint16_t *p_tab);
//********************************************************************
//********************************************************************
int main()
{
gpio_init(); //Настройка портов ввода/вывода под работу с LCD
lcd_init(); //Здесь конфигурируем LCD контроллер
a = 0;
//*********************************************************************
while(1){
a++;
convert_into_char(a, strDisp);
strDisp[0] = ' '; //Первое знакоместо дисплея оставляем пустым
strDisp[5] = ' '; //последнее знакоместо дисплея стираем.
//strDisp[1] |= DOT; //Десятичная точка
/*Следующая функция выводит на экран массив strDisp. Еще она позволяет выводить на
экран десятичную точку или двоеточие в любой позиции экрана.
В данном случае команда strDisp[1] |= DOT выводит точку после первой цифры*/
LCD_GLASS_DisplayStrDeci(strDisp);
}
}
//**********************************************************************
//Здесь обрабатывается неудачный результат функций assert_param() из стандартных библиотек
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif
//***********************************************************************
//Эта функция конвертирует результат преобразования ADC в массив символов
void convert_into_char(uint32_t number, uint16_t *p_tab)
{
uint16_t units=0, tens=0, hundreds=0, thousands=0, misc=0;
units = (((number%10000)%1000)%100)%10;
tens = ((((number-units)/10)%1000)%100)%10;
hundreds = (((number-tens-units)/100))%100%10;
thousands = ((number-hundreds-tens-units)/1000)%10;
misc = ((number-thousands-hundreds-tens-units)/10000);
*(p_tab+4) = units + 0x30;
*(p_tab+3) = tens + 0x30;
*(p_tab+2) = hundreds + 0x30;
*(p_tab+1) = thousands + 0x30;
*(p_tab) = misc + 0x30;
}
Архив проекта для Em::Blocks 2.20 - здесь .