Notice: Memcache::get(): Server localhost (tcp 11211) failed with: Connection refused (111) in /home/a146/www/we.easyelectronics.ru/engine/lib/external/DklabCache/Zend/Cache/Backend/Memcached.php on line 134
STM32 / Поиск по тегам / Сообщество EasyElectronics.ru

ОС как библиотека

Иногда внезапно возникает необходимость сделать какую-то работу в коде программы в синхронном режиме — то есть, не конечным автоматом, а просто дожидаясь результата каких-то действий. Например, скачать http-страничку, или, того хуже, https-страничку.

Но и тормозить основной цикл тоже как-то не очень хорошо. На этот случай есть известное решение — ОС.

Но если требуется допилить уже существующий проект с минимальным вмешательством в остальной код?
Вот мне стало интересно сделать мини-ОС, которая подключается к проекту как библиотека. То есть, делаем вызов какой-нибудь функции os_Init() и получаем возможность создавать потоки, не вмешиваясь в работу основного цикла. Он продолжает работать, как будто никакой ОС и нет, просто иногда управление передаётся дополнительным потокам.



Читать дальше

Программирование флэш-памяти микроконтроллеров STM32F через ST-LINK V1 из System Workbench for STM32 IDE (SWSTM32) в ОС Ubuntu (GNU/Linux)

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

Особенность платы STM32VLDISCOVERY в том, что на ней установлен программатор/отладчик ST-LINK V1. Возникли сложности с поддержкой ST-LINK V1 в ОС Ubuntu (GNU/Linux). Поэтому отсутствует поддержка ознакомительных плат, содержащих ST-LINK V1, в программах STM32CubeMX и SWSTM32, портированных на GNU/Linux, в частности на Ubuntu.

Потратив немало времени, удалось таки заставить System Workbench for STM32 IDE (SWSTM32) программировать флэш-память микроконтроллеров STM32F через ST-LINK V1 в Ubuntu! Но, увы, не совсем естественно.

Сперва следовал инструкции в статье: How to deal with a problematic STM32 ST-Link/v1 device and Ubuntu
В первую очередь создаётся файл /etc/modprobe.d/usb-storage.conf с содержимым:
# stlink/v1 ignore mass storage
options usb-storage quirks=0483:3744:i


Затем необходимо создать файл /etc/udev/rules.d/49-stlinkv1.rules с содержимым(ссылку на соответствующую статью, увы, не помню):
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3744", \
    MODE:="0666", \
    SYMLINK+="stlinkv1_%n"

Затем нужно в терминале запусить команду:
sudo udevadm control --reload-rules

или перезагрузить ЭВМ.
OpenOCD, который загружается из репозитория Ubuntu, будет в этом случае работать с ST-LINK V1, если задавать правильные параметры командной строки.

Далее следовал инструкции, приведенной в первой части статьи: Setting up a GCC/Eclipse toolchain for STM32Nucleo – Part II
Нужно из панели главного меню вызывать меню «Run->External Tools->External Tools Configurations...» для того, чтобы открыть окно «External Tools Configurations». Вид окна «External Tools Configurations» приведен на первой картинке.

Далее:
— в графе «Name» присвойте название, например «ST-LINK V1».
— в графе «Location» укажите путь к OpenOCD(установите из репозитория Ubuntu): /usr/bin/openocd
— в графе «Working Directory» укажите переменную "${workspace_loc}"
— в поле «Arguments» напишите следующее:
-d2 -f board/stm32vldiscovery.cfg -c init -c targets -c halt -c "stm32f1x unlock 0" -c "reset halt" -c "flash write_image erase ${project_loc}/Debug/${project_name}.elf" -c halt -c "verify_image ${project_loc}/Debug/${project_name}.elf" -c "reset run" -c shutdown

Нажмите кнопку «Apply». Таким образом создана конфигурация «ST-LINK V1».
Уже можно програмировать микроконтроллер, вызвав окно «External Tools Configurations» через меню «Run->External Tools->External Tools Configurations...» и нажав кнопку «Run».

Но нельзя не упомянуть одной особенности. В данном случае выбрана была конфигурация «Debug», поэтому в поле «Arguments» при описании пути к программному файлу присутствует название директории «Debug»: ${project_loc}/Debug/${project_name}.elf
Если бы была конфигурация «Release», тогда путь к программному файлу выглядел бы примерно так: ${project_loc}/Release/${project_name}.elf

Но это ещё не всё.
Из панели главного меню, через меню «Run->Run Configurations...» вызовите окно «Run Configurations», вид которого показан на второй картинке.

Выберите пункт «Launch Group» и нажмите кнопочку «New Launch Configuration», которая выглядит как иконка с плюсом. Появится название конфигурации «New_Configuration». Затем нажмите кнопку «Add...», после чего появится окно «Add Launch Configuration». Вид окна «Add Launch Configuration» приведен на третьей картинке.

В окне «Add Launch Configuration» в пункте «Program» выберите конфигурацию «ST-LINK V1» и нажмите кнопку «OK». В окне «Add Launch Configuration» в графе «Name» вместо названия «New_configuration» напишите новое название, например «Using ST-LINK V1» и нажмите кнопку «Apply».
Вид окна «Run Configurations» после указанных действий показан на четвёртой картинке.

Затем можете нажать кнопку «Run» для прошивки микроконтроллера.

Каждый раз, когда вы захотите перепрограммировать флэш-память микроконтроллера, вызывайте меню «Run->Run Configurations...» из панели главного меню и выберите нужную конфигурацию, например «Using ST-LINK V1», затем нажимаете кнопку «Run». Это можно сделать также через выпадающее меню «Run As->Run Configurations...».

Надеюсь, что разработчики программ STM32CubeMX и System Workbench for STM32 IDE (SWSTM32), портированных на GNU/Linux, в будущем решат проблему с ST-LINK V1.

Удачи! :)

Дополнение от 06.12.2016
Провёл эксперимент на другой ЭВМ. Сделал так, как описано выше. Но по неизвестной мне причине самопроизвольно была установлена защита от записи определённых областей флэш-памяти микроконтроллера, что не позволяло загружать программу во флэш-память микроконтроллера. Пришлось загрузить Windows и с помощью ST-LINK Utility снять биты защиты, после чего стало возможным использовать снова OpenOCD для программирования флэш-памяти. Поэтому будьте осторожны!
Удачи!

Segger Embedded Studio

ARM
Картинко
Доброго времени суток, дорогой читатель!
Идея написать что-нибудь родилась у меня после того как поиском не нашел ни слова про эту среду разработки(«А жаль и надо что-то делать», — подумал я).


Читать дальше

STM32 - входим в bootloader по кнопке.

Лирическое отступление.

Года 4 назад начались у нас продажи мелких партий устройств, основанных на STM32. Так как на само устройство мы, в виду миниатюрности устройства, не ставили разъём под программирование, то заливать прошивку был решено используя родной bootloader. Но тут опять возникла проблема — как в bootloader входить. Замыкать ножку BOOT при помощи джампера показалось плохой идеей. И тогда была поставлена задача — контроллер должен входить в bootloader по нажатию 1й кнопки.


Читать дальше

Ещё один программный таймер

Решил тоже поучаствовать в конкурсе «у кого таймер проще» :)
Это даже не велосипед, а так, самокат :)

Времени расписывать особо нет, поэтому буду краток.
Да и пояснять особо нечего.
typedef enum eTimerStatus
{
	etsTimerIDLE = 0,
	etsTimerCount,
	etsTimerEvent
} eTimerStatus;

typedef struct stTimer
{
	volatile ShortTimer *Count;
	volatile eTimerStatus Status;
} stTimer;

Это базовые определения. Теперь функционал:

#include "Timers.h"

/**
*	\brief Пул таймеров
*/
static ShortTimer volatile TimersPool[eTimersNumber];
static eTimerStatus volatile TimersStatusPool[eTimersNumber];

void TickTimers()
{
	for(int i=0; i < eTimersNumber; i++)
	{
		if(TimersPool[i] > 0)
		{
			TimersPool[i] --;
			if(0 == TimersPool[i])
			{
				TimersStatusPool[i] = etsTimerEvent;
			}
		}
	}
}

void StartTimer(eTimerIndex timer, ShortTimer period_ms)
{
	TimersPool[timer] = period_ms;
	TimersStatusPool[timer] = etsTimerCount;
}

eTimerStatus GetTimerStatus(eTimerIndex timer)
{
	if(etsTimerEvent == TimersStatusPool[timer])
	{
		TimersStatusPool[timer] = etsTimerIDLE;
		return(etsTimerEvent);		
	}
	else
	{
		return(TimersStatusPool[timer]);
	}
}

ShortTimer GetTimerCount(eTimerIndex timer){
	return(TimersPool[timer]);
}


Ну и пример использования.
typedef unsigned int ShortTimer;

typedef enum eTimerIndex
{
	eADC1Timer = 0,
	eADC2Timer,
	eADC3Timer,
	eADCProcessTimer,
	eChanDiapSwitchDelayTimer,
	eModbusTimer,
	eTimersNumber
} eTimerIndex;

void SysTick_Handler(void){

	TickTimers();
}

void main(){
    ...
    StartTimer(eADCProcessTimer, 5);

    while (1){
	...
	if(etsTimerEvent == GetTimerStatus(eADCProcessTimer)){
	    ProcessADC();
	    StartTimer(eADCProcessTimer, 5);
	}
        ...
    }
}


Если что непонятно (что вряд ли), спрашивайте, добавлю.
Главное удобство в простоте использования. Нужен ещё один таймер — добавили имя в enum eTimerIndex и можно пользоваться.

PS: Сейчас глянул ещё раз — а зачем мне вообще stTimer? Наверно, изначально что-то другое задумывал. Ну да ладно.

Мысли о STM32 HAL или стоит ли стремиться в метапрограммирование на C++

Навеяно сообщением коллеги evsi
Что же до либ, то есть куда более перспективный путь, хотя он и не лежит в плоскости очередного HAL от конкретного производителя. Я имею в виду вот эту либу: github.com/andysworkshop/stm32plus
Кстати, сам Andy Brown (автор либы) ведет весьма интересный сайт andybrown.me.uk/
в недавнем обсуждении STM32 Peripheral Libs: FWLib -> SPL -> Middleware+HAL+CubeMX -> Middleware+Snippets -> CMSIS-Driver API? Куда это все ведет и есть ли истинный путь?

Шаблонное метапрограммирование.
По мере изучения С++, я вижу, что все пути ведут туда. Но пока я не способен (легко) понимать такой код, а уж тем более написать.
У меня к такой библиотеке вопросы:

1. Полностью ли абстрагирует эта конкретная библиотека железо, во всей его сложности? Вопрос шире. Пусть не эта конкретная, а в принципе, можно ли с помощью шаблонного метапрограммирования написать библиотеку, с помощью которой можно включить железо в любом описанном в datasheet режиме?
Не будем брать GPIO, возьмем АЦП. Какой-нибудь сложный режим совместного использования отдельных модулей АЦП, с пересылкой по DMA, запуском по таймеру. Повторюсь, простая периферия не интересует, интересует сложная в извращенных режимах.
Если кто-то из гуру положительно ответит на этот вопрос, буду расти в ту сторону.

2. Вот пишу я код в таком стиле, ухожу из конторы. Сколько будет стоить специалист, способный поддерживать такой код? Как легко его будет найти?

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

Почему бы не взять для генерации исходников более мощный язык, предназначенный для манипулирования текстом? Perl, Python, Javascript и так далее.
Описать в декларативном стиле (a-la QML) в JSON формате, что нам нужно от периферии. Парсим этот файл, генерируем C++ исходник, в котором классы периферии имеют простое АPI, минимально необходимое в конкретной задаче.

class AdcSigmaDelta
{
public:
    enum Gain
    {
        Gain05,
        Gain1,
        Gain2,
        Gain4,
        Gain8,
        Gain16,
        Gain32,
    };

    AdcSigmaDelta(const std::vector<Pin> & pins);

    bool start();
    int16_t code(size_t idx) const;
    float voltage(size_t idx) const;
    bool setGain(Gain gain);
...
}

Методы класса наш генератор реализует напрямую регистрами максимально эффективно.
Генератор должен не давать использовать одну периферию в разных местах, GPIO, задействованные в АЦП не задействовать для ШИМ.
Отсюда плавно приходит в голову использовать GUI для генерации JSON файла описателя.

Та-дам! Вот и он — STM32CubeMx.

Для меня, пока, круг замкнулся. Тот Cube, который сейчас есть, пускать в свой код нельзя, только для быстрого старта — сгенерил, посмотрел, взял в свой код, навел порядок.

Тот Cube, который я хотел бы видеть:
открытый исходный код — чтобы тысячи эмбеддеров совместно развивали проект (тысячи бесплатных тестировщиков!),
гибкий, настраиваемый — чтобы код генерился в моем стиле, раскиданный по мной описанному заголовочному файлу.

Вывод звука на STM32 + библиотека

Озадачился выводом звука (мелодий) на stm32 для одной поделки. Стал изучать материалы…
Задача: с минимальными ресурсами по CPU и памяти (а так-же с минимальным объема работ по подключению в коде) — выводить звук.
Итоги изысканий и результат:

Детали под катом…
UPDATE: Суть решения не выводе как таковом, а в формировании первоначального сигнала в коде. Я у себя использовал усилитель D-класса на рассыпухе. Но это не обязательно. Вывод можно делать и через DAC. Можно приделать любой усилитель. Можно использовать внешний DAC. Суть решения в пункте 2 и 3: генерация данных с минимум нагрузки на МК.
З.Ы. А вы обсуждаете первый пункт, который я применил в конкретном месте в конктерных условия, потому что мне так было проще…
З.З.Ы. Удалил часть про PWM, как не главную :)



Читать дальше

STM32 HAL. Часть 2 - Системное время (+ модуль преключателя).

Приветствую коллеги и просто любопытствующие. Я несколько лет занимаюсь разработкой ПО для встраиваемых систем. В основном для STM32 с использованием Standart Peripheral Library. Недавно попытался пересесть на их HAL под названием CUBE. Мягко говоря, разочаровался этим непродуманным продуктом и окончательно решил, что надо поделиться своим собственным HAL-ом, который накатывается поверх Standart Peripheral Library. В этой и, очень надеюсь, последующих статьях я выложу коды, опишу их и примеры их использования. Кому это интересно — прошу под кат.

Читать дальше

STM32 HAL. Часть 1 - GPIO и внешние прерывания.

Приветствую коллеги и просто любопытствующие. Я несколько лет занимаюсь разработкой ПО для встраиваемых систем. В основном для STM32 с использованием Standart Peripheral Library. Недавно попытался пересесть на их HAL под названием CUBE. Мягко говоря, разочаровался этим непродуманным продуктом и окончательно решил, что надо поделиться своим собственным HAL-ом, который накатывается поверх Standart Peripheral Library. В этой и, очень надеюсь, последующих статьях я выложу коды, опишу их и примеры их использования. Кому это интересно — прошу под кат.

Читать дальше