Четвер, 19.07.2018, 00:50
Приветствую Вас Гість | RSS

Radiomanoff+

Меню сайта
Форма входа
Календарь
«  Липень 2018  »
ПнВтСрЧтПтСбНд
      1
2345678
9101112131415
16171819202122
23242526272829
3031

STM32L-DISKOVERY.Начало работы

Захотелось посмотреть на новое, для меня, семейство МК - 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.

Пример 2http://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 - здесь .

Архив записей
Статистика

Онлайн всього: 1
Гостей: 1
Користувачів: 0