Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Классический пинбол, как в древнем игровом автомате или в компактной игрушке: есть пружины, шарики и препятствия. В нашем варианте можно не только зарабатывать очки: чтобы пройти уровень, придется выполнить дополнительную миссию.

Пинбол Пикабу

Аркады, На ловкость, Казуальные

Играть

Топ прошлой недели

  • Rahlkan Rahlkan 1 пост
  • Tannhauser9 Tannhauser9 4 поста
  • alex.carrier alex.carrier 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
4
erinaceto
erinaceto
6 месяцев назад
Серия Технические заметки

Stm32 без IDE — памятка 2: мигаем светодиодом и кое-что ещё⁠⁠

Итак, в прошлый раз мы (надеюсь, и вы тоже) собрали и запустили при помощи консольных программ проект, созданный (и первично собранный) в STM32 CubeIDE. Теперь немного освоимся в нём.

Напомню, у нас есть структура каталогов проекта с исходными файлами (обратим внимание на Core и Drivers), а также аналогичная ей структура в подкаталоге Debug с правилами для сборки исходников в исполняемый файл. (Debug — это на самом деле название профиля сборки; по умолчанию кубик создаёт ещё Release, но, как нетрудно догадаться, он неудобнее для отладки, так что мы его собирать не будем; принципиальной же разницы между ними нет.)

Прежде чем переходить к заявленной заадаче, давайте потыкаем палочкой систему сборки (дело в том, что нам понядобится добавить в неё некоторые новые файлы, так что идём последовательно).

Создадим (любым текстовым редактором; хотя, конечно, Writer или Word будут для этого весьма некстати) файл Core/Src/our_file.c следующего содержания:

int value = 0;

И Core/inc/our_file.h:

extern int value;

Затем в Core/Src/main.c после строки /* USER CODE BEGIN Includes */ добавим #include "our_file.h", а в суперцикл добавим value ++;

/* USER CODE BEGIN WHILE */

while (1)

{

value ++;

Попробуем собрать:

aleksei@RNWS-008 /home/adk/STM32CubeIDE/31-live/lesson1/Debug $ make all | grep -v arm-none-eabi-gcc
/opt/st/stm32cubeide_1.12.0/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.200.202301161003/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-no
ne-eabi/bin/ld: ./Core/Src/main.o: in function `main':
/home/adk/STM32CubeIDE/31-live/lesson1/Debug/../Core/Src/main.c:96: undefined reference to `value'
collect2: error: ld returned 1 exit status
make: *** [makefile:64: lesson1.elf] Ошибка 1

Понятно, в чём дело: компилятор не знает о файле our_file.c, где идёт выделение памяти под переменную value. В GUI кубика мы в таком случае нажимаем ПКМ на нужном файле → Resource configuration → снимаем галочки «Exclude from build». Стало быть, некий аналог этих галочек есть и в генерируемых кубиком makefilах. Откроем файл Debug/Core/Src/subdir.mk. Здесь три переменных — C_SRCS, OBJS и C_DEPS. Первая содержит все исходные файлы текущего каталога, вторая — получающиеся из них объектные файлы. Добавим в них строчки с именем нашего файла и соответствующим объектником:

C_SRCS += ../Core/Src/our_file.c#

OBJS += ./Core/Src/our_file.o#

Признаться, мне больше нравится такой синтаксис, чем склеивание строк через бэкслеши, но если вы решите добавлять строки в сите кубика, не забывайте про пробелы перед бэкслешами. Последняя переменная (C_DEPS) нужна больше для внутренний надобностей CubeIDE, но для единнобразия можете добавить и строчку для неё (по аналогии — базовое имя файла + расширение .d). В системе сборки кубика есть небольшая нелогичность: чтобы добавить объект в сборку, должно не только присутствовать правило для его сборки в файле subdir.mk, но его ещё нужно внести в общий список объектов проекта. Откроем файл Debug/objects.list и добавим в него строку

"./Core/Src/our_file.o"

Теперь соберём ещё раз проект (make), переключимся на терминал с отладчиком (arm-none-eabi-gdb) и нажмём Ctrl-C, чтобы приостановить выполнение прогарммы (аналогично нажатию кнопки «Pause» в интерфейсе CubeIDE). Вновь дадим команду load. Отладчик при этом определит, что файл был обновлён с последнего запуска, и загрузит новый файл в микроконтроллер. Вновь запустим и приостановим программу:

(gdb) load
…

Transfer rate: 13 KB/sec, 1104 bytes/write.
(gdb) b main
Breakpoint 4 at 0x80005d8: file ../Core/Src/main.c, line 105.
(gdb) c
Continuing.

Breakpoint 4, main () at ../Core/Src/main.c:105
105  HAL_Init();
(gdb) p value  
$5 = 0
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
HAL_GetTick () at ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:325
325  return uwTick;
(gdb) p value  
$6 = 16850
(gdb)

Отлично. Работает.
Маленькое пояснение: сперва я установил бряк на начало функции main. Дошёл до неё командой c(ontinue). Проверил состояние переменной value (сразу после загрузки прошивки проверять value бессмысленно: она ещё не инициализирована). Продолжил выполнение программы и тут же остановил её уже вручную, комбинацией Ctrl+c. Отладчик написал мне, где я нахожусь, за что ему спасибо, а затем я ещё раз проверил, что переменная докуда-то досчитала.

Сейчас попробуем помигать светодиодом. Для этого нам понадобится подключить в Core/Src/main.c файл stm32f4xx_hal_gpio.h. А вот подключать соответствующие исходники не понадобится, так как конкретно GPIO используется много где, и кубик пропишет его даже для пустого проекта. Останется лишь добавить в наш main.c функцию инициализации (по аналогии с тем, как это делает кубик при создании функции MX_GPIO_Init()):

void our_gpio_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

__HAL_RCC_GPIOA_CLK_ENABLE();

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);

GPIO_InitStruct.Pin = GPIO_PIN_10;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

И вызвать её в main(), где-нибудь во второй секции. А затем в суперцикле помигать HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_10), HAL_Delay(300);

В принципе, на этом всё, осталась пара замечаний:

1) то, что gpio тянется по умолчанию, это хорошо, но давайте рассмотрим чуть иной пример. Скажем, нам нужно подключить АЦП и померить что-нибудь. Если мы хотим работать на чуть более низком уровне, скажем, CMSIS, то нам достаточно подключить заголовочный файл stm32f401xc.h (он лежит среди доступных к подключению каталогов, а именно в Drivers/CMSIS/Device/ST/STM32F4xx/Include). Если же мы, как уважающие себя люди, привыкли оперировать горячими закусками, то заметим, что в Drivers/STM32F4xx_HAL_Driver/Inc лежат далеко не все нужные нам файлы. Здесь мы можем либо скопировать недостающее из репозитория (где он расположен, можно глянуть в кубике: Window→Preferences→STM32Cube→Frimware Updater), либо указать на нужный каталог в строке сборки в файле Debug/Core/Src/subdir.mk (после ключа -I). Здесь я предполагаю первый вариант и скопировал в проект файлы, относящиеся к АЦП: *adc.h и *adc_ex.h — в Drivers/STM32F4xx_HAL_Driver/Inc, а *adc.c и *adc_ex.c — в Drivers/STM32F4xx_HAL_Driver/Src (заметьте, там будут не только файлы HAL, но и LL; впрочем, …ll….h действительно нужен). Добавил их в соответствующий subdir.mk, а также в список объектов. Также неплохо бы добавить соответстующие файлы или шаблоны в команду очистки проекты (внизу файлы Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk — цель clean-Drivers-2f-STM32F4xx_HAL_Driver-2f-Src) (я добавил ./Drivers/STM32F4xx_HAL_Driver/Src/*.su ./Drivers/STM32F4xx_HAL_Driver/Src/*.o ./Drivers/STM32F4xx_HAL_Driver/Src/*.d ./Drivers/STM32F4xx_HAL_Driver/Src/*.cyclo )

Скомпилировал. Успешно. Но если сейчас попробовать вызвать любую функцию АЦП, то компилятор выдаст ошибку:

/* USER CODE BEGIN PV */

ADC_HandleTypeDef hadc1;

/* USER CODE END PV */

...

/* USER CODE BEGIN 2 */

HAL_ADC_Start(& hadc1);

/* USER CODE END 2 */

aleksei@RNWS-008 ~/STM32CubeIDE/other/test/Debug $ make all | grep -v arm-none-eabi-gcc
/opt/st/stm32cubeide_1.12.0/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.200.202301161003/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-no
ne-eabi/bin/ld: ./Core/Src/main.o: in function `main':
/home/aleksei/STM32CubeIDE/other/test/Debug/../Core/Src/main.c:88: undefined reference to `HAL_ADC_Start'
collect2: error: ld returned 1 exit status
make: *** [makefile:64: test.elf] Ошибка 1

Дело в том, что о нашем намерении собрать данную часть HAL нужно уведомить не только утилиту make, но и саму библиотеку. Для этого необходимо найти в файле Core/Inc/stm32f4xx_hal_conf.h строку #define HAL_ADC_MODULE_ENABLED и раскомментировать её. Зачем это сделано, признаться, не до конца понимаю, но у богатых свои причуды.

Собственно, на этом всё. Единственное, давайте на сладкое всё же запустим АЦП и при помощи отладчика извлечём какие-никакие данные.

/* USER CODE BEGIN PV */

ADC_HandleTypeDef hadc1;

int cnt = 0;

uint16_t data[1000] = {0,};

/* USER CODE END PV */

…

/* USER CODE BEGIN 0 */

static void my_ADC1_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

__HAL_RCC_ADC1_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

GPIO_InitStruct.Pin = GPIO_PIN_1;

GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

ADC_ChannelConfTypeDef sC>

hadc1.Instance = ADC1;

hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;

hadc1.Init.Resoluti>

hadc1.Init.ScanC>

hadc1.Init.C>

hadc1.Init.Disc>

hadc1.Init.ExternalTrigC>

hadc1.Init.ExternalTrigC>

hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

hadc1.Init.NbrOfC>

hadc1.Init.DMAC>

hadc1.Init.EOCSelecti>

HAL_ADC_Init(&hadc1);

sConfig.Channel = ADC_CHANNEL_1;

sConfig.Rank = 1;

sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;

HAL_ADC_ConfigChannel(&hadc1, &sConfig);

}

/* USER CODE END 0 */

…

while (1)

{

HAL_ADC_Start(& hadc1);

HAL_ADC_PollForConversion(&hadc1, 1);

data[cnt] = HAL_ADC_GetValue(&hadc1);

cnt++;

if(cnt >= 1000)

{

cnt = 0;

}

И проверим в работе. Не забудем собрать, а затем — загрузим обновлённую прошивку и запустим её:

(gdb) load
…
Transfer rate: 14 KB/sec, 1102 bytes/write.
(gdb) c
Continuing.
^C
…

(gdb) b main.c:128
Breakpoint 4 at 0x80005e4: file ../Core/Src/main.c, line 129.
(gdb) c
Continuing.

Breakpoint 4, main () at ../Core/Src/main.c:129
129  HAL_ADC_Start(& hadc1);
(gdb)

Здесь я прервал программу в произвольном месте при помощи Ctrl+C, затем поставил точку останова где-то в main.Теперь посмотрим, что прочиталось в массив:

(gdb) p data
$10 = {245, 251, 259, 249, 257, 247, 254, 260, 248, 252, 257, 247, 254, 260, 247, 254, 260, 248, 252, 258, 245, 251, 259, 249, 257, 247, 254, 260, 247, 254, 260, 248, 252, 257, 247, 254, 260,  
248, 252, 258, 245, 251, 260, 247, 254, 260, 247, 254, 260, 247, 254, 261, 252, 257, 247, 254, 260, 247, 254, 260, 248, 252, 258, 244, 247, 254, 260, 248, 252, 258, 245, 251, 259, 249, 257,  
247, 254, 260, 247, 254, 260, 247, 256, 243, 249, 257, 247, 253, 262, 250, 255, 265, 257, 247, 254, 260, 247, 254, 260, 247, 254, 261, 251, 260, 247, 254, 260, 248, 252, 257, 247, 254, 260,  
247, 254, 260, 248, 252, 257, 247, 254, 260, 247, 254, 260, 248, 252, 258, 245, 251, 259, 249, 257, 247, 254, 260, 248, 252, 257, 247, 254, 260, 248, 252, 257, 247, 254, 260, 248, 252, 257,  
247, 254, 260, 247, 254, 260, 248, 252, 257, 247, 254, 260, 248, 252, 258, 245, 251, 259, 250, 255, 264, 253, 262, 250, 255, 265, 257, 247, 254, 260, 247, 254, 260, 248, 252, 257, 247, 254,  
260, 247, 254, 260, 248, 252, 257, 247, 254, 260, 247...}

Что-то прочиталось, уже неплохо. А теперь — ради чего всё это:

(gdb) dump memory ~/tmp/test_data.bin data (data + sizeof (data))
(gdb)

Теперь мы получили в файле набор двоичных данных из массива data и можем относительно легко его разобрать, скажем, в таблицу примерно так:

Stm32 без IDE — памятка 2: мигаем светодиодом и кое-что ещё Программирование, Микроконтроллеры, Stm32, Длиннопост

Ну, тут вариантов масса, поэтому нет смысла писать текстом

Помимо двоичных данных команда dump умеет сохранять данные и в виде формата inetl hex и некоторых других.

К чему я это всё? А, на самом деле просто к тому, что команду dump очень полезно знать, даже если вы работаете в GUI STM32CubeIDE. Ведь её можно ввести во вкладке Debugger Console и получить слепок нужной вам области памяти.

Показать полностью 1
[моё] Программирование Микроконтроллеры Stm32 Длиннопост
4
3
erinaceto
erinaceto
6 месяцев назад
Серия Технические заметки

Stm32 без IDE — памятка 1: собираем проект⁠⁠

За вопрос спасибо студентам группы 031/EE-01.

Буквой в скобках обозначаю (например, так: "(Щ)" ) моменты , на которые позже хочу сослаться.

Исходные данные: есть проект STM32CubeIDE (скажем, пустой, только что сгенерированный), теперь хочется его его скомпилировать и запустить на микроконтроллере.
Материалы: МК на базе stm32F401 (впрочем, конкретная модель не важна *), многострадальный ноутбук с Rosa Fresh 12.5.1, кубик версии 1.12 (люблю я именно эту версию…). Программатор — китайский свисток, которому повезло, что кубик его принимает за своего.
Если у вас windows, я предполагаю, что вы сами установили и настроили make, драйвер st-link и т. п. Также все консольные команды я даю в расчёте на bash, это стоит иметь в виду.

Итак, мы запустили кубоид, создали в нём проект, а теперь хотим закрыть кубоид и далее работать с этим проектом. На самом деле для того, чтобы всё получилось без лишней головной боли, сперва соберите проект в кубе. У вас создастся каталог Debug (ну, я пока предполагаю, что вы ничего не трогали), а в нём — исполняемый файл, и куча промежуточных файлов. Теперь вы можете сделать Project →Clean, при этом удалится большинство промежуточнх файлов, но останутся иструкции для утилиты make, которой мы и воспользуемся.

Для этого нам понадобятся

  • текстовый редактор. Любой;

  • утилита make;

  • компилятор, способный создать исполняемый файл для МК;

  • сервер gdb, способный работать по интерфейсу SWD с МК;

    • при использовании ST-LINK_gdbserver (см. ниже) понадобится консольный stm32programmer;

  • клиент gdb, умеющий в инструкции процессора МК.

С редактором, думаю, более-менее ясно.

Компилятор и клиент GDB можно достать из уже установленного кубоида (если у вас его в принципе нет, можно ограничиться пакетом STM32CubeCLT (CLT означает command-line tools). Там нам понадобится найти расположение файлов arm-none-eabi-gcc и arm-none-eabi-gdb.

Собственно, arm — это архитектура процессора, для которого мы собираем программу, none-eabi означает отсутствие какой бы то ни было ОС, взяимодействующей с исполняемым файлом (всяческие RTOS в данном случае не в счёт).

Вот по серверу есть варианты. Можно использовать openOCD, st-util либо stlink-gdbserver. Я буду использовать stlink-gdbserver просто потому, что он идёт в поставке с кубиком (на самом деле у него есть ещё два преимущества: он умеет более чем в одно подключение одновременно, а главное — в отладку двухъядерных МК).

Поищем (я предполагаю, что кубик установлен в /opt/st/stm32cubeide_1.12.0, в зависимости от ОС, кончено, нужно использовать подходящие инструменты для поиска):

aleksei@RNWS-008 ~ $ find /opt/st/stm32cubeide_1.12.0  -name 'arm-none-eabi-gdb'  
/opt/st/stm32cubeide_1.12.0/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.200.202301161003/tools/bin/arm-none-eabi-gdb
aleksei@RNWS-008 ~ $ find /opt/st/stm32cubeide_1.12.0  -name 'arm-none-eabi-gcc'  
/opt/st/stm32cubeide_1.12.0/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.200.202301161003/tools/bin/arm-none-eabi-gcc
aleksei@RNWS-008 ~ $ find /opt/st/stm32cubeide_1.12.0  -name 'ST-LINK_gdbserver'  
/opt/st/stm32cubeide_1.12.0/plugins/com.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.linux64_2.0.500.202301161003/tools/bin/ST-LINK_gdbserver

(Б) На самом деле, конечно, это всё можно найти и глазами, но в любом случае с непривычки будет сильное желание выкинуть эти длинные буквы подальше.Пути до (не включительно) arm-none-eabi-gdb и ST-LINK_gdbserver следует добавить к системной переменной PATH (нет, как это делается, я здесь пояснять не буду, это относится не к нашей теме, а к общей компьютерной грамотности).
(Ъ) А вот путь до arm-none-eabi-gcc нужно добавить в PATH обязательно.

(В) Для использования ST-LINK_gdbserver нам отдельно понадобится путь к программе STM32_Programmer_CLI. Примерно так:

aleksei@RNWS-008 ~ $ find /opt/st/stm32cubeide_1.12.0  -name 'STM32_Programmer_CLI'
/opt/st/stm32cubeide_1.12.0/plugins/com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.linux64_2.0.600.202301161003/tools/bin/STM32_Programmer_CLI

aleksei@RNWS-008 ~ $ export PATH_TO_PROGRAMMER='/opt/st/stm32cubeide_1.14.0/plugins/com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.linux64_2.1.100.202311100844/tools/bin'

(А) Далее, make можно использовать как системный, так и из поставки кубоида (так же, поищите make). В принципе, нет причин не использовать штатный make — если только у вас не windows. Но тут подскажу мало: вживую видел make в составе платформы msys2, по идее, должно быть достаточно make из кубика. Точно так же, добавьте её в PATH, и будет работать.


Отлично. если вы проделали это — треть работы позади.

Теперь перейдём к сборке проекта. Для этого необходимо зайти в терминале в каталог с проектом, далее в каталог Debug (посмотреть, где он лежит, можно из Cube IDE: щелчок правой кнопкой мыши → Show In → System Explorer

Stm32 без IDE — памятка 1: собираем проект Микроконтроллеры, Stm32, Программирование, Консольщики, Разработка, IT, Длиннопост

ПКМ на каталоге → Show In → System Explorer

Теперь, узнав, где мы сидим (в моём случае это ~/STM32CubeIDE/other/test/Debug), открываем там терминал:
cd ~/STM32CubeIDE/other/test/Debug
и собираем проект (во всяком случае, те, кто не прогуливал лекцию про make):
make all

Для этого у нас должны быть установлены make (см (А) ) и переменная PATH должна указывать на каталог с arm-none-eabi-gcc (см. (Ъ)). Если make пишет что-то вроде /bin/bash: команда не найдена: arm-none-eabi-gcc), то возвращаемся к пункту (Ъ).

Если же эти два требования выполнены, то внезапно собирается. Почему?

Потому что в каталоге Debug кубик создаёт makefile, а также воссоздаёт примерную структуру каталогов проекта. В каждом из подкаталогов лежит фай subdir.mk, описывающий, как собирать данный подкаталог (в самом Debug эти инструкции вынесены в файлы с названиями objects.list, objects.mk, sources.mk). В принципе, мне по нраву такой подход. В сами файлы мы залезем чуть позже. А пока посмотрим, что получилось на выходе:

aleksei@RNWS-008 ~/STM32CubeIDE/other/test/Debug $ make  all  | grep -v arm-none-eabi-gcc
Finished building target: test.elf

arm-none-eabi-size  test.elf  
text  data  bss  dec  hex filename
5788  20  1580  7388  1cdc test.elf
Finished building: default.size.stdout

arm-none-eabi-objdump -h -S test.elf  > "test.list"
Finished building: test.list

(grep -v использовал просто чтобы не выводить полотно текста).

У нас собрался файл Debug/lesson1.elf. Ура. Он модержит в себе инструкции и данные для работы программы; адреса, по которым эти инструкции и данные должны располагаться; отладочную информацию в соответствии с тем профилем сборки, который настроили в кубике — для Debug это практически весь исходный текст программы. Он нам и понадобится далее.

Теперь треть работы позади.

Подключаемся к МК.

Как уже упоминал, работать будем с ST-LINK_gdbserver; при желании можете использовать st-util, она чуть проще в запуске, а результат для нас будет тем же. Или openOCD, если он у вас уже есть.

Предполагаю, что (Б) и (В) мы уже прошли. Тогда запускаем:
ST-LINK_gdbserver -p 4242 -d -t -cp $PATH_TO_PROGRAMMER
Здесь -p 4242 — это указание порта для работы с клиентом gdb; по умолчанию ST-LINK_gdbserver использует 61234, делайте как вам удобно, я обычно пишу его явно, чтобы не забыть.
-d — использовать SWD (подозреваю, что ключ необязателен).
-t — тоже необязательный для нас, разрешает множественные подключения.
-cp $PATH_TO_PROGRAMMER — обязательно нужно указать путь к STM32_Programmer_CLI (см. (В))

Если контроллер подключён, то увидим сообщение типа Waiting for debugger connection
Это означает, что мы смогли подключиться по USB к программатору и через него к целевому контроллеру. Если не смогли — проверяем контакты (в том числе разрешение на доступ к USB, мало ли…)

Далее в отдельном терминале заходим в каталог с файлом elf и запускаем клиент отладчика. Примечание для пользователей windows: здесь следует использовать именно стандартный терминал windows, штуковины типа git bash или терминала msys2 в данном конкретном случае не дадут работать автодополнению клиента gdb.

aleksei@RNWS-008 ~/STM32CubeIDE/other/test/Debug $ arm-none-eabi-gdb

(gdb) target extended-remote :4242
Remote debugging using :4242
warning: No executable has been specified and target does not support
determining executable automatically.  Try using the "file" command.
0x08015760 in ?? ()
(gdb) file test.elf
Reading symbols from test.elf...
(gdb) load

Loading section .isr_vector, size 0x298 lma 0x8000000
Loading section .text, size 0x1bc5a lma 0x8000298
Loading section .init, size 0xc lma 0x801bef4
Loading section .fini, size 0xc lma 0x801bf00
Loading section .rodata, size 0x10444 lma 0x801bf0c
Loading section .eh_frame, size 0x4 lma 0x802c350
Loading section .ARM.exidx, size 0x8 lma 0x802c354
Loading section .data, size 0x9ec lma 0x802c35c
Loading section .init_array, size 0xc lma 0x802cd48
Loading section .fini_array, size 0x4 lma 0x802cd54
Loading section .init_array.00000, size 0x4 lma 0x802cd58
Start address 0x08007a24, load size 183642
Transfer rate: 41 KB/sec, 8347 bytes/write.
(gdb) continue
Continuing.

Собственно, программа запущена. Далее изучайте команды gdb (начните с: breakpoint, info breakpoint, delete, next, step, continue, run, disconnect, target, quit, print, x, frame; несколько особняком — dump, потому что на тему неё я позже ещё напишу пару слов). Имейте в виду, что здесь работает автодополнение команд (клавишей Tab), история (клавиши «Вверх» и «Вниз»), поиск по истории (Ctrl + r), сокращения команд (например, 'c' эквивалентно continue). Также если нажать ВВОД при пустой строке ввода, будет повторена последняя команда (это не очень удобно, но увы, без пересборки gdb этого не исправить; для отдельных команд можно отменить повтор последней команды при помощи «dont-repeat».

В следущей серии помигаем светодиодиком.

Показать полностью 1
[моё] Микроконтроллеры Stm32 Программирование Консольщики Разработка IT Длиннопост
1
39
MiheevSanity
MiheevSanity
6 месяцев назад
Arduino & Pi

Создал пульт управления звуком на ESP 32, для тренировки⁠⁠

Создал пульт управления звуком на ESP 32, для тренировки Arduino, Инженер, Электроника, Esp32, Микроконтроллеры, Spi, Аккумулятор 18650, Fdm печать, 3D печать, Длиннопост

В 2024 году кроме нормального развития в программировании,
(Где так и не закончена единственная задача! В виде стабильности сети.) Включая изучения распределённых файловых систем, работы с 3D в браузере.

Под его конец создано первое рабочее физическое устройство.
Первой реализована одна из простых идей, всего которых уже не счесть.🫢

Создал пульт управления звуком на ESP 32, для тренировки Arduino, Инженер, Электроника, Esp32, Микроконтроллеры, Spi, Аккумулятор 18650, Fdm печать, 3D печать, Длиннопост

Пульт управления звуком, на основе ESP32 на C++.

Корпус спроектирован самостоятельно в FreeCad, многие элементы не имеют чертежа и нужно измерять самостоятельно штангенциркулем.
И распечатан самостоятельно в FDM принтере.

Создал пульт управления звуком на ESP 32, для тренировки Arduino, Инженер, Электроника, Esp32, Микроконтроллеры, Spi, Аккумулятор 18650, Fdm печать, 3D печать, Длиннопост


Пока соединение по WIFI🛜 в мобильное приложение на смартфоне, принимающее команды.
Но возможно использовать и Bluetooth.

Может регулировать громкость потенциометром,
переключать треки вперёд назад 5 позиционной кнопкой.
Считывая аналоговые и цифровые сигналы, и обмениваясь пакетами по UDP.
Посылая медиа-сигналы в смартфон, который уже запускает музыку.

Имеет 2 экрана, I2C и SPI. Позволяющих выводить как ЧБ так и RGB изображения.
Питается аккумулятором 18650.

Создал пульт управления звуком на ESP 32, для тренировки Arduino, Инженер, Электроника, Esp32, Микроконтроллеры, Spi, Аккумулятор 18650, Fdm печать, 3D печать, Длиннопост

За примерно 14 дней, в первую половину декабря. Не считая доставки.

В процессе был сожжён один DAC по неопытности.🥲
И несколько слабых блоков питания.
Получен огромный опыт за короткое время.

Начальный этап в создании собственных аппаратных устройств,
от мелочи для развлечения, умного дома и повышения удобства,
до целевых промышленных устройств на массовое производство.

Наивный первый шаг к реализации идей мирового масштаба.

Показать полностью 4
[моё] Arduino Инженер Электроника Esp32 Микроконтроллеры Spi Аккумулятор 18650 Fdm печать 3D печать Длиннопост
19
20
BadSanta8
BadSanta8
6 месяцев назад
Лига Радиолюбителей

Солнечный контролер MPPT⁠⁠

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

Попалась вот такая схема, контролёра на каком то иностранным сайте, судя по обсуждению больше на турецком.

Солнечный контролер MPPT Схема, Солнечная энергия, Микроконтроллеры

Питание микроконтроллера выполнена на микросхеме TL499A, подстроечным резистором VR1 устанавливается питание микроконтроллера 5 вольт. Теперь вопрос почему на тамошнем форуме пишут, что не надо ее менять на обычный стабилизатор типо КРЕН или ему подобные , так некто внятно пояснить не смог. Кто, что думает по этому поводу?

Схема Солнечная энергия Микроконтроллеры
59
24
TechSavvyZone
TechSavvyZone
7 месяцев назад

1974: Цифровые часы — первая система на кристалле с интегральной схемой⁠⁠

1974: Цифровые часы — первая система на кристалле с интегральной схемой Технологии, Компьютерное железо, Раритет, Компьютер, IT, История развития, Инженер, Изобретения, Инновации, Электроника, Кристаллы, Микросхема, Микроконтроллеры, Транзистор, Чип, Длиннопост

Реклама часов Microma LCD 1975 года

Цифровые часы Microma с жидкокристаллическим дисплеем (ЖК-дисплеем) — это первый продукт, в котором целая электронная система интегрирована на одном кремниевом кристалле, называемом «система на кристалле» (System-On-Chip, SOC).Интегральная схема System-On-Chip (SOC) включает в себя все электронные компоненты, включая аналоговые и интерфейсные схемы, необходимые для реализации системы на одном кристалле.

1974: Цифровые часы — первая система на кристалле с интегральной схемой Технологии, Компьютерное железо, Раритет, Компьютер, IT, История развития, Инженер, Изобретения, Инновации, Электроника, Кристаллы, Микросхема, Микроконтроллеры, Транзистор, Чип, Длиннопост

Электронный модуль цифровых часов Hamilton Pulsar

Первое решение SOC развилось из цифровых часов Hamilton Pulsar "Wrist Computer" стоимостью 2100 долларов, представленных на шоу Джонни Карсона в 1970 году. Разработанные Джорджем Тиссом и Вилли Крэбтри из Electro-Data, Inc., часы, содержащие 44 чипа и 4000 соединительных проводов, были печально известны своей ненадежностью, пока инженеры RCA не сократили схему хронометража до одного чипа. Внешние транзисторы по-прежнему требовались для управления энергоемкими светодиодными дисплеями. В 1972-73 годах Microma и Seiko представили маломощные жидкокристаллические дисплеи (ЖК-дисплеи), которые продлили срок службы батареи на порядки. Соучредители Intersil Джон Холл и Жан Эрни разработали чип Seiko.

1974: Цифровые часы — первая система на кристалле с интегральной схемой Технологии, Компьютерное железо, Раритет, Компьютер, IT, История развития, Инженер, Изобретения, Инновации, Электроника, Кристаллы, Микросхема, Микроконтроллеры, Транзистор, Чип, Длиннопост

Проектирование «макетной платы» для микросхемы часов Intel 5810 CMOS

Первая настоящая система на кристалле появилась в часах Microma в 1974 году, когда Питер Столл интегрировал транзисторы драйвера ЖК-дисплея, а также функции синхронизации на одном чипе Intel 5810 CMOS. (Веха 1963 года) Часы с ЖК-дисплеем от TI, представленные по цене менее 20 долларов в 1976 году, начали битву на истощение с Timex и десятками других производителей полупроводников, которые вышли на рынок. National и TI были основными игроками в следующем приложении SOC, электронном калькуляторе, но обе отказались от этих дешевых потребительских товаров в пользу азиатских поставщиков, когда цены упали ниже 10 долларов.

1974: Цифровые часы — первая система на кристалле с интегральной схемой Технологии, Компьютерное железо, Раритет, Компьютер, IT, История развития, Инженер, Изобретения, Инновации, Электроника, Кристаллы, Микросхема, Микроконтроллеры, Транзистор, Чип, Длиннопост

Калькулятор NS 600 компании National был продан за 19,95 долларов в 1973 году.

Многие поставщики ASIC (Milestone 1967 г.) в 1990-х годах использовали возможности SOC, встраивая микроконтроллеры (Milestone 1974 г.) и DSP (Milestone 1979 г.) в чипы системного уровня, которые позволяли использовать портативные игры и инструменты, а также обрабатывать речь, передавать данные и производить периферийные устройства для ПК.

Показать полностью 4
Технологии Компьютерное железо Раритет Компьютер IT История развития Инженер Изобретения Инновации Электроника Кристаллы Микросхема Микроконтроллеры Транзистор Чип Длиннопост
0
13
TechSavvyZone
TechSavvyZone
7 месяцев назад

1974: Анонсировано семейство микроконтроллеров общего назначения⁠⁠

1974: Анонсировано семейство микроконтроллеров общего назначения Технологии, IT, Раритет, Компьютер, Компьютерное железо, Изобретения, Инженер, История развития, Электроника, Видеокарта, Микроконтроллеры, Длиннопост

Ранняя версия микроконтроллера TMS 1000

Появляется конструкция однокристального калькулятора в виде микроконтроллера (МК) TMS 1000 — концепция, породившая семейства универсальных цифровых рабочих лошадок, которые приводят в действие инструменты и игрушки развитого мира.

1974: Анонсировано семейство микроконтроллеров общего назначения Технологии, IT, Раритет, Компьютер, Компьютерное железо, Изобретения, Инженер, История развития, Электроника, Видеокарта, Микроконтроллеры, Длиннопост

Компания TI впервые использовала микроконтроллер TMS 1000 в калькуляторе модели SR-16 в 1974 году.

Микроконтроллерный блок (MCU) состоит из тех же основных элементов ПЗУ, ОЗУ и ЦП, что и микропроцессор (MPU) для менее требовательных задач, таких как управление игрушкой или микроволновой печью. Поскольку эти приложения не требуют максимальной скорости или сложности программы, конструкции MCU могут быть реализованы с меньшим количеством компонентов, так что вся функция уместится на одном чипе.

1974: Анонсировано семейство микроконтроллеров общего назначения Технологии, IT, Раритет, Компьютер, Компьютерное железо, Изобретения, Инженер, История развития, Электроника, Видеокарта, Микроконтроллеры, Длиннопост

ТMS 1000 обеспечивает работу обучающей игрушки «Говори и пиши»

Разработанный Гэри Буном и Майклом Кокраном в 1971 году однокристальный калькулятор Texas Instruments TMS1802 лег в основу семейства универсальных 4-битных микроконтроллеров TMS1000, анонсированного в 1974 году. Его стоимость составляла 2 доллара, он использовался в охранных сигнализациях, устройствах для открывания гаражных ворот, играх и игрушках, таких как «Speak and Spell», которые познакомили потребителей с цифровой электроникой.

В 1976 году Intel и Mostek (3870) представили 8-битную архитектуру, которая обслуживала более требовательные приложения в автомобилях и периферийных устройствах ПК. Семейство Intel MCS-48 предлагало как версии EPROM (8748), так и версии Masked-ROM (8048). Версия EPROM сделала микроконтроллеры практичными для прототипирования и систем мелкосерийного производства. (Веха 1971 года) Более мощный преемник Intel 1980 года, 8051, создал стандартную архитектуру, которая сохранилась и по сей день в многочисленных вариантах для конкретных приложений.

1974: Анонсировано семейство микроконтроллеров общего назначения Технологии, IT, Раритет, Компьютер, Компьютерное железо, Изобретения, Инженер, История развития, Электроника, Видеокарта, Микроконтроллеры, Длиннопост

Реклама Bell Labs демонстрирует кристалл MAC-4 в сравнении со скрепкой

К 1980-м годам архитектуры микроконтроллеров европейских, японских и американских производителей обслуживали многочисленные специализированные приложения. MAC-4 от Bell Laboratories удовлетворял потребности в телекоммуникациях. Motorola и Hitachi вывели высокопроизводительные микроконтроллеры из 68000 MPU. Семейство PIC от General Instruments (сегодня Microchip) выиграло недорогие потребительские разработки. Скрытые сотнями в бытовых приборах, автомобилях и персональных электронных продуктах, микроконтроллеры, возможно, являются сегодня самым распространенным полупроводниковым устройством.

Показать полностью 4
Технологии IT Раритет Компьютер Компьютерное железо Изобретения Инженер История развития Электроника Видеокарта Микроконтроллеры Длиннопост
3
12
viktand
viktand
7 месяцев назад

Самодельный калькулятор⁠⁠

Привет всем.

Кажется, я уже где-то писал, что на мой взгляд большая проблема для тех, кто любит что-то мастерить на микроконтроллерах (в т.ч. Arduino) – это отсутствие идей для проектов. Помигали светодиодиком, хочется двигаться дальше, но куда? Поэтому я иногда выкладываю тут свои поделки, может кто-то захочет повторить.

Основные принципы - это должно быть максимально бюджетно, чтобы оставалось на уровне простого развлечения, и хоть немного оригинально. Поэтому ниже будут справочно указаны цены, в которые это все обходится. Точнее обошлось мне на момент покупки.

Сегодня мы будем делать микрокалькулятор.

Мозги калькулятора на микроконтроллере STC8H8K64U в устаревшем корпусе DIP на 40 контактов. Такие уже не выпускают, но они еще продаются на Али меньше чем по 100 рублей за штуку. В принципе, можно использовать версию в любом корпусе, но с таким работать приятнее.

Семисегментный индикатор на 8 разрядов на MAX7219 продается там же готовый с управлением по SPI. 108 рублей.

Кнопки тоже есть у китайцев. Я использовал готовые сборки из четырех кнопок. 5 штук по 4 кнопки каждый. 60 рублей за одну сборку. Если честно, то кнопки мне не понравились сами по себе.

И еще бокс для трех батареек ААА за 104 рубля уже на Озоне.

Для основы всей конструкции использовал кусок текстолита без фольгирования. Использовать макетную плату подходящего размера мне показалось слишком жирным для этого.

Итак, схема конструкции

Самодельный калькулятор Микроконтроллеры, Самоделки, Длиннопост

Схема

Все очень примитивно. Это просто подключение кнопок и индикатора к микроконтроллеру. Есть еще компорт для прошивки. Здесь же хотел сначала добавить два светодиода, на которые я хотел вывести знак минус для отрицательных чисел и индикатор записи в регистр памяти. Но в итоге я их не стал делать, а вывел сигналы в старший разряд индикатора. Просто потому что два светодиода вживую смотрелись довольно плохо и не наглядно. Соответственно максимальное число на индикаторе будет +- 9999999. Меньше чем обычно, но достаточно. Минус – это будет привычная средняя палочка в восьмом разряде, а память – это точка там же. И буква «Е» в случае переполнения или ошибки.

Когда я написал здесь предыдущее предложение, то вспомнил, что никак не обыграл деление на ноль. Вернулся, доделал.

Получилось вот так:

Самодельный калькулятор Микроконтроллеры, Самоделки, Длиннопост

Вид спереди

Кнопочка сверху – сброс микроконтроллера. Используется для заливки прошивки. Ну или просто как сброс, если хочется. Остальные кнопки имеют стандартный смысл.

С обратной стороны как обычно паутинка. На этот раз небольшая.

Самодельный калькулятор Микроконтроллеры, Самоделки, Длиннопост

Вид с обратной стороны

Бокс с батарейками приклеен на суперклей.

Прошивка и схема в хорошем качестве, если кому интересно, здесь: https://github.com/viktand/calculator

Хотя логика калькулятора кажется довольно примитивной, но на практике это оказалось неожиданно трудно. Пришлось повозиться с тем, чтобы правильно выводить на индикатор числа в процессе их ввода и после вычислений. Особенно разочаровало преобразование между long и double, приводящее к тому, что вместо, например, «4.5» калькулятор показывал «4.499999».

На этом все.

Показать полностью 3
[моё] Микроконтроллеры Самоделки Длиннопост
4
20
Salomanov
7 месяцев назад

Подключение датчика температуры к Guition ESP32-S3-4848S040⁠⁠

Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост

Предыстория покупки данного модуля такова, у меня обычный электрический котёл, к которому подключил термостат с wifi, со своей программой для телефона. Вроде всё хорошо, но хочется более тонких настроек чем предлагает производитель.

Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост

То что установлено сейчас

Выбор пал на Guition ESP32-S3-4848S040 так как можно его прошить как готовой прошивкой так и создать свою, сенсорный цветной экран, с возможностью создать свой интерфейс и 3 реле для управления нагрузкой

Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост

Guition ESP32-S3-4848S040

Сразу после покупки залил прошивкой от tasmota (изначально стоит демонстрационная). Прежде чем покупать заранее узнал, что в нём нет датчика температуры, а в моделе с датчиком отсутствуют реле. Решил, что реле важнее, а датчик как-нибудь приделаю. В качестве датчика решил использовать BME280, он показывает температуру, влажность и давление.

Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост

BME280

Разобрав модуль видим на плате несколько разъемов: подключение батарейки, динамика, реле и UART

Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост

Контроллер и дисплей при работе немного греются, поэтому датчик лучше сделать выносным. К сожалению разъема для подключения датчика по I2C тут нет, но так как UART мне тут не пригодится я решил переделать его под I2C. Для этого нужно выпаять компоненты Q1, R31, R7, R6, тем самым отключим UART от разъёма.

Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост

К дорожкам идущим к разъёму припаиваем питание 3,3 вольта, его можно взять с точки с маркировкой S3. I2C на этом модуле подключен на 19 и 45 пинам контроллера. SDA это пин 19, SCL это 45.

Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост

Разъём для подключения я взял от вентилятора ноутбука, перепиновав для того чтобы цвета примерно совпадали

Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост

А в качестве основного провода, кабель подключения USB передней панели системного блока, тоже перепиновываем, чтобы совпадало с датчиком

Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост
Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост

Корпус для датчика взял от регулятора вентилятора системного блока

Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост

Остаётся только сделать отверстие в высоковольтном модуле и всё собрать

Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост

Ни чего прописывать в прошивке не нужно, датчик сразу определяется

Подключение датчика температуры к Guition ESP32-S3-4848S040 Своими руками, Микроконтроллеры, Arduino, Термостат, Умный дом, Изготовление, Самоделки, Сборка, Длиннопост

На этом пока всё, впереди у меня создание управления через сенсор и настройка термостата. Но это позже...

Пока собирал записывал видео, там тоже самое, но может там что-то понятнее, ссылка ниже.

https://youtu.be/z0Ocq2e2oYA

Показать полностью 12
[моё] Своими руками Микроконтроллеры Arduino Термостат Умный дом Изготовление Самоделки Сборка Длиннопост
9
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии